2019-04-01 19:13:35 +08:00
|
|
|
// SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
|
|
|
|
// Copyright (c) 2019 Hisilicon Limited.
|
|
|
|
|
|
|
|
|
|
#include <rdma/rdma_cm.h>
|
|
|
|
|
#include <rdma/restrack.h>
|
|
|
|
|
#include <uapi/rdma/rdma_netlink.h>
|
|
|
|
|
#include "hnae3.h"
|
|
|
|
|
#include "hns_roce_common.h"
|
|
|
|
|
#include "hns_roce_device.h"
|
|
|
|
|
#include "hns_roce_hw_v2.h"
|
|
|
|
|
|
RDMA/hns: Support CQ's restrack raw ops for hns driver
The CQ raw restrack attributes come from the queue context maintained by
the ROCEE.
For example:
$ rdma res show cq dev hns_0 cqn 14 -dd -jp -r
[ {
"ifindex": 4,
"ifname": "hns_0",
"data": [ 1,0,0,0,7,0,0,0,0,0,0,0,0,82,6,0,0,82,6,0,0,82,6,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
6,0,0,0,0,0,0,0 ]
} ]
Link: https://lore.kernel.org/r/20220822104455.2311053-4-liangwenpeng@huawei.com
Signed-off-by: Wenpeng Liang <liangwenpeng@huawei.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
2022-08-22 18:44:51 +08:00
|
|
|
#define MAX_ENTRY_NUM 256
|
|
|
|
|
|
2022-08-22 18:44:49 +08:00
|
|
|
int hns_roce_fill_res_cq_entry(struct sk_buff *msg, struct ib_cq *ib_cq)
|
2019-04-01 19:13:35 +08:00
|
|
|
{
|
|
|
|
|
struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq);
|
|
|
|
|
struct nlattr *table_attr;
|
|
|
|
|
|
|
|
|
|
table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER);
|
2022-08-22 18:44:49 +08:00
|
|
|
if (!table_attr)
|
|
|
|
|
return -EMSGSIZE;
|
2019-04-01 19:13:35 +08:00
|
|
|
|
RDMA/hns: Add or remove CQ's restrack attributes
Remove the resttrack attributes from the queue context held by ROCEE, and
add the resttrack attributes from the queue information maintained by the
driver.
For example:
$ rdma res show cq dev hns_0 cqn 14 -dd -jp
[ {
"ifindex": 4,
"ifname": "hns_0",
"cqn": 14,
"cqe": 127,
"users": 1,
"adaptive-moderation": false,
"ctxn": 8,
"pid": 1524,
"comm": "ib_send_bw"
},
"drv_cq_depth": 128,
"drv_cons_index": 0,
"drv_cqe_size": 32,
"drv_arm_sn": 1
}
Link: https://lore.kernel.org/r/20220822104455.2311053-3-liangwenpeng@huawei.com
Signed-off-by: Wenpeng Liang <liangwenpeng@huawei.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
2022-08-22 18:44:50 +08:00
|
|
|
if (rdma_nl_put_driver_u32(msg, "cq_depth", hr_cq->cq_depth))
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
if (rdma_nl_put_driver_u32(msg, "cons_index", hr_cq->cons_index))
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
if (rdma_nl_put_driver_u32(msg, "cqe_size", hr_cq->cqe_size))
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
if (rdma_nl_put_driver_u32(msg, "arm_sn", hr_cq->arm_sn))
|
2022-08-22 18:44:49 +08:00
|
|
|
goto err;
|
2019-04-01 19:13:35 +08:00
|
|
|
|
|
|
|
|
nla_nest_end(msg, table_attr);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
err:
|
2022-08-22 18:44:49 +08:00
|
|
|
nla_nest_cancel(msg, table_attr);
|
|
|
|
|
|
|
|
|
|
return -EMSGSIZE;
|
2019-04-01 19:13:35 +08:00
|
|
|
}
|
RDMA/hns: Support CQ's restrack raw ops for hns driver
The CQ raw restrack attributes come from the queue context maintained by
the ROCEE.
For example:
$ rdma res show cq dev hns_0 cqn 14 -dd -jp -r
[ {
"ifindex": 4,
"ifname": "hns_0",
"data": [ 1,0,0,0,7,0,0,0,0,0,0,0,0,82,6,0,0,82,6,0,0,82,6,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
6,0,0,0,0,0,0,0 ]
} ]
Link: https://lore.kernel.org/r/20220822104455.2311053-4-liangwenpeng@huawei.com
Signed-off-by: Wenpeng Liang <liangwenpeng@huawei.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
2022-08-22 18:44:51 +08:00
|
|
|
|
|
|
|
|
int hns_roce_fill_res_cq_entry_raw(struct sk_buff *msg, struct ib_cq *ib_cq)
|
|
|
|
|
{
|
|
|
|
|
struct hns_roce_dev *hr_dev = to_hr_dev(ib_cq->device);
|
|
|
|
|
struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq);
|
|
|
|
|
struct hns_roce_v2_cq_context context;
|
|
|
|
|
u32 data[MAX_ENTRY_NUM] = {};
|
|
|
|
|
int offset = 0;
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
if (!hr_dev->hw->query_cqc)
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
|
|
ret = hr_dev->hw->query_cqc(hr_dev, hr_cq->cqn, &context);
|
|
|
|
|
if (ret)
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_CQ_ST);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_SHIFT);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_CQE_SIZE);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_CQE_CNT);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_CQ_PRODUCER_IDX);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_CQ_CONSUMER_IDX);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_DB_RECORD_EN);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_ARM_ST);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_CMD_SN);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_CEQN);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_CQ_MAX_CNT);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_CQ_PERIOD);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_CQE_HOP_NUM);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_CQE_BAR_PG_SZ);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, CQC_CQE_BUF_PG_SZ);
|
|
|
|
|
|
|
|
|
|
ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, offset * sizeof(u32), data);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
RDMA/hns: Support QP's restrack ops for hns driver
The QP restrack attributes come from the queue information maintained by
the driver.
For example:
$ rdma res show qp link hns_0 lqpn 41 -jp -dd
[ {
"ifindex": 4,
"ifname": "hns_0",
"port": 1,
"lqpn": 41,
"rqpn": 40,
"type": "RC",
"state": "RTR",
"rq-psn": 12474738,
"sq-psn": 0,
"path-mig-state": "ARMED",
"pdn": 9,
"pid": 1523,
"comm": "ib_send_bw"
},
"drv_sq_wqe_cnt": 128,
"drv_sq_max_gs": 1,
"drv_rq_wqe_cnt": 512,
"drv_rq_max_gs": 2,
"drv_ext_sge_sge_cnt": 0
}
Link: https://lore.kernel.org/r/20220822104455.2311053-5-liangwenpeng@huawei.com
Signed-off-by: Wenpeng Liang <liangwenpeng@huawei.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
2022-08-22 18:44:52 +08:00
|
|
|
|
|
|
|
|
int hns_roce_fill_res_qp_entry(struct sk_buff *msg, struct ib_qp *ib_qp)
|
|
|
|
|
{
|
|
|
|
|
struct hns_roce_qp *hr_qp = to_hr_qp(ib_qp);
|
|
|
|
|
struct nlattr *table_attr;
|
|
|
|
|
|
|
|
|
|
table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER);
|
|
|
|
|
if (!table_attr)
|
|
|
|
|
return -EMSGSIZE;
|
|
|
|
|
|
|
|
|
|
if (rdma_nl_put_driver_u32_hex(msg, "sq_wqe_cnt", hr_qp->sq.wqe_cnt))
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
if (rdma_nl_put_driver_u32_hex(msg, "sq_max_gs", hr_qp->sq.max_gs))
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
if (rdma_nl_put_driver_u32_hex(msg, "rq_wqe_cnt", hr_qp->rq.wqe_cnt))
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
if (rdma_nl_put_driver_u32_hex(msg, "rq_max_gs", hr_qp->rq.max_gs))
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
if (rdma_nl_put_driver_u32_hex(msg, "ext_sge_sge_cnt", hr_qp->sge.sge_cnt))
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
nla_nest_end(msg, table_attr);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
err:
|
|
|
|
|
nla_nest_cancel(msg, table_attr);
|
|
|
|
|
|
|
|
|
|
return -EMSGSIZE;
|
|
|
|
|
}
|
RDMA/hns: Support QP's restrack raw ops for hns driver
The QP raw restrack attributes come from the queue context maintained by
the ROCEE.
For example:
$ rdma res show qp link hns_0 -jp -dd -r
[ {
"ifindex": 4,
"ifname": "hns_0",
"data": [ 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,255,156,0,0,63,156,0,0,
7,0,0,0,1,0,0,0,9,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,156,0,
0,0,0,0,0 ]
} ]
Link: https://lore.kernel.org/r/20220822104455.2311053-6-liangwenpeng@huawei.com
Signed-off-by: Wenpeng Liang <liangwenpeng@huawei.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
2022-08-22 18:44:53 +08:00
|
|
|
|
|
|
|
|
int hns_roce_fill_res_qp_entry_raw(struct sk_buff *msg, struct ib_qp *ib_qp)
|
|
|
|
|
{
|
|
|
|
|
struct hns_roce_dev *hr_dev = to_hr_dev(ib_qp->device);
|
|
|
|
|
struct hns_roce_qp *hr_qp = to_hr_qp(ib_qp);
|
|
|
|
|
struct hns_roce_v2_qp_context context;
|
|
|
|
|
u32 data[MAX_ENTRY_NUM] = {};
|
|
|
|
|
int offset = 0;
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
if (!hr_dev->hw->query_qpc)
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
|
|
ret = hr_dev->hw->query_qpc(hr_dev, hr_qp->qpn, &context);
|
|
|
|
|
if (ret)
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_QP_ST);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_ERR_TYPE);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_CHECK_FLG);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SRQ_EN);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SRQN);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_QKEY_XRCD);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_TX_CQN);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_RX_CQN);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SQ_PRODUCER_IDX);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SQ_CONSUMER_IDX);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_RQ_RECORD_EN);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_RQ_PRODUCER_IDX);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_RQ_CONSUMER_IDX);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SQ_SHIFT);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_RQWS);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_RQ_SHIFT);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SGE_SHIFT);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SQ_HOP_NUM);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_RQ_HOP_NUM);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SGE_HOP_NUM);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_WQE_SGE_BA_PG_SZ);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_WQE_SGE_BUF_PG_SZ);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_RETRY_NUM_INIT);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_RETRY_CNT);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SQ_CUR_PSN);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SQ_MAX_PSN);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SQ_FLUSH_IDX);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SQ_MAX_IDX);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SQ_TX_ERR);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_SQ_RX_ERR);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_RQ_RX_ERR);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_RQ_TX_ERR);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_RQ_CQE_IDX);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, QPC_RQ_RTY_TX_ERR);
|
|
|
|
|
|
|
|
|
|
ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, offset * sizeof(u32), data);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
RDMA/hns: Support MR's restrack ops for hns driver
The MR restrack attributes come from the queue information maintained by
the driver.
For example:
$ rdma res show mr dev hns_0 mrn 6 -dd -jp
[ {
"ifindex": 4,
"ifname": "hns_0",
"mrn": 6,
"rkey": "300",
"lkey": "300",
"mrlen": 131072,
"pdn": 8,
"pid": 1524,
"comm": "ib_send_bw"
},
"drv_pbl_hop_num": 2,
"drv_ba_pg_shift": 14,
"drv_buf_pg_shift": 12
}
Link: https://lore.kernel.org/r/20220822104455.2311053-7-liangwenpeng@huawei.com
Signed-off-by: Wenpeng Liang <liangwenpeng@huawei.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
2022-08-22 18:44:54 +08:00
|
|
|
|
|
|
|
|
int hns_roce_fill_res_mr_entry(struct sk_buff *msg, struct ib_mr *ib_mr)
|
|
|
|
|
{
|
|
|
|
|
struct hns_roce_mr *hr_mr = to_hr_mr(ib_mr);
|
|
|
|
|
struct nlattr *table_attr;
|
|
|
|
|
|
|
|
|
|
table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER);
|
|
|
|
|
if (!table_attr)
|
|
|
|
|
return -EMSGSIZE;
|
|
|
|
|
|
|
|
|
|
if (rdma_nl_put_driver_u32_hex(msg, "pbl_hop_num", hr_mr->pbl_hop_num))
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
if (rdma_nl_put_driver_u32_hex(msg, "ba_pg_shift",
|
|
|
|
|
hr_mr->pbl_mtr.hem_cfg.ba_pg_shift))
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
if (rdma_nl_put_driver_u32_hex(msg, "buf_pg_shift",
|
|
|
|
|
hr_mr->pbl_mtr.hem_cfg.buf_pg_shift))
|
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
|
|
nla_nest_end(msg, table_attr);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
err:
|
|
|
|
|
nla_nest_cancel(msg, table_attr);
|
|
|
|
|
|
|
|
|
|
return -EMSGSIZE;
|
|
|
|
|
}
|
RDMA/hns: Support MR's restrack raw ops for hns driver
The MR raw restrack attributes come from the queue context maintained by
the ROCEE.
For example:
$ rdma res show mr dev hns_0 mrn 6 -dd -jp -r
[ {
"ifindex": 4,
"ifname": "hns_0",
"data": [ 1,0,0,0,2,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,32,0,0,0,2,0,0,0,
2,0,0,0,0,0,0,0 ]
} ]
Link: https://lore.kernel.org/r/20220822104455.2311053-8-liangwenpeng@huawei.com
Signed-off-by: Wenpeng Liang <liangwenpeng@huawei.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
2022-08-22 18:44:55 +08:00
|
|
|
|
|
|
|
|
int hns_roce_fill_res_mr_entry_raw(struct sk_buff *msg, struct ib_mr *ib_mr)
|
|
|
|
|
{
|
|
|
|
|
struct hns_roce_dev *hr_dev = to_hr_dev(ib_mr->device);
|
|
|
|
|
struct hns_roce_mr *hr_mr = to_hr_mr(ib_mr);
|
|
|
|
|
struct hns_roce_v2_mpt_entry context;
|
|
|
|
|
u32 data[MAX_ENTRY_NUM] = {};
|
|
|
|
|
int offset = 0;
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
if (!hr_dev->hw->query_mpt)
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
|
|
ret = hr_dev->hw->query_mpt(hr_dev, hr_mr->key, &context);
|
|
|
|
|
if (ret)
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
|
|
data[offset++] = hr_reg_read(&context, MPT_ST);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, MPT_PD);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, MPT_LKEY);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, MPT_LEN_L);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, MPT_LEN_H);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, MPT_PBL_SIZE);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, MPT_PBL_HOP_NUM);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, MPT_PBL_BA_PG_SZ);
|
|
|
|
|
data[offset++] = hr_reg_read(&context, MPT_PBL_BUF_PG_SZ);
|
|
|
|
|
|
|
|
|
|
ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, offset * sizeof(u32), data);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|