1 /*
2 * Copyright (c) 2016-2017 Hisilicon Limited.
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
9 *
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
12 * conditions are met:
13 *
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer.
17 *
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and/or other materials
21 * provided with the distribution.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 * SOFTWARE.
31 */
32
33 #include <linux/acpi.h>
34 #include <linux/etherdevice.h>
35 #include <linux/interrupt.h>
36 #include <linux/kernel.h>
37 #include <linux/types.h>
38 #include <net/addrconf.h>
39 #include <rdma/ib_addr.h>
40 #include <rdma/ib_cache.h>
41 #include <rdma/ib_umem.h>
42 #include <rdma/uverbs_ioctl.h>
43
44 #include "hnae3.h"
45 #include "hns_roce_common.h"
46 #include "hns_roce_device.h"
47 #include "hns_roce_cmd.h"
48 #include "hns_roce_hem.h"
49 #include "hns_roce_hw_v2.h"
50
set_data_seg_v2(struct hns_roce_v2_wqe_data_seg * dseg,struct ib_sge * sg)51 static void set_data_seg_v2(struct hns_roce_v2_wqe_data_seg *dseg,
52 struct ib_sge *sg)
53 {
54 dseg->lkey = cpu_to_le32(sg->lkey);
55 dseg->addr = cpu_to_le64(sg->addr);
56 dseg->len = cpu_to_le32(sg->length);
57 }
58
59 /*
60 * mapped-value = 1 + real-value
61 * The hns wr opcode real value is start from 0, In order to distinguish between
62 * initialized and uninitialized map values, we plus 1 to the actual value when
63 * defining the mapping, so that the validity can be identified by checking the
64 * mapped value is greater than 0.
65 */
66 #define HR_OPC_MAP(ib_key, hr_key) \
67 [IB_WR_ ## ib_key] = 1 + HNS_ROCE_V2_WQE_OP_ ## hr_key
68
69 static const u32 hns_roce_op_code[] = {
70 HR_OPC_MAP(RDMA_WRITE, RDMA_WRITE),
71 HR_OPC_MAP(RDMA_WRITE_WITH_IMM, RDMA_WRITE_WITH_IMM),
72 HR_OPC_MAP(SEND, SEND),
73 HR_OPC_MAP(SEND_WITH_IMM, SEND_WITH_IMM),
74 HR_OPC_MAP(RDMA_READ, RDMA_READ),
75 HR_OPC_MAP(ATOMIC_CMP_AND_SWP, ATOM_CMP_AND_SWAP),
76 HR_OPC_MAP(ATOMIC_FETCH_AND_ADD, ATOM_FETCH_AND_ADD),
77 HR_OPC_MAP(SEND_WITH_INV, SEND_WITH_INV),
78 HR_OPC_MAP(LOCAL_INV, LOCAL_INV),
79 HR_OPC_MAP(MASKED_ATOMIC_CMP_AND_SWP, ATOM_MSK_CMP_AND_SWAP),
80 HR_OPC_MAP(MASKED_ATOMIC_FETCH_AND_ADD, ATOM_MSK_FETCH_AND_ADD),
81 HR_OPC_MAP(REG_MR, FAST_REG_PMR),
82 };
83
to_hr_opcode(u32 ib_opcode)84 static u32 to_hr_opcode(u32 ib_opcode)
85 {
86 if (ib_opcode >= ARRAY_SIZE(hns_roce_op_code))
87 return HNS_ROCE_V2_WQE_OP_MASK;
88
89 return hns_roce_op_code[ib_opcode] ? hns_roce_op_code[ib_opcode] - 1 :
90 HNS_ROCE_V2_WQE_OP_MASK;
91 }
92
set_frmr_seg(struct hns_roce_v2_rc_send_wqe * rc_sq_wqe,const struct ib_reg_wr * wr)93 static void set_frmr_seg(struct hns_roce_v2_rc_send_wqe *rc_sq_wqe,
94 const struct ib_reg_wr *wr)
95 {
96 struct hns_roce_wqe_frmr_seg *fseg =
97 (void *)rc_sq_wqe + sizeof(struct hns_roce_v2_rc_send_wqe);
98 struct hns_roce_mr *mr = to_hr_mr(wr->mr);
99 u64 pbl_ba;
100
101 /* use ib_access_flags */
102 roce_set_bit(rc_sq_wqe->byte_4, V2_RC_FRMR_WQE_BYTE_4_BIND_EN_S,
103 wr->access & IB_ACCESS_MW_BIND ? 1 : 0);
104 roce_set_bit(rc_sq_wqe->byte_4, V2_RC_FRMR_WQE_BYTE_4_ATOMIC_S,
105 wr->access & IB_ACCESS_REMOTE_ATOMIC ? 1 : 0);
106 roce_set_bit(rc_sq_wqe->byte_4, V2_RC_FRMR_WQE_BYTE_4_RR_S,
107 wr->access & IB_ACCESS_REMOTE_READ ? 1 : 0);
108 roce_set_bit(rc_sq_wqe->byte_4, V2_RC_FRMR_WQE_BYTE_4_RW_S,
109 wr->access & IB_ACCESS_REMOTE_WRITE ? 1 : 0);
110 roce_set_bit(rc_sq_wqe->byte_4, V2_RC_FRMR_WQE_BYTE_4_LW_S,
111 wr->access & IB_ACCESS_LOCAL_WRITE ? 1 : 0);
112
113 /* Data structure reuse may lead to confusion */
114 pbl_ba = mr->pbl_mtr.hem_cfg.root_ba;
115 rc_sq_wqe->msg_len = cpu_to_le32(lower_32_bits(pbl_ba));
116 rc_sq_wqe->inv_key = cpu_to_le32(upper_32_bits(pbl_ba));
117
118 rc_sq_wqe->byte_16 = cpu_to_le32(wr->mr->length & 0xffffffff);
119 rc_sq_wqe->byte_20 = cpu_to_le32(wr->mr->length >> 32);
120 rc_sq_wqe->rkey = cpu_to_le32(wr->key);
121 rc_sq_wqe->va = cpu_to_le64(wr->mr->iova);
122
123 fseg->pbl_size = cpu_to_le32(mr->npages);
124 roce_set_field(fseg->mode_buf_pg_sz,
125 V2_RC_FRMR_WQE_BYTE_40_PBL_BUF_PG_SZ_M,
126 V2_RC_FRMR_WQE_BYTE_40_PBL_BUF_PG_SZ_S,
127 to_hr_hw_page_shift(mr->pbl_mtr.hem_cfg.buf_pg_shift));
128 roce_set_bit(fseg->mode_buf_pg_sz,
129 V2_RC_FRMR_WQE_BYTE_40_BLK_MODE_S, 0);
130 }
131
set_atomic_seg(const struct ib_send_wr * wr,struct hns_roce_v2_rc_send_wqe * rc_sq_wqe,unsigned int valid_num_sge)132 static void set_atomic_seg(const struct ib_send_wr *wr,
133 struct hns_roce_v2_rc_send_wqe *rc_sq_wqe,
134 unsigned int valid_num_sge)
135 {
136 struct hns_roce_v2_wqe_data_seg *dseg =
137 (void *)rc_sq_wqe + sizeof(struct hns_roce_v2_rc_send_wqe);
138 struct hns_roce_wqe_atomic_seg *aseg =
139 (void *)dseg + sizeof(struct hns_roce_v2_wqe_data_seg);
140
141 set_data_seg_v2(dseg, wr->sg_list);
142
143 if (wr->opcode == IB_WR_ATOMIC_CMP_AND_SWP) {
144 aseg->fetchadd_swap_data = cpu_to_le64(atomic_wr(wr)->swap);
145 aseg->cmp_data = cpu_to_le64(atomic_wr(wr)->compare_add);
146 } else {
147 aseg->fetchadd_swap_data =
148 cpu_to_le64(atomic_wr(wr)->compare_add);
149 aseg->cmp_data = 0;
150 }
151
152 roce_set_field(rc_sq_wqe->byte_16, V2_RC_SEND_WQE_BYTE_16_SGE_NUM_M,
153 V2_RC_SEND_WQE_BYTE_16_SGE_NUM_S, valid_num_sge);
154 }
155
fill_ext_sge_inl_data(struct hns_roce_qp * qp,const struct ib_send_wr * wr,unsigned int * sge_idx,u32 msg_len)156 static int fill_ext_sge_inl_data(struct hns_roce_qp *qp,
157 const struct ib_send_wr *wr,
158 unsigned int *sge_idx, u32 msg_len)
159 {
160 struct ib_device *ibdev = &(to_hr_dev(qp->ibqp.device))->ib_dev;
161 unsigned int dseg_len = sizeof(struct hns_roce_v2_wqe_data_seg);
162 unsigned int ext_sge_sz = qp->sq.max_gs * dseg_len;
163 unsigned int left_len_in_pg;
164 unsigned int idx = *sge_idx;
165 unsigned int i = 0;
166 unsigned int len;
167 void *addr;
168 void *dseg;
169
170 if (msg_len > ext_sge_sz) {
171 ibdev_err(ibdev,
172 "no enough extended sge space for inline data.\n");
173 return -EINVAL;
174 }
175
176 dseg = hns_roce_get_extend_sge(qp, idx & (qp->sge.sge_cnt - 1));
177 left_len_in_pg = hr_hw_page_align((uintptr_t)dseg) - (uintptr_t)dseg;
178 len = wr->sg_list[0].length;
179 addr = (void *)(unsigned long)(wr->sg_list[0].addr);
180
181 /* When copying data to extended sge space, the left length in page may
182 * not long enough for current user's sge. So the data should be
183 * splited into several parts, one in the first page, and the others in
184 * the subsequent pages.
185 */
186 while (1) {
187 if (len <= left_len_in_pg) {
188 memcpy(dseg, addr, len);
189
190 idx += len / dseg_len;
191
192 i++;
193 if (i >= wr->num_sge)
194 break;
195
196 left_len_in_pg -= len;
197 len = wr->sg_list[i].length;
198 addr = (void *)(unsigned long)(wr->sg_list[i].addr);
199 dseg += len;
200 } else {
201 memcpy(dseg, addr, left_len_in_pg);
202
203 len -= left_len_in_pg;
204 addr += left_len_in_pg;
205 idx += left_len_in_pg / dseg_len;
206 dseg = hns_roce_get_extend_sge(qp,
207 idx & (qp->sge.sge_cnt - 1));
208 left_len_in_pg = 1 << HNS_HW_PAGE_SHIFT;
209 }
210 }
211
212 *sge_idx = idx;
213
214 return 0;
215 }
216
set_extend_sge(struct hns_roce_qp * qp,struct ib_sge * sge,unsigned int * sge_ind,unsigned int cnt)217 static void set_extend_sge(struct hns_roce_qp *qp, struct ib_sge *sge,
218 unsigned int *sge_ind, unsigned int cnt)
219 {
220 struct hns_roce_v2_wqe_data_seg *dseg;
221 unsigned int idx = *sge_ind;
222
223 while (cnt > 0) {
224 dseg = hns_roce_get_extend_sge(qp, idx & (qp->sge.sge_cnt - 1));
225 if (likely(sge->length)) {
226 set_data_seg_v2(dseg, sge);
227 idx++;
228 cnt--;
229 }
230 sge++;
231 }
232
233 *sge_ind = idx;
234 }
235
check_inl_data_len(struct hns_roce_qp * qp,unsigned int len)236 static bool check_inl_data_len(struct hns_roce_qp *qp, unsigned int len)
237 {
238 struct hns_roce_dev *hr_dev = to_hr_dev(qp->ibqp.device);
239 int mtu = ib_mtu_enum_to_int(qp->path_mtu);
240
241 if (len > qp->max_inline_data || len > mtu) {
242 ibdev_err(&hr_dev->ib_dev,
243 "invalid length of data, data len = %u, max inline len = %u, path mtu = %d.\n",
244 len, qp->max_inline_data, mtu);
245 return false;
246 }
247
248 return true;
249 }
250
set_rc_inl(struct hns_roce_qp * qp,const struct ib_send_wr * wr,struct hns_roce_v2_rc_send_wqe * rc_sq_wqe,unsigned int * sge_idx)251 static int set_rc_inl(struct hns_roce_qp *qp, const struct ib_send_wr *wr,
252 struct hns_roce_v2_rc_send_wqe *rc_sq_wqe,
253 unsigned int *sge_idx)
254 {
255 struct hns_roce_dev *hr_dev = to_hr_dev(qp->ibqp.device);
256 u32 msg_len = le32_to_cpu(rc_sq_wqe->msg_len);
257 struct ib_device *ibdev = &hr_dev->ib_dev;
258 unsigned int curr_idx = *sge_idx;
259 void *dseg = rc_sq_wqe;
260 unsigned int i;
261 int ret;
262
263 if (unlikely(wr->opcode == IB_WR_RDMA_READ)) {
264 ibdev_err(ibdev, "invalid inline parameters!\n");
265 return -EINVAL;
266 }
267
268 if (!check_inl_data_len(qp, msg_len))
269 return -EINVAL;
270
271 dseg += sizeof(struct hns_roce_v2_rc_send_wqe);
272
273 roce_set_bit(rc_sq_wqe->byte_4, V2_RC_SEND_WQE_BYTE_4_INLINE_S, 1);
274
275 if (msg_len <= HNS_ROCE_V2_MAX_RC_INL_INN_SZ) {
276 roce_set_bit(rc_sq_wqe->byte_20,
277 V2_RC_SEND_WQE_BYTE_20_INL_TYPE_S, 0);
278
279 for (i = 0; i < wr->num_sge; i++) {
280 memcpy(dseg, ((void *)wr->sg_list[i].addr),
281 wr->sg_list[i].length);
282 dseg += wr->sg_list[i].length;
283 }
284 } else {
285 roce_set_bit(rc_sq_wqe->byte_20,
286 V2_RC_SEND_WQE_BYTE_20_INL_TYPE_S, 1);
287
288 ret = fill_ext_sge_inl_data(qp, wr, &curr_idx, msg_len);
289 if (ret)
290 return ret;
291
292 roce_set_field(rc_sq_wqe->byte_16,
293 V2_RC_SEND_WQE_BYTE_16_SGE_NUM_M,
294 V2_RC_SEND_WQE_BYTE_16_SGE_NUM_S,
295 curr_idx - *sge_idx);
296 }
297
298 *sge_idx = curr_idx;
299
300 return 0;
301 }
302
set_rwqe_data_seg(struct ib_qp * ibqp,const struct ib_send_wr * wr,struct hns_roce_v2_rc_send_wqe * rc_sq_wqe,unsigned int * sge_ind,unsigned int valid_num_sge)303 static int set_rwqe_data_seg(struct ib_qp *ibqp, const struct ib_send_wr *wr,
304 struct hns_roce_v2_rc_send_wqe *rc_sq_wqe,
305 unsigned int *sge_ind,
306 unsigned int valid_num_sge)
307 {
308 struct hns_roce_v2_wqe_data_seg *dseg =
309 (void *)rc_sq_wqe + sizeof(struct hns_roce_v2_rc_send_wqe);
310 struct hns_roce_qp *qp = to_hr_qp(ibqp);
311 int j = 0;
312 int i;
313
314 roce_set_field(rc_sq_wqe->byte_20,
315 V2_RC_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_M,
316 V2_RC_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_S,
317 (*sge_ind) & (qp->sge.sge_cnt - 1));
318
319 if (wr->send_flags & IB_SEND_INLINE)
320 return set_rc_inl(qp, wr, rc_sq_wqe, sge_ind);
321
322 if (valid_num_sge <= HNS_ROCE_SGE_IN_WQE) {
323 for (i = 0; i < wr->num_sge; i++) {
324 if (likely(wr->sg_list[i].length)) {
325 set_data_seg_v2(dseg, wr->sg_list + i);
326 dseg++;
327 }
328 }
329 } else {
330 for (i = 0; i < wr->num_sge && j < HNS_ROCE_SGE_IN_WQE; i++) {
331 if (likely(wr->sg_list[i].length)) {
332 set_data_seg_v2(dseg, wr->sg_list + i);
333 dseg++;
334 j++;
335 }
336 }
337
338 set_extend_sge(qp, wr->sg_list + i, sge_ind,
339 valid_num_sge - HNS_ROCE_SGE_IN_WQE);
340 }
341
342 roce_set_field(rc_sq_wqe->byte_16,
343 V2_RC_SEND_WQE_BYTE_16_SGE_NUM_M,
344 V2_RC_SEND_WQE_BYTE_16_SGE_NUM_S, valid_num_sge);
345
346 return 0;
347 }
348
check_send_valid(struct hns_roce_dev * hr_dev,struct hns_roce_qp * hr_qp)349 static int check_send_valid(struct hns_roce_dev *hr_dev,
350 struct hns_roce_qp *hr_qp)
351 {
352 struct ib_device *ibdev = &hr_dev->ib_dev;
353 struct ib_qp *ibqp = &hr_qp->ibqp;
354
355 if (unlikely(ibqp->qp_type != IB_QPT_RC &&
356 ibqp->qp_type != IB_QPT_GSI &&
357 ibqp->qp_type != IB_QPT_UD)) {
358 ibdev_err(ibdev, "Not supported QP(0x%x)type!\n",
359 ibqp->qp_type);
360 return -EOPNOTSUPP;
361 } else if (unlikely(hr_qp->state == IB_QPS_RESET ||
362 hr_qp->state == IB_QPS_INIT ||
363 hr_qp->state == IB_QPS_RTR)) {
364 ibdev_err(ibdev, "failed to post WQE, QP state %hhu!\n",
365 hr_qp->state);
366 return -EINVAL;
367 } else if (unlikely(hr_dev->state >= HNS_ROCE_DEVICE_STATE_RST_DOWN)) {
368 ibdev_err(ibdev, "failed to post WQE, dev state %d!\n",
369 hr_dev->state);
370 return -EIO;
371 }
372
373 return 0;
374 }
375
calc_wr_sge_num(const struct ib_send_wr * wr,unsigned int * sge_len)376 static unsigned int calc_wr_sge_num(const struct ib_send_wr *wr,
377 unsigned int *sge_len)
378 {
379 unsigned int valid_num = 0;
380 unsigned int len = 0;
381 int i;
382
383 for (i = 0; i < wr->num_sge; i++) {
384 if (likely(wr->sg_list[i].length)) {
385 len += wr->sg_list[i].length;
386 valid_num++;
387 }
388 }
389
390 *sge_len = len;
391 return valid_num;
392 }
393
get_immtdata(const struct ib_send_wr * wr)394 static __le32 get_immtdata(const struct ib_send_wr *wr)
395 {
396 switch (wr->opcode) {
397 case IB_WR_SEND_WITH_IMM:
398 case IB_WR_RDMA_WRITE_WITH_IMM:
399 return cpu_to_le32(be32_to_cpu(wr->ex.imm_data));
400 default:
401 return 0;
402 }
403 }
404
set_ud_opcode(struct hns_roce_v2_ud_send_wqe * ud_sq_wqe,const struct ib_send_wr * wr)405 static int set_ud_opcode(struct hns_roce_v2_ud_send_wqe *ud_sq_wqe,
406 const struct ib_send_wr *wr)
407 {
408 u32 ib_op = wr->opcode;
409
410 if (ib_op != IB_WR_SEND && ib_op != IB_WR_SEND_WITH_IMM)
411 return -EINVAL;
412
413 ud_sq_wqe->immtdata = get_immtdata(wr);
414
415 roce_set_field(ud_sq_wqe->byte_4, V2_UD_SEND_WQE_BYTE_4_OPCODE_M,
416 V2_UD_SEND_WQE_BYTE_4_OPCODE_S, to_hr_opcode(ib_op));
417
418 return 0;
419 }
420
set_ud_wqe(struct hns_roce_qp * qp,const struct ib_send_wr * wr,void * wqe,unsigned int * sge_idx,unsigned int owner_bit)421 static inline int set_ud_wqe(struct hns_roce_qp *qp,
422 const struct ib_send_wr *wr,
423 void *wqe, unsigned int *sge_idx,
424 unsigned int owner_bit)
425 {
426 struct hns_roce_dev *hr_dev = to_hr_dev(qp->ibqp.device);
427 struct hns_roce_ah *ah = to_hr_ah(ud_wr(wr)->ah);
428 struct hns_roce_v2_ud_send_wqe *ud_sq_wqe = wqe;
429 unsigned int curr_idx = *sge_idx;
430 int valid_num_sge;
431 u32 msg_len = 0;
432 int ret;
433
434 valid_num_sge = calc_wr_sge_num(wr, &msg_len);
435 memset(ud_sq_wqe, 0, sizeof(*ud_sq_wqe));
436
437 ret = set_ud_opcode(ud_sq_wqe, wr);
438 if (WARN_ON(ret))
439 return ret;
440
441 roce_set_field(ud_sq_wqe->dmac, V2_UD_SEND_WQE_DMAC_0_M,
442 V2_UD_SEND_WQE_DMAC_0_S, ah->av.mac[0]);
443 roce_set_field(ud_sq_wqe->dmac, V2_UD_SEND_WQE_DMAC_1_M,
444 V2_UD_SEND_WQE_DMAC_1_S, ah->av.mac[1]);
445 roce_set_field(ud_sq_wqe->dmac, V2_UD_SEND_WQE_DMAC_2_M,
446 V2_UD_SEND_WQE_DMAC_2_S, ah->av.mac[2]);
447 roce_set_field(ud_sq_wqe->dmac, V2_UD_SEND_WQE_DMAC_3_M,
448 V2_UD_SEND_WQE_DMAC_3_S, ah->av.mac[3]);
449 roce_set_field(ud_sq_wqe->byte_48, V2_UD_SEND_WQE_BYTE_48_DMAC_4_M,
450 V2_UD_SEND_WQE_BYTE_48_DMAC_4_S, ah->av.mac[4]);
451 roce_set_field(ud_sq_wqe->byte_48, V2_UD_SEND_WQE_BYTE_48_DMAC_5_M,
452 V2_UD_SEND_WQE_BYTE_48_DMAC_5_S, ah->av.mac[5]);
453
454 ud_sq_wqe->msg_len = cpu_to_le32(msg_len);
455
456 /* Set sig attr */
457 roce_set_bit(ud_sq_wqe->byte_4, V2_UD_SEND_WQE_BYTE_4_CQE_S,
458 (wr->send_flags & IB_SEND_SIGNALED) ? 1 : 0);
459
460 /* Set se attr */
461 roce_set_bit(ud_sq_wqe->byte_4, V2_UD_SEND_WQE_BYTE_4_SE_S,
462 (wr->send_flags & IB_SEND_SOLICITED) ? 1 : 0);
463
464 roce_set_bit(ud_sq_wqe->byte_4, V2_UD_SEND_WQE_BYTE_4_OWNER_S,
465 owner_bit);
466
467 roce_set_field(ud_sq_wqe->byte_16, V2_UD_SEND_WQE_BYTE_16_PD_M,
468 V2_UD_SEND_WQE_BYTE_16_PD_S, to_hr_pd(qp->ibqp.pd)->pdn);
469
470 roce_set_field(ud_sq_wqe->byte_16, V2_UD_SEND_WQE_BYTE_16_SGE_NUM_M,
471 V2_UD_SEND_WQE_BYTE_16_SGE_NUM_S, valid_num_sge);
472
473 roce_set_field(ud_sq_wqe->byte_20,
474 V2_UD_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_M,
475 V2_UD_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_S,
476 curr_idx & (qp->sge.sge_cnt - 1));
477
478 roce_set_field(ud_sq_wqe->byte_24, V2_UD_SEND_WQE_BYTE_24_UDPSPN_M,
479 V2_UD_SEND_WQE_BYTE_24_UDPSPN_S, ah->av.udp_sport);
480 ud_sq_wqe->qkey = cpu_to_le32(ud_wr(wr)->remote_qkey & 0x80000000 ?
481 qp->qkey : ud_wr(wr)->remote_qkey);
482 roce_set_field(ud_sq_wqe->byte_32, V2_UD_SEND_WQE_BYTE_32_DQPN_M,
483 V2_UD_SEND_WQE_BYTE_32_DQPN_S, ud_wr(wr)->remote_qpn);
484
485 roce_set_field(ud_sq_wqe->byte_36, V2_UD_SEND_WQE_BYTE_36_HOPLIMIT_M,
486 V2_UD_SEND_WQE_BYTE_36_HOPLIMIT_S, ah->av.hop_limit);
487 roce_set_field(ud_sq_wqe->byte_36, V2_UD_SEND_WQE_BYTE_36_TCLASS_M,
488 V2_UD_SEND_WQE_BYTE_36_TCLASS_S, ah->av.tclass);
489 roce_set_field(ud_sq_wqe->byte_40, V2_UD_SEND_WQE_BYTE_40_FLOW_LABEL_M,
490 V2_UD_SEND_WQE_BYTE_40_FLOW_LABEL_S, ah->av.flowlabel);
491 roce_set_field(ud_sq_wqe->byte_40, V2_UD_SEND_WQE_BYTE_40_SL_M,
492 V2_UD_SEND_WQE_BYTE_40_SL_S, ah->av.sl);
493 roce_set_field(ud_sq_wqe->byte_40, V2_UD_SEND_WQE_BYTE_40_PORTN_M,
494 V2_UD_SEND_WQE_BYTE_40_PORTN_S, qp->port);
495
496 roce_set_field(ud_sq_wqe->byte_48, V2_UD_SEND_WQE_BYTE_48_SGID_INDX_M,
497 V2_UD_SEND_WQE_BYTE_48_SGID_INDX_S, ah->av.gid_index);
498
499 if (hr_dev->pci_dev->revision <= PCI_REVISION_ID_HIP08) {
500 roce_set_bit(ud_sq_wqe->byte_40,
501 V2_UD_SEND_WQE_BYTE_40_UD_VLAN_EN_S,
502 ah->av.vlan_en);
503 roce_set_field(ud_sq_wqe->byte_36,
504 V2_UD_SEND_WQE_BYTE_36_VLAN_M,
505 V2_UD_SEND_WQE_BYTE_36_VLAN_S, ah->av.vlan_id);
506 }
507
508 memcpy(&ud_sq_wqe->dgid[0], &ah->av.dgid[0], GID_LEN_V2);
509
510 set_extend_sge(qp, wr->sg_list, &curr_idx, valid_num_sge);
511
512 *sge_idx = curr_idx;
513
514 return 0;
515 }
516
set_rc_opcode(struct hns_roce_v2_rc_send_wqe * rc_sq_wqe,const struct ib_send_wr * wr)517 static int set_rc_opcode(struct hns_roce_v2_rc_send_wqe *rc_sq_wqe,
518 const struct ib_send_wr *wr)
519 {
520 u32 ib_op = wr->opcode;
521
522 rc_sq_wqe->immtdata = get_immtdata(wr);
523
524 switch (ib_op) {
525 case IB_WR_RDMA_READ:
526 case IB_WR_RDMA_WRITE:
527 case IB_WR_RDMA_WRITE_WITH_IMM:
528 rc_sq_wqe->rkey = cpu_to_le32(rdma_wr(wr)->rkey);
529 rc_sq_wqe->va = cpu_to_le64(rdma_wr(wr)->remote_addr);
530 break;
531 case IB_WR_SEND:
532 case IB_WR_SEND_WITH_IMM:
533 break;
534 case IB_WR_ATOMIC_CMP_AND_SWP:
535 case IB_WR_ATOMIC_FETCH_AND_ADD:
536 rc_sq_wqe->rkey = cpu_to_le32(atomic_wr(wr)->rkey);
537 rc_sq_wqe->va = cpu_to_le64(atomic_wr(wr)->remote_addr);
538 break;
539 case IB_WR_REG_MR:
540 set_frmr_seg(rc_sq_wqe, reg_wr(wr));
541 break;
542 case IB_WR_LOCAL_INV:
543 roce_set_bit(rc_sq_wqe->byte_4, V2_RC_SEND_WQE_BYTE_4_SO_S, 1);
544 fallthrough;
545 case IB_WR_SEND_WITH_INV:
546 rc_sq_wqe->inv_key = cpu_to_le32(wr->ex.invalidate_rkey);
547 break;
548 default:
549 return -EINVAL;
550 }
551
552 roce_set_field(rc_sq_wqe->byte_4, V2_RC_SEND_WQE_BYTE_4_OPCODE_M,
553 V2_RC_SEND_WQE_BYTE_4_OPCODE_S, to_hr_opcode(ib_op));
554
555 return 0;
556 }
set_rc_wqe(struct hns_roce_qp * qp,const struct ib_send_wr * wr,void * wqe,unsigned int * sge_idx,unsigned int owner_bit)557 static inline int set_rc_wqe(struct hns_roce_qp *qp,
558 const struct ib_send_wr *wr,
559 void *wqe, unsigned int *sge_idx,
560 unsigned int owner_bit)
561 {
562 struct hns_roce_v2_rc_send_wqe *rc_sq_wqe = wqe;
563 unsigned int curr_idx = *sge_idx;
564 unsigned int valid_num_sge;
565 u32 msg_len = 0;
566 int ret;
567
568 valid_num_sge = calc_wr_sge_num(wr, &msg_len);
569 memset(rc_sq_wqe, 0, sizeof(*rc_sq_wqe));
570
571 rc_sq_wqe->msg_len = cpu_to_le32(msg_len);
572
573 ret = set_rc_opcode(rc_sq_wqe, wr);
574 if (WARN_ON(ret))
575 return ret;
576
577 roce_set_bit(rc_sq_wqe->byte_4, V2_RC_SEND_WQE_BYTE_4_FENCE_S,
578 (wr->send_flags & IB_SEND_FENCE) ? 1 : 0);
579
580 roce_set_bit(rc_sq_wqe->byte_4, V2_RC_SEND_WQE_BYTE_4_SE_S,
581 (wr->send_flags & IB_SEND_SOLICITED) ? 1 : 0);
582
583 roce_set_bit(rc_sq_wqe->byte_4, V2_RC_SEND_WQE_BYTE_4_CQE_S,
584 (wr->send_flags & IB_SEND_SIGNALED) ? 1 : 0);
585
586 roce_set_bit(rc_sq_wqe->byte_4, V2_RC_SEND_WQE_BYTE_4_OWNER_S,
587 owner_bit);
588
589 if (wr->opcode == IB_WR_ATOMIC_CMP_AND_SWP ||
590 wr->opcode == IB_WR_ATOMIC_FETCH_AND_ADD)
591 set_atomic_seg(wr, rc_sq_wqe, valid_num_sge);
592 else if (wr->opcode != IB_WR_REG_MR)
593 ret = set_rwqe_data_seg(&qp->ibqp, wr, rc_sq_wqe,
594 &curr_idx, valid_num_sge);
595
596 *sge_idx = curr_idx;
597
598 return ret;
599 }
600
update_sq_db(struct hns_roce_dev * hr_dev,struct hns_roce_qp * qp)601 static inline void update_sq_db(struct hns_roce_dev *hr_dev,
602 struct hns_roce_qp *qp)
603 {
604 /*
605 * Hip08 hardware cannot flush the WQEs in SQ if the QP state
606 * gets into errored mode. Hence, as a workaround to this
607 * hardware limitation, driver needs to assist in flushing. But
608 * the flushing operation uses mailbox to convey the QP state to
609 * the hardware and which can sleep due to the mutex protection
610 * around the mailbox calls. Hence, use the deferred flush for
611 * now.
612 */
613 if (qp->state == IB_QPS_ERR) {
614 if (!test_and_set_bit(HNS_ROCE_FLUSH_FLAG, &qp->flush_flag))
615 init_flush_work(hr_dev, qp);
616 } else {
617 struct hns_roce_v2_db sq_db = {};
618
619 roce_set_field(sq_db.byte_4, V2_DB_BYTE_4_TAG_M,
620 V2_DB_BYTE_4_TAG_S, qp->doorbell_qpn);
621 roce_set_field(sq_db.byte_4, V2_DB_BYTE_4_CMD_M,
622 V2_DB_BYTE_4_CMD_S, HNS_ROCE_V2_SQ_DB);
623 roce_set_field(sq_db.parameter, V2_DB_PARAMETER_IDX_M,
624 V2_DB_PARAMETER_IDX_S, qp->sq.head);
625 roce_set_field(sq_db.parameter, V2_DB_PARAMETER_SL_M,
626 V2_DB_PARAMETER_SL_S, qp->sl);
627
628 hns_roce_write64(hr_dev, (__le32 *)&sq_db, qp->sq.db_reg_l);
629 }
630 }
631
hns_roce_v2_post_send(struct ib_qp * ibqp,const struct ib_send_wr * wr,const struct ib_send_wr ** bad_wr)632 static int hns_roce_v2_post_send(struct ib_qp *ibqp,
633 const struct ib_send_wr *wr,
634 const struct ib_send_wr **bad_wr)
635 {
636 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
637 struct ib_device *ibdev = &hr_dev->ib_dev;
638 struct hns_roce_qp *qp = to_hr_qp(ibqp);
639 unsigned long flags = 0;
640 unsigned int owner_bit;
641 unsigned int sge_idx;
642 unsigned int wqe_idx;
643 void *wqe = NULL;
644 int nreq;
645 int ret;
646
647 spin_lock_irqsave(&qp->sq.lock, flags);
648
649 ret = check_send_valid(hr_dev, qp);
650 if (unlikely(ret)) {
651 *bad_wr = wr;
652 nreq = 0;
653 goto out;
654 }
655
656 sge_idx = qp->next_sge;
657
658 for (nreq = 0; wr; ++nreq, wr = wr->next) {
659 if (hns_roce_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq)) {
660 ret = -ENOMEM;
661 *bad_wr = wr;
662 goto out;
663 }
664
665 wqe_idx = (qp->sq.head + nreq) & (qp->sq.wqe_cnt - 1);
666
667 if (unlikely(wr->num_sge > qp->sq.max_gs)) {
668 ibdev_err(ibdev, "num_sge = %d > qp->sq.max_gs = %u.\n",
669 wr->num_sge, qp->sq.max_gs);
670 ret = -EINVAL;
671 *bad_wr = wr;
672 goto out;
673 }
674
675 wqe = hns_roce_get_send_wqe(qp, wqe_idx);
676 qp->sq.wrid[wqe_idx] = wr->wr_id;
677 owner_bit =
678 ~(((qp->sq.head + nreq) >> ilog2(qp->sq.wqe_cnt)) & 0x1);
679
680 /* Corresponding to the QP type, wqe process separately */
681 if (ibqp->qp_type == IB_QPT_GSI)
682 ret = set_ud_wqe(qp, wr, wqe, &sge_idx, owner_bit);
683 else if (ibqp->qp_type == IB_QPT_RC)
684 ret = set_rc_wqe(qp, wr, wqe, &sge_idx, owner_bit);
685
686 if (unlikely(ret)) {
687 *bad_wr = wr;
688 goto out;
689 }
690 }
691
692 out:
693 if (likely(nreq)) {
694 qp->sq.head += nreq;
695 qp->next_sge = sge_idx;
696 /* Memory barrier */
697 wmb();
698 update_sq_db(hr_dev, qp);
699 }
700
701 spin_unlock_irqrestore(&qp->sq.lock, flags);
702
703 return ret;
704 }
705
check_recv_valid(struct hns_roce_dev * hr_dev,struct hns_roce_qp * hr_qp)706 static int check_recv_valid(struct hns_roce_dev *hr_dev,
707 struct hns_roce_qp *hr_qp)
708 {
709 if (unlikely(hr_dev->state >= HNS_ROCE_DEVICE_STATE_RST_DOWN))
710 return -EIO;
711 else if (hr_qp->state == IB_QPS_RESET)
712 return -EINVAL;
713
714 return 0;
715 }
716
hns_roce_v2_post_recv(struct ib_qp * ibqp,const struct ib_recv_wr * wr,const struct ib_recv_wr ** bad_wr)717 static int hns_roce_v2_post_recv(struct ib_qp *ibqp,
718 const struct ib_recv_wr *wr,
719 const struct ib_recv_wr **bad_wr)
720 {
721 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
722 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
723 struct ib_device *ibdev = &hr_dev->ib_dev;
724 struct hns_roce_v2_wqe_data_seg *dseg;
725 struct hns_roce_rinl_sge *sge_list;
726 unsigned long flags;
727 void *wqe = NULL;
728 u32 wqe_idx;
729 int nreq;
730 int ret;
731 int i;
732
733 spin_lock_irqsave(&hr_qp->rq.lock, flags);
734
735 ret = check_recv_valid(hr_dev, hr_qp);
736 if (unlikely(ret)) {
737 *bad_wr = wr;
738 nreq = 0;
739 goto out;
740 }
741
742 for (nreq = 0; wr; ++nreq, wr = wr->next) {
743 if (unlikely(hns_roce_wq_overflow(&hr_qp->rq, nreq,
744 hr_qp->ibqp.recv_cq))) {
745 ret = -ENOMEM;
746 *bad_wr = wr;
747 goto out;
748 }
749
750 wqe_idx = (hr_qp->rq.head + nreq) & (hr_qp->rq.wqe_cnt - 1);
751
752 if (unlikely(wr->num_sge > hr_qp->rq.max_gs)) {
753 ibdev_err(ibdev, "num_sge = %d >= max_sge = %u.\n",
754 wr->num_sge, hr_qp->rq.max_gs);
755 ret = -EINVAL;
756 *bad_wr = wr;
757 goto out;
758 }
759
760 wqe = hns_roce_get_recv_wqe(hr_qp, wqe_idx);
761 dseg = (struct hns_roce_v2_wqe_data_seg *)wqe;
762 for (i = 0; i < wr->num_sge; i++) {
763 if (!wr->sg_list[i].length)
764 continue;
765 set_data_seg_v2(dseg, wr->sg_list + i);
766 dseg++;
767 }
768
769 if (wr->num_sge < hr_qp->rq.max_gs) {
770 dseg->lkey = cpu_to_le32(HNS_ROCE_INVALID_LKEY);
771 dseg->addr = 0;
772 }
773
774 /* rq support inline data */
775 if (hr_qp->rq_inl_buf.wqe_cnt) {
776 sge_list = hr_qp->rq_inl_buf.wqe_list[wqe_idx].sg_list;
777 hr_qp->rq_inl_buf.wqe_list[wqe_idx].sge_cnt =
778 (u32)wr->num_sge;
779 for (i = 0; i < wr->num_sge; i++) {
780 sge_list[i].addr =
781 (void *)(u64)wr->sg_list[i].addr;
782 sge_list[i].len = wr->sg_list[i].length;
783 }
784 }
785
786 hr_qp->rq.wrid[wqe_idx] = wr->wr_id;
787 }
788
789 out:
790 if (likely(nreq)) {
791 hr_qp->rq.head += nreq;
792 /* Memory barrier */
793 wmb();
794
795 /*
796 * Hip08 hardware cannot flush the WQEs in RQ if the QP state
797 * gets into errored mode. Hence, as a workaround to this
798 * hardware limitation, driver needs to assist in flushing. But
799 * the flushing operation uses mailbox to convey the QP state to
800 * the hardware and which can sleep due to the mutex protection
801 * around the mailbox calls. Hence, use the deferred flush for
802 * now.
803 */
804 if (hr_qp->state == IB_QPS_ERR) {
805 if (!test_and_set_bit(HNS_ROCE_FLUSH_FLAG,
806 &hr_qp->flush_flag))
807 init_flush_work(hr_dev, hr_qp);
808 } else {
809 *hr_qp->rdb.db_record = hr_qp->rq.head & 0xffff;
810 }
811 }
812 spin_unlock_irqrestore(&hr_qp->rq.lock, flags);
813
814 return ret;
815 }
816
get_srq_wqe(struct hns_roce_srq * srq,int n)817 static void *get_srq_wqe(struct hns_roce_srq *srq, int n)
818 {
819 return hns_roce_buf_offset(srq->buf_mtr.kmem, n << srq->wqe_shift);
820 }
821
get_idx_buf(struct hns_roce_idx_que * idx_que,int n)822 static void *get_idx_buf(struct hns_roce_idx_que *idx_que, int n)
823 {
824 return hns_roce_buf_offset(idx_que->mtr.kmem,
825 n << idx_que->entry_shift);
826 }
827
hns_roce_free_srq_wqe(struct hns_roce_srq * srq,int wqe_index)828 static void hns_roce_free_srq_wqe(struct hns_roce_srq *srq, int wqe_index)
829 {
830 /* always called with interrupts disabled. */
831 spin_lock(&srq->lock);
832
833 bitmap_clear(srq->idx_que.bitmap, wqe_index, 1);
834 srq->tail++;
835
836 spin_unlock(&srq->lock);
837 }
838
find_empty_entry(struct hns_roce_idx_que * idx_que,unsigned long size)839 static int find_empty_entry(struct hns_roce_idx_que *idx_que,
840 unsigned long size)
841 {
842 int wqe_idx;
843
844 if (unlikely(bitmap_full(idx_que->bitmap, size)))
845 return -ENOSPC;
846
847 wqe_idx = find_first_zero_bit(idx_que->bitmap, size);
848
849 bitmap_set(idx_que->bitmap, wqe_idx, 1);
850
851 return wqe_idx;
852 }
853
hns_roce_v2_post_srq_recv(struct ib_srq * ibsrq,const struct ib_recv_wr * wr,const struct ib_recv_wr ** bad_wr)854 static int hns_roce_v2_post_srq_recv(struct ib_srq *ibsrq,
855 const struct ib_recv_wr *wr,
856 const struct ib_recv_wr **bad_wr)
857 {
858 struct hns_roce_dev *hr_dev = to_hr_dev(ibsrq->device);
859 struct hns_roce_srq *srq = to_hr_srq(ibsrq);
860 struct hns_roce_v2_wqe_data_seg *dseg;
861 struct hns_roce_v2_db srq_db;
862 unsigned long flags;
863 __le32 *srq_idx;
864 int ret = 0;
865 int wqe_idx;
866 void *wqe;
867 int nreq;
868 int ind;
869 int i;
870
871 spin_lock_irqsave(&srq->lock, flags);
872
873 ind = srq->head & (srq->wqe_cnt - 1);
874
875 for (nreq = 0; wr; ++nreq, wr = wr->next) {
876 if (unlikely(wr->num_sge >= srq->max_gs)) {
877 ret = -EINVAL;
878 *bad_wr = wr;
879 break;
880 }
881
882 if (unlikely(srq->head == srq->tail)) {
883 ret = -ENOMEM;
884 *bad_wr = wr;
885 break;
886 }
887
888 wqe_idx = find_empty_entry(&srq->idx_que, srq->wqe_cnt);
889 if (unlikely(wqe_idx < 0)) {
890 ret = -ENOMEM;
891 *bad_wr = wr;
892 break;
893 }
894
895 wqe = get_srq_wqe(srq, wqe_idx);
896 dseg = (struct hns_roce_v2_wqe_data_seg *)wqe;
897
898 for (i = 0; i < wr->num_sge; ++i) {
899 dseg[i].len = cpu_to_le32(wr->sg_list[i].length);
900 dseg[i].lkey = cpu_to_le32(wr->sg_list[i].lkey);
901 dseg[i].addr = cpu_to_le64(wr->sg_list[i].addr);
902 }
903
904 if (wr->num_sge < srq->max_gs) {
905 dseg[i].len = 0;
906 dseg[i].lkey = cpu_to_le32(0x100);
907 dseg[i].addr = 0;
908 }
909
910 srq_idx = get_idx_buf(&srq->idx_que, ind);
911 *srq_idx = cpu_to_le32(wqe_idx);
912
913 srq->wrid[wqe_idx] = wr->wr_id;
914 ind = (ind + 1) & (srq->wqe_cnt - 1);
915 }
916
917 if (likely(nreq)) {
918 srq->head += nreq;
919
920 /*
921 * Make sure that descriptors are written before
922 * doorbell record.
923 */
924 wmb();
925
926 srq_db.byte_4 =
927 cpu_to_le32(HNS_ROCE_V2_SRQ_DB << V2_DB_BYTE_4_CMD_S |
928 (srq->srqn & V2_DB_BYTE_4_TAG_M));
929 srq_db.parameter =
930 cpu_to_le32(srq->head & V2_DB_PARAMETER_IDX_M);
931
932 hns_roce_write64(hr_dev, (__le32 *)&srq_db, srq->db_reg_l);
933 }
934
935 spin_unlock_irqrestore(&srq->lock, flags);
936
937 return ret;
938 }
939
hns_roce_v2_cmd_hw_reseted(struct hns_roce_dev * hr_dev,unsigned long instance_stage,unsigned long reset_stage)940 static int hns_roce_v2_cmd_hw_reseted(struct hns_roce_dev *hr_dev,
941 unsigned long instance_stage,
942 unsigned long reset_stage)
943 {
944 /* When hardware reset has been completed once or more, we should stop
945 * sending mailbox&cmq&doorbell to hardware. If now in .init_instance()
946 * function, we should exit with error. If now at HNAE3_INIT_CLIENT
947 * stage of soft reset process, we should exit with error, and then
948 * HNAE3_INIT_CLIENT related process can rollback the operation like
949 * notifing hardware to free resources, HNAE3_INIT_CLIENT related
950 * process will exit with error to notify NIC driver to reschedule soft
951 * reset process once again.
952 */
953 hr_dev->is_reset = true;
954 hr_dev->dis_db = true;
955
956 if (reset_stage == HNS_ROCE_STATE_RST_INIT ||
957 instance_stage == HNS_ROCE_STATE_INIT)
958 return CMD_RST_PRC_EBUSY;
959
960 return CMD_RST_PRC_SUCCESS;
961 }
962
hns_roce_v2_cmd_hw_resetting(struct hns_roce_dev * hr_dev,unsigned long instance_stage,unsigned long reset_stage)963 static int hns_roce_v2_cmd_hw_resetting(struct hns_roce_dev *hr_dev,
964 unsigned long instance_stage,
965 unsigned long reset_stage)
966 {
967 struct hns_roce_v2_priv *priv = hr_dev->priv;
968 struct hnae3_handle *handle = priv->handle;
969 const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
970
971 /* When hardware reset is detected, we should stop sending mailbox&cmq&
972 * doorbell to hardware. If now in .init_instance() function, we should
973 * exit with error. If now at HNAE3_INIT_CLIENT stage of soft reset
974 * process, we should exit with error, and then HNAE3_INIT_CLIENT
975 * related process can rollback the operation like notifing hardware to
976 * free resources, HNAE3_INIT_CLIENT related process will exit with
977 * error to notify NIC driver to reschedule soft reset process once
978 * again.
979 */
980 hr_dev->dis_db = true;
981 if (!ops->get_hw_reset_stat(handle))
982 hr_dev->is_reset = true;
983
984 if (!hr_dev->is_reset || reset_stage == HNS_ROCE_STATE_RST_INIT ||
985 instance_stage == HNS_ROCE_STATE_INIT)
986 return CMD_RST_PRC_EBUSY;
987
988 return CMD_RST_PRC_SUCCESS;
989 }
990
hns_roce_v2_cmd_sw_resetting(struct hns_roce_dev * hr_dev)991 static int hns_roce_v2_cmd_sw_resetting(struct hns_roce_dev *hr_dev)
992 {
993 struct hns_roce_v2_priv *priv = hr_dev->priv;
994 struct hnae3_handle *handle = priv->handle;
995 const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
996
997 /* When software reset is detected at .init_instance() function, we
998 * should stop sending mailbox&cmq&doorbell to hardware, and exit
999 * with error.
1000 */
1001 hr_dev->dis_db = true;
1002 if (ops->ae_dev_reset_cnt(handle) != hr_dev->reset_cnt)
1003 hr_dev->is_reset = true;
1004
1005 return CMD_RST_PRC_EBUSY;
1006 }
1007
hns_roce_v2_rst_process_cmd(struct hns_roce_dev * hr_dev)1008 static int hns_roce_v2_rst_process_cmd(struct hns_roce_dev *hr_dev)
1009 {
1010 struct hns_roce_v2_priv *priv = hr_dev->priv;
1011 struct hnae3_handle *handle = priv->handle;
1012 const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
1013 unsigned long instance_stage; /* the current instance stage */
1014 unsigned long reset_stage; /* the current reset stage */
1015 unsigned long reset_cnt;
1016 bool sw_resetting;
1017 bool hw_resetting;
1018
1019 if (hr_dev->is_reset)
1020 return CMD_RST_PRC_SUCCESS;
1021
1022 /* Get information about reset from NIC driver or RoCE driver itself,
1023 * the meaning of the following variables from NIC driver are described
1024 * as below:
1025 * reset_cnt -- The count value of completed hardware reset.
1026 * hw_resetting -- Whether hardware device is resetting now.
1027 * sw_resetting -- Whether NIC's software reset process is running now.
1028 */
1029 instance_stage = handle->rinfo.instance_state;
1030 reset_stage = handle->rinfo.reset_state;
1031 reset_cnt = ops->ae_dev_reset_cnt(handle);
1032 hw_resetting = ops->get_cmdq_stat(handle);
1033 sw_resetting = ops->ae_dev_resetting(handle);
1034
1035 if (reset_cnt != hr_dev->reset_cnt)
1036 return hns_roce_v2_cmd_hw_reseted(hr_dev, instance_stage,
1037 reset_stage);
1038 else if (hw_resetting)
1039 return hns_roce_v2_cmd_hw_resetting(hr_dev, instance_stage,
1040 reset_stage);
1041 else if (sw_resetting && instance_stage == HNS_ROCE_STATE_INIT)
1042 return hns_roce_v2_cmd_sw_resetting(hr_dev);
1043
1044 return 0;
1045 }
1046
hns_roce_cmq_space(struct hns_roce_v2_cmq_ring * ring)1047 static int hns_roce_cmq_space(struct hns_roce_v2_cmq_ring *ring)
1048 {
1049 int ntu = ring->next_to_use;
1050 int ntc = ring->next_to_clean;
1051 int used = (ntu - ntc + ring->desc_num) % ring->desc_num;
1052
1053 return ring->desc_num - used - 1;
1054 }
1055
hns_roce_alloc_cmq_desc(struct hns_roce_dev * hr_dev,struct hns_roce_v2_cmq_ring * ring)1056 static int hns_roce_alloc_cmq_desc(struct hns_roce_dev *hr_dev,
1057 struct hns_roce_v2_cmq_ring *ring)
1058 {
1059 int size = ring->desc_num * sizeof(struct hns_roce_cmq_desc);
1060
1061 ring->desc = kzalloc(size, GFP_KERNEL);
1062 if (!ring->desc)
1063 return -ENOMEM;
1064
1065 ring->desc_dma_addr = dma_map_single(hr_dev->dev, ring->desc, size,
1066 DMA_BIDIRECTIONAL);
1067 if (dma_mapping_error(hr_dev->dev, ring->desc_dma_addr)) {
1068 ring->desc_dma_addr = 0;
1069 kfree(ring->desc);
1070 ring->desc = NULL;
1071 return -ENOMEM;
1072 }
1073
1074 return 0;
1075 }
1076
hns_roce_free_cmq_desc(struct hns_roce_dev * hr_dev,struct hns_roce_v2_cmq_ring * ring)1077 static void hns_roce_free_cmq_desc(struct hns_roce_dev *hr_dev,
1078 struct hns_roce_v2_cmq_ring *ring)
1079 {
1080 dma_unmap_single(hr_dev->dev, ring->desc_dma_addr,
1081 ring->desc_num * sizeof(struct hns_roce_cmq_desc),
1082 DMA_BIDIRECTIONAL);
1083
1084 ring->desc_dma_addr = 0;
1085 kfree(ring->desc);
1086 }
1087
hns_roce_init_cmq_ring(struct hns_roce_dev * hr_dev,bool ring_type)1088 static int hns_roce_init_cmq_ring(struct hns_roce_dev *hr_dev, bool ring_type)
1089 {
1090 struct hns_roce_v2_priv *priv = hr_dev->priv;
1091 struct hns_roce_v2_cmq_ring *ring = (ring_type == TYPE_CSQ) ?
1092 &priv->cmq.csq : &priv->cmq.crq;
1093
1094 ring->flag = ring_type;
1095 ring->next_to_clean = 0;
1096 ring->next_to_use = 0;
1097
1098 return hns_roce_alloc_cmq_desc(hr_dev, ring);
1099 }
1100
hns_roce_cmq_init_regs(struct hns_roce_dev * hr_dev,bool ring_type)1101 static void hns_roce_cmq_init_regs(struct hns_roce_dev *hr_dev, bool ring_type)
1102 {
1103 struct hns_roce_v2_priv *priv = hr_dev->priv;
1104 struct hns_roce_v2_cmq_ring *ring = (ring_type == TYPE_CSQ) ?
1105 &priv->cmq.csq : &priv->cmq.crq;
1106 dma_addr_t dma = ring->desc_dma_addr;
1107
1108 if (ring_type == TYPE_CSQ) {
1109 roce_write(hr_dev, ROCEE_TX_CMQ_BASEADDR_L_REG, (u32)dma);
1110 roce_write(hr_dev, ROCEE_TX_CMQ_BASEADDR_H_REG,
1111 upper_32_bits(dma));
1112 roce_write(hr_dev, ROCEE_TX_CMQ_DEPTH_REG,
1113 ring->desc_num >> HNS_ROCE_CMQ_DESC_NUM_S);
1114 roce_write(hr_dev, ROCEE_TX_CMQ_HEAD_REG, 0);
1115 roce_write(hr_dev, ROCEE_TX_CMQ_TAIL_REG, 0);
1116 } else {
1117 roce_write(hr_dev, ROCEE_RX_CMQ_BASEADDR_L_REG, (u32)dma);
1118 roce_write(hr_dev, ROCEE_RX_CMQ_BASEADDR_H_REG,
1119 upper_32_bits(dma));
1120 roce_write(hr_dev, ROCEE_RX_CMQ_DEPTH_REG,
1121 ring->desc_num >> HNS_ROCE_CMQ_DESC_NUM_S);
1122 roce_write(hr_dev, ROCEE_RX_CMQ_HEAD_REG, 0);
1123 roce_write(hr_dev, ROCEE_RX_CMQ_TAIL_REG, 0);
1124 }
1125 }
1126
hns_roce_v2_cmq_init(struct hns_roce_dev * hr_dev)1127 static int hns_roce_v2_cmq_init(struct hns_roce_dev *hr_dev)
1128 {
1129 struct hns_roce_v2_priv *priv = hr_dev->priv;
1130 int ret;
1131
1132 /* Setup the queue entries for command queue */
1133 priv->cmq.csq.desc_num = CMD_CSQ_DESC_NUM;
1134 priv->cmq.crq.desc_num = CMD_CRQ_DESC_NUM;
1135
1136 /* Setup the lock for command queue */
1137 spin_lock_init(&priv->cmq.csq.lock);
1138 spin_lock_init(&priv->cmq.crq.lock);
1139
1140 /* Setup Tx write back timeout */
1141 priv->cmq.tx_timeout = HNS_ROCE_CMQ_TX_TIMEOUT;
1142
1143 /* Init CSQ */
1144 ret = hns_roce_init_cmq_ring(hr_dev, TYPE_CSQ);
1145 if (ret) {
1146 dev_err(hr_dev->dev, "Init CSQ error, ret = %d.\n", ret);
1147 return ret;
1148 }
1149
1150 /* Init CRQ */
1151 ret = hns_roce_init_cmq_ring(hr_dev, TYPE_CRQ);
1152 if (ret) {
1153 dev_err(hr_dev->dev, "Init CRQ error, ret = %d.\n", ret);
1154 goto err_crq;
1155 }
1156
1157 /* Init CSQ REG */
1158 hns_roce_cmq_init_regs(hr_dev, TYPE_CSQ);
1159
1160 /* Init CRQ REG */
1161 hns_roce_cmq_init_regs(hr_dev, TYPE_CRQ);
1162
1163 return 0;
1164
1165 err_crq:
1166 hns_roce_free_cmq_desc(hr_dev, &priv->cmq.csq);
1167
1168 return ret;
1169 }
1170
hns_roce_v2_cmq_exit(struct hns_roce_dev * hr_dev)1171 static void hns_roce_v2_cmq_exit(struct hns_roce_dev *hr_dev)
1172 {
1173 struct hns_roce_v2_priv *priv = hr_dev->priv;
1174
1175 hns_roce_free_cmq_desc(hr_dev, &priv->cmq.csq);
1176 hns_roce_free_cmq_desc(hr_dev, &priv->cmq.crq);
1177 }
1178
hns_roce_cmq_setup_basic_desc(struct hns_roce_cmq_desc * desc,enum hns_roce_opcode_type opcode,bool is_read)1179 static void hns_roce_cmq_setup_basic_desc(struct hns_roce_cmq_desc *desc,
1180 enum hns_roce_opcode_type opcode,
1181 bool is_read)
1182 {
1183 memset((void *)desc, 0, sizeof(struct hns_roce_cmq_desc));
1184 desc->opcode = cpu_to_le16(opcode);
1185 desc->flag =
1186 cpu_to_le16(HNS_ROCE_CMD_FLAG_NO_INTR | HNS_ROCE_CMD_FLAG_IN);
1187 if (is_read)
1188 desc->flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_WR);
1189 else
1190 desc->flag &= cpu_to_le16(~HNS_ROCE_CMD_FLAG_WR);
1191 }
1192
hns_roce_cmq_csq_done(struct hns_roce_dev * hr_dev)1193 static int hns_roce_cmq_csq_done(struct hns_roce_dev *hr_dev)
1194 {
1195 u32 head = roce_read(hr_dev, ROCEE_TX_CMQ_HEAD_REG);
1196 struct hns_roce_v2_priv *priv = hr_dev->priv;
1197
1198 return head == priv->cmq.csq.next_to_use;
1199 }
1200
hns_roce_cmq_csq_clean(struct hns_roce_dev * hr_dev)1201 static int hns_roce_cmq_csq_clean(struct hns_roce_dev *hr_dev)
1202 {
1203 struct hns_roce_v2_priv *priv = hr_dev->priv;
1204 struct hns_roce_v2_cmq_ring *csq = &priv->cmq.csq;
1205 struct hns_roce_cmq_desc *desc;
1206 u16 ntc = csq->next_to_clean;
1207 u32 head;
1208 int clean = 0;
1209
1210 desc = &csq->desc[ntc];
1211 head = roce_read(hr_dev, ROCEE_TX_CMQ_HEAD_REG);
1212 while (head != ntc) {
1213 memset(desc, 0, sizeof(*desc));
1214 ntc++;
1215 if (ntc == csq->desc_num)
1216 ntc = 0;
1217 desc = &csq->desc[ntc];
1218 clean++;
1219 }
1220 csq->next_to_clean = ntc;
1221
1222 return clean;
1223 }
1224
__hns_roce_cmq_send(struct hns_roce_dev * hr_dev,struct hns_roce_cmq_desc * desc,int num)1225 static int __hns_roce_cmq_send(struct hns_roce_dev *hr_dev,
1226 struct hns_roce_cmq_desc *desc, int num)
1227 {
1228 struct hns_roce_v2_priv *priv = hr_dev->priv;
1229 struct hns_roce_v2_cmq_ring *csq = &priv->cmq.csq;
1230 struct hns_roce_cmq_desc *desc_to_use;
1231 bool complete = false;
1232 u32 timeout = 0;
1233 int handle = 0;
1234 u16 desc_ret;
1235 int ret;
1236 int ntc;
1237
1238 spin_lock_bh(&csq->lock);
1239
1240 if (num > hns_roce_cmq_space(csq)) {
1241 spin_unlock_bh(&csq->lock);
1242 return -EBUSY;
1243 }
1244
1245 /*
1246 * Record the location of desc in the cmq for this time
1247 * which will be use for hardware to write back
1248 */
1249 ntc = csq->next_to_use;
1250
1251 while (handle < num) {
1252 desc_to_use = &csq->desc[csq->next_to_use];
1253 *desc_to_use = desc[handle];
1254 dev_dbg(hr_dev->dev, "set cmq desc:\n");
1255 csq->next_to_use++;
1256 if (csq->next_to_use == csq->desc_num)
1257 csq->next_to_use = 0;
1258 handle++;
1259 }
1260
1261 /* Write to hardware */
1262 roce_write(hr_dev, ROCEE_TX_CMQ_TAIL_REG, csq->next_to_use);
1263
1264 /*
1265 * If the command is sync, wait for the firmware to write back,
1266 * if multi descriptors to be sent, use the first one to check
1267 */
1268 if (le16_to_cpu(desc->flag) & HNS_ROCE_CMD_FLAG_NO_INTR) {
1269 do {
1270 if (hns_roce_cmq_csq_done(hr_dev))
1271 break;
1272 udelay(1);
1273 timeout++;
1274 } while (timeout < priv->cmq.tx_timeout);
1275 }
1276
1277 if (hns_roce_cmq_csq_done(hr_dev)) {
1278 complete = true;
1279 handle = 0;
1280 ret = 0;
1281 while (handle < num) {
1282 /* get the result of hardware write back */
1283 desc_to_use = &csq->desc[ntc];
1284 desc[handle] = *desc_to_use;
1285 dev_dbg(hr_dev->dev, "Get cmq desc:\n");
1286 desc_ret = le16_to_cpu(desc[handle].retval);
1287 if (unlikely(desc_ret != CMD_EXEC_SUCCESS))
1288 ret = -EIO;
1289 priv->cmq.last_status = desc_ret;
1290 ntc++;
1291 handle++;
1292 if (ntc == csq->desc_num)
1293 ntc = 0;
1294 }
1295 }
1296
1297 if (!complete)
1298 ret = -EAGAIN;
1299
1300 /* clean the command send queue */
1301 handle = hns_roce_cmq_csq_clean(hr_dev);
1302 if (handle != num)
1303 dev_warn(hr_dev->dev, "Cleaned %d, need to clean %d\n",
1304 handle, num);
1305
1306 spin_unlock_bh(&csq->lock);
1307
1308 return ret;
1309 }
1310
hns_roce_cmq_send(struct hns_roce_dev * hr_dev,struct hns_roce_cmq_desc * desc,int num)1311 static int hns_roce_cmq_send(struct hns_roce_dev *hr_dev,
1312 struct hns_roce_cmq_desc *desc, int num)
1313 {
1314 int retval;
1315 int ret;
1316
1317 ret = hns_roce_v2_rst_process_cmd(hr_dev);
1318 if (ret == CMD_RST_PRC_SUCCESS)
1319 return 0;
1320 if (ret == CMD_RST_PRC_EBUSY)
1321 return -EBUSY;
1322
1323 ret = __hns_roce_cmq_send(hr_dev, desc, num);
1324 if (ret) {
1325 retval = hns_roce_v2_rst_process_cmd(hr_dev);
1326 if (retval == CMD_RST_PRC_SUCCESS)
1327 return 0;
1328 else if (retval == CMD_RST_PRC_EBUSY)
1329 return -EBUSY;
1330 }
1331
1332 return ret;
1333 }
1334
hns_roce_cmq_query_hw_info(struct hns_roce_dev * hr_dev)1335 static int hns_roce_cmq_query_hw_info(struct hns_roce_dev *hr_dev)
1336 {
1337 struct hns_roce_query_version *resp;
1338 struct hns_roce_cmq_desc desc;
1339 int ret;
1340
1341 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_QUERY_HW_VER, true);
1342 ret = hns_roce_cmq_send(hr_dev, &desc, 1);
1343 if (ret)
1344 return ret;
1345
1346 resp = (struct hns_roce_query_version *)desc.data;
1347 hr_dev->hw_rev = le16_to_cpu(resp->rocee_hw_version);
1348 hr_dev->vendor_id = hr_dev->pci_dev->vendor;
1349
1350 return 0;
1351 }
1352
hns_roce_func_clr_chk_rst(struct hns_roce_dev * hr_dev)1353 static bool hns_roce_func_clr_chk_rst(struct hns_roce_dev *hr_dev)
1354 {
1355 struct hns_roce_v2_priv *priv = hr_dev->priv;
1356 struct hnae3_handle *handle = priv->handle;
1357 const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
1358 unsigned long reset_cnt;
1359 bool sw_resetting;
1360 bool hw_resetting;
1361
1362 reset_cnt = ops->ae_dev_reset_cnt(handle);
1363 hw_resetting = ops->get_hw_reset_stat(handle);
1364 sw_resetting = ops->ae_dev_resetting(handle);
1365
1366 if (reset_cnt != hr_dev->reset_cnt || hw_resetting || sw_resetting)
1367 return true;
1368
1369 return false;
1370 }
1371
hns_roce_func_clr_rst_prc(struct hns_roce_dev * hr_dev,int retval,int flag)1372 static void hns_roce_func_clr_rst_prc(struct hns_roce_dev *hr_dev, int retval,
1373 int flag)
1374 {
1375 struct hns_roce_v2_priv *priv = hr_dev->priv;
1376 struct hnae3_handle *handle = priv->handle;
1377 const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
1378 unsigned long instance_stage;
1379 unsigned long reset_cnt;
1380 unsigned long end;
1381 bool sw_resetting;
1382 bool hw_resetting;
1383
1384 instance_stage = handle->rinfo.instance_state;
1385 reset_cnt = ops->ae_dev_reset_cnt(handle);
1386 hw_resetting = ops->get_hw_reset_stat(handle);
1387 sw_resetting = ops->ae_dev_resetting(handle);
1388
1389 if (reset_cnt != hr_dev->reset_cnt) {
1390 hr_dev->dis_db = true;
1391 hr_dev->is_reset = true;
1392 dev_info(hr_dev->dev, "Func clear success after reset.\n");
1393 } else if (hw_resetting) {
1394 hr_dev->dis_db = true;
1395
1396 dev_warn(hr_dev->dev,
1397 "Func clear is pending, device in resetting state.\n");
1398 end = HNS_ROCE_V2_HW_RST_TIMEOUT;
1399 while (end) {
1400 if (!ops->get_hw_reset_stat(handle)) {
1401 hr_dev->is_reset = true;
1402 dev_info(hr_dev->dev,
1403 "Func clear success after reset.\n");
1404 return;
1405 }
1406 msleep(HNS_ROCE_V2_HW_RST_COMPLETION_WAIT);
1407 end -= HNS_ROCE_V2_HW_RST_COMPLETION_WAIT;
1408 }
1409
1410 dev_warn(hr_dev->dev, "Func clear failed.\n");
1411 } else if (sw_resetting && instance_stage == HNS_ROCE_STATE_INIT) {
1412 hr_dev->dis_db = true;
1413
1414 dev_warn(hr_dev->dev,
1415 "Func clear is pending, device in resetting state.\n");
1416 end = HNS_ROCE_V2_HW_RST_TIMEOUT;
1417 while (end) {
1418 if (ops->ae_dev_reset_cnt(handle) !=
1419 hr_dev->reset_cnt) {
1420 hr_dev->is_reset = true;
1421 dev_info(hr_dev->dev,
1422 "Func clear success after sw reset\n");
1423 return;
1424 }
1425 msleep(HNS_ROCE_V2_HW_RST_COMPLETION_WAIT);
1426 end -= HNS_ROCE_V2_HW_RST_COMPLETION_WAIT;
1427 }
1428
1429 dev_warn(hr_dev->dev, "Func clear failed because of unfinished sw reset\n");
1430 } else {
1431 if (retval && !flag)
1432 dev_warn(hr_dev->dev,
1433 "Func clear read failed, ret = %d.\n", retval);
1434
1435 dev_warn(hr_dev->dev, "Func clear failed.\n");
1436 }
1437 }
hns_roce_function_clear(struct hns_roce_dev * hr_dev)1438 static void hns_roce_function_clear(struct hns_roce_dev *hr_dev)
1439 {
1440 bool fclr_write_fail_flag = false;
1441 struct hns_roce_func_clear *resp;
1442 struct hns_roce_cmq_desc desc;
1443 unsigned long end;
1444 int ret = 0;
1445
1446 if (hns_roce_func_clr_chk_rst(hr_dev))
1447 goto out;
1448
1449 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_FUNC_CLEAR, false);
1450 resp = (struct hns_roce_func_clear *)desc.data;
1451
1452 ret = hns_roce_cmq_send(hr_dev, &desc, 1);
1453 if (ret) {
1454 fclr_write_fail_flag = true;
1455 dev_err(hr_dev->dev, "Func clear write failed, ret = %d.\n",
1456 ret);
1457 goto out;
1458 }
1459
1460 msleep(HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_INTERVAL);
1461 end = HNS_ROCE_V2_FUNC_CLEAR_TIMEOUT_MSECS;
1462 while (end) {
1463 if (hns_roce_func_clr_chk_rst(hr_dev))
1464 goto out;
1465 msleep(HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_FAIL_WAIT);
1466 end -= HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_FAIL_WAIT;
1467
1468 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_FUNC_CLEAR,
1469 true);
1470
1471 ret = hns_roce_cmq_send(hr_dev, &desc, 1);
1472 if (ret)
1473 continue;
1474
1475 if (roce_get_bit(resp->func_done, FUNC_CLEAR_RST_FUN_DONE_S)) {
1476 hr_dev->is_reset = true;
1477 return;
1478 }
1479 }
1480
1481 out:
1482 hns_roce_func_clr_rst_prc(hr_dev, ret, fclr_write_fail_flag);
1483 }
1484
hns_roce_query_fw_ver(struct hns_roce_dev * hr_dev)1485 static int hns_roce_query_fw_ver(struct hns_roce_dev *hr_dev)
1486 {
1487 struct hns_roce_query_fw_info *resp;
1488 struct hns_roce_cmq_desc desc;
1489 int ret;
1490
1491 hns_roce_cmq_setup_basic_desc(&desc, HNS_QUERY_FW_VER, true);
1492 ret = hns_roce_cmq_send(hr_dev, &desc, 1);
1493 if (ret)
1494 return ret;
1495
1496 resp = (struct hns_roce_query_fw_info *)desc.data;
1497 hr_dev->caps.fw_ver = (u64)(le32_to_cpu(resp->fw_ver));
1498
1499 return 0;
1500 }
1501
hns_roce_config_global_param(struct hns_roce_dev * hr_dev)1502 static int hns_roce_config_global_param(struct hns_roce_dev *hr_dev)
1503 {
1504 struct hns_roce_cfg_global_param *req;
1505 struct hns_roce_cmq_desc desc;
1506
1507 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_GLOBAL_PARAM,
1508 false);
1509
1510 req = (struct hns_roce_cfg_global_param *)desc.data;
1511 memset(req, 0, sizeof(*req));
1512 roce_set_field(req->time_cfg_udp_port,
1513 CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_M,
1514 CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_S, 0x3e8);
1515 roce_set_field(req->time_cfg_udp_port,
1516 CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_M,
1517 CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_S, 0x12b7);
1518
1519 return hns_roce_cmq_send(hr_dev, &desc, 1);
1520 }
1521
hns_roce_query_pf_resource(struct hns_roce_dev * hr_dev)1522 static int hns_roce_query_pf_resource(struct hns_roce_dev *hr_dev)
1523 {
1524 struct hns_roce_cmq_desc desc[2];
1525 struct hns_roce_pf_res_a *req_a;
1526 struct hns_roce_pf_res_b *req_b;
1527 int ret;
1528 int i;
1529
1530 for (i = 0; i < 2; i++) {
1531 hns_roce_cmq_setup_basic_desc(&desc[i],
1532 HNS_ROCE_OPC_QUERY_PF_RES, true);
1533
1534 if (i == 0)
1535 desc[i].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
1536 else
1537 desc[i].flag &= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
1538 }
1539
1540 ret = hns_roce_cmq_send(hr_dev, desc, 2);
1541 if (ret)
1542 return ret;
1543
1544 req_a = (struct hns_roce_pf_res_a *)desc[0].data;
1545 req_b = (struct hns_roce_pf_res_b *)desc[1].data;
1546
1547 hr_dev->caps.qpc_bt_num = roce_get_field(req_a->qpc_bt_idx_num,
1548 PF_RES_DATA_1_PF_QPC_BT_NUM_M,
1549 PF_RES_DATA_1_PF_QPC_BT_NUM_S);
1550 hr_dev->caps.srqc_bt_num = roce_get_field(req_a->srqc_bt_idx_num,
1551 PF_RES_DATA_2_PF_SRQC_BT_NUM_M,
1552 PF_RES_DATA_2_PF_SRQC_BT_NUM_S);
1553 hr_dev->caps.cqc_bt_num = roce_get_field(req_a->cqc_bt_idx_num,
1554 PF_RES_DATA_3_PF_CQC_BT_NUM_M,
1555 PF_RES_DATA_3_PF_CQC_BT_NUM_S);
1556 hr_dev->caps.mpt_bt_num = roce_get_field(req_a->mpt_bt_idx_num,
1557 PF_RES_DATA_4_PF_MPT_BT_NUM_M,
1558 PF_RES_DATA_4_PF_MPT_BT_NUM_S);
1559
1560 hr_dev->caps.sl_num = roce_get_field(req_b->qid_idx_sl_num,
1561 PF_RES_DATA_3_PF_SL_NUM_M,
1562 PF_RES_DATA_3_PF_SL_NUM_S);
1563 hr_dev->caps.sccc_bt_num = roce_get_field(req_b->sccc_bt_idx_num,
1564 PF_RES_DATA_4_PF_SCCC_BT_NUM_M,
1565 PF_RES_DATA_4_PF_SCCC_BT_NUM_S);
1566
1567 return 0;
1568 }
1569
hns_roce_query_pf_timer_resource(struct hns_roce_dev * hr_dev)1570 static int hns_roce_query_pf_timer_resource(struct hns_roce_dev *hr_dev)
1571 {
1572 struct hns_roce_pf_timer_res_a *req_a;
1573 struct hns_roce_cmq_desc desc;
1574 int ret;
1575
1576 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_QUERY_PF_TIMER_RES,
1577 true);
1578
1579 ret = hns_roce_cmq_send(hr_dev, &desc, 1);
1580 if (ret)
1581 return ret;
1582
1583 req_a = (struct hns_roce_pf_timer_res_a *)desc.data;
1584
1585 hr_dev->caps.qpc_timer_bt_num =
1586 roce_get_field(req_a->qpc_timer_bt_idx_num,
1587 PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M,
1588 PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S);
1589 hr_dev->caps.cqc_timer_bt_num =
1590 roce_get_field(req_a->cqc_timer_bt_idx_num,
1591 PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M,
1592 PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S);
1593
1594 return 0;
1595 }
1596
hns_roce_set_vf_switch_param(struct hns_roce_dev * hr_dev,int vf_id)1597 static int hns_roce_set_vf_switch_param(struct hns_roce_dev *hr_dev, int vf_id)
1598 {
1599 struct hns_roce_cmq_desc desc;
1600 struct hns_roce_vf_switch *swt;
1601 int ret;
1602
1603 swt = (struct hns_roce_vf_switch *)desc.data;
1604 hns_roce_cmq_setup_basic_desc(&desc, HNS_SWITCH_PARAMETER_CFG, true);
1605 swt->rocee_sel |= cpu_to_le32(HNS_ICL_SWITCH_CMD_ROCEE_SEL);
1606 roce_set_field(swt->fun_id, VF_SWITCH_DATA_FUN_ID_VF_ID_M,
1607 VF_SWITCH_DATA_FUN_ID_VF_ID_S, vf_id);
1608 ret = hns_roce_cmq_send(hr_dev, &desc, 1);
1609 if (ret)
1610 return ret;
1611
1612 desc.flag =
1613 cpu_to_le16(HNS_ROCE_CMD_FLAG_NO_INTR | HNS_ROCE_CMD_FLAG_IN);
1614 desc.flag &= cpu_to_le16(~HNS_ROCE_CMD_FLAG_WR);
1615 roce_set_bit(swt->cfg, VF_SWITCH_DATA_CFG_ALW_LPBK_S, 1);
1616 roce_set_bit(swt->cfg, VF_SWITCH_DATA_CFG_ALW_LCL_LPBK_S, 0);
1617 roce_set_bit(swt->cfg, VF_SWITCH_DATA_CFG_ALW_DST_OVRD_S, 1);
1618
1619 return hns_roce_cmq_send(hr_dev, &desc, 1);
1620 }
1621
hns_roce_alloc_vf_resource(struct hns_roce_dev * hr_dev)1622 static int hns_roce_alloc_vf_resource(struct hns_roce_dev *hr_dev)
1623 {
1624 struct hns_roce_cmq_desc desc[2];
1625 struct hns_roce_vf_res_a *req_a;
1626 struct hns_roce_vf_res_b *req_b;
1627 int i;
1628
1629 req_a = (struct hns_roce_vf_res_a *)desc[0].data;
1630 req_b = (struct hns_roce_vf_res_b *)desc[1].data;
1631 for (i = 0; i < 2; i++) {
1632 hns_roce_cmq_setup_basic_desc(&desc[i],
1633 HNS_ROCE_OPC_ALLOC_VF_RES, false);
1634
1635 if (i == 0)
1636 desc[i].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
1637 else
1638 desc[i].flag &= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
1639 }
1640
1641 roce_set_field(req_a->vf_qpc_bt_idx_num,
1642 VF_RES_A_DATA_1_VF_QPC_BT_IDX_M,
1643 VF_RES_A_DATA_1_VF_QPC_BT_IDX_S, 0);
1644 roce_set_field(req_a->vf_qpc_bt_idx_num,
1645 VF_RES_A_DATA_1_VF_QPC_BT_NUM_M,
1646 VF_RES_A_DATA_1_VF_QPC_BT_NUM_S, HNS_ROCE_VF_QPC_BT_NUM);
1647
1648 roce_set_field(req_a->vf_srqc_bt_idx_num,
1649 VF_RES_A_DATA_2_VF_SRQC_BT_IDX_M,
1650 VF_RES_A_DATA_2_VF_SRQC_BT_IDX_S, 0);
1651 roce_set_field(req_a->vf_srqc_bt_idx_num,
1652 VF_RES_A_DATA_2_VF_SRQC_BT_NUM_M,
1653 VF_RES_A_DATA_2_VF_SRQC_BT_NUM_S,
1654 HNS_ROCE_VF_SRQC_BT_NUM);
1655
1656 roce_set_field(req_a->vf_cqc_bt_idx_num,
1657 VF_RES_A_DATA_3_VF_CQC_BT_IDX_M,
1658 VF_RES_A_DATA_3_VF_CQC_BT_IDX_S, 0);
1659 roce_set_field(req_a->vf_cqc_bt_idx_num,
1660 VF_RES_A_DATA_3_VF_CQC_BT_NUM_M,
1661 VF_RES_A_DATA_3_VF_CQC_BT_NUM_S, HNS_ROCE_VF_CQC_BT_NUM);
1662
1663 roce_set_field(req_a->vf_mpt_bt_idx_num,
1664 VF_RES_A_DATA_4_VF_MPT_BT_IDX_M,
1665 VF_RES_A_DATA_4_VF_MPT_BT_IDX_S, 0);
1666 roce_set_field(req_a->vf_mpt_bt_idx_num,
1667 VF_RES_A_DATA_4_VF_MPT_BT_NUM_M,
1668 VF_RES_A_DATA_4_VF_MPT_BT_NUM_S, HNS_ROCE_VF_MPT_BT_NUM);
1669
1670 roce_set_field(req_a->vf_eqc_bt_idx_num, VF_RES_A_DATA_5_VF_EQC_IDX_M,
1671 VF_RES_A_DATA_5_VF_EQC_IDX_S, 0);
1672 roce_set_field(req_a->vf_eqc_bt_idx_num, VF_RES_A_DATA_5_VF_EQC_NUM_M,
1673 VF_RES_A_DATA_5_VF_EQC_NUM_S, HNS_ROCE_VF_EQC_NUM);
1674
1675 roce_set_field(req_b->vf_smac_idx_num, VF_RES_B_DATA_1_VF_SMAC_IDX_M,
1676 VF_RES_B_DATA_1_VF_SMAC_IDX_S, 0);
1677 roce_set_field(req_b->vf_smac_idx_num, VF_RES_B_DATA_1_VF_SMAC_NUM_M,
1678 VF_RES_B_DATA_1_VF_SMAC_NUM_S, HNS_ROCE_VF_SMAC_NUM);
1679
1680 roce_set_field(req_b->vf_sgid_idx_num, VF_RES_B_DATA_2_VF_SGID_IDX_M,
1681 VF_RES_B_DATA_2_VF_SGID_IDX_S, 0);
1682 roce_set_field(req_b->vf_sgid_idx_num, VF_RES_B_DATA_2_VF_SGID_NUM_M,
1683 VF_RES_B_DATA_2_VF_SGID_NUM_S, HNS_ROCE_VF_SGID_NUM);
1684
1685 roce_set_field(req_b->vf_qid_idx_sl_num, VF_RES_B_DATA_3_VF_QID_IDX_M,
1686 VF_RES_B_DATA_3_VF_QID_IDX_S, 0);
1687 roce_set_field(req_b->vf_qid_idx_sl_num, VF_RES_B_DATA_3_VF_SL_NUM_M,
1688 VF_RES_B_DATA_3_VF_SL_NUM_S, HNS_ROCE_VF_SL_NUM);
1689
1690 roce_set_field(req_b->vf_sccc_idx_num, VF_RES_B_DATA_4_VF_SCCC_BT_IDX_M,
1691 VF_RES_B_DATA_4_VF_SCCC_BT_IDX_S, 0);
1692 roce_set_field(req_b->vf_sccc_idx_num, VF_RES_B_DATA_4_VF_SCCC_BT_NUM_M,
1693 VF_RES_B_DATA_4_VF_SCCC_BT_NUM_S,
1694 HNS_ROCE_VF_SCCC_BT_NUM);
1695
1696 return hns_roce_cmq_send(hr_dev, desc, 2);
1697 }
1698
hns_roce_v2_set_bt(struct hns_roce_dev * hr_dev)1699 static int hns_roce_v2_set_bt(struct hns_roce_dev *hr_dev)
1700 {
1701 u8 srqc_hop_num = hr_dev->caps.srqc_hop_num;
1702 u8 qpc_hop_num = hr_dev->caps.qpc_hop_num;
1703 u8 cqc_hop_num = hr_dev->caps.cqc_hop_num;
1704 u8 mpt_hop_num = hr_dev->caps.mpt_hop_num;
1705 u8 sccc_hop_num = hr_dev->caps.sccc_hop_num;
1706 struct hns_roce_cfg_bt_attr *req;
1707 struct hns_roce_cmq_desc desc;
1708
1709 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_BT_ATTR, false);
1710 req = (struct hns_roce_cfg_bt_attr *)desc.data;
1711 memset(req, 0, sizeof(*req));
1712
1713 roce_set_field(req->vf_qpc_cfg, CFG_BT_ATTR_DATA_0_VF_QPC_BA_PGSZ_M,
1714 CFG_BT_ATTR_DATA_0_VF_QPC_BA_PGSZ_S,
1715 hr_dev->caps.qpc_ba_pg_sz + PG_SHIFT_OFFSET);
1716 roce_set_field(req->vf_qpc_cfg, CFG_BT_ATTR_DATA_0_VF_QPC_BUF_PGSZ_M,
1717 CFG_BT_ATTR_DATA_0_VF_QPC_BUF_PGSZ_S,
1718 hr_dev->caps.qpc_buf_pg_sz + PG_SHIFT_OFFSET);
1719 roce_set_field(req->vf_qpc_cfg, CFG_BT_ATTR_DATA_0_VF_QPC_HOPNUM_M,
1720 CFG_BT_ATTR_DATA_0_VF_QPC_HOPNUM_S,
1721 qpc_hop_num == HNS_ROCE_HOP_NUM_0 ? 0 : qpc_hop_num);
1722
1723 roce_set_field(req->vf_srqc_cfg, CFG_BT_ATTR_DATA_1_VF_SRQC_BA_PGSZ_M,
1724 CFG_BT_ATTR_DATA_1_VF_SRQC_BA_PGSZ_S,
1725 hr_dev->caps.srqc_ba_pg_sz + PG_SHIFT_OFFSET);
1726 roce_set_field(req->vf_srqc_cfg, CFG_BT_ATTR_DATA_1_VF_SRQC_BUF_PGSZ_M,
1727 CFG_BT_ATTR_DATA_1_VF_SRQC_BUF_PGSZ_S,
1728 hr_dev->caps.srqc_buf_pg_sz + PG_SHIFT_OFFSET);
1729 roce_set_field(req->vf_srqc_cfg, CFG_BT_ATTR_DATA_1_VF_SRQC_HOPNUM_M,
1730 CFG_BT_ATTR_DATA_1_VF_SRQC_HOPNUM_S,
1731 srqc_hop_num == HNS_ROCE_HOP_NUM_0 ? 0 : srqc_hop_num);
1732
1733 roce_set_field(req->vf_cqc_cfg, CFG_BT_ATTR_DATA_2_VF_CQC_BA_PGSZ_M,
1734 CFG_BT_ATTR_DATA_2_VF_CQC_BA_PGSZ_S,
1735 hr_dev->caps.cqc_ba_pg_sz + PG_SHIFT_OFFSET);
1736 roce_set_field(req->vf_cqc_cfg, CFG_BT_ATTR_DATA_2_VF_CQC_BUF_PGSZ_M,
1737 CFG_BT_ATTR_DATA_2_VF_CQC_BUF_PGSZ_S,
1738 hr_dev->caps.cqc_buf_pg_sz + PG_SHIFT_OFFSET);
1739 roce_set_field(req->vf_cqc_cfg, CFG_BT_ATTR_DATA_2_VF_CQC_HOPNUM_M,
1740 CFG_BT_ATTR_DATA_2_VF_CQC_HOPNUM_S,
1741 cqc_hop_num == HNS_ROCE_HOP_NUM_0 ? 0 : cqc_hop_num);
1742
1743 roce_set_field(req->vf_mpt_cfg, CFG_BT_ATTR_DATA_3_VF_MPT_BA_PGSZ_M,
1744 CFG_BT_ATTR_DATA_3_VF_MPT_BA_PGSZ_S,
1745 hr_dev->caps.mpt_ba_pg_sz + PG_SHIFT_OFFSET);
1746 roce_set_field(req->vf_mpt_cfg, CFG_BT_ATTR_DATA_3_VF_MPT_BUF_PGSZ_M,
1747 CFG_BT_ATTR_DATA_3_VF_MPT_BUF_PGSZ_S,
1748 hr_dev->caps.mpt_buf_pg_sz + PG_SHIFT_OFFSET);
1749 roce_set_field(req->vf_mpt_cfg, CFG_BT_ATTR_DATA_3_VF_MPT_HOPNUM_M,
1750 CFG_BT_ATTR_DATA_3_VF_MPT_HOPNUM_S,
1751 mpt_hop_num == HNS_ROCE_HOP_NUM_0 ? 0 : mpt_hop_num);
1752
1753 roce_set_field(req->vf_sccc_cfg,
1754 CFG_BT_ATTR_DATA_4_VF_SCCC_BA_PGSZ_M,
1755 CFG_BT_ATTR_DATA_4_VF_SCCC_BA_PGSZ_S,
1756 hr_dev->caps.sccc_ba_pg_sz + PG_SHIFT_OFFSET);
1757 roce_set_field(req->vf_sccc_cfg,
1758 CFG_BT_ATTR_DATA_4_VF_SCCC_BUF_PGSZ_M,
1759 CFG_BT_ATTR_DATA_4_VF_SCCC_BUF_PGSZ_S,
1760 hr_dev->caps.sccc_buf_pg_sz + PG_SHIFT_OFFSET);
1761 roce_set_field(req->vf_sccc_cfg,
1762 CFG_BT_ATTR_DATA_4_VF_SCCC_HOPNUM_M,
1763 CFG_BT_ATTR_DATA_4_VF_SCCC_HOPNUM_S,
1764 sccc_hop_num ==
1765 HNS_ROCE_HOP_NUM_0 ? 0 : sccc_hop_num);
1766
1767 return hns_roce_cmq_send(hr_dev, &desc, 1);
1768 }
1769
set_default_caps(struct hns_roce_dev * hr_dev)1770 static void set_default_caps(struct hns_roce_dev *hr_dev)
1771 {
1772 struct hns_roce_caps *caps = &hr_dev->caps;
1773
1774 caps->num_qps = HNS_ROCE_V2_MAX_QP_NUM;
1775 caps->max_wqes = HNS_ROCE_V2_MAX_WQE_NUM;
1776 caps->num_cqs = HNS_ROCE_V2_MAX_CQ_NUM;
1777 caps->num_srqs = HNS_ROCE_V2_MAX_SRQ_NUM;
1778 caps->min_cqes = HNS_ROCE_MIN_CQE_NUM;
1779 caps->max_cqes = HNS_ROCE_V2_MAX_CQE_NUM;
1780 caps->max_sq_sg = HNS_ROCE_V2_MAX_SQ_SGE_NUM;
1781 caps->max_extend_sg = HNS_ROCE_V2_MAX_EXTEND_SGE_NUM;
1782 caps->max_rq_sg = HNS_ROCE_V2_MAX_RQ_SGE_NUM;
1783 caps->max_sq_inline = HNS_ROCE_V2_MAX_SQ_INLINE;
1784 caps->num_uars = HNS_ROCE_V2_UAR_NUM;
1785 caps->phy_num_uars = HNS_ROCE_V2_PHY_UAR_NUM;
1786 caps->num_aeq_vectors = HNS_ROCE_V2_AEQE_VEC_NUM;
1787 caps->num_comp_vectors = HNS_ROCE_V2_COMP_VEC_NUM;
1788 caps->num_other_vectors = HNS_ROCE_V2_ABNORMAL_VEC_NUM;
1789 caps->num_mtpts = HNS_ROCE_V2_MAX_MTPT_NUM;
1790 caps->num_mtt_segs = HNS_ROCE_V2_MAX_MTT_SEGS;
1791 caps->num_cqe_segs = HNS_ROCE_V2_MAX_CQE_SEGS;
1792 caps->num_srqwqe_segs = HNS_ROCE_V2_MAX_SRQWQE_SEGS;
1793 caps->num_idx_segs = HNS_ROCE_V2_MAX_IDX_SEGS;
1794 caps->num_pds = HNS_ROCE_V2_MAX_PD_NUM;
1795 caps->max_qp_init_rdma = HNS_ROCE_V2_MAX_QP_INIT_RDMA;
1796 caps->max_qp_dest_rdma = HNS_ROCE_V2_MAX_QP_DEST_RDMA;
1797 caps->max_sq_desc_sz = HNS_ROCE_V2_MAX_SQ_DESC_SZ;
1798 caps->max_rq_desc_sz = HNS_ROCE_V2_MAX_RQ_DESC_SZ;
1799 caps->max_srq_desc_sz = HNS_ROCE_V2_MAX_SRQ_DESC_SZ;
1800 caps->qpc_sz = HNS_ROCE_V2_QPC_SZ;
1801 caps->irrl_entry_sz = HNS_ROCE_V2_IRRL_ENTRY_SZ;
1802 caps->trrl_entry_sz = HNS_ROCE_V2_EXT_ATOMIC_TRRL_ENTRY_SZ;
1803 caps->cqc_entry_sz = HNS_ROCE_V2_CQC_ENTRY_SZ;
1804 caps->srqc_entry_sz = HNS_ROCE_V2_SRQC_ENTRY_SZ;
1805 caps->mtpt_entry_sz = HNS_ROCE_V2_MTPT_ENTRY_SZ;
1806 caps->mtt_entry_sz = HNS_ROCE_V2_MTT_ENTRY_SZ;
1807 caps->idx_entry_sz = HNS_ROCE_V2_IDX_ENTRY_SZ;
1808 caps->cqe_sz = HNS_ROCE_V2_CQE_SIZE;
1809 caps->page_size_cap = HNS_ROCE_V2_PAGE_SIZE_SUPPORTED;
1810 caps->reserved_lkey = 0;
1811 caps->reserved_pds = 0;
1812 caps->reserved_mrws = 1;
1813 caps->reserved_uars = 0;
1814 caps->reserved_cqs = 0;
1815 caps->reserved_srqs = 0;
1816 caps->reserved_qps = HNS_ROCE_V2_RSV_QPS;
1817
1818 caps->qpc_ba_pg_sz = 0;
1819 caps->qpc_buf_pg_sz = 0;
1820 caps->qpc_hop_num = HNS_ROCE_CONTEXT_HOP_NUM;
1821 caps->srqc_ba_pg_sz = 0;
1822 caps->srqc_buf_pg_sz = 0;
1823 caps->srqc_hop_num = HNS_ROCE_CONTEXT_HOP_NUM;
1824 caps->cqc_ba_pg_sz = 0;
1825 caps->cqc_buf_pg_sz = 0;
1826 caps->cqc_hop_num = HNS_ROCE_CONTEXT_HOP_NUM;
1827 caps->mpt_ba_pg_sz = 0;
1828 caps->mpt_buf_pg_sz = 0;
1829 caps->mpt_hop_num = HNS_ROCE_CONTEXT_HOP_NUM;
1830 caps->mtt_ba_pg_sz = 0;
1831 caps->mtt_buf_pg_sz = 0;
1832 caps->mtt_hop_num = HNS_ROCE_MTT_HOP_NUM;
1833 caps->wqe_sq_hop_num = HNS_ROCE_SQWQE_HOP_NUM;
1834 caps->wqe_sge_hop_num = HNS_ROCE_EXT_SGE_HOP_NUM;
1835 caps->wqe_rq_hop_num = HNS_ROCE_RQWQE_HOP_NUM;
1836 caps->cqe_ba_pg_sz = HNS_ROCE_BA_PG_SZ_SUPPORTED_256K;
1837 caps->cqe_buf_pg_sz = 0;
1838 caps->cqe_hop_num = HNS_ROCE_CQE_HOP_NUM;
1839 caps->srqwqe_ba_pg_sz = 0;
1840 caps->srqwqe_buf_pg_sz = 0;
1841 caps->srqwqe_hop_num = HNS_ROCE_SRQWQE_HOP_NUM;
1842 caps->idx_ba_pg_sz = 0;
1843 caps->idx_buf_pg_sz = 0;
1844 caps->idx_hop_num = HNS_ROCE_IDX_HOP_NUM;
1845 caps->chunk_sz = HNS_ROCE_V2_TABLE_CHUNK_SIZE;
1846
1847 caps->flags = HNS_ROCE_CAP_FLAG_REREG_MR |
1848 HNS_ROCE_CAP_FLAG_ROCE_V1_V2 |
1849 HNS_ROCE_CAP_FLAG_RECORD_DB |
1850 HNS_ROCE_CAP_FLAG_SQ_RECORD_DB;
1851
1852 caps->pkey_table_len[0] = 1;
1853 caps->gid_table_len[0] = HNS_ROCE_V2_GID_INDEX_NUM;
1854 caps->ceqe_depth = HNS_ROCE_V2_COMP_EQE_NUM;
1855 caps->aeqe_depth = HNS_ROCE_V2_ASYNC_EQE_NUM;
1856 caps->aeqe_size = HNS_ROCE_AEQE_SIZE;
1857 caps->ceqe_size = HNS_ROCE_CEQE_SIZE;
1858 caps->local_ca_ack_delay = 0;
1859 caps->max_mtu = IB_MTU_4096;
1860
1861 caps->max_srq_wrs = HNS_ROCE_V2_MAX_SRQ_WR;
1862 caps->max_srq_sges = HNS_ROCE_V2_MAX_SRQ_SGE;
1863
1864 caps->flags |= HNS_ROCE_CAP_FLAG_ATOMIC | HNS_ROCE_CAP_FLAG_MW |
1865 HNS_ROCE_CAP_FLAG_SRQ | HNS_ROCE_CAP_FLAG_FRMR |
1866 HNS_ROCE_CAP_FLAG_QP_FLOW_CTRL;
1867
1868 caps->num_qpc_timer = HNS_ROCE_V2_MAX_QPC_TIMER_NUM;
1869 caps->qpc_timer_entry_sz = HNS_ROCE_V2_QPC_TIMER_ENTRY_SZ;
1870 caps->qpc_timer_ba_pg_sz = 0;
1871 caps->qpc_timer_buf_pg_sz = 0;
1872 caps->qpc_timer_hop_num = HNS_ROCE_HOP_NUM_0;
1873 caps->num_cqc_timer = HNS_ROCE_V2_MAX_CQC_TIMER_NUM;
1874 caps->cqc_timer_entry_sz = HNS_ROCE_V2_CQC_TIMER_ENTRY_SZ;
1875 caps->cqc_timer_ba_pg_sz = 0;
1876 caps->cqc_timer_buf_pg_sz = 0;
1877 caps->cqc_timer_hop_num = HNS_ROCE_HOP_NUM_0;
1878
1879 caps->sccc_sz = HNS_ROCE_V2_SCCC_SZ;
1880 caps->sccc_ba_pg_sz = 0;
1881 caps->sccc_buf_pg_sz = 0;
1882 caps->sccc_hop_num = HNS_ROCE_SCCC_HOP_NUM;
1883
1884 if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09) {
1885 caps->aeqe_size = HNS_ROCE_V3_EQE_SIZE;
1886 caps->ceqe_size = HNS_ROCE_V3_EQE_SIZE;
1887 caps->cqe_sz = HNS_ROCE_V3_CQE_SIZE;
1888 caps->qpc_sz = HNS_ROCE_V3_QPC_SZ;
1889 }
1890 }
1891
calc_pg_sz(int obj_num,int obj_size,int hop_num,int ctx_bt_num,int * buf_page_size,int * bt_page_size,u32 hem_type)1892 static void calc_pg_sz(int obj_num, int obj_size, int hop_num, int ctx_bt_num,
1893 int *buf_page_size, int *bt_page_size, u32 hem_type)
1894 {
1895 u64 obj_per_chunk;
1896 u64 bt_chunk_size = PAGE_SIZE;
1897 u64 buf_chunk_size = PAGE_SIZE;
1898 u64 obj_per_chunk_default = buf_chunk_size / obj_size;
1899
1900 *buf_page_size = 0;
1901 *bt_page_size = 0;
1902
1903 switch (hop_num) {
1904 case 3:
1905 obj_per_chunk = ctx_bt_num * (bt_chunk_size / BA_BYTE_LEN) *
1906 (bt_chunk_size / BA_BYTE_LEN) *
1907 (bt_chunk_size / BA_BYTE_LEN) *
1908 obj_per_chunk_default;
1909 break;
1910 case 2:
1911 obj_per_chunk = ctx_bt_num * (bt_chunk_size / BA_BYTE_LEN) *
1912 (bt_chunk_size / BA_BYTE_LEN) *
1913 obj_per_chunk_default;
1914 break;
1915 case 1:
1916 obj_per_chunk = ctx_bt_num * (bt_chunk_size / BA_BYTE_LEN) *
1917 obj_per_chunk_default;
1918 break;
1919 case HNS_ROCE_HOP_NUM_0:
1920 obj_per_chunk = ctx_bt_num * obj_per_chunk_default;
1921 break;
1922 default:
1923 pr_err("table %u not support hop_num = %u!\n", hem_type,
1924 hop_num);
1925 return;
1926 }
1927
1928 if (hem_type >= HEM_TYPE_MTT)
1929 *bt_page_size = ilog2(DIV_ROUND_UP(obj_num, obj_per_chunk));
1930 else
1931 *buf_page_size = ilog2(DIV_ROUND_UP(obj_num, obj_per_chunk));
1932 }
1933
hns_roce_query_pf_caps(struct hns_roce_dev * hr_dev)1934 static int hns_roce_query_pf_caps(struct hns_roce_dev *hr_dev)
1935 {
1936 struct hns_roce_cmq_desc desc[HNS_ROCE_QUERY_PF_CAPS_CMD_NUM];
1937 struct hns_roce_caps *caps = &hr_dev->caps;
1938 struct hns_roce_query_pf_caps_a *resp_a;
1939 struct hns_roce_query_pf_caps_b *resp_b;
1940 struct hns_roce_query_pf_caps_c *resp_c;
1941 struct hns_roce_query_pf_caps_d *resp_d;
1942 struct hns_roce_query_pf_caps_e *resp_e;
1943 int ctx_hop_num;
1944 int pbl_hop_num;
1945 int ret;
1946 int i;
1947
1948 for (i = 0; i < HNS_ROCE_QUERY_PF_CAPS_CMD_NUM; i++) {
1949 hns_roce_cmq_setup_basic_desc(&desc[i],
1950 HNS_ROCE_OPC_QUERY_PF_CAPS_NUM,
1951 true);
1952 if (i < (HNS_ROCE_QUERY_PF_CAPS_CMD_NUM - 1))
1953 desc[i].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
1954 else
1955 desc[i].flag &= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
1956 }
1957
1958 ret = hns_roce_cmq_send(hr_dev, desc, HNS_ROCE_QUERY_PF_CAPS_CMD_NUM);
1959 if (ret)
1960 return ret;
1961
1962 resp_a = (struct hns_roce_query_pf_caps_a *)desc[0].data;
1963 resp_b = (struct hns_roce_query_pf_caps_b *)desc[1].data;
1964 resp_c = (struct hns_roce_query_pf_caps_c *)desc[2].data;
1965 resp_d = (struct hns_roce_query_pf_caps_d *)desc[3].data;
1966 resp_e = (struct hns_roce_query_pf_caps_e *)desc[4].data;
1967
1968 caps->local_ca_ack_delay = resp_a->local_ca_ack_delay;
1969 caps->max_sq_sg = le16_to_cpu(resp_a->max_sq_sg);
1970 caps->max_sq_inline = le16_to_cpu(resp_a->max_sq_inline);
1971 caps->max_rq_sg = le16_to_cpu(resp_a->max_rq_sg);
1972 caps->max_extend_sg = le32_to_cpu(resp_a->max_extend_sg);
1973 caps->num_qpc_timer = le16_to_cpu(resp_a->num_qpc_timer);
1974 caps->num_cqc_timer = le16_to_cpu(resp_a->num_cqc_timer);
1975 caps->max_srq_sges = le16_to_cpu(resp_a->max_srq_sges);
1976 caps->num_aeq_vectors = resp_a->num_aeq_vectors;
1977 caps->num_other_vectors = resp_a->num_other_vectors;
1978 caps->max_sq_desc_sz = resp_a->max_sq_desc_sz;
1979 caps->max_rq_desc_sz = resp_a->max_rq_desc_sz;
1980 caps->max_srq_desc_sz = resp_a->max_srq_desc_sz;
1981 caps->cqe_sz = HNS_ROCE_V2_CQE_SIZE;
1982
1983 caps->mtpt_entry_sz = resp_b->mtpt_entry_sz;
1984 caps->irrl_entry_sz = resp_b->irrl_entry_sz;
1985 caps->trrl_entry_sz = resp_b->trrl_entry_sz;
1986 caps->cqc_entry_sz = resp_b->cqc_entry_sz;
1987 caps->srqc_entry_sz = resp_b->srqc_entry_sz;
1988 caps->idx_entry_sz = resp_b->idx_entry_sz;
1989 caps->sccc_sz = resp_b->sccc_sz;
1990 caps->max_mtu = resp_b->max_mtu;
1991 caps->qpc_sz = HNS_ROCE_V2_QPC_SZ;
1992 caps->min_cqes = resp_b->min_cqes;
1993 caps->min_wqes = resp_b->min_wqes;
1994 caps->page_size_cap = le32_to_cpu(resp_b->page_size_cap);
1995 caps->pkey_table_len[0] = resp_b->pkey_table_len;
1996 caps->phy_num_uars = resp_b->phy_num_uars;
1997 ctx_hop_num = resp_b->ctx_hop_num;
1998 pbl_hop_num = resp_b->pbl_hop_num;
1999
2000 caps->num_pds = 1 << roce_get_field(resp_c->cap_flags_num_pds,
2001 V2_QUERY_PF_CAPS_C_NUM_PDS_M,
2002 V2_QUERY_PF_CAPS_C_NUM_PDS_S);
2003 caps->flags = roce_get_field(resp_c->cap_flags_num_pds,
2004 V2_QUERY_PF_CAPS_C_CAP_FLAGS_M,
2005 V2_QUERY_PF_CAPS_C_CAP_FLAGS_S);
2006 caps->flags |= le16_to_cpu(resp_d->cap_flags_ex) <<
2007 HNS_ROCE_CAP_FLAGS_EX_SHIFT;
2008
2009 caps->num_cqs = 1 << roce_get_field(resp_c->max_gid_num_cqs,
2010 V2_QUERY_PF_CAPS_C_NUM_CQS_M,
2011 V2_QUERY_PF_CAPS_C_NUM_CQS_S);
2012 caps->gid_table_len[0] = roce_get_field(resp_c->max_gid_num_cqs,
2013 V2_QUERY_PF_CAPS_C_MAX_GID_M,
2014 V2_QUERY_PF_CAPS_C_MAX_GID_S);
2015 caps->max_cqes = 1 << roce_get_field(resp_c->cq_depth,
2016 V2_QUERY_PF_CAPS_C_CQ_DEPTH_M,
2017 V2_QUERY_PF_CAPS_C_CQ_DEPTH_S);
2018 caps->num_mtpts = 1 << roce_get_field(resp_c->num_mrws,
2019 V2_QUERY_PF_CAPS_C_NUM_MRWS_M,
2020 V2_QUERY_PF_CAPS_C_NUM_MRWS_S);
2021 caps->num_qps = 1 << roce_get_field(resp_c->ord_num_qps,
2022 V2_QUERY_PF_CAPS_C_NUM_QPS_M,
2023 V2_QUERY_PF_CAPS_C_NUM_QPS_S);
2024 caps->max_qp_init_rdma = roce_get_field(resp_c->ord_num_qps,
2025 V2_QUERY_PF_CAPS_C_MAX_ORD_M,
2026 V2_QUERY_PF_CAPS_C_MAX_ORD_S);
2027 caps->max_qp_dest_rdma = caps->max_qp_init_rdma;
2028 caps->max_wqes = 1 << le16_to_cpu(resp_c->sq_depth);
2029 caps->num_srqs = 1 << roce_get_field(resp_d->wq_hop_num_max_srqs,
2030 V2_QUERY_PF_CAPS_D_NUM_SRQS_M,
2031 V2_QUERY_PF_CAPS_D_NUM_SRQS_S);
2032 caps->max_srq_wrs = 1 << le16_to_cpu(resp_d->srq_depth);
2033 caps->ceqe_depth = 1 << roce_get_field(resp_d->num_ceqs_ceq_depth,
2034 V2_QUERY_PF_CAPS_D_CEQ_DEPTH_M,
2035 V2_QUERY_PF_CAPS_D_CEQ_DEPTH_S);
2036 caps->num_comp_vectors = roce_get_field(resp_d->num_ceqs_ceq_depth,
2037 V2_QUERY_PF_CAPS_D_NUM_CEQS_M,
2038 V2_QUERY_PF_CAPS_D_NUM_CEQS_S);
2039 caps->aeqe_depth = 1 << roce_get_field(resp_d->arm_st_aeq_depth,
2040 V2_QUERY_PF_CAPS_D_AEQ_DEPTH_M,
2041 V2_QUERY_PF_CAPS_D_AEQ_DEPTH_S);
2042 caps->default_aeq_arm_st = roce_get_field(resp_d->arm_st_aeq_depth,
2043 V2_QUERY_PF_CAPS_D_AEQ_ARM_ST_M,
2044 V2_QUERY_PF_CAPS_D_AEQ_ARM_ST_S);
2045 caps->default_ceq_arm_st = roce_get_field(resp_d->arm_st_aeq_depth,
2046 V2_QUERY_PF_CAPS_D_CEQ_ARM_ST_M,
2047 V2_QUERY_PF_CAPS_D_CEQ_ARM_ST_S);
2048 caps->reserved_pds = roce_get_field(resp_d->num_uars_rsv_pds,
2049 V2_QUERY_PF_CAPS_D_RSV_PDS_M,
2050 V2_QUERY_PF_CAPS_D_RSV_PDS_S);
2051 caps->num_uars = 1 << roce_get_field(resp_d->num_uars_rsv_pds,
2052 V2_QUERY_PF_CAPS_D_NUM_UARS_M,
2053 V2_QUERY_PF_CAPS_D_NUM_UARS_S);
2054 caps->reserved_qps = roce_get_field(resp_d->rsv_uars_rsv_qps,
2055 V2_QUERY_PF_CAPS_D_RSV_QPS_M,
2056 V2_QUERY_PF_CAPS_D_RSV_QPS_S);
2057 caps->reserved_uars = roce_get_field(resp_d->rsv_uars_rsv_qps,
2058 V2_QUERY_PF_CAPS_D_RSV_UARS_M,
2059 V2_QUERY_PF_CAPS_D_RSV_UARS_S);
2060 caps->reserved_mrws = roce_get_field(resp_e->chunk_size_shift_rsv_mrws,
2061 V2_QUERY_PF_CAPS_E_RSV_MRWS_M,
2062 V2_QUERY_PF_CAPS_E_RSV_MRWS_S);
2063 caps->chunk_sz = 1 << roce_get_field(resp_e->chunk_size_shift_rsv_mrws,
2064 V2_QUERY_PF_CAPS_E_CHUNK_SIZE_SHIFT_M,
2065 V2_QUERY_PF_CAPS_E_CHUNK_SIZE_SHIFT_S);
2066 caps->reserved_cqs = roce_get_field(resp_e->rsv_cqs,
2067 V2_QUERY_PF_CAPS_E_RSV_CQS_M,
2068 V2_QUERY_PF_CAPS_E_RSV_CQS_S);
2069 caps->reserved_srqs = roce_get_field(resp_e->rsv_srqs,
2070 V2_QUERY_PF_CAPS_E_RSV_SRQS_M,
2071 V2_QUERY_PF_CAPS_E_RSV_SRQS_S);
2072 caps->reserved_lkey = roce_get_field(resp_e->rsv_lkey,
2073 V2_QUERY_PF_CAPS_E_RSV_LKEYS_M,
2074 V2_QUERY_PF_CAPS_E_RSV_LKEYS_S);
2075 caps->default_ceq_max_cnt = le16_to_cpu(resp_e->ceq_max_cnt);
2076 caps->default_ceq_period = le16_to_cpu(resp_e->ceq_period);
2077 caps->default_aeq_max_cnt = le16_to_cpu(resp_e->aeq_max_cnt);
2078 caps->default_aeq_period = le16_to_cpu(resp_e->aeq_period);
2079
2080 caps->qpc_timer_entry_sz = HNS_ROCE_V2_QPC_TIMER_ENTRY_SZ;
2081 caps->cqc_timer_entry_sz = HNS_ROCE_V2_CQC_TIMER_ENTRY_SZ;
2082 caps->mtt_entry_sz = HNS_ROCE_V2_MTT_ENTRY_SZ;
2083 caps->num_mtt_segs = HNS_ROCE_V2_MAX_MTT_SEGS;
2084 caps->ceqe_size = HNS_ROCE_CEQE_SIZE;
2085 caps->aeqe_size = HNS_ROCE_AEQE_SIZE;
2086 caps->mtt_ba_pg_sz = 0;
2087 caps->num_cqe_segs = HNS_ROCE_V2_MAX_CQE_SEGS;
2088 caps->num_srqwqe_segs = HNS_ROCE_V2_MAX_SRQWQE_SEGS;
2089 caps->num_idx_segs = HNS_ROCE_V2_MAX_IDX_SEGS;
2090
2091 caps->qpc_hop_num = ctx_hop_num;
2092 caps->srqc_hop_num = ctx_hop_num;
2093 caps->cqc_hop_num = ctx_hop_num;
2094 caps->mpt_hop_num = ctx_hop_num;
2095 caps->mtt_hop_num = pbl_hop_num;
2096 caps->cqe_hop_num = pbl_hop_num;
2097 caps->srqwqe_hop_num = pbl_hop_num;
2098 caps->idx_hop_num = pbl_hop_num;
2099 caps->wqe_sq_hop_num = roce_get_field(resp_d->wq_hop_num_max_srqs,
2100 V2_QUERY_PF_CAPS_D_SQWQE_HOP_NUM_M,
2101 V2_QUERY_PF_CAPS_D_SQWQE_HOP_NUM_S);
2102 caps->wqe_sge_hop_num = roce_get_field(resp_d->wq_hop_num_max_srqs,
2103 V2_QUERY_PF_CAPS_D_EX_SGE_HOP_NUM_M,
2104 V2_QUERY_PF_CAPS_D_EX_SGE_HOP_NUM_S);
2105 caps->wqe_rq_hop_num = roce_get_field(resp_d->wq_hop_num_max_srqs,
2106 V2_QUERY_PF_CAPS_D_RQWQE_HOP_NUM_M,
2107 V2_QUERY_PF_CAPS_D_RQWQE_HOP_NUM_S);
2108
2109 if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09) {
2110 caps->ceqe_size = HNS_ROCE_V3_EQE_SIZE;
2111 caps->aeqe_size = HNS_ROCE_V3_EQE_SIZE;
2112 caps->cqe_sz = HNS_ROCE_V3_CQE_SIZE;
2113 caps->qpc_sz = HNS_ROCE_V3_QPC_SZ;
2114 caps->sccc_sz = HNS_ROCE_V3_SCCC_SZ;
2115 }
2116
2117 calc_pg_sz(caps->num_qps, caps->qpc_sz, caps->qpc_hop_num,
2118 caps->qpc_bt_num, &caps->qpc_buf_pg_sz, &caps->qpc_ba_pg_sz,
2119 HEM_TYPE_QPC);
2120 calc_pg_sz(caps->num_mtpts, caps->mtpt_entry_sz, caps->mpt_hop_num,
2121 caps->mpt_bt_num, &caps->mpt_buf_pg_sz, &caps->mpt_ba_pg_sz,
2122 HEM_TYPE_MTPT);
2123 calc_pg_sz(caps->num_cqs, caps->cqc_entry_sz, caps->cqc_hop_num,
2124 caps->cqc_bt_num, &caps->cqc_buf_pg_sz, &caps->cqc_ba_pg_sz,
2125 HEM_TYPE_CQC);
2126 calc_pg_sz(caps->num_srqs, caps->srqc_entry_sz, caps->srqc_hop_num,
2127 caps->srqc_bt_num, &caps->srqc_buf_pg_sz,
2128 &caps->srqc_ba_pg_sz, HEM_TYPE_SRQC);
2129
2130 caps->sccc_hop_num = ctx_hop_num;
2131 caps->qpc_timer_hop_num = HNS_ROCE_HOP_NUM_0;
2132 caps->cqc_timer_hop_num = HNS_ROCE_HOP_NUM_0;
2133
2134 calc_pg_sz(caps->num_qps, caps->sccc_sz,
2135 caps->sccc_hop_num, caps->sccc_bt_num,
2136 &caps->sccc_buf_pg_sz, &caps->sccc_ba_pg_sz,
2137 HEM_TYPE_SCCC);
2138 calc_pg_sz(caps->num_cqc_timer, caps->cqc_timer_entry_sz,
2139 caps->cqc_timer_hop_num, caps->cqc_timer_bt_num,
2140 &caps->cqc_timer_buf_pg_sz,
2141 &caps->cqc_timer_ba_pg_sz, HEM_TYPE_CQC_TIMER);
2142
2143 calc_pg_sz(caps->num_cqe_segs, caps->mtt_entry_sz, caps->cqe_hop_num,
2144 1, &caps->cqe_buf_pg_sz, &caps->cqe_ba_pg_sz, HEM_TYPE_CQE);
2145 calc_pg_sz(caps->num_srqwqe_segs, caps->mtt_entry_sz,
2146 caps->srqwqe_hop_num, 1, &caps->srqwqe_buf_pg_sz,
2147 &caps->srqwqe_ba_pg_sz, HEM_TYPE_SRQWQE);
2148 calc_pg_sz(caps->num_idx_segs, caps->idx_entry_sz, caps->idx_hop_num,
2149 1, &caps->idx_buf_pg_sz, &caps->idx_ba_pg_sz, HEM_TYPE_IDX);
2150
2151 return 0;
2152 }
2153
hns_roce_config_qpc_size(struct hns_roce_dev * hr_dev)2154 static int hns_roce_config_qpc_size(struct hns_roce_dev *hr_dev)
2155 {
2156 struct hns_roce_cmq_desc desc;
2157 struct hns_roce_cfg_entry_size *cfg_size =
2158 (struct hns_roce_cfg_entry_size *)desc.data;
2159
2160 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_ENTRY_SIZE,
2161 false);
2162
2163 cfg_size->type = cpu_to_le32(HNS_ROCE_CFG_QPC_SIZE);
2164 cfg_size->size = cpu_to_le32(hr_dev->caps.qpc_sz);
2165
2166 return hns_roce_cmq_send(hr_dev, &desc, 1);
2167 }
2168
hns_roce_config_sccc_size(struct hns_roce_dev * hr_dev)2169 static int hns_roce_config_sccc_size(struct hns_roce_dev *hr_dev)
2170 {
2171 struct hns_roce_cmq_desc desc;
2172 struct hns_roce_cfg_entry_size *cfg_size =
2173 (struct hns_roce_cfg_entry_size *)desc.data;
2174
2175 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_ENTRY_SIZE,
2176 false);
2177
2178 cfg_size->type = cpu_to_le32(HNS_ROCE_CFG_SCCC_SIZE);
2179 cfg_size->size = cpu_to_le32(hr_dev->caps.sccc_sz);
2180
2181 return hns_roce_cmq_send(hr_dev, &desc, 1);
2182 }
2183
hns_roce_config_entry_size(struct hns_roce_dev * hr_dev)2184 static int hns_roce_config_entry_size(struct hns_roce_dev *hr_dev)
2185 {
2186 int ret;
2187
2188 if (hr_dev->pci_dev->revision < PCI_REVISION_ID_HIP09)
2189 return 0;
2190
2191 ret = hns_roce_config_qpc_size(hr_dev);
2192 if (ret) {
2193 dev_err(hr_dev->dev, "failed to cfg qpc sz, ret = %d.\n", ret);
2194 return ret;
2195 }
2196
2197 ret = hns_roce_config_sccc_size(hr_dev);
2198 if (ret)
2199 dev_err(hr_dev->dev, "failed to cfg sccc sz, ret = %d.\n", ret);
2200
2201 return ret;
2202 }
2203
hns_roce_v2_profile(struct hns_roce_dev * hr_dev)2204 static int hns_roce_v2_profile(struct hns_roce_dev *hr_dev)
2205 {
2206 struct hns_roce_caps *caps = &hr_dev->caps;
2207 int ret;
2208
2209 ret = hns_roce_cmq_query_hw_info(hr_dev);
2210 if (ret) {
2211 dev_err(hr_dev->dev, "Query hardware version fail, ret = %d.\n",
2212 ret);
2213 return ret;
2214 }
2215
2216 ret = hns_roce_query_fw_ver(hr_dev);
2217 if (ret) {
2218 dev_err(hr_dev->dev, "Query firmware version fail, ret = %d.\n",
2219 ret);
2220 return ret;
2221 }
2222
2223 ret = hns_roce_config_global_param(hr_dev);
2224 if (ret) {
2225 dev_err(hr_dev->dev, "Configure global param fail, ret = %d.\n",
2226 ret);
2227 return ret;
2228 }
2229
2230 /* Get pf resource owned by every pf */
2231 ret = hns_roce_query_pf_resource(hr_dev);
2232 if (ret) {
2233 dev_err(hr_dev->dev, "Query pf resource fail, ret = %d.\n",
2234 ret);
2235 return ret;
2236 }
2237
2238 ret = hns_roce_query_pf_timer_resource(hr_dev);
2239 if (ret) {
2240 dev_err(hr_dev->dev,
2241 "failed to query pf timer resource, ret = %d.\n", ret);
2242 return ret;
2243 }
2244
2245 ret = hns_roce_set_vf_switch_param(hr_dev, 0);
2246 if (ret) {
2247 dev_err(hr_dev->dev,
2248 "failed to set function switch param, ret = %d.\n",
2249 ret);
2250 return ret;
2251 }
2252
2253 hr_dev->vendor_part_id = hr_dev->pci_dev->device;
2254 hr_dev->sys_image_guid = be64_to_cpu(hr_dev->ib_dev.node_guid);
2255
2256 caps->pbl_ba_pg_sz = HNS_ROCE_BA_PG_SZ_SUPPORTED_16K;
2257 caps->pbl_buf_pg_sz = 0;
2258 caps->pbl_hop_num = HNS_ROCE_PBL_HOP_NUM;
2259 caps->eqe_ba_pg_sz = 0;
2260 caps->eqe_buf_pg_sz = 0;
2261 caps->eqe_hop_num = HNS_ROCE_EQE_HOP_NUM;
2262 caps->tsq_buf_pg_sz = 0;
2263
2264 ret = hns_roce_query_pf_caps(hr_dev);
2265 if (ret)
2266 set_default_caps(hr_dev);
2267
2268 ret = hns_roce_alloc_vf_resource(hr_dev);
2269 if (ret) {
2270 dev_err(hr_dev->dev, "Allocate vf resource fail, ret = %d.\n",
2271 ret);
2272 return ret;
2273 }
2274
2275 ret = hns_roce_v2_set_bt(hr_dev);
2276 if (ret) {
2277 dev_err(hr_dev->dev,
2278 "Configure bt attribute fail, ret = %d.\n", ret);
2279 return ret;
2280 }
2281
2282 /* Configure the size of QPC, SCCC, etc. */
2283 ret = hns_roce_config_entry_size(hr_dev);
2284
2285 return ret;
2286 }
2287
hns_roce_config_link_table(struct hns_roce_dev * hr_dev,enum hns_roce_link_table_type type)2288 static int hns_roce_config_link_table(struct hns_roce_dev *hr_dev,
2289 enum hns_roce_link_table_type type)
2290 {
2291 struct hns_roce_cmq_desc desc[2];
2292 struct hns_roce_cfg_llm_a *req_a =
2293 (struct hns_roce_cfg_llm_a *)desc[0].data;
2294 struct hns_roce_cfg_llm_b *req_b =
2295 (struct hns_roce_cfg_llm_b *)desc[1].data;
2296 struct hns_roce_v2_priv *priv = hr_dev->priv;
2297 struct hns_roce_link_table *link_tbl;
2298 struct hns_roce_link_table_entry *entry;
2299 enum hns_roce_opcode_type opcode;
2300 u32 page_num;
2301 int i;
2302
2303 switch (type) {
2304 case TSQ_LINK_TABLE:
2305 link_tbl = &priv->tsq;
2306 opcode = HNS_ROCE_OPC_CFG_EXT_LLM;
2307 break;
2308 case TPQ_LINK_TABLE:
2309 link_tbl = &priv->tpq;
2310 opcode = HNS_ROCE_OPC_CFG_TMOUT_LLM;
2311 break;
2312 default:
2313 return -EINVAL;
2314 }
2315
2316 page_num = link_tbl->npages;
2317 entry = link_tbl->table.buf;
2318
2319 for (i = 0; i < 2; i++) {
2320 hns_roce_cmq_setup_basic_desc(&desc[i], opcode, false);
2321
2322 if (i == 0)
2323 desc[i].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
2324 else
2325 desc[i].flag &= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
2326 }
2327
2328 req_a->base_addr_l = cpu_to_le32(link_tbl->table.map & 0xffffffff);
2329 req_a->base_addr_h = cpu_to_le32(link_tbl->table.map >> 32);
2330 roce_set_field(req_a->depth_pgsz_init_en, CFG_LLM_QUE_DEPTH_M,
2331 CFG_LLM_QUE_DEPTH_S, link_tbl->npages);
2332 roce_set_field(req_a->depth_pgsz_init_en, CFG_LLM_QUE_PGSZ_M,
2333 CFG_LLM_QUE_PGSZ_S, link_tbl->pg_sz);
2334 roce_set_field(req_a->depth_pgsz_init_en, CFG_LLM_INIT_EN_M,
2335 CFG_LLM_INIT_EN_S, 1);
2336 req_a->head_ba_l = cpu_to_le32(entry[0].blk_ba0);
2337 req_a->head_ba_h_nxtptr = cpu_to_le32(entry[0].blk_ba1_nxt_ptr);
2338 roce_set_field(req_a->head_ptr, CFG_LLM_HEAD_PTR_M, CFG_LLM_HEAD_PTR_S,
2339 0);
2340
2341 req_b->tail_ba_l = cpu_to_le32(entry[page_num - 1].blk_ba0);
2342 roce_set_field(req_b->tail_ba_h, CFG_LLM_TAIL_BA_H_M,
2343 CFG_LLM_TAIL_BA_H_S,
2344 entry[page_num - 1].blk_ba1_nxt_ptr &
2345 HNS_ROCE_LINK_TABLE_BA1_M);
2346 roce_set_field(req_b->tail_ptr, CFG_LLM_TAIL_PTR_M, CFG_LLM_TAIL_PTR_S,
2347 (entry[page_num - 2].blk_ba1_nxt_ptr &
2348 HNS_ROCE_LINK_TABLE_NXT_PTR_M) >>
2349 HNS_ROCE_LINK_TABLE_NXT_PTR_S);
2350
2351 return hns_roce_cmq_send(hr_dev, desc, 2);
2352 }
2353
hns_roce_init_link_table(struct hns_roce_dev * hr_dev,enum hns_roce_link_table_type type)2354 static int hns_roce_init_link_table(struct hns_roce_dev *hr_dev,
2355 enum hns_roce_link_table_type type)
2356 {
2357 struct hns_roce_v2_priv *priv = hr_dev->priv;
2358 struct hns_roce_link_table *link_tbl;
2359 struct hns_roce_link_table_entry *entry;
2360 struct device *dev = hr_dev->dev;
2361 u32 buf_chk_sz;
2362 dma_addr_t t;
2363 int func_num = 1;
2364 int pg_num_a;
2365 int pg_num_b;
2366 int pg_num;
2367 int size;
2368 int i;
2369
2370 switch (type) {
2371 case TSQ_LINK_TABLE:
2372 link_tbl = &priv->tsq;
2373 buf_chk_sz = 1 << (hr_dev->caps.tsq_buf_pg_sz + PAGE_SHIFT);
2374 pg_num_a = hr_dev->caps.num_qps * 8 / buf_chk_sz;
2375 pg_num_b = hr_dev->caps.sl_num * 4 + 2;
2376 break;
2377 case TPQ_LINK_TABLE:
2378 link_tbl = &priv->tpq;
2379 buf_chk_sz = 1 << (hr_dev->caps.tpq_buf_pg_sz + PAGE_SHIFT);
2380 pg_num_a = hr_dev->caps.num_cqs * 4 / buf_chk_sz;
2381 pg_num_b = 2 * 4 * func_num + 2;
2382 break;
2383 default:
2384 return -EINVAL;
2385 }
2386
2387 pg_num = max(pg_num_a, pg_num_b);
2388 size = pg_num * sizeof(struct hns_roce_link_table_entry);
2389
2390 link_tbl->table.buf = dma_alloc_coherent(dev, size,
2391 &link_tbl->table.map,
2392 GFP_KERNEL);
2393 if (!link_tbl->table.buf)
2394 goto out;
2395
2396 link_tbl->pg_list = kcalloc(pg_num, sizeof(*link_tbl->pg_list),
2397 GFP_KERNEL);
2398 if (!link_tbl->pg_list)
2399 goto err_kcalloc_failed;
2400
2401 entry = link_tbl->table.buf;
2402 for (i = 0; i < pg_num; ++i) {
2403 link_tbl->pg_list[i].buf = dma_alloc_coherent(dev, buf_chk_sz,
2404 &t, GFP_KERNEL);
2405 if (!link_tbl->pg_list[i].buf)
2406 goto err_alloc_buf_failed;
2407
2408 link_tbl->pg_list[i].map = t;
2409
2410 entry[i].blk_ba0 = (u32)(t >> 12);
2411 entry[i].blk_ba1_nxt_ptr = (u32)(t >> 44);
2412
2413 if (i < (pg_num - 1))
2414 entry[i].blk_ba1_nxt_ptr |=
2415 (i + 1) << HNS_ROCE_LINK_TABLE_NXT_PTR_S;
2416
2417 }
2418 link_tbl->npages = pg_num;
2419 link_tbl->pg_sz = buf_chk_sz;
2420
2421 return hns_roce_config_link_table(hr_dev, type);
2422
2423 err_alloc_buf_failed:
2424 for (i -= 1; i >= 0; i--)
2425 dma_free_coherent(dev, buf_chk_sz,
2426 link_tbl->pg_list[i].buf,
2427 link_tbl->pg_list[i].map);
2428 kfree(link_tbl->pg_list);
2429
2430 err_kcalloc_failed:
2431 dma_free_coherent(dev, size, link_tbl->table.buf,
2432 link_tbl->table.map);
2433
2434 out:
2435 return -ENOMEM;
2436 }
2437
hns_roce_free_link_table(struct hns_roce_dev * hr_dev,struct hns_roce_link_table * link_tbl)2438 static void hns_roce_free_link_table(struct hns_roce_dev *hr_dev,
2439 struct hns_roce_link_table *link_tbl)
2440 {
2441 struct device *dev = hr_dev->dev;
2442 int size;
2443 int i;
2444
2445 size = link_tbl->npages * sizeof(struct hns_roce_link_table_entry);
2446
2447 for (i = 0; i < link_tbl->npages; ++i)
2448 if (link_tbl->pg_list[i].buf)
2449 dma_free_coherent(dev, link_tbl->pg_sz,
2450 link_tbl->pg_list[i].buf,
2451 link_tbl->pg_list[i].map);
2452 kfree(link_tbl->pg_list);
2453
2454 dma_free_coherent(dev, size, link_tbl->table.buf,
2455 link_tbl->table.map);
2456 }
2457
hns_roce_v2_init(struct hns_roce_dev * hr_dev)2458 static int hns_roce_v2_init(struct hns_roce_dev *hr_dev)
2459 {
2460 struct hns_roce_v2_priv *priv = hr_dev->priv;
2461 int qpc_count, cqc_count;
2462 int ret, i;
2463
2464 /* TSQ includes SQ doorbell and ack doorbell */
2465 ret = hns_roce_init_link_table(hr_dev, TSQ_LINK_TABLE);
2466 if (ret) {
2467 dev_err(hr_dev->dev, "TSQ init failed, ret = %d.\n", ret);
2468 return ret;
2469 }
2470
2471 ret = hns_roce_init_link_table(hr_dev, TPQ_LINK_TABLE);
2472 if (ret) {
2473 dev_err(hr_dev->dev, "TPQ init failed, ret = %d.\n", ret);
2474 goto err_tpq_init_failed;
2475 }
2476
2477 /* Alloc memory for QPC Timer buffer space chunk */
2478 for (qpc_count = 0; qpc_count < hr_dev->caps.qpc_timer_bt_num;
2479 qpc_count++) {
2480 ret = hns_roce_table_get(hr_dev, &hr_dev->qpc_timer_table,
2481 qpc_count);
2482 if (ret) {
2483 dev_err(hr_dev->dev, "QPC Timer get failed\n");
2484 goto err_qpc_timer_failed;
2485 }
2486 }
2487
2488 /* Alloc memory for CQC Timer buffer space chunk */
2489 for (cqc_count = 0; cqc_count < hr_dev->caps.cqc_timer_bt_num;
2490 cqc_count++) {
2491 ret = hns_roce_table_get(hr_dev, &hr_dev->cqc_timer_table,
2492 cqc_count);
2493 if (ret) {
2494 dev_err(hr_dev->dev, "CQC Timer get failed\n");
2495 goto err_cqc_timer_failed;
2496 }
2497 }
2498
2499 return 0;
2500
2501 err_cqc_timer_failed:
2502 for (i = 0; i < cqc_count; i++)
2503 hns_roce_table_put(hr_dev, &hr_dev->cqc_timer_table, i);
2504
2505 err_qpc_timer_failed:
2506 for (i = 0; i < qpc_count; i++)
2507 hns_roce_table_put(hr_dev, &hr_dev->qpc_timer_table, i);
2508
2509 hns_roce_free_link_table(hr_dev, &priv->tpq);
2510
2511 err_tpq_init_failed:
2512 hns_roce_free_link_table(hr_dev, &priv->tsq);
2513
2514 return ret;
2515 }
2516
hns_roce_v2_exit(struct hns_roce_dev * hr_dev)2517 static void hns_roce_v2_exit(struct hns_roce_dev *hr_dev)
2518 {
2519 struct hns_roce_v2_priv *priv = hr_dev->priv;
2520
2521 hns_roce_function_clear(hr_dev);
2522
2523 hns_roce_free_link_table(hr_dev, &priv->tpq);
2524 hns_roce_free_link_table(hr_dev, &priv->tsq);
2525 }
2526
hns_roce_query_mbox_status(struct hns_roce_dev * hr_dev)2527 static int hns_roce_query_mbox_status(struct hns_roce_dev *hr_dev)
2528 {
2529 struct hns_roce_cmq_desc desc;
2530 struct hns_roce_mbox_status *mb_st =
2531 (struct hns_roce_mbox_status *)desc.data;
2532 enum hns_roce_cmd_return_status status;
2533
2534 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_QUERY_MB_ST, true);
2535
2536 status = hns_roce_cmq_send(hr_dev, &desc, 1);
2537 if (status)
2538 return status;
2539
2540 return le32_to_cpu(mb_st->mb_status_hw_run);
2541 }
2542
hns_roce_v2_cmd_pending(struct hns_roce_dev * hr_dev)2543 static int hns_roce_v2_cmd_pending(struct hns_roce_dev *hr_dev)
2544 {
2545 u32 status = hns_roce_query_mbox_status(hr_dev);
2546
2547 return status >> HNS_ROCE_HW_RUN_BIT_SHIFT;
2548 }
2549
hns_roce_v2_cmd_complete(struct hns_roce_dev * hr_dev)2550 static int hns_roce_v2_cmd_complete(struct hns_roce_dev *hr_dev)
2551 {
2552 u32 status = hns_roce_query_mbox_status(hr_dev);
2553
2554 return status & HNS_ROCE_HW_MB_STATUS_MASK;
2555 }
2556
hns_roce_mbox_post(struct hns_roce_dev * hr_dev,u64 in_param,u64 out_param,u32 in_modifier,u8 op_modifier,u16 op,u16 token,int event)2557 static int hns_roce_mbox_post(struct hns_roce_dev *hr_dev, u64 in_param,
2558 u64 out_param, u32 in_modifier, u8 op_modifier,
2559 u16 op, u16 token, int event)
2560 {
2561 struct hns_roce_cmq_desc desc;
2562 struct hns_roce_post_mbox *mb = (struct hns_roce_post_mbox *)desc.data;
2563
2564 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_POST_MB, false);
2565
2566 mb->in_param_l = cpu_to_le32(in_param);
2567 mb->in_param_h = cpu_to_le32(in_param >> 32);
2568 mb->out_param_l = cpu_to_le32(out_param);
2569 mb->out_param_h = cpu_to_le32(out_param >> 32);
2570 mb->cmd_tag = cpu_to_le32(in_modifier << 8 | op);
2571 mb->token_event_en = cpu_to_le32(event << 16 | token);
2572
2573 return hns_roce_cmq_send(hr_dev, &desc, 1);
2574 }
2575
hns_roce_v2_post_mbox(struct hns_roce_dev * hr_dev,u64 in_param,u64 out_param,u32 in_modifier,u8 op_modifier,u16 op,u16 token,int event)2576 static int hns_roce_v2_post_mbox(struct hns_roce_dev *hr_dev, u64 in_param,
2577 u64 out_param, u32 in_modifier, u8 op_modifier,
2578 u16 op, u16 token, int event)
2579 {
2580 struct device *dev = hr_dev->dev;
2581 unsigned long end;
2582 int ret;
2583
2584 end = msecs_to_jiffies(HNS_ROCE_V2_GO_BIT_TIMEOUT_MSECS) + jiffies;
2585 while (hns_roce_v2_cmd_pending(hr_dev)) {
2586 if (time_after(jiffies, end)) {
2587 dev_dbg(dev, "jiffies=%d end=%d\n", (int)jiffies,
2588 (int)end);
2589 return -EAGAIN;
2590 }
2591 cond_resched();
2592 }
2593
2594 ret = hns_roce_mbox_post(hr_dev, in_param, out_param, in_modifier,
2595 op_modifier, op, token, event);
2596 if (ret)
2597 dev_err(dev, "Post mailbox fail(%d)\n", ret);
2598
2599 return ret;
2600 }
2601
hns_roce_v2_chk_mbox(struct hns_roce_dev * hr_dev,unsigned long timeout)2602 static int hns_roce_v2_chk_mbox(struct hns_roce_dev *hr_dev,
2603 unsigned long timeout)
2604 {
2605 struct device *dev = hr_dev->dev;
2606 unsigned long end;
2607 u32 status;
2608
2609 end = msecs_to_jiffies(timeout) + jiffies;
2610 while (hns_roce_v2_cmd_pending(hr_dev) && time_before(jiffies, end))
2611 cond_resched();
2612
2613 if (hns_roce_v2_cmd_pending(hr_dev)) {
2614 dev_err(dev, "[cmd_poll]hw run cmd TIMEDOUT!\n");
2615 return -ETIMEDOUT;
2616 }
2617
2618 status = hns_roce_v2_cmd_complete(hr_dev);
2619 if (status != 0x1) {
2620 if (status == CMD_RST_PRC_EBUSY)
2621 return status;
2622
2623 dev_err(dev, "mailbox status 0x%x!\n", status);
2624 return -EBUSY;
2625 }
2626
2627 return 0;
2628 }
2629
hns_roce_config_sgid_table(struct hns_roce_dev * hr_dev,int gid_index,const union ib_gid * gid,enum hns_roce_sgid_type sgid_type)2630 static int hns_roce_config_sgid_table(struct hns_roce_dev *hr_dev,
2631 int gid_index, const union ib_gid *gid,
2632 enum hns_roce_sgid_type sgid_type)
2633 {
2634 struct hns_roce_cmq_desc desc;
2635 struct hns_roce_cfg_sgid_tb *sgid_tb =
2636 (struct hns_roce_cfg_sgid_tb *)desc.data;
2637 u32 *p;
2638
2639 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_SGID_TB, false);
2640
2641 roce_set_field(sgid_tb->table_idx_rsv, CFG_SGID_TB_TABLE_IDX_M,
2642 CFG_SGID_TB_TABLE_IDX_S, gid_index);
2643 roce_set_field(sgid_tb->vf_sgid_type_rsv, CFG_SGID_TB_VF_SGID_TYPE_M,
2644 CFG_SGID_TB_VF_SGID_TYPE_S, sgid_type);
2645
2646 p = (u32 *)&gid->raw[0];
2647 sgid_tb->vf_sgid_l = cpu_to_le32(*p);
2648
2649 p = (u32 *)&gid->raw[4];
2650 sgid_tb->vf_sgid_ml = cpu_to_le32(*p);
2651
2652 p = (u32 *)&gid->raw[8];
2653 sgid_tb->vf_sgid_mh = cpu_to_le32(*p);
2654
2655 p = (u32 *)&gid->raw[0xc];
2656 sgid_tb->vf_sgid_h = cpu_to_le32(*p);
2657
2658 return hns_roce_cmq_send(hr_dev, &desc, 1);
2659 }
2660
hns_roce_v2_set_gid(struct hns_roce_dev * hr_dev,u8 port,int gid_index,const union ib_gid * gid,const struct ib_gid_attr * attr)2661 static int hns_roce_v2_set_gid(struct hns_roce_dev *hr_dev, u8 port,
2662 int gid_index, const union ib_gid *gid,
2663 const struct ib_gid_attr *attr)
2664 {
2665 enum hns_roce_sgid_type sgid_type = GID_TYPE_FLAG_ROCE_V1;
2666 int ret;
2667
2668 if (!gid || !attr)
2669 return -EINVAL;
2670
2671 if (attr->gid_type == IB_GID_TYPE_ROCE)
2672 sgid_type = GID_TYPE_FLAG_ROCE_V1;
2673
2674 if (attr->gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) {
2675 if (ipv6_addr_v4mapped((void *)gid))
2676 sgid_type = GID_TYPE_FLAG_ROCE_V2_IPV4;
2677 else
2678 sgid_type = GID_TYPE_FLAG_ROCE_V2_IPV6;
2679 }
2680
2681 ret = hns_roce_config_sgid_table(hr_dev, gid_index, gid, sgid_type);
2682 if (ret)
2683 ibdev_err(&hr_dev->ib_dev,
2684 "failed to configure sgid table, ret = %d!\n",
2685 ret);
2686
2687 return ret;
2688 }
2689
hns_roce_v2_set_mac(struct hns_roce_dev * hr_dev,u8 phy_port,u8 * addr)2690 static int hns_roce_v2_set_mac(struct hns_roce_dev *hr_dev, u8 phy_port,
2691 u8 *addr)
2692 {
2693 struct hns_roce_cmq_desc desc;
2694 struct hns_roce_cfg_smac_tb *smac_tb =
2695 (struct hns_roce_cfg_smac_tb *)desc.data;
2696 u16 reg_smac_h;
2697 u32 reg_smac_l;
2698
2699 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_SMAC_TB, false);
2700
2701 reg_smac_l = *(u32 *)(&addr[0]);
2702 reg_smac_h = *(u16 *)(&addr[4]);
2703
2704 roce_set_field(smac_tb->tb_idx_rsv, CFG_SMAC_TB_IDX_M,
2705 CFG_SMAC_TB_IDX_S, phy_port);
2706 roce_set_field(smac_tb->vf_smac_h_rsv, CFG_SMAC_TB_VF_SMAC_H_M,
2707 CFG_SMAC_TB_VF_SMAC_H_S, reg_smac_h);
2708 smac_tb->vf_smac_l = cpu_to_le32(reg_smac_l);
2709
2710 return hns_roce_cmq_send(hr_dev, &desc, 1);
2711 }
2712
set_mtpt_pbl(struct hns_roce_dev * hr_dev,struct hns_roce_v2_mpt_entry * mpt_entry,struct hns_roce_mr * mr)2713 static int set_mtpt_pbl(struct hns_roce_dev *hr_dev,
2714 struct hns_roce_v2_mpt_entry *mpt_entry,
2715 struct hns_roce_mr *mr)
2716 {
2717 u64 pages[HNS_ROCE_V2_MAX_INNER_MTPT_NUM] = { 0 };
2718 struct ib_device *ibdev = &hr_dev->ib_dev;
2719 dma_addr_t pbl_ba;
2720 int i, count;
2721
2722 count = hns_roce_mtr_find(hr_dev, &mr->pbl_mtr, 0, pages,
2723 ARRAY_SIZE(pages), &pbl_ba);
2724 if (count < 1) {
2725 ibdev_err(ibdev, "failed to find PBL mtr, count = %d.\n",
2726 count);
2727 return -ENOBUFS;
2728 }
2729
2730 /* Aligned to the hardware address access unit */
2731 for (i = 0; i < count; i++)
2732 pages[i] >>= 6;
2733
2734 mpt_entry->pbl_size = cpu_to_le32(mr->npages);
2735 mpt_entry->pbl_ba_l = cpu_to_le32(pbl_ba >> 3);
2736 roce_set_field(mpt_entry->byte_48_mode_ba,
2737 V2_MPT_BYTE_48_PBL_BA_H_M, V2_MPT_BYTE_48_PBL_BA_H_S,
2738 upper_32_bits(pbl_ba >> 3));
2739
2740 mpt_entry->pa0_l = cpu_to_le32(lower_32_bits(pages[0]));
2741 roce_set_field(mpt_entry->byte_56_pa0_h, V2_MPT_BYTE_56_PA0_H_M,
2742 V2_MPT_BYTE_56_PA0_H_S, upper_32_bits(pages[0]));
2743
2744 mpt_entry->pa1_l = cpu_to_le32(lower_32_bits(pages[1]));
2745 roce_set_field(mpt_entry->byte_64_buf_pa1, V2_MPT_BYTE_64_PA1_H_M,
2746 V2_MPT_BYTE_64_PA1_H_S, upper_32_bits(pages[1]));
2747 roce_set_field(mpt_entry->byte_64_buf_pa1,
2748 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M,
2749 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S,
2750 to_hr_hw_page_shift(mr->pbl_mtr.hem_cfg.buf_pg_shift));
2751
2752 return 0;
2753 }
2754
hns_roce_v2_write_mtpt(struct hns_roce_dev * hr_dev,void * mb_buf,struct hns_roce_mr * mr,unsigned long mtpt_idx)2755 static int hns_roce_v2_write_mtpt(struct hns_roce_dev *hr_dev,
2756 void *mb_buf, struct hns_roce_mr *mr,
2757 unsigned long mtpt_idx)
2758 {
2759 struct hns_roce_v2_mpt_entry *mpt_entry;
2760 int ret;
2761
2762 mpt_entry = mb_buf;
2763 memset(mpt_entry, 0, sizeof(*mpt_entry));
2764
2765 roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_MPT_ST_M,
2766 V2_MPT_BYTE_4_MPT_ST_S, V2_MPT_ST_VALID);
2767 roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_PBL_HOP_NUM_M,
2768 V2_MPT_BYTE_4_PBL_HOP_NUM_S, mr->pbl_hop_num ==
2769 HNS_ROCE_HOP_NUM_0 ? 0 : mr->pbl_hop_num);
2770 roce_set_field(mpt_entry->byte_4_pd_hop_st,
2771 V2_MPT_BYTE_4_PBL_BA_PG_SZ_M,
2772 V2_MPT_BYTE_4_PBL_BA_PG_SZ_S,
2773 to_hr_hw_page_shift(mr->pbl_mtr.hem_cfg.ba_pg_shift));
2774 roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_PD_M,
2775 V2_MPT_BYTE_4_PD_S, mr->pd);
2776
2777 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_RA_EN_S, 0);
2778 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_R_INV_EN_S, 0);
2779 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_L_INV_EN_S, 1);
2780 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_BIND_EN_S,
2781 (mr->access & IB_ACCESS_MW_BIND ? 1 : 0));
2782 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_ATOMIC_EN_S,
2783 mr->access & IB_ACCESS_REMOTE_ATOMIC ? 1 : 0);
2784 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_RR_EN_S,
2785 (mr->access & IB_ACCESS_REMOTE_READ ? 1 : 0));
2786 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_RW_EN_S,
2787 (mr->access & IB_ACCESS_REMOTE_WRITE ? 1 : 0));
2788 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_LW_EN_S,
2789 (mr->access & IB_ACCESS_LOCAL_WRITE ? 1 : 0));
2790
2791 roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_PA_S,
2792 mr->type == MR_TYPE_MR ? 0 : 1);
2793 roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_INNER_PA_VLD_S,
2794 1);
2795
2796 mpt_entry->len_l = cpu_to_le32(lower_32_bits(mr->size));
2797 mpt_entry->len_h = cpu_to_le32(upper_32_bits(mr->size));
2798 mpt_entry->lkey = cpu_to_le32(mr->key);
2799 mpt_entry->va_l = cpu_to_le32(lower_32_bits(mr->iova));
2800 mpt_entry->va_h = cpu_to_le32(upper_32_bits(mr->iova));
2801
2802 if (mr->type == MR_TYPE_DMA)
2803 return 0;
2804
2805 ret = set_mtpt_pbl(hr_dev, mpt_entry, mr);
2806
2807 return ret;
2808 }
2809
hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev * hr_dev,struct hns_roce_mr * mr,int flags,u32 pdn,int mr_access_flags,u64 iova,u64 size,void * mb_buf)2810 static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev,
2811 struct hns_roce_mr *mr, int flags,
2812 u32 pdn, int mr_access_flags, u64 iova,
2813 u64 size, void *mb_buf)
2814 {
2815 struct hns_roce_v2_mpt_entry *mpt_entry = mb_buf;
2816 int ret = 0;
2817
2818 roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_MPT_ST_M,
2819 V2_MPT_BYTE_4_MPT_ST_S, V2_MPT_ST_VALID);
2820
2821 if (flags & IB_MR_REREG_PD) {
2822 roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_PD_M,
2823 V2_MPT_BYTE_4_PD_S, pdn);
2824 mr->pd = pdn;
2825 }
2826
2827 if (flags & IB_MR_REREG_ACCESS) {
2828 roce_set_bit(mpt_entry->byte_8_mw_cnt_en,
2829 V2_MPT_BYTE_8_BIND_EN_S,
2830 (mr_access_flags & IB_ACCESS_MW_BIND ? 1 : 0));
2831 roce_set_bit(mpt_entry->byte_8_mw_cnt_en,
2832 V2_MPT_BYTE_8_ATOMIC_EN_S,
2833 mr_access_flags & IB_ACCESS_REMOTE_ATOMIC ? 1 : 0);
2834 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_RR_EN_S,
2835 mr_access_flags & IB_ACCESS_REMOTE_READ ? 1 : 0);
2836 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_RW_EN_S,
2837 mr_access_flags & IB_ACCESS_REMOTE_WRITE ? 1 : 0);
2838 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_LW_EN_S,
2839 mr_access_flags & IB_ACCESS_LOCAL_WRITE ? 1 : 0);
2840 }
2841
2842 if (flags & IB_MR_REREG_TRANS) {
2843 mpt_entry->va_l = cpu_to_le32(lower_32_bits(iova));
2844 mpt_entry->va_h = cpu_to_le32(upper_32_bits(iova));
2845 mpt_entry->len_l = cpu_to_le32(lower_32_bits(size));
2846 mpt_entry->len_h = cpu_to_le32(upper_32_bits(size));
2847
2848 mr->iova = iova;
2849 mr->size = size;
2850
2851 ret = set_mtpt_pbl(hr_dev, mpt_entry, mr);
2852 }
2853
2854 return ret;
2855 }
2856
hns_roce_v2_frmr_write_mtpt(struct hns_roce_dev * hr_dev,void * mb_buf,struct hns_roce_mr * mr)2857 static int hns_roce_v2_frmr_write_mtpt(struct hns_roce_dev *hr_dev,
2858 void *mb_buf, struct hns_roce_mr *mr)
2859 {
2860 struct ib_device *ibdev = &hr_dev->ib_dev;
2861 struct hns_roce_v2_mpt_entry *mpt_entry;
2862 dma_addr_t pbl_ba = 0;
2863
2864 mpt_entry = mb_buf;
2865 memset(mpt_entry, 0, sizeof(*mpt_entry));
2866
2867 if (hns_roce_mtr_find(hr_dev, &mr->pbl_mtr, 0, NULL, 0, &pbl_ba) < 0) {
2868 ibdev_err(ibdev, "failed to find frmr mtr.\n");
2869 return -ENOBUFS;
2870 }
2871
2872 roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_MPT_ST_M,
2873 V2_MPT_BYTE_4_MPT_ST_S, V2_MPT_ST_FREE);
2874 roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_PBL_HOP_NUM_M,
2875 V2_MPT_BYTE_4_PBL_HOP_NUM_S, 1);
2876 roce_set_field(mpt_entry->byte_4_pd_hop_st,
2877 V2_MPT_BYTE_4_PBL_BA_PG_SZ_M,
2878 V2_MPT_BYTE_4_PBL_BA_PG_SZ_S,
2879 to_hr_hw_page_shift(mr->pbl_mtr.hem_cfg.ba_pg_shift));
2880 roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_PD_M,
2881 V2_MPT_BYTE_4_PD_S, mr->pd);
2882
2883 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_RA_EN_S, 1);
2884 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_R_INV_EN_S, 1);
2885 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_L_INV_EN_S, 1);
2886
2887 roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_FRE_S, 1);
2888 roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_PA_S, 0);
2889 roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_MR_MW_S, 0);
2890 roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_BPD_S, 1);
2891
2892 mpt_entry->pbl_size = cpu_to_le32(mr->npages);
2893
2894 mpt_entry->pbl_ba_l = cpu_to_le32(lower_32_bits(pbl_ba >> 3));
2895 roce_set_field(mpt_entry->byte_48_mode_ba, V2_MPT_BYTE_48_PBL_BA_H_M,
2896 V2_MPT_BYTE_48_PBL_BA_H_S,
2897 upper_32_bits(pbl_ba >> 3));
2898
2899 roce_set_field(mpt_entry->byte_64_buf_pa1,
2900 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M,
2901 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S,
2902 to_hr_hw_page_shift(mr->pbl_mtr.hem_cfg.buf_pg_shift));
2903
2904 return 0;
2905 }
2906
hns_roce_v2_mw_write_mtpt(void * mb_buf,struct hns_roce_mw * mw)2907 static int hns_roce_v2_mw_write_mtpt(void *mb_buf, struct hns_roce_mw *mw)
2908 {
2909 struct hns_roce_v2_mpt_entry *mpt_entry;
2910
2911 mpt_entry = mb_buf;
2912 memset(mpt_entry, 0, sizeof(*mpt_entry));
2913
2914 roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_MPT_ST_M,
2915 V2_MPT_BYTE_4_MPT_ST_S, V2_MPT_ST_FREE);
2916 roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_PD_M,
2917 V2_MPT_BYTE_4_PD_S, mw->pdn);
2918 roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_PBL_HOP_NUM_M,
2919 V2_MPT_BYTE_4_PBL_HOP_NUM_S,
2920 mw->pbl_hop_num == HNS_ROCE_HOP_NUM_0 ? 0 :
2921 mw->pbl_hop_num);
2922 roce_set_field(mpt_entry->byte_4_pd_hop_st,
2923 V2_MPT_BYTE_4_PBL_BA_PG_SZ_M,
2924 V2_MPT_BYTE_4_PBL_BA_PG_SZ_S,
2925 mw->pbl_ba_pg_sz + PG_SHIFT_OFFSET);
2926
2927 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_R_INV_EN_S, 1);
2928 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_L_INV_EN_S, 1);
2929 roce_set_bit(mpt_entry->byte_8_mw_cnt_en, V2_MPT_BYTE_8_LW_EN_S, 1);
2930
2931 roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_PA_S, 0);
2932 roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_MR_MW_S, 1);
2933 roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_BPD_S, 1);
2934 roce_set_bit(mpt_entry->byte_12_mw_pa, V2_MPT_BYTE_12_BQP_S,
2935 mw->ibmw.type == IB_MW_TYPE_1 ? 0 : 1);
2936
2937 roce_set_field(mpt_entry->byte_64_buf_pa1,
2938 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M,
2939 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S,
2940 mw->pbl_buf_pg_sz + PG_SHIFT_OFFSET);
2941
2942 mpt_entry->lkey = cpu_to_le32(mw->rkey);
2943
2944 return 0;
2945 }
2946
get_cqe_v2(struct hns_roce_cq * hr_cq,int n)2947 static void *get_cqe_v2(struct hns_roce_cq *hr_cq, int n)
2948 {
2949 return hns_roce_buf_offset(hr_cq->mtr.kmem, n * hr_cq->cqe_size);
2950 }
2951
get_sw_cqe_v2(struct hns_roce_cq * hr_cq,int n)2952 static void *get_sw_cqe_v2(struct hns_roce_cq *hr_cq, int n)
2953 {
2954 struct hns_roce_v2_cqe *cqe = get_cqe_v2(hr_cq, n & hr_cq->ib_cq.cqe);
2955
2956 /* Get cqe when Owner bit is Conversely with the MSB of cons_idx */
2957 return (roce_get_bit(cqe->byte_4, V2_CQE_BYTE_4_OWNER_S) ^
2958 !!(n & hr_cq->cq_depth)) ? cqe : NULL;
2959 }
2960
hns_roce_v2_cq_set_ci(struct hns_roce_cq * hr_cq,u32 ci)2961 static inline void hns_roce_v2_cq_set_ci(struct hns_roce_cq *hr_cq, u32 ci)
2962 {
2963 *hr_cq->set_ci_db = ci & V2_CQ_DB_PARAMETER_CONS_IDX_M;
2964 }
2965
__hns_roce_v2_cq_clean(struct hns_roce_cq * hr_cq,u32 qpn,struct hns_roce_srq * srq)2966 static void __hns_roce_v2_cq_clean(struct hns_roce_cq *hr_cq, u32 qpn,
2967 struct hns_roce_srq *srq)
2968 {
2969 struct hns_roce_v2_cqe *cqe, *dest;
2970 u32 prod_index;
2971 int nfreed = 0;
2972 int wqe_index;
2973 u8 owner_bit;
2974
2975 for (prod_index = hr_cq->cons_index; get_sw_cqe_v2(hr_cq, prod_index);
2976 ++prod_index) {
2977 if (prod_index > hr_cq->cons_index + hr_cq->ib_cq.cqe)
2978 break;
2979 }
2980
2981 /*
2982 * Now backwards through the CQ, removing CQ entries
2983 * that match our QP by overwriting them with next entries.
2984 */
2985 while ((int) --prod_index - (int) hr_cq->cons_index >= 0) {
2986 cqe = get_cqe_v2(hr_cq, prod_index & hr_cq->ib_cq.cqe);
2987 if ((roce_get_field(cqe->byte_16, V2_CQE_BYTE_16_LCL_QPN_M,
2988 V2_CQE_BYTE_16_LCL_QPN_S) &
2989 HNS_ROCE_V2_CQE_QPN_MASK) == qpn) {
2990 if (srq &&
2991 roce_get_bit(cqe->byte_4, V2_CQE_BYTE_4_S_R_S)) {
2992 wqe_index = roce_get_field(cqe->byte_4,
2993 V2_CQE_BYTE_4_WQE_INDX_M,
2994 V2_CQE_BYTE_4_WQE_INDX_S);
2995 hns_roce_free_srq_wqe(srq, wqe_index);
2996 }
2997 ++nfreed;
2998 } else if (nfreed) {
2999 dest = get_cqe_v2(hr_cq, (prod_index + nfreed) &
3000 hr_cq->ib_cq.cqe);
3001 owner_bit = roce_get_bit(dest->byte_4,
3002 V2_CQE_BYTE_4_OWNER_S);
3003 memcpy(dest, cqe, sizeof(*cqe));
3004 roce_set_bit(dest->byte_4, V2_CQE_BYTE_4_OWNER_S,
3005 owner_bit);
3006 }
3007 }
3008
3009 if (nfreed) {
3010 hr_cq->cons_index += nfreed;
3011 /*
3012 * Make sure update of buffer contents is done before
3013 * updating consumer index.
3014 */
3015 wmb();
3016 hns_roce_v2_cq_set_ci(hr_cq, hr_cq->cons_index);
3017 }
3018 }
3019
hns_roce_v2_cq_clean(struct hns_roce_cq * hr_cq,u32 qpn,struct hns_roce_srq * srq)3020 static void hns_roce_v2_cq_clean(struct hns_roce_cq *hr_cq, u32 qpn,
3021 struct hns_roce_srq *srq)
3022 {
3023 spin_lock_irq(&hr_cq->lock);
3024 __hns_roce_v2_cq_clean(hr_cq, qpn, srq);
3025 spin_unlock_irq(&hr_cq->lock);
3026 }
3027
hns_roce_v2_write_cqc(struct hns_roce_dev * hr_dev,struct hns_roce_cq * hr_cq,void * mb_buf,u64 * mtts,dma_addr_t dma_handle)3028 static void hns_roce_v2_write_cqc(struct hns_roce_dev *hr_dev,
3029 struct hns_roce_cq *hr_cq, void *mb_buf,
3030 u64 *mtts, dma_addr_t dma_handle)
3031 {
3032 struct hns_roce_v2_cq_context *cq_context;
3033
3034 cq_context = mb_buf;
3035 memset(cq_context, 0, sizeof(*cq_context));
3036
3037 roce_set_field(cq_context->byte_4_pg_ceqn, V2_CQC_BYTE_4_CQ_ST_M,
3038 V2_CQC_BYTE_4_CQ_ST_S, V2_CQ_STATE_VALID);
3039 roce_set_field(cq_context->byte_4_pg_ceqn, V2_CQC_BYTE_4_ARM_ST_M,
3040 V2_CQC_BYTE_4_ARM_ST_S, REG_NXT_CEQE);
3041 roce_set_field(cq_context->byte_4_pg_ceqn, V2_CQC_BYTE_4_SHIFT_M,
3042 V2_CQC_BYTE_4_SHIFT_S, ilog2(hr_cq->cq_depth));
3043 roce_set_field(cq_context->byte_4_pg_ceqn, V2_CQC_BYTE_4_CEQN_M,
3044 V2_CQC_BYTE_4_CEQN_S, hr_cq->vector);
3045
3046 roce_set_field(cq_context->byte_8_cqn, V2_CQC_BYTE_8_CQN_M,
3047 V2_CQC_BYTE_8_CQN_S, hr_cq->cqn);
3048
3049 roce_set_field(cq_context->byte_8_cqn, V2_CQC_BYTE_8_CQE_SIZE_M,
3050 V2_CQC_BYTE_8_CQE_SIZE_S, hr_cq->cqe_size ==
3051 HNS_ROCE_V3_CQE_SIZE ? 1 : 0);
3052
3053 cq_context->cqe_cur_blk_addr = cpu_to_le32(to_hr_hw_page_addr(mtts[0]));
3054
3055 roce_set_field(cq_context->byte_16_hop_addr,
3056 V2_CQC_BYTE_16_CQE_CUR_BLK_ADDR_M,
3057 V2_CQC_BYTE_16_CQE_CUR_BLK_ADDR_S,
3058 upper_32_bits(to_hr_hw_page_addr(mtts[0])));
3059 roce_set_field(cq_context->byte_16_hop_addr,
3060 V2_CQC_BYTE_16_CQE_HOP_NUM_M,
3061 V2_CQC_BYTE_16_CQE_HOP_NUM_S, hr_dev->caps.cqe_hop_num ==
3062 HNS_ROCE_HOP_NUM_0 ? 0 : hr_dev->caps.cqe_hop_num);
3063
3064 cq_context->cqe_nxt_blk_addr = cpu_to_le32(to_hr_hw_page_addr(mtts[1]));
3065 roce_set_field(cq_context->byte_24_pgsz_addr,
3066 V2_CQC_BYTE_24_CQE_NXT_BLK_ADDR_M,
3067 V2_CQC_BYTE_24_CQE_NXT_BLK_ADDR_S,
3068 upper_32_bits(to_hr_hw_page_addr(mtts[1])));
3069 roce_set_field(cq_context->byte_24_pgsz_addr,
3070 V2_CQC_BYTE_24_CQE_BA_PG_SZ_M,
3071 V2_CQC_BYTE_24_CQE_BA_PG_SZ_S,
3072 to_hr_hw_page_shift(hr_cq->mtr.hem_cfg.ba_pg_shift));
3073 roce_set_field(cq_context->byte_24_pgsz_addr,
3074 V2_CQC_BYTE_24_CQE_BUF_PG_SZ_M,
3075 V2_CQC_BYTE_24_CQE_BUF_PG_SZ_S,
3076 to_hr_hw_page_shift(hr_cq->mtr.hem_cfg.buf_pg_shift));
3077
3078 cq_context->cqe_ba = cpu_to_le32(dma_handle >> 3);
3079
3080 roce_set_field(cq_context->byte_40_cqe_ba, V2_CQC_BYTE_40_CQE_BA_M,
3081 V2_CQC_BYTE_40_CQE_BA_S, (dma_handle >> (32 + 3)));
3082
3083 roce_set_bit(cq_context->byte_44_db_record,
3084 V2_CQC_BYTE_44_DB_RECORD_EN_S,
3085 (hr_cq->flags & HNS_ROCE_CQ_FLAG_RECORD_DB) ? 1 : 0);
3086
3087 roce_set_field(cq_context->byte_44_db_record,
3088 V2_CQC_BYTE_44_DB_RECORD_ADDR_M,
3089 V2_CQC_BYTE_44_DB_RECORD_ADDR_S,
3090 ((u32)hr_cq->db.dma) >> 1);
3091 cq_context->db_record_addr = cpu_to_le32(hr_cq->db.dma >> 32);
3092
3093 roce_set_field(cq_context->byte_56_cqe_period_maxcnt,
3094 V2_CQC_BYTE_56_CQ_MAX_CNT_M,
3095 V2_CQC_BYTE_56_CQ_MAX_CNT_S,
3096 HNS_ROCE_V2_CQ_DEFAULT_BURST_NUM);
3097 roce_set_field(cq_context->byte_56_cqe_period_maxcnt,
3098 V2_CQC_BYTE_56_CQ_PERIOD_M,
3099 V2_CQC_BYTE_56_CQ_PERIOD_S,
3100 HNS_ROCE_V2_CQ_DEFAULT_INTERVAL);
3101 }
3102
hns_roce_v2_req_notify_cq(struct ib_cq * ibcq,enum ib_cq_notify_flags flags)3103 static int hns_roce_v2_req_notify_cq(struct ib_cq *ibcq,
3104 enum ib_cq_notify_flags flags)
3105 {
3106 struct hns_roce_dev *hr_dev = to_hr_dev(ibcq->device);
3107 struct hns_roce_cq *hr_cq = to_hr_cq(ibcq);
3108 u32 notification_flag;
3109 __le32 doorbell[2];
3110
3111 doorbell[0] = 0;
3112 doorbell[1] = 0;
3113
3114 notification_flag = (flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ?
3115 V2_CQ_DB_REQ_NOT : V2_CQ_DB_REQ_NOT_SOL;
3116 /*
3117 * flags = 0; Notification Flag = 1, next
3118 * flags = 1; Notification Flag = 0, solocited
3119 */
3120 roce_set_field(doorbell[0], V2_CQ_DB_BYTE_4_TAG_M, V2_DB_BYTE_4_TAG_S,
3121 hr_cq->cqn);
3122 roce_set_field(doorbell[0], V2_CQ_DB_BYTE_4_CMD_M, V2_DB_BYTE_4_CMD_S,
3123 HNS_ROCE_V2_CQ_DB_NTR);
3124 roce_set_field(doorbell[1], V2_CQ_DB_PARAMETER_CONS_IDX_M,
3125 V2_CQ_DB_PARAMETER_CONS_IDX_S, hr_cq->cons_index);
3126 roce_set_field(doorbell[1], V2_CQ_DB_PARAMETER_CMD_SN_M,
3127 V2_CQ_DB_PARAMETER_CMD_SN_S, hr_cq->arm_sn & 0x3);
3128 roce_set_bit(doorbell[1], V2_CQ_DB_PARAMETER_NOTIFY_S,
3129 notification_flag);
3130
3131 hns_roce_write64(hr_dev, doorbell, hr_cq->cq_db_l);
3132
3133 return 0;
3134 }
3135
hns_roce_handle_recv_inl_wqe(struct hns_roce_v2_cqe * cqe,struct hns_roce_qp ** cur_qp,struct ib_wc * wc)3136 static int hns_roce_handle_recv_inl_wqe(struct hns_roce_v2_cqe *cqe,
3137 struct hns_roce_qp **cur_qp,
3138 struct ib_wc *wc)
3139 {
3140 struct hns_roce_rinl_sge *sge_list;
3141 u32 wr_num, wr_cnt, sge_num;
3142 u32 sge_cnt, data_len, size;
3143 void *wqe_buf;
3144
3145 wr_num = roce_get_field(cqe->byte_4, V2_CQE_BYTE_4_WQE_INDX_M,
3146 V2_CQE_BYTE_4_WQE_INDX_S) & 0xffff;
3147 wr_cnt = wr_num & ((*cur_qp)->rq.wqe_cnt - 1);
3148
3149 sge_list = (*cur_qp)->rq_inl_buf.wqe_list[wr_cnt].sg_list;
3150 sge_num = (*cur_qp)->rq_inl_buf.wqe_list[wr_cnt].sge_cnt;
3151 wqe_buf = hns_roce_get_recv_wqe(*cur_qp, wr_cnt);
3152 data_len = wc->byte_len;
3153
3154 for (sge_cnt = 0; (sge_cnt < sge_num) && (data_len); sge_cnt++) {
3155 size = min(sge_list[sge_cnt].len, data_len);
3156 memcpy((void *)sge_list[sge_cnt].addr, wqe_buf, size);
3157
3158 data_len -= size;
3159 wqe_buf += size;
3160 }
3161
3162 if (unlikely(data_len)) {
3163 wc->status = IB_WC_LOC_LEN_ERR;
3164 return -EAGAIN;
3165 }
3166
3167 return 0;
3168 }
3169
sw_comp(struct hns_roce_qp * hr_qp,struct hns_roce_wq * wq,int num_entries,struct ib_wc * wc)3170 static int sw_comp(struct hns_roce_qp *hr_qp, struct hns_roce_wq *wq,
3171 int num_entries, struct ib_wc *wc)
3172 {
3173 unsigned int left;
3174 int npolled = 0;
3175
3176 left = wq->head - wq->tail;
3177 if (left == 0)
3178 return 0;
3179
3180 left = min_t(unsigned int, (unsigned int)num_entries, left);
3181 while (npolled < left) {
3182 wc->wr_id = wq->wrid[wq->tail & (wq->wqe_cnt - 1)];
3183 wc->status = IB_WC_WR_FLUSH_ERR;
3184 wc->vendor_err = 0;
3185 wc->qp = &hr_qp->ibqp;
3186
3187 wq->tail++;
3188 wc++;
3189 npolled++;
3190 }
3191
3192 return npolled;
3193 }
3194
hns_roce_v2_sw_poll_cq(struct hns_roce_cq * hr_cq,int num_entries,struct ib_wc * wc)3195 static int hns_roce_v2_sw_poll_cq(struct hns_roce_cq *hr_cq, int num_entries,
3196 struct ib_wc *wc)
3197 {
3198 struct hns_roce_qp *hr_qp;
3199 int npolled = 0;
3200
3201 list_for_each_entry(hr_qp, &hr_cq->sq_list, sq_node) {
3202 npolled += sw_comp(hr_qp, &hr_qp->sq,
3203 num_entries - npolled, wc + npolled);
3204 if (npolled >= num_entries)
3205 goto out;
3206 }
3207
3208 list_for_each_entry(hr_qp, &hr_cq->rq_list, rq_node) {
3209 npolled += sw_comp(hr_qp, &hr_qp->rq,
3210 num_entries - npolled, wc + npolled);
3211 if (npolled >= num_entries)
3212 goto out;
3213 }
3214
3215 out:
3216 return npolled;
3217 }
3218
get_cqe_status(struct hns_roce_dev * hr_dev,struct hns_roce_qp * qp,struct hns_roce_cq * cq,struct hns_roce_v2_cqe * cqe,struct ib_wc * wc)3219 static void get_cqe_status(struct hns_roce_dev *hr_dev, struct hns_roce_qp *qp,
3220 struct hns_roce_cq *cq, struct hns_roce_v2_cqe *cqe,
3221 struct ib_wc *wc)
3222 {
3223 static const struct {
3224 u32 cqe_status;
3225 enum ib_wc_status wc_status;
3226 } map[] = {
3227 { HNS_ROCE_CQE_V2_SUCCESS, IB_WC_SUCCESS },
3228 { HNS_ROCE_CQE_V2_LOCAL_LENGTH_ERR, IB_WC_LOC_LEN_ERR },
3229 { HNS_ROCE_CQE_V2_LOCAL_QP_OP_ERR, IB_WC_LOC_QP_OP_ERR },
3230 { HNS_ROCE_CQE_V2_LOCAL_PROT_ERR, IB_WC_LOC_PROT_ERR },
3231 { HNS_ROCE_CQE_V2_WR_FLUSH_ERR, IB_WC_WR_FLUSH_ERR },
3232 { HNS_ROCE_CQE_V2_MW_BIND_ERR, IB_WC_MW_BIND_ERR },
3233 { HNS_ROCE_CQE_V2_BAD_RESP_ERR, IB_WC_BAD_RESP_ERR },
3234 { HNS_ROCE_CQE_V2_LOCAL_ACCESS_ERR, IB_WC_LOC_ACCESS_ERR },
3235 { HNS_ROCE_CQE_V2_REMOTE_INVAL_REQ_ERR, IB_WC_REM_INV_REQ_ERR },
3236 { HNS_ROCE_CQE_V2_REMOTE_ACCESS_ERR, IB_WC_REM_ACCESS_ERR },
3237 { HNS_ROCE_CQE_V2_REMOTE_OP_ERR, IB_WC_REM_OP_ERR },
3238 { HNS_ROCE_CQE_V2_TRANSPORT_RETRY_EXC_ERR,
3239 IB_WC_RETRY_EXC_ERR },
3240 { HNS_ROCE_CQE_V2_RNR_RETRY_EXC_ERR, IB_WC_RNR_RETRY_EXC_ERR },
3241 { HNS_ROCE_CQE_V2_REMOTE_ABORT_ERR, IB_WC_REM_ABORT_ERR },
3242 { HNS_ROCE_CQE_V2_GENERAL_ERR, IB_WC_GENERAL_ERR}
3243 };
3244
3245 u32 cqe_status = roce_get_field(cqe->byte_4, V2_CQE_BYTE_4_STATUS_M,
3246 V2_CQE_BYTE_4_STATUS_S);
3247 int i;
3248
3249 wc->status = IB_WC_GENERAL_ERR;
3250 for (i = 0; i < ARRAY_SIZE(map); i++)
3251 if (cqe_status == map[i].cqe_status) {
3252 wc->status = map[i].wc_status;
3253 break;
3254 }
3255
3256 if (likely(wc->status == IB_WC_SUCCESS ||
3257 wc->status == IB_WC_WR_FLUSH_ERR))
3258 return;
3259
3260 ibdev_err(&hr_dev->ib_dev, "error cqe status 0x%x:\n", cqe_status);
3261 print_hex_dump(KERN_ERR, "", DUMP_PREFIX_NONE, 16, 4, cqe,
3262 cq->cqe_size, false);
3263
3264 /*
3265 * For hns ROCEE, GENERAL_ERR is an error type that is not defined in
3266 * the standard protocol, the driver must ignore it and needn't to set
3267 * the QP to an error state.
3268 */
3269 if (cqe_status == HNS_ROCE_CQE_V2_GENERAL_ERR)
3270 return;
3271
3272 /*
3273 * Hip08 hardware cannot flush the WQEs in SQ/RQ if the QP state gets
3274 * into errored mode. Hence, as a workaround to this hardware
3275 * limitation, driver needs to assist in flushing. But the flushing
3276 * operation uses mailbox to convey the QP state to the hardware and
3277 * which can sleep due to the mutex protection around the mailbox calls.
3278 * Hence, use the deferred flush for now. Once wc error detected, the
3279 * flushing operation is needed.
3280 */
3281 if (!test_and_set_bit(HNS_ROCE_FLUSH_FLAG, &qp->flush_flag))
3282 init_flush_work(hr_dev, qp);
3283 }
3284
hns_roce_v2_poll_one(struct hns_roce_cq * hr_cq,struct hns_roce_qp ** cur_qp,struct ib_wc * wc)3285 static int hns_roce_v2_poll_one(struct hns_roce_cq *hr_cq,
3286 struct hns_roce_qp **cur_qp, struct ib_wc *wc)
3287 {
3288 struct hns_roce_dev *hr_dev = to_hr_dev(hr_cq->ib_cq.device);
3289 struct hns_roce_srq *srq = NULL;
3290 struct hns_roce_v2_cqe *cqe;
3291 struct hns_roce_qp *hr_qp;
3292 struct hns_roce_wq *wq;
3293 int is_send;
3294 u16 wqe_ctr;
3295 u32 opcode;
3296 int qpn;
3297 int ret;
3298
3299 /* Find cqe according to consumer index */
3300 cqe = get_sw_cqe_v2(hr_cq, hr_cq->cons_index);
3301 if (!cqe)
3302 return -EAGAIN;
3303
3304 ++hr_cq->cons_index;
3305 /* Memory barrier */
3306 rmb();
3307
3308 /* 0->SQ, 1->RQ */
3309 is_send = !roce_get_bit(cqe->byte_4, V2_CQE_BYTE_4_S_R_S);
3310
3311 qpn = roce_get_field(cqe->byte_16, V2_CQE_BYTE_16_LCL_QPN_M,
3312 V2_CQE_BYTE_16_LCL_QPN_S);
3313
3314 if (!*cur_qp || (qpn & HNS_ROCE_V2_CQE_QPN_MASK) != (*cur_qp)->qpn) {
3315 hr_qp = __hns_roce_qp_lookup(hr_dev, qpn);
3316 if (unlikely(!hr_qp)) {
3317 ibdev_err(&hr_dev->ib_dev,
3318 "CQ %06lx with entry for unknown QPN %06x\n",
3319 hr_cq->cqn, qpn & HNS_ROCE_V2_CQE_QPN_MASK);
3320 return -EINVAL;
3321 }
3322 *cur_qp = hr_qp;
3323 }
3324
3325 wc->qp = &(*cur_qp)->ibqp;
3326 wc->vendor_err = 0;
3327
3328 if (is_send) {
3329 wq = &(*cur_qp)->sq;
3330 if ((*cur_qp)->sq_signal_bits) {
3331 /*
3332 * If sg_signal_bit is 1,
3333 * firstly tail pointer updated to wqe
3334 * which current cqe correspond to
3335 */
3336 wqe_ctr = (u16)roce_get_field(cqe->byte_4,
3337 V2_CQE_BYTE_4_WQE_INDX_M,
3338 V2_CQE_BYTE_4_WQE_INDX_S);
3339 wq->tail += (wqe_ctr - (u16)wq->tail) &
3340 (wq->wqe_cnt - 1);
3341 }
3342
3343 wc->wr_id = wq->wrid[wq->tail & (wq->wqe_cnt - 1)];
3344 ++wq->tail;
3345 } else if ((*cur_qp)->ibqp.srq) {
3346 srq = to_hr_srq((*cur_qp)->ibqp.srq);
3347 wqe_ctr = (u16)roce_get_field(cqe->byte_4,
3348 V2_CQE_BYTE_4_WQE_INDX_M,
3349 V2_CQE_BYTE_4_WQE_INDX_S);
3350 wc->wr_id = srq->wrid[wqe_ctr];
3351 hns_roce_free_srq_wqe(srq, wqe_ctr);
3352 } else {
3353 /* Update tail pointer, record wr_id */
3354 wq = &(*cur_qp)->rq;
3355 wc->wr_id = wq->wrid[wq->tail & (wq->wqe_cnt - 1)];
3356 ++wq->tail;
3357 }
3358
3359 get_cqe_status(hr_dev, *cur_qp, hr_cq, cqe, wc);
3360 if (unlikely(wc->status != IB_WC_SUCCESS))
3361 return 0;
3362
3363 if (is_send) {
3364 wc->wc_flags = 0;
3365 /* SQ corresponding to CQE */
3366 switch (roce_get_field(cqe->byte_4, V2_CQE_BYTE_4_OPCODE_M,
3367 V2_CQE_BYTE_4_OPCODE_S) & 0x1f) {
3368 case HNS_ROCE_V2_WQE_OP_SEND:
3369 wc->opcode = IB_WC_SEND;
3370 break;
3371 case HNS_ROCE_V2_WQE_OP_SEND_WITH_INV:
3372 wc->opcode = IB_WC_SEND;
3373 break;
3374 case HNS_ROCE_V2_WQE_OP_SEND_WITH_IMM:
3375 wc->opcode = IB_WC_SEND;
3376 wc->wc_flags |= IB_WC_WITH_IMM;
3377 break;
3378 case HNS_ROCE_V2_WQE_OP_RDMA_READ:
3379 wc->opcode = IB_WC_RDMA_READ;
3380 wc->byte_len = le32_to_cpu(cqe->byte_cnt);
3381 break;
3382 case HNS_ROCE_V2_WQE_OP_RDMA_WRITE:
3383 wc->opcode = IB_WC_RDMA_WRITE;
3384 break;
3385 case HNS_ROCE_V2_WQE_OP_RDMA_WRITE_WITH_IMM:
3386 wc->opcode = IB_WC_RDMA_WRITE;
3387 wc->wc_flags |= IB_WC_WITH_IMM;
3388 break;
3389 case HNS_ROCE_V2_WQE_OP_LOCAL_INV:
3390 wc->opcode = IB_WC_LOCAL_INV;
3391 wc->wc_flags |= IB_WC_WITH_INVALIDATE;
3392 break;
3393 case HNS_ROCE_V2_WQE_OP_ATOM_CMP_AND_SWAP:
3394 wc->opcode = IB_WC_COMP_SWAP;
3395 wc->byte_len = 8;
3396 break;
3397 case HNS_ROCE_V2_WQE_OP_ATOM_FETCH_AND_ADD:
3398 wc->opcode = IB_WC_FETCH_ADD;
3399 wc->byte_len = 8;
3400 break;
3401 case HNS_ROCE_V2_WQE_OP_ATOM_MSK_CMP_AND_SWAP:
3402 wc->opcode = IB_WC_MASKED_COMP_SWAP;
3403 wc->byte_len = 8;
3404 break;
3405 case HNS_ROCE_V2_WQE_OP_ATOM_MSK_FETCH_AND_ADD:
3406 wc->opcode = IB_WC_MASKED_FETCH_ADD;
3407 wc->byte_len = 8;
3408 break;
3409 case HNS_ROCE_V2_WQE_OP_FAST_REG_PMR:
3410 wc->opcode = IB_WC_REG_MR;
3411 break;
3412 case HNS_ROCE_V2_WQE_OP_BIND_MW:
3413 wc->opcode = IB_WC_REG_MR;
3414 break;
3415 default:
3416 wc->status = IB_WC_GENERAL_ERR;
3417 break;
3418 }
3419 } else {
3420 /* RQ correspond to CQE */
3421 wc->byte_len = le32_to_cpu(cqe->byte_cnt);
3422
3423 opcode = roce_get_field(cqe->byte_4, V2_CQE_BYTE_4_OPCODE_M,
3424 V2_CQE_BYTE_4_OPCODE_S);
3425 switch (opcode & 0x1f) {
3426 case HNS_ROCE_V2_OPCODE_RDMA_WRITE_IMM:
3427 wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
3428 wc->wc_flags = IB_WC_WITH_IMM;
3429 wc->ex.imm_data =
3430 cpu_to_be32(le32_to_cpu(cqe->immtdata));
3431 break;
3432 case HNS_ROCE_V2_OPCODE_SEND:
3433 wc->opcode = IB_WC_RECV;
3434 wc->wc_flags = 0;
3435 break;
3436 case HNS_ROCE_V2_OPCODE_SEND_WITH_IMM:
3437 wc->opcode = IB_WC_RECV;
3438 wc->wc_flags = IB_WC_WITH_IMM;
3439 wc->ex.imm_data =
3440 cpu_to_be32(le32_to_cpu(cqe->immtdata));
3441 break;
3442 case HNS_ROCE_V2_OPCODE_SEND_WITH_INV:
3443 wc->opcode = IB_WC_RECV;
3444 wc->wc_flags = IB_WC_WITH_INVALIDATE;
3445 wc->ex.invalidate_rkey = le32_to_cpu(cqe->rkey);
3446 break;
3447 default:
3448 wc->status = IB_WC_GENERAL_ERR;
3449 break;
3450 }
3451
3452 if ((wc->qp->qp_type == IB_QPT_RC ||
3453 wc->qp->qp_type == IB_QPT_UC) &&
3454 (opcode == HNS_ROCE_V2_OPCODE_SEND ||
3455 opcode == HNS_ROCE_V2_OPCODE_SEND_WITH_IMM ||
3456 opcode == HNS_ROCE_V2_OPCODE_SEND_WITH_INV) &&
3457 (roce_get_bit(cqe->byte_4, V2_CQE_BYTE_4_RQ_INLINE_S))) {
3458 ret = hns_roce_handle_recv_inl_wqe(cqe, cur_qp, wc);
3459 if (unlikely(ret))
3460 return -EAGAIN;
3461 }
3462
3463 wc->sl = (u8)roce_get_field(cqe->byte_32, V2_CQE_BYTE_32_SL_M,
3464 V2_CQE_BYTE_32_SL_S);
3465 wc->src_qp = (u8)roce_get_field(cqe->byte_32,
3466 V2_CQE_BYTE_32_RMT_QPN_M,
3467 V2_CQE_BYTE_32_RMT_QPN_S);
3468 wc->slid = 0;
3469 wc->wc_flags |= (roce_get_bit(cqe->byte_32,
3470 V2_CQE_BYTE_32_GRH_S) ?
3471 IB_WC_GRH : 0);
3472 wc->port_num = roce_get_field(cqe->byte_32,
3473 V2_CQE_BYTE_32_PORTN_M, V2_CQE_BYTE_32_PORTN_S);
3474 wc->pkey_index = 0;
3475
3476 if (roce_get_bit(cqe->byte_28, V2_CQE_BYTE_28_VID_VLD_S)) {
3477 wc->vlan_id = (u16)roce_get_field(cqe->byte_28,
3478 V2_CQE_BYTE_28_VID_M,
3479 V2_CQE_BYTE_28_VID_S);
3480 wc->wc_flags |= IB_WC_WITH_VLAN;
3481 } else {
3482 wc->vlan_id = 0xffff;
3483 }
3484
3485 wc->network_hdr_type = roce_get_field(cqe->byte_28,
3486 V2_CQE_BYTE_28_PORT_TYPE_M,
3487 V2_CQE_BYTE_28_PORT_TYPE_S);
3488 }
3489
3490 return 0;
3491 }
3492
hns_roce_v2_poll_cq(struct ib_cq * ibcq,int num_entries,struct ib_wc * wc)3493 static int hns_roce_v2_poll_cq(struct ib_cq *ibcq, int num_entries,
3494 struct ib_wc *wc)
3495 {
3496 struct hns_roce_dev *hr_dev = to_hr_dev(ibcq->device);
3497 struct hns_roce_cq *hr_cq = to_hr_cq(ibcq);
3498 struct hns_roce_qp *cur_qp = NULL;
3499 unsigned long flags;
3500 int npolled;
3501
3502 spin_lock_irqsave(&hr_cq->lock, flags);
3503
3504 /*
3505 * When the device starts to reset, the state is RST_DOWN. At this time,
3506 * there may still be some valid CQEs in the hardware that are not
3507 * polled. Therefore, it is not allowed to switch to the software mode
3508 * immediately. When the state changes to UNINIT, CQE no longer exists
3509 * in the hardware, and then switch to software mode.
3510 */
3511 if (hr_dev->state == HNS_ROCE_DEVICE_STATE_UNINIT) {
3512 npolled = hns_roce_v2_sw_poll_cq(hr_cq, num_entries, wc);
3513 goto out;
3514 }
3515
3516 for (npolled = 0; npolled < num_entries; ++npolled) {
3517 if (hns_roce_v2_poll_one(hr_cq, &cur_qp, wc + npolled))
3518 break;
3519 }
3520
3521 if (npolled) {
3522 /* Memory barrier */
3523 wmb();
3524 hns_roce_v2_cq_set_ci(hr_cq, hr_cq->cons_index);
3525 }
3526
3527 out:
3528 spin_unlock_irqrestore(&hr_cq->lock, flags);
3529
3530 return npolled;
3531 }
3532
get_op_for_set_hem(struct hns_roce_dev * hr_dev,u32 type,int step_idx)3533 static int get_op_for_set_hem(struct hns_roce_dev *hr_dev, u32 type,
3534 int step_idx)
3535 {
3536 int op;
3537
3538 if (type == HEM_TYPE_SCCC && step_idx)
3539 return -EINVAL;
3540
3541 switch (type) {
3542 case HEM_TYPE_QPC:
3543 op = HNS_ROCE_CMD_WRITE_QPC_BT0;
3544 break;
3545 case HEM_TYPE_MTPT:
3546 op = HNS_ROCE_CMD_WRITE_MPT_BT0;
3547 break;
3548 case HEM_TYPE_CQC:
3549 op = HNS_ROCE_CMD_WRITE_CQC_BT0;
3550 break;
3551 case HEM_TYPE_SRQC:
3552 op = HNS_ROCE_CMD_WRITE_SRQC_BT0;
3553 break;
3554 case HEM_TYPE_SCCC:
3555 op = HNS_ROCE_CMD_WRITE_SCCC_BT0;
3556 break;
3557 case HEM_TYPE_QPC_TIMER:
3558 op = HNS_ROCE_CMD_WRITE_QPC_TIMER_BT0;
3559 break;
3560 case HEM_TYPE_CQC_TIMER:
3561 op = HNS_ROCE_CMD_WRITE_CQC_TIMER_BT0;
3562 break;
3563 default:
3564 dev_warn(hr_dev->dev,
3565 "table %u not to be written by mailbox!\n", type);
3566 return -EINVAL;
3567 }
3568
3569 return op + step_idx;
3570 }
3571
set_hem_to_hw(struct hns_roce_dev * hr_dev,int obj,u64 bt_ba,u32 hem_type,int step_idx)3572 static int set_hem_to_hw(struct hns_roce_dev *hr_dev, int obj, u64 bt_ba,
3573 u32 hem_type, int step_idx)
3574 {
3575 struct hns_roce_cmd_mailbox *mailbox;
3576 int ret;
3577 int op;
3578
3579 op = get_op_for_set_hem(hr_dev, hem_type, step_idx);
3580 if (op < 0)
3581 return 0;
3582
3583 mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
3584 if (IS_ERR(mailbox))
3585 return PTR_ERR(mailbox);
3586
3587 ret = hns_roce_cmd_mbox(hr_dev, bt_ba, mailbox->dma, obj,
3588 0, op, HNS_ROCE_CMD_TIMEOUT_MSECS);
3589
3590 hns_roce_free_cmd_mailbox(hr_dev, mailbox);
3591
3592 return ret;
3593 }
3594
hns_roce_v2_set_hem(struct hns_roce_dev * hr_dev,struct hns_roce_hem_table * table,int obj,int step_idx)3595 static int hns_roce_v2_set_hem(struct hns_roce_dev *hr_dev,
3596 struct hns_roce_hem_table *table, int obj,
3597 int step_idx)
3598 {
3599 struct hns_roce_hem_iter iter;
3600 struct hns_roce_hem_mhop mhop;
3601 struct hns_roce_hem *hem;
3602 unsigned long mhop_obj = obj;
3603 int i, j, k;
3604 int ret = 0;
3605 u64 hem_idx = 0;
3606 u64 l1_idx = 0;
3607 u64 bt_ba = 0;
3608 u32 chunk_ba_num;
3609 u32 hop_num;
3610
3611 if (!hns_roce_check_whether_mhop(hr_dev, table->type))
3612 return 0;
3613
3614 hns_roce_calc_hem_mhop(hr_dev, table, &mhop_obj, &mhop);
3615 i = mhop.l0_idx;
3616 j = mhop.l1_idx;
3617 k = mhop.l2_idx;
3618 hop_num = mhop.hop_num;
3619 chunk_ba_num = mhop.bt_chunk_size / 8;
3620
3621 if (hop_num == 2) {
3622 hem_idx = i * chunk_ba_num * chunk_ba_num + j * chunk_ba_num +
3623 k;
3624 l1_idx = i * chunk_ba_num + j;
3625 } else if (hop_num == 1) {
3626 hem_idx = i * chunk_ba_num + j;
3627 } else if (hop_num == HNS_ROCE_HOP_NUM_0) {
3628 hem_idx = i;
3629 }
3630
3631 if (table->type == HEM_TYPE_SCCC)
3632 obj = mhop.l0_idx;
3633
3634 if (check_whether_last_step(hop_num, step_idx)) {
3635 hem = table->hem[hem_idx];
3636 for (hns_roce_hem_first(hem, &iter);
3637 !hns_roce_hem_last(&iter); hns_roce_hem_next(&iter)) {
3638 bt_ba = hns_roce_hem_addr(&iter);
3639 ret = set_hem_to_hw(hr_dev, obj, bt_ba, table->type,
3640 step_idx);
3641 }
3642 } else {
3643 if (step_idx == 0)
3644 bt_ba = table->bt_l0_dma_addr[i];
3645 else if (step_idx == 1 && hop_num == 2)
3646 bt_ba = table->bt_l1_dma_addr[l1_idx];
3647
3648 ret = set_hem_to_hw(hr_dev, obj, bt_ba, table->type, step_idx);
3649 }
3650
3651 return ret;
3652 }
3653
hns_roce_v2_clear_hem(struct hns_roce_dev * hr_dev,struct hns_roce_hem_table * table,int obj,int step_idx)3654 static int hns_roce_v2_clear_hem(struct hns_roce_dev *hr_dev,
3655 struct hns_roce_hem_table *table, int obj,
3656 int step_idx)
3657 {
3658 struct device *dev = hr_dev->dev;
3659 struct hns_roce_cmd_mailbox *mailbox;
3660 int ret;
3661 u16 op = 0xff;
3662
3663 if (!hns_roce_check_whether_mhop(hr_dev, table->type))
3664 return 0;
3665
3666 switch (table->type) {
3667 case HEM_TYPE_QPC:
3668 op = HNS_ROCE_CMD_DESTROY_QPC_BT0;
3669 break;
3670 case HEM_TYPE_MTPT:
3671 op = HNS_ROCE_CMD_DESTROY_MPT_BT0;
3672 break;
3673 case HEM_TYPE_CQC:
3674 op = HNS_ROCE_CMD_DESTROY_CQC_BT0;
3675 break;
3676 case HEM_TYPE_SCCC:
3677 case HEM_TYPE_QPC_TIMER:
3678 case HEM_TYPE_CQC_TIMER:
3679 break;
3680 case HEM_TYPE_SRQC:
3681 op = HNS_ROCE_CMD_DESTROY_SRQC_BT0;
3682 break;
3683 default:
3684 dev_warn(dev, "table %u not to be destroyed by mailbox!\n",
3685 table->type);
3686 return 0;
3687 }
3688
3689 if (table->type == HEM_TYPE_SCCC ||
3690 table->type == HEM_TYPE_QPC_TIMER ||
3691 table->type == HEM_TYPE_CQC_TIMER)
3692 return 0;
3693
3694 op += step_idx;
3695
3696 mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
3697 if (IS_ERR(mailbox))
3698 return PTR_ERR(mailbox);
3699
3700 /* configure the tag and op */
3701 ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, obj, 0, op,
3702 HNS_ROCE_CMD_TIMEOUT_MSECS);
3703
3704 hns_roce_free_cmd_mailbox(hr_dev, mailbox);
3705 return ret;
3706 }
3707
hns_roce_v2_qp_modify(struct hns_roce_dev * hr_dev,struct hns_roce_v2_qp_context * context,struct hns_roce_v2_qp_context * qpc_mask,struct hns_roce_qp * hr_qp)3708 static int hns_roce_v2_qp_modify(struct hns_roce_dev *hr_dev,
3709 struct hns_roce_v2_qp_context *context,
3710 struct hns_roce_v2_qp_context *qpc_mask,
3711 struct hns_roce_qp *hr_qp)
3712 {
3713 struct hns_roce_cmd_mailbox *mailbox;
3714 int qpc_size;
3715 int ret;
3716
3717 mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
3718 if (IS_ERR(mailbox))
3719 return PTR_ERR(mailbox);
3720
3721 /* The qpc size of HIP08 is only 256B, which is half of HIP09 */
3722 qpc_size = hr_dev->caps.qpc_sz;
3723 memcpy(mailbox->buf, context, qpc_size);
3724 memcpy(mailbox->buf + qpc_size, qpc_mask, qpc_size);
3725
3726 ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0, hr_qp->qpn, 0,
3727 HNS_ROCE_CMD_MODIFY_QPC,
3728 HNS_ROCE_CMD_TIMEOUT_MSECS);
3729
3730 hns_roce_free_cmd_mailbox(hr_dev, mailbox);
3731
3732 return ret;
3733 }
3734
set_access_flags(struct hns_roce_qp * hr_qp,struct hns_roce_v2_qp_context * context,struct hns_roce_v2_qp_context * qpc_mask,const struct ib_qp_attr * attr,int attr_mask)3735 static void set_access_flags(struct hns_roce_qp *hr_qp,
3736 struct hns_roce_v2_qp_context *context,
3737 struct hns_roce_v2_qp_context *qpc_mask,
3738 const struct ib_qp_attr *attr, int attr_mask)
3739 {
3740 u8 dest_rd_atomic;
3741 u32 access_flags;
3742
3743 dest_rd_atomic = (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) ?
3744 attr->max_dest_rd_atomic : hr_qp->resp_depth;
3745
3746 access_flags = (attr_mask & IB_QP_ACCESS_FLAGS) ?
3747 attr->qp_access_flags : hr_qp->atomic_rd_en;
3748
3749 if (!dest_rd_atomic)
3750 access_flags &= IB_ACCESS_REMOTE_WRITE;
3751
3752 roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RRE_S,
3753 !!(access_flags & IB_ACCESS_REMOTE_READ));
3754 roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RRE_S, 0);
3755
3756 roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RWE_S,
3757 !!(access_flags & IB_ACCESS_REMOTE_WRITE));
3758 roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RWE_S, 0);
3759
3760 roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_ATE_S,
3761 !!(access_flags & IB_ACCESS_REMOTE_ATOMIC));
3762 roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_ATE_S, 0);
3763 roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_EXT_ATE_S,
3764 !!(access_flags & IB_ACCESS_REMOTE_ATOMIC));
3765 roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_EXT_ATE_S, 0);
3766 }
3767
set_qpc_wqe_cnt(struct hns_roce_qp * hr_qp,struct hns_roce_v2_qp_context * context,struct hns_roce_v2_qp_context * qpc_mask)3768 static void set_qpc_wqe_cnt(struct hns_roce_qp *hr_qp,
3769 struct hns_roce_v2_qp_context *context,
3770 struct hns_roce_v2_qp_context *qpc_mask)
3771 {
3772 roce_set_field(context->byte_4_sqpn_tst,
3773 V2_QPC_BYTE_4_SGE_SHIFT_M, V2_QPC_BYTE_4_SGE_SHIFT_S,
3774 to_hr_hem_entries_shift(hr_qp->sge.sge_cnt,
3775 hr_qp->sge.sge_shift));
3776
3777 roce_set_field(context->byte_20_smac_sgid_idx,
3778 V2_QPC_BYTE_20_SQ_SHIFT_M, V2_QPC_BYTE_20_SQ_SHIFT_S,
3779 ilog2(hr_qp->sq.wqe_cnt));
3780
3781 roce_set_field(context->byte_20_smac_sgid_idx,
3782 V2_QPC_BYTE_20_RQ_SHIFT_M, V2_QPC_BYTE_20_RQ_SHIFT_S,
3783 ilog2(hr_qp->rq.wqe_cnt));
3784 }
3785
modify_qp_reset_to_init(struct ib_qp * ibqp,const struct ib_qp_attr * attr,int attr_mask,struct hns_roce_v2_qp_context * context,struct hns_roce_v2_qp_context * qpc_mask)3786 static void modify_qp_reset_to_init(struct ib_qp *ibqp,
3787 const struct ib_qp_attr *attr,
3788 int attr_mask,
3789 struct hns_roce_v2_qp_context *context,
3790 struct hns_roce_v2_qp_context *qpc_mask)
3791 {
3792 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
3793 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
3794
3795 /*
3796 * In v2 engine, software pass context and context mask to hardware
3797 * when modifying qp. If software need modify some fields in context,
3798 * we should set all bits of the relevant fields in context mask to
3799 * 0 at the same time, else set them to 0x1.
3800 */
3801 roce_set_field(context->byte_4_sqpn_tst, V2_QPC_BYTE_4_TST_M,
3802 V2_QPC_BYTE_4_TST_S, to_hr_qp_type(hr_qp->ibqp.qp_type));
3803
3804 roce_set_field(context->byte_4_sqpn_tst, V2_QPC_BYTE_4_SQPN_M,
3805 V2_QPC_BYTE_4_SQPN_S, hr_qp->qpn);
3806
3807 roce_set_field(context->byte_16_buf_ba_pg_sz, V2_QPC_BYTE_16_PD_M,
3808 V2_QPC_BYTE_16_PD_S, to_hr_pd(ibqp->pd)->pdn);
3809
3810 roce_set_field(context->byte_20_smac_sgid_idx, V2_QPC_BYTE_20_RQWS_M,
3811 V2_QPC_BYTE_20_RQWS_S, ilog2(hr_qp->rq.max_gs));
3812
3813 set_qpc_wqe_cnt(hr_qp, context, qpc_mask);
3814
3815 /* No VLAN need to set 0xFFF */
3816 roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_VLAN_ID_M,
3817 V2_QPC_BYTE_24_VLAN_ID_S, 0xfff);
3818
3819 if (hr_qp->en_flags & HNS_ROCE_QP_CAP_RQ_RECORD_DB)
3820 roce_set_bit(context->byte_68_rq_db,
3821 V2_QPC_BYTE_68_RQ_RECORD_EN_S, 1);
3822
3823 roce_set_field(context->byte_68_rq_db,
3824 V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_M,
3825 V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_S,
3826 ((u32)hr_qp->rdb.dma) >> 1);
3827 context->rq_db_record_addr = cpu_to_le32(hr_qp->rdb.dma >> 32);
3828
3829 roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RQIE_S,
3830 (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE) ? 1 : 0);
3831
3832 roce_set_field(context->byte_80_rnr_rx_cqn, V2_QPC_BYTE_80_RX_CQN_M,
3833 V2_QPC_BYTE_80_RX_CQN_S, to_hr_cq(ibqp->recv_cq)->cqn);
3834 if (ibqp->srq) {
3835 roce_set_field(context->byte_76_srqn_op_en,
3836 V2_QPC_BYTE_76_SRQN_M, V2_QPC_BYTE_76_SRQN_S,
3837 to_hr_srq(ibqp->srq)->srqn);
3838 roce_set_bit(context->byte_76_srqn_op_en,
3839 V2_QPC_BYTE_76_SRQ_EN_S, 1);
3840 }
3841
3842 roce_set_bit(context->byte_172_sq_psn, V2_QPC_BYTE_172_FRE_S, 1);
3843
3844 hr_qp->access_flags = attr->qp_access_flags;
3845 roce_set_field(context->byte_252_err_txcqn, V2_QPC_BYTE_252_TX_CQN_M,
3846 V2_QPC_BYTE_252_TX_CQN_S, to_hr_cq(ibqp->send_cq)->cqn);
3847 }
3848
modify_qp_init_to_init(struct ib_qp * ibqp,const struct ib_qp_attr * attr,int attr_mask,struct hns_roce_v2_qp_context * context,struct hns_roce_v2_qp_context * qpc_mask)3849 static void modify_qp_init_to_init(struct ib_qp *ibqp,
3850 const struct ib_qp_attr *attr, int attr_mask,
3851 struct hns_roce_v2_qp_context *context,
3852 struct hns_roce_v2_qp_context *qpc_mask)
3853 {
3854 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
3855
3856 /*
3857 * In v2 engine, software pass context and context mask to hardware
3858 * when modifying qp. If software need modify some fields in context,
3859 * we should set all bits of the relevant fields in context mask to
3860 * 0 at the same time, else set them to 0x1.
3861 */
3862 roce_set_field(context->byte_4_sqpn_tst, V2_QPC_BYTE_4_TST_M,
3863 V2_QPC_BYTE_4_TST_S, to_hr_qp_type(hr_qp->ibqp.qp_type));
3864 roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_TST_M,
3865 V2_QPC_BYTE_4_TST_S, 0);
3866
3867 if (attr_mask & IB_QP_ACCESS_FLAGS) {
3868 roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RRE_S,
3869 !!(attr->qp_access_flags & IB_ACCESS_REMOTE_READ));
3870 roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RRE_S,
3871 0);
3872
3873 roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RWE_S,
3874 !!(attr->qp_access_flags &
3875 IB_ACCESS_REMOTE_WRITE));
3876 roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RWE_S,
3877 0);
3878
3879 roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_ATE_S,
3880 !!(attr->qp_access_flags &
3881 IB_ACCESS_REMOTE_ATOMIC));
3882 roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_ATE_S,
3883 0);
3884 roce_set_bit(context->byte_76_srqn_op_en,
3885 V2_QPC_BYTE_76_EXT_ATE_S,
3886 !!(attr->qp_access_flags &
3887 IB_ACCESS_REMOTE_ATOMIC));
3888 roce_set_bit(qpc_mask->byte_76_srqn_op_en,
3889 V2_QPC_BYTE_76_EXT_ATE_S, 0);
3890 } else {
3891 roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RRE_S,
3892 !!(hr_qp->access_flags & IB_ACCESS_REMOTE_READ));
3893 roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RRE_S,
3894 0);
3895
3896 roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RWE_S,
3897 !!(hr_qp->access_flags & IB_ACCESS_REMOTE_WRITE));
3898 roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RWE_S,
3899 0);
3900
3901 roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_ATE_S,
3902 !!(hr_qp->access_flags & IB_ACCESS_REMOTE_ATOMIC));
3903 roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_ATE_S,
3904 0);
3905 roce_set_bit(context->byte_76_srqn_op_en,
3906 V2_QPC_BYTE_76_EXT_ATE_S,
3907 !!(hr_qp->access_flags & IB_ACCESS_REMOTE_ATOMIC));
3908 roce_set_bit(qpc_mask->byte_76_srqn_op_en,
3909 V2_QPC_BYTE_76_EXT_ATE_S, 0);
3910 }
3911
3912 roce_set_field(context->byte_16_buf_ba_pg_sz, V2_QPC_BYTE_16_PD_M,
3913 V2_QPC_BYTE_16_PD_S, to_hr_pd(ibqp->pd)->pdn);
3914 roce_set_field(qpc_mask->byte_16_buf_ba_pg_sz, V2_QPC_BYTE_16_PD_M,
3915 V2_QPC_BYTE_16_PD_S, 0);
3916
3917 roce_set_field(context->byte_80_rnr_rx_cqn, V2_QPC_BYTE_80_RX_CQN_M,
3918 V2_QPC_BYTE_80_RX_CQN_S, to_hr_cq(ibqp->recv_cq)->cqn);
3919 roce_set_field(qpc_mask->byte_80_rnr_rx_cqn, V2_QPC_BYTE_80_RX_CQN_M,
3920 V2_QPC_BYTE_80_RX_CQN_S, 0);
3921
3922 roce_set_field(context->byte_252_err_txcqn, V2_QPC_BYTE_252_TX_CQN_M,
3923 V2_QPC_BYTE_252_TX_CQN_S, to_hr_cq(ibqp->send_cq)->cqn);
3924 roce_set_field(qpc_mask->byte_252_err_txcqn, V2_QPC_BYTE_252_TX_CQN_M,
3925 V2_QPC_BYTE_252_TX_CQN_S, 0);
3926
3927 if (ibqp->srq) {
3928 roce_set_bit(context->byte_76_srqn_op_en,
3929 V2_QPC_BYTE_76_SRQ_EN_S, 1);
3930 roce_set_bit(qpc_mask->byte_76_srqn_op_en,
3931 V2_QPC_BYTE_76_SRQ_EN_S, 0);
3932 roce_set_field(context->byte_76_srqn_op_en,
3933 V2_QPC_BYTE_76_SRQN_M, V2_QPC_BYTE_76_SRQN_S,
3934 to_hr_srq(ibqp->srq)->srqn);
3935 roce_set_field(qpc_mask->byte_76_srqn_op_en,
3936 V2_QPC_BYTE_76_SRQN_M, V2_QPC_BYTE_76_SRQN_S, 0);
3937 }
3938
3939 roce_set_field(context->byte_4_sqpn_tst, V2_QPC_BYTE_4_SQPN_M,
3940 V2_QPC_BYTE_4_SQPN_S, hr_qp->qpn);
3941 roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_SQPN_M,
3942 V2_QPC_BYTE_4_SQPN_S, 0);
3943
3944 if (attr_mask & IB_QP_DEST_QPN) {
3945 roce_set_field(context->byte_56_dqpn_err, V2_QPC_BYTE_56_DQPN_M,
3946 V2_QPC_BYTE_56_DQPN_S, hr_qp->qpn);
3947 roce_set_field(qpc_mask->byte_56_dqpn_err,
3948 V2_QPC_BYTE_56_DQPN_M, V2_QPC_BYTE_56_DQPN_S, 0);
3949 }
3950 }
3951
config_qp_rq_buf(struct hns_roce_dev * hr_dev,struct hns_roce_qp * hr_qp,struct hns_roce_v2_qp_context * context,struct hns_roce_v2_qp_context * qpc_mask)3952 static int config_qp_rq_buf(struct hns_roce_dev *hr_dev,
3953 struct hns_roce_qp *hr_qp,
3954 struct hns_roce_v2_qp_context *context,
3955 struct hns_roce_v2_qp_context *qpc_mask)
3956 {
3957 u64 mtts[MTT_MIN_COUNT] = { 0 };
3958 u64 wqe_sge_ba;
3959 int count;
3960
3961 /* Search qp buf's mtts */
3962 count = hns_roce_mtr_find(hr_dev, &hr_qp->mtr, hr_qp->rq.offset, mtts,
3963 MTT_MIN_COUNT, &wqe_sge_ba);
3964 if (hr_qp->rq.wqe_cnt && count < 1) {
3965 ibdev_err(&hr_dev->ib_dev,
3966 "failed to find RQ WQE, QPN = 0x%lx.\n", hr_qp->qpn);
3967 return -EINVAL;
3968 }
3969
3970 context->wqe_sge_ba = cpu_to_le32(wqe_sge_ba >> 3);
3971 qpc_mask->wqe_sge_ba = 0;
3972
3973 /*
3974 * In v2 engine, software pass context and context mask to hardware
3975 * when modifying qp. If software need modify some fields in context,
3976 * we should set all bits of the relevant fields in context mask to
3977 * 0 at the same time, else set them to 0x1.
3978 */
3979 roce_set_field(context->byte_12_sq_hop, V2_QPC_BYTE_12_WQE_SGE_BA_M,
3980 V2_QPC_BYTE_12_WQE_SGE_BA_S, wqe_sge_ba >> (32 + 3));
3981 roce_set_field(qpc_mask->byte_12_sq_hop, V2_QPC_BYTE_12_WQE_SGE_BA_M,
3982 V2_QPC_BYTE_12_WQE_SGE_BA_S, 0);
3983
3984 roce_set_field(context->byte_12_sq_hop, V2_QPC_BYTE_12_SQ_HOP_NUM_M,
3985 V2_QPC_BYTE_12_SQ_HOP_NUM_S,
3986 to_hr_hem_hopnum(hr_dev->caps.wqe_sq_hop_num,
3987 hr_qp->sq.wqe_cnt));
3988 roce_set_field(qpc_mask->byte_12_sq_hop, V2_QPC_BYTE_12_SQ_HOP_NUM_M,
3989 V2_QPC_BYTE_12_SQ_HOP_NUM_S, 0);
3990
3991 roce_set_field(context->byte_20_smac_sgid_idx,
3992 V2_QPC_BYTE_20_SGE_HOP_NUM_M,
3993 V2_QPC_BYTE_20_SGE_HOP_NUM_S,
3994 to_hr_hem_hopnum(hr_dev->caps.wqe_sge_hop_num,
3995 hr_qp->sge.sge_cnt));
3996 roce_set_field(qpc_mask->byte_20_smac_sgid_idx,
3997 V2_QPC_BYTE_20_SGE_HOP_NUM_M,
3998 V2_QPC_BYTE_20_SGE_HOP_NUM_S, 0);
3999
4000 roce_set_field(context->byte_20_smac_sgid_idx,
4001 V2_QPC_BYTE_20_RQ_HOP_NUM_M,
4002 V2_QPC_BYTE_20_RQ_HOP_NUM_S,
4003 to_hr_hem_hopnum(hr_dev->caps.wqe_rq_hop_num,
4004 hr_qp->rq.wqe_cnt));
4005
4006 roce_set_field(qpc_mask->byte_20_smac_sgid_idx,
4007 V2_QPC_BYTE_20_RQ_HOP_NUM_M,
4008 V2_QPC_BYTE_20_RQ_HOP_NUM_S, 0);
4009
4010 roce_set_field(context->byte_16_buf_ba_pg_sz,
4011 V2_QPC_BYTE_16_WQE_SGE_BA_PG_SZ_M,
4012 V2_QPC_BYTE_16_WQE_SGE_BA_PG_SZ_S,
4013 to_hr_hw_page_shift(hr_qp->mtr.hem_cfg.ba_pg_shift));
4014 roce_set_field(qpc_mask->byte_16_buf_ba_pg_sz,
4015 V2_QPC_BYTE_16_WQE_SGE_BA_PG_SZ_M,
4016 V2_QPC_BYTE_16_WQE_SGE_BA_PG_SZ_S, 0);
4017
4018 roce_set_field(context->byte_16_buf_ba_pg_sz,
4019 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_M,
4020 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_S,
4021 to_hr_hw_page_shift(hr_qp->mtr.hem_cfg.buf_pg_shift));
4022 roce_set_field(qpc_mask->byte_16_buf_ba_pg_sz,
4023 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_M,
4024 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_S, 0);
4025
4026 context->rq_cur_blk_addr = cpu_to_le32(to_hr_hw_page_addr(mtts[0]));
4027 qpc_mask->rq_cur_blk_addr = 0;
4028
4029 roce_set_field(context->byte_92_srq_info,
4030 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_M,
4031 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_S,
4032 upper_32_bits(to_hr_hw_page_addr(mtts[0])));
4033 roce_set_field(qpc_mask->byte_92_srq_info,
4034 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_M,
4035 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_S, 0);
4036
4037 context->rq_nxt_blk_addr = cpu_to_le32(to_hr_hw_page_addr(mtts[1]));
4038 qpc_mask->rq_nxt_blk_addr = 0;
4039
4040 roce_set_field(context->byte_104_rq_sge,
4041 V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_M,
4042 V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_S,
4043 upper_32_bits(to_hr_hw_page_addr(mtts[1])));
4044 roce_set_field(qpc_mask->byte_104_rq_sge,
4045 V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_M,
4046 V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_S, 0);
4047
4048 roce_set_field(context->byte_84_rq_ci_pi,
4049 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M,
4050 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S, hr_qp->rq.head);
4051 roce_set_field(qpc_mask->byte_84_rq_ci_pi,
4052 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M,
4053 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S, 0);
4054
4055 roce_set_field(qpc_mask->byte_84_rq_ci_pi,
4056 V2_QPC_BYTE_84_RQ_CONSUMER_IDX_M,
4057 V2_QPC_BYTE_84_RQ_CONSUMER_IDX_S, 0);
4058
4059 return 0;
4060 }
4061
config_qp_sq_buf(struct hns_roce_dev * hr_dev,struct hns_roce_qp * hr_qp,struct hns_roce_v2_qp_context * context,struct hns_roce_v2_qp_context * qpc_mask)4062 static int config_qp_sq_buf(struct hns_roce_dev *hr_dev,
4063 struct hns_roce_qp *hr_qp,
4064 struct hns_roce_v2_qp_context *context,
4065 struct hns_roce_v2_qp_context *qpc_mask)
4066 {
4067 struct ib_device *ibdev = &hr_dev->ib_dev;
4068 u64 sge_cur_blk = 0;
4069 u64 sq_cur_blk = 0;
4070 int count;
4071
4072 /* search qp buf's mtts */
4073 count = hns_roce_mtr_find(hr_dev, &hr_qp->mtr, 0, &sq_cur_blk, 1, NULL);
4074 if (count < 1) {
4075 ibdev_err(ibdev, "failed to find QP(0x%lx) SQ buf.\n",
4076 hr_qp->qpn);
4077 return -EINVAL;
4078 }
4079 if (hr_qp->sge.sge_cnt > 0) {
4080 count = hns_roce_mtr_find(hr_dev, &hr_qp->mtr,
4081 hr_qp->sge.offset,
4082 &sge_cur_blk, 1, NULL);
4083 if (count < 1) {
4084 ibdev_err(ibdev, "failed to find QP(0x%lx) SGE buf.\n",
4085 hr_qp->qpn);
4086 return -EINVAL;
4087 }
4088 }
4089
4090 /*
4091 * In v2 engine, software pass context and context mask to hardware
4092 * when modifying qp. If software need modify some fields in context,
4093 * we should set all bits of the relevant fields in context mask to
4094 * 0 at the same time, else set them to 0x1.
4095 */
4096 context->sq_cur_blk_addr = cpu_to_le32(to_hr_hw_page_addr(sq_cur_blk));
4097 roce_set_field(context->byte_168_irrl_idx,
4098 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_M,
4099 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_S,
4100 upper_32_bits(to_hr_hw_page_addr(sq_cur_blk)));
4101 qpc_mask->sq_cur_blk_addr = 0;
4102 roce_set_field(qpc_mask->byte_168_irrl_idx,
4103 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_M,
4104 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_S, 0);
4105
4106 context->sq_cur_sge_blk_addr =
4107 cpu_to_le32(to_hr_hw_page_addr(sge_cur_blk));
4108 roce_set_field(context->byte_184_irrl_idx,
4109 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_M,
4110 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_S,
4111 upper_32_bits(to_hr_hw_page_addr(sge_cur_blk)));
4112 qpc_mask->sq_cur_sge_blk_addr = 0;
4113 roce_set_field(qpc_mask->byte_184_irrl_idx,
4114 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_M,
4115 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_S, 0);
4116
4117 context->rx_sq_cur_blk_addr =
4118 cpu_to_le32(to_hr_hw_page_addr(sq_cur_blk));
4119 roce_set_field(context->byte_232_irrl_sge,
4120 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_M,
4121 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_S,
4122 upper_32_bits(to_hr_hw_page_addr(sq_cur_blk)));
4123 qpc_mask->rx_sq_cur_blk_addr = 0;
4124 roce_set_field(qpc_mask->byte_232_irrl_sge,
4125 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_M,
4126 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_S, 0);
4127
4128 return 0;
4129 }
4130
get_mtu(struct ib_qp * ibqp,const struct ib_qp_attr * attr)4131 static inline enum ib_mtu get_mtu(struct ib_qp *ibqp,
4132 const struct ib_qp_attr *attr)
4133 {
4134 if (ibqp->qp_type == IB_QPT_GSI || ibqp->qp_type == IB_QPT_UD)
4135 return IB_MTU_4096;
4136
4137 return attr->path_mtu;
4138 }
4139
modify_qp_init_to_rtr(struct ib_qp * ibqp,const struct ib_qp_attr * attr,int attr_mask,struct hns_roce_v2_qp_context * context,struct hns_roce_v2_qp_context * qpc_mask)4140 static int modify_qp_init_to_rtr(struct ib_qp *ibqp,
4141 const struct ib_qp_attr *attr, int attr_mask,
4142 struct hns_roce_v2_qp_context *context,
4143 struct hns_roce_v2_qp_context *qpc_mask)
4144 {
4145 const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
4146 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
4147 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
4148 struct ib_device *ibdev = &hr_dev->ib_dev;
4149 dma_addr_t trrl_ba;
4150 dma_addr_t irrl_ba;
4151 enum ib_mtu mtu;
4152 u8 lp_pktn_ini;
4153 u8 port_num;
4154 u64 *mtts;
4155 u8 *dmac;
4156 u8 *smac;
4157 int port;
4158 int ret;
4159
4160 ret = config_qp_rq_buf(hr_dev, hr_qp, context, qpc_mask);
4161 if (ret) {
4162 ibdev_err(ibdev, "failed to config rq buf, ret = %d.\n", ret);
4163 return ret;
4164 }
4165
4166 /* Search IRRL's mtts */
4167 mtts = hns_roce_table_find(hr_dev, &hr_dev->qp_table.irrl_table,
4168 hr_qp->qpn, &irrl_ba);
4169 if (!mtts) {
4170 ibdev_err(ibdev, "failed to find qp irrl_table.\n");
4171 return -EINVAL;
4172 }
4173
4174 /* Search TRRL's mtts */
4175 mtts = hns_roce_table_find(hr_dev, &hr_dev->qp_table.trrl_table,
4176 hr_qp->qpn, &trrl_ba);
4177 if (!mtts) {
4178 ibdev_err(ibdev, "failed to find qp trrl_table.\n");
4179 return -EINVAL;
4180 }
4181
4182 if (attr_mask & IB_QP_ALT_PATH) {
4183 ibdev_err(ibdev, "INIT2RTR attr_mask (0x%x) error.\n",
4184 attr_mask);
4185 return -EINVAL;
4186 }
4187
4188 roce_set_field(context->byte_132_trrl, V2_QPC_BYTE_132_TRRL_BA_M,
4189 V2_QPC_BYTE_132_TRRL_BA_S, trrl_ba >> 4);
4190 roce_set_field(qpc_mask->byte_132_trrl, V2_QPC_BYTE_132_TRRL_BA_M,
4191 V2_QPC_BYTE_132_TRRL_BA_S, 0);
4192 context->trrl_ba = cpu_to_le32(trrl_ba >> (16 + 4));
4193 qpc_mask->trrl_ba = 0;
4194 roce_set_field(context->byte_140_raq, V2_QPC_BYTE_140_TRRL_BA_M,
4195 V2_QPC_BYTE_140_TRRL_BA_S,
4196 (u32)(trrl_ba >> (32 + 16 + 4)));
4197 roce_set_field(qpc_mask->byte_140_raq, V2_QPC_BYTE_140_TRRL_BA_M,
4198 V2_QPC_BYTE_140_TRRL_BA_S, 0);
4199
4200 context->irrl_ba = cpu_to_le32(irrl_ba >> 6);
4201 qpc_mask->irrl_ba = 0;
4202 roce_set_field(context->byte_208_irrl, V2_QPC_BYTE_208_IRRL_BA_M,
4203 V2_QPC_BYTE_208_IRRL_BA_S,
4204 irrl_ba >> (32 + 6));
4205 roce_set_field(qpc_mask->byte_208_irrl, V2_QPC_BYTE_208_IRRL_BA_M,
4206 V2_QPC_BYTE_208_IRRL_BA_S, 0);
4207
4208 roce_set_bit(context->byte_208_irrl, V2_QPC_BYTE_208_RMT_E2E_S, 1);
4209 roce_set_bit(qpc_mask->byte_208_irrl, V2_QPC_BYTE_208_RMT_E2E_S, 0);
4210
4211 roce_set_bit(context->byte_252_err_txcqn, V2_QPC_BYTE_252_SIG_TYPE_S,
4212 hr_qp->sq_signal_bits);
4213 roce_set_bit(qpc_mask->byte_252_err_txcqn, V2_QPC_BYTE_252_SIG_TYPE_S,
4214 0);
4215
4216 port = (attr_mask & IB_QP_PORT) ? (attr->port_num - 1) : hr_qp->port;
4217
4218 smac = (u8 *)hr_dev->dev_addr[port];
4219 dmac = (u8 *)attr->ah_attr.roce.dmac;
4220 /* when dmac equals smac or loop_idc is 1, it should loopback */
4221 if (ether_addr_equal_unaligned(dmac, smac) ||
4222 hr_dev->loop_idc == 0x1) {
4223 roce_set_bit(context->byte_28_at_fl, V2_QPC_BYTE_28_LBI_S, 1);
4224 roce_set_bit(qpc_mask->byte_28_at_fl, V2_QPC_BYTE_28_LBI_S, 0);
4225 }
4226
4227 if (attr_mask & IB_QP_DEST_QPN) {
4228 roce_set_field(context->byte_56_dqpn_err, V2_QPC_BYTE_56_DQPN_M,
4229 V2_QPC_BYTE_56_DQPN_S, attr->dest_qp_num);
4230 roce_set_field(qpc_mask->byte_56_dqpn_err,
4231 V2_QPC_BYTE_56_DQPN_M, V2_QPC_BYTE_56_DQPN_S, 0);
4232 }
4233
4234 /* Configure GID index */
4235 port_num = rdma_ah_get_port_num(&attr->ah_attr);
4236 roce_set_field(context->byte_20_smac_sgid_idx,
4237 V2_QPC_BYTE_20_SGID_IDX_M, V2_QPC_BYTE_20_SGID_IDX_S,
4238 hns_get_gid_index(hr_dev, port_num - 1,
4239 grh->sgid_index));
4240 roce_set_field(qpc_mask->byte_20_smac_sgid_idx,
4241 V2_QPC_BYTE_20_SGID_IDX_M, V2_QPC_BYTE_20_SGID_IDX_S, 0);
4242
4243 memcpy(&(context->dmac), dmac, sizeof(u32));
4244 roce_set_field(context->byte_52_udpspn_dmac, V2_QPC_BYTE_52_DMAC_M,
4245 V2_QPC_BYTE_52_DMAC_S, *((u16 *)(&dmac[4])));
4246 qpc_mask->dmac = 0;
4247 roce_set_field(qpc_mask->byte_52_udpspn_dmac, V2_QPC_BYTE_52_DMAC_M,
4248 V2_QPC_BYTE_52_DMAC_S, 0);
4249
4250 mtu = get_mtu(ibqp, attr);
4251 hr_qp->path_mtu = mtu;
4252
4253 if (attr_mask & IB_QP_PATH_MTU) {
4254 roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_MTU_M,
4255 V2_QPC_BYTE_24_MTU_S, mtu);
4256 roce_set_field(qpc_mask->byte_24_mtu_tc, V2_QPC_BYTE_24_MTU_M,
4257 V2_QPC_BYTE_24_MTU_S, 0);
4258 }
4259
4260 #define MAX_LP_MSG_LEN 65536
4261 /* MTU * (2 ^ LP_PKTN_INI) shouldn't be bigger than 64KB */
4262 lp_pktn_ini = ilog2(MAX_LP_MSG_LEN / ib_mtu_enum_to_int(mtu));
4263
4264 roce_set_field(context->byte_56_dqpn_err, V2_QPC_BYTE_56_LP_PKTN_INI_M,
4265 V2_QPC_BYTE_56_LP_PKTN_INI_S, lp_pktn_ini);
4266 roce_set_field(qpc_mask->byte_56_dqpn_err, V2_QPC_BYTE_56_LP_PKTN_INI_M,
4267 V2_QPC_BYTE_56_LP_PKTN_INI_S, 0);
4268
4269 /* ACK_REQ_FREQ should be larger than or equal to LP_PKTN_INI */
4270 roce_set_field(context->byte_172_sq_psn, V2_QPC_BYTE_172_ACK_REQ_FREQ_M,
4271 V2_QPC_BYTE_172_ACK_REQ_FREQ_S, lp_pktn_ini);
4272 roce_set_field(qpc_mask->byte_172_sq_psn,
4273 V2_QPC_BYTE_172_ACK_REQ_FREQ_M,
4274 V2_QPC_BYTE_172_ACK_REQ_FREQ_S, 0);
4275
4276 roce_set_bit(qpc_mask->byte_108_rx_reqepsn,
4277 V2_QPC_BYTE_108_RX_REQ_PSN_ERR_S, 0);
4278 roce_set_field(qpc_mask->byte_96_rx_reqmsn, V2_QPC_BYTE_96_RX_REQ_MSN_M,
4279 V2_QPC_BYTE_96_RX_REQ_MSN_S, 0);
4280 roce_set_field(qpc_mask->byte_108_rx_reqepsn,
4281 V2_QPC_BYTE_108_RX_REQ_LAST_OPTYPE_M,
4282 V2_QPC_BYTE_108_RX_REQ_LAST_OPTYPE_S, 0);
4283
4284 context->rq_rnr_timer = 0;
4285 qpc_mask->rq_rnr_timer = 0;
4286
4287 roce_set_field(qpc_mask->byte_132_trrl, V2_QPC_BYTE_132_TRRL_HEAD_MAX_M,
4288 V2_QPC_BYTE_132_TRRL_HEAD_MAX_S, 0);
4289 roce_set_field(qpc_mask->byte_132_trrl, V2_QPC_BYTE_132_TRRL_TAIL_MAX_M,
4290 V2_QPC_BYTE_132_TRRL_TAIL_MAX_S, 0);
4291
4292 /* rocee send 2^lp_sgen_ini segs every time */
4293 roce_set_field(context->byte_168_irrl_idx,
4294 V2_QPC_BYTE_168_LP_SGEN_INI_M,
4295 V2_QPC_BYTE_168_LP_SGEN_INI_S, 3);
4296 roce_set_field(qpc_mask->byte_168_irrl_idx,
4297 V2_QPC_BYTE_168_LP_SGEN_INI_M,
4298 V2_QPC_BYTE_168_LP_SGEN_INI_S, 0);
4299
4300 return 0;
4301 }
4302
modify_qp_rtr_to_rts(struct ib_qp * ibqp,const struct ib_qp_attr * attr,int attr_mask,struct hns_roce_v2_qp_context * context,struct hns_roce_v2_qp_context * qpc_mask)4303 static int modify_qp_rtr_to_rts(struct ib_qp *ibqp,
4304 const struct ib_qp_attr *attr, int attr_mask,
4305 struct hns_roce_v2_qp_context *context,
4306 struct hns_roce_v2_qp_context *qpc_mask)
4307 {
4308 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
4309 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
4310 struct ib_device *ibdev = &hr_dev->ib_dev;
4311 int ret;
4312
4313 /* Not support alternate path and path migration */
4314 if (attr_mask & (IB_QP_ALT_PATH | IB_QP_PATH_MIG_STATE)) {
4315 ibdev_err(ibdev, "RTR2RTS attr_mask (0x%x)error\n", attr_mask);
4316 return -EINVAL;
4317 }
4318
4319 ret = config_qp_sq_buf(hr_dev, hr_qp, context, qpc_mask);
4320 if (ret) {
4321 ibdev_err(ibdev, "failed to config sq buf, ret = %d.\n", ret);
4322 return ret;
4323 }
4324
4325 /*
4326 * Set some fields in context to zero, Because the default values
4327 * of all fields in context are zero, we need not set them to 0 again.
4328 * but we should set the relevant fields of context mask to 0.
4329 */
4330 roce_set_field(qpc_mask->byte_232_irrl_sge,
4331 V2_QPC_BYTE_232_IRRL_SGE_IDX_M,
4332 V2_QPC_BYTE_232_IRRL_SGE_IDX_S, 0);
4333
4334 roce_set_field(qpc_mask->byte_240_irrl_tail,
4335 V2_QPC_BYTE_240_RX_ACK_MSN_M,
4336 V2_QPC_BYTE_240_RX_ACK_MSN_S, 0);
4337
4338 roce_set_field(qpc_mask->byte_248_ack_psn,
4339 V2_QPC_BYTE_248_ACK_LAST_OPTYPE_M,
4340 V2_QPC_BYTE_248_ACK_LAST_OPTYPE_S, 0);
4341 roce_set_bit(qpc_mask->byte_248_ack_psn,
4342 V2_QPC_BYTE_248_IRRL_PSN_VLD_S, 0);
4343 roce_set_field(qpc_mask->byte_248_ack_psn,
4344 V2_QPC_BYTE_248_IRRL_PSN_M,
4345 V2_QPC_BYTE_248_IRRL_PSN_S, 0);
4346
4347 roce_set_field(qpc_mask->byte_240_irrl_tail,
4348 V2_QPC_BYTE_240_IRRL_TAIL_REAL_M,
4349 V2_QPC_BYTE_240_IRRL_TAIL_REAL_S, 0);
4350
4351 roce_set_field(qpc_mask->byte_220_retry_psn_msn,
4352 V2_QPC_BYTE_220_RETRY_MSG_MSN_M,
4353 V2_QPC_BYTE_220_RETRY_MSG_MSN_S, 0);
4354
4355 roce_set_bit(qpc_mask->byte_248_ack_psn,
4356 V2_QPC_BYTE_248_RNR_RETRY_FLAG_S, 0);
4357
4358 roce_set_field(qpc_mask->byte_212_lsn, V2_QPC_BYTE_212_CHECK_FLG_M,
4359 V2_QPC_BYTE_212_CHECK_FLG_S, 0);
4360
4361 roce_set_field(context->byte_212_lsn, V2_QPC_BYTE_212_LSN_M,
4362 V2_QPC_BYTE_212_LSN_S, 0x100);
4363 roce_set_field(qpc_mask->byte_212_lsn, V2_QPC_BYTE_212_LSN_M,
4364 V2_QPC_BYTE_212_LSN_S, 0);
4365
4366 roce_set_field(qpc_mask->byte_196_sq_psn, V2_QPC_BYTE_196_IRRL_HEAD_M,
4367 V2_QPC_BYTE_196_IRRL_HEAD_S, 0);
4368
4369 return 0;
4370 }
4371
get_udp_sport(u32 fl,u32 lqpn,u32 rqpn)4372 static inline u16 get_udp_sport(u32 fl, u32 lqpn, u32 rqpn)
4373 {
4374 if (!fl)
4375 fl = rdma_calc_flow_label(lqpn, rqpn);
4376
4377 return rdma_flow_label_to_udp_sport(fl);
4378 }
4379
hns_roce_v2_set_path(struct ib_qp * ibqp,const struct ib_qp_attr * attr,int attr_mask,struct hns_roce_v2_qp_context * context,struct hns_roce_v2_qp_context * qpc_mask)4380 static int hns_roce_v2_set_path(struct ib_qp *ibqp,
4381 const struct ib_qp_attr *attr,
4382 int attr_mask,
4383 struct hns_roce_v2_qp_context *context,
4384 struct hns_roce_v2_qp_context *qpc_mask)
4385 {
4386 const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
4387 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
4388 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
4389 struct ib_device *ibdev = &hr_dev->ib_dev;
4390 const struct ib_gid_attr *gid_attr = NULL;
4391 int is_roce_protocol;
4392 u16 vlan_id = 0xffff;
4393 bool is_udp = false;
4394 u8 ib_port;
4395 u8 hr_port;
4396 int ret;
4397
4398 ib_port = (attr_mask & IB_QP_PORT) ? attr->port_num : hr_qp->port + 1;
4399 hr_port = ib_port - 1;
4400 is_roce_protocol = rdma_cap_eth_ah(&hr_dev->ib_dev, ib_port) &&
4401 rdma_ah_get_ah_flags(&attr->ah_attr) & IB_AH_GRH;
4402
4403 if (is_roce_protocol) {
4404 gid_attr = attr->ah_attr.grh.sgid_attr;
4405 ret = rdma_read_gid_l2_fields(gid_attr, &vlan_id, NULL);
4406 if (ret)
4407 return ret;
4408
4409 if (gid_attr)
4410 is_udp = (gid_attr->gid_type ==
4411 IB_GID_TYPE_ROCE_UDP_ENCAP);
4412 }
4413
4414 if (vlan_id < VLAN_N_VID) {
4415 roce_set_bit(context->byte_76_srqn_op_en,
4416 V2_QPC_BYTE_76_RQ_VLAN_EN_S, 1);
4417 roce_set_bit(qpc_mask->byte_76_srqn_op_en,
4418 V2_QPC_BYTE_76_RQ_VLAN_EN_S, 0);
4419 roce_set_bit(context->byte_168_irrl_idx,
4420 V2_QPC_BYTE_168_SQ_VLAN_EN_S, 1);
4421 roce_set_bit(qpc_mask->byte_168_irrl_idx,
4422 V2_QPC_BYTE_168_SQ_VLAN_EN_S, 0);
4423 }
4424
4425 roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_VLAN_ID_M,
4426 V2_QPC_BYTE_24_VLAN_ID_S, vlan_id);
4427 roce_set_field(qpc_mask->byte_24_mtu_tc, V2_QPC_BYTE_24_VLAN_ID_M,
4428 V2_QPC_BYTE_24_VLAN_ID_S, 0);
4429
4430 if (grh->sgid_index >= hr_dev->caps.gid_table_len[hr_port]) {
4431 ibdev_err(ibdev, "sgid_index(%u) too large. max is %d\n",
4432 grh->sgid_index, hr_dev->caps.gid_table_len[hr_port]);
4433 return -EINVAL;
4434 }
4435
4436 if (attr->ah_attr.type != RDMA_AH_ATTR_TYPE_ROCE) {
4437 ibdev_err(ibdev, "ah attr is not RDMA roce type\n");
4438 return -EINVAL;
4439 }
4440
4441 roce_set_field(context->byte_52_udpspn_dmac, V2_QPC_BYTE_52_UDPSPN_M,
4442 V2_QPC_BYTE_52_UDPSPN_S,
4443 is_udp ? get_udp_sport(grh->flow_label, ibqp->qp_num,
4444 attr->dest_qp_num) : 0);
4445
4446 roce_set_field(qpc_mask->byte_52_udpspn_dmac, V2_QPC_BYTE_52_UDPSPN_M,
4447 V2_QPC_BYTE_52_UDPSPN_S, 0);
4448
4449 roce_set_field(context->byte_20_smac_sgid_idx,
4450 V2_QPC_BYTE_20_SGID_IDX_M, V2_QPC_BYTE_20_SGID_IDX_S,
4451 grh->sgid_index);
4452
4453 roce_set_field(qpc_mask->byte_20_smac_sgid_idx,
4454 V2_QPC_BYTE_20_SGID_IDX_M, V2_QPC_BYTE_20_SGID_IDX_S, 0);
4455
4456 roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_HOP_LIMIT_M,
4457 V2_QPC_BYTE_24_HOP_LIMIT_S, grh->hop_limit);
4458 roce_set_field(qpc_mask->byte_24_mtu_tc, V2_QPC_BYTE_24_HOP_LIMIT_M,
4459 V2_QPC_BYTE_24_HOP_LIMIT_S, 0);
4460
4461 roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_TC_M,
4462 V2_QPC_BYTE_24_TC_S, get_tclass(&attr->ah_attr.grh));
4463 roce_set_field(qpc_mask->byte_24_mtu_tc, V2_QPC_BYTE_24_TC_M,
4464 V2_QPC_BYTE_24_TC_S, 0);
4465
4466 roce_set_field(context->byte_28_at_fl, V2_QPC_BYTE_28_FL_M,
4467 V2_QPC_BYTE_28_FL_S, grh->flow_label);
4468 roce_set_field(qpc_mask->byte_28_at_fl, V2_QPC_BYTE_28_FL_M,
4469 V2_QPC_BYTE_28_FL_S, 0);
4470 memcpy(context->dgid, grh->dgid.raw, sizeof(grh->dgid.raw));
4471 memset(qpc_mask->dgid, 0, sizeof(grh->dgid.raw));
4472
4473 hr_qp->sl = rdma_ah_get_sl(&attr->ah_attr);
4474 if (unlikely(hr_qp->sl > MAX_SERVICE_LEVEL)) {
4475 ibdev_err(ibdev,
4476 "failed to fill QPC, sl (%d) shouldn't be larger than %d.\n",
4477 hr_qp->sl, MAX_SERVICE_LEVEL);
4478 return -EINVAL;
4479 }
4480
4481 roce_set_field(context->byte_28_at_fl, V2_QPC_BYTE_28_SL_M,
4482 V2_QPC_BYTE_28_SL_S, hr_qp->sl);
4483 roce_set_field(qpc_mask->byte_28_at_fl, V2_QPC_BYTE_28_SL_M,
4484 V2_QPC_BYTE_28_SL_S, 0);
4485
4486 return 0;
4487 }
4488
check_qp_state(enum ib_qp_state cur_state,enum ib_qp_state new_state)4489 static bool check_qp_state(enum ib_qp_state cur_state,
4490 enum ib_qp_state new_state)
4491 {
4492 static const bool sm[][IB_QPS_ERR + 1] = {
4493 [IB_QPS_RESET] = { [IB_QPS_RESET] = true,
4494 [IB_QPS_INIT] = true },
4495 [IB_QPS_INIT] = { [IB_QPS_RESET] = true,
4496 [IB_QPS_INIT] = true,
4497 [IB_QPS_RTR] = true,
4498 [IB_QPS_ERR] = true },
4499 [IB_QPS_RTR] = { [IB_QPS_RESET] = true,
4500 [IB_QPS_RTS] = true,
4501 [IB_QPS_ERR] = true },
4502 [IB_QPS_RTS] = { [IB_QPS_RESET] = true,
4503 [IB_QPS_RTS] = true,
4504 [IB_QPS_ERR] = true },
4505 [IB_QPS_SQD] = {},
4506 [IB_QPS_SQE] = {},
4507 [IB_QPS_ERR] = { [IB_QPS_RESET] = true, [IB_QPS_ERR] = true }
4508 };
4509
4510 return sm[cur_state][new_state];
4511 }
4512
hns_roce_v2_set_abs_fields(struct ib_qp * ibqp,const struct ib_qp_attr * attr,int attr_mask,enum ib_qp_state cur_state,enum ib_qp_state new_state,struct hns_roce_v2_qp_context * context,struct hns_roce_v2_qp_context * qpc_mask)4513 static int hns_roce_v2_set_abs_fields(struct ib_qp *ibqp,
4514 const struct ib_qp_attr *attr,
4515 int attr_mask,
4516 enum ib_qp_state cur_state,
4517 enum ib_qp_state new_state,
4518 struct hns_roce_v2_qp_context *context,
4519 struct hns_roce_v2_qp_context *qpc_mask)
4520 {
4521 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
4522 int ret = 0;
4523
4524 if (!check_qp_state(cur_state, new_state)) {
4525 ibdev_err(&hr_dev->ib_dev, "Illegal state for QP!\n");
4526 return -EINVAL;
4527 }
4528
4529 if (cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT) {
4530 memset(qpc_mask, 0, hr_dev->caps.qpc_sz);
4531 modify_qp_reset_to_init(ibqp, attr, attr_mask, context,
4532 qpc_mask);
4533 } else if (cur_state == IB_QPS_INIT && new_state == IB_QPS_INIT) {
4534 modify_qp_init_to_init(ibqp, attr, attr_mask, context,
4535 qpc_mask);
4536 } else if (cur_state == IB_QPS_INIT && new_state == IB_QPS_RTR) {
4537 ret = modify_qp_init_to_rtr(ibqp, attr, attr_mask, context,
4538 qpc_mask);
4539 } else if (cur_state == IB_QPS_RTR && new_state == IB_QPS_RTS) {
4540 ret = modify_qp_rtr_to_rts(ibqp, attr, attr_mask, context,
4541 qpc_mask);
4542 }
4543
4544 return ret;
4545 }
4546
hns_roce_v2_set_opt_fields(struct ib_qp * ibqp,const struct ib_qp_attr * attr,int attr_mask,struct hns_roce_v2_qp_context * context,struct hns_roce_v2_qp_context * qpc_mask)4547 static int hns_roce_v2_set_opt_fields(struct ib_qp *ibqp,
4548 const struct ib_qp_attr *attr,
4549 int attr_mask,
4550 struct hns_roce_v2_qp_context *context,
4551 struct hns_roce_v2_qp_context *qpc_mask)
4552 {
4553 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
4554 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
4555 int ret = 0;
4556
4557 if (attr_mask & IB_QP_AV) {
4558 ret = hns_roce_v2_set_path(ibqp, attr, attr_mask, context,
4559 qpc_mask);
4560 if (ret)
4561 return ret;
4562 }
4563
4564 if (attr_mask & IB_QP_TIMEOUT) {
4565 if (attr->timeout < 31) {
4566 roce_set_field(context->byte_28_at_fl,
4567 V2_QPC_BYTE_28_AT_M, V2_QPC_BYTE_28_AT_S,
4568 attr->timeout);
4569 roce_set_field(qpc_mask->byte_28_at_fl,
4570 V2_QPC_BYTE_28_AT_M, V2_QPC_BYTE_28_AT_S,
4571 0);
4572 } else {
4573 ibdev_warn(&hr_dev->ib_dev,
4574 "Local ACK timeout shall be 0 to 30.\n");
4575 }
4576 }
4577
4578 if (attr_mask & IB_QP_RETRY_CNT) {
4579 roce_set_field(context->byte_212_lsn,
4580 V2_QPC_BYTE_212_RETRY_NUM_INIT_M,
4581 V2_QPC_BYTE_212_RETRY_NUM_INIT_S,
4582 attr->retry_cnt);
4583 roce_set_field(qpc_mask->byte_212_lsn,
4584 V2_QPC_BYTE_212_RETRY_NUM_INIT_M,
4585 V2_QPC_BYTE_212_RETRY_NUM_INIT_S, 0);
4586
4587 roce_set_field(context->byte_212_lsn,
4588 V2_QPC_BYTE_212_RETRY_CNT_M,
4589 V2_QPC_BYTE_212_RETRY_CNT_S, attr->retry_cnt);
4590 roce_set_field(qpc_mask->byte_212_lsn,
4591 V2_QPC_BYTE_212_RETRY_CNT_M,
4592 V2_QPC_BYTE_212_RETRY_CNT_S, 0);
4593 }
4594
4595 if (attr_mask & IB_QP_RNR_RETRY) {
4596 roce_set_field(context->byte_244_rnr_rxack,
4597 V2_QPC_BYTE_244_RNR_NUM_INIT_M,
4598 V2_QPC_BYTE_244_RNR_NUM_INIT_S, attr->rnr_retry);
4599 roce_set_field(qpc_mask->byte_244_rnr_rxack,
4600 V2_QPC_BYTE_244_RNR_NUM_INIT_M,
4601 V2_QPC_BYTE_244_RNR_NUM_INIT_S, 0);
4602
4603 roce_set_field(context->byte_244_rnr_rxack,
4604 V2_QPC_BYTE_244_RNR_CNT_M,
4605 V2_QPC_BYTE_244_RNR_CNT_S, attr->rnr_retry);
4606 roce_set_field(qpc_mask->byte_244_rnr_rxack,
4607 V2_QPC_BYTE_244_RNR_CNT_M,
4608 V2_QPC_BYTE_244_RNR_CNT_S, 0);
4609 }
4610
4611 /* RC&UC&UD required attr */
4612 if (attr_mask & IB_QP_SQ_PSN) {
4613 roce_set_field(context->byte_172_sq_psn,
4614 V2_QPC_BYTE_172_SQ_CUR_PSN_M,
4615 V2_QPC_BYTE_172_SQ_CUR_PSN_S, attr->sq_psn);
4616 roce_set_field(qpc_mask->byte_172_sq_psn,
4617 V2_QPC_BYTE_172_SQ_CUR_PSN_M,
4618 V2_QPC_BYTE_172_SQ_CUR_PSN_S, 0);
4619
4620 roce_set_field(context->byte_196_sq_psn,
4621 V2_QPC_BYTE_196_SQ_MAX_PSN_M,
4622 V2_QPC_BYTE_196_SQ_MAX_PSN_S, attr->sq_psn);
4623 roce_set_field(qpc_mask->byte_196_sq_psn,
4624 V2_QPC_BYTE_196_SQ_MAX_PSN_M,
4625 V2_QPC_BYTE_196_SQ_MAX_PSN_S, 0);
4626
4627 roce_set_field(context->byte_220_retry_psn_msn,
4628 V2_QPC_BYTE_220_RETRY_MSG_PSN_M,
4629 V2_QPC_BYTE_220_RETRY_MSG_PSN_S, attr->sq_psn);
4630 roce_set_field(qpc_mask->byte_220_retry_psn_msn,
4631 V2_QPC_BYTE_220_RETRY_MSG_PSN_M,
4632 V2_QPC_BYTE_220_RETRY_MSG_PSN_S, 0);
4633
4634 roce_set_field(context->byte_224_retry_msg,
4635 V2_QPC_BYTE_224_RETRY_MSG_PSN_M,
4636 V2_QPC_BYTE_224_RETRY_MSG_PSN_S,
4637 attr->sq_psn >> V2_QPC_BYTE_220_RETRY_MSG_PSN_S);
4638 roce_set_field(qpc_mask->byte_224_retry_msg,
4639 V2_QPC_BYTE_224_RETRY_MSG_PSN_M,
4640 V2_QPC_BYTE_224_RETRY_MSG_PSN_S, 0);
4641
4642 roce_set_field(context->byte_224_retry_msg,
4643 V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_M,
4644 V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_S,
4645 attr->sq_psn);
4646 roce_set_field(qpc_mask->byte_224_retry_msg,
4647 V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_M,
4648 V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_S, 0);
4649
4650 roce_set_field(context->byte_244_rnr_rxack,
4651 V2_QPC_BYTE_244_RX_ACK_EPSN_M,
4652 V2_QPC_BYTE_244_RX_ACK_EPSN_S, attr->sq_psn);
4653 roce_set_field(qpc_mask->byte_244_rnr_rxack,
4654 V2_QPC_BYTE_244_RX_ACK_EPSN_M,
4655 V2_QPC_BYTE_244_RX_ACK_EPSN_S, 0);
4656 }
4657
4658 if ((attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) &&
4659 attr->max_dest_rd_atomic) {
4660 roce_set_field(context->byte_140_raq, V2_QPC_BYTE_140_RR_MAX_M,
4661 V2_QPC_BYTE_140_RR_MAX_S,
4662 fls(attr->max_dest_rd_atomic - 1));
4663 roce_set_field(qpc_mask->byte_140_raq, V2_QPC_BYTE_140_RR_MAX_M,
4664 V2_QPC_BYTE_140_RR_MAX_S, 0);
4665 }
4666
4667 if ((attr_mask & IB_QP_MAX_QP_RD_ATOMIC) && attr->max_rd_atomic) {
4668 roce_set_field(context->byte_208_irrl, V2_QPC_BYTE_208_SR_MAX_M,
4669 V2_QPC_BYTE_208_SR_MAX_S,
4670 fls(attr->max_rd_atomic - 1));
4671 roce_set_field(qpc_mask->byte_208_irrl,
4672 V2_QPC_BYTE_208_SR_MAX_M,
4673 V2_QPC_BYTE_208_SR_MAX_S, 0);
4674 }
4675
4676 if (attr_mask & (IB_QP_ACCESS_FLAGS | IB_QP_MAX_DEST_RD_ATOMIC))
4677 set_access_flags(hr_qp, context, qpc_mask, attr, attr_mask);
4678
4679 if (attr_mask & IB_QP_MIN_RNR_TIMER) {
4680 roce_set_field(context->byte_80_rnr_rx_cqn,
4681 V2_QPC_BYTE_80_MIN_RNR_TIME_M,
4682 V2_QPC_BYTE_80_MIN_RNR_TIME_S,
4683 attr->min_rnr_timer);
4684 roce_set_field(qpc_mask->byte_80_rnr_rx_cqn,
4685 V2_QPC_BYTE_80_MIN_RNR_TIME_M,
4686 V2_QPC_BYTE_80_MIN_RNR_TIME_S, 0);
4687 }
4688
4689 /* RC&UC required attr */
4690 if (attr_mask & IB_QP_RQ_PSN) {
4691 roce_set_field(context->byte_108_rx_reqepsn,
4692 V2_QPC_BYTE_108_RX_REQ_EPSN_M,
4693 V2_QPC_BYTE_108_RX_REQ_EPSN_S, attr->rq_psn);
4694 roce_set_field(qpc_mask->byte_108_rx_reqepsn,
4695 V2_QPC_BYTE_108_RX_REQ_EPSN_M,
4696 V2_QPC_BYTE_108_RX_REQ_EPSN_S, 0);
4697
4698 roce_set_field(context->byte_152_raq, V2_QPC_BYTE_152_RAQ_PSN_M,
4699 V2_QPC_BYTE_152_RAQ_PSN_S, attr->rq_psn - 1);
4700 roce_set_field(qpc_mask->byte_152_raq,
4701 V2_QPC_BYTE_152_RAQ_PSN_M,
4702 V2_QPC_BYTE_152_RAQ_PSN_S, 0);
4703 }
4704
4705 if (attr_mask & IB_QP_QKEY) {
4706 context->qkey_xrcd = cpu_to_le32(attr->qkey);
4707 qpc_mask->qkey_xrcd = 0;
4708 hr_qp->qkey = attr->qkey;
4709 }
4710
4711 return ret;
4712 }
4713
hns_roce_v2_record_opt_fields(struct ib_qp * ibqp,const struct ib_qp_attr * attr,int attr_mask)4714 static void hns_roce_v2_record_opt_fields(struct ib_qp *ibqp,
4715 const struct ib_qp_attr *attr,
4716 int attr_mask)
4717 {
4718 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
4719 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
4720
4721 if (attr_mask & IB_QP_ACCESS_FLAGS)
4722 hr_qp->atomic_rd_en = attr->qp_access_flags;
4723
4724 if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC)
4725 hr_qp->resp_depth = attr->max_dest_rd_atomic;
4726 if (attr_mask & IB_QP_PORT) {
4727 hr_qp->port = attr->port_num - 1;
4728 hr_qp->phy_port = hr_dev->iboe.phy_port[hr_qp->port];
4729 }
4730 }
4731
hns_roce_v2_modify_qp(struct ib_qp * ibqp,const struct ib_qp_attr * attr,int attr_mask,enum ib_qp_state cur_state,enum ib_qp_state new_state)4732 static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
4733 const struct ib_qp_attr *attr,
4734 int attr_mask, enum ib_qp_state cur_state,
4735 enum ib_qp_state new_state)
4736 {
4737 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
4738 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
4739 struct hns_roce_v2_qp_context ctx[2];
4740 struct hns_roce_v2_qp_context *context = ctx;
4741 struct hns_roce_v2_qp_context *qpc_mask = ctx + 1;
4742 struct ib_device *ibdev = &hr_dev->ib_dev;
4743 unsigned long sq_flag = 0;
4744 unsigned long rq_flag = 0;
4745 int ret;
4746
4747 /*
4748 * In v2 engine, software pass context and context mask to hardware
4749 * when modifying qp. If software need modify some fields in context,
4750 * we should set all bits of the relevant fields in context mask to
4751 * 0 at the same time, else set them to 0x1.
4752 */
4753 memset(context, 0, hr_dev->caps.qpc_sz);
4754 memset(qpc_mask, 0xff, hr_dev->caps.qpc_sz);
4755
4756 ret = hns_roce_v2_set_abs_fields(ibqp, attr, attr_mask, cur_state,
4757 new_state, context, qpc_mask);
4758 if (ret)
4759 goto out;
4760
4761 /* When QP state is err, SQ and RQ WQE should be flushed */
4762 if (new_state == IB_QPS_ERR) {
4763 spin_lock_irqsave(&hr_qp->sq.lock, sq_flag);
4764 hr_qp->state = IB_QPS_ERR;
4765 roce_set_field(context->byte_160_sq_ci_pi,
4766 V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M,
4767 V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S,
4768 hr_qp->sq.head);
4769 roce_set_field(qpc_mask->byte_160_sq_ci_pi,
4770 V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M,
4771 V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S, 0);
4772 spin_unlock_irqrestore(&hr_qp->sq.lock, sq_flag);
4773
4774 if (!ibqp->srq) {
4775 spin_lock_irqsave(&hr_qp->rq.lock, rq_flag);
4776 roce_set_field(context->byte_84_rq_ci_pi,
4777 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M,
4778 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S,
4779 hr_qp->rq.head);
4780 roce_set_field(qpc_mask->byte_84_rq_ci_pi,
4781 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M,
4782 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S, 0);
4783 spin_unlock_irqrestore(&hr_qp->rq.lock, rq_flag);
4784 }
4785 }
4786
4787 /* Configure the optional fields */
4788 ret = hns_roce_v2_set_opt_fields(ibqp, attr, attr_mask, context,
4789 qpc_mask);
4790 if (ret)
4791 goto out;
4792
4793 roce_set_bit(context->byte_108_rx_reqepsn, V2_QPC_BYTE_108_INV_CREDIT_S,
4794 ibqp->srq ? 1 : 0);
4795 roce_set_bit(qpc_mask->byte_108_rx_reqepsn,
4796 V2_QPC_BYTE_108_INV_CREDIT_S, 0);
4797
4798 /* Every status migrate must change state */
4799 roce_set_field(context->byte_60_qpst_tempid, V2_QPC_BYTE_60_QP_ST_M,
4800 V2_QPC_BYTE_60_QP_ST_S, new_state);
4801 roce_set_field(qpc_mask->byte_60_qpst_tempid, V2_QPC_BYTE_60_QP_ST_M,
4802 V2_QPC_BYTE_60_QP_ST_S, 0);
4803
4804 /* SW pass context to HW */
4805 ret = hns_roce_v2_qp_modify(hr_dev, context, qpc_mask, hr_qp);
4806 if (ret) {
4807 ibdev_err(ibdev, "failed to modify QP, ret = %d.\n", ret);
4808 goto out;
4809 }
4810
4811 hr_qp->state = new_state;
4812
4813 hns_roce_v2_record_opt_fields(ibqp, attr, attr_mask);
4814
4815 if (new_state == IB_QPS_RESET && !ibqp->uobject) {
4816 hns_roce_v2_cq_clean(to_hr_cq(ibqp->recv_cq), hr_qp->qpn,
4817 ibqp->srq ? to_hr_srq(ibqp->srq) : NULL);
4818 if (ibqp->send_cq != ibqp->recv_cq)
4819 hns_roce_v2_cq_clean(to_hr_cq(ibqp->send_cq),
4820 hr_qp->qpn, NULL);
4821
4822 hr_qp->rq.head = 0;
4823 hr_qp->rq.tail = 0;
4824 hr_qp->sq.head = 0;
4825 hr_qp->sq.tail = 0;
4826 hr_qp->next_sge = 0;
4827 if (hr_qp->rq.wqe_cnt)
4828 *hr_qp->rdb.db_record = 0;
4829 }
4830
4831 out:
4832 return ret;
4833 }
4834
to_ib_qp_st(enum hns_roce_v2_qp_state state)4835 static int to_ib_qp_st(enum hns_roce_v2_qp_state state)
4836 {
4837 static const enum ib_qp_state map[] = {
4838 [HNS_ROCE_QP_ST_RST] = IB_QPS_RESET,
4839 [HNS_ROCE_QP_ST_INIT] = IB_QPS_INIT,
4840 [HNS_ROCE_QP_ST_RTR] = IB_QPS_RTR,
4841 [HNS_ROCE_QP_ST_RTS] = IB_QPS_RTS,
4842 [HNS_ROCE_QP_ST_SQD] = IB_QPS_SQD,
4843 [HNS_ROCE_QP_ST_SQER] = IB_QPS_SQE,
4844 [HNS_ROCE_QP_ST_ERR] = IB_QPS_ERR,
4845 [HNS_ROCE_QP_ST_SQ_DRAINING] = IB_QPS_SQD
4846 };
4847
4848 return (state < ARRAY_SIZE(map)) ? map[state] : -1;
4849 }
4850
hns_roce_v2_query_qpc(struct hns_roce_dev * hr_dev,struct hns_roce_qp * hr_qp,struct hns_roce_v2_qp_context * hr_context)4851 static int hns_roce_v2_query_qpc(struct hns_roce_dev *hr_dev,
4852 struct hns_roce_qp *hr_qp,
4853 struct hns_roce_v2_qp_context *hr_context)
4854 {
4855 struct hns_roce_cmd_mailbox *mailbox;
4856 int ret;
4857
4858 mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
4859 if (IS_ERR(mailbox))
4860 return PTR_ERR(mailbox);
4861
4862 ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, hr_qp->qpn, 0,
4863 HNS_ROCE_CMD_QUERY_QPC,
4864 HNS_ROCE_CMD_TIMEOUT_MSECS);
4865 if (ret)
4866 goto out;
4867
4868 memcpy(hr_context, mailbox->buf, hr_dev->caps.qpc_sz);
4869
4870 out:
4871 hns_roce_free_cmd_mailbox(hr_dev, mailbox);
4872 return ret;
4873 }
4874
hns_roce_v2_query_qp(struct ib_qp * ibqp,struct ib_qp_attr * qp_attr,int qp_attr_mask,struct ib_qp_init_attr * qp_init_attr)4875 static int hns_roce_v2_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
4876 int qp_attr_mask,
4877 struct ib_qp_init_attr *qp_init_attr)
4878 {
4879 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
4880 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
4881 struct hns_roce_v2_qp_context context = {};
4882 struct ib_device *ibdev = &hr_dev->ib_dev;
4883 int tmp_qp_state;
4884 int state;
4885 int ret;
4886
4887 memset(qp_attr, 0, sizeof(*qp_attr));
4888 memset(qp_init_attr, 0, sizeof(*qp_init_attr));
4889
4890 mutex_lock(&hr_qp->mutex);
4891
4892 if (hr_qp->state == IB_QPS_RESET) {
4893 qp_attr->qp_state = IB_QPS_RESET;
4894 ret = 0;
4895 goto done;
4896 }
4897
4898 ret = hns_roce_v2_query_qpc(hr_dev, hr_qp, &context);
4899 if (ret) {
4900 ibdev_err(ibdev, "failed to query QPC, ret = %d.\n", ret);
4901 ret = -EINVAL;
4902 goto out;
4903 }
4904
4905 state = roce_get_field(context.byte_60_qpst_tempid,
4906 V2_QPC_BYTE_60_QP_ST_M, V2_QPC_BYTE_60_QP_ST_S);
4907 tmp_qp_state = to_ib_qp_st((enum hns_roce_v2_qp_state)state);
4908 if (tmp_qp_state == -1) {
4909 ibdev_err(ibdev, "Illegal ib_qp_state\n");
4910 ret = -EINVAL;
4911 goto out;
4912 }
4913 hr_qp->state = (u8)tmp_qp_state;
4914 qp_attr->qp_state = (enum ib_qp_state)hr_qp->state;
4915 qp_attr->path_mtu = (enum ib_mtu)roce_get_field(context.byte_24_mtu_tc,
4916 V2_QPC_BYTE_24_MTU_M,
4917 V2_QPC_BYTE_24_MTU_S);
4918 qp_attr->path_mig_state = IB_MIG_ARMED;
4919 qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE;
4920 if (hr_qp->ibqp.qp_type == IB_QPT_UD)
4921 qp_attr->qkey = le32_to_cpu(context.qkey_xrcd);
4922
4923 qp_attr->rq_psn = roce_get_field(context.byte_108_rx_reqepsn,
4924 V2_QPC_BYTE_108_RX_REQ_EPSN_M,
4925 V2_QPC_BYTE_108_RX_REQ_EPSN_S);
4926 qp_attr->sq_psn = (u32)roce_get_field(context.byte_172_sq_psn,
4927 V2_QPC_BYTE_172_SQ_CUR_PSN_M,
4928 V2_QPC_BYTE_172_SQ_CUR_PSN_S);
4929 qp_attr->dest_qp_num = (u8)roce_get_field(context.byte_56_dqpn_err,
4930 V2_QPC_BYTE_56_DQPN_M,
4931 V2_QPC_BYTE_56_DQPN_S);
4932 qp_attr->qp_access_flags = ((roce_get_bit(context.byte_76_srqn_op_en,
4933 V2_QPC_BYTE_76_RRE_S)) << V2_QP_RRE_S) |
4934 ((roce_get_bit(context.byte_76_srqn_op_en,
4935 V2_QPC_BYTE_76_RWE_S)) << V2_QP_RWE_S) |
4936 ((roce_get_bit(context.byte_76_srqn_op_en,
4937 V2_QPC_BYTE_76_ATE_S)) << V2_QP_ATE_S);
4938
4939 if (hr_qp->ibqp.qp_type == IB_QPT_RC ||
4940 hr_qp->ibqp.qp_type == IB_QPT_UC) {
4941 struct ib_global_route *grh =
4942 rdma_ah_retrieve_grh(&qp_attr->ah_attr);
4943
4944 rdma_ah_set_sl(&qp_attr->ah_attr,
4945 roce_get_field(context.byte_28_at_fl,
4946 V2_QPC_BYTE_28_SL_M,
4947 V2_QPC_BYTE_28_SL_S));
4948 grh->flow_label = roce_get_field(context.byte_28_at_fl,
4949 V2_QPC_BYTE_28_FL_M,
4950 V2_QPC_BYTE_28_FL_S);
4951 grh->sgid_index = roce_get_field(context.byte_20_smac_sgid_idx,
4952 V2_QPC_BYTE_20_SGID_IDX_M,
4953 V2_QPC_BYTE_20_SGID_IDX_S);
4954 grh->hop_limit = roce_get_field(context.byte_24_mtu_tc,
4955 V2_QPC_BYTE_24_HOP_LIMIT_M,
4956 V2_QPC_BYTE_24_HOP_LIMIT_S);
4957 grh->traffic_class = roce_get_field(context.byte_24_mtu_tc,
4958 V2_QPC_BYTE_24_TC_M,
4959 V2_QPC_BYTE_24_TC_S);
4960
4961 memcpy(grh->dgid.raw, context.dgid, sizeof(grh->dgid.raw));
4962 }
4963
4964 qp_attr->port_num = hr_qp->port + 1;
4965 qp_attr->sq_draining = 0;
4966 qp_attr->max_rd_atomic = 1 << roce_get_field(context.byte_208_irrl,
4967 V2_QPC_BYTE_208_SR_MAX_M,
4968 V2_QPC_BYTE_208_SR_MAX_S);
4969 qp_attr->max_dest_rd_atomic = 1 << roce_get_field(context.byte_140_raq,
4970 V2_QPC_BYTE_140_RR_MAX_M,
4971 V2_QPC_BYTE_140_RR_MAX_S);
4972 qp_attr->min_rnr_timer = (u8)roce_get_field(context.byte_80_rnr_rx_cqn,
4973 V2_QPC_BYTE_80_MIN_RNR_TIME_M,
4974 V2_QPC_BYTE_80_MIN_RNR_TIME_S);
4975 qp_attr->timeout = (u8)roce_get_field(context.byte_28_at_fl,
4976 V2_QPC_BYTE_28_AT_M,
4977 V2_QPC_BYTE_28_AT_S);
4978 qp_attr->retry_cnt = roce_get_field(context.byte_212_lsn,
4979 V2_QPC_BYTE_212_RETRY_NUM_INIT_M,
4980 V2_QPC_BYTE_212_RETRY_NUM_INIT_S);
4981 qp_attr->rnr_retry = roce_get_field(context.byte_244_rnr_rxack,
4982 V2_QPC_BYTE_244_RNR_NUM_INIT_M,
4983 V2_QPC_BYTE_244_RNR_NUM_INIT_S);
4984
4985 done:
4986 qp_attr->cur_qp_state = qp_attr->qp_state;
4987 qp_attr->cap.max_recv_wr = hr_qp->rq.wqe_cnt;
4988 qp_attr->cap.max_recv_sge = hr_qp->rq.max_gs;
4989
4990 if (!ibqp->uobject) {
4991 qp_attr->cap.max_send_wr = hr_qp->sq.wqe_cnt;
4992 qp_attr->cap.max_send_sge = hr_qp->sq.max_gs;
4993 } else {
4994 qp_attr->cap.max_send_wr = 0;
4995 qp_attr->cap.max_send_sge = 0;
4996 }
4997
4998 qp_init_attr->cap = qp_attr->cap;
4999 qp_init_attr->sq_sig_type = hr_qp->sq_signal_bits;
5000
5001 out:
5002 mutex_unlock(&hr_qp->mutex);
5003 return ret;
5004 }
5005
hns_roce_v2_destroy_qp_common(struct hns_roce_dev * hr_dev,struct hns_roce_qp * hr_qp,struct ib_udata * udata)5006 static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev,
5007 struct hns_roce_qp *hr_qp,
5008 struct ib_udata *udata)
5009 {
5010 struct ib_device *ibdev = &hr_dev->ib_dev;
5011 struct hns_roce_cq *send_cq, *recv_cq;
5012 unsigned long flags;
5013 int ret = 0;
5014
5015 if (hr_qp->ibqp.qp_type == IB_QPT_RC && hr_qp->state != IB_QPS_RESET) {
5016 /* Modify qp to reset before destroying qp */
5017 ret = hns_roce_v2_modify_qp(&hr_qp->ibqp, NULL, 0,
5018 hr_qp->state, IB_QPS_RESET);
5019 if (ret)
5020 ibdev_err(ibdev,
5021 "failed to modify QP to RST, ret = %d.\n",
5022 ret);
5023 }
5024
5025 send_cq = hr_qp->ibqp.send_cq ? to_hr_cq(hr_qp->ibqp.send_cq) : NULL;
5026 recv_cq = hr_qp->ibqp.recv_cq ? to_hr_cq(hr_qp->ibqp.recv_cq) : NULL;
5027
5028 spin_lock_irqsave(&hr_dev->qp_list_lock, flags);
5029 hns_roce_lock_cqs(send_cq, recv_cq);
5030
5031 if (!udata) {
5032 if (recv_cq)
5033 __hns_roce_v2_cq_clean(recv_cq, hr_qp->qpn,
5034 (hr_qp->ibqp.srq ?
5035 to_hr_srq(hr_qp->ibqp.srq) :
5036 NULL));
5037
5038 if (send_cq && send_cq != recv_cq)
5039 __hns_roce_v2_cq_clean(send_cq, hr_qp->qpn, NULL);
5040
5041 }
5042
5043 hns_roce_qp_remove(hr_dev, hr_qp);
5044
5045 hns_roce_unlock_cqs(send_cq, recv_cq);
5046 spin_unlock_irqrestore(&hr_dev->qp_list_lock, flags);
5047
5048 return ret;
5049 }
5050
hns_roce_v2_destroy_qp(struct ib_qp * ibqp,struct ib_udata * udata)5051 static int hns_roce_v2_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
5052 {
5053 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device);
5054 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp);
5055 int ret;
5056
5057 ret = hns_roce_v2_destroy_qp_common(hr_dev, hr_qp, udata);
5058 if (ret)
5059 ibdev_err(&hr_dev->ib_dev,
5060 "failed to destroy QP, QPN = 0x%06lx, ret = %d.\n",
5061 hr_qp->qpn, ret);
5062
5063 hns_roce_qp_destroy(hr_dev, hr_qp, udata);
5064
5065 return 0;
5066 }
5067
hns_roce_v2_qp_flow_control_init(struct hns_roce_dev * hr_dev,struct hns_roce_qp * hr_qp)5068 static int hns_roce_v2_qp_flow_control_init(struct hns_roce_dev *hr_dev,
5069 struct hns_roce_qp *hr_qp)
5070 {
5071 struct ib_device *ibdev = &hr_dev->ib_dev;
5072 struct hns_roce_sccc_clr_done *resp;
5073 struct hns_roce_sccc_clr *clr;
5074 struct hns_roce_cmq_desc desc;
5075 int ret, i;
5076
5077 mutex_lock(&hr_dev->qp_table.scc_mutex);
5078
5079 /* set scc ctx clear done flag */
5080 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_RESET_SCCC, false);
5081 ret = hns_roce_cmq_send(hr_dev, &desc, 1);
5082 if (ret) {
5083 ibdev_err(ibdev, "failed to reset SCC ctx, ret = %d.\n", ret);
5084 goto out;
5085 }
5086
5087 /* clear scc context */
5088 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CLR_SCCC, false);
5089 clr = (struct hns_roce_sccc_clr *)desc.data;
5090 clr->qpn = cpu_to_le32(hr_qp->qpn);
5091 ret = hns_roce_cmq_send(hr_dev, &desc, 1);
5092 if (ret) {
5093 ibdev_err(ibdev, "failed to clear SCC ctx, ret = %d.\n", ret);
5094 goto out;
5095 }
5096
5097 /* query scc context clear is done or not */
5098 resp = (struct hns_roce_sccc_clr_done *)desc.data;
5099 for (i = 0; i <= HNS_ROCE_CMQ_SCC_CLR_DONE_CNT; i++) {
5100 hns_roce_cmq_setup_basic_desc(&desc,
5101 HNS_ROCE_OPC_QUERY_SCCC, true);
5102 ret = hns_roce_cmq_send(hr_dev, &desc, 1);
5103 if (ret) {
5104 ibdev_err(ibdev, "failed to query clr cmq, ret = %d\n",
5105 ret);
5106 goto out;
5107 }
5108
5109 if (resp->clr_done)
5110 goto out;
5111
5112 msleep(20);
5113 }
5114
5115 ibdev_err(ibdev, "Query SCC clr done flag overtime.\n");
5116 ret = -ETIMEDOUT;
5117
5118 out:
5119 mutex_unlock(&hr_dev->qp_table.scc_mutex);
5120 return ret;
5121 }
5122
hns_roce_v2_write_srqc(struct hns_roce_dev * hr_dev,struct hns_roce_srq * srq,u32 pdn,u16 xrcd,u32 cqn,void * mb_buf,u64 * mtts_wqe,u64 * mtts_idx,dma_addr_t dma_handle_wqe,dma_addr_t dma_handle_idx)5123 static void hns_roce_v2_write_srqc(struct hns_roce_dev *hr_dev,
5124 struct hns_roce_srq *srq, u32 pdn, u16 xrcd,
5125 u32 cqn, void *mb_buf, u64 *mtts_wqe,
5126 u64 *mtts_idx, dma_addr_t dma_handle_wqe,
5127 dma_addr_t dma_handle_idx)
5128 {
5129 struct hns_roce_srq_context *srq_context;
5130
5131 srq_context = mb_buf;
5132 memset(srq_context, 0, sizeof(*srq_context));
5133
5134 roce_set_field(srq_context->byte_4_srqn_srqst, SRQC_BYTE_4_SRQ_ST_M,
5135 SRQC_BYTE_4_SRQ_ST_S, 1);
5136
5137 roce_set_field(srq_context->byte_4_srqn_srqst,
5138 SRQC_BYTE_4_SRQ_WQE_HOP_NUM_M,
5139 SRQC_BYTE_4_SRQ_WQE_HOP_NUM_S,
5140 to_hr_hem_hopnum(hr_dev->caps.srqwqe_hop_num,
5141 srq->wqe_cnt));
5142 roce_set_field(srq_context->byte_4_srqn_srqst,
5143 SRQC_BYTE_4_SRQ_SHIFT_M, SRQC_BYTE_4_SRQ_SHIFT_S,
5144 ilog2(srq->wqe_cnt));
5145
5146 roce_set_field(srq_context->byte_4_srqn_srqst, SRQC_BYTE_4_SRQN_M,
5147 SRQC_BYTE_4_SRQN_S, srq->srqn);
5148
5149 roce_set_field(srq_context->byte_8_limit_wl, SRQC_BYTE_8_SRQ_LIMIT_WL_M,
5150 SRQC_BYTE_8_SRQ_LIMIT_WL_S, 0);
5151
5152 roce_set_field(srq_context->byte_12_xrcd, SRQC_BYTE_12_SRQ_XRCD_M,
5153 SRQC_BYTE_12_SRQ_XRCD_S, xrcd);
5154
5155 srq_context->wqe_bt_ba = cpu_to_le32((u32)(dma_handle_wqe >> 3));
5156
5157 roce_set_field(srq_context->byte_24_wqe_bt_ba,
5158 SRQC_BYTE_24_SRQ_WQE_BT_BA_M,
5159 SRQC_BYTE_24_SRQ_WQE_BT_BA_S,
5160 dma_handle_wqe >> 35);
5161
5162 roce_set_field(srq_context->byte_28_rqws_pd, SRQC_BYTE_28_PD_M,
5163 SRQC_BYTE_28_PD_S, pdn);
5164 roce_set_field(srq_context->byte_28_rqws_pd, SRQC_BYTE_28_RQWS_M,
5165 SRQC_BYTE_28_RQWS_S, srq->max_gs <= 0 ? 0 :
5166 fls(srq->max_gs - 1));
5167
5168 srq_context->idx_bt_ba = cpu_to_le32(dma_handle_idx >> 3);
5169 roce_set_field(srq_context->rsv_idx_bt_ba,
5170 SRQC_BYTE_36_SRQ_IDX_BT_BA_M,
5171 SRQC_BYTE_36_SRQ_IDX_BT_BA_S,
5172 dma_handle_idx >> 35);
5173
5174 srq_context->idx_cur_blk_addr =
5175 cpu_to_le32(to_hr_hw_page_addr(mtts_idx[0]));
5176 roce_set_field(srq_context->byte_44_idxbufpgsz_addr,
5177 SRQC_BYTE_44_SRQ_IDX_CUR_BLK_ADDR_M,
5178 SRQC_BYTE_44_SRQ_IDX_CUR_BLK_ADDR_S,
5179 upper_32_bits(to_hr_hw_page_addr(mtts_idx[0])));
5180 roce_set_field(srq_context->byte_44_idxbufpgsz_addr,
5181 SRQC_BYTE_44_SRQ_IDX_HOP_NUM_M,
5182 SRQC_BYTE_44_SRQ_IDX_HOP_NUM_S,
5183 to_hr_hem_hopnum(hr_dev->caps.idx_hop_num,
5184 srq->wqe_cnt));
5185
5186 roce_set_field(srq_context->byte_44_idxbufpgsz_addr,
5187 SRQC_BYTE_44_SRQ_IDX_BA_PG_SZ_M,
5188 SRQC_BYTE_44_SRQ_IDX_BA_PG_SZ_S,
5189 to_hr_hw_page_shift(srq->idx_que.mtr.hem_cfg.ba_pg_shift));
5190 roce_set_field(srq_context->byte_44_idxbufpgsz_addr,
5191 SRQC_BYTE_44_SRQ_IDX_BUF_PG_SZ_M,
5192 SRQC_BYTE_44_SRQ_IDX_BUF_PG_SZ_S,
5193 to_hr_hw_page_shift(srq->idx_que.mtr.hem_cfg.buf_pg_shift));
5194
5195 srq_context->idx_nxt_blk_addr =
5196 cpu_to_le32(to_hr_hw_page_addr(mtts_idx[1]));
5197 roce_set_field(srq_context->rsv_idxnxtblkaddr,
5198 SRQC_BYTE_52_SRQ_IDX_NXT_BLK_ADDR_M,
5199 SRQC_BYTE_52_SRQ_IDX_NXT_BLK_ADDR_S,
5200 upper_32_bits(to_hr_hw_page_addr(mtts_idx[1])));
5201 roce_set_field(srq_context->byte_56_xrc_cqn,
5202 SRQC_BYTE_56_SRQ_XRC_CQN_M, SRQC_BYTE_56_SRQ_XRC_CQN_S,
5203 cqn);
5204 roce_set_field(srq_context->byte_56_xrc_cqn,
5205 SRQC_BYTE_56_SRQ_WQE_BA_PG_SZ_M,
5206 SRQC_BYTE_56_SRQ_WQE_BA_PG_SZ_S,
5207 to_hr_hw_page_shift(srq->buf_mtr.hem_cfg.ba_pg_shift));
5208 roce_set_field(srq_context->byte_56_xrc_cqn,
5209 SRQC_BYTE_56_SRQ_WQE_BUF_PG_SZ_M,
5210 SRQC_BYTE_56_SRQ_WQE_BUF_PG_SZ_S,
5211 to_hr_hw_page_shift(srq->buf_mtr.hem_cfg.buf_pg_shift));
5212
5213 roce_set_bit(srq_context->db_record_addr_record_en,
5214 SRQC_BYTE_60_SRQ_RECORD_EN_S, 0);
5215 }
5216
hns_roce_v2_modify_srq(struct ib_srq * ibsrq,struct ib_srq_attr * srq_attr,enum ib_srq_attr_mask srq_attr_mask,struct ib_udata * udata)5217 static int hns_roce_v2_modify_srq(struct ib_srq *ibsrq,
5218 struct ib_srq_attr *srq_attr,
5219 enum ib_srq_attr_mask srq_attr_mask,
5220 struct ib_udata *udata)
5221 {
5222 struct hns_roce_dev *hr_dev = to_hr_dev(ibsrq->device);
5223 struct hns_roce_srq *srq = to_hr_srq(ibsrq);
5224 struct hns_roce_srq_context *srq_context;
5225 struct hns_roce_srq_context *srqc_mask;
5226 struct hns_roce_cmd_mailbox *mailbox;
5227 int ret;
5228
5229 /* Resizing SRQs is not supported yet */
5230 if (srq_attr_mask & IB_SRQ_MAX_WR)
5231 return -EINVAL;
5232
5233 if (srq_attr_mask & IB_SRQ_LIMIT) {
5234 if (srq_attr->srq_limit >= srq->wqe_cnt)
5235 return -EINVAL;
5236
5237 mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
5238 if (IS_ERR(mailbox))
5239 return PTR_ERR(mailbox);
5240
5241 srq_context = mailbox->buf;
5242 srqc_mask = (struct hns_roce_srq_context *)mailbox->buf + 1;
5243
5244 memset(srqc_mask, 0xff, sizeof(*srqc_mask));
5245
5246 roce_set_field(srq_context->byte_8_limit_wl,
5247 SRQC_BYTE_8_SRQ_LIMIT_WL_M,
5248 SRQC_BYTE_8_SRQ_LIMIT_WL_S, srq_attr->srq_limit);
5249 roce_set_field(srqc_mask->byte_8_limit_wl,
5250 SRQC_BYTE_8_SRQ_LIMIT_WL_M,
5251 SRQC_BYTE_8_SRQ_LIMIT_WL_S, 0);
5252
5253 ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0, srq->srqn, 0,
5254 HNS_ROCE_CMD_MODIFY_SRQC,
5255 HNS_ROCE_CMD_TIMEOUT_MSECS);
5256 hns_roce_free_cmd_mailbox(hr_dev, mailbox);
5257 if (ret) {
5258 ibdev_err(&hr_dev->ib_dev,
5259 "failed to handle cmd of modifying SRQ, ret = %d.\n",
5260 ret);
5261 return ret;
5262 }
5263 }
5264
5265 return 0;
5266 }
5267
hns_roce_v2_query_srq(struct ib_srq * ibsrq,struct ib_srq_attr * attr)5268 static int hns_roce_v2_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr)
5269 {
5270 struct hns_roce_dev *hr_dev = to_hr_dev(ibsrq->device);
5271 struct hns_roce_srq *srq = to_hr_srq(ibsrq);
5272 struct hns_roce_srq_context *srq_context;
5273 struct hns_roce_cmd_mailbox *mailbox;
5274 int limit_wl;
5275 int ret;
5276
5277 mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
5278 if (IS_ERR(mailbox))
5279 return PTR_ERR(mailbox);
5280
5281 srq_context = mailbox->buf;
5282 ret = hns_roce_cmd_mbox(hr_dev, 0, mailbox->dma, srq->srqn, 0,
5283 HNS_ROCE_CMD_QUERY_SRQC,
5284 HNS_ROCE_CMD_TIMEOUT_MSECS);
5285 if (ret) {
5286 ibdev_err(&hr_dev->ib_dev,
5287 "failed to process cmd of querying SRQ, ret = %d.\n",
5288 ret);
5289 goto out;
5290 }
5291
5292 limit_wl = roce_get_field(srq_context->byte_8_limit_wl,
5293 SRQC_BYTE_8_SRQ_LIMIT_WL_M,
5294 SRQC_BYTE_8_SRQ_LIMIT_WL_S);
5295
5296 attr->srq_limit = limit_wl;
5297 attr->max_wr = srq->wqe_cnt - 1;
5298 attr->max_sge = srq->max_gs;
5299
5300 out:
5301 hns_roce_free_cmd_mailbox(hr_dev, mailbox);
5302 return ret;
5303 }
5304
hns_roce_v2_modify_cq(struct ib_cq * cq,u16 cq_count,u16 cq_period)5305 static int hns_roce_v2_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period)
5306 {
5307 struct hns_roce_dev *hr_dev = to_hr_dev(cq->device);
5308 struct hns_roce_v2_cq_context *cq_context;
5309 struct hns_roce_cq *hr_cq = to_hr_cq(cq);
5310 struct hns_roce_v2_cq_context *cqc_mask;
5311 struct hns_roce_cmd_mailbox *mailbox;
5312 int ret;
5313
5314 mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
5315 if (IS_ERR(mailbox))
5316 return PTR_ERR(mailbox);
5317
5318 cq_context = mailbox->buf;
5319 cqc_mask = (struct hns_roce_v2_cq_context *)mailbox->buf + 1;
5320
5321 memset(cqc_mask, 0xff, sizeof(*cqc_mask));
5322
5323 roce_set_field(cq_context->byte_56_cqe_period_maxcnt,
5324 V2_CQC_BYTE_56_CQ_MAX_CNT_M, V2_CQC_BYTE_56_CQ_MAX_CNT_S,
5325 cq_count);
5326 roce_set_field(cqc_mask->byte_56_cqe_period_maxcnt,
5327 V2_CQC_BYTE_56_CQ_MAX_CNT_M, V2_CQC_BYTE_56_CQ_MAX_CNT_S,
5328 0);
5329 roce_set_field(cq_context->byte_56_cqe_period_maxcnt,
5330 V2_CQC_BYTE_56_CQ_PERIOD_M, V2_CQC_BYTE_56_CQ_PERIOD_S,
5331 cq_period);
5332 roce_set_field(cqc_mask->byte_56_cqe_period_maxcnt,
5333 V2_CQC_BYTE_56_CQ_PERIOD_M, V2_CQC_BYTE_56_CQ_PERIOD_S,
5334 0);
5335
5336 ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0, hr_cq->cqn, 1,
5337 HNS_ROCE_CMD_MODIFY_CQC,
5338 HNS_ROCE_CMD_TIMEOUT_MSECS);
5339 hns_roce_free_cmd_mailbox(hr_dev, mailbox);
5340 if (ret)
5341 ibdev_err(&hr_dev->ib_dev,
5342 "failed to process cmd when modifying CQ, ret = %d.\n",
5343 ret);
5344
5345 return ret;
5346 }
5347
hns_roce_irq_work_handle(struct work_struct * work)5348 static void hns_roce_irq_work_handle(struct work_struct *work)
5349 {
5350 struct hns_roce_work *irq_work =
5351 container_of(work, struct hns_roce_work, work);
5352 struct ib_device *ibdev = &irq_work->hr_dev->ib_dev;
5353 u32 qpn = irq_work->qpn;
5354 u32 cqn = irq_work->cqn;
5355
5356 switch (irq_work->event_type) {
5357 case HNS_ROCE_EVENT_TYPE_PATH_MIG:
5358 ibdev_info(ibdev, "Path migrated succeeded.\n");
5359 break;
5360 case HNS_ROCE_EVENT_TYPE_PATH_MIG_FAILED:
5361 ibdev_warn(ibdev, "Path migration failed.\n");
5362 break;
5363 case HNS_ROCE_EVENT_TYPE_COMM_EST:
5364 break;
5365 case HNS_ROCE_EVENT_TYPE_SQ_DRAINED:
5366 ibdev_warn(ibdev, "Send queue drained.\n");
5367 break;
5368 case HNS_ROCE_EVENT_TYPE_WQ_CATAS_ERROR:
5369 ibdev_err(ibdev, "Local work queue 0x%x catast error, sub_event type is: %d\n",
5370 qpn, irq_work->sub_type);
5371 break;
5372 case HNS_ROCE_EVENT_TYPE_INV_REQ_LOCAL_WQ_ERROR:
5373 ibdev_err(ibdev, "Invalid request local work queue 0x%x error.\n",
5374 qpn);
5375 break;
5376 case HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR:
5377 ibdev_err(ibdev, "Local access violation work queue 0x%x error, sub_event type is: %d\n",
5378 qpn, irq_work->sub_type);
5379 break;
5380 case HNS_ROCE_EVENT_TYPE_SRQ_LIMIT_REACH:
5381 ibdev_warn(ibdev, "SRQ limit reach.\n");
5382 break;
5383 case HNS_ROCE_EVENT_TYPE_SRQ_LAST_WQE_REACH:
5384 ibdev_warn(ibdev, "SRQ last wqe reach.\n");
5385 break;
5386 case HNS_ROCE_EVENT_TYPE_SRQ_CATAS_ERROR:
5387 ibdev_err(ibdev, "SRQ catas error.\n");
5388 break;
5389 case HNS_ROCE_EVENT_TYPE_CQ_ACCESS_ERROR:
5390 ibdev_err(ibdev, "CQ 0x%x access err.\n", cqn);
5391 break;
5392 case HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW:
5393 ibdev_warn(ibdev, "CQ 0x%x overflow\n", cqn);
5394 break;
5395 case HNS_ROCE_EVENT_TYPE_DB_OVERFLOW:
5396 ibdev_warn(ibdev, "DB overflow.\n");
5397 break;
5398 case HNS_ROCE_EVENT_TYPE_FLR:
5399 ibdev_warn(ibdev, "Function level reset.\n");
5400 break;
5401 default:
5402 break;
5403 }
5404
5405 kfree(irq_work);
5406 }
5407
hns_roce_v2_init_irq_work(struct hns_roce_dev * hr_dev,struct hns_roce_eq * eq,u32 qpn,u32 cqn)5408 static void hns_roce_v2_init_irq_work(struct hns_roce_dev *hr_dev,
5409 struct hns_roce_eq *eq,
5410 u32 qpn, u32 cqn)
5411 {
5412 struct hns_roce_work *irq_work;
5413
5414 irq_work = kzalloc(sizeof(struct hns_roce_work), GFP_ATOMIC);
5415 if (!irq_work)
5416 return;
5417
5418 INIT_WORK(&(irq_work->work), hns_roce_irq_work_handle);
5419 irq_work->hr_dev = hr_dev;
5420 irq_work->qpn = qpn;
5421 irq_work->cqn = cqn;
5422 irq_work->event_type = eq->event_type;
5423 irq_work->sub_type = eq->sub_type;
5424 queue_work(hr_dev->irq_workq, &(irq_work->work));
5425 }
5426
set_eq_cons_index_v2(struct hns_roce_eq * eq)5427 static void set_eq_cons_index_v2(struct hns_roce_eq *eq)
5428 {
5429 struct hns_roce_dev *hr_dev = eq->hr_dev;
5430 __le32 doorbell[2] = {};
5431
5432 if (eq->type_flag == HNS_ROCE_AEQ) {
5433 roce_set_field(doorbell[0], HNS_ROCE_V2_EQ_DB_CMD_M,
5434 HNS_ROCE_V2_EQ_DB_CMD_S,
5435 eq->arm_st == HNS_ROCE_V2_EQ_ALWAYS_ARMED ?
5436 HNS_ROCE_EQ_DB_CMD_AEQ :
5437 HNS_ROCE_EQ_DB_CMD_AEQ_ARMED);
5438 } else {
5439 roce_set_field(doorbell[0], HNS_ROCE_V2_EQ_DB_TAG_M,
5440 HNS_ROCE_V2_EQ_DB_TAG_S, eq->eqn);
5441
5442 roce_set_field(doorbell[0], HNS_ROCE_V2_EQ_DB_CMD_M,
5443 HNS_ROCE_V2_EQ_DB_CMD_S,
5444 eq->arm_st == HNS_ROCE_V2_EQ_ALWAYS_ARMED ?
5445 HNS_ROCE_EQ_DB_CMD_CEQ :
5446 HNS_ROCE_EQ_DB_CMD_CEQ_ARMED);
5447 }
5448
5449 roce_set_field(doorbell[1], HNS_ROCE_V2_EQ_DB_PARA_M,
5450 HNS_ROCE_V2_EQ_DB_PARA_S,
5451 (eq->cons_index & HNS_ROCE_V2_CONS_IDX_M));
5452
5453 hns_roce_write64(hr_dev, doorbell, eq->doorbell);
5454 }
5455
next_aeqe_sw_v2(struct hns_roce_eq * eq)5456 static struct hns_roce_aeqe *next_aeqe_sw_v2(struct hns_roce_eq *eq)
5457 {
5458 struct hns_roce_aeqe *aeqe;
5459
5460 aeqe = hns_roce_buf_offset(eq->mtr.kmem,
5461 (eq->cons_index & (eq->entries - 1)) *
5462 eq->eqe_size);
5463
5464 return (roce_get_bit(aeqe->asyn, HNS_ROCE_V2_AEQ_AEQE_OWNER_S) ^
5465 !!(eq->cons_index & eq->entries)) ? aeqe : NULL;
5466 }
5467
hns_roce_v2_aeq_int(struct hns_roce_dev * hr_dev,struct hns_roce_eq * eq)5468 static int hns_roce_v2_aeq_int(struct hns_roce_dev *hr_dev,
5469 struct hns_roce_eq *eq)
5470 {
5471 struct device *dev = hr_dev->dev;
5472 struct hns_roce_aeqe *aeqe = next_aeqe_sw_v2(eq);
5473 int aeqe_found = 0;
5474 int event_type;
5475 int sub_type;
5476 u32 srqn;
5477 u32 qpn;
5478 u32 cqn;
5479
5480 while (aeqe) {
5481 /* Make sure we read AEQ entry after we have checked the
5482 * ownership bit
5483 */
5484 dma_rmb();
5485
5486 event_type = roce_get_field(aeqe->asyn,
5487 HNS_ROCE_V2_AEQE_EVENT_TYPE_M,
5488 HNS_ROCE_V2_AEQE_EVENT_TYPE_S);
5489 sub_type = roce_get_field(aeqe->asyn,
5490 HNS_ROCE_V2_AEQE_SUB_TYPE_M,
5491 HNS_ROCE_V2_AEQE_SUB_TYPE_S);
5492 qpn = roce_get_field(aeqe->event.qp_event.qp,
5493 HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_M,
5494 HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_S);
5495 cqn = roce_get_field(aeqe->event.cq_event.cq,
5496 HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_M,
5497 HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_S);
5498 srqn = roce_get_field(aeqe->event.srq_event.srq,
5499 HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_M,
5500 HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_S);
5501
5502 switch (event_type) {
5503 case HNS_ROCE_EVENT_TYPE_PATH_MIG:
5504 case HNS_ROCE_EVENT_TYPE_PATH_MIG_FAILED:
5505 case HNS_ROCE_EVENT_TYPE_COMM_EST:
5506 case HNS_ROCE_EVENT_TYPE_SQ_DRAINED:
5507 case HNS_ROCE_EVENT_TYPE_WQ_CATAS_ERROR:
5508 case HNS_ROCE_EVENT_TYPE_SRQ_LAST_WQE_REACH:
5509 case HNS_ROCE_EVENT_TYPE_INV_REQ_LOCAL_WQ_ERROR:
5510 case HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR:
5511 hns_roce_qp_event(hr_dev, qpn, event_type);
5512 break;
5513 case HNS_ROCE_EVENT_TYPE_SRQ_LIMIT_REACH:
5514 case HNS_ROCE_EVENT_TYPE_SRQ_CATAS_ERROR:
5515 hns_roce_srq_event(hr_dev, srqn, event_type);
5516 break;
5517 case HNS_ROCE_EVENT_TYPE_CQ_ACCESS_ERROR:
5518 case HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW:
5519 hns_roce_cq_event(hr_dev, cqn, event_type);
5520 break;
5521 case HNS_ROCE_EVENT_TYPE_DB_OVERFLOW:
5522 break;
5523 case HNS_ROCE_EVENT_TYPE_MB:
5524 hns_roce_cmd_event(hr_dev,
5525 le16_to_cpu(aeqe->event.cmd.token),
5526 aeqe->event.cmd.status,
5527 le64_to_cpu(aeqe->event.cmd.out_param));
5528 break;
5529 case HNS_ROCE_EVENT_TYPE_CEQ_OVERFLOW:
5530 break;
5531 case HNS_ROCE_EVENT_TYPE_FLR:
5532 break;
5533 default:
5534 dev_err(dev, "Unhandled event %d on EQ %d at idx %u.\n",
5535 event_type, eq->eqn, eq->cons_index);
5536 break;
5537 }
5538
5539 eq->event_type = event_type;
5540 eq->sub_type = sub_type;
5541 ++eq->cons_index;
5542 aeqe_found = 1;
5543
5544 if (eq->cons_index > (2 * eq->entries - 1))
5545 eq->cons_index = 0;
5546
5547 hns_roce_v2_init_irq_work(hr_dev, eq, qpn, cqn);
5548
5549 aeqe = next_aeqe_sw_v2(eq);
5550 }
5551
5552 set_eq_cons_index_v2(eq);
5553 return aeqe_found;
5554 }
5555
next_ceqe_sw_v2(struct hns_roce_eq * eq)5556 static struct hns_roce_ceqe *next_ceqe_sw_v2(struct hns_roce_eq *eq)
5557 {
5558 struct hns_roce_ceqe *ceqe;
5559
5560 ceqe = hns_roce_buf_offset(eq->mtr.kmem,
5561 (eq->cons_index & (eq->entries - 1)) *
5562 eq->eqe_size);
5563
5564 return (!!(roce_get_bit(ceqe->comp, HNS_ROCE_V2_CEQ_CEQE_OWNER_S))) ^
5565 (!!(eq->cons_index & eq->entries)) ? ceqe : NULL;
5566 }
5567
hns_roce_v2_ceq_int(struct hns_roce_dev * hr_dev,struct hns_roce_eq * eq)5568 static int hns_roce_v2_ceq_int(struct hns_roce_dev *hr_dev,
5569 struct hns_roce_eq *eq)
5570 {
5571 struct hns_roce_ceqe *ceqe = next_ceqe_sw_v2(eq);
5572 int ceqe_found = 0;
5573 u32 cqn;
5574
5575 while (ceqe) {
5576 /* Make sure we read CEQ entry after we have checked the
5577 * ownership bit
5578 */
5579 dma_rmb();
5580
5581 cqn = roce_get_field(ceqe->comp, HNS_ROCE_V2_CEQE_COMP_CQN_M,
5582 HNS_ROCE_V2_CEQE_COMP_CQN_S);
5583
5584 hns_roce_cq_completion(hr_dev, cqn);
5585
5586 ++eq->cons_index;
5587 ceqe_found = 1;
5588
5589 if (eq->cons_index > (EQ_DEPTH_COEFF * eq->entries - 1))
5590 eq->cons_index = 0;
5591
5592 ceqe = next_ceqe_sw_v2(eq);
5593 }
5594
5595 set_eq_cons_index_v2(eq);
5596
5597 return ceqe_found;
5598 }
5599
hns_roce_v2_msix_interrupt_eq(int irq,void * eq_ptr)5600 static irqreturn_t hns_roce_v2_msix_interrupt_eq(int irq, void *eq_ptr)
5601 {
5602 struct hns_roce_eq *eq = eq_ptr;
5603 struct hns_roce_dev *hr_dev = eq->hr_dev;
5604 int int_work;
5605
5606 if (eq->type_flag == HNS_ROCE_CEQ)
5607 /* Completion event interrupt */
5608 int_work = hns_roce_v2_ceq_int(hr_dev, eq);
5609 else
5610 /* Asychronous event interrupt */
5611 int_work = hns_roce_v2_aeq_int(hr_dev, eq);
5612
5613 return IRQ_RETVAL(int_work);
5614 }
5615
hns_roce_v2_msix_interrupt_abn(int irq,void * dev_id)5616 static irqreturn_t hns_roce_v2_msix_interrupt_abn(int irq, void *dev_id)
5617 {
5618 struct hns_roce_dev *hr_dev = dev_id;
5619 struct device *dev = hr_dev->dev;
5620 int int_work = 0;
5621 u32 int_st;
5622 u32 int_en;
5623
5624 /* Abnormal interrupt */
5625 int_st = roce_read(hr_dev, ROCEE_VF_ABN_INT_ST_REG);
5626 int_en = roce_read(hr_dev, ROCEE_VF_ABN_INT_EN_REG);
5627
5628 if (int_st & BIT(HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S)) {
5629 struct pci_dev *pdev = hr_dev->pci_dev;
5630 struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev);
5631 const struct hnae3_ae_ops *ops = ae_dev->ops;
5632
5633 dev_err(dev, "AEQ overflow!\n");
5634
5635 int_st |= 1 << HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S;
5636 roce_write(hr_dev, ROCEE_VF_ABN_INT_ST_REG, int_st);
5637
5638 /* Set reset level for reset_event() */
5639 if (ops->set_default_reset_request)
5640 ops->set_default_reset_request(ae_dev,
5641 HNAE3_FUNC_RESET);
5642 if (ops->reset_event)
5643 ops->reset_event(pdev, NULL);
5644
5645 int_en |= 1 << HNS_ROCE_V2_VF_ABN_INT_EN_S;
5646 roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG, int_en);
5647
5648 int_work = 1;
5649 } else if (int_st & BIT(HNS_ROCE_V2_VF_INT_ST_BUS_ERR_S)) {
5650 dev_err(dev, "BUS ERR!\n");
5651
5652 int_st |= 1 << HNS_ROCE_V2_VF_INT_ST_BUS_ERR_S;
5653 roce_write(hr_dev, ROCEE_VF_ABN_INT_ST_REG, int_st);
5654
5655 int_en |= 1 << HNS_ROCE_V2_VF_ABN_INT_EN_S;
5656 roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG, int_en);
5657
5658 int_work = 1;
5659 } else if (int_st & BIT(HNS_ROCE_V2_VF_INT_ST_OTHER_ERR_S)) {
5660 dev_err(dev, "OTHER ERR!\n");
5661
5662 int_st |= 1 << HNS_ROCE_V2_VF_INT_ST_OTHER_ERR_S;
5663 roce_write(hr_dev, ROCEE_VF_ABN_INT_ST_REG, int_st);
5664
5665 int_en |= 1 << HNS_ROCE_V2_VF_ABN_INT_EN_S;
5666 roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG, int_en);
5667
5668 int_work = 1;
5669 } else
5670 dev_err(dev, "There is no abnormal irq found!\n");
5671
5672 return IRQ_RETVAL(int_work);
5673 }
5674
hns_roce_v2_int_mask_enable(struct hns_roce_dev * hr_dev,int eq_num,int enable_flag)5675 static void hns_roce_v2_int_mask_enable(struct hns_roce_dev *hr_dev,
5676 int eq_num, int enable_flag)
5677 {
5678 int i;
5679
5680 if (enable_flag == EQ_ENABLE) {
5681 for (i = 0; i < eq_num; i++)
5682 roce_write(hr_dev, ROCEE_VF_EVENT_INT_EN_REG +
5683 i * EQ_REG_OFFSET,
5684 HNS_ROCE_V2_VF_EVENT_INT_EN_M);
5685
5686 roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG,
5687 HNS_ROCE_V2_VF_ABN_INT_EN_M);
5688 roce_write(hr_dev, ROCEE_VF_ABN_INT_CFG_REG,
5689 HNS_ROCE_V2_VF_ABN_INT_CFG_M);
5690 } else {
5691 for (i = 0; i < eq_num; i++)
5692 roce_write(hr_dev, ROCEE_VF_EVENT_INT_EN_REG +
5693 i * EQ_REG_OFFSET,
5694 HNS_ROCE_V2_VF_EVENT_INT_EN_M & 0x0);
5695
5696 roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG,
5697 HNS_ROCE_V2_VF_ABN_INT_EN_M & 0x0);
5698 roce_write(hr_dev, ROCEE_VF_ABN_INT_CFG_REG,
5699 HNS_ROCE_V2_VF_ABN_INT_CFG_M & 0x0);
5700 }
5701 }
5702
hns_roce_v2_destroy_eqc(struct hns_roce_dev * hr_dev,int eqn)5703 static void hns_roce_v2_destroy_eqc(struct hns_roce_dev *hr_dev, int eqn)
5704 {
5705 struct device *dev = hr_dev->dev;
5706 int ret;
5707
5708 if (eqn < hr_dev->caps.num_comp_vectors)
5709 ret = hns_roce_cmd_mbox(hr_dev, 0, 0, eqn & HNS_ROCE_V2_EQN_M,
5710 0, HNS_ROCE_CMD_DESTROY_CEQC,
5711 HNS_ROCE_CMD_TIMEOUT_MSECS);
5712 else
5713 ret = hns_roce_cmd_mbox(hr_dev, 0, 0, eqn & HNS_ROCE_V2_EQN_M,
5714 0, HNS_ROCE_CMD_DESTROY_AEQC,
5715 HNS_ROCE_CMD_TIMEOUT_MSECS);
5716 if (ret)
5717 dev_err(dev, "[mailbox cmd] destroy eqc(%d) failed.\n", eqn);
5718 }
5719
free_eq_buf(struct hns_roce_dev * hr_dev,struct hns_roce_eq * eq)5720 static void free_eq_buf(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq)
5721 {
5722 hns_roce_mtr_destroy(hr_dev, &eq->mtr);
5723 }
5724
config_eqc(struct hns_roce_dev * hr_dev,struct hns_roce_eq * eq,void * mb_buf)5725 static int config_eqc(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq,
5726 void *mb_buf)
5727 {
5728 u64 eqe_ba[MTT_MIN_COUNT] = { 0 };
5729 struct hns_roce_eq_context *eqc;
5730 u64 bt_ba = 0;
5731 int count;
5732
5733 eqc = mb_buf;
5734 memset(eqc, 0, sizeof(struct hns_roce_eq_context));
5735
5736 /* init eqc */
5737 eq->doorbell = hr_dev->reg_base + ROCEE_VF_EQ_DB_CFG0_REG;
5738 eq->cons_index = 0;
5739 eq->over_ignore = HNS_ROCE_V2_EQ_OVER_IGNORE_0;
5740 eq->coalesce = HNS_ROCE_V2_EQ_COALESCE_0;
5741 eq->arm_st = HNS_ROCE_V2_EQ_ALWAYS_ARMED;
5742 eq->shift = ilog2((unsigned int)eq->entries);
5743
5744 /* if not multi-hop, eqe buffer only use one trunk */
5745 count = hns_roce_mtr_find(hr_dev, &eq->mtr, 0, eqe_ba, MTT_MIN_COUNT,
5746 &bt_ba);
5747 if (count < 1) {
5748 dev_err(hr_dev->dev, "failed to find EQE mtr\n");
5749 return -ENOBUFS;
5750 }
5751
5752 /* set eqc state */
5753 roce_set_field(eqc->byte_4, HNS_ROCE_EQC_EQ_ST_M, HNS_ROCE_EQC_EQ_ST_S,
5754 HNS_ROCE_V2_EQ_STATE_VALID);
5755
5756 /* set eqe hop num */
5757 roce_set_field(eqc->byte_4, HNS_ROCE_EQC_HOP_NUM_M,
5758 HNS_ROCE_EQC_HOP_NUM_S, eq->hop_num);
5759
5760 /* set eqc over_ignore */
5761 roce_set_field(eqc->byte_4, HNS_ROCE_EQC_OVER_IGNORE_M,
5762 HNS_ROCE_EQC_OVER_IGNORE_S, eq->over_ignore);
5763
5764 /* set eqc coalesce */
5765 roce_set_field(eqc->byte_4, HNS_ROCE_EQC_COALESCE_M,
5766 HNS_ROCE_EQC_COALESCE_S, eq->coalesce);
5767
5768 /* set eqc arm_state */
5769 roce_set_field(eqc->byte_4, HNS_ROCE_EQC_ARM_ST_M,
5770 HNS_ROCE_EQC_ARM_ST_S, eq->arm_st);
5771
5772 /* set eqn */
5773 roce_set_field(eqc->byte_4, HNS_ROCE_EQC_EQN_M, HNS_ROCE_EQC_EQN_S,
5774 eq->eqn);
5775
5776 /* set eqe_cnt */
5777 roce_set_field(eqc->byte_4, HNS_ROCE_EQC_EQE_CNT_M,
5778 HNS_ROCE_EQC_EQE_CNT_S, HNS_ROCE_EQ_INIT_EQE_CNT);
5779
5780 /* set eqe_ba_pg_sz */
5781 roce_set_field(eqc->byte_8, HNS_ROCE_EQC_BA_PG_SZ_M,
5782 HNS_ROCE_EQC_BA_PG_SZ_S,
5783 to_hr_hw_page_shift(eq->mtr.hem_cfg.ba_pg_shift));
5784
5785 /* set eqe_buf_pg_sz */
5786 roce_set_field(eqc->byte_8, HNS_ROCE_EQC_BUF_PG_SZ_M,
5787 HNS_ROCE_EQC_BUF_PG_SZ_S,
5788 to_hr_hw_page_shift(eq->mtr.hem_cfg.buf_pg_shift));
5789
5790 /* set eq_producer_idx */
5791 roce_set_field(eqc->byte_8, HNS_ROCE_EQC_PROD_INDX_M,
5792 HNS_ROCE_EQC_PROD_INDX_S, HNS_ROCE_EQ_INIT_PROD_IDX);
5793
5794 /* set eq_max_cnt */
5795 roce_set_field(eqc->byte_12, HNS_ROCE_EQC_MAX_CNT_M,
5796 HNS_ROCE_EQC_MAX_CNT_S, eq->eq_max_cnt);
5797
5798 /* set eq_period */
5799 roce_set_field(eqc->byte_12, HNS_ROCE_EQC_PERIOD_M,
5800 HNS_ROCE_EQC_PERIOD_S, eq->eq_period);
5801
5802 /* set eqe_report_timer */
5803 roce_set_field(eqc->eqe_report_timer, HNS_ROCE_EQC_REPORT_TIMER_M,
5804 HNS_ROCE_EQC_REPORT_TIMER_S,
5805 HNS_ROCE_EQ_INIT_REPORT_TIMER);
5806
5807 /* set bt_ba [34:3] */
5808 roce_set_field(eqc->eqe_ba0, HNS_ROCE_EQC_EQE_BA_L_M,
5809 HNS_ROCE_EQC_EQE_BA_L_S, bt_ba >> 3);
5810
5811 /* set bt_ba [64:35] */
5812 roce_set_field(eqc->eqe_ba1, HNS_ROCE_EQC_EQE_BA_H_M,
5813 HNS_ROCE_EQC_EQE_BA_H_S, bt_ba >> 35);
5814
5815 /* set eq shift */
5816 roce_set_field(eqc->byte_28, HNS_ROCE_EQC_SHIFT_M, HNS_ROCE_EQC_SHIFT_S,
5817 eq->shift);
5818
5819 /* set eq MSI_IDX */
5820 roce_set_field(eqc->byte_28, HNS_ROCE_EQC_MSI_INDX_M,
5821 HNS_ROCE_EQC_MSI_INDX_S, HNS_ROCE_EQ_INIT_MSI_IDX);
5822
5823 /* set cur_eqe_ba [27:12] */
5824 roce_set_field(eqc->byte_28, HNS_ROCE_EQC_CUR_EQE_BA_L_M,
5825 HNS_ROCE_EQC_CUR_EQE_BA_L_S, eqe_ba[0] >> 12);
5826
5827 /* set cur_eqe_ba [59:28] */
5828 roce_set_field(eqc->byte_32, HNS_ROCE_EQC_CUR_EQE_BA_M_M,
5829 HNS_ROCE_EQC_CUR_EQE_BA_M_S, eqe_ba[0] >> 28);
5830
5831 /* set cur_eqe_ba [63:60] */
5832 roce_set_field(eqc->byte_36, HNS_ROCE_EQC_CUR_EQE_BA_H_M,
5833 HNS_ROCE_EQC_CUR_EQE_BA_H_S, eqe_ba[0] >> 60);
5834
5835 /* set eq consumer idx */
5836 roce_set_field(eqc->byte_36, HNS_ROCE_EQC_CONS_INDX_M,
5837 HNS_ROCE_EQC_CONS_INDX_S, HNS_ROCE_EQ_INIT_CONS_IDX);
5838
5839 roce_set_field(eqc->byte_40, HNS_ROCE_EQC_NXT_EQE_BA_L_M,
5840 HNS_ROCE_EQC_NXT_EQE_BA_L_S, eqe_ba[1] >> 12);
5841
5842 roce_set_field(eqc->byte_44, HNS_ROCE_EQC_NXT_EQE_BA_H_M,
5843 HNS_ROCE_EQC_NXT_EQE_BA_H_S, eqe_ba[1] >> 44);
5844
5845 roce_set_field(eqc->byte_44, HNS_ROCE_EQC_EQE_SIZE_M,
5846 HNS_ROCE_EQC_EQE_SIZE_S,
5847 eq->eqe_size == HNS_ROCE_V3_EQE_SIZE ? 1 : 0);
5848
5849 return 0;
5850 }
5851
alloc_eq_buf(struct hns_roce_dev * hr_dev,struct hns_roce_eq * eq)5852 static int alloc_eq_buf(struct hns_roce_dev *hr_dev, struct hns_roce_eq *eq)
5853 {
5854 struct hns_roce_buf_attr buf_attr = {};
5855 int err;
5856
5857 if (hr_dev->caps.eqe_hop_num == HNS_ROCE_HOP_NUM_0)
5858 eq->hop_num = 0;
5859 else
5860 eq->hop_num = hr_dev->caps.eqe_hop_num;
5861
5862 buf_attr.page_shift = hr_dev->caps.eqe_buf_pg_sz + HNS_HW_PAGE_SHIFT;
5863 buf_attr.region[0].size = eq->entries * eq->eqe_size;
5864 buf_attr.region[0].hopnum = eq->hop_num;
5865 buf_attr.region_count = 1;
5866 buf_attr.fixed_page = true;
5867
5868 err = hns_roce_mtr_create(hr_dev, &eq->mtr, &buf_attr,
5869 hr_dev->caps.eqe_ba_pg_sz +
5870 HNS_HW_PAGE_SHIFT, NULL, 0);
5871 if (err)
5872 dev_err(hr_dev->dev, "Failed to alloc EQE mtr, err %d\n", err);
5873
5874 return err;
5875 }
5876
hns_roce_v2_create_eq(struct hns_roce_dev * hr_dev,struct hns_roce_eq * eq,unsigned int eq_cmd)5877 static int hns_roce_v2_create_eq(struct hns_roce_dev *hr_dev,
5878 struct hns_roce_eq *eq,
5879 unsigned int eq_cmd)
5880 {
5881 struct hns_roce_cmd_mailbox *mailbox;
5882 int ret;
5883
5884 /* Allocate mailbox memory */
5885 mailbox = hns_roce_alloc_cmd_mailbox(hr_dev);
5886 if (IS_ERR_OR_NULL(mailbox))
5887 return -ENOMEM;
5888
5889 ret = alloc_eq_buf(hr_dev, eq);
5890 if (ret)
5891 goto free_cmd_mbox;
5892
5893 ret = config_eqc(hr_dev, eq, mailbox->buf);
5894 if (ret)
5895 goto err_cmd_mbox;
5896
5897 ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0, eq->eqn, 0,
5898 eq_cmd, HNS_ROCE_CMD_TIMEOUT_MSECS);
5899 if (ret) {
5900 dev_err(hr_dev->dev, "[mailbox cmd] create eqc failed.\n");
5901 goto err_cmd_mbox;
5902 }
5903
5904 hns_roce_free_cmd_mailbox(hr_dev, mailbox);
5905
5906 return 0;
5907
5908 err_cmd_mbox:
5909 free_eq_buf(hr_dev, eq);
5910
5911 free_cmd_mbox:
5912 hns_roce_free_cmd_mailbox(hr_dev, mailbox);
5913
5914 return ret;
5915 }
5916
__hns_roce_request_irq(struct hns_roce_dev * hr_dev,int irq_num,int comp_num,int aeq_num,int other_num)5917 static int __hns_roce_request_irq(struct hns_roce_dev *hr_dev, int irq_num,
5918 int comp_num, int aeq_num, int other_num)
5919 {
5920 struct hns_roce_eq_table *eq_table = &hr_dev->eq_table;
5921 int i, j;
5922 int ret;
5923
5924 for (i = 0; i < irq_num; i++) {
5925 hr_dev->irq_names[i] = kzalloc(HNS_ROCE_INT_NAME_LEN,
5926 GFP_KERNEL);
5927 if (!hr_dev->irq_names[i]) {
5928 ret = -ENOMEM;
5929 goto err_kzalloc_failed;
5930 }
5931 }
5932
5933 /* irq contains: abnormal + AEQ + CEQ */
5934 for (j = 0; j < other_num; j++)
5935 snprintf((char *)hr_dev->irq_names[j], HNS_ROCE_INT_NAME_LEN,
5936 "hns-abn-%d", j);
5937
5938 for (j = other_num; j < (other_num + aeq_num); j++)
5939 snprintf((char *)hr_dev->irq_names[j], HNS_ROCE_INT_NAME_LEN,
5940 "hns-aeq-%d", j - other_num);
5941
5942 for (j = (other_num + aeq_num); j < irq_num; j++)
5943 snprintf((char *)hr_dev->irq_names[j], HNS_ROCE_INT_NAME_LEN,
5944 "hns-ceq-%d", j - other_num - aeq_num);
5945
5946 for (j = 0; j < irq_num; j++) {
5947 if (j < other_num)
5948 ret = request_irq(hr_dev->irq[j],
5949 hns_roce_v2_msix_interrupt_abn,
5950 0, hr_dev->irq_names[j], hr_dev);
5951
5952 else if (j < (other_num + comp_num))
5953 ret = request_irq(eq_table->eq[j - other_num].irq,
5954 hns_roce_v2_msix_interrupt_eq,
5955 0, hr_dev->irq_names[j + aeq_num],
5956 &eq_table->eq[j - other_num]);
5957 else
5958 ret = request_irq(eq_table->eq[j - other_num].irq,
5959 hns_roce_v2_msix_interrupt_eq,
5960 0, hr_dev->irq_names[j - comp_num],
5961 &eq_table->eq[j - other_num]);
5962 if (ret) {
5963 dev_err(hr_dev->dev, "Request irq error!\n");
5964 goto err_request_failed;
5965 }
5966 }
5967
5968 return 0;
5969
5970 err_request_failed:
5971 for (j -= 1; j >= 0; j--)
5972 if (j < other_num)
5973 free_irq(hr_dev->irq[j], hr_dev);
5974 else
5975 free_irq(eq_table->eq[j - other_num].irq,
5976 &eq_table->eq[j - other_num]);
5977
5978 err_kzalloc_failed:
5979 for (i -= 1; i >= 0; i--)
5980 kfree(hr_dev->irq_names[i]);
5981
5982 return ret;
5983 }
5984
__hns_roce_free_irq(struct hns_roce_dev * hr_dev)5985 static void __hns_roce_free_irq(struct hns_roce_dev *hr_dev)
5986 {
5987 int irq_num;
5988 int eq_num;
5989 int i;
5990
5991 eq_num = hr_dev->caps.num_comp_vectors + hr_dev->caps.num_aeq_vectors;
5992 irq_num = eq_num + hr_dev->caps.num_other_vectors;
5993
5994 for (i = 0; i < hr_dev->caps.num_other_vectors; i++)
5995 free_irq(hr_dev->irq[i], hr_dev);
5996
5997 for (i = 0; i < eq_num; i++)
5998 free_irq(hr_dev->eq_table.eq[i].irq, &hr_dev->eq_table.eq[i]);
5999
6000 for (i = 0; i < irq_num; i++)
6001 kfree(hr_dev->irq_names[i]);
6002 }
6003
hns_roce_v2_init_eq_table(struct hns_roce_dev * hr_dev)6004 static int hns_roce_v2_init_eq_table(struct hns_roce_dev *hr_dev)
6005 {
6006 struct hns_roce_eq_table *eq_table = &hr_dev->eq_table;
6007 struct device *dev = hr_dev->dev;
6008 struct hns_roce_eq *eq;
6009 unsigned int eq_cmd;
6010 int irq_num;
6011 int eq_num;
6012 int other_num;
6013 int comp_num;
6014 int aeq_num;
6015 int i;
6016 int ret;
6017
6018 other_num = hr_dev->caps.num_other_vectors;
6019 comp_num = hr_dev->caps.num_comp_vectors;
6020 aeq_num = hr_dev->caps.num_aeq_vectors;
6021
6022 eq_num = comp_num + aeq_num;
6023 irq_num = eq_num + other_num;
6024
6025 eq_table->eq = kcalloc(eq_num, sizeof(*eq_table->eq), GFP_KERNEL);
6026 if (!eq_table->eq)
6027 return -ENOMEM;
6028
6029 /* create eq */
6030 for (i = 0; i < eq_num; i++) {
6031 eq = &eq_table->eq[i];
6032 eq->hr_dev = hr_dev;
6033 eq->eqn = i;
6034 if (i < comp_num) {
6035 /* CEQ */
6036 eq_cmd = HNS_ROCE_CMD_CREATE_CEQC;
6037 eq->type_flag = HNS_ROCE_CEQ;
6038 eq->entries = hr_dev->caps.ceqe_depth;
6039 eq->eqe_size = hr_dev->caps.ceqe_size;
6040 eq->irq = hr_dev->irq[i + other_num + aeq_num];
6041 eq->eq_max_cnt = HNS_ROCE_CEQ_DEFAULT_BURST_NUM;
6042 eq->eq_period = HNS_ROCE_CEQ_DEFAULT_INTERVAL;
6043 } else {
6044 /* AEQ */
6045 eq_cmd = HNS_ROCE_CMD_CREATE_AEQC;
6046 eq->type_flag = HNS_ROCE_AEQ;
6047 eq->entries = hr_dev->caps.aeqe_depth;
6048 eq->eqe_size = hr_dev->caps.aeqe_size;
6049 eq->irq = hr_dev->irq[i - comp_num + other_num];
6050 eq->eq_max_cnt = HNS_ROCE_AEQ_DEFAULT_BURST_NUM;
6051 eq->eq_period = HNS_ROCE_AEQ_DEFAULT_INTERVAL;
6052 }
6053
6054 ret = hns_roce_v2_create_eq(hr_dev, eq, eq_cmd);
6055 if (ret) {
6056 dev_err(dev, "eq create failed.\n");
6057 goto err_create_eq_fail;
6058 }
6059 }
6060
6061 /* enable irq */
6062 hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_ENABLE);
6063
6064 ret = __hns_roce_request_irq(hr_dev, irq_num, comp_num,
6065 aeq_num, other_num);
6066 if (ret) {
6067 dev_err(dev, "Request irq failed.\n");
6068 goto err_request_irq_fail;
6069 }
6070
6071 hr_dev->irq_workq = alloc_ordered_workqueue("hns_roce_irq_workq", 0);
6072 if (!hr_dev->irq_workq) {
6073 dev_err(dev, "Create irq workqueue failed!\n");
6074 ret = -ENOMEM;
6075 goto err_create_wq_fail;
6076 }
6077
6078 return 0;
6079
6080 err_create_wq_fail:
6081 __hns_roce_free_irq(hr_dev);
6082
6083 err_request_irq_fail:
6084 hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_DISABLE);
6085
6086 err_create_eq_fail:
6087 for (i -= 1; i >= 0; i--)
6088 free_eq_buf(hr_dev, &eq_table->eq[i]);
6089 kfree(eq_table->eq);
6090
6091 return ret;
6092 }
6093
hns_roce_v2_cleanup_eq_table(struct hns_roce_dev * hr_dev)6094 static void hns_roce_v2_cleanup_eq_table(struct hns_roce_dev *hr_dev)
6095 {
6096 struct hns_roce_eq_table *eq_table = &hr_dev->eq_table;
6097 int eq_num;
6098 int i;
6099
6100 eq_num = hr_dev->caps.num_comp_vectors + hr_dev->caps.num_aeq_vectors;
6101
6102 /* Disable irq */
6103 hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_DISABLE);
6104
6105 __hns_roce_free_irq(hr_dev);
6106
6107 for (i = 0; i < eq_num; i++) {
6108 hns_roce_v2_destroy_eqc(hr_dev, i);
6109
6110 free_eq_buf(hr_dev, &eq_table->eq[i]);
6111 }
6112
6113 kfree(eq_table->eq);
6114
6115 flush_workqueue(hr_dev->irq_workq);
6116 destroy_workqueue(hr_dev->irq_workq);
6117 }
6118
6119 static const struct hns_roce_dfx_hw hns_roce_dfx_hw_v2 = {
6120 .query_cqc_info = hns_roce_v2_query_cqc_info,
6121 };
6122
6123 static const struct ib_device_ops hns_roce_v2_dev_ops = {
6124 .destroy_qp = hns_roce_v2_destroy_qp,
6125 .modify_cq = hns_roce_v2_modify_cq,
6126 .poll_cq = hns_roce_v2_poll_cq,
6127 .post_recv = hns_roce_v2_post_recv,
6128 .post_send = hns_roce_v2_post_send,
6129 .query_qp = hns_roce_v2_query_qp,
6130 .req_notify_cq = hns_roce_v2_req_notify_cq,
6131 };
6132
6133 static const struct ib_device_ops hns_roce_v2_dev_srq_ops = {
6134 .modify_srq = hns_roce_v2_modify_srq,
6135 .post_srq_recv = hns_roce_v2_post_srq_recv,
6136 .query_srq = hns_roce_v2_query_srq,
6137 };
6138
6139 static const struct hns_roce_hw hns_roce_hw_v2 = {
6140 .cmq_init = hns_roce_v2_cmq_init,
6141 .cmq_exit = hns_roce_v2_cmq_exit,
6142 .hw_profile = hns_roce_v2_profile,
6143 .hw_init = hns_roce_v2_init,
6144 .hw_exit = hns_roce_v2_exit,
6145 .post_mbox = hns_roce_v2_post_mbox,
6146 .chk_mbox = hns_roce_v2_chk_mbox,
6147 .rst_prc_mbox = hns_roce_v2_rst_process_cmd,
6148 .set_gid = hns_roce_v2_set_gid,
6149 .set_mac = hns_roce_v2_set_mac,
6150 .write_mtpt = hns_roce_v2_write_mtpt,
6151 .rereg_write_mtpt = hns_roce_v2_rereg_write_mtpt,
6152 .frmr_write_mtpt = hns_roce_v2_frmr_write_mtpt,
6153 .mw_write_mtpt = hns_roce_v2_mw_write_mtpt,
6154 .write_cqc = hns_roce_v2_write_cqc,
6155 .set_hem = hns_roce_v2_set_hem,
6156 .clear_hem = hns_roce_v2_clear_hem,
6157 .modify_qp = hns_roce_v2_modify_qp,
6158 .query_qp = hns_roce_v2_query_qp,
6159 .destroy_qp = hns_roce_v2_destroy_qp,
6160 .qp_flow_control_init = hns_roce_v2_qp_flow_control_init,
6161 .modify_cq = hns_roce_v2_modify_cq,
6162 .post_send = hns_roce_v2_post_send,
6163 .post_recv = hns_roce_v2_post_recv,
6164 .req_notify_cq = hns_roce_v2_req_notify_cq,
6165 .poll_cq = hns_roce_v2_poll_cq,
6166 .init_eq = hns_roce_v2_init_eq_table,
6167 .cleanup_eq = hns_roce_v2_cleanup_eq_table,
6168 .write_srqc = hns_roce_v2_write_srqc,
6169 .modify_srq = hns_roce_v2_modify_srq,
6170 .query_srq = hns_roce_v2_query_srq,
6171 .post_srq_recv = hns_roce_v2_post_srq_recv,
6172 .hns_roce_dev_ops = &hns_roce_v2_dev_ops,
6173 .hns_roce_dev_srq_ops = &hns_roce_v2_dev_srq_ops,
6174 };
6175
6176 static const struct pci_device_id hns_roce_hw_v2_pci_tbl[] = {
6177 {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA), 0},
6178 {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_25GE_RDMA_MACSEC), 0},
6179 {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA), 0},
6180 {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_50GE_RDMA_MACSEC), 0},
6181 {PCI_VDEVICE(HUAWEI, HNAE3_DEV_ID_100G_RDMA_MACSEC), 0},
6182 /* required last entry */
6183 {0, }
6184 };
6185
6186 MODULE_DEVICE_TABLE(pci, hns_roce_hw_v2_pci_tbl);
6187
hns_roce_hw_v2_get_cfg(struct hns_roce_dev * hr_dev,struct hnae3_handle * handle)6188 static void hns_roce_hw_v2_get_cfg(struct hns_roce_dev *hr_dev,
6189 struct hnae3_handle *handle)
6190 {
6191 struct hns_roce_v2_priv *priv = hr_dev->priv;
6192 int i;
6193
6194 hr_dev->pci_dev = handle->pdev;
6195 hr_dev->dev = &handle->pdev->dev;
6196 hr_dev->hw = &hns_roce_hw_v2;
6197 hr_dev->dfx = &hns_roce_dfx_hw_v2;
6198 hr_dev->sdb_offset = ROCEE_DB_SQ_L_0_REG;
6199 hr_dev->odb_offset = hr_dev->sdb_offset;
6200
6201 /* Get info from NIC driver. */
6202 hr_dev->reg_base = handle->rinfo.roce_io_base;
6203 hr_dev->caps.num_ports = 1;
6204 hr_dev->iboe.netdevs[0] = handle->rinfo.netdev;
6205 hr_dev->iboe.phy_port[0] = 0;
6206
6207 addrconf_addr_eui48((u8 *)&hr_dev->ib_dev.node_guid,
6208 hr_dev->iboe.netdevs[0]->dev_addr);
6209
6210 for (i = 0; i < HNS_ROCE_V2_MAX_IRQ_NUM; i++)
6211 hr_dev->irq[i] = pci_irq_vector(handle->pdev,
6212 i + handle->rinfo.base_vector);
6213
6214 /* cmd issue mode: 0 is poll, 1 is event */
6215 hr_dev->cmd_mod = 1;
6216 hr_dev->loop_idc = 0;
6217
6218 hr_dev->reset_cnt = handle->ae_algo->ops->ae_dev_reset_cnt(handle);
6219 priv->handle = handle;
6220 }
6221
__hns_roce_hw_v2_init_instance(struct hnae3_handle * handle)6222 static int __hns_roce_hw_v2_init_instance(struct hnae3_handle *handle)
6223 {
6224 struct hns_roce_dev *hr_dev;
6225 int ret;
6226
6227 hr_dev = ib_alloc_device(hns_roce_dev, ib_dev);
6228 if (!hr_dev)
6229 return -ENOMEM;
6230
6231 hr_dev->priv = kzalloc(sizeof(struct hns_roce_v2_priv), GFP_KERNEL);
6232 if (!hr_dev->priv) {
6233 ret = -ENOMEM;
6234 goto error_failed_kzalloc;
6235 }
6236
6237 hns_roce_hw_v2_get_cfg(hr_dev, handle);
6238
6239 ret = hns_roce_init(hr_dev);
6240 if (ret) {
6241 dev_err(hr_dev->dev, "RoCE Engine init failed!\n");
6242 goto error_failed_get_cfg;
6243 }
6244
6245 handle->priv = hr_dev;
6246
6247 return 0;
6248
6249 error_failed_get_cfg:
6250 kfree(hr_dev->priv);
6251
6252 error_failed_kzalloc:
6253 ib_dealloc_device(&hr_dev->ib_dev);
6254
6255 return ret;
6256 }
6257
__hns_roce_hw_v2_uninit_instance(struct hnae3_handle * handle,bool reset)6258 static void __hns_roce_hw_v2_uninit_instance(struct hnae3_handle *handle,
6259 bool reset)
6260 {
6261 struct hns_roce_dev *hr_dev = handle->priv;
6262
6263 if (!hr_dev)
6264 return;
6265
6266 handle->priv = NULL;
6267
6268 hr_dev->state = HNS_ROCE_DEVICE_STATE_UNINIT;
6269 hns_roce_handle_device_err(hr_dev);
6270
6271 hns_roce_exit(hr_dev);
6272 kfree(hr_dev->priv);
6273 ib_dealloc_device(&hr_dev->ib_dev);
6274 }
6275
hns_roce_hw_v2_init_instance(struct hnae3_handle * handle)6276 static int hns_roce_hw_v2_init_instance(struct hnae3_handle *handle)
6277 {
6278 const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
6279 const struct pci_device_id *id;
6280 struct device *dev = &handle->pdev->dev;
6281 int ret;
6282
6283 handle->rinfo.instance_state = HNS_ROCE_STATE_INIT;
6284
6285 if (ops->ae_dev_resetting(handle) || ops->get_hw_reset_stat(handle)) {
6286 handle->rinfo.instance_state = HNS_ROCE_STATE_NON_INIT;
6287 goto reset_chk_err;
6288 }
6289
6290 id = pci_match_id(hns_roce_hw_v2_pci_tbl, handle->pdev);
6291 if (!id)
6292 return 0;
6293
6294 ret = __hns_roce_hw_v2_init_instance(handle);
6295 if (ret) {
6296 handle->rinfo.instance_state = HNS_ROCE_STATE_NON_INIT;
6297 dev_err(dev, "RoCE instance init failed! ret = %d\n", ret);
6298 if (ops->ae_dev_resetting(handle) ||
6299 ops->get_hw_reset_stat(handle))
6300 goto reset_chk_err;
6301 else
6302 return ret;
6303 }
6304
6305 handle->rinfo.instance_state = HNS_ROCE_STATE_INITED;
6306
6307
6308 return 0;
6309
6310 reset_chk_err:
6311 dev_err(dev, "Device is busy in resetting state.\n"
6312 "please retry later.\n");
6313
6314 return -EBUSY;
6315 }
6316
hns_roce_hw_v2_uninit_instance(struct hnae3_handle * handle,bool reset)6317 static void hns_roce_hw_v2_uninit_instance(struct hnae3_handle *handle,
6318 bool reset)
6319 {
6320 if (handle->rinfo.instance_state != HNS_ROCE_STATE_INITED)
6321 return;
6322
6323 handle->rinfo.instance_state = HNS_ROCE_STATE_UNINIT;
6324
6325 __hns_roce_hw_v2_uninit_instance(handle, reset);
6326
6327 handle->rinfo.instance_state = HNS_ROCE_STATE_NON_INIT;
6328 }
hns_roce_hw_v2_reset_notify_down(struct hnae3_handle * handle)6329 static int hns_roce_hw_v2_reset_notify_down(struct hnae3_handle *handle)
6330 {
6331 struct hns_roce_dev *hr_dev;
6332
6333 if (handle->rinfo.instance_state != HNS_ROCE_STATE_INITED) {
6334 set_bit(HNS_ROCE_RST_DIRECT_RETURN, &handle->rinfo.state);
6335 return 0;
6336 }
6337
6338 handle->rinfo.reset_state = HNS_ROCE_STATE_RST_DOWN;
6339 clear_bit(HNS_ROCE_RST_DIRECT_RETURN, &handle->rinfo.state);
6340
6341 hr_dev = handle->priv;
6342 if (!hr_dev)
6343 return 0;
6344
6345 hr_dev->is_reset = true;
6346 hr_dev->active = false;
6347 hr_dev->dis_db = true;
6348
6349 hr_dev->state = HNS_ROCE_DEVICE_STATE_RST_DOWN;
6350
6351 return 0;
6352 }
6353
hns_roce_hw_v2_reset_notify_init(struct hnae3_handle * handle)6354 static int hns_roce_hw_v2_reset_notify_init(struct hnae3_handle *handle)
6355 {
6356 struct device *dev = &handle->pdev->dev;
6357 int ret;
6358
6359 if (test_and_clear_bit(HNS_ROCE_RST_DIRECT_RETURN,
6360 &handle->rinfo.state)) {
6361 handle->rinfo.reset_state = HNS_ROCE_STATE_RST_INITED;
6362 return 0;
6363 }
6364
6365 handle->rinfo.reset_state = HNS_ROCE_STATE_RST_INIT;
6366
6367 dev_info(&handle->pdev->dev, "In reset process RoCE client reinit.\n");
6368 ret = __hns_roce_hw_v2_init_instance(handle);
6369 if (ret) {
6370 /* when reset notify type is HNAE3_INIT_CLIENT In reset notify
6371 * callback function, RoCE Engine reinitialize. If RoCE reinit
6372 * failed, we should inform NIC driver.
6373 */
6374 handle->priv = NULL;
6375 dev_err(dev, "In reset process RoCE reinit failed %d.\n", ret);
6376 } else {
6377 handle->rinfo.reset_state = HNS_ROCE_STATE_RST_INITED;
6378 dev_info(dev, "Reset done, RoCE client reinit finished.\n");
6379 }
6380
6381 return ret;
6382 }
6383
hns_roce_hw_v2_reset_notify_uninit(struct hnae3_handle * handle)6384 static int hns_roce_hw_v2_reset_notify_uninit(struct hnae3_handle *handle)
6385 {
6386 if (test_bit(HNS_ROCE_RST_DIRECT_RETURN, &handle->rinfo.state))
6387 return 0;
6388
6389 handle->rinfo.reset_state = HNS_ROCE_STATE_RST_UNINIT;
6390 dev_info(&handle->pdev->dev, "In reset process RoCE client uninit.\n");
6391 msleep(HNS_ROCE_V2_HW_RST_UNINT_DELAY);
6392 __hns_roce_hw_v2_uninit_instance(handle, false);
6393
6394 return 0;
6395 }
6396
hns_roce_hw_v2_reset_notify(struct hnae3_handle * handle,enum hnae3_reset_notify_type type)6397 static int hns_roce_hw_v2_reset_notify(struct hnae3_handle *handle,
6398 enum hnae3_reset_notify_type type)
6399 {
6400 int ret = 0;
6401
6402 switch (type) {
6403 case HNAE3_DOWN_CLIENT:
6404 ret = hns_roce_hw_v2_reset_notify_down(handle);
6405 break;
6406 case HNAE3_INIT_CLIENT:
6407 ret = hns_roce_hw_v2_reset_notify_init(handle);
6408 break;
6409 case HNAE3_UNINIT_CLIENT:
6410 ret = hns_roce_hw_v2_reset_notify_uninit(handle);
6411 break;
6412 default:
6413 break;
6414 }
6415
6416 return ret;
6417 }
6418
6419 static const struct hnae3_client_ops hns_roce_hw_v2_ops = {
6420 .init_instance = hns_roce_hw_v2_init_instance,
6421 .uninit_instance = hns_roce_hw_v2_uninit_instance,
6422 .reset_notify = hns_roce_hw_v2_reset_notify,
6423 };
6424
6425 static struct hnae3_client hns_roce_hw_v2_client = {
6426 .name = "hns_roce_hw_v2",
6427 .type = HNAE3_CLIENT_ROCE,
6428 .ops = &hns_roce_hw_v2_ops,
6429 };
6430
hns_roce_hw_v2_init(void)6431 static int __init hns_roce_hw_v2_init(void)
6432 {
6433 return hnae3_register_client(&hns_roce_hw_v2_client);
6434 }
6435
hns_roce_hw_v2_exit(void)6436 static void __exit hns_roce_hw_v2_exit(void)
6437 {
6438 hnae3_unregister_client(&hns_roce_hw_v2_client);
6439 }
6440
6441 module_init(hns_roce_hw_v2_init);
6442 module_exit(hns_roce_hw_v2_exit);
6443
6444 MODULE_LICENSE("Dual BSD/GPL");
6445 MODULE_AUTHOR("Wei Hu <xavier.huwei@huawei.com>");
6446 MODULE_AUTHOR("Lijun Ou <oulijun@huawei.com>");
6447 MODULE_AUTHOR("Shaobo Xu <xushaobo2@huawei.com>");
6448 MODULE_DESCRIPTION("Hisilicon Hip08 Family RoCE Driver");
6449