Lijun Ou | e1c9a0dc | 2019-04-01 19:13:35 +0800 | [diff] [blame] | 1 | // SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) |
| 2 | // Copyright (c) 2019 Hisilicon Limited. |
| 3 | |
| 4 | #include <rdma/rdma_cm.h> |
| 5 | #include <rdma/restrack.h> |
| 6 | #include <uapi/rdma/rdma_netlink.h> |
| 7 | #include "hnae3.h" |
| 8 | #include "hns_roce_common.h" |
| 9 | #include "hns_roce_device.h" |
| 10 | #include "hns_roce_hw_v2.h" |
| 11 | |
| 12 | static int hns_roce_fill_cq(struct sk_buff *msg, |
| 13 | struct hns_roce_v2_cq_context *context) |
| 14 | { |
| 15 | if (rdma_nl_put_driver_u32(msg, "state", |
| 16 | roce_get_field(context->byte_4_pg_ceqn, |
| 17 | V2_CQC_BYTE_4_ARM_ST_M, |
| 18 | V2_CQC_BYTE_4_ARM_ST_S))) |
| 19 | goto err; |
| 20 | |
| 21 | if (rdma_nl_put_driver_u32(msg, "ceqn", |
| 22 | roce_get_field(context->byte_4_pg_ceqn, |
| 23 | V2_CQC_BYTE_4_CEQN_M, |
| 24 | V2_CQC_BYTE_4_CEQN_S))) |
| 25 | goto err; |
| 26 | |
| 27 | if (rdma_nl_put_driver_u32(msg, "cqn", |
| 28 | roce_get_field(context->byte_8_cqn, |
| 29 | V2_CQC_BYTE_8_CQN_M, |
| 30 | V2_CQC_BYTE_8_CQN_S))) |
| 31 | goto err; |
| 32 | |
| 33 | if (rdma_nl_put_driver_u32(msg, "hopnum", |
| 34 | roce_get_field(context->byte_16_hop_addr, |
| 35 | V2_CQC_BYTE_16_CQE_HOP_NUM_M, |
| 36 | V2_CQC_BYTE_16_CQE_HOP_NUM_S))) |
| 37 | goto err; |
| 38 | |
| 39 | if (rdma_nl_put_driver_u32( |
| 40 | msg, "pi", |
| 41 | roce_get_field(context->byte_28_cq_pi, |
| 42 | V2_CQC_BYTE_28_CQ_PRODUCER_IDX_M, |
| 43 | V2_CQC_BYTE_28_CQ_PRODUCER_IDX_S))) |
| 44 | goto err; |
| 45 | |
| 46 | if (rdma_nl_put_driver_u32( |
| 47 | msg, "ci", |
| 48 | roce_get_field(context->byte_32_cq_ci, |
| 49 | V2_CQC_BYTE_32_CQ_CONSUMER_IDX_M, |
| 50 | V2_CQC_BYTE_32_CQ_CONSUMER_IDX_S))) |
| 51 | goto err; |
| 52 | |
| 53 | if (rdma_nl_put_driver_u32( |
| 54 | msg, "coalesce", |
| 55 | roce_get_field(context->byte_56_cqe_period_maxcnt, |
| 56 | V2_CQC_BYTE_56_CQ_MAX_CNT_M, |
| 57 | V2_CQC_BYTE_56_CQ_MAX_CNT_S))) |
| 58 | goto err; |
| 59 | |
| 60 | if (rdma_nl_put_driver_u32( |
| 61 | msg, "period", |
| 62 | roce_get_field(context->byte_56_cqe_period_maxcnt, |
| 63 | V2_CQC_BYTE_56_CQ_PERIOD_M, |
| 64 | V2_CQC_BYTE_56_CQ_PERIOD_S))) |
| 65 | goto err; |
| 66 | |
| 67 | if (rdma_nl_put_driver_u32(msg, "cnt", |
| 68 | roce_get_field(context->byte_52_cqe_cnt, |
| 69 | V2_CQC_BYTE_52_CQE_CNT_M, |
| 70 | V2_CQC_BYTE_52_CQE_CNT_S))) |
| 71 | goto err; |
| 72 | |
| 73 | return 0; |
| 74 | |
| 75 | err: |
| 76 | return -EMSGSIZE; |
| 77 | } |
| 78 | |
Maor Gottlieb | 9e2a187 | 2020-06-23 14:30:37 +0300 | [diff] [blame] | 79 | int hns_roce_fill_res_cq_entry(struct sk_buff *msg, |
| 80 | struct ib_cq *ib_cq) |
Lijun Ou | e1c9a0dc | 2019-04-01 19:13:35 +0800 | [diff] [blame] | 81 | { |
Lijun Ou | e1c9a0dc | 2019-04-01 19:13:35 +0800 | [diff] [blame] | 82 | struct hns_roce_dev *hr_dev = to_hr_dev(ib_cq->device); |
| 83 | struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq); |
| 84 | struct hns_roce_v2_cq_context *context; |
| 85 | struct nlattr *table_attr; |
| 86 | int ret; |
| 87 | |
| 88 | if (!hr_dev->dfx->query_cqc_info) |
| 89 | return -EINVAL; |
| 90 | |
| 91 | context = kzalloc(sizeof(struct hns_roce_v2_cq_context), GFP_KERNEL); |
| 92 | if (!context) |
| 93 | return -ENOMEM; |
| 94 | |
| 95 | ret = hr_dev->dfx->query_cqc_info(hr_dev, hr_cq->cqn, (int *)context); |
| 96 | if (ret) |
Lijun Ou | e1c9a0dc | 2019-04-01 19:13:35 +0800 | [diff] [blame] | 97 | goto err; |
| 98 | |
Colin Ian King | 994195e | 2019-10-24 14:10:34 +0100 | [diff] [blame] | 99 | table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER); |
| 100 | if (!table_attr) { |
| 101 | ret = -EMSGSIZE; |
| 102 | goto err; |
| 103 | } |
| 104 | |
| 105 | if (hns_roce_fill_cq(msg, context)) { |
| 106 | ret = -EMSGSIZE; |
Lijun Ou | e1c9a0dc | 2019-04-01 19:13:35 +0800 | [diff] [blame] | 107 | goto err_cancel_table; |
Colin Ian King | 994195e | 2019-10-24 14:10:34 +0100 | [diff] [blame] | 108 | } |
Lijun Ou | e1c9a0dc | 2019-04-01 19:13:35 +0800 | [diff] [blame] | 109 | |
| 110 | nla_nest_end(msg, table_attr); |
| 111 | kfree(context); |
| 112 | |
| 113 | return 0; |
| 114 | |
| 115 | err_cancel_table: |
| 116 | nla_nest_cancel(msg, table_attr); |
| 117 | err: |
| 118 | kfree(context); |
Colin Ian King | 994195e | 2019-10-24 14:10:34 +0100 | [diff] [blame] | 119 | return ret; |
Lijun Ou | e1c9a0dc | 2019-04-01 19:13:35 +0800 | [diff] [blame] | 120 | } |