mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.8 KiB
120 lines
2.8 KiB
// 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" |
|
|
|
static int hns_roce_fill_cq(struct sk_buff *msg, |
|
struct hns_roce_v2_cq_context *context) |
|
{ |
|
if (rdma_nl_put_driver_u32(msg, "state", |
|
roce_get_field(context->byte_4_pg_ceqn, |
|
V2_CQC_BYTE_4_ARM_ST_M, |
|
V2_CQC_BYTE_4_ARM_ST_S))) |
|
goto err; |
|
|
|
if (rdma_nl_put_driver_u32(msg, "ceqn", |
|
roce_get_field(context->byte_4_pg_ceqn, |
|
V2_CQC_BYTE_4_CEQN_M, |
|
V2_CQC_BYTE_4_CEQN_S))) |
|
goto err; |
|
|
|
if (rdma_nl_put_driver_u32(msg, "cqn", |
|
roce_get_field(context->byte_8_cqn, |
|
V2_CQC_BYTE_8_CQN_M, |
|
V2_CQC_BYTE_8_CQN_S))) |
|
goto err; |
|
|
|
if (rdma_nl_put_driver_u32(msg, "hopnum", |
|
roce_get_field(context->byte_16_hop_addr, |
|
V2_CQC_BYTE_16_CQE_HOP_NUM_M, |
|
V2_CQC_BYTE_16_CQE_HOP_NUM_S))) |
|
goto err; |
|
|
|
if (rdma_nl_put_driver_u32( |
|
msg, "pi", |
|
roce_get_field(context->byte_28_cq_pi, |
|
V2_CQC_BYTE_28_CQ_PRODUCER_IDX_M, |
|
V2_CQC_BYTE_28_CQ_PRODUCER_IDX_S))) |
|
goto err; |
|
|
|
if (rdma_nl_put_driver_u32( |
|
msg, "ci", |
|
roce_get_field(context->byte_32_cq_ci, |
|
V2_CQC_BYTE_32_CQ_CONSUMER_IDX_M, |
|
V2_CQC_BYTE_32_CQ_CONSUMER_IDX_S))) |
|
goto err; |
|
|
|
if (rdma_nl_put_driver_u32( |
|
msg, "coalesce", |
|
roce_get_field(context->byte_56_cqe_period_maxcnt, |
|
V2_CQC_BYTE_56_CQ_MAX_CNT_M, |
|
V2_CQC_BYTE_56_CQ_MAX_CNT_S))) |
|
goto err; |
|
|
|
if (rdma_nl_put_driver_u32( |
|
msg, "period", |
|
roce_get_field(context->byte_56_cqe_period_maxcnt, |
|
V2_CQC_BYTE_56_CQ_PERIOD_M, |
|
V2_CQC_BYTE_56_CQ_PERIOD_S))) |
|
goto err; |
|
|
|
if (rdma_nl_put_driver_u32(msg, "cnt", |
|
roce_get_field(context->byte_52_cqe_cnt, |
|
V2_CQC_BYTE_52_CQE_CNT_M, |
|
V2_CQC_BYTE_52_CQE_CNT_S))) |
|
goto err; |
|
|
|
return 0; |
|
|
|
err: |
|
return -EMSGSIZE; |
|
} |
|
|
|
int hns_roce_fill_res_cq_entry(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; |
|
struct nlattr *table_attr; |
|
int ret; |
|
|
|
if (!hr_dev->dfx->query_cqc_info) |
|
return -EINVAL; |
|
|
|
context = kzalloc(sizeof(struct hns_roce_v2_cq_context), GFP_KERNEL); |
|
if (!context) |
|
return -ENOMEM; |
|
|
|
ret = hr_dev->dfx->query_cqc_info(hr_dev, hr_cq->cqn, (int *)context); |
|
if (ret) |
|
goto err; |
|
|
|
table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER); |
|
if (!table_attr) { |
|
ret = -EMSGSIZE; |
|
goto err; |
|
} |
|
|
|
if (hns_roce_fill_cq(msg, context)) { |
|
ret = -EMSGSIZE; |
|
goto err_cancel_table; |
|
} |
|
|
|
nla_nest_end(msg, table_attr); |
|
kfree(context); |
|
|
|
return 0; |
|
|
|
err_cancel_table: |
|
nla_nest_cancel(msg, table_attr); |
|
err: |
|
kfree(context); |
|
return ret; |
|
}
|
|
|