@@ -823,75 +823,104 @@ static inline bool kernel_qp_has_rdb(struct hns_roce_dev *hr_dev,
823823 hns_roce_qp_has_rq (init_attr ));
824824}
825825
826+ static int alloc_user_qp_db (struct hns_roce_dev * hr_dev ,
827+ struct hns_roce_qp * hr_qp ,
828+ struct ib_qp_init_attr * init_attr ,
829+ struct ib_udata * udata ,
830+ struct hns_roce_ib_create_qp * ucmd ,
831+ struct hns_roce_ib_create_qp_resp * resp )
832+ {
833+ struct hns_roce_ucontext * uctx = rdma_udata_to_drv_context (udata ,
834+ struct hns_roce_ucontext , ibucontext );
835+ struct ib_device * ibdev = & hr_dev -> ib_dev ;
836+ int ret ;
837+
838+ if (user_qp_has_sdb (hr_dev , init_attr , udata , resp , ucmd )) {
839+ ret = hns_roce_db_map_user (uctx , ucmd -> sdb_addr , & hr_qp -> sdb );
840+ if (ret ) {
841+ ibdev_err (ibdev ,
842+ "failed to map user SQ doorbell, ret = %d.\n" ,
843+ ret );
844+ goto err_out ;
845+ }
846+ hr_qp -> en_flags |= HNS_ROCE_QP_CAP_SQ_RECORD_DB ;
847+ }
848+
849+ if (user_qp_has_rdb (hr_dev , init_attr , udata , resp )) {
850+ ret = hns_roce_db_map_user (uctx , ucmd -> db_addr , & hr_qp -> rdb );
851+ if (ret ) {
852+ ibdev_err (ibdev ,
853+ "failed to map user RQ doorbell, ret = %d.\n" ,
854+ ret );
855+ goto err_sdb ;
856+ }
857+ hr_qp -> en_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB ;
858+ }
859+
860+ return 0 ;
861+
862+ err_sdb :
863+ if (hr_qp -> en_flags & HNS_ROCE_QP_CAP_SQ_RECORD_DB )
864+ hns_roce_db_unmap_user (uctx , & hr_qp -> sdb );
865+ err_out :
866+ return ret ;
867+ }
868+
869+ static int alloc_kernel_qp_db (struct hns_roce_dev * hr_dev ,
870+ struct hns_roce_qp * hr_qp ,
871+ struct ib_qp_init_attr * init_attr )
872+ {
873+ struct ib_device * ibdev = & hr_dev -> ib_dev ;
874+ int ret ;
875+
876+ if (hr_dev -> pci_dev -> revision >= PCI_REVISION_ID_HIP09 )
877+ hr_qp -> sq .db_reg = hr_dev -> mem_base +
878+ HNS_ROCE_DWQE_SIZE * hr_qp -> qpn ;
879+ else
880+ hr_qp -> sq .db_reg = hr_dev -> reg_base + hr_dev -> sdb_offset +
881+ DB_REG_OFFSET * hr_dev -> priv_uar .index ;
882+
883+ hr_qp -> rq .db_reg = hr_dev -> reg_base + hr_dev -> odb_offset +
884+ DB_REG_OFFSET * hr_dev -> priv_uar .index ;
885+
886+ if (kernel_qp_has_rdb (hr_dev , init_attr )) {
887+ ret = hns_roce_alloc_db (hr_dev , & hr_qp -> rdb , 0 );
888+ if (ret ) {
889+ ibdev_err (ibdev ,
890+ "failed to alloc kernel RQ doorbell, ret = %d.\n" ,
891+ ret );
892+ return ret ;
893+ }
894+ * hr_qp -> rdb .db_record = 0 ;
895+ hr_qp -> en_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB ;
896+ }
897+
898+ return 0 ;
899+ }
900+
826901static int alloc_qp_db (struct hns_roce_dev * hr_dev , struct hns_roce_qp * hr_qp ,
827902 struct ib_qp_init_attr * init_attr ,
828903 struct ib_udata * udata ,
829904 struct hns_roce_ib_create_qp * ucmd ,
830905 struct hns_roce_ib_create_qp_resp * resp )
831906{
832- struct hns_roce_ucontext * uctx = rdma_udata_to_drv_context (
833- udata , struct hns_roce_ucontext , ibucontext );
834- struct ib_device * ibdev = & hr_dev -> ib_dev ;
835907 int ret ;
836908
837909 if (hr_dev -> caps .flags & HNS_ROCE_CAP_FLAG_SDI_MODE )
838910 hr_qp -> en_flags |= HNS_ROCE_QP_CAP_OWNER_DB ;
839911
840912 if (udata ) {
841- if (user_qp_has_sdb (hr_dev , init_attr , udata , resp , ucmd )) {
842- ret = hns_roce_db_map_user (uctx , ucmd -> sdb_addr ,
843- & hr_qp -> sdb );
844- if (ret ) {
845- ibdev_err (ibdev ,
846- "failed to map user SQ doorbell, ret = %d.\n" ,
847- ret );
848- goto err_out ;
849- }
850- hr_qp -> en_flags |= HNS_ROCE_QP_CAP_SQ_RECORD_DB ;
851- }
852-
853- if (user_qp_has_rdb (hr_dev , init_attr , udata , resp )) {
854- ret = hns_roce_db_map_user (uctx , ucmd -> db_addr ,
855- & hr_qp -> rdb );
856- if (ret ) {
857- ibdev_err (ibdev ,
858- "failed to map user RQ doorbell, ret = %d.\n" ,
859- ret );
860- goto err_sdb ;
861- }
862- hr_qp -> en_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB ;
863- }
913+ ret = alloc_user_qp_db (hr_dev , hr_qp , init_attr , udata , ucmd ,
914+ resp );
915+ if (ret )
916+ return ret ;
864917 } else {
865- if (hr_dev -> pci_dev -> revision >= PCI_REVISION_ID_HIP09 )
866- hr_qp -> sq .db_reg = hr_dev -> mem_base +
867- HNS_ROCE_DWQE_SIZE * hr_qp -> qpn ;
868- else
869- hr_qp -> sq .db_reg =
870- hr_dev -> reg_base + hr_dev -> sdb_offset +
871- DB_REG_OFFSET * hr_dev -> priv_uar .index ;
872-
873- hr_qp -> rq .db_reg = hr_dev -> reg_base + hr_dev -> odb_offset +
874- DB_REG_OFFSET * hr_dev -> priv_uar .index ;
875-
876- if (kernel_qp_has_rdb (hr_dev , init_attr )) {
877- ret = hns_roce_alloc_db (hr_dev , & hr_qp -> rdb , 0 );
878- if (ret ) {
879- ibdev_err (ibdev ,
880- "failed to alloc kernel RQ doorbell, ret = %d.\n" ,
881- ret );
882- goto err_out ;
883- }
884- * hr_qp -> rdb .db_record = 0 ;
885- hr_qp -> en_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB ;
886- }
918+ ret = alloc_kernel_qp_db (hr_dev , hr_qp , init_attr );
919+ if (ret )
920+ return ret ;
887921 }
888922
889923 return 0 ;
890- err_sdb :
891- if (udata && hr_qp -> en_flags & HNS_ROCE_QP_CAP_SQ_RECORD_DB )
892- hns_roce_db_unmap_user (uctx , & hr_qp -> sdb );
893- err_out :
894- return ret ;
895924}
896925
897926static void free_qp_db (struct hns_roce_dev * hr_dev , struct hns_roce_qp * hr_qp ,
0 commit comments