RDMA/bnxt_re: Support raw data query for each resources

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>
This commit is contained in:
Kashyap Desai 2024-10-31 19:34:42 -07:00 committed by Leon Romanovsky
parent 3b72946bdf
commit e4bcf8eb2a

View File

@ -903,6 +903,35 @@ static int bnxt_re_fill_res_mr_entry(struct sk_buff *msg, struct ib_mr *ib_mr)
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 @@ static int bnxt_re_fill_res_cq_entry(struct sk_buff *msg, struct ib_cq *ib_cq)
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 @@ static int bnxt_re_fill_res_qp_entry(struct sk_buff *msg, struct ib_qp *ib_qp)
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 @@ static int bnxt_re_fill_res_srq_entry(struct sk_buff *msg, struct ib_srq *ib_srq
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)