@@ -823,75 +823,104 @@ static inline bool kernel_qp_has_rdb(struct hns_roce_dev *hr_dev,
823
823
hns_roce_qp_has_rq (init_attr ));
824
824
}
825
825
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
+
826
901
static int alloc_qp_db (struct hns_roce_dev * hr_dev , struct hns_roce_qp * hr_qp ,
827
902
struct ib_qp_init_attr * init_attr ,
828
903
struct ib_udata * udata ,
829
904
struct hns_roce_ib_create_qp * ucmd ,
830
905
struct hns_roce_ib_create_qp_resp * resp )
831
906
{
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 ;
835
907
int ret ;
836
908
837
909
if (hr_dev -> caps .flags & HNS_ROCE_CAP_FLAG_SDI_MODE )
838
910
hr_qp -> en_flags |= HNS_ROCE_QP_CAP_OWNER_DB ;
839
911
840
912
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 ;
864
917
} 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 ;
887
921
}
888
922
889
923
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 ;
895
924
}
896
925
897
926
static void free_qp_db (struct hns_roce_dev * hr_dev , struct hns_roce_qp * hr_qp ,
0 commit comments