RDMA/bnxt_re: Support raw data query for each resources
authorKashyap Desai <kashyap.desai@broadcom.com>
Fri, 1 Nov 2024 02:34:42 +0000 (19:34 -0700)
committerLeon Romanovsky <leon@kernel.org>
Mon, 4 Nov 2024 11:53:06 +0000 (06:53 -0500)
Support interfaces to get the raw data for each of
the resources. Use this interface to get some of the
HW structures from active resources.

Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Link: https://patch.msgid.link/1730428483-17841-4-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/bnxt_re/main.c

index 24124c2..c227fdd 100644 (file)
@@ -903,6 +903,35 @@ err:
        return -EMSGSIZE;
 }
 
+static int bnxt_re_fill_res_mr_entry_raw(struct sk_buff *msg, struct ib_mr *ib_mr)
+{
+       struct bnxt_re_dev *rdev;
+       struct bnxt_re_mr *mr;
+       int err, len;
+       void *data;
+
+       mr = container_of(ib_mr, struct bnxt_re_mr, ib_mr);
+       rdev = mr->rdev;
+
+       err = bnxt_re_read_context_allowed(rdev);
+       if (err)
+               return err;
+
+       len = bnxt_qplib_is_chip_gen_p7(rdev->chip_ctx) ? BNXT_RE_CONTEXT_TYPE_MRW_SIZE_P7 :
+                                                         BNXT_RE_CONTEXT_TYPE_MRW_SIZE_P5;
+       data = kzalloc(len, GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       err = bnxt_qplib_read_context(&rdev->rcfw, CMDQ_READ_CONTEXT_TYPE_MRW,
+                                     mr->qplib_mr.lkey, len, data);
+       if (!err)
+               err = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, len, data);
+
+       kfree(data);
+       return err;
+}
+
 static int bnxt_re_fill_res_cq_entry(struct sk_buff *msg, struct ib_cq *ib_cq)
 {
        struct bnxt_qplib_hwq *cq_hwq;
@@ -933,6 +962,36 @@ err:
        return -EMSGSIZE;
 }
 
+static int bnxt_re_fill_res_cq_entry_raw(struct sk_buff *msg, struct ib_cq *ib_cq)
+{
+       struct bnxt_re_dev *rdev;
+       struct bnxt_re_cq *cq;
+       int err, len;
+       void *data;
+
+       cq = container_of(ib_cq, struct bnxt_re_cq, ib_cq);
+       rdev = cq->rdev;
+
+       err = bnxt_re_read_context_allowed(rdev);
+       if (err)
+               return err;
+
+       len = bnxt_qplib_is_chip_gen_p7(rdev->chip_ctx) ? BNXT_RE_CONTEXT_TYPE_CQ_SIZE_P7 :
+                                       BNXT_RE_CONTEXT_TYPE_CQ_SIZE_P5;
+       data = kzalloc(len, GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       err = bnxt_qplib_read_context(&rdev->rcfw,
+                                     CMDQ_READ_CONTEXT_TYPE_CQ,
+                                     cq->qplib_cq.id, len, data);
+       if (!err)
+               err = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, len, data);
+
+       kfree(data);
+       return err;
+}
+
 static int bnxt_re_fill_res_qp_entry(struct sk_buff *msg, struct ib_qp *ib_qp)
 {
        struct bnxt_qplib_qp *qplib_qp;
@@ -977,6 +1036,31 @@ err:
        return -EMSGSIZE;
 }
 
+static int bnxt_re_fill_res_qp_entry_raw(struct sk_buff *msg, struct ib_qp *ibqp)
+{
+       struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibqp->device, ibdev);
+       int err, len;
+       void *data;
+
+       err = bnxt_re_read_context_allowed(rdev);
+       if (err)
+               return err;
+
+       len = bnxt_qplib_is_chip_gen_p7(rdev->chip_ctx) ? BNXT_RE_CONTEXT_TYPE_QPC_SIZE_P7 :
+                                                         BNXT_RE_CONTEXT_TYPE_QPC_SIZE_P5;
+       data = kzalloc(len, GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       err = bnxt_qplib_read_context(&rdev->rcfw, CMDQ_READ_CONTEXT_TYPE_QPC,
+                                     ibqp->qp_num, len, data);
+       if (!err)
+               err = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, len, data);
+
+       kfree(data);
+       return err;
+}
+
 static int bnxt_re_fill_res_srq_entry(struct sk_buff *msg, struct ib_srq *ib_srq)
 {
        struct nlattr *table_attr;
@@ -1003,6 +1087,36 @@ err:
        return -EMSGSIZE;
 }
 
+static int bnxt_re_fill_res_srq_entry_raw(struct sk_buff *msg, struct ib_srq *ib_srq)
+{
+       struct bnxt_re_dev *rdev;
+       struct bnxt_re_srq *srq;
+       int err, len;
+       void *data;
+
+       srq = container_of(ib_srq, struct bnxt_re_srq, ib_srq);
+       rdev = srq->rdev;
+
+       err = bnxt_re_read_context_allowed(rdev);
+       if (err)
+               return err;
+
+       len = bnxt_qplib_is_chip_gen_p7(rdev->chip_ctx) ? BNXT_RE_CONTEXT_TYPE_SRQ_SIZE_P7 :
+                                                         BNXT_RE_CONTEXT_TYPE_SRQ_SIZE_P5;
+
+       data = kzalloc(len, GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       err = bnxt_qplib_read_context(&rdev->rcfw, CMDQ_READ_CONTEXT_TYPE_SRQ,
+                                     srq->qplib_srq.id, len, data);
+       if (!err)
+               err = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, len, data);
+
+       kfree(data);
+       return err;
+}
+
 static const struct ib_device_ops bnxt_re_dev_ops = {
        .owner = THIS_MODULE,
        .driver_id = RDMA_DRIVER_BNXT_RE,
@@ -1063,9 +1177,13 @@ static const struct ib_device_ops bnxt_re_dev_ops = {
 
 static const struct ib_device_ops restrack_ops = {
        .fill_res_cq_entry = bnxt_re_fill_res_cq_entry,
+       .fill_res_cq_entry_raw = bnxt_re_fill_res_cq_entry_raw,
        .fill_res_qp_entry = bnxt_re_fill_res_qp_entry,
+       .fill_res_qp_entry_raw = bnxt_re_fill_res_qp_entry_raw,
        .fill_res_mr_entry = bnxt_re_fill_res_mr_entry,
+       .fill_res_mr_entry_raw = bnxt_re_fill_res_mr_entry_raw,
        .fill_res_srq_entry = bnxt_re_fill_res_srq_entry,
+       .fill_res_srq_entry_raw = bnxt_re_fill_res_srq_entry_raw,
 };
 
 static int bnxt_re_register_ib(struct bnxt_re_dev *rdev)