1 // SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
2 // Copyright (c) 2019 Hisilicon Limited.
4 #include <rdma/rdma_cm.h>
5 #include <rdma/restrack.h>
6 #include <uapi/rdma/rdma_netlink.h>
8 #include "hns_roce_common.h"
9 #include "hns_roce_device.h"
10 #include "hns_roce_hw_v2.h"
12 #define MAX_ENTRY_NUM 256
14 int hns_roce_fill_res_cq_entry(struct sk_buff *msg, struct ib_cq *ib_cq)
16 struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq);
17 struct nlattr *table_attr;
19 table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER);
23 if (rdma_nl_put_driver_u32(msg, "cq_depth", hr_cq->cq_depth))
26 if (rdma_nl_put_driver_u32(msg, "cons_index", hr_cq->cons_index))
29 if (rdma_nl_put_driver_u32(msg, "cqe_size", hr_cq->cqe_size))
32 if (rdma_nl_put_driver_u32(msg, "arm_sn", hr_cq->arm_sn))
35 nla_nest_end(msg, table_attr);
40 nla_nest_cancel(msg, table_attr);
45 int hns_roce_fill_res_cq_entry_raw(struct sk_buff *msg, struct ib_cq *ib_cq)
47 struct hns_roce_dev *hr_dev = to_hr_dev(ib_cq->device);
48 struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq);
49 struct hns_roce_v2_cq_context context;
50 u32 data[MAX_ENTRY_NUM] = {};
54 if (!hr_dev->hw->query_cqc)
57 ret = hr_dev->hw->query_cqc(hr_dev, hr_cq->cqn, &context);
61 data[offset++] = hr_reg_read(&context, CQC_CQ_ST);
62 data[offset++] = hr_reg_read(&context, CQC_SHIFT);
63 data[offset++] = hr_reg_read(&context, CQC_CQE_SIZE);
64 data[offset++] = hr_reg_read(&context, CQC_CQE_CNT);
65 data[offset++] = hr_reg_read(&context, CQC_CQ_PRODUCER_IDX);
66 data[offset++] = hr_reg_read(&context, CQC_CQ_CONSUMER_IDX);
67 data[offset++] = hr_reg_read(&context, CQC_DB_RECORD_EN);
68 data[offset++] = hr_reg_read(&context, CQC_ARM_ST);
69 data[offset++] = hr_reg_read(&context, CQC_CMD_SN);
70 data[offset++] = hr_reg_read(&context, CQC_CEQN);
71 data[offset++] = hr_reg_read(&context, CQC_CQ_MAX_CNT);
72 data[offset++] = hr_reg_read(&context, CQC_CQ_PERIOD);
73 data[offset++] = hr_reg_read(&context, CQC_CQE_HOP_NUM);
74 data[offset++] = hr_reg_read(&context, CQC_CQE_BAR_PG_SZ);
75 data[offset++] = hr_reg_read(&context, CQC_CQE_BUF_PG_SZ);
77 ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, offset * sizeof(u32), data);
82 int hns_roce_fill_res_qp_entry(struct sk_buff *msg, struct ib_qp *ib_qp)
84 struct hns_roce_qp *hr_qp = to_hr_qp(ib_qp);
85 struct nlattr *table_attr;
87 table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER);
91 if (rdma_nl_put_driver_u32_hex(msg, "sq_wqe_cnt", hr_qp->sq.wqe_cnt))
94 if (rdma_nl_put_driver_u32_hex(msg, "sq_max_gs", hr_qp->sq.max_gs))
97 if (rdma_nl_put_driver_u32_hex(msg, "rq_wqe_cnt", hr_qp->rq.wqe_cnt))
100 if (rdma_nl_put_driver_u32_hex(msg, "rq_max_gs", hr_qp->rq.max_gs))
103 if (rdma_nl_put_driver_u32_hex(msg, "ext_sge_sge_cnt", hr_qp->sge.sge_cnt))
106 nla_nest_end(msg, table_attr);
111 nla_nest_cancel(msg, table_attr);
116 int hns_roce_fill_res_qp_entry_raw(struct sk_buff *msg, struct ib_qp *ib_qp)
118 struct hns_roce_dev *hr_dev = to_hr_dev(ib_qp->device);
119 struct hns_roce_qp *hr_qp = to_hr_qp(ib_qp);
120 struct hns_roce_v2_qp_context context;
121 u32 data[MAX_ENTRY_NUM] = {};
125 if (!hr_dev->hw->query_qpc)
128 ret = hr_dev->hw->query_qpc(hr_dev, hr_qp->qpn, &context);
132 data[offset++] = hr_reg_read(&context, QPC_QP_ST);
133 data[offset++] = hr_reg_read(&context, QPC_ERR_TYPE);
134 data[offset++] = hr_reg_read(&context, QPC_CHECK_FLG);
135 data[offset++] = hr_reg_read(&context, QPC_SRQ_EN);
136 data[offset++] = hr_reg_read(&context, QPC_SRQN);
137 data[offset++] = hr_reg_read(&context, QPC_QKEY_XRCD);
138 data[offset++] = hr_reg_read(&context, QPC_TX_CQN);
139 data[offset++] = hr_reg_read(&context, QPC_RX_CQN);
140 data[offset++] = hr_reg_read(&context, QPC_SQ_PRODUCER_IDX);
141 data[offset++] = hr_reg_read(&context, QPC_SQ_CONSUMER_IDX);
142 data[offset++] = hr_reg_read(&context, QPC_RQ_RECORD_EN);
143 data[offset++] = hr_reg_read(&context, QPC_RQ_PRODUCER_IDX);
144 data[offset++] = hr_reg_read(&context, QPC_RQ_CONSUMER_IDX);
145 data[offset++] = hr_reg_read(&context, QPC_SQ_SHIFT);
146 data[offset++] = hr_reg_read(&context, QPC_RQWS);
147 data[offset++] = hr_reg_read(&context, QPC_RQ_SHIFT);
148 data[offset++] = hr_reg_read(&context, QPC_SGE_SHIFT);
149 data[offset++] = hr_reg_read(&context, QPC_SQ_HOP_NUM);
150 data[offset++] = hr_reg_read(&context, QPC_RQ_HOP_NUM);
151 data[offset++] = hr_reg_read(&context, QPC_SGE_HOP_NUM);
152 data[offset++] = hr_reg_read(&context, QPC_WQE_SGE_BA_PG_SZ);
153 data[offset++] = hr_reg_read(&context, QPC_WQE_SGE_BUF_PG_SZ);
154 data[offset++] = hr_reg_read(&context, QPC_RETRY_NUM_INIT);
155 data[offset++] = hr_reg_read(&context, QPC_RETRY_CNT);
156 data[offset++] = hr_reg_read(&context, QPC_SQ_CUR_PSN);
157 data[offset++] = hr_reg_read(&context, QPC_SQ_MAX_PSN);
158 data[offset++] = hr_reg_read(&context, QPC_SQ_FLUSH_IDX);
159 data[offset++] = hr_reg_read(&context, QPC_SQ_MAX_IDX);
160 data[offset++] = hr_reg_read(&context, QPC_SQ_TX_ERR);
161 data[offset++] = hr_reg_read(&context, QPC_SQ_RX_ERR);
162 data[offset++] = hr_reg_read(&context, QPC_RQ_RX_ERR);
163 data[offset++] = hr_reg_read(&context, QPC_RQ_TX_ERR);
164 data[offset++] = hr_reg_read(&context, QPC_RQ_CQE_IDX);
165 data[offset++] = hr_reg_read(&context, QPC_RQ_RTY_TX_ERR);
167 ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, offset * sizeof(u32), data);
172 int hns_roce_fill_res_mr_entry(struct sk_buff *msg, struct ib_mr *ib_mr)
174 struct hns_roce_mr *hr_mr = to_hr_mr(ib_mr);
175 struct nlattr *table_attr;
177 table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER);
181 if (rdma_nl_put_driver_u32_hex(msg, "pbl_hop_num", hr_mr->pbl_hop_num))
184 if (rdma_nl_put_driver_u32_hex(msg, "ba_pg_shift",
185 hr_mr->pbl_mtr.hem_cfg.ba_pg_shift))
188 if (rdma_nl_put_driver_u32_hex(msg, "buf_pg_shift",
189 hr_mr->pbl_mtr.hem_cfg.buf_pg_shift))
192 nla_nest_end(msg, table_attr);
197 nla_nest_cancel(msg, table_attr);
202 int hns_roce_fill_res_mr_entry_raw(struct sk_buff *msg, struct ib_mr *ib_mr)
204 struct hns_roce_dev *hr_dev = to_hr_dev(ib_mr->device);
205 struct hns_roce_mr *hr_mr = to_hr_mr(ib_mr);
206 struct hns_roce_v2_mpt_entry context;
207 u32 data[MAX_ENTRY_NUM] = {};
211 if (!hr_dev->hw->query_mpt)
214 ret = hr_dev->hw->query_mpt(hr_dev, hr_mr->key, &context);
218 data[offset++] = hr_reg_read(&context, MPT_ST);
219 data[offset++] = hr_reg_read(&context, MPT_PD);
220 data[offset++] = hr_reg_read(&context, MPT_LKEY);
221 data[offset++] = hr_reg_read(&context, MPT_LEN_L);
222 data[offset++] = hr_reg_read(&context, MPT_LEN_H);
223 data[offset++] = hr_reg_read(&context, MPT_PBL_SIZE);
224 data[offset++] = hr_reg_read(&context, MPT_PBL_HOP_NUM);
225 data[offset++] = hr_reg_read(&context, MPT_PBL_BA_PG_SZ);
226 data[offset++] = hr_reg_read(&context, MPT_PBL_BUF_PG_SZ);
228 ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, offset * sizeof(u32), data);