2 * Copyright (c) 2016-2017 Hisilicon Limited.
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:
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
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.
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
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>
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"
51 static void set_data_seg_v2(struct hns_roce_v2_wqe_data_seg
*dseg
,
54 dseg
->lkey
= cpu_to_le32(sg
->lkey
);
55 dseg
->addr
= cpu_to_le64(sg
->addr
);
56 dseg
->len
= cpu_to_le32(sg
->length
);
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.
66 #define HR_OPC_MAP(ib_key, hr_key) \
67 [IB_WR_ ## ib_key] = 1 + HNS_ROCE_V2_WQE_OP_ ## hr_key
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
),
84 static u32
to_hr_opcode(u32 ib_opcode
)
86 if (ib_opcode
>= ARRAY_SIZE(hns_roce_op_code
))
87 return HNS_ROCE_V2_WQE_OP_MASK
;
89 return hns_roce_op_code
[ib_opcode
] ? hns_roce_op_code
[ib_opcode
] - 1 :
90 HNS_ROCE_V2_WQE_OP_MASK
;
93 static void set_frmr_seg(struct hns_roce_v2_rc_send_wqe
*rc_sq_wqe
,
94 const struct ib_reg_wr
*wr
)
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
);
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);
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
));
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
);
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);
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
)
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
);
141 set_data_seg_v2(dseg
, wr
->sg_list
);
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
);
147 aseg
->fetchadd_swap_data
=
148 cpu_to_le64(atomic_wr(wr
)->compare_add
);
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
);
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
)
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
;
170 if (msg_len
> ext_sge_sz
) {
172 "no enough extended sge space for inline data.\n");
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
);
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.
187 if (len
<= left_len_in_pg
) {
188 memcpy(dseg
, addr
, len
);
190 idx
+= len
/ dseg_len
;
193 if (i
>= wr
->num_sge
)
196 left_len_in_pg
-= len
;
197 len
= wr
->sg_list
[i
].length
;
198 addr
= (void *)(unsigned long)(wr
->sg_list
[i
].addr
);
201 memcpy(dseg
, addr
, left_len_in_pg
);
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
;
217 static void set_extend_sge(struct hns_roce_qp
*qp
, struct ib_sge
*sge
,
218 unsigned int *sge_ind
, unsigned int cnt
)
220 struct hns_roce_v2_wqe_data_seg
*dseg
;
221 unsigned int idx
= *sge_ind
;
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
);
236 static bool check_inl_data_len(struct hns_roce_qp
*qp
, unsigned int len
)
238 struct hns_roce_dev
*hr_dev
= to_hr_dev(qp
->ibqp
.device
);
239 int mtu
= ib_mtu_enum_to_int(qp
->path_mtu
);
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
);
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
)
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
;
263 if (unlikely(wr
->opcode
== IB_WR_RDMA_READ
)) {
264 ibdev_err(ibdev
, "invalid inline parameters!\n");
268 if (!check_inl_data_len(qp
, msg_len
))
271 dseg
+= sizeof(struct hns_roce_v2_rc_send_wqe
);
273 roce_set_bit(rc_sq_wqe
->byte_4
, V2_RC_SEND_WQE_BYTE_4_INLINE_S
, 1);
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);
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
;
285 roce_set_bit(rc_sq_wqe
->byte_20
,
286 V2_RC_SEND_WQE_BYTE_20_INL_TYPE_S
, 1);
288 ret
= fill_ext_sge_inl_data(qp
, wr
, &curr_idx
, msg_len
);
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
);
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
)
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
);
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));
319 if (wr
->send_flags
& IB_SEND_INLINE
)
320 return set_rc_inl(qp
, wr
, rc_sq_wqe
, sge_ind
);
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
);
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
);
338 set_extend_sge(qp
, wr
->sg_list
+ i
, sge_ind
,
339 valid_num_sge
- HNS_ROCE_SGE_IN_WQE
);
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
);
349 static int check_send_valid(struct hns_roce_dev
*hr_dev
,
350 struct hns_roce_qp
*hr_qp
)
352 struct ib_device
*ibdev
= &hr_dev
->ib_dev
;
353 struct ib_qp
*ibqp
= &hr_qp
->ibqp
;
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",
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",
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",
376 static unsigned int calc_wr_sge_num(const struct ib_send_wr
*wr
,
377 unsigned int *sge_len
)
379 unsigned int valid_num
= 0;
380 unsigned int len
= 0;
383 for (i
= 0; i
< wr
->num_sge
; i
++) {
384 if (likely(wr
->sg_list
[i
].length
)) {
385 len
+= wr
->sg_list
[i
].length
;
394 static __le32
get_immtdata(const struct ib_send_wr
*wr
)
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
));
405 static int set_ud_opcode(struct hns_roce_v2_ud_send_wqe
*ud_sq_wqe
,
406 const struct ib_send_wr
*wr
)
408 u32 ib_op
= wr
->opcode
;
410 if (ib_op
!= IB_WR_SEND
&& ib_op
!= IB_WR_SEND_WITH_IMM
)
413 ud_sq_wqe
->immtdata
= get_immtdata(wr
);
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
));
421 static int fill_ud_av(struct hns_roce_v2_ud_send_wqe
*ud_sq_wqe
,
422 struct hns_roce_ah
*ah
)
424 struct ib_device
*ib_dev
= ah
->ibah
.device
;
425 struct hns_roce_dev
*hr_dev
= to_hr_dev(ib_dev
);
427 roce_set_field(ud_sq_wqe
->byte_24
, V2_UD_SEND_WQE_BYTE_24_UDPSPN_M
,
428 V2_UD_SEND_WQE_BYTE_24_UDPSPN_S
, ah
->av
.udp_sport
);
430 roce_set_field(ud_sq_wqe
->byte_36
, V2_UD_SEND_WQE_BYTE_36_HOPLIMIT_M
,
431 V2_UD_SEND_WQE_BYTE_36_HOPLIMIT_S
, ah
->av
.hop_limit
);
432 roce_set_field(ud_sq_wqe
->byte_36
, V2_UD_SEND_WQE_BYTE_36_TCLASS_M
,
433 V2_UD_SEND_WQE_BYTE_36_TCLASS_S
, ah
->av
.tclass
);
434 roce_set_field(ud_sq_wqe
->byte_40
, V2_UD_SEND_WQE_BYTE_40_FLOW_LABEL_M
,
435 V2_UD_SEND_WQE_BYTE_40_FLOW_LABEL_S
, ah
->av
.flowlabel
);
437 if (WARN_ON(ah
->av
.sl
> MAX_SERVICE_LEVEL
))
440 roce_set_field(ud_sq_wqe
->byte_40
, V2_UD_SEND_WQE_BYTE_40_SL_M
,
441 V2_UD_SEND_WQE_BYTE_40_SL_S
, ah
->av
.sl
);
443 ud_sq_wqe
->sgid_index
= ah
->av
.gid_index
;
445 memcpy(ud_sq_wqe
->dmac
, ah
->av
.mac
, ETH_ALEN
);
446 memcpy(ud_sq_wqe
->dgid
, ah
->av
.dgid
, GID_LEN_V2
);
448 if (hr_dev
->pci_dev
->revision
>= PCI_REVISION_ID_HIP09
)
451 roce_set_bit(ud_sq_wqe
->byte_40
, V2_UD_SEND_WQE_BYTE_40_UD_VLAN_EN_S
,
453 roce_set_field(ud_sq_wqe
->byte_36
, V2_UD_SEND_WQE_BYTE_36_VLAN_M
,
454 V2_UD_SEND_WQE_BYTE_36_VLAN_S
, ah
->av
.vlan_id
);
459 static inline int set_ud_wqe(struct hns_roce_qp
*qp
,
460 const struct ib_send_wr
*wr
,
461 void *wqe
, unsigned int *sge_idx
,
462 unsigned int owner_bit
)
464 struct hns_roce_ah
*ah
= to_hr_ah(ud_wr(wr
)->ah
);
465 struct hns_roce_v2_ud_send_wqe
*ud_sq_wqe
= wqe
;
466 unsigned int curr_idx
= *sge_idx
;
467 unsigned int valid_num_sge
;
471 valid_num_sge
= calc_wr_sge_num(wr
, &msg_len
);
472 memset(ud_sq_wqe
, 0, sizeof(*ud_sq_wqe
));
474 ret
= set_ud_opcode(ud_sq_wqe
, wr
);
478 ud_sq_wqe
->msg_len
= cpu_to_le32(msg_len
);
480 roce_set_bit(ud_sq_wqe
->byte_4
, V2_UD_SEND_WQE_BYTE_4_CQE_S
,
481 !!(wr
->send_flags
& IB_SEND_SIGNALED
));
483 roce_set_bit(ud_sq_wqe
->byte_4
, V2_UD_SEND_WQE_BYTE_4_SE_S
,
484 !!(wr
->send_flags
& IB_SEND_SOLICITED
));
486 roce_set_field(ud_sq_wqe
->byte_16
, V2_UD_SEND_WQE_BYTE_16_PD_M
,
487 V2_UD_SEND_WQE_BYTE_16_PD_S
, to_hr_pd(qp
->ibqp
.pd
)->pdn
);
489 roce_set_field(ud_sq_wqe
->byte_16
, V2_UD_SEND_WQE_BYTE_16_SGE_NUM_M
,
490 V2_UD_SEND_WQE_BYTE_16_SGE_NUM_S
, valid_num_sge
);
492 roce_set_field(ud_sq_wqe
->byte_20
,
493 V2_UD_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_M
,
494 V2_UD_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_S
,
495 curr_idx
& (qp
->sge
.sge_cnt
- 1));
497 ud_sq_wqe
->qkey
= cpu_to_le32(ud_wr(wr
)->remote_qkey
& 0x80000000 ?
498 qp
->qkey
: ud_wr(wr
)->remote_qkey
);
499 roce_set_field(ud_sq_wqe
->byte_32
, V2_UD_SEND_WQE_BYTE_32_DQPN_M
,
500 V2_UD_SEND_WQE_BYTE_32_DQPN_S
, ud_wr(wr
)->remote_qpn
);
502 ret
= fill_ud_av(ud_sq_wqe
, ah
);
506 set_extend_sge(qp
, wr
->sg_list
, &curr_idx
, valid_num_sge
);
509 * The pipeline can sequentially post all valid WQEs into WQ buffer,
510 * including new WQEs waiting for the doorbell to update the PI again.
511 * Therefore, the owner bit of WQE MUST be updated after all fields
512 * and extSGEs have been written into DDR instead of cache.
514 if (qp
->en_flags
& HNS_ROCE_QP_CAP_OWNER_DB
)
518 roce_set_bit(ud_sq_wqe
->byte_4
, V2_UD_SEND_WQE_BYTE_4_OWNER_S
,
524 static int set_rc_opcode(struct hns_roce_v2_rc_send_wqe
*rc_sq_wqe
,
525 const struct ib_send_wr
*wr
)
527 u32 ib_op
= wr
->opcode
;
529 rc_sq_wqe
->immtdata
= get_immtdata(wr
);
532 case IB_WR_RDMA_READ
:
533 case IB_WR_RDMA_WRITE
:
534 case IB_WR_RDMA_WRITE_WITH_IMM
:
535 rc_sq_wqe
->rkey
= cpu_to_le32(rdma_wr(wr
)->rkey
);
536 rc_sq_wqe
->va
= cpu_to_le64(rdma_wr(wr
)->remote_addr
);
539 case IB_WR_SEND_WITH_IMM
:
541 case IB_WR_ATOMIC_CMP_AND_SWP
:
542 case IB_WR_ATOMIC_FETCH_AND_ADD
:
543 rc_sq_wqe
->rkey
= cpu_to_le32(atomic_wr(wr
)->rkey
);
544 rc_sq_wqe
->va
= cpu_to_le64(atomic_wr(wr
)->remote_addr
);
547 set_frmr_seg(rc_sq_wqe
, reg_wr(wr
));
549 case IB_WR_LOCAL_INV
:
550 roce_set_bit(rc_sq_wqe
->byte_4
, V2_RC_SEND_WQE_BYTE_4_SO_S
, 1);
552 case IB_WR_SEND_WITH_INV
:
553 rc_sq_wqe
->inv_key
= cpu_to_le32(wr
->ex
.invalidate_rkey
);
559 roce_set_field(rc_sq_wqe
->byte_4
, V2_RC_SEND_WQE_BYTE_4_OPCODE_M
,
560 V2_RC_SEND_WQE_BYTE_4_OPCODE_S
, to_hr_opcode(ib_op
));
564 static inline int set_rc_wqe(struct hns_roce_qp
*qp
,
565 const struct ib_send_wr
*wr
,
566 void *wqe
, unsigned int *sge_idx
,
567 unsigned int owner_bit
)
569 struct hns_roce_v2_rc_send_wqe
*rc_sq_wqe
= wqe
;
570 unsigned int curr_idx
= *sge_idx
;
571 unsigned int valid_num_sge
;
575 valid_num_sge
= calc_wr_sge_num(wr
, &msg_len
);
576 memset(rc_sq_wqe
, 0, sizeof(*rc_sq_wqe
));
578 rc_sq_wqe
->msg_len
= cpu_to_le32(msg_len
);
580 ret
= set_rc_opcode(rc_sq_wqe
, wr
);
584 roce_set_bit(rc_sq_wqe
->byte_4
, V2_RC_SEND_WQE_BYTE_4_FENCE_S
,
585 (wr
->send_flags
& IB_SEND_FENCE
) ? 1 : 0);
587 roce_set_bit(rc_sq_wqe
->byte_4
, V2_RC_SEND_WQE_BYTE_4_SE_S
,
588 (wr
->send_flags
& IB_SEND_SOLICITED
) ? 1 : 0);
590 roce_set_bit(rc_sq_wqe
->byte_4
, V2_RC_SEND_WQE_BYTE_4_CQE_S
,
591 (wr
->send_flags
& IB_SEND_SIGNALED
) ? 1 : 0);
593 if (wr
->opcode
== IB_WR_ATOMIC_CMP_AND_SWP
||
594 wr
->opcode
== IB_WR_ATOMIC_FETCH_AND_ADD
)
595 set_atomic_seg(wr
, rc_sq_wqe
, valid_num_sge
);
596 else if (wr
->opcode
!= IB_WR_REG_MR
)
597 ret
= set_rwqe_data_seg(&qp
->ibqp
, wr
, rc_sq_wqe
,
598 &curr_idx
, valid_num_sge
);
601 * The pipeline can sequentially post all valid WQEs into WQ buffer,
602 * including new WQEs waiting for the doorbell to update the PI again.
603 * Therefore, the owner bit of WQE MUST be updated after all fields
604 * and extSGEs have been written into DDR instead of cache.
606 if (qp
->en_flags
& HNS_ROCE_QP_CAP_OWNER_DB
)
610 roce_set_bit(rc_sq_wqe
->byte_4
, V2_RC_SEND_WQE_BYTE_4_OWNER_S
,
616 static inline void update_sq_db(struct hns_roce_dev
*hr_dev
,
617 struct hns_roce_qp
*qp
)
620 * Hip08 hardware cannot flush the WQEs in SQ if the QP state
621 * gets into errored mode. Hence, as a workaround to this
622 * hardware limitation, driver needs to assist in flushing. But
623 * the flushing operation uses mailbox to convey the QP state to
624 * the hardware and which can sleep due to the mutex protection
625 * around the mailbox calls. Hence, use the deferred flush for
628 if (qp
->state
== IB_QPS_ERR
) {
629 if (!test_and_set_bit(HNS_ROCE_FLUSH_FLAG
, &qp
->flush_flag
))
630 init_flush_work(hr_dev
, qp
);
632 struct hns_roce_v2_db sq_db
= {};
634 roce_set_field(sq_db
.byte_4
, V2_DB_BYTE_4_TAG_M
,
635 V2_DB_BYTE_4_TAG_S
, qp
->doorbell_qpn
);
636 roce_set_field(sq_db
.byte_4
, V2_DB_BYTE_4_CMD_M
,
637 V2_DB_BYTE_4_CMD_S
, HNS_ROCE_V2_SQ_DB
);
638 roce_set_field(sq_db
.parameter
, V2_DB_PARAMETER_IDX_M
,
639 V2_DB_PARAMETER_IDX_S
, qp
->sq
.head
);
640 roce_set_field(sq_db
.parameter
, V2_DB_PARAMETER_SL_M
,
641 V2_DB_PARAMETER_SL_S
, qp
->sl
);
643 hns_roce_write64(hr_dev
, (__le32
*)&sq_db
, qp
->sq
.db_reg_l
);
647 static int hns_roce_v2_post_send(struct ib_qp
*ibqp
,
648 const struct ib_send_wr
*wr
,
649 const struct ib_send_wr
**bad_wr
)
651 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
652 struct ib_device
*ibdev
= &hr_dev
->ib_dev
;
653 struct hns_roce_qp
*qp
= to_hr_qp(ibqp
);
654 unsigned long flags
= 0;
655 unsigned int owner_bit
;
656 unsigned int sge_idx
;
657 unsigned int wqe_idx
;
662 spin_lock_irqsave(&qp
->sq
.lock
, flags
);
664 ret
= check_send_valid(hr_dev
, qp
);
671 sge_idx
= qp
->next_sge
;
673 for (nreq
= 0; wr
; ++nreq
, wr
= wr
->next
) {
674 if (hns_roce_wq_overflow(&qp
->sq
, nreq
, qp
->ibqp
.send_cq
)) {
680 wqe_idx
= (qp
->sq
.head
+ nreq
) & (qp
->sq
.wqe_cnt
- 1);
682 if (unlikely(wr
->num_sge
> qp
->sq
.max_gs
)) {
683 ibdev_err(ibdev
, "num_sge = %d > qp->sq.max_gs = %u.\n",
684 wr
->num_sge
, qp
->sq
.max_gs
);
690 wqe
= hns_roce_get_send_wqe(qp
, wqe_idx
);
691 qp
->sq
.wrid
[wqe_idx
] = wr
->wr_id
;
693 ~(((qp
->sq
.head
+ nreq
) >> ilog2(qp
->sq
.wqe_cnt
)) & 0x1);
695 /* Corresponding to the QP type, wqe process separately */
696 if (ibqp
->qp_type
== IB_QPT_GSI
|| ibqp
->qp_type
== IB_QPT_UD
)
697 ret
= set_ud_wqe(qp
, wr
, wqe
, &sge_idx
, owner_bit
);
698 else if (ibqp
->qp_type
== IB_QPT_RC
)
699 ret
= set_rc_wqe(qp
, wr
, wqe
, &sge_idx
, owner_bit
);
710 qp
->next_sge
= sge_idx
;
713 update_sq_db(hr_dev
, qp
);
716 spin_unlock_irqrestore(&qp
->sq
.lock
, flags
);
721 static int check_recv_valid(struct hns_roce_dev
*hr_dev
,
722 struct hns_roce_qp
*hr_qp
)
724 if (unlikely(hr_dev
->state
>= HNS_ROCE_DEVICE_STATE_RST_DOWN
))
726 else if (hr_qp
->state
== IB_QPS_RESET
)
732 static int hns_roce_v2_post_recv(struct ib_qp
*ibqp
,
733 const struct ib_recv_wr
*wr
,
734 const struct ib_recv_wr
**bad_wr
)
736 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
737 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
738 struct ib_device
*ibdev
= &hr_dev
->ib_dev
;
739 struct hns_roce_v2_wqe_data_seg
*dseg
;
740 struct hns_roce_rinl_sge
*sge_list
;
748 spin_lock_irqsave(&hr_qp
->rq
.lock
, flags
);
750 ret
= check_recv_valid(hr_dev
, hr_qp
);
757 for (nreq
= 0; wr
; ++nreq
, wr
= wr
->next
) {
758 if (unlikely(hns_roce_wq_overflow(&hr_qp
->rq
, nreq
,
759 hr_qp
->ibqp
.recv_cq
))) {
765 wqe_idx
= (hr_qp
->rq
.head
+ nreq
) & (hr_qp
->rq
.wqe_cnt
- 1);
767 if (unlikely(wr
->num_sge
> hr_qp
->rq
.max_gs
)) {
768 ibdev_err(ibdev
, "num_sge = %d >= max_sge = %u.\n",
769 wr
->num_sge
, hr_qp
->rq
.max_gs
);
775 wqe
= hns_roce_get_recv_wqe(hr_qp
, wqe_idx
);
776 dseg
= (struct hns_roce_v2_wqe_data_seg
*)wqe
;
777 for (i
= 0; i
< wr
->num_sge
; i
++) {
778 if (!wr
->sg_list
[i
].length
)
780 set_data_seg_v2(dseg
, wr
->sg_list
+ i
);
784 if (wr
->num_sge
< hr_qp
->rq
.max_gs
) {
785 dseg
->lkey
= cpu_to_le32(HNS_ROCE_INVALID_LKEY
);
789 /* rq support inline data */
790 if (hr_qp
->rq_inl_buf
.wqe_cnt
) {
791 sge_list
= hr_qp
->rq_inl_buf
.wqe_list
[wqe_idx
].sg_list
;
792 hr_qp
->rq_inl_buf
.wqe_list
[wqe_idx
].sge_cnt
=
794 for (i
= 0; i
< wr
->num_sge
; i
++) {
796 (void *)(u64
)wr
->sg_list
[i
].addr
;
797 sge_list
[i
].len
= wr
->sg_list
[i
].length
;
801 hr_qp
->rq
.wrid
[wqe_idx
] = wr
->wr_id
;
806 hr_qp
->rq
.head
+= nreq
;
811 * Hip08 hardware cannot flush the WQEs in RQ if the QP state
812 * gets into errored mode. Hence, as a workaround to this
813 * hardware limitation, driver needs to assist in flushing. But
814 * the flushing operation uses mailbox to convey the QP state to
815 * the hardware and which can sleep due to the mutex protection
816 * around the mailbox calls. Hence, use the deferred flush for
819 if (hr_qp
->state
== IB_QPS_ERR
) {
820 if (!test_and_set_bit(HNS_ROCE_FLUSH_FLAG
,
822 init_flush_work(hr_dev
, hr_qp
);
824 *hr_qp
->rdb
.db_record
= hr_qp
->rq
.head
& 0xffff;
827 spin_unlock_irqrestore(&hr_qp
->rq
.lock
, flags
);
832 static void *get_srq_wqe(struct hns_roce_srq
*srq
, int n
)
834 return hns_roce_buf_offset(srq
->buf_mtr
.kmem
, n
<< srq
->wqe_shift
);
837 static void *get_idx_buf(struct hns_roce_idx_que
*idx_que
, unsigned int n
)
839 return hns_roce_buf_offset(idx_que
->mtr
.kmem
,
840 n
<< idx_que
->entry_shift
);
843 static void hns_roce_free_srq_wqe(struct hns_roce_srq
*srq
, int wqe_index
)
845 /* always called with interrupts disabled. */
846 spin_lock(&srq
->lock
);
848 bitmap_clear(srq
->idx_que
.bitmap
, wqe_index
, 1);
851 spin_unlock(&srq
->lock
);
854 static int find_empty_entry(struct hns_roce_idx_que
*idx_que
,
859 if (unlikely(bitmap_full(idx_que
->bitmap
, size
)))
862 wqe_idx
= find_first_zero_bit(idx_que
->bitmap
, size
);
864 bitmap_set(idx_que
->bitmap
, wqe_idx
, 1);
869 static int hns_roce_v2_post_srq_recv(struct ib_srq
*ibsrq
,
870 const struct ib_recv_wr
*wr
,
871 const struct ib_recv_wr
**bad_wr
)
873 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibsrq
->device
);
874 struct hns_roce_srq
*srq
= to_hr_srq(ibsrq
);
875 struct hns_roce_v2_wqe_data_seg
*dseg
;
876 struct hns_roce_v2_db srq_db
;
886 spin_lock_irqsave(&srq
->lock
, flags
);
888 ind
= srq
->head
& (srq
->wqe_cnt
- 1);
890 for (nreq
= 0; wr
; ++nreq
, wr
= wr
->next
) {
891 if (unlikely(wr
->num_sge
>= srq
->max_gs
)) {
897 if (unlikely(srq
->head
== srq
->tail
)) {
903 wqe_idx
= find_empty_entry(&srq
->idx_que
, srq
->wqe_cnt
);
904 if (unlikely(wqe_idx
< 0)) {
910 wqe
= get_srq_wqe(srq
, wqe_idx
);
911 dseg
= (struct hns_roce_v2_wqe_data_seg
*)wqe
;
913 for (i
= 0; i
< wr
->num_sge
; ++i
) {
914 dseg
[i
].len
= cpu_to_le32(wr
->sg_list
[i
].length
);
915 dseg
[i
].lkey
= cpu_to_le32(wr
->sg_list
[i
].lkey
);
916 dseg
[i
].addr
= cpu_to_le64(wr
->sg_list
[i
].addr
);
919 if (wr
->num_sge
< srq
->max_gs
) {
921 dseg
[i
].lkey
= cpu_to_le32(0x100);
925 srq_idx
= get_idx_buf(&srq
->idx_que
, ind
);
926 *srq_idx
= cpu_to_le32(wqe_idx
);
928 srq
->wrid
[wqe_idx
] = wr
->wr_id
;
929 ind
= (ind
+ 1) & (srq
->wqe_cnt
- 1);
936 * Make sure that descriptors are written before
942 cpu_to_le32(HNS_ROCE_V2_SRQ_DB
<< V2_DB_BYTE_4_CMD_S
|
943 (srq
->srqn
& V2_DB_BYTE_4_TAG_M
));
945 cpu_to_le32(srq
->head
& V2_DB_PARAMETER_IDX_M
);
947 hns_roce_write64(hr_dev
, (__le32
*)&srq_db
, srq
->db_reg_l
);
950 spin_unlock_irqrestore(&srq
->lock
, flags
);
955 static int hns_roce_v2_cmd_hw_reseted(struct hns_roce_dev
*hr_dev
,
956 unsigned long instance_stage
,
957 unsigned long reset_stage
)
959 /* When hardware reset has been completed once or more, we should stop
960 * sending mailbox&cmq&doorbell to hardware. If now in .init_instance()
961 * function, we should exit with error. If now at HNAE3_INIT_CLIENT
962 * stage of soft reset process, we should exit with error, and then
963 * HNAE3_INIT_CLIENT related process can rollback the operation like
964 * notifing hardware to free resources, HNAE3_INIT_CLIENT related
965 * process will exit with error to notify NIC driver to reschedule soft
966 * reset process once again.
968 hr_dev
->is_reset
= true;
969 hr_dev
->dis_db
= true;
971 if (reset_stage
== HNS_ROCE_STATE_RST_INIT
||
972 instance_stage
== HNS_ROCE_STATE_INIT
)
973 return CMD_RST_PRC_EBUSY
;
975 return CMD_RST_PRC_SUCCESS
;
978 static int hns_roce_v2_cmd_hw_resetting(struct hns_roce_dev
*hr_dev
,
979 unsigned long instance_stage
,
980 unsigned long reset_stage
)
982 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
983 struct hnae3_handle
*handle
= priv
->handle
;
984 const struct hnae3_ae_ops
*ops
= handle
->ae_algo
->ops
;
986 /* When hardware reset is detected, we should stop sending mailbox&cmq&
987 * doorbell to hardware. If now in .init_instance() function, we should
988 * exit with error. If now at HNAE3_INIT_CLIENT stage of soft reset
989 * process, we should exit with error, and then HNAE3_INIT_CLIENT
990 * related process can rollback the operation like notifing hardware to
991 * free resources, HNAE3_INIT_CLIENT related process will exit with
992 * error to notify NIC driver to reschedule soft reset process once
995 hr_dev
->dis_db
= true;
996 if (!ops
->get_hw_reset_stat(handle
))
997 hr_dev
->is_reset
= true;
999 if (!hr_dev
->is_reset
|| reset_stage
== HNS_ROCE_STATE_RST_INIT
||
1000 instance_stage
== HNS_ROCE_STATE_INIT
)
1001 return CMD_RST_PRC_EBUSY
;
1003 return CMD_RST_PRC_SUCCESS
;
1006 static int hns_roce_v2_cmd_sw_resetting(struct hns_roce_dev
*hr_dev
)
1008 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
1009 struct hnae3_handle
*handle
= priv
->handle
;
1010 const struct hnae3_ae_ops
*ops
= handle
->ae_algo
->ops
;
1012 /* When software reset is detected at .init_instance() function, we
1013 * should stop sending mailbox&cmq&doorbell to hardware, and exit
1016 hr_dev
->dis_db
= true;
1017 if (ops
->ae_dev_reset_cnt(handle
) != hr_dev
->reset_cnt
)
1018 hr_dev
->is_reset
= true;
1020 return CMD_RST_PRC_EBUSY
;
1023 static int hns_roce_v2_rst_process_cmd(struct hns_roce_dev
*hr_dev
)
1025 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
1026 struct hnae3_handle
*handle
= priv
->handle
;
1027 const struct hnae3_ae_ops
*ops
= handle
->ae_algo
->ops
;
1028 unsigned long instance_stage
; /* the current instance stage */
1029 unsigned long reset_stage
; /* the current reset stage */
1030 unsigned long reset_cnt
;
1034 if (hr_dev
->is_reset
)
1035 return CMD_RST_PRC_SUCCESS
;
1037 /* Get information about reset from NIC driver or RoCE driver itself,
1038 * the meaning of the following variables from NIC driver are described
1040 * reset_cnt -- The count value of completed hardware reset.
1041 * hw_resetting -- Whether hardware device is resetting now.
1042 * sw_resetting -- Whether NIC's software reset process is running now.
1044 instance_stage
= handle
->rinfo
.instance_state
;
1045 reset_stage
= handle
->rinfo
.reset_state
;
1046 reset_cnt
= ops
->ae_dev_reset_cnt(handle
);
1047 hw_resetting
= ops
->get_cmdq_stat(handle
);
1048 sw_resetting
= ops
->ae_dev_resetting(handle
);
1050 if (reset_cnt
!= hr_dev
->reset_cnt
)
1051 return hns_roce_v2_cmd_hw_reseted(hr_dev
, instance_stage
,
1053 else if (hw_resetting
)
1054 return hns_roce_v2_cmd_hw_resetting(hr_dev
, instance_stage
,
1056 else if (sw_resetting
&& instance_stage
== HNS_ROCE_STATE_INIT
)
1057 return hns_roce_v2_cmd_sw_resetting(hr_dev
);
1062 static int hns_roce_cmq_space(struct hns_roce_v2_cmq_ring
*ring
)
1064 int ntu
= ring
->next_to_use
;
1065 int ntc
= ring
->next_to_clean
;
1066 int used
= (ntu
- ntc
+ ring
->desc_num
) % ring
->desc_num
;
1068 return ring
->desc_num
- used
- 1;
1071 static int hns_roce_alloc_cmq_desc(struct hns_roce_dev
*hr_dev
,
1072 struct hns_roce_v2_cmq_ring
*ring
)
1074 int size
= ring
->desc_num
* sizeof(struct hns_roce_cmq_desc
);
1076 ring
->desc
= kzalloc(size
, GFP_KERNEL
);
1080 ring
->desc_dma_addr
= dma_map_single(hr_dev
->dev
, ring
->desc
, size
,
1082 if (dma_mapping_error(hr_dev
->dev
, ring
->desc_dma_addr
)) {
1083 ring
->desc_dma_addr
= 0;
1092 static void hns_roce_free_cmq_desc(struct hns_roce_dev
*hr_dev
,
1093 struct hns_roce_v2_cmq_ring
*ring
)
1095 dma_unmap_single(hr_dev
->dev
, ring
->desc_dma_addr
,
1096 ring
->desc_num
* sizeof(struct hns_roce_cmq_desc
),
1099 ring
->desc_dma_addr
= 0;
1103 static int hns_roce_init_cmq_ring(struct hns_roce_dev
*hr_dev
, bool ring_type
)
1105 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
1106 struct hns_roce_v2_cmq_ring
*ring
= (ring_type
== TYPE_CSQ
) ?
1107 &priv
->cmq
.csq
: &priv
->cmq
.crq
;
1109 ring
->flag
= ring_type
;
1110 ring
->next_to_clean
= 0;
1111 ring
->next_to_use
= 0;
1113 return hns_roce_alloc_cmq_desc(hr_dev
, ring
);
1116 static void hns_roce_cmq_init_regs(struct hns_roce_dev
*hr_dev
, bool ring_type
)
1118 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
1119 struct hns_roce_v2_cmq_ring
*ring
= (ring_type
== TYPE_CSQ
) ?
1120 &priv
->cmq
.csq
: &priv
->cmq
.crq
;
1121 dma_addr_t dma
= ring
->desc_dma_addr
;
1123 if (ring_type
== TYPE_CSQ
) {
1124 roce_write(hr_dev
, ROCEE_TX_CMQ_BASEADDR_L_REG
, (u32
)dma
);
1125 roce_write(hr_dev
, ROCEE_TX_CMQ_BASEADDR_H_REG
,
1126 upper_32_bits(dma
));
1127 roce_write(hr_dev
, ROCEE_TX_CMQ_DEPTH_REG
,
1128 (u32
)ring
->desc_num
>> HNS_ROCE_CMQ_DESC_NUM_S
);
1129 roce_write(hr_dev
, ROCEE_TX_CMQ_HEAD_REG
, 0);
1130 roce_write(hr_dev
, ROCEE_TX_CMQ_TAIL_REG
, 0);
1132 roce_write(hr_dev
, ROCEE_RX_CMQ_BASEADDR_L_REG
, (u32
)dma
);
1133 roce_write(hr_dev
, ROCEE_RX_CMQ_BASEADDR_H_REG
,
1134 upper_32_bits(dma
));
1135 roce_write(hr_dev
, ROCEE_RX_CMQ_DEPTH_REG
,
1136 (u32
)ring
->desc_num
>> HNS_ROCE_CMQ_DESC_NUM_S
);
1137 roce_write(hr_dev
, ROCEE_RX_CMQ_HEAD_REG
, 0);
1138 roce_write(hr_dev
, ROCEE_RX_CMQ_TAIL_REG
, 0);
1142 static int hns_roce_v2_cmq_init(struct hns_roce_dev
*hr_dev
)
1144 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
1147 /* Setup the queue entries for command queue */
1148 priv
->cmq
.csq
.desc_num
= CMD_CSQ_DESC_NUM
;
1149 priv
->cmq
.crq
.desc_num
= CMD_CRQ_DESC_NUM
;
1151 /* Setup the lock for command queue */
1152 spin_lock_init(&priv
->cmq
.csq
.lock
);
1153 spin_lock_init(&priv
->cmq
.crq
.lock
);
1155 /* Setup Tx write back timeout */
1156 priv
->cmq
.tx_timeout
= HNS_ROCE_CMQ_TX_TIMEOUT
;
1159 ret
= hns_roce_init_cmq_ring(hr_dev
, TYPE_CSQ
);
1161 dev_err(hr_dev
->dev
, "Init CSQ error, ret = %d.\n", ret
);
1166 ret
= hns_roce_init_cmq_ring(hr_dev
, TYPE_CRQ
);
1168 dev_err(hr_dev
->dev
, "Init CRQ error, ret = %d.\n", ret
);
1173 hns_roce_cmq_init_regs(hr_dev
, TYPE_CSQ
);
1176 hns_roce_cmq_init_regs(hr_dev
, TYPE_CRQ
);
1181 hns_roce_free_cmq_desc(hr_dev
, &priv
->cmq
.csq
);
1186 static void hns_roce_v2_cmq_exit(struct hns_roce_dev
*hr_dev
)
1188 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
1190 hns_roce_free_cmq_desc(hr_dev
, &priv
->cmq
.csq
);
1191 hns_roce_free_cmq_desc(hr_dev
, &priv
->cmq
.crq
);
1194 static void hns_roce_cmq_setup_basic_desc(struct hns_roce_cmq_desc
*desc
,
1195 enum hns_roce_opcode_type opcode
,
1198 memset((void *)desc
, 0, sizeof(struct hns_roce_cmq_desc
));
1199 desc
->opcode
= cpu_to_le16(opcode
);
1201 cpu_to_le16(HNS_ROCE_CMD_FLAG_NO_INTR
| HNS_ROCE_CMD_FLAG_IN
);
1203 desc
->flag
|= cpu_to_le16(HNS_ROCE_CMD_FLAG_WR
);
1205 desc
->flag
&= cpu_to_le16(~HNS_ROCE_CMD_FLAG_WR
);
1208 static int hns_roce_cmq_csq_done(struct hns_roce_dev
*hr_dev
)
1210 u32 head
= roce_read(hr_dev
, ROCEE_TX_CMQ_HEAD_REG
);
1211 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
1213 return head
== priv
->cmq
.csq
.next_to_use
;
1216 static int hns_roce_cmq_csq_clean(struct hns_roce_dev
*hr_dev
)
1218 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
1219 struct hns_roce_v2_cmq_ring
*csq
= &priv
->cmq
.csq
;
1220 struct hns_roce_cmq_desc
*desc
;
1221 u16 ntc
= csq
->next_to_clean
;
1225 desc
= &csq
->desc
[ntc
];
1226 head
= roce_read(hr_dev
, ROCEE_TX_CMQ_HEAD_REG
);
1227 while (head
!= ntc
) {
1228 memset(desc
, 0, sizeof(*desc
));
1230 if (ntc
== csq
->desc_num
)
1232 desc
= &csq
->desc
[ntc
];
1235 csq
->next_to_clean
= ntc
;
1240 static int __hns_roce_cmq_send(struct hns_roce_dev
*hr_dev
,
1241 struct hns_roce_cmq_desc
*desc
, int num
)
1243 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
1244 struct hns_roce_v2_cmq_ring
*csq
= &priv
->cmq
.csq
;
1245 struct hns_roce_cmq_desc
*desc_to_use
;
1246 bool complete
= false;
1253 spin_lock_bh(&csq
->lock
);
1255 if (num
> hns_roce_cmq_space(csq
)) {
1256 spin_unlock_bh(&csq
->lock
);
1261 * Record the location of desc in the cmq for this time
1262 * which will be use for hardware to write back
1264 ntc
= csq
->next_to_use
;
1266 while (handle
< num
) {
1267 desc_to_use
= &csq
->desc
[csq
->next_to_use
];
1268 *desc_to_use
= desc
[handle
];
1269 dev_dbg(hr_dev
->dev
, "set cmq desc:\n");
1271 if (csq
->next_to_use
== csq
->desc_num
)
1272 csq
->next_to_use
= 0;
1276 /* Write to hardware */
1277 roce_write(hr_dev
, ROCEE_TX_CMQ_TAIL_REG
, csq
->next_to_use
);
1280 * If the command is sync, wait for the firmware to write back,
1281 * if multi descriptors to be sent, use the first one to check
1283 if (le16_to_cpu(desc
->flag
) & HNS_ROCE_CMD_FLAG_NO_INTR
) {
1285 if (hns_roce_cmq_csq_done(hr_dev
))
1289 } while (timeout
< priv
->cmq
.tx_timeout
);
1292 if (hns_roce_cmq_csq_done(hr_dev
)) {
1295 while (handle
< num
) {
1296 /* get the result of hardware write back */
1297 desc_to_use
= &csq
->desc
[ntc
];
1298 desc
[handle
] = *desc_to_use
;
1299 dev_dbg(hr_dev
->dev
, "Get cmq desc:\n");
1300 desc_ret
= le16_to_cpu(desc
[handle
].retval
);
1301 if (desc_ret
== CMD_EXEC_SUCCESS
)
1305 priv
->cmq
.last_status
= desc_ret
;
1308 if (ntc
== csq
->desc_num
)
1316 /* clean the command send queue */
1317 handle
= hns_roce_cmq_csq_clean(hr_dev
);
1319 dev_warn(hr_dev
->dev
, "Cleaned %d, need to clean %d\n",
1322 spin_unlock_bh(&csq
->lock
);
1327 static int hns_roce_cmq_send(struct hns_roce_dev
*hr_dev
,
1328 struct hns_roce_cmq_desc
*desc
, int num
)
1333 ret
= hns_roce_v2_rst_process_cmd(hr_dev
);
1334 if (ret
== CMD_RST_PRC_SUCCESS
)
1336 if (ret
== CMD_RST_PRC_EBUSY
)
1339 ret
= __hns_roce_cmq_send(hr_dev
, desc
, num
);
1341 retval
= hns_roce_v2_rst_process_cmd(hr_dev
);
1342 if (retval
== CMD_RST_PRC_SUCCESS
)
1344 else if (retval
== CMD_RST_PRC_EBUSY
)
1351 static int hns_roce_cmq_query_hw_info(struct hns_roce_dev
*hr_dev
)
1353 struct hns_roce_query_version
*resp
;
1354 struct hns_roce_cmq_desc desc
;
1357 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_QUERY_HW_VER
, true);
1358 ret
= hns_roce_cmq_send(hr_dev
, &desc
, 1);
1362 resp
= (struct hns_roce_query_version
*)desc
.data
;
1363 hr_dev
->hw_rev
= le16_to_cpu(resp
->rocee_hw_version
);
1364 hr_dev
->vendor_id
= hr_dev
->pci_dev
->vendor
;
1369 static bool hns_roce_func_clr_chk_rst(struct hns_roce_dev
*hr_dev
)
1371 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
1372 struct hnae3_handle
*handle
= priv
->handle
;
1373 const struct hnae3_ae_ops
*ops
= handle
->ae_algo
->ops
;
1374 unsigned long reset_cnt
;
1378 reset_cnt
= ops
->ae_dev_reset_cnt(handle
);
1379 hw_resetting
= ops
->get_hw_reset_stat(handle
);
1380 sw_resetting
= ops
->ae_dev_resetting(handle
);
1382 if (reset_cnt
!= hr_dev
->reset_cnt
|| hw_resetting
|| sw_resetting
)
1388 static void hns_roce_func_clr_rst_prc(struct hns_roce_dev
*hr_dev
, int retval
,
1391 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
1392 struct hnae3_handle
*handle
= priv
->handle
;
1393 const struct hnae3_ae_ops
*ops
= handle
->ae_algo
->ops
;
1394 unsigned long instance_stage
;
1395 unsigned long reset_cnt
;
1400 instance_stage
= handle
->rinfo
.instance_state
;
1401 reset_cnt
= ops
->ae_dev_reset_cnt(handle
);
1402 hw_resetting
= ops
->get_hw_reset_stat(handle
);
1403 sw_resetting
= ops
->ae_dev_resetting(handle
);
1405 if (reset_cnt
!= hr_dev
->reset_cnt
) {
1406 hr_dev
->dis_db
= true;
1407 hr_dev
->is_reset
= true;
1408 dev_info(hr_dev
->dev
, "Func clear success after reset.\n");
1409 } else if (hw_resetting
) {
1410 hr_dev
->dis_db
= true;
1412 dev_warn(hr_dev
->dev
,
1413 "Func clear is pending, device in resetting state.\n");
1414 end
= HNS_ROCE_V2_HW_RST_TIMEOUT
;
1416 if (!ops
->get_hw_reset_stat(handle
)) {
1417 hr_dev
->is_reset
= true;
1418 dev_info(hr_dev
->dev
,
1419 "Func clear success after reset.\n");
1422 msleep(HNS_ROCE_V2_HW_RST_COMPLETION_WAIT
);
1423 end
-= HNS_ROCE_V2_HW_RST_COMPLETION_WAIT
;
1426 dev_warn(hr_dev
->dev
, "Func clear failed.\n");
1427 } else if (sw_resetting
&& instance_stage
== HNS_ROCE_STATE_INIT
) {
1428 hr_dev
->dis_db
= true;
1430 dev_warn(hr_dev
->dev
,
1431 "Func clear is pending, device in resetting state.\n");
1432 end
= HNS_ROCE_V2_HW_RST_TIMEOUT
;
1434 if (ops
->ae_dev_reset_cnt(handle
) !=
1435 hr_dev
->reset_cnt
) {
1436 hr_dev
->is_reset
= true;
1437 dev_info(hr_dev
->dev
,
1438 "Func clear success after sw reset\n");
1441 msleep(HNS_ROCE_V2_HW_RST_COMPLETION_WAIT
);
1442 end
-= HNS_ROCE_V2_HW_RST_COMPLETION_WAIT
;
1445 dev_warn(hr_dev
->dev
, "Func clear failed because of unfinished sw reset\n");
1447 if (retval
&& !flag
)
1448 dev_warn(hr_dev
->dev
,
1449 "Func clear read failed, ret = %d.\n", retval
);
1451 dev_warn(hr_dev
->dev
, "Func clear failed.\n");
1454 static void hns_roce_function_clear(struct hns_roce_dev
*hr_dev
)
1456 bool fclr_write_fail_flag
= false;
1457 struct hns_roce_func_clear
*resp
;
1458 struct hns_roce_cmq_desc desc
;
1462 if (hns_roce_func_clr_chk_rst(hr_dev
))
1465 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_FUNC_CLEAR
, false);
1466 resp
= (struct hns_roce_func_clear
*)desc
.data
;
1468 ret
= hns_roce_cmq_send(hr_dev
, &desc
, 1);
1470 fclr_write_fail_flag
= true;
1471 dev_err(hr_dev
->dev
, "Func clear write failed, ret = %d.\n",
1476 msleep(HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_INTERVAL
);
1477 end
= HNS_ROCE_V2_FUNC_CLEAR_TIMEOUT_MSECS
;
1479 if (hns_roce_func_clr_chk_rst(hr_dev
))
1481 msleep(HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_FAIL_WAIT
);
1482 end
-= HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_FAIL_WAIT
;
1484 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_FUNC_CLEAR
,
1487 ret
= hns_roce_cmq_send(hr_dev
, &desc
, 1);
1491 if (roce_get_bit(resp
->func_done
, FUNC_CLEAR_RST_FUN_DONE_S
)) {
1492 hr_dev
->is_reset
= true;
1498 hns_roce_func_clr_rst_prc(hr_dev
, ret
, fclr_write_fail_flag
);
1501 static int hns_roce_query_fw_ver(struct hns_roce_dev
*hr_dev
)
1503 struct hns_roce_query_fw_info
*resp
;
1504 struct hns_roce_cmq_desc desc
;
1507 hns_roce_cmq_setup_basic_desc(&desc
, HNS_QUERY_FW_VER
, true);
1508 ret
= hns_roce_cmq_send(hr_dev
, &desc
, 1);
1512 resp
= (struct hns_roce_query_fw_info
*)desc
.data
;
1513 hr_dev
->caps
.fw_ver
= (u64
)(le32_to_cpu(resp
->fw_ver
));
1518 static int hns_roce_config_global_param(struct hns_roce_dev
*hr_dev
)
1520 struct hns_roce_cfg_global_param
*req
;
1521 struct hns_roce_cmq_desc desc
;
1523 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_CFG_GLOBAL_PARAM
,
1526 req
= (struct hns_roce_cfg_global_param
*)desc
.data
;
1527 memset(req
, 0, sizeof(*req
));
1528 roce_set_field(req
->time_cfg_udp_port
,
1529 CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_M
,
1530 CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_S
, 0x3e8);
1531 roce_set_field(req
->time_cfg_udp_port
,
1532 CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_M
,
1533 CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_S
, 0x12b7);
1535 return hns_roce_cmq_send(hr_dev
, &desc
, 1);
1538 static int hns_roce_query_pf_resource(struct hns_roce_dev
*hr_dev
)
1540 struct hns_roce_cmq_desc desc
[2];
1541 struct hns_roce_pf_res_a
*req_a
;
1542 struct hns_roce_pf_res_b
*req_b
;
1546 for (i
= 0; i
< 2; i
++) {
1547 hns_roce_cmq_setup_basic_desc(&desc
[i
],
1548 HNS_ROCE_OPC_QUERY_PF_RES
, true);
1551 desc
[i
].flag
|= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT
);
1553 desc
[i
].flag
&= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT
);
1556 ret
= hns_roce_cmq_send(hr_dev
, desc
, 2);
1560 req_a
= (struct hns_roce_pf_res_a
*)desc
[0].data
;
1561 req_b
= (struct hns_roce_pf_res_b
*)desc
[1].data
;
1563 hr_dev
->caps
.qpc_bt_num
= roce_get_field(req_a
->qpc_bt_idx_num
,
1564 PF_RES_DATA_1_PF_QPC_BT_NUM_M
,
1565 PF_RES_DATA_1_PF_QPC_BT_NUM_S
);
1566 hr_dev
->caps
.srqc_bt_num
= roce_get_field(req_a
->srqc_bt_idx_num
,
1567 PF_RES_DATA_2_PF_SRQC_BT_NUM_M
,
1568 PF_RES_DATA_2_PF_SRQC_BT_NUM_S
);
1569 hr_dev
->caps
.cqc_bt_num
= roce_get_field(req_a
->cqc_bt_idx_num
,
1570 PF_RES_DATA_3_PF_CQC_BT_NUM_M
,
1571 PF_RES_DATA_3_PF_CQC_BT_NUM_S
);
1572 hr_dev
->caps
.mpt_bt_num
= roce_get_field(req_a
->mpt_bt_idx_num
,
1573 PF_RES_DATA_4_PF_MPT_BT_NUM_M
,
1574 PF_RES_DATA_4_PF_MPT_BT_NUM_S
);
1576 hr_dev
->caps
.sl_num
= roce_get_field(req_b
->qid_idx_sl_num
,
1577 PF_RES_DATA_3_PF_SL_NUM_M
,
1578 PF_RES_DATA_3_PF_SL_NUM_S
);
1579 hr_dev
->caps
.sccc_bt_num
= roce_get_field(req_b
->sccc_bt_idx_num
,
1580 PF_RES_DATA_4_PF_SCCC_BT_NUM_M
,
1581 PF_RES_DATA_4_PF_SCCC_BT_NUM_S
);
1583 hr_dev
->caps
.gmv_bt_num
= roce_get_field(req_b
->gmv_idx_num
,
1584 PF_RES_DATA_5_PF_GMV_BT_NUM_M
,
1585 PF_RES_DATA_5_PF_GMV_BT_NUM_S
);
1590 static int hns_roce_query_pf_timer_resource(struct hns_roce_dev
*hr_dev
)
1592 struct hns_roce_pf_timer_res_a
*req_a
;
1593 struct hns_roce_cmq_desc desc
;
1596 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_QUERY_PF_TIMER_RES
,
1599 ret
= hns_roce_cmq_send(hr_dev
, &desc
, 1);
1603 req_a
= (struct hns_roce_pf_timer_res_a
*)desc
.data
;
1605 hr_dev
->caps
.qpc_timer_bt_num
=
1606 roce_get_field(req_a
->qpc_timer_bt_idx_num
,
1607 PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M
,
1608 PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S
);
1609 hr_dev
->caps
.cqc_timer_bt_num
=
1610 roce_get_field(req_a
->cqc_timer_bt_idx_num
,
1611 PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M
,
1612 PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S
);
1617 static int hns_roce_set_vf_switch_param(struct hns_roce_dev
*hr_dev
, int vf_id
)
1619 struct hns_roce_cmq_desc desc
;
1620 struct hns_roce_vf_switch
*swt
;
1623 swt
= (struct hns_roce_vf_switch
*)desc
.data
;
1624 hns_roce_cmq_setup_basic_desc(&desc
, HNS_SWITCH_PARAMETER_CFG
, true);
1625 swt
->rocee_sel
|= cpu_to_le32(HNS_ICL_SWITCH_CMD_ROCEE_SEL
);
1626 roce_set_field(swt
->fun_id
, VF_SWITCH_DATA_FUN_ID_VF_ID_M
,
1627 VF_SWITCH_DATA_FUN_ID_VF_ID_S
, vf_id
);
1628 ret
= hns_roce_cmq_send(hr_dev
, &desc
, 1);
1633 cpu_to_le16(HNS_ROCE_CMD_FLAG_NO_INTR
| HNS_ROCE_CMD_FLAG_IN
);
1634 desc
.flag
&= cpu_to_le16(~HNS_ROCE_CMD_FLAG_WR
);
1635 roce_set_bit(swt
->cfg
, VF_SWITCH_DATA_CFG_ALW_LPBK_S
, 1);
1636 roce_set_bit(swt
->cfg
, VF_SWITCH_DATA_CFG_ALW_LCL_LPBK_S
, 0);
1637 roce_set_bit(swt
->cfg
, VF_SWITCH_DATA_CFG_ALW_DST_OVRD_S
, 1);
1639 return hns_roce_cmq_send(hr_dev
, &desc
, 1);
1642 static int hns_roce_alloc_vf_resource(struct hns_roce_dev
*hr_dev
)
1644 struct hns_roce_cmq_desc desc
[2];
1645 struct hns_roce_vf_res_a
*req_a
;
1646 struct hns_roce_vf_res_b
*req_b
;
1649 req_a
= (struct hns_roce_vf_res_a
*)desc
[0].data
;
1650 req_b
= (struct hns_roce_vf_res_b
*)desc
[1].data
;
1651 for (i
= 0; i
< 2; i
++) {
1652 hns_roce_cmq_setup_basic_desc(&desc
[i
],
1653 HNS_ROCE_OPC_ALLOC_VF_RES
, false);
1656 desc
[i
].flag
|= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT
);
1658 desc
[i
].flag
&= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT
);
1661 roce_set_field(req_a
->vf_qpc_bt_idx_num
,
1662 VF_RES_A_DATA_1_VF_QPC_BT_IDX_M
,
1663 VF_RES_A_DATA_1_VF_QPC_BT_IDX_S
, 0);
1664 roce_set_field(req_a
->vf_qpc_bt_idx_num
,
1665 VF_RES_A_DATA_1_VF_QPC_BT_NUM_M
,
1666 VF_RES_A_DATA_1_VF_QPC_BT_NUM_S
, HNS_ROCE_VF_QPC_BT_NUM
);
1668 roce_set_field(req_a
->vf_srqc_bt_idx_num
,
1669 VF_RES_A_DATA_2_VF_SRQC_BT_IDX_M
,
1670 VF_RES_A_DATA_2_VF_SRQC_BT_IDX_S
, 0);
1671 roce_set_field(req_a
->vf_srqc_bt_idx_num
,
1672 VF_RES_A_DATA_2_VF_SRQC_BT_NUM_M
,
1673 VF_RES_A_DATA_2_VF_SRQC_BT_NUM_S
,
1674 HNS_ROCE_VF_SRQC_BT_NUM
);
1676 roce_set_field(req_a
->vf_cqc_bt_idx_num
,
1677 VF_RES_A_DATA_3_VF_CQC_BT_IDX_M
,
1678 VF_RES_A_DATA_3_VF_CQC_BT_IDX_S
, 0);
1679 roce_set_field(req_a
->vf_cqc_bt_idx_num
,
1680 VF_RES_A_DATA_3_VF_CQC_BT_NUM_M
,
1681 VF_RES_A_DATA_3_VF_CQC_BT_NUM_S
, HNS_ROCE_VF_CQC_BT_NUM
);
1683 roce_set_field(req_a
->vf_mpt_bt_idx_num
,
1684 VF_RES_A_DATA_4_VF_MPT_BT_IDX_M
,
1685 VF_RES_A_DATA_4_VF_MPT_BT_IDX_S
, 0);
1686 roce_set_field(req_a
->vf_mpt_bt_idx_num
,
1687 VF_RES_A_DATA_4_VF_MPT_BT_NUM_M
,
1688 VF_RES_A_DATA_4_VF_MPT_BT_NUM_S
, HNS_ROCE_VF_MPT_BT_NUM
);
1690 roce_set_field(req_a
->vf_eqc_bt_idx_num
, VF_RES_A_DATA_5_VF_EQC_IDX_M
,
1691 VF_RES_A_DATA_5_VF_EQC_IDX_S
, 0);
1692 roce_set_field(req_a
->vf_eqc_bt_idx_num
, VF_RES_A_DATA_5_VF_EQC_NUM_M
,
1693 VF_RES_A_DATA_5_VF_EQC_NUM_S
, HNS_ROCE_VF_EQC_NUM
);
1695 roce_set_field(req_b
->vf_smac_idx_num
, VF_RES_B_DATA_1_VF_SMAC_IDX_M
,
1696 VF_RES_B_DATA_1_VF_SMAC_IDX_S
, 0);
1697 roce_set_field(req_b
->vf_smac_idx_num
, VF_RES_B_DATA_1_VF_SMAC_NUM_M
,
1698 VF_RES_B_DATA_1_VF_SMAC_NUM_S
, HNS_ROCE_VF_SMAC_NUM
);
1700 roce_set_field(req_b
->vf_sgid_idx_num
, VF_RES_B_DATA_2_VF_SGID_IDX_M
,
1701 VF_RES_B_DATA_2_VF_SGID_IDX_S
, 0);
1702 roce_set_field(req_b
->vf_sgid_idx_num
, VF_RES_B_DATA_2_VF_SGID_NUM_M
,
1703 VF_RES_B_DATA_2_VF_SGID_NUM_S
, HNS_ROCE_VF_SGID_NUM
);
1705 roce_set_field(req_b
->vf_qid_idx_sl_num
, VF_RES_B_DATA_3_VF_QID_IDX_M
,
1706 VF_RES_B_DATA_3_VF_QID_IDX_S
, 0);
1707 roce_set_field(req_b
->vf_qid_idx_sl_num
, VF_RES_B_DATA_3_VF_SL_NUM_M
,
1708 VF_RES_B_DATA_3_VF_SL_NUM_S
, HNS_ROCE_VF_SL_NUM
);
1710 roce_set_field(req_b
->vf_sccc_idx_num
, VF_RES_B_DATA_4_VF_SCCC_BT_IDX_M
,
1711 VF_RES_B_DATA_4_VF_SCCC_BT_IDX_S
, 0);
1712 roce_set_field(req_b
->vf_sccc_idx_num
, VF_RES_B_DATA_4_VF_SCCC_BT_NUM_M
,
1713 VF_RES_B_DATA_4_VF_SCCC_BT_NUM_S
,
1714 HNS_ROCE_VF_SCCC_BT_NUM
);
1716 return hns_roce_cmq_send(hr_dev
, desc
, 2);
1719 static int hns_roce_v2_set_bt(struct hns_roce_dev
*hr_dev
)
1721 u8 srqc_hop_num
= hr_dev
->caps
.srqc_hop_num
;
1722 u8 qpc_hop_num
= hr_dev
->caps
.qpc_hop_num
;
1723 u8 cqc_hop_num
= hr_dev
->caps
.cqc_hop_num
;
1724 u8 mpt_hop_num
= hr_dev
->caps
.mpt_hop_num
;
1725 u8 sccc_hop_num
= hr_dev
->caps
.sccc_hop_num
;
1726 struct hns_roce_cfg_bt_attr
*req
;
1727 struct hns_roce_cmq_desc desc
;
1729 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_CFG_BT_ATTR
, false);
1730 req
= (struct hns_roce_cfg_bt_attr
*)desc
.data
;
1731 memset(req
, 0, sizeof(*req
));
1733 roce_set_field(req
->vf_qpc_cfg
, CFG_BT_ATTR_DATA_0_VF_QPC_BA_PGSZ_M
,
1734 CFG_BT_ATTR_DATA_0_VF_QPC_BA_PGSZ_S
,
1735 hr_dev
->caps
.qpc_ba_pg_sz
+ PG_SHIFT_OFFSET
);
1736 roce_set_field(req
->vf_qpc_cfg
, CFG_BT_ATTR_DATA_0_VF_QPC_BUF_PGSZ_M
,
1737 CFG_BT_ATTR_DATA_0_VF_QPC_BUF_PGSZ_S
,
1738 hr_dev
->caps
.qpc_buf_pg_sz
+ PG_SHIFT_OFFSET
);
1739 roce_set_field(req
->vf_qpc_cfg
, CFG_BT_ATTR_DATA_0_VF_QPC_HOPNUM_M
,
1740 CFG_BT_ATTR_DATA_0_VF_QPC_HOPNUM_S
,
1741 qpc_hop_num
== HNS_ROCE_HOP_NUM_0
? 0 : qpc_hop_num
);
1743 roce_set_field(req
->vf_srqc_cfg
, CFG_BT_ATTR_DATA_1_VF_SRQC_BA_PGSZ_M
,
1744 CFG_BT_ATTR_DATA_1_VF_SRQC_BA_PGSZ_S
,
1745 hr_dev
->caps
.srqc_ba_pg_sz
+ PG_SHIFT_OFFSET
);
1746 roce_set_field(req
->vf_srqc_cfg
, CFG_BT_ATTR_DATA_1_VF_SRQC_BUF_PGSZ_M
,
1747 CFG_BT_ATTR_DATA_1_VF_SRQC_BUF_PGSZ_S
,
1748 hr_dev
->caps
.srqc_buf_pg_sz
+ PG_SHIFT_OFFSET
);
1749 roce_set_field(req
->vf_srqc_cfg
, CFG_BT_ATTR_DATA_1_VF_SRQC_HOPNUM_M
,
1750 CFG_BT_ATTR_DATA_1_VF_SRQC_HOPNUM_S
,
1751 srqc_hop_num
== HNS_ROCE_HOP_NUM_0
? 0 : srqc_hop_num
);
1753 roce_set_field(req
->vf_cqc_cfg
, CFG_BT_ATTR_DATA_2_VF_CQC_BA_PGSZ_M
,
1754 CFG_BT_ATTR_DATA_2_VF_CQC_BA_PGSZ_S
,
1755 hr_dev
->caps
.cqc_ba_pg_sz
+ PG_SHIFT_OFFSET
);
1756 roce_set_field(req
->vf_cqc_cfg
, CFG_BT_ATTR_DATA_2_VF_CQC_BUF_PGSZ_M
,
1757 CFG_BT_ATTR_DATA_2_VF_CQC_BUF_PGSZ_S
,
1758 hr_dev
->caps
.cqc_buf_pg_sz
+ PG_SHIFT_OFFSET
);
1759 roce_set_field(req
->vf_cqc_cfg
, CFG_BT_ATTR_DATA_2_VF_CQC_HOPNUM_M
,
1760 CFG_BT_ATTR_DATA_2_VF_CQC_HOPNUM_S
,
1761 cqc_hop_num
== HNS_ROCE_HOP_NUM_0
? 0 : cqc_hop_num
);
1763 roce_set_field(req
->vf_mpt_cfg
, CFG_BT_ATTR_DATA_3_VF_MPT_BA_PGSZ_M
,
1764 CFG_BT_ATTR_DATA_3_VF_MPT_BA_PGSZ_S
,
1765 hr_dev
->caps
.mpt_ba_pg_sz
+ PG_SHIFT_OFFSET
);
1766 roce_set_field(req
->vf_mpt_cfg
, CFG_BT_ATTR_DATA_3_VF_MPT_BUF_PGSZ_M
,
1767 CFG_BT_ATTR_DATA_3_VF_MPT_BUF_PGSZ_S
,
1768 hr_dev
->caps
.mpt_buf_pg_sz
+ PG_SHIFT_OFFSET
);
1769 roce_set_field(req
->vf_mpt_cfg
, CFG_BT_ATTR_DATA_3_VF_MPT_HOPNUM_M
,
1770 CFG_BT_ATTR_DATA_3_VF_MPT_HOPNUM_S
,
1771 mpt_hop_num
== HNS_ROCE_HOP_NUM_0
? 0 : mpt_hop_num
);
1773 roce_set_field(req
->vf_sccc_cfg
,
1774 CFG_BT_ATTR_DATA_4_VF_SCCC_BA_PGSZ_M
,
1775 CFG_BT_ATTR_DATA_4_VF_SCCC_BA_PGSZ_S
,
1776 hr_dev
->caps
.sccc_ba_pg_sz
+ PG_SHIFT_OFFSET
);
1777 roce_set_field(req
->vf_sccc_cfg
,
1778 CFG_BT_ATTR_DATA_4_VF_SCCC_BUF_PGSZ_M
,
1779 CFG_BT_ATTR_DATA_4_VF_SCCC_BUF_PGSZ_S
,
1780 hr_dev
->caps
.sccc_buf_pg_sz
+ PG_SHIFT_OFFSET
);
1781 roce_set_field(req
->vf_sccc_cfg
,
1782 CFG_BT_ATTR_DATA_4_VF_SCCC_HOPNUM_M
,
1783 CFG_BT_ATTR_DATA_4_VF_SCCC_HOPNUM_S
,
1785 HNS_ROCE_HOP_NUM_0
? 0 : sccc_hop_num
);
1787 return hns_roce_cmq_send(hr_dev
, &desc
, 1);
1790 static void set_default_caps(struct hns_roce_dev
*hr_dev
)
1792 struct hns_roce_caps
*caps
= &hr_dev
->caps
;
1794 caps
->num_qps
= HNS_ROCE_V2_MAX_QP_NUM
;
1795 caps
->max_wqes
= HNS_ROCE_V2_MAX_WQE_NUM
;
1796 caps
->num_cqs
= HNS_ROCE_V2_MAX_CQ_NUM
;
1797 caps
->num_srqs
= HNS_ROCE_V2_MAX_SRQ_NUM
;
1798 caps
->min_cqes
= HNS_ROCE_MIN_CQE_NUM
;
1799 caps
->max_cqes
= HNS_ROCE_V2_MAX_CQE_NUM
;
1800 caps
->max_sq_sg
= HNS_ROCE_V2_MAX_SQ_SGE_NUM
;
1801 caps
->max_extend_sg
= HNS_ROCE_V2_MAX_EXTEND_SGE_NUM
;
1802 caps
->max_rq_sg
= HNS_ROCE_V2_MAX_RQ_SGE_NUM
;
1803 caps
->max_sq_inline
= HNS_ROCE_V2_MAX_SQ_INLINE
;
1804 caps
->num_uars
= HNS_ROCE_V2_UAR_NUM
;
1805 caps
->phy_num_uars
= HNS_ROCE_V2_PHY_UAR_NUM
;
1806 caps
->num_aeq_vectors
= HNS_ROCE_V2_AEQE_VEC_NUM
;
1807 caps
->num_comp_vectors
= HNS_ROCE_V2_COMP_VEC_NUM
;
1808 caps
->num_other_vectors
= HNS_ROCE_V2_ABNORMAL_VEC_NUM
;
1809 caps
->num_mtpts
= HNS_ROCE_V2_MAX_MTPT_NUM
;
1810 caps
->num_mtt_segs
= HNS_ROCE_V2_MAX_MTT_SEGS
;
1811 caps
->num_cqe_segs
= HNS_ROCE_V2_MAX_CQE_SEGS
;
1812 caps
->num_srqwqe_segs
= HNS_ROCE_V2_MAX_SRQWQE_SEGS
;
1813 caps
->num_idx_segs
= HNS_ROCE_V2_MAX_IDX_SEGS
;
1814 caps
->num_pds
= HNS_ROCE_V2_MAX_PD_NUM
;
1815 caps
->max_qp_init_rdma
= HNS_ROCE_V2_MAX_QP_INIT_RDMA
;
1816 caps
->max_qp_dest_rdma
= HNS_ROCE_V2_MAX_QP_DEST_RDMA
;
1817 caps
->max_sq_desc_sz
= HNS_ROCE_V2_MAX_SQ_DESC_SZ
;
1818 caps
->max_rq_desc_sz
= HNS_ROCE_V2_MAX_RQ_DESC_SZ
;
1819 caps
->max_srq_desc_sz
= HNS_ROCE_V2_MAX_SRQ_DESC_SZ
;
1820 caps
->qpc_sz
= HNS_ROCE_V2_QPC_SZ
;
1821 caps
->irrl_entry_sz
= HNS_ROCE_V2_IRRL_ENTRY_SZ
;
1822 caps
->trrl_entry_sz
= HNS_ROCE_V2_EXT_ATOMIC_TRRL_ENTRY_SZ
;
1823 caps
->cqc_entry_sz
= HNS_ROCE_V2_CQC_ENTRY_SZ
;
1824 caps
->srqc_entry_sz
= HNS_ROCE_V2_SRQC_ENTRY_SZ
;
1825 caps
->mtpt_entry_sz
= HNS_ROCE_V2_MTPT_ENTRY_SZ
;
1826 caps
->mtt_entry_sz
= HNS_ROCE_V2_MTT_ENTRY_SZ
;
1827 caps
->idx_entry_sz
= HNS_ROCE_V2_IDX_ENTRY_SZ
;
1828 caps
->cqe_sz
= HNS_ROCE_V2_CQE_SIZE
;
1829 caps
->page_size_cap
= HNS_ROCE_V2_PAGE_SIZE_SUPPORTED
;
1830 caps
->reserved_lkey
= 0;
1831 caps
->reserved_pds
= 0;
1832 caps
->reserved_mrws
= 1;
1833 caps
->reserved_uars
= 0;
1834 caps
->reserved_cqs
= 0;
1835 caps
->reserved_srqs
= 0;
1836 caps
->reserved_qps
= HNS_ROCE_V2_RSV_QPS
;
1838 caps
->qpc_ba_pg_sz
= 0;
1839 caps
->qpc_buf_pg_sz
= 0;
1840 caps
->qpc_hop_num
= HNS_ROCE_CONTEXT_HOP_NUM
;
1841 caps
->srqc_ba_pg_sz
= 0;
1842 caps
->srqc_buf_pg_sz
= 0;
1843 caps
->srqc_hop_num
= HNS_ROCE_CONTEXT_HOP_NUM
;
1844 caps
->cqc_ba_pg_sz
= 0;
1845 caps
->cqc_buf_pg_sz
= 0;
1846 caps
->cqc_hop_num
= HNS_ROCE_CONTEXT_HOP_NUM
;
1847 caps
->mpt_ba_pg_sz
= 0;
1848 caps
->mpt_buf_pg_sz
= 0;
1849 caps
->mpt_hop_num
= HNS_ROCE_CONTEXT_HOP_NUM
;
1850 caps
->mtt_ba_pg_sz
= 0;
1851 caps
->mtt_buf_pg_sz
= 0;
1852 caps
->mtt_hop_num
= HNS_ROCE_MTT_HOP_NUM
;
1853 caps
->wqe_sq_hop_num
= HNS_ROCE_SQWQE_HOP_NUM
;
1854 caps
->wqe_sge_hop_num
= HNS_ROCE_EXT_SGE_HOP_NUM
;
1855 caps
->wqe_rq_hop_num
= HNS_ROCE_RQWQE_HOP_NUM
;
1856 caps
->cqe_ba_pg_sz
= HNS_ROCE_BA_PG_SZ_SUPPORTED_256K
;
1857 caps
->cqe_buf_pg_sz
= 0;
1858 caps
->cqe_hop_num
= HNS_ROCE_CQE_HOP_NUM
;
1859 caps
->srqwqe_ba_pg_sz
= 0;
1860 caps
->srqwqe_buf_pg_sz
= 0;
1861 caps
->srqwqe_hop_num
= HNS_ROCE_SRQWQE_HOP_NUM
;
1862 caps
->idx_ba_pg_sz
= 0;
1863 caps
->idx_buf_pg_sz
= 0;
1864 caps
->idx_hop_num
= HNS_ROCE_IDX_HOP_NUM
;
1865 caps
->chunk_sz
= HNS_ROCE_V2_TABLE_CHUNK_SIZE
;
1867 caps
->flags
= HNS_ROCE_CAP_FLAG_REREG_MR
|
1868 HNS_ROCE_CAP_FLAG_ROCE_V1_V2
|
1869 HNS_ROCE_CAP_FLAG_RQ_INLINE
|
1870 HNS_ROCE_CAP_FLAG_RECORD_DB
|
1871 HNS_ROCE_CAP_FLAG_SQ_RECORD_DB
;
1873 caps
->pkey_table_len
[0] = 1;
1874 caps
->gid_table_len
[0] = HNS_ROCE_V2_GID_INDEX_NUM
;
1875 caps
->ceqe_depth
= HNS_ROCE_V2_COMP_EQE_NUM
;
1876 caps
->aeqe_depth
= HNS_ROCE_V2_ASYNC_EQE_NUM
;
1877 caps
->aeqe_size
= HNS_ROCE_AEQE_SIZE
;
1878 caps
->ceqe_size
= HNS_ROCE_CEQE_SIZE
;
1879 caps
->local_ca_ack_delay
= 0;
1880 caps
->max_mtu
= IB_MTU_4096
;
1882 caps
->max_srq_wrs
= HNS_ROCE_V2_MAX_SRQ_WR
;
1883 caps
->max_srq_sges
= HNS_ROCE_V2_MAX_SRQ_SGE
;
1885 caps
->flags
|= HNS_ROCE_CAP_FLAG_ATOMIC
| HNS_ROCE_CAP_FLAG_MW
|
1886 HNS_ROCE_CAP_FLAG_SRQ
| HNS_ROCE_CAP_FLAG_FRMR
|
1887 HNS_ROCE_CAP_FLAG_QP_FLOW_CTRL
;
1889 caps
->num_qpc_timer
= HNS_ROCE_V2_MAX_QPC_TIMER_NUM
;
1890 caps
->qpc_timer_entry_sz
= HNS_ROCE_V2_QPC_TIMER_ENTRY_SZ
;
1891 caps
->qpc_timer_ba_pg_sz
= 0;
1892 caps
->qpc_timer_buf_pg_sz
= 0;
1893 caps
->qpc_timer_hop_num
= HNS_ROCE_HOP_NUM_0
;
1894 caps
->num_cqc_timer
= HNS_ROCE_V2_MAX_CQC_TIMER_NUM
;
1895 caps
->cqc_timer_entry_sz
= HNS_ROCE_V2_CQC_TIMER_ENTRY_SZ
;
1896 caps
->cqc_timer_ba_pg_sz
= 0;
1897 caps
->cqc_timer_buf_pg_sz
= 0;
1898 caps
->cqc_timer_hop_num
= HNS_ROCE_HOP_NUM_0
;
1900 caps
->sccc_sz
= HNS_ROCE_V2_SCCC_SZ
;
1901 caps
->sccc_ba_pg_sz
= 0;
1902 caps
->sccc_buf_pg_sz
= 0;
1903 caps
->sccc_hop_num
= HNS_ROCE_SCCC_HOP_NUM
;
1905 if (hr_dev
->pci_dev
->revision
>= PCI_REVISION_ID_HIP09
) {
1906 caps
->aeqe_size
= HNS_ROCE_V3_EQE_SIZE
;
1907 caps
->ceqe_size
= HNS_ROCE_V3_EQE_SIZE
;
1908 caps
->cqe_sz
= HNS_ROCE_V3_CQE_SIZE
;
1909 caps
->qpc_sz
= HNS_ROCE_V3_QPC_SZ
;
1910 caps
->sccc_sz
= HNS_ROCE_V3_SCCC_SZ
;
1911 caps
->gmv_entry_sz
= HNS_ROCE_V3_GMV_ENTRY_SZ
;
1912 caps
->gmv_entry_num
= caps
->gmv_bt_num
* (PAGE_SIZE
/
1913 caps
->gmv_entry_sz
);
1914 caps
->gmv_hop_num
= HNS_ROCE_HOP_NUM_0
;
1915 caps
->gmv_ba_pg_sz
= 0;
1916 caps
->gmv_buf_pg_sz
= 0;
1917 caps
->gid_table_len
[0] = caps
->gmv_bt_num
* (HNS_HW_PAGE_SIZE
/
1918 caps
->gmv_entry_sz
);
1922 static void calc_pg_sz(u32 obj_num
, u32 obj_size
, u32 hop_num
, u32 ctx_bt_num
,
1923 u32
*buf_page_size
, u32
*bt_page_size
, u32 hem_type
)
1926 u64 bt_chunk_size
= PAGE_SIZE
;
1927 u64 buf_chunk_size
= PAGE_SIZE
;
1928 u64 obj_per_chunk_default
= buf_chunk_size
/ obj_size
;
1935 obj_per_chunk
= ctx_bt_num
* (bt_chunk_size
/ BA_BYTE_LEN
) *
1936 (bt_chunk_size
/ BA_BYTE_LEN
) *
1937 (bt_chunk_size
/ BA_BYTE_LEN
) *
1938 obj_per_chunk_default
;
1941 obj_per_chunk
= ctx_bt_num
* (bt_chunk_size
/ BA_BYTE_LEN
) *
1942 (bt_chunk_size
/ BA_BYTE_LEN
) *
1943 obj_per_chunk_default
;
1946 obj_per_chunk
= ctx_bt_num
* (bt_chunk_size
/ BA_BYTE_LEN
) *
1947 obj_per_chunk_default
;
1949 case HNS_ROCE_HOP_NUM_0
:
1950 obj_per_chunk
= ctx_bt_num
* obj_per_chunk_default
;
1953 pr_err("table %u not support hop_num = %u!\n", hem_type
,
1958 if (hem_type
>= HEM_TYPE_MTT
)
1959 *bt_page_size
= ilog2(DIV_ROUND_UP(obj_num
, obj_per_chunk
));
1961 *buf_page_size
= ilog2(DIV_ROUND_UP(obj_num
, obj_per_chunk
));
1964 static int hns_roce_query_pf_caps(struct hns_roce_dev
*hr_dev
)
1966 struct hns_roce_cmq_desc desc
[HNS_ROCE_QUERY_PF_CAPS_CMD_NUM
];
1967 struct hns_roce_caps
*caps
= &hr_dev
->caps
;
1968 struct hns_roce_query_pf_caps_a
*resp_a
;
1969 struct hns_roce_query_pf_caps_b
*resp_b
;
1970 struct hns_roce_query_pf_caps_c
*resp_c
;
1971 struct hns_roce_query_pf_caps_d
*resp_d
;
1972 struct hns_roce_query_pf_caps_e
*resp_e
;
1978 for (i
= 0; i
< HNS_ROCE_QUERY_PF_CAPS_CMD_NUM
; i
++) {
1979 hns_roce_cmq_setup_basic_desc(&desc
[i
],
1980 HNS_ROCE_OPC_QUERY_PF_CAPS_NUM
,
1982 if (i
< (HNS_ROCE_QUERY_PF_CAPS_CMD_NUM
- 1))
1983 desc
[i
].flag
|= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT
);
1985 desc
[i
].flag
&= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT
);
1988 ret
= hns_roce_cmq_send(hr_dev
, desc
, HNS_ROCE_QUERY_PF_CAPS_CMD_NUM
);
1992 resp_a
= (struct hns_roce_query_pf_caps_a
*)desc
[0].data
;
1993 resp_b
= (struct hns_roce_query_pf_caps_b
*)desc
[1].data
;
1994 resp_c
= (struct hns_roce_query_pf_caps_c
*)desc
[2].data
;
1995 resp_d
= (struct hns_roce_query_pf_caps_d
*)desc
[3].data
;
1996 resp_e
= (struct hns_roce_query_pf_caps_e
*)desc
[4].data
;
1998 caps
->local_ca_ack_delay
= resp_a
->local_ca_ack_delay
;
1999 caps
->max_sq_sg
= le16_to_cpu(resp_a
->max_sq_sg
);
2000 caps
->max_sq_inline
= le16_to_cpu(resp_a
->max_sq_inline
);
2001 caps
->max_rq_sg
= le16_to_cpu(resp_a
->max_rq_sg
);
2002 caps
->max_extend_sg
= le32_to_cpu(resp_a
->max_extend_sg
);
2003 caps
->num_qpc_timer
= le16_to_cpu(resp_a
->num_qpc_timer
);
2004 caps
->num_cqc_timer
= le16_to_cpu(resp_a
->num_cqc_timer
);
2005 caps
->max_srq_sges
= le16_to_cpu(resp_a
->max_srq_sges
);
2006 caps
->num_aeq_vectors
= resp_a
->num_aeq_vectors
;
2007 caps
->num_other_vectors
= resp_a
->num_other_vectors
;
2008 caps
->max_sq_desc_sz
= resp_a
->max_sq_desc_sz
;
2009 caps
->max_rq_desc_sz
= resp_a
->max_rq_desc_sz
;
2010 caps
->max_srq_desc_sz
= resp_a
->max_srq_desc_sz
;
2011 caps
->cqe_sz
= HNS_ROCE_V2_CQE_SIZE
;
2013 caps
->mtpt_entry_sz
= resp_b
->mtpt_entry_sz
;
2014 caps
->irrl_entry_sz
= resp_b
->irrl_entry_sz
;
2015 caps
->trrl_entry_sz
= resp_b
->trrl_entry_sz
;
2016 caps
->cqc_entry_sz
= resp_b
->cqc_entry_sz
;
2017 caps
->srqc_entry_sz
= resp_b
->srqc_entry_sz
;
2018 caps
->idx_entry_sz
= resp_b
->idx_entry_sz
;
2019 caps
->sccc_sz
= resp_b
->sccc_sz
;
2020 caps
->max_mtu
= resp_b
->max_mtu
;
2021 caps
->qpc_sz
= HNS_ROCE_V2_QPC_SZ
;
2022 caps
->min_cqes
= resp_b
->min_cqes
;
2023 caps
->min_wqes
= resp_b
->min_wqes
;
2024 caps
->page_size_cap
= le32_to_cpu(resp_b
->page_size_cap
);
2025 caps
->pkey_table_len
[0] = resp_b
->pkey_table_len
;
2026 caps
->phy_num_uars
= resp_b
->phy_num_uars
;
2027 ctx_hop_num
= resp_b
->ctx_hop_num
;
2028 pbl_hop_num
= resp_b
->pbl_hop_num
;
2030 caps
->num_pds
= 1 << roce_get_field(resp_c
->cap_flags_num_pds
,
2031 V2_QUERY_PF_CAPS_C_NUM_PDS_M
,
2032 V2_QUERY_PF_CAPS_C_NUM_PDS_S
);
2033 caps
->flags
= roce_get_field(resp_c
->cap_flags_num_pds
,
2034 V2_QUERY_PF_CAPS_C_CAP_FLAGS_M
,
2035 V2_QUERY_PF_CAPS_C_CAP_FLAGS_S
);
2036 caps
->flags
|= le16_to_cpu(resp_d
->cap_flags_ex
) <<
2037 HNS_ROCE_CAP_FLAGS_EX_SHIFT
;
2039 caps
->num_cqs
= 1 << roce_get_field(resp_c
->max_gid_num_cqs
,
2040 V2_QUERY_PF_CAPS_C_NUM_CQS_M
,
2041 V2_QUERY_PF_CAPS_C_NUM_CQS_S
);
2042 caps
->gid_table_len
[0] = roce_get_field(resp_c
->max_gid_num_cqs
,
2043 V2_QUERY_PF_CAPS_C_MAX_GID_M
,
2044 V2_QUERY_PF_CAPS_C_MAX_GID_S
);
2045 caps
->max_cqes
= 1 << roce_get_field(resp_c
->cq_depth
,
2046 V2_QUERY_PF_CAPS_C_CQ_DEPTH_M
,
2047 V2_QUERY_PF_CAPS_C_CQ_DEPTH_S
);
2048 caps
->num_mtpts
= 1 << roce_get_field(resp_c
->num_mrws
,
2049 V2_QUERY_PF_CAPS_C_NUM_MRWS_M
,
2050 V2_QUERY_PF_CAPS_C_NUM_MRWS_S
);
2051 caps
->num_qps
= 1 << roce_get_field(resp_c
->ord_num_qps
,
2052 V2_QUERY_PF_CAPS_C_NUM_QPS_M
,
2053 V2_QUERY_PF_CAPS_C_NUM_QPS_S
);
2054 caps
->max_qp_init_rdma
= roce_get_field(resp_c
->ord_num_qps
,
2055 V2_QUERY_PF_CAPS_C_MAX_ORD_M
,
2056 V2_QUERY_PF_CAPS_C_MAX_ORD_S
);
2057 caps
->max_qp_dest_rdma
= caps
->max_qp_init_rdma
;
2058 caps
->max_wqes
= 1 << le16_to_cpu(resp_c
->sq_depth
);
2059 caps
->num_srqs
= 1 << roce_get_field(resp_d
->wq_hop_num_max_srqs
,
2060 V2_QUERY_PF_CAPS_D_NUM_SRQS_M
,
2061 V2_QUERY_PF_CAPS_D_NUM_SRQS_S
);
2062 caps
->max_srq_wrs
= 1 << le16_to_cpu(resp_d
->srq_depth
);
2063 caps
->ceqe_depth
= 1 << roce_get_field(resp_d
->num_ceqs_ceq_depth
,
2064 V2_QUERY_PF_CAPS_D_CEQ_DEPTH_M
,
2065 V2_QUERY_PF_CAPS_D_CEQ_DEPTH_S
);
2066 caps
->num_comp_vectors
= roce_get_field(resp_d
->num_ceqs_ceq_depth
,
2067 V2_QUERY_PF_CAPS_D_NUM_CEQS_M
,
2068 V2_QUERY_PF_CAPS_D_NUM_CEQS_S
);
2069 caps
->aeqe_depth
= 1 << roce_get_field(resp_d
->arm_st_aeq_depth
,
2070 V2_QUERY_PF_CAPS_D_AEQ_DEPTH_M
,
2071 V2_QUERY_PF_CAPS_D_AEQ_DEPTH_S
);
2072 caps
->default_aeq_arm_st
= roce_get_field(resp_d
->arm_st_aeq_depth
,
2073 V2_QUERY_PF_CAPS_D_AEQ_ARM_ST_M
,
2074 V2_QUERY_PF_CAPS_D_AEQ_ARM_ST_S
);
2075 caps
->default_ceq_arm_st
= roce_get_field(resp_d
->arm_st_aeq_depth
,
2076 V2_QUERY_PF_CAPS_D_CEQ_ARM_ST_M
,
2077 V2_QUERY_PF_CAPS_D_CEQ_ARM_ST_S
);
2078 caps
->reserved_pds
= roce_get_field(resp_d
->num_uars_rsv_pds
,
2079 V2_QUERY_PF_CAPS_D_RSV_PDS_M
,
2080 V2_QUERY_PF_CAPS_D_RSV_PDS_S
);
2081 caps
->num_uars
= 1 << roce_get_field(resp_d
->num_uars_rsv_pds
,
2082 V2_QUERY_PF_CAPS_D_NUM_UARS_M
,
2083 V2_QUERY_PF_CAPS_D_NUM_UARS_S
);
2084 caps
->reserved_qps
= roce_get_field(resp_d
->rsv_uars_rsv_qps
,
2085 V2_QUERY_PF_CAPS_D_RSV_QPS_M
,
2086 V2_QUERY_PF_CAPS_D_RSV_QPS_S
);
2087 caps
->reserved_uars
= roce_get_field(resp_d
->rsv_uars_rsv_qps
,
2088 V2_QUERY_PF_CAPS_D_RSV_UARS_M
,
2089 V2_QUERY_PF_CAPS_D_RSV_UARS_S
);
2090 caps
->reserved_mrws
= roce_get_field(resp_e
->chunk_size_shift_rsv_mrws
,
2091 V2_QUERY_PF_CAPS_E_RSV_MRWS_M
,
2092 V2_QUERY_PF_CAPS_E_RSV_MRWS_S
);
2093 caps
->chunk_sz
= 1 << roce_get_field(resp_e
->chunk_size_shift_rsv_mrws
,
2094 V2_QUERY_PF_CAPS_E_CHUNK_SIZE_SHIFT_M
,
2095 V2_QUERY_PF_CAPS_E_CHUNK_SIZE_SHIFT_S
);
2096 caps
->reserved_cqs
= roce_get_field(resp_e
->rsv_cqs
,
2097 V2_QUERY_PF_CAPS_E_RSV_CQS_M
,
2098 V2_QUERY_PF_CAPS_E_RSV_CQS_S
);
2099 caps
->reserved_srqs
= roce_get_field(resp_e
->rsv_srqs
,
2100 V2_QUERY_PF_CAPS_E_RSV_SRQS_M
,
2101 V2_QUERY_PF_CAPS_E_RSV_SRQS_S
);
2102 caps
->reserved_lkey
= roce_get_field(resp_e
->rsv_lkey
,
2103 V2_QUERY_PF_CAPS_E_RSV_LKEYS_M
,
2104 V2_QUERY_PF_CAPS_E_RSV_LKEYS_S
);
2105 caps
->default_ceq_max_cnt
= le16_to_cpu(resp_e
->ceq_max_cnt
);
2106 caps
->default_ceq_period
= le16_to_cpu(resp_e
->ceq_period
);
2107 caps
->default_aeq_max_cnt
= le16_to_cpu(resp_e
->aeq_max_cnt
);
2108 caps
->default_aeq_period
= le16_to_cpu(resp_e
->aeq_period
);
2110 caps
->qpc_timer_entry_sz
= HNS_ROCE_V2_QPC_TIMER_ENTRY_SZ
;
2111 caps
->cqc_timer_entry_sz
= HNS_ROCE_V2_CQC_TIMER_ENTRY_SZ
;
2112 caps
->mtt_entry_sz
= HNS_ROCE_V2_MTT_ENTRY_SZ
;
2113 caps
->num_mtt_segs
= HNS_ROCE_V2_MAX_MTT_SEGS
;
2114 caps
->ceqe_size
= HNS_ROCE_CEQE_SIZE
;
2115 caps
->aeqe_size
= HNS_ROCE_AEQE_SIZE
;
2116 caps
->mtt_ba_pg_sz
= 0;
2117 caps
->num_cqe_segs
= HNS_ROCE_V2_MAX_CQE_SEGS
;
2118 caps
->num_srqwqe_segs
= HNS_ROCE_V2_MAX_SRQWQE_SEGS
;
2119 caps
->num_idx_segs
= HNS_ROCE_V2_MAX_IDX_SEGS
;
2121 caps
->qpc_hop_num
= ctx_hop_num
;
2122 caps
->srqc_hop_num
= ctx_hop_num
;
2123 caps
->cqc_hop_num
= ctx_hop_num
;
2124 caps
->mpt_hop_num
= ctx_hop_num
;
2125 caps
->mtt_hop_num
= pbl_hop_num
;
2126 caps
->cqe_hop_num
= pbl_hop_num
;
2127 caps
->srqwqe_hop_num
= pbl_hop_num
;
2128 caps
->idx_hop_num
= pbl_hop_num
;
2129 caps
->wqe_sq_hop_num
= roce_get_field(resp_d
->wq_hop_num_max_srqs
,
2130 V2_QUERY_PF_CAPS_D_SQWQE_HOP_NUM_M
,
2131 V2_QUERY_PF_CAPS_D_SQWQE_HOP_NUM_S
);
2132 caps
->wqe_sge_hop_num
= roce_get_field(resp_d
->wq_hop_num_max_srqs
,
2133 V2_QUERY_PF_CAPS_D_EX_SGE_HOP_NUM_M
,
2134 V2_QUERY_PF_CAPS_D_EX_SGE_HOP_NUM_S
);
2135 caps
->wqe_rq_hop_num
= roce_get_field(resp_d
->wq_hop_num_max_srqs
,
2136 V2_QUERY_PF_CAPS_D_RQWQE_HOP_NUM_M
,
2137 V2_QUERY_PF_CAPS_D_RQWQE_HOP_NUM_S
);
2139 if (hr_dev
->pci_dev
->revision
>= PCI_REVISION_ID_HIP09
) {
2140 caps
->ceqe_size
= HNS_ROCE_V3_EQE_SIZE
;
2141 caps
->aeqe_size
= HNS_ROCE_V3_EQE_SIZE
;
2142 caps
->cqe_sz
= HNS_ROCE_V3_CQE_SIZE
;
2143 caps
->qpc_sz
= HNS_ROCE_V3_QPC_SZ
;
2144 caps
->sccc_sz
= HNS_ROCE_V3_SCCC_SZ
;
2145 caps
->gmv_entry_sz
= HNS_ROCE_V3_GMV_ENTRY_SZ
;
2146 caps
->gmv_entry_num
= caps
->gmv_bt_num
* (PAGE_SIZE
/
2147 caps
->gmv_entry_sz
);
2148 caps
->gmv_hop_num
= HNS_ROCE_HOP_NUM_0
;
2149 caps
->gmv_ba_pg_sz
= 0;
2150 caps
->gmv_buf_pg_sz
= 0;
2151 caps
->gid_table_len
[0] = caps
->gmv_bt_num
*
2152 (HNS_HW_PAGE_SIZE
/ caps
->gmv_entry_sz
);
2155 calc_pg_sz(caps
->num_qps
, caps
->qpc_sz
, caps
->qpc_hop_num
,
2156 caps
->qpc_bt_num
, &caps
->qpc_buf_pg_sz
, &caps
->qpc_ba_pg_sz
,
2158 calc_pg_sz(caps
->num_mtpts
, caps
->mtpt_entry_sz
, caps
->mpt_hop_num
,
2159 caps
->mpt_bt_num
, &caps
->mpt_buf_pg_sz
, &caps
->mpt_ba_pg_sz
,
2161 calc_pg_sz(caps
->num_cqs
, caps
->cqc_entry_sz
, caps
->cqc_hop_num
,
2162 caps
->cqc_bt_num
, &caps
->cqc_buf_pg_sz
, &caps
->cqc_ba_pg_sz
,
2164 calc_pg_sz(caps
->num_srqs
, caps
->srqc_entry_sz
, caps
->srqc_hop_num
,
2165 caps
->srqc_bt_num
, &caps
->srqc_buf_pg_sz
,
2166 &caps
->srqc_ba_pg_sz
, HEM_TYPE_SRQC
);
2168 caps
->sccc_hop_num
= ctx_hop_num
;
2169 caps
->qpc_timer_hop_num
= HNS_ROCE_HOP_NUM_0
;
2170 caps
->cqc_timer_hop_num
= HNS_ROCE_HOP_NUM_0
;
2172 calc_pg_sz(caps
->num_qps
, caps
->sccc_sz
,
2173 caps
->sccc_hop_num
, caps
->sccc_bt_num
,
2174 &caps
->sccc_buf_pg_sz
, &caps
->sccc_ba_pg_sz
,
2176 calc_pg_sz(caps
->num_cqc_timer
, caps
->cqc_timer_entry_sz
,
2177 caps
->cqc_timer_hop_num
, caps
->cqc_timer_bt_num
,
2178 &caps
->cqc_timer_buf_pg_sz
,
2179 &caps
->cqc_timer_ba_pg_sz
, HEM_TYPE_CQC_TIMER
);
2181 calc_pg_sz(caps
->num_cqe_segs
, caps
->mtt_entry_sz
, caps
->cqe_hop_num
,
2182 1, &caps
->cqe_buf_pg_sz
, &caps
->cqe_ba_pg_sz
, HEM_TYPE_CQE
);
2183 calc_pg_sz(caps
->num_srqwqe_segs
, caps
->mtt_entry_sz
,
2184 caps
->srqwqe_hop_num
, 1, &caps
->srqwqe_buf_pg_sz
,
2185 &caps
->srqwqe_ba_pg_sz
, HEM_TYPE_SRQWQE
);
2186 calc_pg_sz(caps
->num_idx_segs
, caps
->idx_entry_sz
, caps
->idx_hop_num
,
2187 1, &caps
->idx_buf_pg_sz
, &caps
->idx_ba_pg_sz
, HEM_TYPE_IDX
);
2192 static int hns_roce_config_qpc_size(struct hns_roce_dev
*hr_dev
)
2194 struct hns_roce_cmq_desc desc
;
2195 struct hns_roce_cfg_entry_size
*cfg_size
=
2196 (struct hns_roce_cfg_entry_size
*)desc
.data
;
2198 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_CFG_ENTRY_SIZE
,
2201 cfg_size
->type
= cpu_to_le32(HNS_ROCE_CFG_QPC_SIZE
);
2202 cfg_size
->size
= cpu_to_le32(hr_dev
->caps
.qpc_sz
);
2204 return hns_roce_cmq_send(hr_dev
, &desc
, 1);
2207 static int hns_roce_config_sccc_size(struct hns_roce_dev
*hr_dev
)
2209 struct hns_roce_cmq_desc desc
;
2210 struct hns_roce_cfg_entry_size
*cfg_size
=
2211 (struct hns_roce_cfg_entry_size
*)desc
.data
;
2213 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_CFG_ENTRY_SIZE
,
2216 cfg_size
->type
= cpu_to_le32(HNS_ROCE_CFG_SCCC_SIZE
);
2217 cfg_size
->size
= cpu_to_le32(hr_dev
->caps
.sccc_sz
);
2219 return hns_roce_cmq_send(hr_dev
, &desc
, 1);
2222 static int hns_roce_config_entry_size(struct hns_roce_dev
*hr_dev
)
2226 if (hr_dev
->pci_dev
->revision
< PCI_REVISION_ID_HIP09
)
2229 ret
= hns_roce_config_qpc_size(hr_dev
);
2231 dev_err(hr_dev
->dev
, "failed to cfg qpc sz, ret = %d.\n", ret
);
2235 ret
= hns_roce_config_sccc_size(hr_dev
);
2237 dev_err(hr_dev
->dev
, "failed to cfg sccc sz, ret = %d.\n", ret
);
2242 static int hns_roce_v2_profile(struct hns_roce_dev
*hr_dev
)
2244 struct hns_roce_caps
*caps
= &hr_dev
->caps
;
2247 ret
= hns_roce_cmq_query_hw_info(hr_dev
);
2249 dev_err(hr_dev
->dev
, "Query hardware version fail, ret = %d.\n",
2254 ret
= hns_roce_query_fw_ver(hr_dev
);
2256 dev_err(hr_dev
->dev
, "Query firmware version fail, ret = %d.\n",
2261 ret
= hns_roce_config_global_param(hr_dev
);
2263 dev_err(hr_dev
->dev
, "Configure global param fail, ret = %d.\n",
2268 /* Get pf resource owned by every pf */
2269 ret
= hns_roce_query_pf_resource(hr_dev
);
2271 dev_err(hr_dev
->dev
, "Query pf resource fail, ret = %d.\n",
2276 ret
= hns_roce_query_pf_timer_resource(hr_dev
);
2278 dev_err(hr_dev
->dev
,
2279 "failed to query pf timer resource, ret = %d.\n", ret
);
2283 ret
= hns_roce_set_vf_switch_param(hr_dev
, 0);
2285 dev_err(hr_dev
->dev
,
2286 "failed to set function switch param, ret = %d.\n",
2291 hr_dev
->vendor_part_id
= hr_dev
->pci_dev
->device
;
2292 hr_dev
->sys_image_guid
= be64_to_cpu(hr_dev
->ib_dev
.node_guid
);
2294 caps
->pbl_ba_pg_sz
= HNS_ROCE_BA_PG_SZ_SUPPORTED_16K
;
2295 caps
->pbl_buf_pg_sz
= 0;
2296 caps
->pbl_hop_num
= HNS_ROCE_PBL_HOP_NUM
;
2297 caps
->eqe_ba_pg_sz
= 0;
2298 caps
->eqe_buf_pg_sz
= 0;
2299 caps
->eqe_hop_num
= HNS_ROCE_EQE_HOP_NUM
;
2300 caps
->tsq_buf_pg_sz
= 0;
2302 ret
= hns_roce_query_pf_caps(hr_dev
);
2304 set_default_caps(hr_dev
);
2306 ret
= hns_roce_alloc_vf_resource(hr_dev
);
2308 dev_err(hr_dev
->dev
, "Allocate vf resource fail, ret = %d.\n",
2313 ret
= hns_roce_v2_set_bt(hr_dev
);
2315 dev_err(hr_dev
->dev
,
2316 "Configure bt attribute fail, ret = %d.\n", ret
);
2320 /* Configure the size of QPC, SCCC, etc. */
2321 ret
= hns_roce_config_entry_size(hr_dev
);
2326 static int hns_roce_config_link_table(struct hns_roce_dev
*hr_dev
,
2327 enum hns_roce_link_table_type type
)
2329 struct hns_roce_cmq_desc desc
[2];
2330 struct hns_roce_cfg_llm_a
*req_a
=
2331 (struct hns_roce_cfg_llm_a
*)desc
[0].data
;
2332 struct hns_roce_cfg_llm_b
*req_b
=
2333 (struct hns_roce_cfg_llm_b
*)desc
[1].data
;
2334 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
2335 struct hns_roce_link_table
*link_tbl
;
2336 struct hns_roce_link_table_entry
*entry
;
2337 enum hns_roce_opcode_type opcode
;
2342 case TSQ_LINK_TABLE
:
2343 link_tbl
= &priv
->tsq
;
2344 opcode
= HNS_ROCE_OPC_CFG_EXT_LLM
;
2346 case TPQ_LINK_TABLE
:
2347 link_tbl
= &priv
->tpq
;
2348 opcode
= HNS_ROCE_OPC_CFG_TMOUT_LLM
;
2354 page_num
= link_tbl
->npages
;
2355 entry
= link_tbl
->table
.buf
;
2357 for (i
= 0; i
< 2; i
++) {
2358 hns_roce_cmq_setup_basic_desc(&desc
[i
], opcode
, false);
2361 desc
[i
].flag
|= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT
);
2363 desc
[i
].flag
&= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT
);
2366 req_a
->base_addr_l
= cpu_to_le32(link_tbl
->table
.map
& 0xffffffff);
2367 req_a
->base_addr_h
= cpu_to_le32(link_tbl
->table
.map
>> 32);
2368 roce_set_field(req_a
->depth_pgsz_init_en
, CFG_LLM_QUE_DEPTH_M
,
2369 CFG_LLM_QUE_DEPTH_S
, link_tbl
->npages
);
2370 roce_set_field(req_a
->depth_pgsz_init_en
, CFG_LLM_QUE_PGSZ_M
,
2371 CFG_LLM_QUE_PGSZ_S
, link_tbl
->pg_sz
);
2372 roce_set_field(req_a
->depth_pgsz_init_en
, CFG_LLM_INIT_EN_M
,
2373 CFG_LLM_INIT_EN_S
, 1);
2374 req_a
->head_ba_l
= cpu_to_le32(entry
[0].blk_ba0
);
2375 req_a
->head_ba_h_nxtptr
= cpu_to_le32(entry
[0].blk_ba1_nxt_ptr
);
2376 roce_set_field(req_a
->head_ptr
, CFG_LLM_HEAD_PTR_M
, CFG_LLM_HEAD_PTR_S
,
2379 req_b
->tail_ba_l
= cpu_to_le32(entry
[page_num
- 1].blk_ba0
);
2380 roce_set_field(req_b
->tail_ba_h
, CFG_LLM_TAIL_BA_H_M
,
2381 CFG_LLM_TAIL_BA_H_S
,
2382 entry
[page_num
- 1].blk_ba1_nxt_ptr
&
2383 HNS_ROCE_LINK_TABLE_BA1_M
);
2384 roce_set_field(req_b
->tail_ptr
, CFG_LLM_TAIL_PTR_M
, CFG_LLM_TAIL_PTR_S
,
2385 (entry
[page_num
- 2].blk_ba1_nxt_ptr
&
2386 HNS_ROCE_LINK_TABLE_NXT_PTR_M
) >>
2387 HNS_ROCE_LINK_TABLE_NXT_PTR_S
);
2389 return hns_roce_cmq_send(hr_dev
, desc
, 2);
2392 static int hns_roce_init_link_table(struct hns_roce_dev
*hr_dev
,
2393 enum hns_roce_link_table_type type
)
2395 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
2396 struct hns_roce_link_table
*link_tbl
;
2397 struct hns_roce_link_table_entry
*entry
;
2398 struct device
*dev
= hr_dev
->dev
;
2409 case TSQ_LINK_TABLE
:
2410 link_tbl
= &priv
->tsq
;
2411 buf_chk_sz
= 1 << (hr_dev
->caps
.tsq_buf_pg_sz
+ PAGE_SHIFT
);
2412 pg_num_a
= hr_dev
->caps
.num_qps
* 8 / buf_chk_sz
;
2413 pg_num_b
= hr_dev
->caps
.sl_num
* 4 + 2;
2415 case TPQ_LINK_TABLE
:
2416 link_tbl
= &priv
->tpq
;
2417 buf_chk_sz
= 1 << (hr_dev
->caps
.tpq_buf_pg_sz
+ PAGE_SHIFT
);
2418 pg_num_a
= hr_dev
->caps
.num_cqs
* 4 / buf_chk_sz
;
2419 pg_num_b
= 2 * 4 * func_num
+ 2;
2425 pg_num
= max(pg_num_a
, pg_num_b
);
2426 size
= pg_num
* sizeof(struct hns_roce_link_table_entry
);
2428 link_tbl
->table
.buf
= dma_alloc_coherent(dev
, size
,
2429 &link_tbl
->table
.map
,
2431 if (!link_tbl
->table
.buf
)
2434 link_tbl
->pg_list
= kcalloc(pg_num
, sizeof(*link_tbl
->pg_list
),
2436 if (!link_tbl
->pg_list
)
2437 goto err_kcalloc_failed
;
2439 entry
= link_tbl
->table
.buf
;
2440 for (i
= 0; i
< pg_num
; ++i
) {
2441 link_tbl
->pg_list
[i
].buf
= dma_alloc_coherent(dev
, buf_chk_sz
,
2443 if (!link_tbl
->pg_list
[i
].buf
)
2444 goto err_alloc_buf_failed
;
2446 link_tbl
->pg_list
[i
].map
= t
;
2448 entry
[i
].blk_ba0
= (u32
)(t
>> 12);
2449 entry
[i
].blk_ba1_nxt_ptr
= (u32
)(t
>> 44);
2451 if (i
< (pg_num
- 1))
2452 entry
[i
].blk_ba1_nxt_ptr
|=
2453 (i
+ 1) << HNS_ROCE_LINK_TABLE_NXT_PTR_S
;
2455 link_tbl
->npages
= pg_num
;
2456 link_tbl
->pg_sz
= buf_chk_sz
;
2458 return hns_roce_config_link_table(hr_dev
, type
);
2460 err_alloc_buf_failed
:
2461 for (i
-= 1; i
>= 0; i
--)
2462 dma_free_coherent(dev
, buf_chk_sz
,
2463 link_tbl
->pg_list
[i
].buf
,
2464 link_tbl
->pg_list
[i
].map
);
2465 kfree(link_tbl
->pg_list
);
2468 dma_free_coherent(dev
, size
, link_tbl
->table
.buf
,
2469 link_tbl
->table
.map
);
2475 static void hns_roce_free_link_table(struct hns_roce_dev
*hr_dev
,
2476 struct hns_roce_link_table
*link_tbl
)
2478 struct device
*dev
= hr_dev
->dev
;
2482 size
= link_tbl
->npages
* sizeof(struct hns_roce_link_table_entry
);
2484 for (i
= 0; i
< link_tbl
->npages
; ++i
)
2485 if (link_tbl
->pg_list
[i
].buf
)
2486 dma_free_coherent(dev
, link_tbl
->pg_sz
,
2487 link_tbl
->pg_list
[i
].buf
,
2488 link_tbl
->pg_list
[i
].map
);
2489 kfree(link_tbl
->pg_list
);
2491 dma_free_coherent(dev
, size
, link_tbl
->table
.buf
,
2492 link_tbl
->table
.map
);
2495 static int get_hem_table(struct hns_roce_dev
*hr_dev
)
2497 unsigned int qpc_count
;
2498 unsigned int cqc_count
;
2499 unsigned int gmv_count
;
2503 /* Alloc memory for QPC Timer buffer space chunk */
2504 for (qpc_count
= 0; qpc_count
< hr_dev
->caps
.qpc_timer_bt_num
;
2506 ret
= hns_roce_table_get(hr_dev
, &hr_dev
->qpc_timer_table
,
2509 dev_err(hr_dev
->dev
, "QPC Timer get failed\n");
2510 goto err_qpc_timer_failed
;
2514 /* Alloc memory for CQC Timer buffer space chunk */
2515 for (cqc_count
= 0; cqc_count
< hr_dev
->caps
.cqc_timer_bt_num
;
2517 ret
= hns_roce_table_get(hr_dev
, &hr_dev
->cqc_timer_table
,
2520 dev_err(hr_dev
->dev
, "CQC Timer get failed\n");
2521 goto err_cqc_timer_failed
;
2525 /* Alloc memory for GMV(GID/MAC/VLAN) table buffer space chunk */
2526 for (gmv_count
= 0; gmv_count
< hr_dev
->caps
.gmv_entry_num
;
2528 ret
= hns_roce_table_get(hr_dev
, &hr_dev
->gmv_table
, gmv_count
);
2530 dev_err(hr_dev
->dev
,
2531 "failed to get gmv table, ret = %d.\n", ret
);
2532 goto err_gmv_failed
;
2539 for (i
= 0; i
< gmv_count
; i
++)
2540 hns_roce_table_put(hr_dev
, &hr_dev
->gmv_table
, i
);
2542 err_cqc_timer_failed
:
2543 for (i
= 0; i
< cqc_count
; i
++)
2544 hns_roce_table_put(hr_dev
, &hr_dev
->cqc_timer_table
, i
);
2546 err_qpc_timer_failed
:
2547 for (i
= 0; i
< qpc_count
; i
++)
2548 hns_roce_table_put(hr_dev
, &hr_dev
->qpc_timer_table
, i
);
2553 static int hns_roce_v2_init(struct hns_roce_dev
*hr_dev
)
2555 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
2558 /* TSQ includes SQ doorbell and ack doorbell */
2559 ret
= hns_roce_init_link_table(hr_dev
, TSQ_LINK_TABLE
);
2561 dev_err(hr_dev
->dev
, "failed to init TSQ, ret = %d.\n", ret
);
2565 ret
= hns_roce_init_link_table(hr_dev
, TPQ_LINK_TABLE
);
2567 dev_err(hr_dev
->dev
, "failed to init TPQ, ret = %d.\n", ret
);
2568 goto err_tpq_init_failed
;
2571 ret
= get_hem_table(hr_dev
);
2573 goto err_get_hem_table_failed
;
2577 err_get_hem_table_failed
:
2578 hns_roce_free_link_table(hr_dev
, &priv
->tpq
);
2580 err_tpq_init_failed
:
2581 hns_roce_free_link_table(hr_dev
, &priv
->tsq
);
2586 static void hns_roce_v2_exit(struct hns_roce_dev
*hr_dev
)
2588 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
2590 hns_roce_function_clear(hr_dev
);
2592 hns_roce_free_link_table(hr_dev
, &priv
->tpq
);
2593 hns_roce_free_link_table(hr_dev
, &priv
->tsq
);
2596 static int hns_roce_query_mbox_status(struct hns_roce_dev
*hr_dev
)
2598 struct hns_roce_cmq_desc desc
;
2599 struct hns_roce_mbox_status
*mb_st
=
2600 (struct hns_roce_mbox_status
*)desc
.data
;
2603 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_QUERY_MB_ST
, true);
2605 status
= hns_roce_cmq_send(hr_dev
, &desc
, 1);
2609 return le32_to_cpu(mb_st
->mb_status_hw_run
);
2612 static int hns_roce_v2_cmd_pending(struct hns_roce_dev
*hr_dev
)
2614 u32 status
= hns_roce_query_mbox_status(hr_dev
);
2616 return status
>> HNS_ROCE_HW_RUN_BIT_SHIFT
;
2619 static int hns_roce_v2_cmd_complete(struct hns_roce_dev
*hr_dev
)
2621 u32 status
= hns_roce_query_mbox_status(hr_dev
);
2623 return status
& HNS_ROCE_HW_MB_STATUS_MASK
;
2626 static int hns_roce_mbox_post(struct hns_roce_dev
*hr_dev
, u64 in_param
,
2627 u64 out_param
, u32 in_modifier
, u8 op_modifier
,
2628 u16 op
, u16 token
, int event
)
2630 struct hns_roce_cmq_desc desc
;
2631 struct hns_roce_post_mbox
*mb
= (struct hns_roce_post_mbox
*)desc
.data
;
2633 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_POST_MB
, false);
2635 mb
->in_param_l
= cpu_to_le32(in_param
);
2636 mb
->in_param_h
= cpu_to_le32(in_param
>> 32);
2637 mb
->out_param_l
= cpu_to_le32(out_param
);
2638 mb
->out_param_h
= cpu_to_le32(out_param
>> 32);
2639 mb
->cmd_tag
= cpu_to_le32(in_modifier
<< 8 | op
);
2640 mb
->token_event_en
= cpu_to_le32(event
<< 16 | token
);
2642 return hns_roce_cmq_send(hr_dev
, &desc
, 1);
2645 static int hns_roce_v2_post_mbox(struct hns_roce_dev
*hr_dev
, u64 in_param
,
2646 u64 out_param
, u32 in_modifier
, u8 op_modifier
,
2647 u16 op
, u16 token
, int event
)
2649 struct device
*dev
= hr_dev
->dev
;
2653 end
= msecs_to_jiffies(HNS_ROCE_V2_GO_BIT_TIMEOUT_MSECS
) + jiffies
;
2654 while (hns_roce_v2_cmd_pending(hr_dev
)) {
2655 if (time_after(jiffies
, end
)) {
2656 dev_dbg(dev
, "jiffies=%d end=%d\n", (int)jiffies
,
2663 ret
= hns_roce_mbox_post(hr_dev
, in_param
, out_param
, in_modifier
,
2664 op_modifier
, op
, token
, event
);
2666 dev_err(dev
, "Post mailbox fail(%d)\n", ret
);
2671 static int hns_roce_v2_chk_mbox(struct hns_roce_dev
*hr_dev
,
2672 unsigned int timeout
)
2674 struct device
*dev
= hr_dev
->dev
;
2678 end
= msecs_to_jiffies(timeout
) + jiffies
;
2679 while (hns_roce_v2_cmd_pending(hr_dev
) && time_before(jiffies
, end
))
2682 if (hns_roce_v2_cmd_pending(hr_dev
)) {
2683 dev_err(dev
, "[cmd_poll]hw run cmd TIMEDOUT!\n");
2687 status
= hns_roce_v2_cmd_complete(hr_dev
);
2688 if (status
!= 0x1) {
2689 if (status
== CMD_RST_PRC_EBUSY
)
2692 dev_err(dev
, "mailbox status 0x%x!\n", status
);
2699 static void copy_gid(void *dest
, const union ib_gid
*gid
)
2702 const union ib_gid
*src
= gid
;
2703 __le32 (*p
)[GID_SIZE
] = dest
;
2709 for (i
= 0; i
< GID_SIZE
; i
++)
2710 (*p
)[i
] = cpu_to_le32(*(u32
*)&src
->raw
[i
* sizeof(u32
)]);
2713 static int config_sgid_table(struct hns_roce_dev
*hr_dev
,
2714 int gid_index
, const union ib_gid
*gid
,
2715 enum hns_roce_sgid_type sgid_type
)
2717 struct hns_roce_cmq_desc desc
;
2718 struct hns_roce_cfg_sgid_tb
*sgid_tb
=
2719 (struct hns_roce_cfg_sgid_tb
*)desc
.data
;
2721 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_CFG_SGID_TB
, false);
2723 roce_set_field(sgid_tb
->table_idx_rsv
, CFG_SGID_TB_TABLE_IDX_M
,
2724 CFG_SGID_TB_TABLE_IDX_S
, gid_index
);
2725 roce_set_field(sgid_tb
->vf_sgid_type_rsv
, CFG_SGID_TB_VF_SGID_TYPE_M
,
2726 CFG_SGID_TB_VF_SGID_TYPE_S
, sgid_type
);
2728 copy_gid(&sgid_tb
->vf_sgid_l
, gid
);
2730 return hns_roce_cmq_send(hr_dev
, &desc
, 1);
2733 static int config_gmv_table(struct hns_roce_dev
*hr_dev
,
2734 int gid_index
, const union ib_gid
*gid
,
2735 enum hns_roce_sgid_type sgid_type
,
2736 const struct ib_gid_attr
*attr
)
2738 struct hns_roce_cmq_desc desc
[2];
2739 struct hns_roce_cfg_gmv_tb_a
*tb_a
=
2740 (struct hns_roce_cfg_gmv_tb_a
*)desc
[0].data
;
2741 struct hns_roce_cfg_gmv_tb_b
*tb_b
=
2742 (struct hns_roce_cfg_gmv_tb_b
*)desc
[1].data
;
2744 u16 vlan_id
= VLAN_CFI_MASK
;
2745 u8 mac
[ETH_ALEN
] = {};
2749 ret
= rdma_read_gid_l2_fields(attr
, &vlan_id
, mac
);
2754 hns_roce_cmq_setup_basic_desc(&desc
[0], HNS_ROCE_OPC_CFG_GMV_TBL
, false);
2755 desc
[0].flag
|= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT
);
2757 hns_roce_cmq_setup_basic_desc(&desc
[1], HNS_ROCE_OPC_CFG_GMV_TBL
, false);
2759 copy_gid(&tb_a
->vf_sgid_l
, gid
);
2761 roce_set_field(tb_a
->vf_sgid_type_vlan
, CFG_GMV_TB_VF_SGID_TYPE_M
,
2762 CFG_GMV_TB_VF_SGID_TYPE_S
, sgid_type
);
2763 roce_set_bit(tb_a
->vf_sgid_type_vlan
, CFG_GMV_TB_VF_VLAN_EN_S
,
2764 vlan_id
< VLAN_CFI_MASK
);
2765 roce_set_field(tb_a
->vf_sgid_type_vlan
, CFG_GMV_TB_VF_VLAN_ID_M
,
2766 CFG_GMV_TB_VF_VLAN_ID_S
, vlan_id
);
2768 tb_b
->vf_smac_l
= cpu_to_le32(*(u32
*)mac
);
2769 roce_set_field(tb_b
->vf_smac_h
, CFG_GMV_TB_SMAC_H_M
,
2770 CFG_GMV_TB_SMAC_H_S
, *(u16
*)&mac
[4]);
2772 roce_set_field(tb_b
->table_idx_rsv
, CFG_GMV_TB_SGID_IDX_M
,
2773 CFG_GMV_TB_SGID_IDX_S
, gid_index
);
2775 return hns_roce_cmq_send(hr_dev
, desc
, 2);
2778 static int hns_roce_v2_set_gid(struct hns_roce_dev
*hr_dev
, u8 port
,
2779 int gid_index
, const union ib_gid
*gid
,
2780 const struct ib_gid_attr
*attr
)
2782 enum hns_roce_sgid_type sgid_type
= GID_TYPE_FLAG_ROCE_V1
;
2786 if (attr
->gid_type
== IB_GID_TYPE_ROCE_UDP_ENCAP
) {
2787 if (ipv6_addr_v4mapped((void *)gid
))
2788 sgid_type
= GID_TYPE_FLAG_ROCE_V2_IPV4
;
2790 sgid_type
= GID_TYPE_FLAG_ROCE_V2_IPV6
;
2791 } else if (attr
->gid_type
== IB_GID_TYPE_ROCE
) {
2792 sgid_type
= GID_TYPE_FLAG_ROCE_V1
;
2796 if (hr_dev
->pci_dev
->revision
>= PCI_REVISION_ID_HIP09
)
2797 ret
= config_gmv_table(hr_dev
, gid_index
, gid
, sgid_type
, attr
);
2799 ret
= config_sgid_table(hr_dev
, gid_index
, gid
, sgid_type
);
2802 ibdev_err(&hr_dev
->ib_dev
, "failed to set gid, ret = %d!\n",
2808 static int hns_roce_v2_set_mac(struct hns_roce_dev
*hr_dev
, u8 phy_port
,
2811 struct hns_roce_cmq_desc desc
;
2812 struct hns_roce_cfg_smac_tb
*smac_tb
=
2813 (struct hns_roce_cfg_smac_tb
*)desc
.data
;
2817 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_CFG_SMAC_TB
, false);
2819 reg_smac_l
= *(u32
*)(&addr
[0]);
2820 reg_smac_h
= *(u16
*)(&addr
[4]);
2822 roce_set_field(smac_tb
->tb_idx_rsv
, CFG_SMAC_TB_IDX_M
,
2823 CFG_SMAC_TB_IDX_S
, phy_port
);
2824 roce_set_field(smac_tb
->vf_smac_h_rsv
, CFG_SMAC_TB_VF_SMAC_H_M
,
2825 CFG_SMAC_TB_VF_SMAC_H_S
, reg_smac_h
);
2826 smac_tb
->vf_smac_l
= cpu_to_le32(reg_smac_l
);
2828 return hns_roce_cmq_send(hr_dev
, &desc
, 1);
2831 static int set_mtpt_pbl(struct hns_roce_dev
*hr_dev
,
2832 struct hns_roce_v2_mpt_entry
*mpt_entry
,
2833 struct hns_roce_mr
*mr
)
2835 u64 pages
[HNS_ROCE_V2_MAX_INNER_MTPT_NUM
] = { 0 };
2836 struct ib_device
*ibdev
= &hr_dev
->ib_dev
;
2840 count
= hns_roce_mtr_find(hr_dev
, &mr
->pbl_mtr
, 0, pages
,
2841 ARRAY_SIZE(pages
), &pbl_ba
);
2843 ibdev_err(ibdev
, "failed to find PBL mtr, count = %d.\n",
2848 /* Aligned to the hardware address access unit */
2849 for (i
= 0; i
< count
; i
++)
2852 mpt_entry
->pbl_size
= cpu_to_le32(mr
->npages
);
2853 mpt_entry
->pbl_ba_l
= cpu_to_le32(pbl_ba
>> 3);
2854 roce_set_field(mpt_entry
->byte_48_mode_ba
,
2855 V2_MPT_BYTE_48_PBL_BA_H_M
, V2_MPT_BYTE_48_PBL_BA_H_S
,
2856 upper_32_bits(pbl_ba
>> 3));
2858 mpt_entry
->pa0_l
= cpu_to_le32(lower_32_bits(pages
[0]));
2859 roce_set_field(mpt_entry
->byte_56_pa0_h
, V2_MPT_BYTE_56_PA0_H_M
,
2860 V2_MPT_BYTE_56_PA0_H_S
, upper_32_bits(pages
[0]));
2862 mpt_entry
->pa1_l
= cpu_to_le32(lower_32_bits(pages
[1]));
2863 roce_set_field(mpt_entry
->byte_64_buf_pa1
, V2_MPT_BYTE_64_PA1_H_M
,
2864 V2_MPT_BYTE_64_PA1_H_S
, upper_32_bits(pages
[1]));
2865 roce_set_field(mpt_entry
->byte_64_buf_pa1
,
2866 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M
,
2867 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S
,
2868 to_hr_hw_page_shift(mr
->pbl_mtr
.hem_cfg
.buf_pg_shift
));
2873 static int hns_roce_v2_write_mtpt(struct hns_roce_dev
*hr_dev
,
2874 void *mb_buf
, struct hns_roce_mr
*mr
,
2875 unsigned long mtpt_idx
)
2877 struct hns_roce_v2_mpt_entry
*mpt_entry
;
2881 memset(mpt_entry
, 0, sizeof(*mpt_entry
));
2883 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_MPT_ST_M
,
2884 V2_MPT_BYTE_4_MPT_ST_S
, V2_MPT_ST_VALID
);
2885 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_PBL_HOP_NUM_M
,
2886 V2_MPT_BYTE_4_PBL_HOP_NUM_S
, mr
->pbl_hop_num
==
2887 HNS_ROCE_HOP_NUM_0
? 0 : mr
->pbl_hop_num
);
2888 roce_set_field(mpt_entry
->byte_4_pd_hop_st
,
2889 V2_MPT_BYTE_4_PBL_BA_PG_SZ_M
,
2890 V2_MPT_BYTE_4_PBL_BA_PG_SZ_S
,
2891 to_hr_hw_page_shift(mr
->pbl_mtr
.hem_cfg
.ba_pg_shift
));
2892 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_PD_M
,
2893 V2_MPT_BYTE_4_PD_S
, mr
->pd
);
2895 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_RA_EN_S
, 0);
2896 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_R_INV_EN_S
, 0);
2897 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_L_INV_EN_S
, 1);
2898 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_BIND_EN_S
,
2899 (mr
->access
& IB_ACCESS_MW_BIND
? 1 : 0));
2900 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_ATOMIC_EN_S
,
2901 mr
->access
& IB_ACCESS_REMOTE_ATOMIC
? 1 : 0);
2902 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_RR_EN_S
,
2903 (mr
->access
& IB_ACCESS_REMOTE_READ
? 1 : 0));
2904 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_RW_EN_S
,
2905 (mr
->access
& IB_ACCESS_REMOTE_WRITE
? 1 : 0));
2906 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_LW_EN_S
,
2907 (mr
->access
& IB_ACCESS_LOCAL_WRITE
? 1 : 0));
2909 roce_set_bit(mpt_entry
->byte_12_mw_pa
, V2_MPT_BYTE_12_PA_S
,
2910 mr
->type
== MR_TYPE_MR
? 0 : 1);
2911 roce_set_bit(mpt_entry
->byte_12_mw_pa
, V2_MPT_BYTE_12_INNER_PA_VLD_S
,
2914 mpt_entry
->len_l
= cpu_to_le32(lower_32_bits(mr
->size
));
2915 mpt_entry
->len_h
= cpu_to_le32(upper_32_bits(mr
->size
));
2916 mpt_entry
->lkey
= cpu_to_le32(mr
->key
);
2917 mpt_entry
->va_l
= cpu_to_le32(lower_32_bits(mr
->iova
));
2918 mpt_entry
->va_h
= cpu_to_le32(upper_32_bits(mr
->iova
));
2920 if (mr
->type
== MR_TYPE_DMA
)
2923 ret
= set_mtpt_pbl(hr_dev
, mpt_entry
, mr
);
2928 static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev
*hr_dev
,
2929 struct hns_roce_mr
*mr
, int flags
,
2930 u32 pdn
, int mr_access_flags
, u64 iova
,
2931 u64 size
, void *mb_buf
)
2933 struct hns_roce_v2_mpt_entry
*mpt_entry
= mb_buf
;
2936 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_MPT_ST_M
,
2937 V2_MPT_BYTE_4_MPT_ST_S
, V2_MPT_ST_VALID
);
2939 if (flags
& IB_MR_REREG_PD
) {
2940 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_PD_M
,
2941 V2_MPT_BYTE_4_PD_S
, pdn
);
2945 if (flags
& IB_MR_REREG_ACCESS
) {
2946 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
,
2947 V2_MPT_BYTE_8_BIND_EN_S
,
2948 (mr_access_flags
& IB_ACCESS_MW_BIND
? 1 : 0));
2949 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
,
2950 V2_MPT_BYTE_8_ATOMIC_EN_S
,
2951 mr_access_flags
& IB_ACCESS_REMOTE_ATOMIC
? 1 : 0);
2952 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_RR_EN_S
,
2953 mr_access_flags
& IB_ACCESS_REMOTE_READ
? 1 : 0);
2954 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_RW_EN_S
,
2955 mr_access_flags
& IB_ACCESS_REMOTE_WRITE
? 1 : 0);
2956 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_LW_EN_S
,
2957 mr_access_flags
& IB_ACCESS_LOCAL_WRITE
? 1 : 0);
2960 if (flags
& IB_MR_REREG_TRANS
) {
2961 mpt_entry
->va_l
= cpu_to_le32(lower_32_bits(iova
));
2962 mpt_entry
->va_h
= cpu_to_le32(upper_32_bits(iova
));
2963 mpt_entry
->len_l
= cpu_to_le32(lower_32_bits(size
));
2964 mpt_entry
->len_h
= cpu_to_le32(upper_32_bits(size
));
2969 ret
= set_mtpt_pbl(hr_dev
, mpt_entry
, mr
);
2975 static int hns_roce_v2_frmr_write_mtpt(struct hns_roce_dev
*hr_dev
,
2976 void *mb_buf
, struct hns_roce_mr
*mr
)
2978 struct ib_device
*ibdev
= &hr_dev
->ib_dev
;
2979 struct hns_roce_v2_mpt_entry
*mpt_entry
;
2980 dma_addr_t pbl_ba
= 0;
2983 memset(mpt_entry
, 0, sizeof(*mpt_entry
));
2985 if (hns_roce_mtr_find(hr_dev
, &mr
->pbl_mtr
, 0, NULL
, 0, &pbl_ba
) < 0) {
2986 ibdev_err(ibdev
, "failed to find frmr mtr.\n");
2990 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_MPT_ST_M
,
2991 V2_MPT_BYTE_4_MPT_ST_S
, V2_MPT_ST_FREE
);
2992 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_PBL_HOP_NUM_M
,
2993 V2_MPT_BYTE_4_PBL_HOP_NUM_S
, 1);
2994 roce_set_field(mpt_entry
->byte_4_pd_hop_st
,
2995 V2_MPT_BYTE_4_PBL_BA_PG_SZ_M
,
2996 V2_MPT_BYTE_4_PBL_BA_PG_SZ_S
,
2997 to_hr_hw_page_shift(mr
->pbl_mtr
.hem_cfg
.ba_pg_shift
));
2998 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_PD_M
,
2999 V2_MPT_BYTE_4_PD_S
, mr
->pd
);
3001 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_RA_EN_S
, 1);
3002 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_R_INV_EN_S
, 1);
3003 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_L_INV_EN_S
, 1);
3005 roce_set_bit(mpt_entry
->byte_12_mw_pa
, V2_MPT_BYTE_12_FRE_S
, 1);
3006 roce_set_bit(mpt_entry
->byte_12_mw_pa
, V2_MPT_BYTE_12_PA_S
, 0);
3007 roce_set_bit(mpt_entry
->byte_12_mw_pa
, V2_MPT_BYTE_12_MR_MW_S
, 0);
3008 roce_set_bit(mpt_entry
->byte_12_mw_pa
, V2_MPT_BYTE_12_BPD_S
, 1);
3010 mpt_entry
->pbl_size
= cpu_to_le32(mr
->npages
);
3012 mpt_entry
->pbl_ba_l
= cpu_to_le32(lower_32_bits(pbl_ba
>> 3));
3013 roce_set_field(mpt_entry
->byte_48_mode_ba
, V2_MPT_BYTE_48_PBL_BA_H_M
,
3014 V2_MPT_BYTE_48_PBL_BA_H_S
,
3015 upper_32_bits(pbl_ba
>> 3));
3017 roce_set_field(mpt_entry
->byte_64_buf_pa1
,
3018 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M
,
3019 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S
,
3020 to_hr_hw_page_shift(mr
->pbl_mtr
.hem_cfg
.buf_pg_shift
));
3025 static int hns_roce_v2_mw_write_mtpt(void *mb_buf
, struct hns_roce_mw
*mw
)
3027 struct hns_roce_v2_mpt_entry
*mpt_entry
;
3030 memset(mpt_entry
, 0, sizeof(*mpt_entry
));
3032 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_MPT_ST_M
,
3033 V2_MPT_BYTE_4_MPT_ST_S
, V2_MPT_ST_FREE
);
3034 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_PD_M
,
3035 V2_MPT_BYTE_4_PD_S
, mw
->pdn
);
3036 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_PBL_HOP_NUM_M
,
3037 V2_MPT_BYTE_4_PBL_HOP_NUM_S
,
3038 mw
->pbl_hop_num
== HNS_ROCE_HOP_NUM_0
? 0 :
3040 roce_set_field(mpt_entry
->byte_4_pd_hop_st
,
3041 V2_MPT_BYTE_4_PBL_BA_PG_SZ_M
,
3042 V2_MPT_BYTE_4_PBL_BA_PG_SZ_S
,
3043 mw
->pbl_ba_pg_sz
+ PG_SHIFT_OFFSET
);
3045 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_R_INV_EN_S
, 1);
3046 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_L_INV_EN_S
, 1);
3047 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_LW_EN_S
, 1);
3049 roce_set_bit(mpt_entry
->byte_12_mw_pa
, V2_MPT_BYTE_12_PA_S
, 0);
3050 roce_set_bit(mpt_entry
->byte_12_mw_pa
, V2_MPT_BYTE_12_MR_MW_S
, 1);
3051 roce_set_bit(mpt_entry
->byte_12_mw_pa
, V2_MPT_BYTE_12_BPD_S
, 1);
3052 roce_set_bit(mpt_entry
->byte_12_mw_pa
, V2_MPT_BYTE_12_BQP_S
,
3053 mw
->ibmw
.type
== IB_MW_TYPE_1
? 0 : 1);
3055 roce_set_field(mpt_entry
->byte_64_buf_pa1
,
3056 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M
,
3057 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S
,
3058 mw
->pbl_buf_pg_sz
+ PG_SHIFT_OFFSET
);
3060 mpt_entry
->lkey
= cpu_to_le32(mw
->rkey
);
3065 static void *get_cqe_v2(struct hns_roce_cq
*hr_cq
, int n
)
3067 return hns_roce_buf_offset(hr_cq
->mtr
.kmem
, n
* hr_cq
->cqe_size
);
3070 static void *get_sw_cqe_v2(struct hns_roce_cq
*hr_cq
, unsigned int n
)
3072 struct hns_roce_v2_cqe
*cqe
= get_cqe_v2(hr_cq
, n
& hr_cq
->ib_cq
.cqe
);
3074 /* Get cqe when Owner bit is Conversely with the MSB of cons_idx */
3075 return (roce_get_bit(cqe
->byte_4
, V2_CQE_BYTE_4_OWNER_S
) ^
3076 !!(n
& hr_cq
->cq_depth
)) ? cqe
: NULL
;
3079 static inline void hns_roce_v2_cq_set_ci(struct hns_roce_cq
*hr_cq
, u32 ci
)
3081 *hr_cq
->set_ci_db
= ci
& V2_CQ_DB_PARAMETER_CONS_IDX_M
;
3084 static void __hns_roce_v2_cq_clean(struct hns_roce_cq
*hr_cq
, u32 qpn
,
3085 struct hns_roce_srq
*srq
)
3087 struct hns_roce_v2_cqe
*cqe
, *dest
;
3093 for (prod_index
= hr_cq
->cons_index
; get_sw_cqe_v2(hr_cq
, prod_index
);
3095 if (prod_index
> hr_cq
->cons_index
+ hr_cq
->ib_cq
.cqe
)
3100 * Now backwards through the CQ, removing CQ entries
3101 * that match our QP by overwriting them with next entries.
3103 while ((int) --prod_index
- (int) hr_cq
->cons_index
>= 0) {
3104 cqe
= get_cqe_v2(hr_cq
, prod_index
& hr_cq
->ib_cq
.cqe
);
3105 if ((roce_get_field(cqe
->byte_16
, V2_CQE_BYTE_16_LCL_QPN_M
,
3106 V2_CQE_BYTE_16_LCL_QPN_S
) &
3107 HNS_ROCE_V2_CQE_QPN_MASK
) == qpn
) {
3109 roce_get_bit(cqe
->byte_4
, V2_CQE_BYTE_4_S_R_S
)) {
3110 wqe_index
= roce_get_field(cqe
->byte_4
,
3111 V2_CQE_BYTE_4_WQE_INDX_M
,
3112 V2_CQE_BYTE_4_WQE_INDX_S
);
3113 hns_roce_free_srq_wqe(srq
, wqe_index
);
3116 } else if (nfreed
) {
3117 dest
= get_cqe_v2(hr_cq
, (prod_index
+ nfreed
) &
3119 owner_bit
= roce_get_bit(dest
->byte_4
,
3120 V2_CQE_BYTE_4_OWNER_S
);
3121 memcpy(dest
, cqe
, sizeof(*cqe
));
3122 roce_set_bit(dest
->byte_4
, V2_CQE_BYTE_4_OWNER_S
,
3128 hr_cq
->cons_index
+= nfreed
;
3130 * Make sure update of buffer contents is done before
3131 * updating consumer index.
3134 hns_roce_v2_cq_set_ci(hr_cq
, hr_cq
->cons_index
);
3138 static void hns_roce_v2_cq_clean(struct hns_roce_cq
*hr_cq
, u32 qpn
,
3139 struct hns_roce_srq
*srq
)
3141 spin_lock_irq(&hr_cq
->lock
);
3142 __hns_roce_v2_cq_clean(hr_cq
, qpn
, srq
);
3143 spin_unlock_irq(&hr_cq
->lock
);
3146 static void hns_roce_v2_write_cqc(struct hns_roce_dev
*hr_dev
,
3147 struct hns_roce_cq
*hr_cq
, void *mb_buf
,
3148 u64
*mtts
, dma_addr_t dma_handle
)
3150 struct hns_roce_v2_cq_context
*cq_context
;
3152 cq_context
= mb_buf
;
3153 memset(cq_context
, 0, sizeof(*cq_context
));
3155 roce_set_field(cq_context
->byte_4_pg_ceqn
, V2_CQC_BYTE_4_CQ_ST_M
,
3156 V2_CQC_BYTE_4_CQ_ST_S
, V2_CQ_STATE_VALID
);
3157 roce_set_field(cq_context
->byte_4_pg_ceqn
, V2_CQC_BYTE_4_ARM_ST_M
,
3158 V2_CQC_BYTE_4_ARM_ST_S
, REG_NXT_CEQE
);
3159 roce_set_field(cq_context
->byte_4_pg_ceqn
, V2_CQC_BYTE_4_SHIFT_M
,
3160 V2_CQC_BYTE_4_SHIFT_S
, ilog2(hr_cq
->cq_depth
));
3161 roce_set_field(cq_context
->byte_4_pg_ceqn
, V2_CQC_BYTE_4_CEQN_M
,
3162 V2_CQC_BYTE_4_CEQN_S
, hr_cq
->vector
);
3164 roce_set_field(cq_context
->byte_8_cqn
, V2_CQC_BYTE_8_CQN_M
,
3165 V2_CQC_BYTE_8_CQN_S
, hr_cq
->cqn
);
3167 roce_set_field(cq_context
->byte_8_cqn
, V2_CQC_BYTE_8_CQE_SIZE_M
,
3168 V2_CQC_BYTE_8_CQE_SIZE_S
, hr_cq
->cqe_size
==
3169 HNS_ROCE_V3_CQE_SIZE
? 1 : 0);
3171 if (hr_dev
->caps
.flags
& HNS_ROCE_CAP_FLAG_STASH
)
3172 hr_reg_enable(cq_context
, CQC_STASH
);
3174 cq_context
->cqe_cur_blk_addr
= cpu_to_le32(to_hr_hw_page_addr(mtts
[0]));
3176 roce_set_field(cq_context
->byte_16_hop_addr
,
3177 V2_CQC_BYTE_16_CQE_CUR_BLK_ADDR_M
,
3178 V2_CQC_BYTE_16_CQE_CUR_BLK_ADDR_S
,
3179 upper_32_bits(to_hr_hw_page_addr(mtts
[0])));
3180 roce_set_field(cq_context
->byte_16_hop_addr
,
3181 V2_CQC_BYTE_16_CQE_HOP_NUM_M
,
3182 V2_CQC_BYTE_16_CQE_HOP_NUM_S
, hr_dev
->caps
.cqe_hop_num
==
3183 HNS_ROCE_HOP_NUM_0
? 0 : hr_dev
->caps
.cqe_hop_num
);
3185 cq_context
->cqe_nxt_blk_addr
= cpu_to_le32(to_hr_hw_page_addr(mtts
[1]));
3186 roce_set_field(cq_context
->byte_24_pgsz_addr
,
3187 V2_CQC_BYTE_24_CQE_NXT_BLK_ADDR_M
,
3188 V2_CQC_BYTE_24_CQE_NXT_BLK_ADDR_S
,
3189 upper_32_bits(to_hr_hw_page_addr(mtts
[1])));
3190 roce_set_field(cq_context
->byte_24_pgsz_addr
,
3191 V2_CQC_BYTE_24_CQE_BA_PG_SZ_M
,
3192 V2_CQC_BYTE_24_CQE_BA_PG_SZ_S
,
3193 to_hr_hw_page_shift(hr_cq
->mtr
.hem_cfg
.ba_pg_shift
));
3194 roce_set_field(cq_context
->byte_24_pgsz_addr
,
3195 V2_CQC_BYTE_24_CQE_BUF_PG_SZ_M
,
3196 V2_CQC_BYTE_24_CQE_BUF_PG_SZ_S
,
3197 to_hr_hw_page_shift(hr_cq
->mtr
.hem_cfg
.buf_pg_shift
));
3199 cq_context
->cqe_ba
= cpu_to_le32(dma_handle
>> 3);
3201 roce_set_field(cq_context
->byte_40_cqe_ba
, V2_CQC_BYTE_40_CQE_BA_M
,
3202 V2_CQC_BYTE_40_CQE_BA_S
, (dma_handle
>> (32 + 3)));
3204 roce_set_bit(cq_context
->byte_44_db_record
,
3205 V2_CQC_BYTE_44_DB_RECORD_EN_S
,
3206 (hr_cq
->flags
& HNS_ROCE_CQ_FLAG_RECORD_DB
) ? 1 : 0);
3208 roce_set_field(cq_context
->byte_44_db_record
,
3209 V2_CQC_BYTE_44_DB_RECORD_ADDR_M
,
3210 V2_CQC_BYTE_44_DB_RECORD_ADDR_S
,
3211 ((u32
)hr_cq
->db
.dma
) >> 1);
3212 cq_context
->db_record_addr
= cpu_to_le32(hr_cq
->db
.dma
>> 32);
3214 roce_set_field(cq_context
->byte_56_cqe_period_maxcnt
,
3215 V2_CQC_BYTE_56_CQ_MAX_CNT_M
,
3216 V2_CQC_BYTE_56_CQ_MAX_CNT_S
,
3217 HNS_ROCE_V2_CQ_DEFAULT_BURST_NUM
);
3218 roce_set_field(cq_context
->byte_56_cqe_period_maxcnt
,
3219 V2_CQC_BYTE_56_CQ_PERIOD_M
,
3220 V2_CQC_BYTE_56_CQ_PERIOD_S
,
3221 HNS_ROCE_V2_CQ_DEFAULT_INTERVAL
);
3224 static int hns_roce_v2_req_notify_cq(struct ib_cq
*ibcq
,
3225 enum ib_cq_notify_flags flags
)
3227 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibcq
->device
);
3228 struct hns_roce_cq
*hr_cq
= to_hr_cq(ibcq
);
3229 u32 notification_flag
;
3235 notification_flag
= (flags
& IB_CQ_SOLICITED_MASK
) == IB_CQ_SOLICITED
?
3236 V2_CQ_DB_REQ_NOT
: V2_CQ_DB_REQ_NOT_SOL
;
3238 * flags = 0; Notification Flag = 1, next
3239 * flags = 1; Notification Flag = 0, solocited
3241 roce_set_field(doorbell
[0], V2_CQ_DB_BYTE_4_TAG_M
, V2_DB_BYTE_4_TAG_S
,
3243 roce_set_field(doorbell
[0], V2_CQ_DB_BYTE_4_CMD_M
, V2_DB_BYTE_4_CMD_S
,
3244 HNS_ROCE_V2_CQ_DB_NTR
);
3245 roce_set_field(doorbell
[1], V2_CQ_DB_PARAMETER_CONS_IDX_M
,
3246 V2_CQ_DB_PARAMETER_CONS_IDX_S
, hr_cq
->cons_index
);
3247 roce_set_field(doorbell
[1], V2_CQ_DB_PARAMETER_CMD_SN_M
,
3248 V2_CQ_DB_PARAMETER_CMD_SN_S
, hr_cq
->arm_sn
& 0x3);
3249 roce_set_bit(doorbell
[1], V2_CQ_DB_PARAMETER_NOTIFY_S
,
3252 hns_roce_write64(hr_dev
, doorbell
, hr_cq
->cq_db_l
);
3257 static int hns_roce_handle_recv_inl_wqe(struct hns_roce_v2_cqe
*cqe
,
3258 struct hns_roce_qp
**cur_qp
,
3261 struct hns_roce_rinl_sge
*sge_list
;
3262 u32 wr_num
, wr_cnt
, sge_num
;
3263 u32 sge_cnt
, data_len
, size
;
3266 wr_num
= roce_get_field(cqe
->byte_4
, V2_CQE_BYTE_4_WQE_INDX_M
,
3267 V2_CQE_BYTE_4_WQE_INDX_S
) & 0xffff;
3268 wr_cnt
= wr_num
& ((*cur_qp
)->rq
.wqe_cnt
- 1);
3270 sge_list
= (*cur_qp
)->rq_inl_buf
.wqe_list
[wr_cnt
].sg_list
;
3271 sge_num
= (*cur_qp
)->rq_inl_buf
.wqe_list
[wr_cnt
].sge_cnt
;
3272 wqe_buf
= hns_roce_get_recv_wqe(*cur_qp
, wr_cnt
);
3273 data_len
= wc
->byte_len
;
3275 for (sge_cnt
= 0; (sge_cnt
< sge_num
) && (data_len
); sge_cnt
++) {
3276 size
= min(sge_list
[sge_cnt
].len
, data_len
);
3277 memcpy((void *)sge_list
[sge_cnt
].addr
, wqe_buf
, size
);
3283 if (unlikely(data_len
)) {
3284 wc
->status
= IB_WC_LOC_LEN_ERR
;
3291 static int sw_comp(struct hns_roce_qp
*hr_qp
, struct hns_roce_wq
*wq
,
3292 int num_entries
, struct ib_wc
*wc
)
3297 left
= wq
->head
- wq
->tail
;
3301 left
= min_t(unsigned int, (unsigned int)num_entries
, left
);
3302 while (npolled
< left
) {
3303 wc
->wr_id
= wq
->wrid
[wq
->tail
& (wq
->wqe_cnt
- 1)];
3304 wc
->status
= IB_WC_WR_FLUSH_ERR
;
3306 wc
->qp
= &hr_qp
->ibqp
;
3316 static int hns_roce_v2_sw_poll_cq(struct hns_roce_cq
*hr_cq
, int num_entries
,
3319 struct hns_roce_qp
*hr_qp
;
3322 list_for_each_entry(hr_qp
, &hr_cq
->sq_list
, sq_node
) {
3323 npolled
+= sw_comp(hr_qp
, &hr_qp
->sq
,
3324 num_entries
- npolled
, wc
+ npolled
);
3325 if (npolled
>= num_entries
)
3329 list_for_each_entry(hr_qp
, &hr_cq
->rq_list
, rq_node
) {
3330 npolled
+= sw_comp(hr_qp
, &hr_qp
->rq
,
3331 num_entries
- npolled
, wc
+ npolled
);
3332 if (npolled
>= num_entries
)
3340 static void get_cqe_status(struct hns_roce_dev
*hr_dev
, struct hns_roce_qp
*qp
,
3341 struct hns_roce_cq
*cq
, struct hns_roce_v2_cqe
*cqe
,
3344 static const struct {
3346 enum ib_wc_status wc_status
;
3348 { HNS_ROCE_CQE_V2_SUCCESS
, IB_WC_SUCCESS
},
3349 { HNS_ROCE_CQE_V2_LOCAL_LENGTH_ERR
, IB_WC_LOC_LEN_ERR
},
3350 { HNS_ROCE_CQE_V2_LOCAL_QP_OP_ERR
, IB_WC_LOC_QP_OP_ERR
},
3351 { HNS_ROCE_CQE_V2_LOCAL_PROT_ERR
, IB_WC_LOC_PROT_ERR
},
3352 { HNS_ROCE_CQE_V2_WR_FLUSH_ERR
, IB_WC_WR_FLUSH_ERR
},
3353 { HNS_ROCE_CQE_V2_MW_BIND_ERR
, IB_WC_MW_BIND_ERR
},
3354 { HNS_ROCE_CQE_V2_BAD_RESP_ERR
, IB_WC_BAD_RESP_ERR
},
3355 { HNS_ROCE_CQE_V2_LOCAL_ACCESS_ERR
, IB_WC_LOC_ACCESS_ERR
},
3356 { HNS_ROCE_CQE_V2_REMOTE_INVAL_REQ_ERR
, IB_WC_REM_INV_REQ_ERR
},
3357 { HNS_ROCE_CQE_V2_REMOTE_ACCESS_ERR
, IB_WC_REM_ACCESS_ERR
},
3358 { HNS_ROCE_CQE_V2_REMOTE_OP_ERR
, IB_WC_REM_OP_ERR
},
3359 { HNS_ROCE_CQE_V2_TRANSPORT_RETRY_EXC_ERR
,
3360 IB_WC_RETRY_EXC_ERR
},
3361 { HNS_ROCE_CQE_V2_RNR_RETRY_EXC_ERR
, IB_WC_RNR_RETRY_EXC_ERR
},
3362 { HNS_ROCE_CQE_V2_REMOTE_ABORT_ERR
, IB_WC_REM_ABORT_ERR
},
3363 { HNS_ROCE_CQE_V2_GENERAL_ERR
, IB_WC_GENERAL_ERR
}
3366 u32 cqe_status
= roce_get_field(cqe
->byte_4
, V2_CQE_BYTE_4_STATUS_M
,
3367 V2_CQE_BYTE_4_STATUS_S
);
3370 wc
->status
= IB_WC_GENERAL_ERR
;
3371 for (i
= 0; i
< ARRAY_SIZE(map
); i
++)
3372 if (cqe_status
== map
[i
].cqe_status
) {
3373 wc
->status
= map
[i
].wc_status
;
3377 if (likely(wc
->status
== IB_WC_SUCCESS
||
3378 wc
->status
== IB_WC_WR_FLUSH_ERR
))
3381 ibdev_err(&hr_dev
->ib_dev
, "error cqe status 0x%x:\n", cqe_status
);
3382 print_hex_dump(KERN_ERR
, "", DUMP_PREFIX_NONE
, 16, 4, cqe
,
3383 cq
->cqe_size
, false);
3386 * For hns ROCEE, GENERAL_ERR is an error type that is not defined in
3387 * the standard protocol, the driver must ignore it and needn't to set
3388 * the QP to an error state.
3390 if (cqe_status
== HNS_ROCE_CQE_V2_GENERAL_ERR
)
3394 * Hip08 hardware cannot flush the WQEs in SQ/RQ if the QP state gets
3395 * into errored mode. Hence, as a workaround to this hardware
3396 * limitation, driver needs to assist in flushing. But the flushing
3397 * operation uses mailbox to convey the QP state to the hardware and
3398 * which can sleep due to the mutex protection around the mailbox calls.
3399 * Hence, use the deferred flush for now. Once wc error detected, the
3400 * flushing operation is needed.
3402 if (!test_and_set_bit(HNS_ROCE_FLUSH_FLAG
, &qp
->flush_flag
))
3403 init_flush_work(hr_dev
, qp
);
3406 static int hns_roce_v2_poll_one(struct hns_roce_cq
*hr_cq
,
3407 struct hns_roce_qp
**cur_qp
, struct ib_wc
*wc
)
3409 struct hns_roce_dev
*hr_dev
= to_hr_dev(hr_cq
->ib_cq
.device
);
3410 struct hns_roce_srq
*srq
= NULL
;
3411 struct hns_roce_v2_cqe
*cqe
;
3412 struct hns_roce_qp
*hr_qp
;
3413 struct hns_roce_wq
*wq
;
3420 /* Find cqe according to consumer index */
3421 cqe
= get_sw_cqe_v2(hr_cq
, hr_cq
->cons_index
);
3425 ++hr_cq
->cons_index
;
3426 /* Memory barrier */
3430 is_send
= !roce_get_bit(cqe
->byte_4
, V2_CQE_BYTE_4_S_R_S
);
3432 qpn
= roce_get_field(cqe
->byte_16
, V2_CQE_BYTE_16_LCL_QPN_M
,
3433 V2_CQE_BYTE_16_LCL_QPN_S
);
3435 if (!*cur_qp
|| (qpn
& HNS_ROCE_V2_CQE_QPN_MASK
) != (*cur_qp
)->qpn
) {
3436 hr_qp
= __hns_roce_qp_lookup(hr_dev
, qpn
);
3437 if (unlikely(!hr_qp
)) {
3438 ibdev_err(&hr_dev
->ib_dev
,
3439 "CQ %06lx with entry for unknown QPN %06x\n",
3440 hr_cq
->cqn
, qpn
& HNS_ROCE_V2_CQE_QPN_MASK
);
3446 wc
->qp
= &(*cur_qp
)->ibqp
;
3450 wq
= &(*cur_qp
)->sq
;
3451 if ((*cur_qp
)->sq_signal_bits
) {
3453 * If sg_signal_bit is 1,
3454 * firstly tail pointer updated to wqe
3455 * which current cqe correspond to
3457 wqe_ctr
= (u16
)roce_get_field(cqe
->byte_4
,
3458 V2_CQE_BYTE_4_WQE_INDX_M
,
3459 V2_CQE_BYTE_4_WQE_INDX_S
);
3460 wq
->tail
+= (wqe_ctr
- (u16
)wq
->tail
) &
3464 wc
->wr_id
= wq
->wrid
[wq
->tail
& (wq
->wqe_cnt
- 1)];
3466 } else if ((*cur_qp
)->ibqp
.srq
) {
3467 srq
= to_hr_srq((*cur_qp
)->ibqp
.srq
);
3468 wqe_ctr
= (u16
)roce_get_field(cqe
->byte_4
,
3469 V2_CQE_BYTE_4_WQE_INDX_M
,
3470 V2_CQE_BYTE_4_WQE_INDX_S
);
3471 wc
->wr_id
= srq
->wrid
[wqe_ctr
];
3472 hns_roce_free_srq_wqe(srq
, wqe_ctr
);
3474 /* Update tail pointer, record wr_id */
3475 wq
= &(*cur_qp
)->rq
;
3476 wc
->wr_id
= wq
->wrid
[wq
->tail
& (wq
->wqe_cnt
- 1)];
3480 get_cqe_status(hr_dev
, *cur_qp
, hr_cq
, cqe
, wc
);
3481 if (unlikely(wc
->status
!= IB_WC_SUCCESS
))
3486 /* SQ corresponding to CQE */
3487 switch (roce_get_field(cqe
->byte_4
, V2_CQE_BYTE_4_OPCODE_M
,
3488 V2_CQE_BYTE_4_OPCODE_S
) & 0x1f) {
3489 case HNS_ROCE_V2_WQE_OP_SEND
:
3490 wc
->opcode
= IB_WC_SEND
;
3492 case HNS_ROCE_V2_WQE_OP_SEND_WITH_INV
:
3493 wc
->opcode
= IB_WC_SEND
;
3495 case HNS_ROCE_V2_WQE_OP_SEND_WITH_IMM
:
3496 wc
->opcode
= IB_WC_SEND
;
3497 wc
->wc_flags
|= IB_WC_WITH_IMM
;
3499 case HNS_ROCE_V2_WQE_OP_RDMA_READ
:
3500 wc
->opcode
= IB_WC_RDMA_READ
;
3501 wc
->byte_len
= le32_to_cpu(cqe
->byte_cnt
);
3503 case HNS_ROCE_V2_WQE_OP_RDMA_WRITE
:
3504 wc
->opcode
= IB_WC_RDMA_WRITE
;
3506 case HNS_ROCE_V2_WQE_OP_RDMA_WRITE_WITH_IMM
:
3507 wc
->opcode
= IB_WC_RDMA_WRITE
;
3508 wc
->wc_flags
|= IB_WC_WITH_IMM
;
3510 case HNS_ROCE_V2_WQE_OP_LOCAL_INV
:
3511 wc
->opcode
= IB_WC_LOCAL_INV
;
3512 wc
->wc_flags
|= IB_WC_WITH_INVALIDATE
;
3514 case HNS_ROCE_V2_WQE_OP_ATOM_CMP_AND_SWAP
:
3515 wc
->opcode
= IB_WC_COMP_SWAP
;
3518 case HNS_ROCE_V2_WQE_OP_ATOM_FETCH_AND_ADD
:
3519 wc
->opcode
= IB_WC_FETCH_ADD
;
3522 case HNS_ROCE_V2_WQE_OP_ATOM_MSK_CMP_AND_SWAP
:
3523 wc
->opcode
= IB_WC_MASKED_COMP_SWAP
;
3526 case HNS_ROCE_V2_WQE_OP_ATOM_MSK_FETCH_AND_ADD
:
3527 wc
->opcode
= IB_WC_MASKED_FETCH_ADD
;
3530 case HNS_ROCE_V2_WQE_OP_FAST_REG_PMR
:
3531 wc
->opcode
= IB_WC_REG_MR
;
3533 case HNS_ROCE_V2_WQE_OP_BIND_MW
:
3534 wc
->opcode
= IB_WC_REG_MR
;
3537 wc
->status
= IB_WC_GENERAL_ERR
;
3541 /* RQ correspond to CQE */
3542 wc
->byte_len
= le32_to_cpu(cqe
->byte_cnt
);
3544 opcode
= roce_get_field(cqe
->byte_4
, V2_CQE_BYTE_4_OPCODE_M
,
3545 V2_CQE_BYTE_4_OPCODE_S
);
3546 switch (opcode
& 0x1f) {
3547 case HNS_ROCE_V2_OPCODE_RDMA_WRITE_IMM
:
3548 wc
->opcode
= IB_WC_RECV_RDMA_WITH_IMM
;
3549 wc
->wc_flags
= IB_WC_WITH_IMM
;
3551 cpu_to_be32(le32_to_cpu(cqe
->immtdata
));
3553 case HNS_ROCE_V2_OPCODE_SEND
:
3554 wc
->opcode
= IB_WC_RECV
;
3557 case HNS_ROCE_V2_OPCODE_SEND_WITH_IMM
:
3558 wc
->opcode
= IB_WC_RECV
;
3559 wc
->wc_flags
= IB_WC_WITH_IMM
;
3561 cpu_to_be32(le32_to_cpu(cqe
->immtdata
));
3563 case HNS_ROCE_V2_OPCODE_SEND_WITH_INV
:
3564 wc
->opcode
= IB_WC_RECV
;
3565 wc
->wc_flags
= IB_WC_WITH_INVALIDATE
;
3566 wc
->ex
.invalidate_rkey
= le32_to_cpu(cqe
->rkey
);
3569 wc
->status
= IB_WC_GENERAL_ERR
;
3573 if ((wc
->qp
->qp_type
== IB_QPT_RC
||
3574 wc
->qp
->qp_type
== IB_QPT_UC
) &&
3575 (opcode
== HNS_ROCE_V2_OPCODE_SEND
||
3576 opcode
== HNS_ROCE_V2_OPCODE_SEND_WITH_IMM
||
3577 opcode
== HNS_ROCE_V2_OPCODE_SEND_WITH_INV
) &&
3578 (roce_get_bit(cqe
->byte_4
, V2_CQE_BYTE_4_RQ_INLINE_S
))) {
3579 ret
= hns_roce_handle_recv_inl_wqe(cqe
, cur_qp
, wc
);
3584 wc
->sl
= (u8
)roce_get_field(cqe
->byte_32
, V2_CQE_BYTE_32_SL_M
,
3585 V2_CQE_BYTE_32_SL_S
);
3586 wc
->src_qp
= (u8
)roce_get_field(cqe
->byte_32
,
3587 V2_CQE_BYTE_32_RMT_QPN_M
,
3588 V2_CQE_BYTE_32_RMT_QPN_S
);
3590 wc
->wc_flags
|= (roce_get_bit(cqe
->byte_32
,
3591 V2_CQE_BYTE_32_GRH_S
) ?
3593 wc
->port_num
= roce_get_field(cqe
->byte_32
,
3594 V2_CQE_BYTE_32_PORTN_M
, V2_CQE_BYTE_32_PORTN_S
);
3597 if (roce_get_bit(cqe
->byte_28
, V2_CQE_BYTE_28_VID_VLD_S
)) {
3598 wc
->vlan_id
= (u16
)roce_get_field(cqe
->byte_28
,
3599 V2_CQE_BYTE_28_VID_M
,
3600 V2_CQE_BYTE_28_VID_S
);
3601 wc
->wc_flags
|= IB_WC_WITH_VLAN
;
3603 wc
->vlan_id
= 0xffff;
3606 wc
->network_hdr_type
= roce_get_field(cqe
->byte_28
,
3607 V2_CQE_BYTE_28_PORT_TYPE_M
,
3608 V2_CQE_BYTE_28_PORT_TYPE_S
);
3614 static int hns_roce_v2_poll_cq(struct ib_cq
*ibcq
, int num_entries
,
3617 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibcq
->device
);
3618 struct hns_roce_cq
*hr_cq
= to_hr_cq(ibcq
);
3619 struct hns_roce_qp
*cur_qp
= NULL
;
3620 unsigned long flags
;
3623 spin_lock_irqsave(&hr_cq
->lock
, flags
);
3626 * When the device starts to reset, the state is RST_DOWN. At this time,
3627 * there may still be some valid CQEs in the hardware that are not
3628 * polled. Therefore, it is not allowed to switch to the software mode
3629 * immediately. When the state changes to UNINIT, CQE no longer exists
3630 * in the hardware, and then switch to software mode.
3632 if (hr_dev
->state
== HNS_ROCE_DEVICE_STATE_UNINIT
) {
3633 npolled
= hns_roce_v2_sw_poll_cq(hr_cq
, num_entries
, wc
);
3637 for (npolled
= 0; npolled
< num_entries
; ++npolled
) {
3638 if (hns_roce_v2_poll_one(hr_cq
, &cur_qp
, wc
+ npolled
))
3643 /* Memory barrier */
3645 hns_roce_v2_cq_set_ci(hr_cq
, hr_cq
->cons_index
);
3649 spin_unlock_irqrestore(&hr_cq
->lock
, flags
);
3654 static int get_op_for_set_hem(struct hns_roce_dev
*hr_dev
, u32 type
,
3659 if (type
== HEM_TYPE_SCCC
&& step_idx
)
3664 op
= HNS_ROCE_CMD_WRITE_QPC_BT0
;
3667 op
= HNS_ROCE_CMD_WRITE_MPT_BT0
;
3670 op
= HNS_ROCE_CMD_WRITE_CQC_BT0
;
3673 op
= HNS_ROCE_CMD_WRITE_SRQC_BT0
;
3676 op
= HNS_ROCE_CMD_WRITE_SCCC_BT0
;
3678 case HEM_TYPE_QPC_TIMER
:
3679 op
= HNS_ROCE_CMD_WRITE_QPC_TIMER_BT0
;
3681 case HEM_TYPE_CQC_TIMER
:
3682 op
= HNS_ROCE_CMD_WRITE_CQC_TIMER_BT0
;
3685 dev_warn(hr_dev
->dev
,
3686 "table %u not to be written by mailbox!\n", type
);
3690 return op
+ step_idx
;
3693 static int set_hem_to_hw(struct hns_roce_dev
*hr_dev
, int obj
, u64 bt_ba
,
3694 u32 hem_type
, int step_idx
)
3696 struct hns_roce_cmd_mailbox
*mailbox
;
3697 struct hns_roce_cmq_desc desc
;
3698 struct hns_roce_cfg_gmv_bt
*gmv_bt
=
3699 (struct hns_roce_cfg_gmv_bt
*)desc
.data
;
3703 if (hem_type
== HEM_TYPE_GMV
) {
3704 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_CFG_GMV_BT
,
3707 gmv_bt
->gmv_ba_l
= cpu_to_le32(bt_ba
>> HNS_HW_PAGE_SHIFT
);
3708 gmv_bt
->gmv_ba_h
= cpu_to_le32(bt_ba
>> (HNS_HW_PAGE_SHIFT
+
3710 gmv_bt
->gmv_bt_idx
= cpu_to_le32(obj
/
3711 (HNS_HW_PAGE_SIZE
/ hr_dev
->caps
.gmv_entry_sz
));
3713 return hns_roce_cmq_send(hr_dev
, &desc
, 1);
3716 op
= get_op_for_set_hem(hr_dev
, hem_type
, step_idx
);
3720 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
3721 if (IS_ERR(mailbox
))
3722 return PTR_ERR(mailbox
);
3724 ret
= hns_roce_cmd_mbox(hr_dev
, bt_ba
, mailbox
->dma
, obj
,
3725 0, op
, HNS_ROCE_CMD_TIMEOUT_MSECS
);
3727 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
3732 static int hns_roce_v2_set_hem(struct hns_roce_dev
*hr_dev
,
3733 struct hns_roce_hem_table
*table
, int obj
,
3736 struct hns_roce_hem_iter iter
;
3737 struct hns_roce_hem_mhop mhop
;
3738 struct hns_roce_hem
*hem
;
3739 unsigned long mhop_obj
= obj
;
3748 if (!hns_roce_check_whether_mhop(hr_dev
, table
->type
))
3751 hns_roce_calc_hem_mhop(hr_dev
, table
, &mhop_obj
, &mhop
);
3755 hop_num
= mhop
.hop_num
;
3756 chunk_ba_num
= mhop
.bt_chunk_size
/ 8;
3759 hem_idx
= i
* chunk_ba_num
* chunk_ba_num
+ j
* chunk_ba_num
+
3761 l1_idx
= i
* chunk_ba_num
+ j
;
3762 } else if (hop_num
== 1) {
3763 hem_idx
= i
* chunk_ba_num
+ j
;
3764 } else if (hop_num
== HNS_ROCE_HOP_NUM_0
) {
3768 if (table
->type
== HEM_TYPE_SCCC
)
3771 if (check_whether_last_step(hop_num
, step_idx
)) {
3772 hem
= table
->hem
[hem_idx
];
3773 for (hns_roce_hem_first(hem
, &iter
);
3774 !hns_roce_hem_last(&iter
); hns_roce_hem_next(&iter
)) {
3775 bt_ba
= hns_roce_hem_addr(&iter
);
3776 ret
= set_hem_to_hw(hr_dev
, obj
, bt_ba
, table
->type
,
3781 bt_ba
= table
->bt_l0_dma_addr
[i
];
3782 else if (step_idx
== 1 && hop_num
== 2)
3783 bt_ba
= table
->bt_l1_dma_addr
[l1_idx
];
3785 ret
= set_hem_to_hw(hr_dev
, obj
, bt_ba
, table
->type
, step_idx
);
3791 static int hns_roce_v2_clear_hem(struct hns_roce_dev
*hr_dev
,
3792 struct hns_roce_hem_table
*table
, int obj
,
3795 struct device
*dev
= hr_dev
->dev
;
3796 struct hns_roce_cmd_mailbox
*mailbox
;
3800 if (!hns_roce_check_whether_mhop(hr_dev
, table
->type
))
3803 switch (table
->type
) {
3805 op
= HNS_ROCE_CMD_DESTROY_QPC_BT0
;
3808 op
= HNS_ROCE_CMD_DESTROY_MPT_BT0
;
3811 op
= HNS_ROCE_CMD_DESTROY_CQC_BT0
;
3814 op
= HNS_ROCE_CMD_DESTROY_SRQC_BT0
;
3817 case HEM_TYPE_QPC_TIMER
:
3818 case HEM_TYPE_CQC_TIMER
:
3822 dev_warn(dev
, "table %u not to be destroyed by mailbox!\n",
3829 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
3830 if (IS_ERR(mailbox
))
3831 return PTR_ERR(mailbox
);
3833 /* configure the tag and op */
3834 ret
= hns_roce_cmd_mbox(hr_dev
, 0, mailbox
->dma
, obj
, 0, op
,
3835 HNS_ROCE_CMD_TIMEOUT_MSECS
);
3837 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
3841 static int hns_roce_v2_qp_modify(struct hns_roce_dev
*hr_dev
,
3842 struct hns_roce_v2_qp_context
*context
,
3843 struct hns_roce_v2_qp_context
*qpc_mask
,
3844 struct hns_roce_qp
*hr_qp
)
3846 struct hns_roce_cmd_mailbox
*mailbox
;
3850 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
3851 if (IS_ERR(mailbox
))
3852 return PTR_ERR(mailbox
);
3854 /* The qpc size of HIP08 is only 256B, which is half of HIP09 */
3855 qpc_size
= hr_dev
->caps
.qpc_sz
;
3856 memcpy(mailbox
->buf
, context
, qpc_size
);
3857 memcpy(mailbox
->buf
+ qpc_size
, qpc_mask
, qpc_size
);
3859 ret
= hns_roce_cmd_mbox(hr_dev
, mailbox
->dma
, 0, hr_qp
->qpn
, 0,
3860 HNS_ROCE_CMD_MODIFY_QPC
,
3861 HNS_ROCE_CMD_TIMEOUT_MSECS
);
3863 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
3868 static void set_access_flags(struct hns_roce_qp
*hr_qp
,
3869 struct hns_roce_v2_qp_context
*context
,
3870 struct hns_roce_v2_qp_context
*qpc_mask
,
3871 const struct ib_qp_attr
*attr
, int attr_mask
)
3876 dest_rd_atomic
= (attr_mask
& IB_QP_MAX_DEST_RD_ATOMIC
) ?
3877 attr
->max_dest_rd_atomic
: hr_qp
->resp_depth
;
3879 access_flags
= (attr_mask
& IB_QP_ACCESS_FLAGS
) ?
3880 attr
->qp_access_flags
: hr_qp
->atomic_rd_en
;
3882 if (!dest_rd_atomic
)
3883 access_flags
&= IB_ACCESS_REMOTE_WRITE
;
3885 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RRE_S
,
3886 !!(access_flags
& IB_ACCESS_REMOTE_READ
));
3887 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RRE_S
, 0);
3889 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RWE_S
,
3890 !!(access_flags
& IB_ACCESS_REMOTE_WRITE
));
3891 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RWE_S
, 0);
3893 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_ATE_S
,
3894 !!(access_flags
& IB_ACCESS_REMOTE_ATOMIC
));
3895 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_ATE_S
, 0);
3896 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_EXT_ATE_S
,
3897 !!(access_flags
& IB_ACCESS_REMOTE_ATOMIC
));
3898 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_EXT_ATE_S
, 0);
3901 static void set_qpc_wqe_cnt(struct hns_roce_qp
*hr_qp
,
3902 struct hns_roce_v2_qp_context
*context
,
3903 struct hns_roce_v2_qp_context
*qpc_mask
)
3905 roce_set_field(context
->byte_4_sqpn_tst
,
3906 V2_QPC_BYTE_4_SGE_SHIFT_M
, V2_QPC_BYTE_4_SGE_SHIFT_S
,
3907 to_hr_hem_entries_shift(hr_qp
->sge
.sge_cnt
,
3908 hr_qp
->sge
.sge_shift
));
3910 roce_set_field(context
->byte_20_smac_sgid_idx
,
3911 V2_QPC_BYTE_20_SQ_SHIFT_M
, V2_QPC_BYTE_20_SQ_SHIFT_S
,
3912 ilog2(hr_qp
->sq
.wqe_cnt
));
3914 roce_set_field(context
->byte_20_smac_sgid_idx
,
3915 V2_QPC_BYTE_20_RQ_SHIFT_M
, V2_QPC_BYTE_20_RQ_SHIFT_S
,
3916 ilog2(hr_qp
->rq
.wqe_cnt
));
3919 static void modify_qp_reset_to_init(struct ib_qp
*ibqp
,
3920 const struct ib_qp_attr
*attr
,
3922 struct hns_roce_v2_qp_context
*context
,
3923 struct hns_roce_v2_qp_context
*qpc_mask
)
3925 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
3926 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
3929 * In v2 engine, software pass context and context mask to hardware
3930 * when modifying qp. If software need modify some fields in context,
3931 * we should set all bits of the relevant fields in context mask to
3932 * 0 at the same time, else set them to 0x1.
3934 roce_set_field(context
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_TST_M
,
3935 V2_QPC_BYTE_4_TST_S
, to_hr_qp_type(hr_qp
->ibqp
.qp_type
));
3937 roce_set_field(context
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_SQPN_M
,
3938 V2_QPC_BYTE_4_SQPN_S
, hr_qp
->qpn
);
3940 roce_set_field(context
->byte_16_buf_ba_pg_sz
, V2_QPC_BYTE_16_PD_M
,
3941 V2_QPC_BYTE_16_PD_S
, to_hr_pd(ibqp
->pd
)->pdn
);
3943 roce_set_field(context
->byte_20_smac_sgid_idx
, V2_QPC_BYTE_20_RQWS_M
,
3944 V2_QPC_BYTE_20_RQWS_S
, ilog2(hr_qp
->rq
.max_gs
));
3946 set_qpc_wqe_cnt(hr_qp
, context
, qpc_mask
);
3948 /* No VLAN need to set 0xFFF */
3949 roce_set_field(context
->byte_24_mtu_tc
, V2_QPC_BYTE_24_VLAN_ID_M
,
3950 V2_QPC_BYTE_24_VLAN_ID_S
, 0xfff);
3952 if (hr_qp
->en_flags
& HNS_ROCE_QP_CAP_RQ_RECORD_DB
)
3953 roce_set_bit(context
->byte_68_rq_db
,
3954 V2_QPC_BYTE_68_RQ_RECORD_EN_S
, 1);
3956 roce_set_field(context
->byte_68_rq_db
,
3957 V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_M
,
3958 V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_S
,
3959 ((u32
)hr_qp
->rdb
.dma
) >> 1);
3960 context
->rq_db_record_addr
= cpu_to_le32(hr_qp
->rdb
.dma
>> 32);
3962 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RQIE_S
,
3963 (hr_dev
->caps
.flags
& HNS_ROCE_CAP_FLAG_RQ_INLINE
) ? 1 : 0);
3965 roce_set_field(context
->byte_80_rnr_rx_cqn
, V2_QPC_BYTE_80_RX_CQN_M
,
3966 V2_QPC_BYTE_80_RX_CQN_S
, to_hr_cq(ibqp
->recv_cq
)->cqn
);
3968 roce_set_field(context
->byte_76_srqn_op_en
,
3969 V2_QPC_BYTE_76_SRQN_M
, V2_QPC_BYTE_76_SRQN_S
,
3970 to_hr_srq(ibqp
->srq
)->srqn
);
3971 roce_set_bit(context
->byte_76_srqn_op_en
,
3972 V2_QPC_BYTE_76_SRQ_EN_S
, 1);
3975 roce_set_bit(context
->byte_172_sq_psn
, V2_QPC_BYTE_172_FRE_S
, 1);
3977 roce_set_field(context
->byte_252_err_txcqn
, V2_QPC_BYTE_252_TX_CQN_M
,
3978 V2_QPC_BYTE_252_TX_CQN_S
, to_hr_cq(ibqp
->send_cq
)->cqn
);
3980 if (hr_dev
->caps
.qpc_sz
< HNS_ROCE_V3_QPC_SZ
)
3983 if (hr_dev
->caps
.flags
& HNS_ROCE_CAP_FLAG_STASH
)
3984 hr_reg_enable(&context
->ext
, QPCEX_STASH
);
3987 static void modify_qp_init_to_init(struct ib_qp
*ibqp
,
3988 const struct ib_qp_attr
*attr
, int attr_mask
,
3989 struct hns_roce_v2_qp_context
*context
,
3990 struct hns_roce_v2_qp_context
*qpc_mask
)
3992 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
3995 * In v2 engine, software pass context and context mask to hardware
3996 * when modifying qp. If software need modify some fields in context,
3997 * we should set all bits of the relevant fields in context mask to
3998 * 0 at the same time, else set them to 0x1.
4000 roce_set_field(context
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_TST_M
,
4001 V2_QPC_BYTE_4_TST_S
, to_hr_qp_type(hr_qp
->ibqp
.qp_type
));
4002 roce_set_field(qpc_mask
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_TST_M
,
4003 V2_QPC_BYTE_4_TST_S
, 0);
4005 roce_set_field(context
->byte_16_buf_ba_pg_sz
, V2_QPC_BYTE_16_PD_M
,
4006 V2_QPC_BYTE_16_PD_S
, to_hr_pd(ibqp
->pd
)->pdn
);
4007 roce_set_field(qpc_mask
->byte_16_buf_ba_pg_sz
, V2_QPC_BYTE_16_PD_M
,
4008 V2_QPC_BYTE_16_PD_S
, 0);
4010 roce_set_field(context
->byte_80_rnr_rx_cqn
, V2_QPC_BYTE_80_RX_CQN_M
,
4011 V2_QPC_BYTE_80_RX_CQN_S
, to_hr_cq(ibqp
->recv_cq
)->cqn
);
4012 roce_set_field(qpc_mask
->byte_80_rnr_rx_cqn
, V2_QPC_BYTE_80_RX_CQN_M
,
4013 V2_QPC_BYTE_80_RX_CQN_S
, 0);
4015 roce_set_field(context
->byte_252_err_txcqn
, V2_QPC_BYTE_252_TX_CQN_M
,
4016 V2_QPC_BYTE_252_TX_CQN_S
, to_hr_cq(ibqp
->send_cq
)->cqn
);
4017 roce_set_field(qpc_mask
->byte_252_err_txcqn
, V2_QPC_BYTE_252_TX_CQN_M
,
4018 V2_QPC_BYTE_252_TX_CQN_S
, 0);
4021 roce_set_bit(context
->byte_76_srqn_op_en
,
4022 V2_QPC_BYTE_76_SRQ_EN_S
, 1);
4023 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
,
4024 V2_QPC_BYTE_76_SRQ_EN_S
, 0);
4025 roce_set_field(context
->byte_76_srqn_op_en
,
4026 V2_QPC_BYTE_76_SRQN_M
, V2_QPC_BYTE_76_SRQN_S
,
4027 to_hr_srq(ibqp
->srq
)->srqn
);
4028 roce_set_field(qpc_mask
->byte_76_srqn_op_en
,
4029 V2_QPC_BYTE_76_SRQN_M
, V2_QPC_BYTE_76_SRQN_S
, 0);
4032 roce_set_field(context
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_SQPN_M
,
4033 V2_QPC_BYTE_4_SQPN_S
, hr_qp
->qpn
);
4034 roce_set_field(qpc_mask
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_SQPN_M
,
4035 V2_QPC_BYTE_4_SQPN_S
, 0);
4037 if (attr_mask
& IB_QP_DEST_QPN
) {
4038 roce_set_field(context
->byte_56_dqpn_err
, V2_QPC_BYTE_56_DQPN_M
,
4039 V2_QPC_BYTE_56_DQPN_S
, hr_qp
->qpn
);
4040 roce_set_field(qpc_mask
->byte_56_dqpn_err
,
4041 V2_QPC_BYTE_56_DQPN_M
, V2_QPC_BYTE_56_DQPN_S
, 0);
4045 static int config_qp_rq_buf(struct hns_roce_dev
*hr_dev
,
4046 struct hns_roce_qp
*hr_qp
,
4047 struct hns_roce_v2_qp_context
*context
,
4048 struct hns_roce_v2_qp_context
*qpc_mask
)
4050 u64 mtts
[MTT_MIN_COUNT
] = { 0 };
4054 /* Search qp buf's mtts */
4055 count
= hns_roce_mtr_find(hr_dev
, &hr_qp
->mtr
, hr_qp
->rq
.offset
, mtts
,
4056 MTT_MIN_COUNT
, &wqe_sge_ba
);
4057 if (hr_qp
->rq
.wqe_cnt
&& count
< 1) {
4058 ibdev_err(&hr_dev
->ib_dev
,
4059 "failed to find RQ WQE, QPN = 0x%lx.\n", hr_qp
->qpn
);
4063 context
->wqe_sge_ba
= cpu_to_le32(wqe_sge_ba
>> 3);
4064 qpc_mask
->wqe_sge_ba
= 0;
4067 * In v2 engine, software pass context and context mask to hardware
4068 * when modifying qp. If software need modify some fields in context,
4069 * we should set all bits of the relevant fields in context mask to
4070 * 0 at the same time, else set them to 0x1.
4072 roce_set_field(context
->byte_12_sq_hop
, V2_QPC_BYTE_12_WQE_SGE_BA_M
,
4073 V2_QPC_BYTE_12_WQE_SGE_BA_S
, wqe_sge_ba
>> (32 + 3));
4074 roce_set_field(qpc_mask
->byte_12_sq_hop
, V2_QPC_BYTE_12_WQE_SGE_BA_M
,
4075 V2_QPC_BYTE_12_WQE_SGE_BA_S
, 0);
4077 roce_set_field(context
->byte_12_sq_hop
, V2_QPC_BYTE_12_SQ_HOP_NUM_M
,
4078 V2_QPC_BYTE_12_SQ_HOP_NUM_S
,
4079 to_hr_hem_hopnum(hr_dev
->caps
.wqe_sq_hop_num
,
4080 hr_qp
->sq
.wqe_cnt
));
4081 roce_set_field(qpc_mask
->byte_12_sq_hop
, V2_QPC_BYTE_12_SQ_HOP_NUM_M
,
4082 V2_QPC_BYTE_12_SQ_HOP_NUM_S
, 0);
4084 roce_set_field(context
->byte_20_smac_sgid_idx
,
4085 V2_QPC_BYTE_20_SGE_HOP_NUM_M
,
4086 V2_QPC_BYTE_20_SGE_HOP_NUM_S
,
4087 to_hr_hem_hopnum(hr_dev
->caps
.wqe_sge_hop_num
,
4088 hr_qp
->sge
.sge_cnt
));
4089 roce_set_field(qpc_mask
->byte_20_smac_sgid_idx
,
4090 V2_QPC_BYTE_20_SGE_HOP_NUM_M
,
4091 V2_QPC_BYTE_20_SGE_HOP_NUM_S
, 0);
4093 roce_set_field(context
->byte_20_smac_sgid_idx
,
4094 V2_QPC_BYTE_20_RQ_HOP_NUM_M
,
4095 V2_QPC_BYTE_20_RQ_HOP_NUM_S
,
4096 to_hr_hem_hopnum(hr_dev
->caps
.wqe_rq_hop_num
,
4097 hr_qp
->rq
.wqe_cnt
));
4099 roce_set_field(qpc_mask
->byte_20_smac_sgid_idx
,
4100 V2_QPC_BYTE_20_RQ_HOP_NUM_M
,
4101 V2_QPC_BYTE_20_RQ_HOP_NUM_S
, 0);
4103 roce_set_field(context
->byte_16_buf_ba_pg_sz
,
4104 V2_QPC_BYTE_16_WQE_SGE_BA_PG_SZ_M
,
4105 V2_QPC_BYTE_16_WQE_SGE_BA_PG_SZ_S
,
4106 to_hr_hw_page_shift(hr_qp
->mtr
.hem_cfg
.ba_pg_shift
));
4107 roce_set_field(qpc_mask
->byte_16_buf_ba_pg_sz
,
4108 V2_QPC_BYTE_16_WQE_SGE_BA_PG_SZ_M
,
4109 V2_QPC_BYTE_16_WQE_SGE_BA_PG_SZ_S
, 0);
4111 roce_set_field(context
->byte_16_buf_ba_pg_sz
,
4112 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_M
,
4113 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_S
,
4114 to_hr_hw_page_shift(hr_qp
->mtr
.hem_cfg
.buf_pg_shift
));
4115 roce_set_field(qpc_mask
->byte_16_buf_ba_pg_sz
,
4116 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_M
,
4117 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_S
, 0);
4119 context
->rq_cur_blk_addr
= cpu_to_le32(to_hr_hw_page_addr(mtts
[0]));
4120 qpc_mask
->rq_cur_blk_addr
= 0;
4122 roce_set_field(context
->byte_92_srq_info
,
4123 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_M
,
4124 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_S
,
4125 upper_32_bits(to_hr_hw_page_addr(mtts
[0])));
4126 roce_set_field(qpc_mask
->byte_92_srq_info
,
4127 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_M
,
4128 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_S
, 0);
4130 context
->rq_nxt_blk_addr
= cpu_to_le32(to_hr_hw_page_addr(mtts
[1]));
4131 qpc_mask
->rq_nxt_blk_addr
= 0;
4133 roce_set_field(context
->byte_104_rq_sge
,
4134 V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_M
,
4135 V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_S
,
4136 upper_32_bits(to_hr_hw_page_addr(mtts
[1])));
4137 roce_set_field(qpc_mask
->byte_104_rq_sge
,
4138 V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_M
,
4139 V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_S
, 0);
4141 roce_set_field(context
->byte_84_rq_ci_pi
,
4142 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M
,
4143 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S
, hr_qp
->rq
.head
);
4144 roce_set_field(qpc_mask
->byte_84_rq_ci_pi
,
4145 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M
,
4146 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S
, 0);
4148 roce_set_field(qpc_mask
->byte_84_rq_ci_pi
,
4149 V2_QPC_BYTE_84_RQ_CONSUMER_IDX_M
,
4150 V2_QPC_BYTE_84_RQ_CONSUMER_IDX_S
, 0);
4155 static int config_qp_sq_buf(struct hns_roce_dev
*hr_dev
,
4156 struct hns_roce_qp
*hr_qp
,
4157 struct hns_roce_v2_qp_context
*context
,
4158 struct hns_roce_v2_qp_context
*qpc_mask
)
4160 struct ib_device
*ibdev
= &hr_dev
->ib_dev
;
4161 u64 sge_cur_blk
= 0;
4165 /* search qp buf's mtts */
4166 count
= hns_roce_mtr_find(hr_dev
, &hr_qp
->mtr
, 0, &sq_cur_blk
, 1, NULL
);
4168 ibdev_err(ibdev
, "failed to find QP(0x%lx) SQ buf.\n",
4172 if (hr_qp
->sge
.sge_cnt
> 0) {
4173 count
= hns_roce_mtr_find(hr_dev
, &hr_qp
->mtr
,
4175 &sge_cur_blk
, 1, NULL
);
4177 ibdev_err(ibdev
, "failed to find QP(0x%lx) SGE buf.\n",
4184 * In v2 engine, software pass context and context mask to hardware
4185 * when modifying qp. If software need modify some fields in context,
4186 * we should set all bits of the relevant fields in context mask to
4187 * 0 at the same time, else set them to 0x1.
4189 context
->sq_cur_blk_addr
= cpu_to_le32(to_hr_hw_page_addr(sq_cur_blk
));
4190 roce_set_field(context
->byte_168_irrl_idx
,
4191 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_M
,
4192 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_S
,
4193 upper_32_bits(to_hr_hw_page_addr(sq_cur_blk
)));
4194 qpc_mask
->sq_cur_blk_addr
= 0;
4195 roce_set_field(qpc_mask
->byte_168_irrl_idx
,
4196 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_M
,
4197 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_S
, 0);
4199 context
->sq_cur_sge_blk_addr
=
4200 cpu_to_le32(to_hr_hw_page_addr(sge_cur_blk
));
4201 roce_set_field(context
->byte_184_irrl_idx
,
4202 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_M
,
4203 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_S
,
4204 upper_32_bits(to_hr_hw_page_addr(sge_cur_blk
)));
4205 qpc_mask
->sq_cur_sge_blk_addr
= 0;
4206 roce_set_field(qpc_mask
->byte_184_irrl_idx
,
4207 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_M
,
4208 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_S
, 0);
4210 context
->rx_sq_cur_blk_addr
=
4211 cpu_to_le32(to_hr_hw_page_addr(sq_cur_blk
));
4212 roce_set_field(context
->byte_232_irrl_sge
,
4213 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_M
,
4214 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_S
,
4215 upper_32_bits(to_hr_hw_page_addr(sq_cur_blk
)));
4216 qpc_mask
->rx_sq_cur_blk_addr
= 0;
4217 roce_set_field(qpc_mask
->byte_232_irrl_sge
,
4218 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_M
,
4219 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_S
, 0);
4224 static inline enum ib_mtu
get_mtu(struct ib_qp
*ibqp
,
4225 const struct ib_qp_attr
*attr
)
4227 if (ibqp
->qp_type
== IB_QPT_GSI
|| ibqp
->qp_type
== IB_QPT_UD
)
4230 return attr
->path_mtu
;
4233 static int modify_qp_init_to_rtr(struct ib_qp
*ibqp
,
4234 const struct ib_qp_attr
*attr
, int attr_mask
,
4235 struct hns_roce_v2_qp_context
*context
,
4236 struct hns_roce_v2_qp_context
*qpc_mask
)
4238 const struct ib_global_route
*grh
= rdma_ah_read_grh(&attr
->ah_attr
);
4239 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
4240 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
4241 struct ib_device
*ibdev
= &hr_dev
->ib_dev
;
4253 ret
= config_qp_rq_buf(hr_dev
, hr_qp
, context
, qpc_mask
);
4255 ibdev_err(ibdev
, "failed to config rq buf, ret = %d.\n", ret
);
4259 /* Search IRRL's mtts */
4260 mtts
= hns_roce_table_find(hr_dev
, &hr_dev
->qp_table
.irrl_table
,
4261 hr_qp
->qpn
, &irrl_ba
);
4263 ibdev_err(ibdev
, "failed to find qp irrl_table.\n");
4267 /* Search TRRL's mtts */
4268 mtts
= hns_roce_table_find(hr_dev
, &hr_dev
->qp_table
.trrl_table
,
4269 hr_qp
->qpn
, &trrl_ba
);
4271 ibdev_err(ibdev
, "failed to find qp trrl_table.\n");
4275 if (attr_mask
& IB_QP_ALT_PATH
) {
4276 ibdev_err(ibdev
, "INIT2RTR attr_mask (0x%x) error.\n",
4281 roce_set_field(context
->byte_132_trrl
, V2_QPC_BYTE_132_TRRL_BA_M
,
4282 V2_QPC_BYTE_132_TRRL_BA_S
, trrl_ba
>> 4);
4283 roce_set_field(qpc_mask
->byte_132_trrl
, V2_QPC_BYTE_132_TRRL_BA_M
,
4284 V2_QPC_BYTE_132_TRRL_BA_S
, 0);
4285 context
->trrl_ba
= cpu_to_le32(trrl_ba
>> (16 + 4));
4286 qpc_mask
->trrl_ba
= 0;
4287 roce_set_field(context
->byte_140_raq
, V2_QPC_BYTE_140_TRRL_BA_M
,
4288 V2_QPC_BYTE_140_TRRL_BA_S
,
4289 (u32
)(trrl_ba
>> (32 + 16 + 4)));
4290 roce_set_field(qpc_mask
->byte_140_raq
, V2_QPC_BYTE_140_TRRL_BA_M
,
4291 V2_QPC_BYTE_140_TRRL_BA_S
, 0);
4293 context
->irrl_ba
= cpu_to_le32(irrl_ba
>> 6);
4294 qpc_mask
->irrl_ba
= 0;
4295 roce_set_field(context
->byte_208_irrl
, V2_QPC_BYTE_208_IRRL_BA_M
,
4296 V2_QPC_BYTE_208_IRRL_BA_S
,
4297 irrl_ba
>> (32 + 6));
4298 roce_set_field(qpc_mask
->byte_208_irrl
, V2_QPC_BYTE_208_IRRL_BA_M
,
4299 V2_QPC_BYTE_208_IRRL_BA_S
, 0);
4301 roce_set_bit(context
->byte_208_irrl
, V2_QPC_BYTE_208_RMT_E2E_S
, 1);
4302 roce_set_bit(qpc_mask
->byte_208_irrl
, V2_QPC_BYTE_208_RMT_E2E_S
, 0);
4304 roce_set_bit(context
->byte_252_err_txcqn
, V2_QPC_BYTE_252_SIG_TYPE_S
,
4305 hr_qp
->sq_signal_bits
);
4306 roce_set_bit(qpc_mask
->byte_252_err_txcqn
, V2_QPC_BYTE_252_SIG_TYPE_S
,
4309 port
= (attr_mask
& IB_QP_PORT
) ? (attr
->port_num
- 1) : hr_qp
->port
;
4311 smac
= (u8
*)hr_dev
->dev_addr
[port
];
4312 dmac
= (u8
*)attr
->ah_attr
.roce
.dmac
;
4313 /* when dmac equals smac or loop_idc is 1, it should loopback */
4314 if (ether_addr_equal_unaligned(dmac
, smac
) ||
4315 hr_dev
->loop_idc
== 0x1) {
4316 roce_set_bit(context
->byte_28_at_fl
, V2_QPC_BYTE_28_LBI_S
, 1);
4317 roce_set_bit(qpc_mask
->byte_28_at_fl
, V2_QPC_BYTE_28_LBI_S
, 0);
4320 if (attr_mask
& IB_QP_DEST_QPN
) {
4321 roce_set_field(context
->byte_56_dqpn_err
, V2_QPC_BYTE_56_DQPN_M
,
4322 V2_QPC_BYTE_56_DQPN_S
, attr
->dest_qp_num
);
4323 roce_set_field(qpc_mask
->byte_56_dqpn_err
,
4324 V2_QPC_BYTE_56_DQPN_M
, V2_QPC_BYTE_56_DQPN_S
, 0);
4327 /* Configure GID index */
4328 port_num
= rdma_ah_get_port_num(&attr
->ah_attr
);
4329 roce_set_field(context
->byte_20_smac_sgid_idx
,
4330 V2_QPC_BYTE_20_SGID_IDX_M
, V2_QPC_BYTE_20_SGID_IDX_S
,
4331 hns_get_gid_index(hr_dev
, port_num
- 1,
4333 roce_set_field(qpc_mask
->byte_20_smac_sgid_idx
,
4334 V2_QPC_BYTE_20_SGID_IDX_M
, V2_QPC_BYTE_20_SGID_IDX_S
, 0);
4336 memcpy(&(context
->dmac
), dmac
, sizeof(u32
));
4337 roce_set_field(context
->byte_52_udpspn_dmac
, V2_QPC_BYTE_52_DMAC_M
,
4338 V2_QPC_BYTE_52_DMAC_S
, *((u16
*)(&dmac
[4])));
4340 roce_set_field(qpc_mask
->byte_52_udpspn_dmac
, V2_QPC_BYTE_52_DMAC_M
,
4341 V2_QPC_BYTE_52_DMAC_S
, 0);
4343 mtu
= get_mtu(ibqp
, attr
);
4344 hr_qp
->path_mtu
= mtu
;
4346 if (attr_mask
& IB_QP_PATH_MTU
) {
4347 roce_set_field(context
->byte_24_mtu_tc
, V2_QPC_BYTE_24_MTU_M
,
4348 V2_QPC_BYTE_24_MTU_S
, mtu
);
4349 roce_set_field(qpc_mask
->byte_24_mtu_tc
, V2_QPC_BYTE_24_MTU_M
,
4350 V2_QPC_BYTE_24_MTU_S
, 0);
4353 #define MAX_LP_MSG_LEN 65536
4354 /* MTU * (2 ^ LP_PKTN_INI) shouldn't be bigger than 64KB */
4355 lp_pktn_ini
= ilog2(MAX_LP_MSG_LEN
/ ib_mtu_enum_to_int(mtu
));
4357 roce_set_field(context
->byte_56_dqpn_err
, V2_QPC_BYTE_56_LP_PKTN_INI_M
,
4358 V2_QPC_BYTE_56_LP_PKTN_INI_S
, lp_pktn_ini
);
4359 roce_set_field(qpc_mask
->byte_56_dqpn_err
, V2_QPC_BYTE_56_LP_PKTN_INI_M
,
4360 V2_QPC_BYTE_56_LP_PKTN_INI_S
, 0);
4362 /* ACK_REQ_FREQ should be larger than or equal to LP_PKTN_INI */
4363 roce_set_field(context
->byte_172_sq_psn
, V2_QPC_BYTE_172_ACK_REQ_FREQ_M
,
4364 V2_QPC_BYTE_172_ACK_REQ_FREQ_S
, lp_pktn_ini
);
4365 roce_set_field(qpc_mask
->byte_172_sq_psn
,
4366 V2_QPC_BYTE_172_ACK_REQ_FREQ_M
,
4367 V2_QPC_BYTE_172_ACK_REQ_FREQ_S
, 0);
4369 roce_set_bit(qpc_mask
->byte_108_rx_reqepsn
,
4370 V2_QPC_BYTE_108_RX_REQ_PSN_ERR_S
, 0);
4371 roce_set_field(qpc_mask
->byte_96_rx_reqmsn
, V2_QPC_BYTE_96_RX_REQ_MSN_M
,
4372 V2_QPC_BYTE_96_RX_REQ_MSN_S
, 0);
4373 roce_set_field(qpc_mask
->byte_108_rx_reqepsn
,
4374 V2_QPC_BYTE_108_RX_REQ_LAST_OPTYPE_M
,
4375 V2_QPC_BYTE_108_RX_REQ_LAST_OPTYPE_S
, 0);
4377 context
->rq_rnr_timer
= 0;
4378 qpc_mask
->rq_rnr_timer
= 0;
4380 roce_set_field(qpc_mask
->byte_132_trrl
, V2_QPC_BYTE_132_TRRL_HEAD_MAX_M
,
4381 V2_QPC_BYTE_132_TRRL_HEAD_MAX_S
, 0);
4382 roce_set_field(qpc_mask
->byte_132_trrl
, V2_QPC_BYTE_132_TRRL_TAIL_MAX_M
,
4383 V2_QPC_BYTE_132_TRRL_TAIL_MAX_S
, 0);
4385 /* rocee send 2^lp_sgen_ini segs every time */
4386 roce_set_field(context
->byte_168_irrl_idx
,
4387 V2_QPC_BYTE_168_LP_SGEN_INI_M
,
4388 V2_QPC_BYTE_168_LP_SGEN_INI_S
, 3);
4389 roce_set_field(qpc_mask
->byte_168_irrl_idx
,
4390 V2_QPC_BYTE_168_LP_SGEN_INI_M
,
4391 V2_QPC_BYTE_168_LP_SGEN_INI_S
, 0);
4396 static int modify_qp_rtr_to_rts(struct ib_qp
*ibqp
,
4397 const struct ib_qp_attr
*attr
, int attr_mask
,
4398 struct hns_roce_v2_qp_context
*context
,
4399 struct hns_roce_v2_qp_context
*qpc_mask
)
4401 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
4402 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
4403 struct ib_device
*ibdev
= &hr_dev
->ib_dev
;
4406 /* Not support alternate path and path migration */
4407 if (attr_mask
& (IB_QP_ALT_PATH
| IB_QP_PATH_MIG_STATE
)) {
4408 ibdev_err(ibdev
, "RTR2RTS attr_mask (0x%x)error\n", attr_mask
);
4412 ret
= config_qp_sq_buf(hr_dev
, hr_qp
, context
, qpc_mask
);
4414 ibdev_err(ibdev
, "failed to config sq buf, ret = %d.\n", ret
);
4419 * Set some fields in context to zero, Because the default values
4420 * of all fields in context are zero, we need not set them to 0 again.
4421 * but we should set the relevant fields of context mask to 0.
4423 roce_set_field(qpc_mask
->byte_232_irrl_sge
,
4424 V2_QPC_BYTE_232_IRRL_SGE_IDX_M
,
4425 V2_QPC_BYTE_232_IRRL_SGE_IDX_S
, 0);
4427 roce_set_field(qpc_mask
->byte_240_irrl_tail
,
4428 V2_QPC_BYTE_240_RX_ACK_MSN_M
,
4429 V2_QPC_BYTE_240_RX_ACK_MSN_S
, 0);
4431 roce_set_field(qpc_mask
->byte_248_ack_psn
,
4432 V2_QPC_BYTE_248_ACK_LAST_OPTYPE_M
,
4433 V2_QPC_BYTE_248_ACK_LAST_OPTYPE_S
, 0);
4434 roce_set_bit(qpc_mask
->byte_248_ack_psn
,
4435 V2_QPC_BYTE_248_IRRL_PSN_VLD_S
, 0);
4436 roce_set_field(qpc_mask
->byte_248_ack_psn
,
4437 V2_QPC_BYTE_248_IRRL_PSN_M
,
4438 V2_QPC_BYTE_248_IRRL_PSN_S
, 0);
4440 roce_set_field(qpc_mask
->byte_240_irrl_tail
,
4441 V2_QPC_BYTE_240_IRRL_TAIL_REAL_M
,
4442 V2_QPC_BYTE_240_IRRL_TAIL_REAL_S
, 0);
4444 roce_set_field(qpc_mask
->byte_220_retry_psn_msn
,
4445 V2_QPC_BYTE_220_RETRY_MSG_MSN_M
,
4446 V2_QPC_BYTE_220_RETRY_MSG_MSN_S
, 0);
4448 roce_set_bit(qpc_mask
->byte_248_ack_psn
,
4449 V2_QPC_BYTE_248_RNR_RETRY_FLAG_S
, 0);
4451 roce_set_field(qpc_mask
->byte_212_lsn
, V2_QPC_BYTE_212_CHECK_FLG_M
,
4452 V2_QPC_BYTE_212_CHECK_FLG_S
, 0);
4454 roce_set_field(context
->byte_212_lsn
, V2_QPC_BYTE_212_LSN_M
,
4455 V2_QPC_BYTE_212_LSN_S
, 0x100);
4456 roce_set_field(qpc_mask
->byte_212_lsn
, V2_QPC_BYTE_212_LSN_M
,
4457 V2_QPC_BYTE_212_LSN_S
, 0);
4459 roce_set_field(qpc_mask
->byte_196_sq_psn
, V2_QPC_BYTE_196_IRRL_HEAD_M
,
4460 V2_QPC_BYTE_196_IRRL_HEAD_S
, 0);
4465 static inline u16
get_udp_sport(u32 fl
, u32 lqpn
, u32 rqpn
)
4468 fl
= rdma_calc_flow_label(lqpn
, rqpn
);
4470 return rdma_flow_label_to_udp_sport(fl
);
4473 static int hns_roce_v2_set_path(struct ib_qp
*ibqp
,
4474 const struct ib_qp_attr
*attr
,
4476 struct hns_roce_v2_qp_context
*context
,
4477 struct hns_roce_v2_qp_context
*qpc_mask
)
4479 const struct ib_global_route
*grh
= rdma_ah_read_grh(&attr
->ah_attr
);
4480 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
4481 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
4482 struct ib_device
*ibdev
= &hr_dev
->ib_dev
;
4483 const struct ib_gid_attr
*gid_attr
= NULL
;
4484 int is_roce_protocol
;
4485 u16 vlan_id
= 0xffff;
4486 bool is_udp
= false;
4491 ib_port
= (attr_mask
& IB_QP_PORT
) ? attr
->port_num
: hr_qp
->port
+ 1;
4492 hr_port
= ib_port
- 1;
4493 is_roce_protocol
= rdma_cap_eth_ah(&hr_dev
->ib_dev
, ib_port
) &&
4494 rdma_ah_get_ah_flags(&attr
->ah_attr
) & IB_AH_GRH
;
4496 if (is_roce_protocol
) {
4497 gid_attr
= attr
->ah_attr
.grh
.sgid_attr
;
4498 ret
= rdma_read_gid_l2_fields(gid_attr
, &vlan_id
, NULL
);
4503 is_udp
= (gid_attr
->gid_type
==
4504 IB_GID_TYPE_ROCE_UDP_ENCAP
);
4507 /* Only HIP08 needs to set the vlan_en bits in QPC */
4508 if (vlan_id
< VLAN_N_VID
&&
4509 hr_dev
->pci_dev
->revision
== PCI_REVISION_ID_HIP08
) {
4510 roce_set_bit(context
->byte_76_srqn_op_en
,
4511 V2_QPC_BYTE_76_RQ_VLAN_EN_S
, 1);
4512 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
,
4513 V2_QPC_BYTE_76_RQ_VLAN_EN_S
, 0);
4514 roce_set_bit(context
->byte_168_irrl_idx
,
4515 V2_QPC_BYTE_168_SQ_VLAN_EN_S
, 1);
4516 roce_set_bit(qpc_mask
->byte_168_irrl_idx
,
4517 V2_QPC_BYTE_168_SQ_VLAN_EN_S
, 0);
4520 roce_set_field(context
->byte_24_mtu_tc
, V2_QPC_BYTE_24_VLAN_ID_M
,
4521 V2_QPC_BYTE_24_VLAN_ID_S
, vlan_id
);
4522 roce_set_field(qpc_mask
->byte_24_mtu_tc
, V2_QPC_BYTE_24_VLAN_ID_M
,
4523 V2_QPC_BYTE_24_VLAN_ID_S
, 0);
4525 if (grh
->sgid_index
>= hr_dev
->caps
.gid_table_len
[hr_port
]) {
4526 ibdev_err(ibdev
, "sgid_index(%u) too large. max is %d\n",
4527 grh
->sgid_index
, hr_dev
->caps
.gid_table_len
[hr_port
]);
4531 if (attr
->ah_attr
.type
!= RDMA_AH_ATTR_TYPE_ROCE
) {
4532 ibdev_err(ibdev
, "ah attr is not RDMA roce type\n");
4536 roce_set_field(context
->byte_52_udpspn_dmac
, V2_QPC_BYTE_52_UDPSPN_M
,
4537 V2_QPC_BYTE_52_UDPSPN_S
,
4538 is_udp
? get_udp_sport(grh
->flow_label
, ibqp
->qp_num
,
4539 attr
->dest_qp_num
) : 0);
4541 roce_set_field(qpc_mask
->byte_52_udpspn_dmac
, V2_QPC_BYTE_52_UDPSPN_M
,
4542 V2_QPC_BYTE_52_UDPSPN_S
, 0);
4544 roce_set_field(context
->byte_20_smac_sgid_idx
,
4545 V2_QPC_BYTE_20_SGID_IDX_M
, V2_QPC_BYTE_20_SGID_IDX_S
,
4548 roce_set_field(qpc_mask
->byte_20_smac_sgid_idx
,
4549 V2_QPC_BYTE_20_SGID_IDX_M
, V2_QPC_BYTE_20_SGID_IDX_S
, 0);
4551 roce_set_field(context
->byte_24_mtu_tc
, V2_QPC_BYTE_24_HOP_LIMIT_M
,
4552 V2_QPC_BYTE_24_HOP_LIMIT_S
, grh
->hop_limit
);
4553 roce_set_field(qpc_mask
->byte_24_mtu_tc
, V2_QPC_BYTE_24_HOP_LIMIT_M
,
4554 V2_QPC_BYTE_24_HOP_LIMIT_S
, 0);
4556 roce_set_field(context
->byte_24_mtu_tc
, V2_QPC_BYTE_24_TC_M
,
4557 V2_QPC_BYTE_24_TC_S
, get_tclass(&attr
->ah_attr
.grh
));
4558 roce_set_field(qpc_mask
->byte_24_mtu_tc
, V2_QPC_BYTE_24_TC_M
,
4559 V2_QPC_BYTE_24_TC_S
, 0);
4561 roce_set_field(context
->byte_28_at_fl
, V2_QPC_BYTE_28_FL_M
,
4562 V2_QPC_BYTE_28_FL_S
, grh
->flow_label
);
4563 roce_set_field(qpc_mask
->byte_28_at_fl
, V2_QPC_BYTE_28_FL_M
,
4564 V2_QPC_BYTE_28_FL_S
, 0);
4565 memcpy(context
->dgid
, grh
->dgid
.raw
, sizeof(grh
->dgid
.raw
));
4566 memset(qpc_mask
->dgid
, 0, sizeof(grh
->dgid
.raw
));
4568 hr_qp
->sl
= rdma_ah_get_sl(&attr
->ah_attr
);
4569 if (unlikely(hr_qp
->sl
> MAX_SERVICE_LEVEL
)) {
4571 "failed to fill QPC, sl (%d) shouldn't be larger than %d.\n",
4572 hr_qp
->sl
, MAX_SERVICE_LEVEL
);
4576 roce_set_field(context
->byte_28_at_fl
, V2_QPC_BYTE_28_SL_M
,
4577 V2_QPC_BYTE_28_SL_S
, hr_qp
->sl
);
4578 roce_set_field(qpc_mask
->byte_28_at_fl
, V2_QPC_BYTE_28_SL_M
,
4579 V2_QPC_BYTE_28_SL_S
, 0);
4584 static bool check_qp_state(enum ib_qp_state cur_state
,
4585 enum ib_qp_state new_state
)
4587 static const bool sm
[][IB_QPS_ERR
+ 1] = {
4588 [IB_QPS_RESET
] = { [IB_QPS_RESET
] = true,
4589 [IB_QPS_INIT
] = true },
4590 [IB_QPS_INIT
] = { [IB_QPS_RESET
] = true,
4591 [IB_QPS_INIT
] = true,
4592 [IB_QPS_RTR
] = true,
4593 [IB_QPS_ERR
] = true },
4594 [IB_QPS_RTR
] = { [IB_QPS_RESET
] = true,
4595 [IB_QPS_RTS
] = true,
4596 [IB_QPS_ERR
] = true },
4597 [IB_QPS_RTS
] = { [IB_QPS_RESET
] = true,
4598 [IB_QPS_RTS
] = true,
4599 [IB_QPS_ERR
] = true },
4602 [IB_QPS_ERR
] = { [IB_QPS_RESET
] = true, [IB_QPS_ERR
] = true }
4605 return sm
[cur_state
][new_state
];
4608 static int hns_roce_v2_set_abs_fields(struct ib_qp
*ibqp
,
4609 const struct ib_qp_attr
*attr
,
4611 enum ib_qp_state cur_state
,
4612 enum ib_qp_state new_state
,
4613 struct hns_roce_v2_qp_context
*context
,
4614 struct hns_roce_v2_qp_context
*qpc_mask
)
4616 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
4619 if (!check_qp_state(cur_state
, new_state
)) {
4620 ibdev_err(&hr_dev
->ib_dev
, "Illegal state for QP!\n");
4624 if (cur_state
== IB_QPS_RESET
&& new_state
== IB_QPS_INIT
) {
4625 memset(qpc_mask
, 0, hr_dev
->caps
.qpc_sz
);
4626 modify_qp_reset_to_init(ibqp
, attr
, attr_mask
, context
,
4628 } else if (cur_state
== IB_QPS_INIT
&& new_state
== IB_QPS_INIT
) {
4629 modify_qp_init_to_init(ibqp
, attr
, attr_mask
, context
,
4631 } else if (cur_state
== IB_QPS_INIT
&& new_state
== IB_QPS_RTR
) {
4632 ret
= modify_qp_init_to_rtr(ibqp
, attr
, attr_mask
, context
,
4634 } else if (cur_state
== IB_QPS_RTR
&& new_state
== IB_QPS_RTS
) {
4635 ret
= modify_qp_rtr_to_rts(ibqp
, attr
, attr_mask
, context
,
4642 static int hns_roce_v2_set_opt_fields(struct ib_qp
*ibqp
,
4643 const struct ib_qp_attr
*attr
,
4645 struct hns_roce_v2_qp_context
*context
,
4646 struct hns_roce_v2_qp_context
*qpc_mask
)
4648 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
4649 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
4652 if (attr_mask
& IB_QP_AV
) {
4653 ret
= hns_roce_v2_set_path(ibqp
, attr
, attr_mask
, context
,
4659 if (attr_mask
& IB_QP_TIMEOUT
) {
4660 if (attr
->timeout
< 31) {
4661 roce_set_field(context
->byte_28_at_fl
,
4662 V2_QPC_BYTE_28_AT_M
, V2_QPC_BYTE_28_AT_S
,
4664 roce_set_field(qpc_mask
->byte_28_at_fl
,
4665 V2_QPC_BYTE_28_AT_M
, V2_QPC_BYTE_28_AT_S
,
4668 ibdev_warn(&hr_dev
->ib_dev
,
4669 "Local ACK timeout shall be 0 to 30.\n");
4673 if (attr_mask
& IB_QP_RETRY_CNT
) {
4674 roce_set_field(context
->byte_212_lsn
,
4675 V2_QPC_BYTE_212_RETRY_NUM_INIT_M
,
4676 V2_QPC_BYTE_212_RETRY_NUM_INIT_S
,
4678 roce_set_field(qpc_mask
->byte_212_lsn
,
4679 V2_QPC_BYTE_212_RETRY_NUM_INIT_M
,
4680 V2_QPC_BYTE_212_RETRY_NUM_INIT_S
, 0);
4682 roce_set_field(context
->byte_212_lsn
,
4683 V2_QPC_BYTE_212_RETRY_CNT_M
,
4684 V2_QPC_BYTE_212_RETRY_CNT_S
, attr
->retry_cnt
);
4685 roce_set_field(qpc_mask
->byte_212_lsn
,
4686 V2_QPC_BYTE_212_RETRY_CNT_M
,
4687 V2_QPC_BYTE_212_RETRY_CNT_S
, 0);
4690 if (attr_mask
& IB_QP_RNR_RETRY
) {
4691 roce_set_field(context
->byte_244_rnr_rxack
,
4692 V2_QPC_BYTE_244_RNR_NUM_INIT_M
,
4693 V2_QPC_BYTE_244_RNR_NUM_INIT_S
, attr
->rnr_retry
);
4694 roce_set_field(qpc_mask
->byte_244_rnr_rxack
,
4695 V2_QPC_BYTE_244_RNR_NUM_INIT_M
,
4696 V2_QPC_BYTE_244_RNR_NUM_INIT_S
, 0);
4698 roce_set_field(context
->byte_244_rnr_rxack
,
4699 V2_QPC_BYTE_244_RNR_CNT_M
,
4700 V2_QPC_BYTE_244_RNR_CNT_S
, attr
->rnr_retry
);
4701 roce_set_field(qpc_mask
->byte_244_rnr_rxack
,
4702 V2_QPC_BYTE_244_RNR_CNT_M
,
4703 V2_QPC_BYTE_244_RNR_CNT_S
, 0);
4706 /* RC&UC&UD required attr */
4707 if (attr_mask
& IB_QP_SQ_PSN
) {
4708 roce_set_field(context
->byte_172_sq_psn
,
4709 V2_QPC_BYTE_172_SQ_CUR_PSN_M
,
4710 V2_QPC_BYTE_172_SQ_CUR_PSN_S
, attr
->sq_psn
);
4711 roce_set_field(qpc_mask
->byte_172_sq_psn
,
4712 V2_QPC_BYTE_172_SQ_CUR_PSN_M
,
4713 V2_QPC_BYTE_172_SQ_CUR_PSN_S
, 0);
4715 roce_set_field(context
->byte_196_sq_psn
,
4716 V2_QPC_BYTE_196_SQ_MAX_PSN_M
,
4717 V2_QPC_BYTE_196_SQ_MAX_PSN_S
, attr
->sq_psn
);
4718 roce_set_field(qpc_mask
->byte_196_sq_psn
,
4719 V2_QPC_BYTE_196_SQ_MAX_PSN_M
,
4720 V2_QPC_BYTE_196_SQ_MAX_PSN_S
, 0);
4722 roce_set_field(context
->byte_220_retry_psn_msn
,
4723 V2_QPC_BYTE_220_RETRY_MSG_PSN_M
,
4724 V2_QPC_BYTE_220_RETRY_MSG_PSN_S
, attr
->sq_psn
);
4725 roce_set_field(qpc_mask
->byte_220_retry_psn_msn
,
4726 V2_QPC_BYTE_220_RETRY_MSG_PSN_M
,
4727 V2_QPC_BYTE_220_RETRY_MSG_PSN_S
, 0);
4729 roce_set_field(context
->byte_224_retry_msg
,
4730 V2_QPC_BYTE_224_RETRY_MSG_PSN_M
,
4731 V2_QPC_BYTE_224_RETRY_MSG_PSN_S
,
4732 attr
->sq_psn
>> V2_QPC_BYTE_220_RETRY_MSG_PSN_S
);
4733 roce_set_field(qpc_mask
->byte_224_retry_msg
,
4734 V2_QPC_BYTE_224_RETRY_MSG_PSN_M
,
4735 V2_QPC_BYTE_224_RETRY_MSG_PSN_S
, 0);
4737 roce_set_field(context
->byte_224_retry_msg
,
4738 V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_M
,
4739 V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_S
,
4741 roce_set_field(qpc_mask
->byte_224_retry_msg
,
4742 V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_M
,
4743 V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_S
, 0);
4745 roce_set_field(context
->byte_244_rnr_rxack
,
4746 V2_QPC_BYTE_244_RX_ACK_EPSN_M
,
4747 V2_QPC_BYTE_244_RX_ACK_EPSN_S
, attr
->sq_psn
);
4748 roce_set_field(qpc_mask
->byte_244_rnr_rxack
,
4749 V2_QPC_BYTE_244_RX_ACK_EPSN_M
,
4750 V2_QPC_BYTE_244_RX_ACK_EPSN_S
, 0);
4753 if ((attr_mask
& IB_QP_MAX_DEST_RD_ATOMIC
) &&
4754 attr
->max_dest_rd_atomic
) {
4755 roce_set_field(context
->byte_140_raq
, V2_QPC_BYTE_140_RR_MAX_M
,
4756 V2_QPC_BYTE_140_RR_MAX_S
,
4757 fls(attr
->max_dest_rd_atomic
- 1));
4758 roce_set_field(qpc_mask
->byte_140_raq
, V2_QPC_BYTE_140_RR_MAX_M
,
4759 V2_QPC_BYTE_140_RR_MAX_S
, 0);
4762 if ((attr_mask
& IB_QP_MAX_QP_RD_ATOMIC
) && attr
->max_rd_atomic
) {
4763 roce_set_field(context
->byte_208_irrl
, V2_QPC_BYTE_208_SR_MAX_M
,
4764 V2_QPC_BYTE_208_SR_MAX_S
,
4765 fls(attr
->max_rd_atomic
- 1));
4766 roce_set_field(qpc_mask
->byte_208_irrl
,
4767 V2_QPC_BYTE_208_SR_MAX_M
,
4768 V2_QPC_BYTE_208_SR_MAX_S
, 0);
4771 if (attr_mask
& (IB_QP_ACCESS_FLAGS
| IB_QP_MAX_DEST_RD_ATOMIC
))
4772 set_access_flags(hr_qp
, context
, qpc_mask
, attr
, attr_mask
);
4774 if (attr_mask
& IB_QP_MIN_RNR_TIMER
) {
4775 roce_set_field(context
->byte_80_rnr_rx_cqn
,
4776 V2_QPC_BYTE_80_MIN_RNR_TIME_M
,
4777 V2_QPC_BYTE_80_MIN_RNR_TIME_S
,
4778 attr
->min_rnr_timer
);
4779 roce_set_field(qpc_mask
->byte_80_rnr_rx_cqn
,
4780 V2_QPC_BYTE_80_MIN_RNR_TIME_M
,
4781 V2_QPC_BYTE_80_MIN_RNR_TIME_S
, 0);
4784 /* RC&UC required attr */
4785 if (attr_mask
& IB_QP_RQ_PSN
) {
4786 roce_set_field(context
->byte_108_rx_reqepsn
,
4787 V2_QPC_BYTE_108_RX_REQ_EPSN_M
,
4788 V2_QPC_BYTE_108_RX_REQ_EPSN_S
, attr
->rq_psn
);
4789 roce_set_field(qpc_mask
->byte_108_rx_reqepsn
,
4790 V2_QPC_BYTE_108_RX_REQ_EPSN_M
,
4791 V2_QPC_BYTE_108_RX_REQ_EPSN_S
, 0);
4793 roce_set_field(context
->byte_152_raq
, V2_QPC_BYTE_152_RAQ_PSN_M
,
4794 V2_QPC_BYTE_152_RAQ_PSN_S
, attr
->rq_psn
- 1);
4795 roce_set_field(qpc_mask
->byte_152_raq
,
4796 V2_QPC_BYTE_152_RAQ_PSN_M
,
4797 V2_QPC_BYTE_152_RAQ_PSN_S
, 0);
4800 if (attr_mask
& IB_QP_QKEY
) {
4801 context
->qkey_xrcd
= cpu_to_le32(attr
->qkey
);
4802 qpc_mask
->qkey_xrcd
= 0;
4803 hr_qp
->qkey
= attr
->qkey
;
4809 static void hns_roce_v2_record_opt_fields(struct ib_qp
*ibqp
,
4810 const struct ib_qp_attr
*attr
,
4813 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
4814 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
4816 if (attr_mask
& IB_QP_ACCESS_FLAGS
)
4817 hr_qp
->atomic_rd_en
= attr
->qp_access_flags
;
4819 if (attr_mask
& IB_QP_MAX_DEST_RD_ATOMIC
)
4820 hr_qp
->resp_depth
= attr
->max_dest_rd_atomic
;
4821 if (attr_mask
& IB_QP_PORT
) {
4822 hr_qp
->port
= attr
->port_num
- 1;
4823 hr_qp
->phy_port
= hr_dev
->iboe
.phy_port
[hr_qp
->port
];
4827 static int hns_roce_v2_modify_qp(struct ib_qp
*ibqp
,
4828 const struct ib_qp_attr
*attr
,
4829 int attr_mask
, enum ib_qp_state cur_state
,
4830 enum ib_qp_state new_state
)
4832 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
4833 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
4834 struct hns_roce_v2_qp_context ctx
[2];
4835 struct hns_roce_v2_qp_context
*context
= ctx
;
4836 struct hns_roce_v2_qp_context
*qpc_mask
= ctx
+ 1;
4837 struct ib_device
*ibdev
= &hr_dev
->ib_dev
;
4838 unsigned long sq_flag
= 0;
4839 unsigned long rq_flag
= 0;
4842 if (attr_mask
& ~IB_QP_ATTR_STANDARD_BITS
)
4846 * In v2 engine, software pass context and context mask to hardware
4847 * when modifying qp. If software need modify some fields in context,
4848 * we should set all bits of the relevant fields in context mask to
4849 * 0 at the same time, else set them to 0x1.
4851 memset(context
, 0, hr_dev
->caps
.qpc_sz
);
4852 memset(qpc_mask
, 0xff, hr_dev
->caps
.qpc_sz
);
4854 ret
= hns_roce_v2_set_abs_fields(ibqp
, attr
, attr_mask
, cur_state
,
4855 new_state
, context
, qpc_mask
);
4859 /* When QP state is err, SQ and RQ WQE should be flushed */
4860 if (new_state
== IB_QPS_ERR
) {
4861 spin_lock_irqsave(&hr_qp
->sq
.lock
, sq_flag
);
4862 hr_qp
->state
= IB_QPS_ERR
;
4863 roce_set_field(context
->byte_160_sq_ci_pi
,
4864 V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M
,
4865 V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S
,
4867 roce_set_field(qpc_mask
->byte_160_sq_ci_pi
,
4868 V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M
,
4869 V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S
, 0);
4870 spin_unlock_irqrestore(&hr_qp
->sq
.lock
, sq_flag
);
4873 spin_lock_irqsave(&hr_qp
->rq
.lock
, rq_flag
);
4874 roce_set_field(context
->byte_84_rq_ci_pi
,
4875 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M
,
4876 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S
,
4878 roce_set_field(qpc_mask
->byte_84_rq_ci_pi
,
4879 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M
,
4880 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S
, 0);
4881 spin_unlock_irqrestore(&hr_qp
->rq
.lock
, rq_flag
);
4885 /* Configure the optional fields */
4886 ret
= hns_roce_v2_set_opt_fields(ibqp
, attr
, attr_mask
, context
,
4891 roce_set_bit(context
->byte_108_rx_reqepsn
, V2_QPC_BYTE_108_INV_CREDIT_S
,
4893 roce_set_bit(qpc_mask
->byte_108_rx_reqepsn
,
4894 V2_QPC_BYTE_108_INV_CREDIT_S
, 0);
4896 /* Every status migrate must change state */
4897 roce_set_field(context
->byte_60_qpst_tempid
, V2_QPC_BYTE_60_QP_ST_M
,
4898 V2_QPC_BYTE_60_QP_ST_S
, new_state
);
4899 roce_set_field(qpc_mask
->byte_60_qpst_tempid
, V2_QPC_BYTE_60_QP_ST_M
,
4900 V2_QPC_BYTE_60_QP_ST_S
, 0);
4902 /* SW pass context to HW */
4903 ret
= hns_roce_v2_qp_modify(hr_dev
, context
, qpc_mask
, hr_qp
);
4905 ibdev_err(ibdev
, "failed to modify QP, ret = %d.\n", ret
);
4909 hr_qp
->state
= new_state
;
4911 hns_roce_v2_record_opt_fields(ibqp
, attr
, attr_mask
);
4913 if (new_state
== IB_QPS_RESET
&& !ibqp
->uobject
) {
4914 hns_roce_v2_cq_clean(to_hr_cq(ibqp
->recv_cq
), hr_qp
->qpn
,
4915 ibqp
->srq
? to_hr_srq(ibqp
->srq
) : NULL
);
4916 if (ibqp
->send_cq
!= ibqp
->recv_cq
)
4917 hns_roce_v2_cq_clean(to_hr_cq(ibqp
->send_cq
),
4924 hr_qp
->next_sge
= 0;
4925 if (hr_qp
->rq
.wqe_cnt
)
4926 *hr_qp
->rdb
.db_record
= 0;
4933 static int to_ib_qp_st(enum hns_roce_v2_qp_state state
)
4935 static const enum ib_qp_state map
[] = {
4936 [HNS_ROCE_QP_ST_RST
] = IB_QPS_RESET
,
4937 [HNS_ROCE_QP_ST_INIT
] = IB_QPS_INIT
,
4938 [HNS_ROCE_QP_ST_RTR
] = IB_QPS_RTR
,
4939 [HNS_ROCE_QP_ST_RTS
] = IB_QPS_RTS
,
4940 [HNS_ROCE_QP_ST_SQD
] = IB_QPS_SQD
,
4941 [HNS_ROCE_QP_ST_SQER
] = IB_QPS_SQE
,
4942 [HNS_ROCE_QP_ST_ERR
] = IB_QPS_ERR
,
4943 [HNS_ROCE_QP_ST_SQ_DRAINING
] = IB_QPS_SQD
4946 return (state
< ARRAY_SIZE(map
)) ? map
[state
] : -1;
4949 static int hns_roce_v2_query_qpc(struct hns_roce_dev
*hr_dev
,
4950 struct hns_roce_qp
*hr_qp
,
4951 struct hns_roce_v2_qp_context
*hr_context
)
4953 struct hns_roce_cmd_mailbox
*mailbox
;
4956 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
4957 if (IS_ERR(mailbox
))
4958 return PTR_ERR(mailbox
);
4960 ret
= hns_roce_cmd_mbox(hr_dev
, 0, mailbox
->dma
, hr_qp
->qpn
, 0,
4961 HNS_ROCE_CMD_QUERY_QPC
,
4962 HNS_ROCE_CMD_TIMEOUT_MSECS
);
4966 memcpy(hr_context
, mailbox
->buf
, hr_dev
->caps
.qpc_sz
);
4969 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
4973 static int hns_roce_v2_query_qp(struct ib_qp
*ibqp
, struct ib_qp_attr
*qp_attr
,
4975 struct ib_qp_init_attr
*qp_init_attr
)
4977 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
4978 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
4979 struct hns_roce_v2_qp_context context
= {};
4980 struct ib_device
*ibdev
= &hr_dev
->ib_dev
;
4985 memset(qp_attr
, 0, sizeof(*qp_attr
));
4986 memset(qp_init_attr
, 0, sizeof(*qp_init_attr
));
4988 mutex_lock(&hr_qp
->mutex
);
4990 if (hr_qp
->state
== IB_QPS_RESET
) {
4991 qp_attr
->qp_state
= IB_QPS_RESET
;
4996 ret
= hns_roce_v2_query_qpc(hr_dev
, hr_qp
, &context
);
4998 ibdev_err(ibdev
, "failed to query QPC, ret = %d.\n", ret
);
5003 state
= roce_get_field(context
.byte_60_qpst_tempid
,
5004 V2_QPC_BYTE_60_QP_ST_M
, V2_QPC_BYTE_60_QP_ST_S
);
5005 tmp_qp_state
= to_ib_qp_st((enum hns_roce_v2_qp_state
)state
);
5006 if (tmp_qp_state
== -1) {
5007 ibdev_err(ibdev
, "Illegal ib_qp_state\n");
5011 hr_qp
->state
= (u8
)tmp_qp_state
;
5012 qp_attr
->qp_state
= (enum ib_qp_state
)hr_qp
->state
;
5013 qp_attr
->path_mtu
= (enum ib_mtu
)roce_get_field(context
.byte_24_mtu_tc
,
5014 V2_QPC_BYTE_24_MTU_M
,
5015 V2_QPC_BYTE_24_MTU_S
);
5016 qp_attr
->path_mig_state
= IB_MIG_ARMED
;
5017 qp_attr
->ah_attr
.type
= RDMA_AH_ATTR_TYPE_ROCE
;
5018 if (hr_qp
->ibqp
.qp_type
== IB_QPT_UD
)
5019 qp_attr
->qkey
= le32_to_cpu(context
.qkey_xrcd
);
5021 qp_attr
->rq_psn
= roce_get_field(context
.byte_108_rx_reqepsn
,
5022 V2_QPC_BYTE_108_RX_REQ_EPSN_M
,
5023 V2_QPC_BYTE_108_RX_REQ_EPSN_S
);
5024 qp_attr
->sq_psn
= (u32
)roce_get_field(context
.byte_172_sq_psn
,
5025 V2_QPC_BYTE_172_SQ_CUR_PSN_M
,
5026 V2_QPC_BYTE_172_SQ_CUR_PSN_S
);
5027 qp_attr
->dest_qp_num
= (u8
)roce_get_field(context
.byte_56_dqpn_err
,
5028 V2_QPC_BYTE_56_DQPN_M
,
5029 V2_QPC_BYTE_56_DQPN_S
);
5030 qp_attr
->qp_access_flags
= ((roce_get_bit(context
.byte_76_srqn_op_en
,
5031 V2_QPC_BYTE_76_RRE_S
)) << V2_QP_RRE_S
) |
5032 ((roce_get_bit(context
.byte_76_srqn_op_en
,
5033 V2_QPC_BYTE_76_RWE_S
)) << V2_QP_RWE_S
) |
5034 ((roce_get_bit(context
.byte_76_srqn_op_en
,
5035 V2_QPC_BYTE_76_ATE_S
)) << V2_QP_ATE_S
);
5037 if (hr_qp
->ibqp
.qp_type
== IB_QPT_RC
||
5038 hr_qp
->ibqp
.qp_type
== IB_QPT_UC
) {
5039 struct ib_global_route
*grh
=
5040 rdma_ah_retrieve_grh(&qp_attr
->ah_attr
);
5042 rdma_ah_set_sl(&qp_attr
->ah_attr
,
5043 roce_get_field(context
.byte_28_at_fl
,
5044 V2_QPC_BYTE_28_SL_M
,
5045 V2_QPC_BYTE_28_SL_S
));
5046 grh
->flow_label
= roce_get_field(context
.byte_28_at_fl
,
5047 V2_QPC_BYTE_28_FL_M
,
5048 V2_QPC_BYTE_28_FL_S
);
5049 grh
->sgid_index
= roce_get_field(context
.byte_20_smac_sgid_idx
,
5050 V2_QPC_BYTE_20_SGID_IDX_M
,
5051 V2_QPC_BYTE_20_SGID_IDX_S
);
5052 grh
->hop_limit
= roce_get_field(context
.byte_24_mtu_tc
,
5053 V2_QPC_BYTE_24_HOP_LIMIT_M
,
5054 V2_QPC_BYTE_24_HOP_LIMIT_S
);
5055 grh
->traffic_class
= roce_get_field(context
.byte_24_mtu_tc
,
5056 V2_QPC_BYTE_24_TC_M
,
5057 V2_QPC_BYTE_24_TC_S
);
5059 memcpy(grh
->dgid
.raw
, context
.dgid
, sizeof(grh
->dgid
.raw
));
5062 qp_attr
->port_num
= hr_qp
->port
+ 1;
5063 qp_attr
->sq_draining
= 0;
5064 qp_attr
->max_rd_atomic
= 1 << roce_get_field(context
.byte_208_irrl
,
5065 V2_QPC_BYTE_208_SR_MAX_M
,
5066 V2_QPC_BYTE_208_SR_MAX_S
);
5067 qp_attr
->max_dest_rd_atomic
= 1 << roce_get_field(context
.byte_140_raq
,
5068 V2_QPC_BYTE_140_RR_MAX_M
,
5069 V2_QPC_BYTE_140_RR_MAX_S
);
5070 qp_attr
->min_rnr_timer
= (u8
)roce_get_field(context
.byte_80_rnr_rx_cqn
,
5071 V2_QPC_BYTE_80_MIN_RNR_TIME_M
,
5072 V2_QPC_BYTE_80_MIN_RNR_TIME_S
);
5073 qp_attr
->timeout
= (u8
)roce_get_field(context
.byte_28_at_fl
,
5074 V2_QPC_BYTE_28_AT_M
,
5075 V2_QPC_BYTE_28_AT_S
);
5076 qp_attr
->retry_cnt
= roce_get_field(context
.byte_212_lsn
,
5077 V2_QPC_BYTE_212_RETRY_NUM_INIT_M
,
5078 V2_QPC_BYTE_212_RETRY_NUM_INIT_S
);
5079 qp_attr
->rnr_retry
= roce_get_field(context
.byte_244_rnr_rxack
,
5080 V2_QPC_BYTE_244_RNR_NUM_INIT_M
,
5081 V2_QPC_BYTE_244_RNR_NUM_INIT_S
);
5084 qp_attr
->cur_qp_state
= qp_attr
->qp_state
;
5085 qp_attr
->cap
.max_recv_wr
= hr_qp
->rq
.wqe_cnt
;
5086 qp_attr
->cap
.max_recv_sge
= hr_qp
->rq
.max_gs
;
5088 if (!ibqp
->uobject
) {
5089 qp_attr
->cap
.max_send_wr
= hr_qp
->sq
.wqe_cnt
;
5090 qp_attr
->cap
.max_send_sge
= hr_qp
->sq
.max_gs
;
5092 qp_attr
->cap
.max_send_wr
= 0;
5093 qp_attr
->cap
.max_send_sge
= 0;
5096 qp_init_attr
->cap
= qp_attr
->cap
;
5097 qp_init_attr
->sq_sig_type
= hr_qp
->sq_signal_bits
;
5100 mutex_unlock(&hr_qp
->mutex
);
5104 static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev
*hr_dev
,
5105 struct hns_roce_qp
*hr_qp
,
5106 struct ib_udata
*udata
)
5108 struct ib_device
*ibdev
= &hr_dev
->ib_dev
;
5109 struct hns_roce_cq
*send_cq
, *recv_cq
;
5110 unsigned long flags
;
5113 if ((hr_qp
->ibqp
.qp_type
== IB_QPT_RC
||
5114 hr_qp
->ibqp
.qp_type
== IB_QPT_UD
) &&
5115 hr_qp
->state
!= IB_QPS_RESET
) {
5116 /* Modify qp to reset before destroying qp */
5117 ret
= hns_roce_v2_modify_qp(&hr_qp
->ibqp
, NULL
, 0,
5118 hr_qp
->state
, IB_QPS_RESET
);
5121 "failed to modify QP to RST, ret = %d.\n",
5125 send_cq
= hr_qp
->ibqp
.send_cq
? to_hr_cq(hr_qp
->ibqp
.send_cq
) : NULL
;
5126 recv_cq
= hr_qp
->ibqp
.recv_cq
? to_hr_cq(hr_qp
->ibqp
.recv_cq
) : NULL
;
5128 spin_lock_irqsave(&hr_dev
->qp_list_lock
, flags
);
5129 hns_roce_lock_cqs(send_cq
, recv_cq
);
5133 __hns_roce_v2_cq_clean(recv_cq
, hr_qp
->qpn
,
5135 to_hr_srq(hr_qp
->ibqp
.srq
) :
5138 if (send_cq
&& send_cq
!= recv_cq
)
5139 __hns_roce_v2_cq_clean(send_cq
, hr_qp
->qpn
, NULL
);
5143 hns_roce_qp_remove(hr_dev
, hr_qp
);
5145 hns_roce_unlock_cqs(send_cq
, recv_cq
);
5146 spin_unlock_irqrestore(&hr_dev
->qp_list_lock
, flags
);
5151 static int hns_roce_v2_destroy_qp(struct ib_qp
*ibqp
, struct ib_udata
*udata
)
5153 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
5154 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
5157 ret
= hns_roce_v2_destroy_qp_common(hr_dev
, hr_qp
, udata
);
5159 ibdev_err(&hr_dev
->ib_dev
,
5160 "failed to destroy QP, QPN = 0x%06lx, ret = %d.\n",
5163 hns_roce_qp_destroy(hr_dev
, hr_qp
, udata
);
5168 static int hns_roce_v2_qp_flow_control_init(struct hns_roce_dev
*hr_dev
,
5169 struct hns_roce_qp
*hr_qp
)
5171 struct ib_device
*ibdev
= &hr_dev
->ib_dev
;
5172 struct hns_roce_sccc_clr_done
*resp
;
5173 struct hns_roce_sccc_clr
*clr
;
5174 struct hns_roce_cmq_desc desc
;
5177 mutex_lock(&hr_dev
->qp_table
.scc_mutex
);
5179 /* set scc ctx clear done flag */
5180 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_RESET_SCCC
, false);
5181 ret
= hns_roce_cmq_send(hr_dev
, &desc
, 1);
5183 ibdev_err(ibdev
, "failed to reset SCC ctx, ret = %d.\n", ret
);
5187 /* clear scc context */
5188 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_CLR_SCCC
, false);
5189 clr
= (struct hns_roce_sccc_clr
*)desc
.data
;
5190 clr
->qpn
= cpu_to_le32(hr_qp
->qpn
);
5191 ret
= hns_roce_cmq_send(hr_dev
, &desc
, 1);
5193 ibdev_err(ibdev
, "failed to clear SCC ctx, ret = %d.\n", ret
);
5197 /* query scc context clear is done or not */
5198 resp
= (struct hns_roce_sccc_clr_done
*)desc
.data
;
5199 for (i
= 0; i
<= HNS_ROCE_CMQ_SCC_CLR_DONE_CNT
; i
++) {
5200 hns_roce_cmq_setup_basic_desc(&desc
,
5201 HNS_ROCE_OPC_QUERY_SCCC
, true);
5202 ret
= hns_roce_cmq_send(hr_dev
, &desc
, 1);
5204 ibdev_err(ibdev
, "failed to query clr cmq, ret = %d\n",
5215 ibdev_err(ibdev
, "Query SCC clr done flag overtime.\n");
5219 mutex_unlock(&hr_dev
->qp_table
.scc_mutex
);
5223 static void hns_roce_v2_write_srqc(struct hns_roce_dev
*hr_dev
,
5224 struct hns_roce_srq
*srq
, u32 pdn
, u16 xrcd
,
5225 u32 cqn
, void *mb_buf
, u64
*mtts_wqe
,
5226 u64
*mtts_idx
, dma_addr_t dma_handle_wqe
,
5227 dma_addr_t dma_handle_idx
)
5229 struct hns_roce_srq_context
*srq_context
;
5231 srq_context
= mb_buf
;
5232 memset(srq_context
, 0, sizeof(*srq_context
));
5234 roce_set_field(srq_context
->byte_4_srqn_srqst
, SRQC_BYTE_4_SRQ_ST_M
,
5235 SRQC_BYTE_4_SRQ_ST_S
, 1);
5237 roce_set_field(srq_context
->byte_4_srqn_srqst
,
5238 SRQC_BYTE_4_SRQ_WQE_HOP_NUM_M
,
5239 SRQC_BYTE_4_SRQ_WQE_HOP_NUM_S
,
5240 to_hr_hem_hopnum(hr_dev
->caps
.srqwqe_hop_num
,
5242 roce_set_field(srq_context
->byte_4_srqn_srqst
,
5243 SRQC_BYTE_4_SRQ_SHIFT_M
, SRQC_BYTE_4_SRQ_SHIFT_S
,
5244 ilog2(srq
->wqe_cnt
));
5246 roce_set_field(srq_context
->byte_4_srqn_srqst
, SRQC_BYTE_4_SRQN_M
,
5247 SRQC_BYTE_4_SRQN_S
, srq
->srqn
);
5249 roce_set_field(srq_context
->byte_8_limit_wl
, SRQC_BYTE_8_SRQ_LIMIT_WL_M
,
5250 SRQC_BYTE_8_SRQ_LIMIT_WL_S
, 0);
5252 roce_set_field(srq_context
->byte_12_xrcd
, SRQC_BYTE_12_SRQ_XRCD_M
,
5253 SRQC_BYTE_12_SRQ_XRCD_S
, xrcd
);
5255 srq_context
->wqe_bt_ba
= cpu_to_le32((u32
)(dma_handle_wqe
>> 3));
5257 roce_set_field(srq_context
->byte_24_wqe_bt_ba
,
5258 SRQC_BYTE_24_SRQ_WQE_BT_BA_M
,
5259 SRQC_BYTE_24_SRQ_WQE_BT_BA_S
,
5260 dma_handle_wqe
>> 35);
5262 roce_set_field(srq_context
->byte_28_rqws_pd
, SRQC_BYTE_28_PD_M
,
5263 SRQC_BYTE_28_PD_S
, pdn
);
5264 roce_set_field(srq_context
->byte_28_rqws_pd
, SRQC_BYTE_28_RQWS_M
,
5265 SRQC_BYTE_28_RQWS_S
, srq
->max_gs
<= 0 ? 0 :
5266 fls(srq
->max_gs
- 1));
5268 srq_context
->idx_bt_ba
= cpu_to_le32(dma_handle_idx
>> 3);
5269 roce_set_field(srq_context
->rsv_idx_bt_ba
,
5270 SRQC_BYTE_36_SRQ_IDX_BT_BA_M
,
5271 SRQC_BYTE_36_SRQ_IDX_BT_BA_S
,
5272 dma_handle_idx
>> 35);
5274 srq_context
->idx_cur_blk_addr
=
5275 cpu_to_le32(to_hr_hw_page_addr(mtts_idx
[0]));
5276 roce_set_field(srq_context
->byte_44_idxbufpgsz_addr
,
5277 SRQC_BYTE_44_SRQ_IDX_CUR_BLK_ADDR_M
,
5278 SRQC_BYTE_44_SRQ_IDX_CUR_BLK_ADDR_S
,
5279 upper_32_bits(to_hr_hw_page_addr(mtts_idx
[0])));
5280 roce_set_field(srq_context
->byte_44_idxbufpgsz_addr
,
5281 SRQC_BYTE_44_SRQ_IDX_HOP_NUM_M
,
5282 SRQC_BYTE_44_SRQ_IDX_HOP_NUM_S
,
5283 to_hr_hem_hopnum(hr_dev
->caps
.idx_hop_num
,
5286 roce_set_field(srq_context
->byte_44_idxbufpgsz_addr
,
5287 SRQC_BYTE_44_SRQ_IDX_BA_PG_SZ_M
,
5288 SRQC_BYTE_44_SRQ_IDX_BA_PG_SZ_S
,
5289 to_hr_hw_page_shift(srq
->idx_que
.mtr
.hem_cfg
.ba_pg_shift
));
5290 roce_set_field(srq_context
->byte_44_idxbufpgsz_addr
,
5291 SRQC_BYTE_44_SRQ_IDX_BUF_PG_SZ_M
,
5292 SRQC_BYTE_44_SRQ_IDX_BUF_PG_SZ_S
,
5293 to_hr_hw_page_shift(srq
->idx_que
.mtr
.hem_cfg
.buf_pg_shift
));
5295 srq_context
->idx_nxt_blk_addr
=
5296 cpu_to_le32(to_hr_hw_page_addr(mtts_idx
[1]));
5297 roce_set_field(srq_context
->rsv_idxnxtblkaddr
,
5298 SRQC_BYTE_52_SRQ_IDX_NXT_BLK_ADDR_M
,
5299 SRQC_BYTE_52_SRQ_IDX_NXT_BLK_ADDR_S
,
5300 upper_32_bits(to_hr_hw_page_addr(mtts_idx
[1])));
5301 roce_set_field(srq_context
->byte_56_xrc_cqn
,
5302 SRQC_BYTE_56_SRQ_XRC_CQN_M
, SRQC_BYTE_56_SRQ_XRC_CQN_S
,
5304 roce_set_field(srq_context
->byte_56_xrc_cqn
,
5305 SRQC_BYTE_56_SRQ_WQE_BA_PG_SZ_M
,
5306 SRQC_BYTE_56_SRQ_WQE_BA_PG_SZ_S
,
5307 to_hr_hw_page_shift(srq
->buf_mtr
.hem_cfg
.ba_pg_shift
));
5308 roce_set_field(srq_context
->byte_56_xrc_cqn
,
5309 SRQC_BYTE_56_SRQ_WQE_BUF_PG_SZ_M
,
5310 SRQC_BYTE_56_SRQ_WQE_BUF_PG_SZ_S
,
5311 to_hr_hw_page_shift(srq
->buf_mtr
.hem_cfg
.buf_pg_shift
));
5313 roce_set_bit(srq_context
->db_record_addr_record_en
,
5314 SRQC_BYTE_60_SRQ_RECORD_EN_S
, 0);
5317 static int hns_roce_v2_modify_srq(struct ib_srq
*ibsrq
,
5318 struct ib_srq_attr
*srq_attr
,
5319 enum ib_srq_attr_mask srq_attr_mask
,
5320 struct ib_udata
*udata
)
5322 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibsrq
->device
);
5323 struct hns_roce_srq
*srq
= to_hr_srq(ibsrq
);
5324 struct hns_roce_srq_context
*srq_context
;
5325 struct hns_roce_srq_context
*srqc_mask
;
5326 struct hns_roce_cmd_mailbox
*mailbox
;
5329 /* Resizing SRQs is not supported yet */
5330 if (srq_attr_mask
& IB_SRQ_MAX_WR
)
5333 if (srq_attr_mask
& IB_SRQ_LIMIT
) {
5334 if (srq_attr
->srq_limit
>= srq
->wqe_cnt
)
5337 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
5338 if (IS_ERR(mailbox
))
5339 return PTR_ERR(mailbox
);
5341 srq_context
= mailbox
->buf
;
5342 srqc_mask
= (struct hns_roce_srq_context
*)mailbox
->buf
+ 1;
5344 memset(srqc_mask
, 0xff, sizeof(*srqc_mask
));
5346 roce_set_field(srq_context
->byte_8_limit_wl
,
5347 SRQC_BYTE_8_SRQ_LIMIT_WL_M
,
5348 SRQC_BYTE_8_SRQ_LIMIT_WL_S
, srq_attr
->srq_limit
);
5349 roce_set_field(srqc_mask
->byte_8_limit_wl
,
5350 SRQC_BYTE_8_SRQ_LIMIT_WL_M
,
5351 SRQC_BYTE_8_SRQ_LIMIT_WL_S
, 0);
5353 ret
= hns_roce_cmd_mbox(hr_dev
, mailbox
->dma
, 0, srq
->srqn
, 0,
5354 HNS_ROCE_CMD_MODIFY_SRQC
,
5355 HNS_ROCE_CMD_TIMEOUT_MSECS
);
5356 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
5358 ibdev_err(&hr_dev
->ib_dev
,
5359 "failed to handle cmd of modifying SRQ, ret = %d.\n",
5368 static int hns_roce_v2_query_srq(struct ib_srq
*ibsrq
, struct ib_srq_attr
*attr
)
5370 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibsrq
->device
);
5371 struct hns_roce_srq
*srq
= to_hr_srq(ibsrq
);
5372 struct hns_roce_srq_context
*srq_context
;
5373 struct hns_roce_cmd_mailbox
*mailbox
;
5377 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
5378 if (IS_ERR(mailbox
))
5379 return PTR_ERR(mailbox
);
5381 srq_context
= mailbox
->buf
;
5382 ret
= hns_roce_cmd_mbox(hr_dev
, 0, mailbox
->dma
, srq
->srqn
, 0,
5383 HNS_ROCE_CMD_QUERY_SRQC
,
5384 HNS_ROCE_CMD_TIMEOUT_MSECS
);
5386 ibdev_err(&hr_dev
->ib_dev
,
5387 "failed to process cmd of querying SRQ, ret = %d.\n",
5392 limit_wl
= roce_get_field(srq_context
->byte_8_limit_wl
,
5393 SRQC_BYTE_8_SRQ_LIMIT_WL_M
,
5394 SRQC_BYTE_8_SRQ_LIMIT_WL_S
);
5396 attr
->srq_limit
= limit_wl
;
5397 attr
->max_wr
= srq
->wqe_cnt
- 1;
5398 attr
->max_sge
= srq
->max_gs
;
5401 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
5405 static int hns_roce_v2_modify_cq(struct ib_cq
*cq
, u16 cq_count
, u16 cq_period
)
5407 struct hns_roce_dev
*hr_dev
= to_hr_dev(cq
->device
);
5408 struct hns_roce_v2_cq_context
*cq_context
;
5409 struct hns_roce_cq
*hr_cq
= to_hr_cq(cq
);
5410 struct hns_roce_v2_cq_context
*cqc_mask
;
5411 struct hns_roce_cmd_mailbox
*mailbox
;
5414 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
5415 if (IS_ERR(mailbox
))
5416 return PTR_ERR(mailbox
);
5418 cq_context
= mailbox
->buf
;
5419 cqc_mask
= (struct hns_roce_v2_cq_context
*)mailbox
->buf
+ 1;
5421 memset(cqc_mask
, 0xff, sizeof(*cqc_mask
));
5423 roce_set_field(cq_context
->byte_56_cqe_period_maxcnt
,
5424 V2_CQC_BYTE_56_CQ_MAX_CNT_M
, V2_CQC_BYTE_56_CQ_MAX_CNT_S
,
5426 roce_set_field(cqc_mask
->byte_56_cqe_period_maxcnt
,
5427 V2_CQC_BYTE_56_CQ_MAX_CNT_M
, V2_CQC_BYTE_56_CQ_MAX_CNT_S
,
5429 roce_set_field(cq_context
->byte_56_cqe_period_maxcnt
,
5430 V2_CQC_BYTE_56_CQ_PERIOD_M
, V2_CQC_BYTE_56_CQ_PERIOD_S
,
5432 roce_set_field(cqc_mask
->byte_56_cqe_period_maxcnt
,
5433 V2_CQC_BYTE_56_CQ_PERIOD_M
, V2_CQC_BYTE_56_CQ_PERIOD_S
,
5436 ret
= hns_roce_cmd_mbox(hr_dev
, mailbox
->dma
, 0, hr_cq
->cqn
, 1,
5437 HNS_ROCE_CMD_MODIFY_CQC
,
5438 HNS_ROCE_CMD_TIMEOUT_MSECS
);
5439 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
5441 ibdev_err(&hr_dev
->ib_dev
,
5442 "failed to process cmd when modifying CQ, ret = %d.\n",
5448 static void hns_roce_irq_work_handle(struct work_struct
*work
)
5450 struct hns_roce_work
*irq_work
=
5451 container_of(work
, struct hns_roce_work
, work
);
5452 struct ib_device
*ibdev
= &irq_work
->hr_dev
->ib_dev
;
5454 switch (irq_work
->event_type
) {
5455 case HNS_ROCE_EVENT_TYPE_PATH_MIG
:
5456 ibdev_info(ibdev
, "Path migrated succeeded.\n");
5458 case HNS_ROCE_EVENT_TYPE_PATH_MIG_FAILED
:
5459 ibdev_warn(ibdev
, "Path migration failed.\n");
5461 case HNS_ROCE_EVENT_TYPE_COMM_EST
:
5463 case HNS_ROCE_EVENT_TYPE_SQ_DRAINED
:
5464 ibdev_warn(ibdev
, "Send queue drained.\n");
5466 case HNS_ROCE_EVENT_TYPE_WQ_CATAS_ERROR
:
5467 ibdev_err(ibdev
, "Local work queue 0x%x catast error, sub_event type is: %d\n",
5468 irq_work
->queue_num
, irq_work
->sub_type
);
5470 case HNS_ROCE_EVENT_TYPE_INV_REQ_LOCAL_WQ_ERROR
:
5471 ibdev_err(ibdev
, "Invalid request local work queue 0x%x error.\n",
5472 irq_work
->queue_num
);
5474 case HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR
:
5475 ibdev_err(ibdev
, "Local access violation work queue 0x%x error, sub_event type is: %d\n",
5476 irq_work
->queue_num
, irq_work
->sub_type
);
5478 case HNS_ROCE_EVENT_TYPE_SRQ_LIMIT_REACH
:
5479 ibdev_warn(ibdev
, "SRQ limit reach.\n");
5481 case HNS_ROCE_EVENT_TYPE_SRQ_LAST_WQE_REACH
:
5482 ibdev_warn(ibdev
, "SRQ last wqe reach.\n");
5484 case HNS_ROCE_EVENT_TYPE_SRQ_CATAS_ERROR
:
5485 ibdev_err(ibdev
, "SRQ catas error.\n");
5487 case HNS_ROCE_EVENT_TYPE_CQ_ACCESS_ERROR
:
5488 ibdev_err(ibdev
, "CQ 0x%x access err.\n", irq_work
->queue_num
);
5490 case HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW
:
5491 ibdev_warn(ibdev
, "CQ 0x%x overflow\n", irq_work
->queue_num
);
5493 case HNS_ROCE_EVENT_TYPE_DB_OVERFLOW
:
5494 ibdev_warn(ibdev
, "DB overflow.\n");
5496 case HNS_ROCE_EVENT_TYPE_FLR
:
5497 ibdev_warn(ibdev
, "Function level reset.\n");
5506 static void hns_roce_v2_init_irq_work(struct hns_roce_dev
*hr_dev
,
5507 struct hns_roce_eq
*eq
, u32 queue_num
)
5509 struct hns_roce_work
*irq_work
;
5511 irq_work
= kzalloc(sizeof(struct hns_roce_work
), GFP_ATOMIC
);
5515 INIT_WORK(&(irq_work
->work
), hns_roce_irq_work_handle
);
5516 irq_work
->hr_dev
= hr_dev
;
5517 irq_work
->event_type
= eq
->event_type
;
5518 irq_work
->sub_type
= eq
->sub_type
;
5519 irq_work
->queue_num
= queue_num
;
5520 queue_work(hr_dev
->irq_workq
, &(irq_work
->work
));
5523 static void set_eq_cons_index_v2(struct hns_roce_eq
*eq
)
5525 struct hns_roce_dev
*hr_dev
= eq
->hr_dev
;
5526 __le32 doorbell
[2] = {};
5528 if (eq
->type_flag
== HNS_ROCE_AEQ
) {
5529 roce_set_field(doorbell
[0], HNS_ROCE_V2_EQ_DB_CMD_M
,
5530 HNS_ROCE_V2_EQ_DB_CMD_S
,
5531 eq
->arm_st
== HNS_ROCE_V2_EQ_ALWAYS_ARMED
?
5532 HNS_ROCE_EQ_DB_CMD_AEQ
:
5533 HNS_ROCE_EQ_DB_CMD_AEQ_ARMED
);
5535 roce_set_field(doorbell
[0], HNS_ROCE_V2_EQ_DB_TAG_M
,
5536 HNS_ROCE_V2_EQ_DB_TAG_S
, eq
->eqn
);
5538 roce_set_field(doorbell
[0], HNS_ROCE_V2_EQ_DB_CMD_M
,
5539 HNS_ROCE_V2_EQ_DB_CMD_S
,
5540 eq
->arm_st
== HNS_ROCE_V2_EQ_ALWAYS_ARMED
?
5541 HNS_ROCE_EQ_DB_CMD_CEQ
:
5542 HNS_ROCE_EQ_DB_CMD_CEQ_ARMED
);
5545 roce_set_field(doorbell
[1], HNS_ROCE_V2_EQ_DB_PARA_M
,
5546 HNS_ROCE_V2_EQ_DB_PARA_S
,
5547 (eq
->cons_index
& HNS_ROCE_V2_CONS_IDX_M
));
5549 hns_roce_write64(hr_dev
, doorbell
, eq
->doorbell
);
5552 static struct hns_roce_aeqe
*next_aeqe_sw_v2(struct hns_roce_eq
*eq
)
5554 struct hns_roce_aeqe
*aeqe
;
5556 aeqe
= hns_roce_buf_offset(eq
->mtr
.kmem
,
5557 (eq
->cons_index
& (eq
->entries
- 1)) *
5560 return (roce_get_bit(aeqe
->asyn
, HNS_ROCE_V2_AEQ_AEQE_OWNER_S
) ^
5561 !!(eq
->cons_index
& eq
->entries
)) ? aeqe
: NULL
;
5564 static int hns_roce_v2_aeq_int(struct hns_roce_dev
*hr_dev
,
5565 struct hns_roce_eq
*eq
)
5567 struct device
*dev
= hr_dev
->dev
;
5568 struct hns_roce_aeqe
*aeqe
= next_aeqe_sw_v2(eq
);
5575 /* Make sure we read AEQ entry after we have checked the
5580 event_type
= roce_get_field(aeqe
->asyn
,
5581 HNS_ROCE_V2_AEQE_EVENT_TYPE_M
,
5582 HNS_ROCE_V2_AEQE_EVENT_TYPE_S
);
5583 sub_type
= roce_get_field(aeqe
->asyn
,
5584 HNS_ROCE_V2_AEQE_SUB_TYPE_M
,
5585 HNS_ROCE_V2_AEQE_SUB_TYPE_S
);
5586 queue_num
= roce_get_field(aeqe
->event
.queue_event
.num
,
5587 HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_M
,
5588 HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_S
);
5590 switch (event_type
) {
5591 case HNS_ROCE_EVENT_TYPE_PATH_MIG
:
5592 case HNS_ROCE_EVENT_TYPE_PATH_MIG_FAILED
:
5593 case HNS_ROCE_EVENT_TYPE_COMM_EST
:
5594 case HNS_ROCE_EVENT_TYPE_SQ_DRAINED
:
5595 case HNS_ROCE_EVENT_TYPE_WQ_CATAS_ERROR
:
5596 case HNS_ROCE_EVENT_TYPE_SRQ_LAST_WQE_REACH
:
5597 case HNS_ROCE_EVENT_TYPE_INV_REQ_LOCAL_WQ_ERROR
:
5598 case HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR
:
5599 hns_roce_qp_event(hr_dev
, queue_num
, event_type
);
5601 case HNS_ROCE_EVENT_TYPE_SRQ_LIMIT_REACH
:
5602 case HNS_ROCE_EVENT_TYPE_SRQ_CATAS_ERROR
:
5603 hns_roce_srq_event(hr_dev
, queue_num
, event_type
);
5605 case HNS_ROCE_EVENT_TYPE_CQ_ACCESS_ERROR
:
5606 case HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW
:
5607 hns_roce_cq_event(hr_dev
, queue_num
, event_type
);
5609 case HNS_ROCE_EVENT_TYPE_MB
:
5610 hns_roce_cmd_event(hr_dev
,
5611 le16_to_cpu(aeqe
->event
.cmd
.token
),
5612 aeqe
->event
.cmd
.status
,
5613 le64_to_cpu(aeqe
->event
.cmd
.out_param
));
5615 case HNS_ROCE_EVENT_TYPE_DB_OVERFLOW
:
5616 case HNS_ROCE_EVENT_TYPE_FLR
:
5619 dev_err(dev
, "Unhandled event %d on EQ %d at idx %u.\n",
5620 event_type
, eq
->eqn
, eq
->cons_index
);
5624 eq
->event_type
= event_type
;
5625 eq
->sub_type
= sub_type
;
5629 if (eq
->cons_index
> (2 * eq
->entries
- 1))
5632 hns_roce_v2_init_irq_work(hr_dev
, eq
, queue_num
);
5634 aeqe
= next_aeqe_sw_v2(eq
);
5637 set_eq_cons_index_v2(eq
);
5641 static struct hns_roce_ceqe
*next_ceqe_sw_v2(struct hns_roce_eq
*eq
)
5643 struct hns_roce_ceqe
*ceqe
;
5645 ceqe
= hns_roce_buf_offset(eq
->mtr
.kmem
,
5646 (eq
->cons_index
& (eq
->entries
- 1)) *
5649 return (!!(roce_get_bit(ceqe
->comp
, HNS_ROCE_V2_CEQ_CEQE_OWNER_S
))) ^
5650 (!!(eq
->cons_index
& eq
->entries
)) ? ceqe
: NULL
;
5653 static int hns_roce_v2_ceq_int(struct hns_roce_dev
*hr_dev
,
5654 struct hns_roce_eq
*eq
)
5656 struct hns_roce_ceqe
*ceqe
= next_ceqe_sw_v2(eq
);
5661 /* Make sure we read CEQ entry after we have checked the
5666 cqn
= roce_get_field(ceqe
->comp
, HNS_ROCE_V2_CEQE_COMP_CQN_M
,
5667 HNS_ROCE_V2_CEQE_COMP_CQN_S
);
5669 hns_roce_cq_completion(hr_dev
, cqn
);
5674 if (eq
->cons_index
> (EQ_DEPTH_COEFF
* eq
->entries
- 1))
5677 ceqe
= next_ceqe_sw_v2(eq
);
5680 set_eq_cons_index_v2(eq
);
5685 static irqreturn_t
hns_roce_v2_msix_interrupt_eq(int irq
, void *eq_ptr
)
5687 struct hns_roce_eq
*eq
= eq_ptr
;
5688 struct hns_roce_dev
*hr_dev
= eq
->hr_dev
;
5691 if (eq
->type_flag
== HNS_ROCE_CEQ
)
5692 /* Completion event interrupt */
5693 int_work
= hns_roce_v2_ceq_int(hr_dev
, eq
);
5695 /* Asychronous event interrupt */
5696 int_work
= hns_roce_v2_aeq_int(hr_dev
, eq
);
5698 return IRQ_RETVAL(int_work
);
5701 static irqreturn_t
hns_roce_v2_msix_interrupt_abn(int irq
, void *dev_id
)
5703 struct hns_roce_dev
*hr_dev
= dev_id
;
5704 struct device
*dev
= hr_dev
->dev
;
5709 /* Abnormal interrupt */
5710 int_st
= roce_read(hr_dev
, ROCEE_VF_ABN_INT_ST_REG
);
5711 int_en
= roce_read(hr_dev
, ROCEE_VF_ABN_INT_EN_REG
);
5713 if (int_st
& BIT(HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S
)) {
5714 struct pci_dev
*pdev
= hr_dev
->pci_dev
;
5715 struct hnae3_ae_dev
*ae_dev
= pci_get_drvdata(pdev
);
5716 const struct hnae3_ae_ops
*ops
= ae_dev
->ops
;
5718 dev_err(dev
, "AEQ overflow!\n");
5720 int_st
|= 1 << HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S
;
5721 roce_write(hr_dev
, ROCEE_VF_ABN_INT_ST_REG
, int_st
);
5723 /* Set reset level for reset_event() */
5724 if (ops
->set_default_reset_request
)
5725 ops
->set_default_reset_request(ae_dev
,
5727 if (ops
->reset_event
)
5728 ops
->reset_event(pdev
, NULL
);
5730 int_en
|= 1 << HNS_ROCE_V2_VF_ABN_INT_EN_S
;
5731 roce_write(hr_dev
, ROCEE_VF_ABN_INT_EN_REG
, int_en
);
5734 } else if (int_st
& BIT(HNS_ROCE_V2_VF_INT_ST_BUS_ERR_S
)) {
5735 dev_err(dev
, "BUS ERR!\n");
5737 int_st
|= 1 << HNS_ROCE_V2_VF_INT_ST_BUS_ERR_S
;
5738 roce_write(hr_dev
, ROCEE_VF_ABN_INT_ST_REG
, int_st
);
5740 int_en
|= 1 << HNS_ROCE_V2_VF_ABN_INT_EN_S
;
5741 roce_write(hr_dev
, ROCEE_VF_ABN_INT_EN_REG
, int_en
);
5744 } else if (int_st
& BIT(HNS_ROCE_V2_VF_INT_ST_OTHER_ERR_S
)) {
5745 dev_err(dev
, "OTHER ERR!\n");
5747 int_st
|= 1 << HNS_ROCE_V2_VF_INT_ST_OTHER_ERR_S
;
5748 roce_write(hr_dev
, ROCEE_VF_ABN_INT_ST_REG
, int_st
);
5750 int_en
|= 1 << HNS_ROCE_V2_VF_ABN_INT_EN_S
;
5751 roce_write(hr_dev
, ROCEE_VF_ABN_INT_EN_REG
, int_en
);
5755 dev_err(dev
, "There is no abnormal irq found!\n");
5757 return IRQ_RETVAL(int_work
);
5760 static void hns_roce_v2_int_mask_enable(struct hns_roce_dev
*hr_dev
,
5761 int eq_num
, int enable_flag
)
5765 if (enable_flag
== EQ_ENABLE
) {
5766 for (i
= 0; i
< eq_num
; i
++)
5767 roce_write(hr_dev
, ROCEE_VF_EVENT_INT_EN_REG
+
5769 HNS_ROCE_V2_VF_EVENT_INT_EN_M
);
5771 roce_write(hr_dev
, ROCEE_VF_ABN_INT_EN_REG
,
5772 HNS_ROCE_V2_VF_ABN_INT_EN_M
);
5773 roce_write(hr_dev
, ROCEE_VF_ABN_INT_CFG_REG
,
5774 HNS_ROCE_V2_VF_ABN_INT_CFG_M
);
5776 for (i
= 0; i
< eq_num
; i
++)
5777 roce_write(hr_dev
, ROCEE_VF_EVENT_INT_EN_REG
+
5779 HNS_ROCE_V2_VF_EVENT_INT_EN_M
& 0x0);
5781 roce_write(hr_dev
, ROCEE_VF_ABN_INT_EN_REG
,
5782 HNS_ROCE_V2_VF_ABN_INT_EN_M
& 0x0);
5783 roce_write(hr_dev
, ROCEE_VF_ABN_INT_CFG_REG
,
5784 HNS_ROCE_V2_VF_ABN_INT_CFG_M
& 0x0);
5788 static void hns_roce_v2_destroy_eqc(struct hns_roce_dev
*hr_dev
, int eqn
)
5790 struct device
*dev
= hr_dev
->dev
;
5793 if (eqn
< hr_dev
->caps
.num_comp_vectors
)
5794 ret
= hns_roce_cmd_mbox(hr_dev
, 0, 0, eqn
& HNS_ROCE_V2_EQN_M
,
5795 0, HNS_ROCE_CMD_DESTROY_CEQC
,
5796 HNS_ROCE_CMD_TIMEOUT_MSECS
);
5798 ret
= hns_roce_cmd_mbox(hr_dev
, 0, 0, eqn
& HNS_ROCE_V2_EQN_M
,
5799 0, HNS_ROCE_CMD_DESTROY_AEQC
,
5800 HNS_ROCE_CMD_TIMEOUT_MSECS
);
5802 dev_err(dev
, "[mailbox cmd] destroy eqc(%d) failed.\n", eqn
);
5805 static void free_eq_buf(struct hns_roce_dev
*hr_dev
, struct hns_roce_eq
*eq
)
5807 hns_roce_mtr_destroy(hr_dev
, &eq
->mtr
);
5810 static int config_eqc(struct hns_roce_dev
*hr_dev
, struct hns_roce_eq
*eq
,
5813 u64 eqe_ba
[MTT_MIN_COUNT
] = { 0 };
5814 struct hns_roce_eq_context
*eqc
;
5819 memset(eqc
, 0, sizeof(struct hns_roce_eq_context
));
5822 eq
->doorbell
= hr_dev
->reg_base
+ ROCEE_VF_EQ_DB_CFG0_REG
;
5824 eq
->over_ignore
= HNS_ROCE_V2_EQ_OVER_IGNORE_0
;
5825 eq
->coalesce
= HNS_ROCE_V2_EQ_COALESCE_0
;
5826 eq
->arm_st
= HNS_ROCE_V2_EQ_ALWAYS_ARMED
;
5827 eq
->shift
= ilog2((unsigned int)eq
->entries
);
5829 /* if not multi-hop, eqe buffer only use one trunk */
5830 count
= hns_roce_mtr_find(hr_dev
, &eq
->mtr
, 0, eqe_ba
, MTT_MIN_COUNT
,
5833 dev_err(hr_dev
->dev
, "failed to find EQE mtr\n");
5838 roce_set_field(eqc
->byte_4
, HNS_ROCE_EQC_EQ_ST_M
, HNS_ROCE_EQC_EQ_ST_S
,
5839 HNS_ROCE_V2_EQ_STATE_VALID
);
5841 /* set eqe hop num */
5842 roce_set_field(eqc
->byte_4
, HNS_ROCE_EQC_HOP_NUM_M
,
5843 HNS_ROCE_EQC_HOP_NUM_S
, eq
->hop_num
);
5845 /* set eqc over_ignore */
5846 roce_set_field(eqc
->byte_4
, HNS_ROCE_EQC_OVER_IGNORE_M
,
5847 HNS_ROCE_EQC_OVER_IGNORE_S
, eq
->over_ignore
);
5849 /* set eqc coalesce */
5850 roce_set_field(eqc
->byte_4
, HNS_ROCE_EQC_COALESCE_M
,
5851 HNS_ROCE_EQC_COALESCE_S
, eq
->coalesce
);
5853 /* set eqc arm_state */
5854 roce_set_field(eqc
->byte_4
, HNS_ROCE_EQC_ARM_ST_M
,
5855 HNS_ROCE_EQC_ARM_ST_S
, eq
->arm_st
);
5858 roce_set_field(eqc
->byte_4
, HNS_ROCE_EQC_EQN_M
, HNS_ROCE_EQC_EQN_S
,
5862 roce_set_field(eqc
->byte_4
, HNS_ROCE_EQC_EQE_CNT_M
,
5863 HNS_ROCE_EQC_EQE_CNT_S
, HNS_ROCE_EQ_INIT_EQE_CNT
);
5865 /* set eqe_ba_pg_sz */
5866 roce_set_field(eqc
->byte_8
, HNS_ROCE_EQC_BA_PG_SZ_M
,
5867 HNS_ROCE_EQC_BA_PG_SZ_S
,
5868 to_hr_hw_page_shift(eq
->mtr
.hem_cfg
.ba_pg_shift
));
5870 /* set eqe_buf_pg_sz */
5871 roce_set_field(eqc
->byte_8
, HNS_ROCE_EQC_BUF_PG_SZ_M
,
5872 HNS_ROCE_EQC_BUF_PG_SZ_S
,
5873 to_hr_hw_page_shift(eq
->mtr
.hem_cfg
.buf_pg_shift
));
5875 /* set eq_producer_idx */
5876 roce_set_field(eqc
->byte_8
, HNS_ROCE_EQC_PROD_INDX_M
,
5877 HNS_ROCE_EQC_PROD_INDX_S
, HNS_ROCE_EQ_INIT_PROD_IDX
);
5879 /* set eq_max_cnt */
5880 roce_set_field(eqc
->byte_12
, HNS_ROCE_EQC_MAX_CNT_M
,
5881 HNS_ROCE_EQC_MAX_CNT_S
, eq
->eq_max_cnt
);
5884 roce_set_field(eqc
->byte_12
, HNS_ROCE_EQC_PERIOD_M
,
5885 HNS_ROCE_EQC_PERIOD_S
, eq
->eq_period
);
5887 /* set eqe_report_timer */
5888 roce_set_field(eqc
->eqe_report_timer
, HNS_ROCE_EQC_REPORT_TIMER_M
,
5889 HNS_ROCE_EQC_REPORT_TIMER_S
,
5890 HNS_ROCE_EQ_INIT_REPORT_TIMER
);
5892 /* set bt_ba [34:3] */
5893 roce_set_field(eqc
->eqe_ba0
, HNS_ROCE_EQC_EQE_BA_L_M
,
5894 HNS_ROCE_EQC_EQE_BA_L_S
, bt_ba
>> 3);
5896 /* set bt_ba [64:35] */
5897 roce_set_field(eqc
->eqe_ba1
, HNS_ROCE_EQC_EQE_BA_H_M
,
5898 HNS_ROCE_EQC_EQE_BA_H_S
, bt_ba
>> 35);
5901 roce_set_field(eqc
->byte_28
, HNS_ROCE_EQC_SHIFT_M
, HNS_ROCE_EQC_SHIFT_S
,
5904 /* set eq MSI_IDX */
5905 roce_set_field(eqc
->byte_28
, HNS_ROCE_EQC_MSI_INDX_M
,
5906 HNS_ROCE_EQC_MSI_INDX_S
, HNS_ROCE_EQ_INIT_MSI_IDX
);
5908 /* set cur_eqe_ba [27:12] */
5909 roce_set_field(eqc
->byte_28
, HNS_ROCE_EQC_CUR_EQE_BA_L_M
,
5910 HNS_ROCE_EQC_CUR_EQE_BA_L_S
, eqe_ba
[0] >> 12);
5912 /* set cur_eqe_ba [59:28] */
5913 roce_set_field(eqc
->byte_32
, HNS_ROCE_EQC_CUR_EQE_BA_M_M
,
5914 HNS_ROCE_EQC_CUR_EQE_BA_M_S
, eqe_ba
[0] >> 28);
5916 /* set cur_eqe_ba [63:60] */
5917 roce_set_field(eqc
->byte_36
, HNS_ROCE_EQC_CUR_EQE_BA_H_M
,
5918 HNS_ROCE_EQC_CUR_EQE_BA_H_S
, eqe_ba
[0] >> 60);
5920 /* set eq consumer idx */
5921 roce_set_field(eqc
->byte_36
, HNS_ROCE_EQC_CONS_INDX_M
,
5922 HNS_ROCE_EQC_CONS_INDX_S
, HNS_ROCE_EQ_INIT_CONS_IDX
);
5924 roce_set_field(eqc
->byte_40
, HNS_ROCE_EQC_NXT_EQE_BA_L_M
,
5925 HNS_ROCE_EQC_NXT_EQE_BA_L_S
, eqe_ba
[1] >> 12);
5927 roce_set_field(eqc
->byte_44
, HNS_ROCE_EQC_NXT_EQE_BA_H_M
,
5928 HNS_ROCE_EQC_NXT_EQE_BA_H_S
, eqe_ba
[1] >> 44);
5930 roce_set_field(eqc
->byte_44
, HNS_ROCE_EQC_EQE_SIZE_M
,
5931 HNS_ROCE_EQC_EQE_SIZE_S
,
5932 eq
->eqe_size
== HNS_ROCE_V3_EQE_SIZE
? 1 : 0);
5937 static int alloc_eq_buf(struct hns_roce_dev
*hr_dev
, struct hns_roce_eq
*eq
)
5939 struct hns_roce_buf_attr buf_attr
= {};
5942 if (hr_dev
->caps
.eqe_hop_num
== HNS_ROCE_HOP_NUM_0
)
5945 eq
->hop_num
= hr_dev
->caps
.eqe_hop_num
;
5947 buf_attr
.page_shift
= hr_dev
->caps
.eqe_buf_pg_sz
+ HNS_HW_PAGE_SHIFT
;
5948 buf_attr
.region
[0].size
= eq
->entries
* eq
->eqe_size
;
5949 buf_attr
.region
[0].hopnum
= eq
->hop_num
;
5950 buf_attr
.region_count
= 1;
5951 buf_attr
.fixed_page
= true;
5953 err
= hns_roce_mtr_create(hr_dev
, &eq
->mtr
, &buf_attr
,
5954 hr_dev
->caps
.eqe_ba_pg_sz
+
5955 HNS_HW_PAGE_SHIFT
, NULL
, 0);
5957 dev_err(hr_dev
->dev
, "Failed to alloc EQE mtr, err %d\n", err
);
5962 static int hns_roce_v2_create_eq(struct hns_roce_dev
*hr_dev
,
5963 struct hns_roce_eq
*eq
,
5964 unsigned int eq_cmd
)
5966 struct hns_roce_cmd_mailbox
*mailbox
;
5969 /* Allocate mailbox memory */
5970 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
5971 if (IS_ERR_OR_NULL(mailbox
))
5974 ret
= alloc_eq_buf(hr_dev
, eq
);
5978 ret
= config_eqc(hr_dev
, eq
, mailbox
->buf
);
5982 ret
= hns_roce_cmd_mbox(hr_dev
, mailbox
->dma
, 0, eq
->eqn
, 0,
5983 eq_cmd
, HNS_ROCE_CMD_TIMEOUT_MSECS
);
5985 dev_err(hr_dev
->dev
, "[mailbox cmd] create eqc failed.\n");
5989 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
5994 free_eq_buf(hr_dev
, eq
);
5997 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
6002 static int __hns_roce_request_irq(struct hns_roce_dev
*hr_dev
, int irq_num
,
6003 int comp_num
, int aeq_num
, int other_num
)
6005 struct hns_roce_eq_table
*eq_table
= &hr_dev
->eq_table
;
6009 for (i
= 0; i
< irq_num
; i
++) {
6010 hr_dev
->irq_names
[i
] = kzalloc(HNS_ROCE_INT_NAME_LEN
,
6012 if (!hr_dev
->irq_names
[i
]) {
6014 goto err_kzalloc_failed
;
6018 /* irq contains: abnormal + AEQ + CEQ */
6019 for (j
= 0; j
< other_num
; j
++)
6020 snprintf((char *)hr_dev
->irq_names
[j
], HNS_ROCE_INT_NAME_LEN
,
6023 for (j
= other_num
; j
< (other_num
+ aeq_num
); j
++)
6024 snprintf((char *)hr_dev
->irq_names
[j
], HNS_ROCE_INT_NAME_LEN
,
6025 "hns-aeq-%d", j
- other_num
);
6027 for (j
= (other_num
+ aeq_num
); j
< irq_num
; j
++)
6028 snprintf((char *)hr_dev
->irq_names
[j
], HNS_ROCE_INT_NAME_LEN
,
6029 "hns-ceq-%d", j
- other_num
- aeq_num
);
6031 for (j
= 0; j
< irq_num
; j
++) {
6033 ret
= request_irq(hr_dev
->irq
[j
],
6034 hns_roce_v2_msix_interrupt_abn
,
6035 0, hr_dev
->irq_names
[j
], hr_dev
);
6037 else if (j
< (other_num
+ comp_num
))
6038 ret
= request_irq(eq_table
->eq
[j
- other_num
].irq
,
6039 hns_roce_v2_msix_interrupt_eq
,
6040 0, hr_dev
->irq_names
[j
+ aeq_num
],
6041 &eq_table
->eq
[j
- other_num
]);
6043 ret
= request_irq(eq_table
->eq
[j
- other_num
].irq
,
6044 hns_roce_v2_msix_interrupt_eq
,
6045 0, hr_dev
->irq_names
[j
- comp_num
],
6046 &eq_table
->eq
[j
- other_num
]);
6048 dev_err(hr_dev
->dev
, "Request irq error!\n");
6049 goto err_request_failed
;
6056 for (j
-= 1; j
>= 0; j
--)
6058 free_irq(hr_dev
->irq
[j
], hr_dev
);
6060 free_irq(eq_table
->eq
[j
- other_num
].irq
,
6061 &eq_table
->eq
[j
- other_num
]);
6064 for (i
-= 1; i
>= 0; i
--)
6065 kfree(hr_dev
->irq_names
[i
]);
6070 static void __hns_roce_free_irq(struct hns_roce_dev
*hr_dev
)
6076 eq_num
= hr_dev
->caps
.num_comp_vectors
+ hr_dev
->caps
.num_aeq_vectors
;
6077 irq_num
= eq_num
+ hr_dev
->caps
.num_other_vectors
;
6079 for (i
= 0; i
< hr_dev
->caps
.num_other_vectors
; i
++)
6080 free_irq(hr_dev
->irq
[i
], hr_dev
);
6082 for (i
= 0; i
< eq_num
; i
++)
6083 free_irq(hr_dev
->eq_table
.eq
[i
].irq
, &hr_dev
->eq_table
.eq
[i
]);
6085 for (i
= 0; i
< irq_num
; i
++)
6086 kfree(hr_dev
->irq_names
[i
]);
6089 static int hns_roce_v2_init_eq_table(struct hns_roce_dev
*hr_dev
)
6091 struct hns_roce_eq_table
*eq_table
= &hr_dev
->eq_table
;
6092 struct device
*dev
= hr_dev
->dev
;
6093 struct hns_roce_eq
*eq
;
6094 unsigned int eq_cmd
;
6103 other_num
= hr_dev
->caps
.num_other_vectors
;
6104 comp_num
= hr_dev
->caps
.num_comp_vectors
;
6105 aeq_num
= hr_dev
->caps
.num_aeq_vectors
;
6107 eq_num
= comp_num
+ aeq_num
;
6108 irq_num
= eq_num
+ other_num
;
6110 eq_table
->eq
= kcalloc(eq_num
, sizeof(*eq_table
->eq
), GFP_KERNEL
);
6115 for (i
= 0; i
< eq_num
; i
++) {
6116 eq
= &eq_table
->eq
[i
];
6117 eq
->hr_dev
= hr_dev
;
6121 eq_cmd
= HNS_ROCE_CMD_CREATE_CEQC
;
6122 eq
->type_flag
= HNS_ROCE_CEQ
;
6123 eq
->entries
= hr_dev
->caps
.ceqe_depth
;
6124 eq
->eqe_size
= hr_dev
->caps
.ceqe_size
;
6125 eq
->irq
= hr_dev
->irq
[i
+ other_num
+ aeq_num
];
6126 eq
->eq_max_cnt
= HNS_ROCE_CEQ_DEFAULT_BURST_NUM
;
6127 eq
->eq_period
= HNS_ROCE_CEQ_DEFAULT_INTERVAL
;
6130 eq_cmd
= HNS_ROCE_CMD_CREATE_AEQC
;
6131 eq
->type_flag
= HNS_ROCE_AEQ
;
6132 eq
->entries
= hr_dev
->caps
.aeqe_depth
;
6133 eq
->eqe_size
= hr_dev
->caps
.aeqe_size
;
6134 eq
->irq
= hr_dev
->irq
[i
- comp_num
+ other_num
];
6135 eq
->eq_max_cnt
= HNS_ROCE_AEQ_DEFAULT_BURST_NUM
;
6136 eq
->eq_period
= HNS_ROCE_AEQ_DEFAULT_INTERVAL
;
6139 ret
= hns_roce_v2_create_eq(hr_dev
, eq
, eq_cmd
);
6141 dev_err(dev
, "eq create failed.\n");
6142 goto err_create_eq_fail
;
6147 hns_roce_v2_int_mask_enable(hr_dev
, eq_num
, EQ_ENABLE
);
6149 ret
= __hns_roce_request_irq(hr_dev
, irq_num
, comp_num
,
6150 aeq_num
, other_num
);
6152 dev_err(dev
, "Request irq failed.\n");
6153 goto err_request_irq_fail
;
6156 hr_dev
->irq_workq
= alloc_ordered_workqueue("hns_roce_irq_workq", 0);
6157 if (!hr_dev
->irq_workq
) {
6158 dev_err(dev
, "Create irq workqueue failed!\n");
6160 goto err_create_wq_fail
;
6166 __hns_roce_free_irq(hr_dev
);
6168 err_request_irq_fail
:
6169 hns_roce_v2_int_mask_enable(hr_dev
, eq_num
, EQ_DISABLE
);
6172 for (i
-= 1; i
>= 0; i
--)
6173 free_eq_buf(hr_dev
, &eq_table
->eq
[i
]);
6174 kfree(eq_table
->eq
);
6179 static void hns_roce_v2_cleanup_eq_table(struct hns_roce_dev
*hr_dev
)
6181 struct hns_roce_eq_table
*eq_table
= &hr_dev
->eq_table
;
6185 eq_num
= hr_dev
->caps
.num_comp_vectors
+ hr_dev
->caps
.num_aeq_vectors
;
6188 hns_roce_v2_int_mask_enable(hr_dev
, eq_num
, EQ_DISABLE
);
6190 __hns_roce_free_irq(hr_dev
);
6192 for (i
= 0; i
< eq_num
; i
++) {
6193 hns_roce_v2_destroy_eqc(hr_dev
, i
);
6195 free_eq_buf(hr_dev
, &eq_table
->eq
[i
]);
6198 kfree(eq_table
->eq
);
6200 flush_workqueue(hr_dev
->irq_workq
);
6201 destroy_workqueue(hr_dev
->irq_workq
);
6204 static const struct hns_roce_dfx_hw hns_roce_dfx_hw_v2
= {
6205 .query_cqc_info
= hns_roce_v2_query_cqc_info
,
6208 static const struct ib_device_ops hns_roce_v2_dev_ops
= {
6209 .destroy_qp
= hns_roce_v2_destroy_qp
,
6210 .modify_cq
= hns_roce_v2_modify_cq
,
6211 .poll_cq
= hns_roce_v2_poll_cq
,
6212 .post_recv
= hns_roce_v2_post_recv
,
6213 .post_send
= hns_roce_v2_post_send
,
6214 .query_qp
= hns_roce_v2_query_qp
,
6215 .req_notify_cq
= hns_roce_v2_req_notify_cq
,
6218 static const struct ib_device_ops hns_roce_v2_dev_srq_ops
= {
6219 .modify_srq
= hns_roce_v2_modify_srq
,
6220 .post_srq_recv
= hns_roce_v2_post_srq_recv
,
6221 .query_srq
= hns_roce_v2_query_srq
,
6224 static const struct hns_roce_hw hns_roce_hw_v2
= {
6225 .cmq_init
= hns_roce_v2_cmq_init
,
6226 .cmq_exit
= hns_roce_v2_cmq_exit
,
6227 .hw_profile
= hns_roce_v2_profile
,
6228 .hw_init
= hns_roce_v2_init
,
6229 .hw_exit
= hns_roce_v2_exit
,
6230 .post_mbox
= hns_roce_v2_post_mbox
,
6231 .chk_mbox
= hns_roce_v2_chk_mbox
,
6232 .rst_prc_mbox
= hns_roce_v2_rst_process_cmd
,
6233 .set_gid
= hns_roce_v2_set_gid
,
6234 .set_mac
= hns_roce_v2_set_mac
,
6235 .write_mtpt
= hns_roce_v2_write_mtpt
,
6236 .rereg_write_mtpt
= hns_roce_v2_rereg_write_mtpt
,
6237 .frmr_write_mtpt
= hns_roce_v2_frmr_write_mtpt
,
6238 .mw_write_mtpt
= hns_roce_v2_mw_write_mtpt
,
6239 .write_cqc
= hns_roce_v2_write_cqc
,
6240 .set_hem
= hns_roce_v2_set_hem
,
6241 .clear_hem
= hns_roce_v2_clear_hem
,
6242 .modify_qp
= hns_roce_v2_modify_qp
,
6243 .query_qp
= hns_roce_v2_query_qp
,
6244 .destroy_qp
= hns_roce_v2_destroy_qp
,
6245 .qp_flow_control_init
= hns_roce_v2_qp_flow_control_init
,
6246 .modify_cq
= hns_roce_v2_modify_cq
,
6247 .post_send
= hns_roce_v2_post_send
,
6248 .post_recv
= hns_roce_v2_post_recv
,
6249 .req_notify_cq
= hns_roce_v2_req_notify_cq
,
6250 .poll_cq
= hns_roce_v2_poll_cq
,
6251 .init_eq
= hns_roce_v2_init_eq_table
,
6252 .cleanup_eq
= hns_roce_v2_cleanup_eq_table
,
6253 .write_srqc
= hns_roce_v2_write_srqc
,
6254 .modify_srq
= hns_roce_v2_modify_srq
,
6255 .query_srq
= hns_roce_v2_query_srq
,
6256 .post_srq_recv
= hns_roce_v2_post_srq_recv
,
6257 .hns_roce_dev_ops
= &hns_roce_v2_dev_ops
,
6258 .hns_roce_dev_srq_ops
= &hns_roce_v2_dev_srq_ops
,
6261 static const struct pci_device_id hns_roce_hw_v2_pci_tbl
[] = {
6262 {PCI_VDEVICE(HUAWEI
, HNAE3_DEV_ID_25GE_RDMA
), 0},
6263 {PCI_VDEVICE(HUAWEI
, HNAE3_DEV_ID_25GE_RDMA_MACSEC
), 0},
6264 {PCI_VDEVICE(HUAWEI
, HNAE3_DEV_ID_50GE_RDMA
), 0},
6265 {PCI_VDEVICE(HUAWEI
, HNAE3_DEV_ID_50GE_RDMA_MACSEC
), 0},
6266 {PCI_VDEVICE(HUAWEI
, HNAE3_DEV_ID_100G_RDMA_MACSEC
), 0},
6267 {PCI_VDEVICE(HUAWEI
, HNAE3_DEV_ID_200G_RDMA
), 0},
6268 /* required last entry */
6272 MODULE_DEVICE_TABLE(pci
, hns_roce_hw_v2_pci_tbl
);
6274 static void hns_roce_hw_v2_get_cfg(struct hns_roce_dev
*hr_dev
,
6275 struct hnae3_handle
*handle
)
6277 struct hns_roce_v2_priv
*priv
= hr_dev
->priv
;
6280 hr_dev
->pci_dev
= handle
->pdev
;
6281 hr_dev
->dev
= &handle
->pdev
->dev
;
6282 hr_dev
->hw
= &hns_roce_hw_v2
;
6283 hr_dev
->dfx
= &hns_roce_dfx_hw_v2
;
6284 hr_dev
->sdb_offset
= ROCEE_DB_SQ_L_0_REG
;
6285 hr_dev
->odb_offset
= hr_dev
->sdb_offset
;
6287 /* Get info from NIC driver. */
6288 hr_dev
->reg_base
= handle
->rinfo
.roce_io_base
;
6289 hr_dev
->caps
.num_ports
= 1;
6290 hr_dev
->iboe
.netdevs
[0] = handle
->rinfo
.netdev
;
6291 hr_dev
->iboe
.phy_port
[0] = 0;
6293 addrconf_addr_eui48((u8
*)&hr_dev
->ib_dev
.node_guid
,
6294 hr_dev
->iboe
.netdevs
[0]->dev_addr
);
6296 for (i
= 0; i
< HNS_ROCE_V2_MAX_IRQ_NUM
; i
++)
6297 hr_dev
->irq
[i
] = pci_irq_vector(handle
->pdev
,
6298 i
+ handle
->rinfo
.base_vector
);
6300 /* cmd issue mode: 0 is poll, 1 is event */
6301 hr_dev
->cmd_mod
= 1;
6302 hr_dev
->loop_idc
= 0;
6304 hr_dev
->reset_cnt
= handle
->ae_algo
->ops
->ae_dev_reset_cnt(handle
);
6305 priv
->handle
= handle
;
6308 static int __hns_roce_hw_v2_init_instance(struct hnae3_handle
*handle
)
6310 struct hns_roce_dev
*hr_dev
;
6313 hr_dev
= ib_alloc_device(hns_roce_dev
, ib_dev
);
6317 hr_dev
->priv
= kzalloc(sizeof(struct hns_roce_v2_priv
), GFP_KERNEL
);
6318 if (!hr_dev
->priv
) {
6320 goto error_failed_kzalloc
;
6323 hns_roce_hw_v2_get_cfg(hr_dev
, handle
);
6325 ret
= hns_roce_init(hr_dev
);
6327 dev_err(hr_dev
->dev
, "RoCE Engine init failed!\n");
6328 goto error_failed_get_cfg
;
6331 handle
->priv
= hr_dev
;
6335 error_failed_get_cfg
:
6336 kfree(hr_dev
->priv
);
6338 error_failed_kzalloc
:
6339 ib_dealloc_device(&hr_dev
->ib_dev
);
6344 static void __hns_roce_hw_v2_uninit_instance(struct hnae3_handle
*handle
,
6347 struct hns_roce_dev
*hr_dev
= handle
->priv
;
6352 handle
->priv
= NULL
;
6354 hr_dev
->state
= HNS_ROCE_DEVICE_STATE_UNINIT
;
6355 hns_roce_handle_device_err(hr_dev
);
6357 hns_roce_exit(hr_dev
);
6358 kfree(hr_dev
->priv
);
6359 ib_dealloc_device(&hr_dev
->ib_dev
);
6362 static int hns_roce_hw_v2_init_instance(struct hnae3_handle
*handle
)
6364 const struct hnae3_ae_ops
*ops
= handle
->ae_algo
->ops
;
6365 const struct pci_device_id
*id
;
6366 struct device
*dev
= &handle
->pdev
->dev
;
6369 handle
->rinfo
.instance_state
= HNS_ROCE_STATE_INIT
;
6371 if (ops
->ae_dev_resetting(handle
) || ops
->get_hw_reset_stat(handle
)) {
6372 handle
->rinfo
.instance_state
= HNS_ROCE_STATE_NON_INIT
;
6376 id
= pci_match_id(hns_roce_hw_v2_pci_tbl
, handle
->pdev
);
6380 ret
= __hns_roce_hw_v2_init_instance(handle
);
6382 handle
->rinfo
.instance_state
= HNS_ROCE_STATE_NON_INIT
;
6383 dev_err(dev
, "RoCE instance init failed! ret = %d\n", ret
);
6384 if (ops
->ae_dev_resetting(handle
) ||
6385 ops
->get_hw_reset_stat(handle
))
6391 handle
->rinfo
.instance_state
= HNS_ROCE_STATE_INITED
;
6397 dev_err(dev
, "Device is busy in resetting state.\n"
6398 "please retry later.\n");
6403 static void hns_roce_hw_v2_uninit_instance(struct hnae3_handle
*handle
,
6406 if (handle
->rinfo
.instance_state
!= HNS_ROCE_STATE_INITED
)
6409 handle
->rinfo
.instance_state
= HNS_ROCE_STATE_UNINIT
;
6411 __hns_roce_hw_v2_uninit_instance(handle
, reset
);
6413 handle
->rinfo
.instance_state
= HNS_ROCE_STATE_NON_INIT
;
6415 static int hns_roce_hw_v2_reset_notify_down(struct hnae3_handle
*handle
)
6417 struct hns_roce_dev
*hr_dev
;
6419 if (handle
->rinfo
.instance_state
!= HNS_ROCE_STATE_INITED
) {
6420 set_bit(HNS_ROCE_RST_DIRECT_RETURN
, &handle
->rinfo
.state
);
6424 handle
->rinfo
.reset_state
= HNS_ROCE_STATE_RST_DOWN
;
6425 clear_bit(HNS_ROCE_RST_DIRECT_RETURN
, &handle
->rinfo
.state
);
6427 hr_dev
= handle
->priv
;
6431 hr_dev
->is_reset
= true;
6432 hr_dev
->active
= false;
6433 hr_dev
->dis_db
= true;
6435 hr_dev
->state
= HNS_ROCE_DEVICE_STATE_RST_DOWN
;
6440 static int hns_roce_hw_v2_reset_notify_init(struct hnae3_handle
*handle
)
6442 struct device
*dev
= &handle
->pdev
->dev
;
6445 if (test_and_clear_bit(HNS_ROCE_RST_DIRECT_RETURN
,
6446 &handle
->rinfo
.state
)) {
6447 handle
->rinfo
.reset_state
= HNS_ROCE_STATE_RST_INITED
;
6451 handle
->rinfo
.reset_state
= HNS_ROCE_STATE_RST_INIT
;
6453 dev_info(&handle
->pdev
->dev
, "In reset process RoCE client reinit.\n");
6454 ret
= __hns_roce_hw_v2_init_instance(handle
);
6456 /* when reset notify type is HNAE3_INIT_CLIENT In reset notify
6457 * callback function, RoCE Engine reinitialize. If RoCE reinit
6458 * failed, we should inform NIC driver.
6460 handle
->priv
= NULL
;
6461 dev_err(dev
, "In reset process RoCE reinit failed %d.\n", ret
);
6463 handle
->rinfo
.reset_state
= HNS_ROCE_STATE_RST_INITED
;
6464 dev_info(dev
, "Reset done, RoCE client reinit finished.\n");
6470 static int hns_roce_hw_v2_reset_notify_uninit(struct hnae3_handle
*handle
)
6472 if (test_bit(HNS_ROCE_RST_DIRECT_RETURN
, &handle
->rinfo
.state
))
6475 handle
->rinfo
.reset_state
= HNS_ROCE_STATE_RST_UNINIT
;
6476 dev_info(&handle
->pdev
->dev
, "In reset process RoCE client uninit.\n");
6477 msleep(HNS_ROCE_V2_HW_RST_UNINT_DELAY
);
6478 __hns_roce_hw_v2_uninit_instance(handle
, false);
6483 static int hns_roce_hw_v2_reset_notify(struct hnae3_handle
*handle
,
6484 enum hnae3_reset_notify_type type
)
6489 case HNAE3_DOWN_CLIENT
:
6490 ret
= hns_roce_hw_v2_reset_notify_down(handle
);
6492 case HNAE3_INIT_CLIENT
:
6493 ret
= hns_roce_hw_v2_reset_notify_init(handle
);
6495 case HNAE3_UNINIT_CLIENT
:
6496 ret
= hns_roce_hw_v2_reset_notify_uninit(handle
);
6505 static const struct hnae3_client_ops hns_roce_hw_v2_ops
= {
6506 .init_instance
= hns_roce_hw_v2_init_instance
,
6507 .uninit_instance
= hns_roce_hw_v2_uninit_instance
,
6508 .reset_notify
= hns_roce_hw_v2_reset_notify
,
6511 static struct hnae3_client hns_roce_hw_v2_client
= {
6512 .name
= "hns_roce_hw_v2",
6513 .type
= HNAE3_CLIENT_ROCE
,
6514 .ops
= &hns_roce_hw_v2_ops
,
6517 static int __init
hns_roce_hw_v2_init(void)
6519 return hnae3_register_client(&hns_roce_hw_v2_client
);
6522 static void __exit
hns_roce_hw_v2_exit(void)
6524 hnae3_unregister_client(&hns_roce_hw_v2_client
);
6527 module_init(hns_roce_hw_v2_init
);
6528 module_exit(hns_roce_hw_v2_exit
);
6530 MODULE_LICENSE("Dual BSD/GPL");
6531 MODULE_AUTHOR("Wei Hu <xavier.huwei@huawei.com>");
6532 MODULE_AUTHOR("Lijun Ou <oulijun@huawei.com>");
6533 MODULE_AUTHOR("Shaobo Xu <xushaobo2@huawei.com>");
6534 MODULE_DESCRIPTION("Hisilicon Hip08 Family RoCE Driver");