From 260c3b3499198b2cfa911ea7fb4f28bb129ef1e8 Mon Sep 17 00:00:00 2001 From: Yangyang Li <liyangyang20@huawei.com> Date: Thu, 8 Aug 2019 22:53:51 +0800 Subject: [PATCH] RDMA/hns: Refactor hns_roce_v2_set_hem for hip08 In order to reduce the complexity of hns_roce_v2_set_hem, extract the implementation of op as a function. Signed-off-by: Yangyang Li <liyangyang20@huawei.com> Link: https://lore.kernel.org/r/1565276034-97329-12-git-send-email-oulijun@huawei.com Signed-off-by: Doug Ledford <dledford@redhat.com> --- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 93 ++++++++++++---------- 1 file changed, 51 insertions(+), 42 deletions(-) diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c index 208ff4be45a7..4de5f848f91f 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c @@ -2903,46 +2903,15 @@ static int hns_roce_v2_poll_cq(struct ib_cq *ibcq, int num_entries, return npolled; } -static int hns_roce_v2_set_hem(struct hns_roce_dev *hr_dev, - struct hns_roce_hem_table *table, int obj, - int step_idx) +static int get_op_for_set_hem(struct hns_roce_dev *hr_dev, u32 type, + int step_idx) { - struct device *dev = hr_dev->dev; - struct hns_roce_cmd_mailbox *mailbox; - struct hns_roce_hem_iter iter; - struct hns_roce_hem_mhop mhop; - struct hns_roce_hem *hem; - unsigned long mhop_obj = obj; - int i, j, k; - int ret = 0; - u64 hem_idx = 0; - u64 l1_idx = 0; - u64 bt_ba = 0; - u32 chunk_ba_num; - u32 hop_num; - u16 op = 0xff; + int op; - if (!hns_roce_check_whether_mhop(hr_dev, table->type)) - return 0; + if (type == HEM_TYPE_SCCC && step_idx) + return -EINVAL; - hns_roce_calc_hem_mhop(hr_dev, table, &mhop_obj, &mhop); - i = mhop.l0_idx; - j = mhop.l1_idx; - k = mhop.l2_idx; - hop_num = mhop.hop_num; - chunk_ba_num = mhop.bt_chunk_size / 8; - - if (hop_num == 2) { - hem_idx = i * chunk_ba_num * chunk_ba_num + j * chunk_ba_num + - k; - l1_idx = i * chunk_ba_num + j; - } else if (hop_num == 1) { - hem_idx = i * chunk_ba_num + j; - } else if (hop_num == HNS_ROCE_HOP_NUM_0) { - hem_idx = i; - } - - switch (table->type) { + switch (type) { case HEM_TYPE_QPC: op = HNS_ROCE_CMD_WRITE_QPC_BT0; break; @@ -2965,15 +2934,55 @@ static int hns_roce_v2_set_hem(struct hns_roce_dev *hr_dev, op = HNS_ROCE_CMD_WRITE_CQC_TIMER_BT0; break; default: - dev_warn(dev, "Table %d not to be written by mailbox!\n", - table->type); - return 0; + dev_warn(hr_dev->dev, + "Table %d not to be written by mailbox!\n", type); + return -EINVAL; } - if (table->type == HEM_TYPE_SCCC && step_idx) + return op + step_idx; +} + +static int hns_roce_v2_set_hem(struct hns_roce_dev *hr_dev, + struct hns_roce_hem_table *table, int obj, + int step_idx) +{ + struct hns_roce_cmd_mailbox *mailbox; + struct hns_roce_hem_iter iter; + struct hns_roce_hem_mhop mhop; + struct hns_roce_hem *hem; + unsigned long mhop_obj = obj; + int i, j, k; + int ret = 0; + u64 hem_idx = 0; + u64 l1_idx = 0; + u64 bt_ba = 0; + u32 chunk_ba_num; + u32 hop_num; + int op; + + if (!hns_roce_check_whether_mhop(hr_dev, table->type)) return 0; - op += step_idx; + hns_roce_calc_hem_mhop(hr_dev, table, &mhop_obj, &mhop); + i = mhop.l0_idx; + j = mhop.l1_idx; + k = mhop.l2_idx; + hop_num = mhop.hop_num; + chunk_ba_num = mhop.bt_chunk_size / 8; + + if (hop_num == 2) { + hem_idx = i * chunk_ba_num * chunk_ba_num + j * chunk_ba_num + + k; + l1_idx = i * chunk_ba_num + j; + } else if (hop_num == 1) { + hem_idx = i * chunk_ba_num + j; + } else if (hop_num == HNS_ROCE_HOP_NUM_0) { + hem_idx = i; + } + + op = get_op_for_set_hem(hr_dev, table->type, step_idx); + if (op == -EINVAL) + return 0; mailbox = hns_roce_alloc_cmd_mailbox(hr_dev); if (IS_ERR(mailbox))