162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
262306a36Sopenharmony_ci// Copyright (c) 2019 Hisilicon Limited.
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <rdma/rdma_cm.h>
562306a36Sopenharmony_ci#include <rdma/restrack.h>
662306a36Sopenharmony_ci#include <uapi/rdma/rdma_netlink.h>
762306a36Sopenharmony_ci#include "hnae3.h"
862306a36Sopenharmony_ci#include "hns_roce_common.h"
962306a36Sopenharmony_ci#include "hns_roce_device.h"
1062306a36Sopenharmony_ci#include "hns_roce_hw_v2.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciint hns_roce_fill_res_cq_entry(struct sk_buff *msg, struct ib_cq *ib_cq)
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci	struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq);
1562306a36Sopenharmony_ci	struct nlattr *table_attr;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER);
1862306a36Sopenharmony_ci	if (!table_attr)
1962306a36Sopenharmony_ci		return -EMSGSIZE;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	if (rdma_nl_put_driver_u32(msg, "cq_depth", hr_cq->cq_depth))
2262306a36Sopenharmony_ci		goto err;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	if (rdma_nl_put_driver_u32(msg, "cons_index", hr_cq->cons_index))
2562306a36Sopenharmony_ci		goto err;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	if (rdma_nl_put_driver_u32(msg, "cqe_size", hr_cq->cqe_size))
2862306a36Sopenharmony_ci		goto err;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	if (rdma_nl_put_driver_u32(msg, "arm_sn", hr_cq->arm_sn))
3162306a36Sopenharmony_ci		goto err;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	nla_nest_end(msg, table_attr);
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	return 0;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cierr:
3862306a36Sopenharmony_ci	nla_nest_cancel(msg, table_attr);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	return -EMSGSIZE;
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ciint hns_roce_fill_res_cq_entry_raw(struct sk_buff *msg, struct ib_cq *ib_cq)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	struct hns_roce_dev *hr_dev = to_hr_dev(ib_cq->device);
4662306a36Sopenharmony_ci	struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq);
4762306a36Sopenharmony_ci	struct hns_roce_v2_cq_context context;
4862306a36Sopenharmony_ci	int ret;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	if (!hr_dev->hw->query_cqc)
5162306a36Sopenharmony_ci		return -EINVAL;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	ret = hr_dev->hw->query_cqc(hr_dev, hr_cq->cqn, &context);
5462306a36Sopenharmony_ci	if (ret)
5562306a36Sopenharmony_ci		return -EINVAL;
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, sizeof(context), &context);
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	return ret;
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ciint hns_roce_fill_res_qp_entry(struct sk_buff *msg, struct ib_qp *ib_qp)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	struct hns_roce_qp *hr_qp = to_hr_qp(ib_qp);
6562306a36Sopenharmony_ci	struct nlattr *table_attr;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER);
6862306a36Sopenharmony_ci	if (!table_attr)
6962306a36Sopenharmony_ci		return -EMSGSIZE;
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	if (rdma_nl_put_driver_u32_hex(msg, "sq_wqe_cnt", hr_qp->sq.wqe_cnt))
7262306a36Sopenharmony_ci		goto err;
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	if (rdma_nl_put_driver_u32_hex(msg, "sq_max_gs", hr_qp->sq.max_gs))
7562306a36Sopenharmony_ci		goto err;
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	if (rdma_nl_put_driver_u32_hex(msg, "rq_wqe_cnt", hr_qp->rq.wqe_cnt))
7862306a36Sopenharmony_ci		goto err;
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	if (rdma_nl_put_driver_u32_hex(msg, "rq_max_gs", hr_qp->rq.max_gs))
8162306a36Sopenharmony_ci		goto err;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	if (rdma_nl_put_driver_u32_hex(msg, "ext_sge_sge_cnt", hr_qp->sge.sge_cnt))
8462306a36Sopenharmony_ci		goto err;
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	nla_nest_end(msg, table_attr);
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	return 0;
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cierr:
9162306a36Sopenharmony_ci	nla_nest_cancel(msg, table_attr);
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	return -EMSGSIZE;
9462306a36Sopenharmony_ci}
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ciint hns_roce_fill_res_qp_entry_raw(struct sk_buff *msg, struct ib_qp *ib_qp)
9762306a36Sopenharmony_ci{
9862306a36Sopenharmony_ci	struct hns_roce_dev *hr_dev = to_hr_dev(ib_qp->device);
9962306a36Sopenharmony_ci	struct hns_roce_qp *hr_qp = to_hr_qp(ib_qp);
10062306a36Sopenharmony_ci	struct hns_roce_v2_qp_context context;
10162306a36Sopenharmony_ci	int ret;
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	if (!hr_dev->hw->query_qpc)
10462306a36Sopenharmony_ci		return -EINVAL;
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci	ret = hr_dev->hw->query_qpc(hr_dev, hr_qp->qpn, &context);
10762306a36Sopenharmony_ci	if (ret)
10862306a36Sopenharmony_ci		return -EINVAL;
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, sizeof(context), &context);
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	return ret;
11362306a36Sopenharmony_ci}
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ciint hns_roce_fill_res_mr_entry(struct sk_buff *msg, struct ib_mr *ib_mr)
11662306a36Sopenharmony_ci{
11762306a36Sopenharmony_ci	struct hns_roce_mr *hr_mr = to_hr_mr(ib_mr);
11862306a36Sopenharmony_ci	struct nlattr *table_attr;
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER);
12162306a36Sopenharmony_ci	if (!table_attr)
12262306a36Sopenharmony_ci		return -EMSGSIZE;
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	if (rdma_nl_put_driver_u32_hex(msg, "pbl_hop_num", hr_mr->pbl_hop_num))
12562306a36Sopenharmony_ci		goto err;
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	if (rdma_nl_put_driver_u32_hex(msg, "ba_pg_shift",
12862306a36Sopenharmony_ci				       hr_mr->pbl_mtr.hem_cfg.ba_pg_shift))
12962306a36Sopenharmony_ci		goto err;
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	if (rdma_nl_put_driver_u32_hex(msg, "buf_pg_shift",
13262306a36Sopenharmony_ci				       hr_mr->pbl_mtr.hem_cfg.buf_pg_shift))
13362306a36Sopenharmony_ci		goto err;
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	nla_nest_end(msg, table_attr);
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	return 0;
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_cierr:
14062306a36Sopenharmony_ci	nla_nest_cancel(msg, table_attr);
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci	return -EMSGSIZE;
14362306a36Sopenharmony_ci}
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ciint hns_roce_fill_res_mr_entry_raw(struct sk_buff *msg, struct ib_mr *ib_mr)
14662306a36Sopenharmony_ci{
14762306a36Sopenharmony_ci	struct hns_roce_dev *hr_dev = to_hr_dev(ib_mr->device);
14862306a36Sopenharmony_ci	struct hns_roce_mr *hr_mr = to_hr_mr(ib_mr);
14962306a36Sopenharmony_ci	struct hns_roce_v2_mpt_entry context;
15062306a36Sopenharmony_ci	int ret;
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	if (!hr_dev->hw->query_mpt)
15362306a36Sopenharmony_ci		return -EINVAL;
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	ret = hr_dev->hw->query_mpt(hr_dev, hr_mr->key, &context);
15662306a36Sopenharmony_ci	if (ret)
15762306a36Sopenharmony_ci		return -EINVAL;
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, sizeof(context), &context);
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	return ret;
16262306a36Sopenharmony_ci}
163