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 hr_reg_read(context, CQC_ARM_ST))) 17 18 goto err; 19 20 if (rdma_nl_put_driver_u32(msg, "ceqn", 21 hr_reg_read(context, CQC_CEQN))) 22 goto err; 23 24 if (rdma_nl_put_driver_u32(msg, "cqn", 25 hr_reg_read(context, CQC_CQN))) 26 goto err; 27 28 if (rdma_nl_put_driver_u32(msg, "hopnum", 29 hr_reg_read(context, CQC_CQE_HOP_NUM))) 30 goto err; 31 32 if (rdma_nl_put_driver_u32(msg, "pi", 33 hr_reg_read(context, CQC_CQ_PRODUCER_IDX))) 34 goto err; 35 36 if (rdma_nl_put_driver_u32(msg, "ci", 37 hr_reg_read(context, CQC_CQ_CONSUMER_IDX))) 38 goto err; 39 40 if (rdma_nl_put_driver_u32(msg, "coalesce", 41 hr_reg_read(context, CQC_CQ_MAX_CNT))) 42 goto err; 43 44 if (rdma_nl_put_driver_u32(msg, "period", 45 hr_reg_read(context, CQC_CQ_PERIOD))) 46 goto err; 47 48 if (rdma_nl_put_driver_u32(msg, "cnt", 49 hr_reg_read(context, CQC_CQE_CNT))) 50 goto err; 51 52 return 0; 53 54 err: 55 return -EMSGSIZE; 56 } 57 58 int hns_roce_fill_res_cq_entry(struct sk_buff *msg, 59 struct ib_cq *ib_cq) 60 { 61 struct hns_roce_dev *hr_dev = to_hr_dev(ib_cq->device); 62 struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq); 63 struct hns_roce_v2_cq_context *context; 64 struct nlattr *table_attr; 65 int ret; 66 67 if (!hr_dev->dfx->query_cqc_info) 68 return -EINVAL; 69 70 context = kzalloc(sizeof(struct hns_roce_v2_cq_context), GFP_KERNEL); 71 if (!context) 72 return -ENOMEM; 73 74 ret = hr_dev->dfx->query_cqc_info(hr_dev, hr_cq->cqn, (int *)context); 75 if (ret) 76 goto err; 77 78 table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER); 79 if (!table_attr) { 80 ret = -EMSGSIZE; 81 goto err; 82 } 83 84 if (hns_roce_fill_cq(msg, context)) { 85 ret = -EMSGSIZE; 86 goto err_cancel_table; 87 } 88 89 nla_nest_end(msg, table_attr); 90 kfree(context); 91 92 return 0; 93 94 err_cancel_table: 95 nla_nest_cancel(msg, table_attr); 96 err: 97 kfree(context); 98 return ret; 99 } 100