Skip to content

Commit ae2854c

Browse files
Yixing Liujgunthorpe
authored andcommitted
RDMA/hns: Encapsulate the qp db as a function
Encapsulate qp db into two functions: user and kernel. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Yixing Liu <[email protected]> Signed-off-by: Wenpeng Liang <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 7fac716 commit ae2854c

File tree

1 file changed

+82
-53
lines changed

1 file changed

+82
-53
lines changed

drivers/infiniband/hw/hns/hns_roce_qp.c

Lines changed: 82 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
826901
static 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

897926
static void free_qp_db(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,

0 commit comments

Comments
 (0)