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 <net/addrconf.h>
38 #include <rdma/ib_umem.h>
41 #include "hns_roce_common.h"
42 #include "hns_roce_device.h"
43 #include "hns_roce_cmd.h"
44 #include "hns_roce_hem.h"
45 #include "hns_roce_hw_v2.h"
47 static void set_data_seg_v2(struct hns_roce_v2_wqe_data_seg
*dseg
,
50 dseg
->lkey
= cpu_to_le32(sg
->lkey
);
51 dseg
->addr
= cpu_to_le64(sg
->addr
);
52 dseg
->len
= cpu_to_le32(sg
->length
);
55 static int set_rwqe_data_seg(struct ib_qp
*ibqp
, struct ib_send_wr
*wr
,
56 struct hns_roce_v2_rc_send_wqe
*rc_sq_wqe
,
57 void *wqe
, unsigned int *sge_ind
,
58 struct ib_send_wr
**bad_wr
)
60 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
61 struct hns_roce_v2_wqe_data_seg
*dseg
= wqe
;
62 struct hns_roce_qp
*qp
= to_hr_qp(ibqp
);
65 if (wr
->send_flags
& IB_SEND_INLINE
&& wr
->num_sge
) {
66 if (le32_to_cpu(rc_sq_wqe
->msg_len
) >
67 hr_dev
->caps
.max_sq_inline
) {
69 dev_err(hr_dev
->dev
, "inline len(1-%d)=%d, illegal",
70 rc_sq_wqe
->msg_len
, hr_dev
->caps
.max_sq_inline
);
74 if (wr
->opcode
== IB_WR_RDMA_READ
) {
75 dev_err(hr_dev
->dev
, "Not support inline data!\n");
79 for (i
= 0; i
< wr
->num_sge
; i
++) {
80 memcpy(wqe
, ((void *)wr
->sg_list
[i
].addr
),
81 wr
->sg_list
[i
].length
);
82 wqe
+= wr
->sg_list
[i
].length
;
85 roce_set_bit(rc_sq_wqe
->byte_4
, V2_RC_SEND_WQE_BYTE_4_INLINE_S
,
88 if (wr
->num_sge
<= 2) {
89 for (i
= 0; i
< wr
->num_sge
; i
++) {
90 if (likely(wr
->sg_list
[i
].length
)) {
91 set_data_seg_v2(dseg
, wr
->sg_list
+ i
);
96 roce_set_field(rc_sq_wqe
->byte_20
,
97 V2_RC_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_M
,
98 V2_RC_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_S
,
99 (*sge_ind
) & (qp
->sge
.sge_cnt
- 1));
101 for (i
= 0; i
< 2; i
++) {
102 if (likely(wr
->sg_list
[i
].length
)) {
103 set_data_seg_v2(dseg
, wr
->sg_list
+ i
);
108 dseg
= get_send_extend_sge(qp
,
109 (*sge_ind
) & (qp
->sge
.sge_cnt
- 1));
111 for (i
= 0; i
< wr
->num_sge
- 2; i
++) {
112 if (likely(wr
->sg_list
[i
+ 2].length
)) {
113 set_data_seg_v2(dseg
,
114 wr
->sg_list
+ 2 + i
);
121 roce_set_field(rc_sq_wqe
->byte_16
,
122 V2_RC_SEND_WQE_BYTE_16_SGE_NUM_M
,
123 V2_RC_SEND_WQE_BYTE_16_SGE_NUM_S
, wr
->num_sge
);
129 static int hns_roce_v2_post_send(struct ib_qp
*ibqp
, struct ib_send_wr
*wr
,
130 struct ib_send_wr
**bad_wr
)
132 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
133 struct hns_roce_ah
*ah
= to_hr_ah(ud_wr(wr
)->ah
);
134 struct hns_roce_v2_ud_send_wqe
*ud_sq_wqe
;
135 struct hns_roce_v2_rc_send_wqe
*rc_sq_wqe
;
136 struct hns_roce_qp
*qp
= to_hr_qp(ibqp
);
137 struct hns_roce_v2_wqe_data_seg
*dseg
;
138 struct device
*dev
= hr_dev
->dev
;
139 struct hns_roce_v2_db sq_db
;
140 unsigned int sge_ind
= 0;
141 unsigned int owner_bit
;
152 if (unlikely(ibqp
->qp_type
!= IB_QPT_RC
&&
153 ibqp
->qp_type
!= IB_QPT_GSI
&&
154 ibqp
->qp_type
!= IB_QPT_UD
)) {
155 dev_err(dev
, "Not supported QP(0x%x)type!\n", ibqp
->qp_type
);
160 if (unlikely(qp
->state
== IB_QPS_RESET
|| qp
->state
== IB_QPS_INIT
||
161 qp
->state
== IB_QPS_RTR
)) {
162 dev_err(dev
, "Post WQE fail, QP state %d err!\n", qp
->state
);
167 spin_lock_irqsave(&qp
->sq
.lock
, flags
);
168 ind
= qp
->sq_next_wqe
;
169 sge_ind
= qp
->next_sge
;
171 for (nreq
= 0; wr
; ++nreq
, wr
= wr
->next
) {
172 if (hns_roce_wq_overflow(&qp
->sq
, nreq
, qp
->ibqp
.send_cq
)) {
178 if (unlikely(wr
->num_sge
> qp
->sq
.max_gs
)) {
179 dev_err(dev
, "num_sge=%d > qp->sq.max_gs=%d\n",
180 wr
->num_sge
, qp
->sq
.max_gs
);
186 wqe
= get_send_wqe(qp
, ind
& (qp
->sq
.wqe_cnt
- 1));
187 qp
->sq
.wrid
[(qp
->sq
.head
+ nreq
) & (qp
->sq
.wqe_cnt
- 1)] =
191 ~(((qp
->sq
.head
+ nreq
) >> ilog2(qp
->sq
.wqe_cnt
)) & 0x1);
193 /* Corresponding to the QP type, wqe process separately */
194 if (ibqp
->qp_type
== IB_QPT_GSI
) {
196 memset(ud_sq_wqe
, 0, sizeof(*ud_sq_wqe
));
198 roce_set_field(ud_sq_wqe
->dmac
, V2_UD_SEND_WQE_DMAC_0_M
,
199 V2_UD_SEND_WQE_DMAC_0_S
, ah
->av
.mac
[0]);
200 roce_set_field(ud_sq_wqe
->dmac
, V2_UD_SEND_WQE_DMAC_1_M
,
201 V2_UD_SEND_WQE_DMAC_1_S
, ah
->av
.mac
[1]);
202 roce_set_field(ud_sq_wqe
->dmac
, V2_UD_SEND_WQE_DMAC_2_M
,
203 V2_UD_SEND_WQE_DMAC_2_S
, ah
->av
.mac
[2]);
204 roce_set_field(ud_sq_wqe
->dmac
, V2_UD_SEND_WQE_DMAC_3_M
,
205 V2_UD_SEND_WQE_DMAC_3_S
, ah
->av
.mac
[3]);
206 roce_set_field(ud_sq_wqe
->byte_48
,
207 V2_UD_SEND_WQE_BYTE_48_DMAC_4_M
,
208 V2_UD_SEND_WQE_BYTE_48_DMAC_4_S
,
210 roce_set_field(ud_sq_wqe
->byte_48
,
211 V2_UD_SEND_WQE_BYTE_48_DMAC_5_M
,
212 V2_UD_SEND_WQE_BYTE_48_DMAC_5_S
,
216 smac
= (u8
*)hr_dev
->dev_addr
[qp
->port
];
217 loopback
= ether_addr_equal_unaligned(ah
->av
.mac
,
220 roce_set_bit(ud_sq_wqe
->byte_40
,
221 V2_UD_SEND_WQE_BYTE_40_LBI_S
, loopback
);
223 roce_set_field(ud_sq_wqe
->byte_4
,
224 V2_UD_SEND_WQE_BYTE_4_OPCODE_M
,
225 V2_UD_SEND_WQE_BYTE_4_OPCODE_S
,
226 HNS_ROCE_V2_WQE_OP_SEND
);
228 for (i
= 0; i
< wr
->num_sge
; i
++)
229 tmp_len
+= wr
->sg_list
[i
].length
;
232 cpu_to_le32(le32_to_cpu(ud_sq_wqe
->msg_len
) + tmp_len
);
234 switch (wr
->opcode
) {
235 case IB_WR_SEND_WITH_IMM
:
236 case IB_WR_RDMA_WRITE_WITH_IMM
:
237 ud_sq_wqe
->immtdata
= wr
->ex
.imm_data
;
240 ud_sq_wqe
->immtdata
= 0;
245 roce_set_bit(ud_sq_wqe
->byte_4
,
246 V2_UD_SEND_WQE_BYTE_4_CQE_S
,
247 (wr
->send_flags
& IB_SEND_SIGNALED
) ? 1 : 0);
250 roce_set_bit(ud_sq_wqe
->byte_4
,
251 V2_UD_SEND_WQE_BYTE_4_SE_S
,
252 (wr
->send_flags
& IB_SEND_SOLICITED
) ? 1 : 0);
254 roce_set_bit(ud_sq_wqe
->byte_4
,
255 V2_UD_SEND_WQE_BYTE_4_OWNER_S
, owner_bit
);
257 roce_set_field(ud_sq_wqe
->byte_16
,
258 V2_UD_SEND_WQE_BYTE_16_PD_M
,
259 V2_UD_SEND_WQE_BYTE_16_PD_S
,
260 to_hr_pd(ibqp
->pd
)->pdn
);
262 roce_set_field(ud_sq_wqe
->byte_16
,
263 V2_UD_SEND_WQE_BYTE_16_SGE_NUM_M
,
264 V2_UD_SEND_WQE_BYTE_16_SGE_NUM_S
,
267 roce_set_field(ud_sq_wqe
->byte_20
,
268 V2_UD_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_M
,
269 V2_UD_SEND_WQE_BYTE_20_MSG_START_SGE_IDX_S
,
270 sge_ind
& (qp
->sge
.sge_cnt
- 1));
272 roce_set_field(ud_sq_wqe
->byte_24
,
273 V2_UD_SEND_WQE_BYTE_24_UDPSPN_M
,
274 V2_UD_SEND_WQE_BYTE_24_UDPSPN_S
, 0);
276 cpu_to_le32(ud_wr(wr
)->remote_qkey
& 0x80000000 ?
277 qp
->qkey
: ud_wr(wr
)->remote_qkey
);
278 roce_set_field(ud_sq_wqe
->byte_32
,
279 V2_UD_SEND_WQE_BYTE_32_DQPN_M
,
280 V2_UD_SEND_WQE_BYTE_32_DQPN_S
,
281 ud_wr(wr
)->remote_qpn
);
283 roce_set_field(ud_sq_wqe
->byte_36
,
284 V2_UD_SEND_WQE_BYTE_36_VLAN_M
,
285 V2_UD_SEND_WQE_BYTE_36_VLAN_S
,
286 le16_to_cpu(ah
->av
.vlan
));
287 roce_set_field(ud_sq_wqe
->byte_36
,
288 V2_UD_SEND_WQE_BYTE_36_HOPLIMIT_M
,
289 V2_UD_SEND_WQE_BYTE_36_HOPLIMIT_S
,
291 roce_set_field(ud_sq_wqe
->byte_36
,
292 V2_UD_SEND_WQE_BYTE_36_TCLASS_M
,
293 V2_UD_SEND_WQE_BYTE_36_TCLASS_S
,
295 roce_set_field(ud_sq_wqe
->byte_36
,
296 V2_UD_SEND_WQE_BYTE_36_TCLASS_M
,
297 V2_UD_SEND_WQE_BYTE_36_TCLASS_S
,
299 roce_set_field(ud_sq_wqe
->byte_40
,
300 V2_UD_SEND_WQE_BYTE_40_FLOW_LABEL_M
,
301 V2_UD_SEND_WQE_BYTE_40_FLOW_LABEL_S
, 0);
302 roce_set_field(ud_sq_wqe
->byte_40
,
303 V2_UD_SEND_WQE_BYTE_40_SL_M
,
304 V2_UD_SEND_WQE_BYTE_40_SL_S
,
305 le32_to_cpu(ah
->av
.sl_tclass_flowlabel
) >>
307 roce_set_field(ud_sq_wqe
->byte_40
,
308 V2_UD_SEND_WQE_BYTE_40_PORTN_M
,
309 V2_UD_SEND_WQE_BYTE_40_PORTN_S
,
312 roce_set_field(ud_sq_wqe
->byte_48
,
313 V2_UD_SEND_WQE_BYTE_48_SGID_INDX_M
,
314 V2_UD_SEND_WQE_BYTE_48_SGID_INDX_S
,
315 hns_get_gid_index(hr_dev
, qp
->phy_port
,
318 memcpy(&ud_sq_wqe
->dgid
[0], &ah
->av
.dgid
[0],
321 dseg
= get_send_extend_sge(qp
,
322 sge_ind
& (qp
->sge
.sge_cnt
- 1));
323 for (i
= 0; i
< wr
->num_sge
; i
++) {
324 set_data_seg_v2(dseg
+ i
, wr
->sg_list
+ i
);
329 } else if (ibqp
->qp_type
== IB_QPT_RC
) {
331 memset(rc_sq_wqe
, 0, sizeof(*rc_sq_wqe
));
332 for (i
= 0; i
< wr
->num_sge
; i
++)
333 tmp_len
+= wr
->sg_list
[i
].length
;
336 cpu_to_le32(le32_to_cpu(rc_sq_wqe
->msg_len
) + tmp_len
);
338 switch (wr
->opcode
) {
339 case IB_WR_SEND_WITH_IMM
:
340 case IB_WR_RDMA_WRITE_WITH_IMM
:
341 rc_sq_wqe
->immtdata
= wr
->ex
.imm_data
;
343 case IB_WR_SEND_WITH_INV
:
345 cpu_to_le32(wr
->ex
.invalidate_rkey
);
348 rc_sq_wqe
->immtdata
= 0;
352 roce_set_bit(rc_sq_wqe
->byte_4
,
353 V2_RC_SEND_WQE_BYTE_4_FENCE_S
,
354 (wr
->send_flags
& IB_SEND_FENCE
) ? 1 : 0);
356 roce_set_bit(rc_sq_wqe
->byte_4
,
357 V2_RC_SEND_WQE_BYTE_4_SE_S
,
358 (wr
->send_flags
& IB_SEND_SOLICITED
) ? 1 : 0);
360 roce_set_bit(rc_sq_wqe
->byte_4
,
361 V2_RC_SEND_WQE_BYTE_4_CQE_S
,
362 (wr
->send_flags
& IB_SEND_SIGNALED
) ? 1 : 0);
364 roce_set_bit(rc_sq_wqe
->byte_4
,
365 V2_RC_SEND_WQE_BYTE_4_OWNER_S
, owner_bit
);
367 switch (wr
->opcode
) {
368 case IB_WR_RDMA_READ
:
369 roce_set_field(rc_sq_wqe
->byte_4
,
370 V2_RC_SEND_WQE_BYTE_4_OPCODE_M
,
371 V2_RC_SEND_WQE_BYTE_4_OPCODE_S
,
372 HNS_ROCE_V2_WQE_OP_RDMA_READ
);
374 cpu_to_le32(rdma_wr(wr
)->rkey
);
376 cpu_to_le64(rdma_wr(wr
)->remote_addr
);
378 case IB_WR_RDMA_WRITE
:
379 roce_set_field(rc_sq_wqe
->byte_4
,
380 V2_RC_SEND_WQE_BYTE_4_OPCODE_M
,
381 V2_RC_SEND_WQE_BYTE_4_OPCODE_S
,
382 HNS_ROCE_V2_WQE_OP_RDMA_WRITE
);
384 cpu_to_le32(rdma_wr(wr
)->rkey
);
386 cpu_to_le64(rdma_wr(wr
)->remote_addr
);
388 case IB_WR_RDMA_WRITE_WITH_IMM
:
389 roce_set_field(rc_sq_wqe
->byte_4
,
390 V2_RC_SEND_WQE_BYTE_4_OPCODE_M
,
391 V2_RC_SEND_WQE_BYTE_4_OPCODE_S
,
392 HNS_ROCE_V2_WQE_OP_RDMA_WRITE_WITH_IMM
);
394 cpu_to_le32(rdma_wr(wr
)->rkey
);
396 cpu_to_le64(rdma_wr(wr
)->remote_addr
);
399 roce_set_field(rc_sq_wqe
->byte_4
,
400 V2_RC_SEND_WQE_BYTE_4_OPCODE_M
,
401 V2_RC_SEND_WQE_BYTE_4_OPCODE_S
,
402 HNS_ROCE_V2_WQE_OP_SEND
);
404 case IB_WR_SEND_WITH_INV
:
405 roce_set_field(rc_sq_wqe
->byte_4
,
406 V2_RC_SEND_WQE_BYTE_4_OPCODE_M
,
407 V2_RC_SEND_WQE_BYTE_4_OPCODE_S
,
408 HNS_ROCE_V2_WQE_OP_SEND_WITH_INV
);
410 case IB_WR_SEND_WITH_IMM
:
411 roce_set_field(rc_sq_wqe
->byte_4
,
412 V2_RC_SEND_WQE_BYTE_4_OPCODE_M
,
413 V2_RC_SEND_WQE_BYTE_4_OPCODE_S
,
414 HNS_ROCE_V2_WQE_OP_SEND_WITH_IMM
);
416 case IB_WR_LOCAL_INV
:
417 roce_set_field(rc_sq_wqe
->byte_4
,
418 V2_RC_SEND_WQE_BYTE_4_OPCODE_M
,
419 V2_RC_SEND_WQE_BYTE_4_OPCODE_S
,
420 HNS_ROCE_V2_WQE_OP_LOCAL_INV
);
422 case IB_WR_ATOMIC_CMP_AND_SWP
:
423 roce_set_field(rc_sq_wqe
->byte_4
,
424 V2_RC_SEND_WQE_BYTE_4_OPCODE_M
,
425 V2_RC_SEND_WQE_BYTE_4_OPCODE_S
,
426 HNS_ROCE_V2_WQE_OP_ATOM_CMP_AND_SWAP
);
428 case IB_WR_ATOMIC_FETCH_AND_ADD
:
429 roce_set_field(rc_sq_wqe
->byte_4
,
430 V2_RC_SEND_WQE_BYTE_4_OPCODE_M
,
431 V2_RC_SEND_WQE_BYTE_4_OPCODE_S
,
432 HNS_ROCE_V2_WQE_OP_ATOM_FETCH_AND_ADD
);
434 case IB_WR_MASKED_ATOMIC_CMP_AND_SWP
:
435 roce_set_field(rc_sq_wqe
->byte_4
,
436 V2_RC_SEND_WQE_BYTE_4_OPCODE_M
,
437 V2_RC_SEND_WQE_BYTE_4_OPCODE_S
,
438 HNS_ROCE_V2_WQE_OP_ATOM_MSK_CMP_AND_SWAP
);
440 case IB_WR_MASKED_ATOMIC_FETCH_AND_ADD
:
441 roce_set_field(rc_sq_wqe
->byte_4
,
442 V2_RC_SEND_WQE_BYTE_4_OPCODE_M
,
443 V2_RC_SEND_WQE_BYTE_4_OPCODE_S
,
444 HNS_ROCE_V2_WQE_OP_ATOM_MSK_FETCH_AND_ADD
);
447 roce_set_field(rc_sq_wqe
->byte_4
,
448 V2_RC_SEND_WQE_BYTE_4_OPCODE_M
,
449 V2_RC_SEND_WQE_BYTE_4_OPCODE_S
,
450 HNS_ROCE_V2_WQE_OP_MASK
);
454 wqe
+= sizeof(struct hns_roce_v2_rc_send_wqe
);
457 ret
= set_rwqe_data_seg(ibqp
, wr
, rc_sq_wqe
, wqe
,
463 dev_err(dev
, "Illegal qp_type(0x%x)\n", ibqp
->qp_type
);
464 spin_unlock_irqrestore(&qp
->sq
.lock
, flags
);
479 roce_set_field(sq_db
.byte_4
, V2_DB_BYTE_4_TAG_M
,
480 V2_DB_BYTE_4_TAG_S
, qp
->doorbell_qpn
);
481 roce_set_field(sq_db
.byte_4
, V2_DB_BYTE_4_CMD_M
,
482 V2_DB_BYTE_4_CMD_S
, HNS_ROCE_V2_SQ_DB
);
483 roce_set_field(sq_db
.parameter
, V2_DB_PARAMETER_CONS_IDX_M
,
484 V2_DB_PARAMETER_CONS_IDX_S
,
485 qp
->sq
.head
& ((qp
->sq
.wqe_cnt
<< 1) - 1));
486 roce_set_field(sq_db
.parameter
, V2_DB_PARAMETER_SL_M
,
487 V2_DB_PARAMETER_SL_S
, qp
->sl
);
489 hns_roce_write64_k((__le32
*)&sq_db
, qp
->sq
.db_reg_l
);
491 qp
->sq_next_wqe
= ind
;
492 qp
->next_sge
= sge_ind
;
495 spin_unlock_irqrestore(&qp
->sq
.lock
, flags
);
500 static int hns_roce_v2_post_recv(struct ib_qp
*ibqp
, struct ib_recv_wr
*wr
,
501 struct ib_recv_wr
**bad_wr
)
503 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
504 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
505 struct hns_roce_v2_wqe_data_seg
*dseg
;
506 struct hns_roce_rinl_sge
*sge_list
;
507 struct device
*dev
= hr_dev
->dev
;
515 spin_lock_irqsave(&hr_qp
->rq
.lock
, flags
);
516 ind
= hr_qp
->rq
.head
& (hr_qp
->rq
.wqe_cnt
- 1);
518 if (hr_qp
->state
== IB_QPS_RESET
|| hr_qp
->state
== IB_QPS_ERR
) {
519 spin_unlock_irqrestore(&hr_qp
->rq
.lock
, flags
);
524 for (nreq
= 0; wr
; ++nreq
, wr
= wr
->next
) {
525 if (hns_roce_wq_overflow(&hr_qp
->rq
, nreq
,
526 hr_qp
->ibqp
.recv_cq
)) {
532 if (unlikely(wr
->num_sge
> hr_qp
->rq
.max_gs
)) {
533 dev_err(dev
, "rq:num_sge=%d > qp->sq.max_gs=%d\n",
534 wr
->num_sge
, hr_qp
->rq
.max_gs
);
540 wqe
= get_recv_wqe(hr_qp
, ind
);
541 dseg
= (struct hns_roce_v2_wqe_data_seg
*)wqe
;
542 for (i
= 0; i
< wr
->num_sge
; i
++) {
543 if (!wr
->sg_list
[i
].length
)
545 set_data_seg_v2(dseg
, wr
->sg_list
+ i
);
549 if (i
< hr_qp
->rq
.max_gs
) {
550 dseg
[i
].lkey
= cpu_to_le32(HNS_ROCE_INVALID_LKEY
);
554 /* rq support inline data */
555 if (hr_dev
->caps
.flags
& HNS_ROCE_CAP_FLAG_RQ_INLINE
) {
556 sge_list
= hr_qp
->rq_inl_buf
.wqe_list
[ind
].sg_list
;
557 hr_qp
->rq_inl_buf
.wqe_list
[ind
].sge_cnt
=
559 for (i
= 0; i
< wr
->num_sge
; i
++) {
561 (void *)(u64
)wr
->sg_list
[i
].addr
;
562 sge_list
[i
].len
= wr
->sg_list
[i
].length
;
566 hr_qp
->rq
.wrid
[ind
] = wr
->wr_id
;
568 ind
= (ind
+ 1) & (hr_qp
->rq
.wqe_cnt
- 1);
573 hr_qp
->rq
.head
+= nreq
;
577 *hr_qp
->rdb
.db_record
= hr_qp
->rq
.head
& 0xffff;
579 spin_unlock_irqrestore(&hr_qp
->rq
.lock
, flags
);
584 static int hns_roce_cmq_space(struct hns_roce_v2_cmq_ring
*ring
)
586 int ntu
= ring
->next_to_use
;
587 int ntc
= ring
->next_to_clean
;
588 int used
= (ntu
- ntc
+ ring
->desc_num
) % ring
->desc_num
;
590 return ring
->desc_num
- used
- 1;
593 static int hns_roce_alloc_cmq_desc(struct hns_roce_dev
*hr_dev
,
594 struct hns_roce_v2_cmq_ring
*ring
)
596 int size
= ring
->desc_num
* sizeof(struct hns_roce_cmq_desc
);
598 ring
->desc
= kzalloc(size
, GFP_KERNEL
);
602 ring
->desc_dma_addr
= dma_map_single(hr_dev
->dev
, ring
->desc
, size
,
604 if (dma_mapping_error(hr_dev
->dev
, ring
->desc_dma_addr
)) {
605 ring
->desc_dma_addr
= 0;
614 static void hns_roce_free_cmq_desc(struct hns_roce_dev
*hr_dev
,
615 struct hns_roce_v2_cmq_ring
*ring
)
617 dma_unmap_single(hr_dev
->dev
, ring
->desc_dma_addr
,
618 ring
->desc_num
* sizeof(struct hns_roce_cmq_desc
),
623 static int hns_roce_init_cmq_ring(struct hns_roce_dev
*hr_dev
, bool ring_type
)
625 struct hns_roce_v2_priv
*priv
= (struct hns_roce_v2_priv
*)hr_dev
->priv
;
626 struct hns_roce_v2_cmq_ring
*ring
= (ring_type
== TYPE_CSQ
) ?
627 &priv
->cmq
.csq
: &priv
->cmq
.crq
;
629 ring
->flag
= ring_type
;
630 ring
->next_to_clean
= 0;
631 ring
->next_to_use
= 0;
633 return hns_roce_alloc_cmq_desc(hr_dev
, ring
);
636 static void hns_roce_cmq_init_regs(struct hns_roce_dev
*hr_dev
, bool ring_type
)
638 struct hns_roce_v2_priv
*priv
= (struct hns_roce_v2_priv
*)hr_dev
->priv
;
639 struct hns_roce_v2_cmq_ring
*ring
= (ring_type
== TYPE_CSQ
) ?
640 &priv
->cmq
.csq
: &priv
->cmq
.crq
;
641 dma_addr_t dma
= ring
->desc_dma_addr
;
643 if (ring_type
== TYPE_CSQ
) {
644 roce_write(hr_dev
, ROCEE_TX_CMQ_BASEADDR_L_REG
, (u32
)dma
);
645 roce_write(hr_dev
, ROCEE_TX_CMQ_BASEADDR_H_REG
,
647 roce_write(hr_dev
, ROCEE_TX_CMQ_DEPTH_REG
,
648 (ring
->desc_num
>> HNS_ROCE_CMQ_DESC_NUM_S
) |
649 HNS_ROCE_CMQ_ENABLE
);
650 roce_write(hr_dev
, ROCEE_TX_CMQ_HEAD_REG
, 0);
651 roce_write(hr_dev
, ROCEE_TX_CMQ_TAIL_REG
, 0);
653 roce_write(hr_dev
, ROCEE_RX_CMQ_BASEADDR_L_REG
, (u32
)dma
);
654 roce_write(hr_dev
, ROCEE_RX_CMQ_BASEADDR_H_REG
,
656 roce_write(hr_dev
, ROCEE_RX_CMQ_DEPTH_REG
,
657 (ring
->desc_num
>> HNS_ROCE_CMQ_DESC_NUM_S
) |
658 HNS_ROCE_CMQ_ENABLE
);
659 roce_write(hr_dev
, ROCEE_RX_CMQ_HEAD_REG
, 0);
660 roce_write(hr_dev
, ROCEE_RX_CMQ_TAIL_REG
, 0);
664 static int hns_roce_v2_cmq_init(struct hns_roce_dev
*hr_dev
)
666 struct hns_roce_v2_priv
*priv
= (struct hns_roce_v2_priv
*)hr_dev
->priv
;
669 /* Setup the queue entries for command queue */
670 priv
->cmq
.csq
.desc_num
= 1024;
671 priv
->cmq
.crq
.desc_num
= 1024;
673 /* Setup the lock for command queue */
674 spin_lock_init(&priv
->cmq
.csq
.lock
);
675 spin_lock_init(&priv
->cmq
.crq
.lock
);
677 /* Setup Tx write back timeout */
678 priv
->cmq
.tx_timeout
= HNS_ROCE_CMQ_TX_TIMEOUT
;
681 ret
= hns_roce_init_cmq_ring(hr_dev
, TYPE_CSQ
);
683 dev_err(hr_dev
->dev
, "Init CSQ error, ret = %d.\n", ret
);
688 ret
= hns_roce_init_cmq_ring(hr_dev
, TYPE_CRQ
);
690 dev_err(hr_dev
->dev
, "Init CRQ error, ret = %d.\n", ret
);
695 hns_roce_cmq_init_regs(hr_dev
, TYPE_CSQ
);
698 hns_roce_cmq_init_regs(hr_dev
, TYPE_CRQ
);
703 hns_roce_free_cmq_desc(hr_dev
, &priv
->cmq
.csq
);
708 static void hns_roce_v2_cmq_exit(struct hns_roce_dev
*hr_dev
)
710 struct hns_roce_v2_priv
*priv
= (struct hns_roce_v2_priv
*)hr_dev
->priv
;
712 hns_roce_free_cmq_desc(hr_dev
, &priv
->cmq
.csq
);
713 hns_roce_free_cmq_desc(hr_dev
, &priv
->cmq
.crq
);
716 static void hns_roce_cmq_setup_basic_desc(struct hns_roce_cmq_desc
*desc
,
717 enum hns_roce_opcode_type opcode
,
720 memset((void *)desc
, 0, sizeof(struct hns_roce_cmq_desc
));
721 desc
->opcode
= cpu_to_le16(opcode
);
723 cpu_to_le16(HNS_ROCE_CMD_FLAG_NO_INTR
| HNS_ROCE_CMD_FLAG_IN
);
725 desc
->flag
|= cpu_to_le16(HNS_ROCE_CMD_FLAG_WR
);
727 desc
->flag
&= cpu_to_le16(~HNS_ROCE_CMD_FLAG_WR
);
730 static int hns_roce_cmq_csq_done(struct hns_roce_dev
*hr_dev
)
732 struct hns_roce_v2_priv
*priv
= (struct hns_roce_v2_priv
*)hr_dev
->priv
;
733 u32 head
= roce_read(hr_dev
, ROCEE_TX_CMQ_HEAD_REG
);
735 return head
== priv
->cmq
.csq
.next_to_use
;
738 static int hns_roce_cmq_csq_clean(struct hns_roce_dev
*hr_dev
)
740 struct hns_roce_v2_priv
*priv
= (struct hns_roce_v2_priv
*)hr_dev
->priv
;
741 struct hns_roce_v2_cmq_ring
*csq
= &priv
->cmq
.csq
;
742 struct hns_roce_cmq_desc
*desc
;
743 u16 ntc
= csq
->next_to_clean
;
747 desc
= &csq
->desc
[ntc
];
748 head
= roce_read(hr_dev
, ROCEE_TX_CMQ_HEAD_REG
);
749 while (head
!= ntc
) {
750 memset(desc
, 0, sizeof(*desc
));
752 if (ntc
== csq
->desc_num
)
754 desc
= &csq
->desc
[ntc
];
757 csq
->next_to_clean
= ntc
;
762 static int hns_roce_cmq_send(struct hns_roce_dev
*hr_dev
,
763 struct hns_roce_cmq_desc
*desc
, int num
)
765 struct hns_roce_v2_priv
*priv
= (struct hns_roce_v2_priv
*)hr_dev
->priv
;
766 struct hns_roce_v2_cmq_ring
*csq
= &priv
->cmq
.csq
;
767 struct hns_roce_cmq_desc
*desc_to_use
;
768 bool complete
= false;
775 spin_lock_bh(&csq
->lock
);
777 if (num
> hns_roce_cmq_space(csq
)) {
778 spin_unlock_bh(&csq
->lock
);
783 * Record the location of desc in the cmq for this time
784 * which will be use for hardware to write back
786 ntc
= csq
->next_to_use
;
788 while (handle
< num
) {
789 desc_to_use
= &csq
->desc
[csq
->next_to_use
];
790 *desc_to_use
= desc
[handle
];
791 dev_dbg(hr_dev
->dev
, "set cmq desc:\n");
793 if (csq
->next_to_use
== csq
->desc_num
)
794 csq
->next_to_use
= 0;
798 /* Write to hardware */
799 roce_write(hr_dev
, ROCEE_TX_CMQ_TAIL_REG
, csq
->next_to_use
);
802 * If the command is sync, wait for the firmware to write back,
803 * if multi descriptors to be sent, use the first one to check
805 if ((desc
->flag
) & HNS_ROCE_CMD_FLAG_NO_INTR
) {
807 if (hns_roce_cmq_csq_done(hr_dev
))
811 } while (timeout
< priv
->cmq
.tx_timeout
);
814 if (hns_roce_cmq_csq_done(hr_dev
)) {
817 while (handle
< num
) {
818 /* get the result of hardware write back */
819 desc_to_use
= &csq
->desc
[ntc
];
820 desc
[handle
] = *desc_to_use
;
821 dev_dbg(hr_dev
->dev
, "Get cmq desc:\n");
822 desc_ret
= desc
[handle
].retval
;
823 if (desc_ret
== CMD_EXEC_SUCCESS
)
827 priv
->cmq
.last_status
= desc_ret
;
830 if (ntc
== csq
->desc_num
)
838 /* clean the command send queue */
839 handle
= hns_roce_cmq_csq_clean(hr_dev
);
841 dev_warn(hr_dev
->dev
, "Cleaned %d, need to clean %d\n",
844 spin_unlock_bh(&csq
->lock
);
849 static int hns_roce_cmq_query_hw_info(struct hns_roce_dev
*hr_dev
)
851 struct hns_roce_query_version
*resp
;
852 struct hns_roce_cmq_desc desc
;
855 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_QUERY_HW_VER
, true);
856 ret
= hns_roce_cmq_send(hr_dev
, &desc
, 1);
860 resp
= (struct hns_roce_query_version
*)desc
.data
;
861 hr_dev
->hw_rev
= le32_to_cpu(resp
->rocee_hw_version
);
862 hr_dev
->vendor_id
= le32_to_cpu(resp
->rocee_vendor_id
);
867 static int hns_roce_config_global_param(struct hns_roce_dev
*hr_dev
)
869 struct hns_roce_cfg_global_param
*req
;
870 struct hns_roce_cmq_desc desc
;
872 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_CFG_GLOBAL_PARAM
,
875 req
= (struct hns_roce_cfg_global_param
*)desc
.data
;
876 memset(req
, 0, sizeof(*req
));
877 roce_set_field(req
->time_cfg_udp_port
,
878 CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_M
,
879 CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_S
, 0x3e8);
880 roce_set_field(req
->time_cfg_udp_port
,
881 CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_M
,
882 CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_S
, 0x12b7);
884 return hns_roce_cmq_send(hr_dev
, &desc
, 1);
887 static int hns_roce_query_pf_resource(struct hns_roce_dev
*hr_dev
)
889 struct hns_roce_cmq_desc desc
[2];
890 struct hns_roce_pf_res
*res
;
894 for (i
= 0; i
< 2; i
++) {
895 hns_roce_cmq_setup_basic_desc(&desc
[i
],
896 HNS_ROCE_OPC_QUERY_PF_RES
, true);
899 desc
[i
].flag
|= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT
);
901 desc
[i
].flag
&= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT
);
904 ret
= hns_roce_cmq_send(hr_dev
, desc
, 2);
908 res
= (struct hns_roce_pf_res
*)desc
[0].data
;
910 hr_dev
->caps
.qpc_bt_num
= roce_get_field(res
->qpc_bt_idx_num
,
911 PF_RES_DATA_1_PF_QPC_BT_NUM_M
,
912 PF_RES_DATA_1_PF_QPC_BT_NUM_S
);
913 hr_dev
->caps
.srqc_bt_num
= roce_get_field(res
->srqc_bt_idx_num
,
914 PF_RES_DATA_2_PF_SRQC_BT_NUM_M
,
915 PF_RES_DATA_2_PF_SRQC_BT_NUM_S
);
916 hr_dev
->caps
.cqc_bt_num
= roce_get_field(res
->cqc_bt_idx_num
,
917 PF_RES_DATA_3_PF_CQC_BT_NUM_M
,
918 PF_RES_DATA_3_PF_CQC_BT_NUM_S
);
919 hr_dev
->caps
.mpt_bt_num
= roce_get_field(res
->mpt_bt_idx_num
,
920 PF_RES_DATA_4_PF_MPT_BT_NUM_M
,
921 PF_RES_DATA_4_PF_MPT_BT_NUM_S
);
926 static int hns_roce_alloc_vf_resource(struct hns_roce_dev
*hr_dev
)
928 struct hns_roce_cmq_desc desc
[2];
929 struct hns_roce_vf_res_a
*req_a
;
930 struct hns_roce_vf_res_b
*req_b
;
933 req_a
= (struct hns_roce_vf_res_a
*)desc
[0].data
;
934 req_b
= (struct hns_roce_vf_res_b
*)desc
[1].data
;
935 memset(req_a
, 0, sizeof(*req_a
));
936 memset(req_b
, 0, sizeof(*req_b
));
937 for (i
= 0; i
< 2; i
++) {
938 hns_roce_cmq_setup_basic_desc(&desc
[i
],
939 HNS_ROCE_OPC_ALLOC_VF_RES
, false);
942 desc
[i
].flag
|= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT
);
944 desc
[i
].flag
&= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT
);
947 roce_set_field(req_a
->vf_qpc_bt_idx_num
,
948 VF_RES_A_DATA_1_VF_QPC_BT_IDX_M
,
949 VF_RES_A_DATA_1_VF_QPC_BT_IDX_S
, 0);
950 roce_set_field(req_a
->vf_qpc_bt_idx_num
,
951 VF_RES_A_DATA_1_VF_QPC_BT_NUM_M
,
952 VF_RES_A_DATA_1_VF_QPC_BT_NUM_S
,
953 HNS_ROCE_VF_QPC_BT_NUM
);
955 roce_set_field(req_a
->vf_srqc_bt_idx_num
,
956 VF_RES_A_DATA_2_VF_SRQC_BT_IDX_M
,
957 VF_RES_A_DATA_2_VF_SRQC_BT_IDX_S
, 0);
958 roce_set_field(req_a
->vf_srqc_bt_idx_num
,
959 VF_RES_A_DATA_2_VF_SRQC_BT_NUM_M
,
960 VF_RES_A_DATA_2_VF_SRQC_BT_NUM_S
,
961 HNS_ROCE_VF_SRQC_BT_NUM
);
963 roce_set_field(req_a
->vf_cqc_bt_idx_num
,
964 VF_RES_A_DATA_3_VF_CQC_BT_IDX_M
,
965 VF_RES_A_DATA_3_VF_CQC_BT_IDX_S
, 0);
966 roce_set_field(req_a
->vf_cqc_bt_idx_num
,
967 VF_RES_A_DATA_3_VF_CQC_BT_NUM_M
,
968 VF_RES_A_DATA_3_VF_CQC_BT_NUM_S
,
969 HNS_ROCE_VF_CQC_BT_NUM
);
971 roce_set_field(req_a
->vf_mpt_bt_idx_num
,
972 VF_RES_A_DATA_4_VF_MPT_BT_IDX_M
,
973 VF_RES_A_DATA_4_VF_MPT_BT_IDX_S
, 0);
974 roce_set_field(req_a
->vf_mpt_bt_idx_num
,
975 VF_RES_A_DATA_4_VF_MPT_BT_NUM_M
,
976 VF_RES_A_DATA_4_VF_MPT_BT_NUM_S
,
977 HNS_ROCE_VF_MPT_BT_NUM
);
979 roce_set_field(req_a
->vf_eqc_bt_idx_num
,
980 VF_RES_A_DATA_5_VF_EQC_IDX_M
,
981 VF_RES_A_DATA_5_VF_EQC_IDX_S
, 0);
982 roce_set_field(req_a
->vf_eqc_bt_idx_num
,
983 VF_RES_A_DATA_5_VF_EQC_NUM_M
,
984 VF_RES_A_DATA_5_VF_EQC_NUM_S
,
985 HNS_ROCE_VF_EQC_NUM
);
987 roce_set_field(req_b
->vf_smac_idx_num
,
988 VF_RES_B_DATA_1_VF_SMAC_IDX_M
,
989 VF_RES_B_DATA_1_VF_SMAC_IDX_S
, 0);
990 roce_set_field(req_b
->vf_smac_idx_num
,
991 VF_RES_B_DATA_1_VF_SMAC_NUM_M
,
992 VF_RES_B_DATA_1_VF_SMAC_NUM_S
,
993 HNS_ROCE_VF_SMAC_NUM
);
995 roce_set_field(req_b
->vf_sgid_idx_num
,
996 VF_RES_B_DATA_2_VF_SGID_IDX_M
,
997 VF_RES_B_DATA_2_VF_SGID_IDX_S
, 0);
998 roce_set_field(req_b
->vf_sgid_idx_num
,
999 VF_RES_B_DATA_2_VF_SGID_NUM_M
,
1000 VF_RES_B_DATA_2_VF_SGID_NUM_S
,
1001 HNS_ROCE_VF_SGID_NUM
);
1003 roce_set_field(req_b
->vf_qid_idx_sl_num
,
1004 VF_RES_B_DATA_3_VF_QID_IDX_M
,
1005 VF_RES_B_DATA_3_VF_QID_IDX_S
, 0);
1006 roce_set_field(req_b
->vf_qid_idx_sl_num
,
1007 VF_RES_B_DATA_3_VF_SL_NUM_M
,
1008 VF_RES_B_DATA_3_VF_SL_NUM_S
,
1009 HNS_ROCE_VF_SL_NUM
);
1013 return hns_roce_cmq_send(hr_dev
, desc
, 2);
1016 static int hns_roce_v2_set_bt(struct hns_roce_dev
*hr_dev
)
1018 u8 srqc_hop_num
= hr_dev
->caps
.srqc_hop_num
;
1019 u8 qpc_hop_num
= hr_dev
->caps
.qpc_hop_num
;
1020 u8 cqc_hop_num
= hr_dev
->caps
.cqc_hop_num
;
1021 u8 mpt_hop_num
= hr_dev
->caps
.mpt_hop_num
;
1022 struct hns_roce_cfg_bt_attr
*req
;
1023 struct hns_roce_cmq_desc desc
;
1025 hns_roce_cmq_setup_basic_desc(&desc
, HNS_ROCE_OPC_CFG_BT_ATTR
, false);
1026 req
= (struct hns_roce_cfg_bt_attr
*)desc
.data
;
1027 memset(req
, 0, sizeof(*req
));
1029 roce_set_field(req
->vf_qpc_cfg
, CFG_BT_ATTR_DATA_0_VF_QPC_BA_PGSZ_M
,
1030 CFG_BT_ATTR_DATA_0_VF_QPC_BA_PGSZ_S
,
1031 hr_dev
->caps
.qpc_ba_pg_sz
);
1032 roce_set_field(req
->vf_qpc_cfg
, CFG_BT_ATTR_DATA_0_VF_QPC_BUF_PGSZ_M
,
1033 CFG_BT_ATTR_DATA_0_VF_QPC_BUF_PGSZ_S
,
1034 hr_dev
->caps
.qpc_buf_pg_sz
);
1035 roce_set_field(req
->vf_qpc_cfg
, CFG_BT_ATTR_DATA_0_VF_QPC_HOPNUM_M
,
1036 CFG_BT_ATTR_DATA_0_VF_QPC_HOPNUM_S
,
1037 qpc_hop_num
== HNS_ROCE_HOP_NUM_0
? 0 : qpc_hop_num
);
1039 roce_set_field(req
->vf_srqc_cfg
, CFG_BT_ATTR_DATA_1_VF_SRQC_BA_PGSZ_M
,
1040 CFG_BT_ATTR_DATA_1_VF_SRQC_BA_PGSZ_S
,
1041 hr_dev
->caps
.srqc_ba_pg_sz
);
1042 roce_set_field(req
->vf_srqc_cfg
, CFG_BT_ATTR_DATA_1_VF_SRQC_BUF_PGSZ_M
,
1043 CFG_BT_ATTR_DATA_1_VF_SRQC_BUF_PGSZ_S
,
1044 hr_dev
->caps
.srqc_buf_pg_sz
);
1045 roce_set_field(req
->vf_srqc_cfg
, CFG_BT_ATTR_DATA_1_VF_SRQC_HOPNUM_M
,
1046 CFG_BT_ATTR_DATA_1_VF_SRQC_HOPNUM_S
,
1047 srqc_hop_num
== HNS_ROCE_HOP_NUM_0
? 0 : srqc_hop_num
);
1049 roce_set_field(req
->vf_cqc_cfg
, CFG_BT_ATTR_DATA_2_VF_CQC_BA_PGSZ_M
,
1050 CFG_BT_ATTR_DATA_2_VF_CQC_BA_PGSZ_S
,
1051 hr_dev
->caps
.cqc_ba_pg_sz
);
1052 roce_set_field(req
->vf_cqc_cfg
, CFG_BT_ATTR_DATA_2_VF_CQC_BUF_PGSZ_M
,
1053 CFG_BT_ATTR_DATA_2_VF_CQC_BUF_PGSZ_S
,
1054 hr_dev
->caps
.cqc_buf_pg_sz
);
1055 roce_set_field(req
->vf_cqc_cfg
, CFG_BT_ATTR_DATA_2_VF_CQC_HOPNUM_M
,
1056 CFG_BT_ATTR_DATA_2_VF_CQC_HOPNUM_S
,
1057 cqc_hop_num
== HNS_ROCE_HOP_NUM_0
? 0 : cqc_hop_num
);
1059 roce_set_field(req
->vf_mpt_cfg
, CFG_BT_ATTR_DATA_3_VF_MPT_BA_PGSZ_M
,
1060 CFG_BT_ATTR_DATA_3_VF_MPT_BA_PGSZ_S
,
1061 hr_dev
->caps
.mpt_ba_pg_sz
);
1062 roce_set_field(req
->vf_mpt_cfg
, CFG_BT_ATTR_DATA_3_VF_MPT_BUF_PGSZ_M
,
1063 CFG_BT_ATTR_DATA_3_VF_MPT_BUF_PGSZ_S
,
1064 hr_dev
->caps
.mpt_buf_pg_sz
);
1065 roce_set_field(req
->vf_mpt_cfg
, CFG_BT_ATTR_DATA_3_VF_MPT_HOPNUM_M
,
1066 CFG_BT_ATTR_DATA_3_VF_MPT_HOPNUM_S
,
1067 mpt_hop_num
== HNS_ROCE_HOP_NUM_0
? 0 : mpt_hop_num
);
1069 return hns_roce_cmq_send(hr_dev
, &desc
, 1);
1072 static int hns_roce_v2_profile(struct hns_roce_dev
*hr_dev
)
1074 struct hns_roce_caps
*caps
= &hr_dev
->caps
;
1077 ret
= hns_roce_cmq_query_hw_info(hr_dev
);
1079 dev_err(hr_dev
->dev
, "Query firmware version fail, ret = %d.\n",
1084 ret
= hns_roce_config_global_param(hr_dev
);
1086 dev_err(hr_dev
->dev
, "Configure global param fail, ret = %d.\n",
1091 /* Get pf resource owned by every pf */
1092 ret
= hns_roce_query_pf_resource(hr_dev
);
1094 dev_err(hr_dev
->dev
, "Query pf resource fail, ret = %d.\n",
1099 ret
= hns_roce_alloc_vf_resource(hr_dev
);
1101 dev_err(hr_dev
->dev
, "Allocate vf resource fail, ret = %d.\n",
1106 hr_dev
->vendor_part_id
= 0;
1107 hr_dev
->sys_image_guid
= 0;
1109 caps
->num_qps
= HNS_ROCE_V2_MAX_QP_NUM
;
1110 caps
->max_wqes
= HNS_ROCE_V2_MAX_WQE_NUM
;
1111 caps
->num_cqs
= HNS_ROCE_V2_MAX_CQ_NUM
;
1112 caps
->max_cqes
= HNS_ROCE_V2_MAX_CQE_NUM
;
1113 caps
->max_sq_sg
= HNS_ROCE_V2_MAX_SQ_SGE_NUM
;
1114 caps
->max_rq_sg
= HNS_ROCE_V2_MAX_RQ_SGE_NUM
;
1115 caps
->max_sq_inline
= HNS_ROCE_V2_MAX_SQ_INLINE
;
1116 caps
->num_uars
= HNS_ROCE_V2_UAR_NUM
;
1117 caps
->phy_num_uars
= HNS_ROCE_V2_PHY_UAR_NUM
;
1118 caps
->num_aeq_vectors
= HNS_ROCE_V2_AEQE_VEC_NUM
;
1119 caps
->num_comp_vectors
= HNS_ROCE_V2_COMP_VEC_NUM
;
1120 caps
->num_other_vectors
= HNS_ROCE_V2_ABNORMAL_VEC_NUM
;
1121 caps
->num_mtpts
= HNS_ROCE_V2_MAX_MTPT_NUM
;
1122 caps
->num_mtt_segs
= HNS_ROCE_V2_MAX_MTT_SEGS
;
1123 caps
->num_cqe_segs
= HNS_ROCE_V2_MAX_CQE_SEGS
;
1124 caps
->num_pds
= HNS_ROCE_V2_MAX_PD_NUM
;
1125 caps
->max_qp_init_rdma
= HNS_ROCE_V2_MAX_QP_INIT_RDMA
;
1126 caps
->max_qp_dest_rdma
= HNS_ROCE_V2_MAX_QP_DEST_RDMA
;
1127 caps
->max_sq_desc_sz
= HNS_ROCE_V2_MAX_SQ_DESC_SZ
;
1128 caps
->max_rq_desc_sz
= HNS_ROCE_V2_MAX_RQ_DESC_SZ
;
1129 caps
->max_srq_desc_sz
= HNS_ROCE_V2_MAX_SRQ_DESC_SZ
;
1130 caps
->qpc_entry_sz
= HNS_ROCE_V2_QPC_ENTRY_SZ
;
1131 caps
->irrl_entry_sz
= HNS_ROCE_V2_IRRL_ENTRY_SZ
;
1132 caps
->trrl_entry_sz
= HNS_ROCE_V2_TRRL_ENTRY_SZ
;
1133 caps
->cqc_entry_sz
= HNS_ROCE_V2_CQC_ENTRY_SZ
;
1134 caps
->mtpt_entry_sz
= HNS_ROCE_V2_MTPT_ENTRY_SZ
;
1135 caps
->mtt_entry_sz
= HNS_ROCE_V2_MTT_ENTRY_SZ
;
1136 caps
->cq_entry_sz
= HNS_ROCE_V2_CQE_ENTRY_SIZE
;
1137 caps
->page_size_cap
= HNS_ROCE_V2_PAGE_SIZE_SUPPORTED
;
1138 caps
->reserved_lkey
= 0;
1139 caps
->reserved_pds
= 0;
1140 caps
->reserved_mrws
= 1;
1141 caps
->reserved_uars
= 0;
1142 caps
->reserved_cqs
= 0;
1144 caps
->qpc_ba_pg_sz
= 0;
1145 caps
->qpc_buf_pg_sz
= 0;
1146 caps
->qpc_hop_num
= HNS_ROCE_CONTEXT_HOP_NUM
;
1147 caps
->srqc_ba_pg_sz
= 0;
1148 caps
->srqc_buf_pg_sz
= 0;
1149 caps
->srqc_hop_num
= HNS_ROCE_HOP_NUM_0
;
1150 caps
->cqc_ba_pg_sz
= 0;
1151 caps
->cqc_buf_pg_sz
= 0;
1152 caps
->cqc_hop_num
= HNS_ROCE_CONTEXT_HOP_NUM
;
1153 caps
->mpt_ba_pg_sz
= 0;
1154 caps
->mpt_buf_pg_sz
= 0;
1155 caps
->mpt_hop_num
= HNS_ROCE_CONTEXT_HOP_NUM
;
1156 caps
->pbl_ba_pg_sz
= 0;
1157 caps
->pbl_buf_pg_sz
= 0;
1158 caps
->pbl_hop_num
= HNS_ROCE_PBL_HOP_NUM
;
1159 caps
->mtt_ba_pg_sz
= 0;
1160 caps
->mtt_buf_pg_sz
= 0;
1161 caps
->mtt_hop_num
= HNS_ROCE_MTT_HOP_NUM
;
1162 caps
->cqe_ba_pg_sz
= 0;
1163 caps
->cqe_buf_pg_sz
= 0;
1164 caps
->cqe_hop_num
= HNS_ROCE_CQE_HOP_NUM
;
1165 caps
->eqe_ba_pg_sz
= 0;
1166 caps
->eqe_buf_pg_sz
= 0;
1167 caps
->eqe_hop_num
= HNS_ROCE_EQE_HOP_NUM
;
1168 caps
->chunk_sz
= HNS_ROCE_V2_TABLE_CHUNK_SIZE
;
1170 caps
->flags
= HNS_ROCE_CAP_FLAG_REREG_MR
|
1171 HNS_ROCE_CAP_FLAG_ROCE_V1_V2
|
1172 HNS_ROCE_CAP_FLAG_RQ_INLINE
|
1173 HNS_ROCE_CAP_FLAG_RECORD_DB
;
1174 caps
->pkey_table_len
[0] = 1;
1175 caps
->gid_table_len
[0] = HNS_ROCE_V2_GID_INDEX_NUM
;
1176 caps
->ceqe_depth
= HNS_ROCE_V2_COMP_EQE_NUM
;
1177 caps
->aeqe_depth
= HNS_ROCE_V2_ASYNC_EQE_NUM
;
1178 caps
->local_ca_ack_delay
= 0;
1179 caps
->max_mtu
= IB_MTU_4096
;
1181 ret
= hns_roce_v2_set_bt(hr_dev
);
1183 dev_err(hr_dev
->dev
, "Configure bt attribute fail, ret = %d.\n",
1189 static int hns_roce_v2_cmd_pending(struct hns_roce_dev
*hr_dev
)
1191 u32 status
= readl(hr_dev
->reg_base
+ ROCEE_VF_MB_STATUS_REG
);
1193 return status
>> HNS_ROCE_HW_RUN_BIT_SHIFT
;
1196 static int hns_roce_v2_cmd_complete(struct hns_roce_dev
*hr_dev
)
1198 u32 status
= readl(hr_dev
->reg_base
+ ROCEE_VF_MB_STATUS_REG
);
1200 return status
& HNS_ROCE_HW_MB_STATUS_MASK
;
1203 static int hns_roce_v2_post_mbox(struct hns_roce_dev
*hr_dev
, u64 in_param
,
1204 u64 out_param
, u32 in_modifier
, u8 op_modifier
,
1205 u16 op
, u16 token
, int event
)
1207 struct device
*dev
= hr_dev
->dev
;
1208 u32 __iomem
*hcr
= (u32 __iomem
*)(hr_dev
->reg_base
+
1209 ROCEE_VF_MB_CFG0_REG
);
1214 end
= msecs_to_jiffies(HNS_ROCE_V2_GO_BIT_TIMEOUT_MSECS
) + jiffies
;
1215 while (hns_roce_v2_cmd_pending(hr_dev
)) {
1216 if (time_after(jiffies
, end
)) {
1217 dev_dbg(dev
, "jiffies=%d end=%d\n", (int)jiffies
,
1224 roce_set_field(val0
, HNS_ROCE_VF_MB4_TAG_MASK
,
1225 HNS_ROCE_VF_MB4_TAG_SHIFT
, in_modifier
);
1226 roce_set_field(val0
, HNS_ROCE_VF_MB4_CMD_MASK
,
1227 HNS_ROCE_VF_MB4_CMD_SHIFT
, op
);
1228 roce_set_field(val1
, HNS_ROCE_VF_MB5_EVENT_MASK
,
1229 HNS_ROCE_VF_MB5_EVENT_SHIFT
, event
);
1230 roce_set_field(val1
, HNS_ROCE_VF_MB5_TOKEN_MASK
,
1231 HNS_ROCE_VF_MB5_TOKEN_SHIFT
, token
);
1233 writeq(in_param
, hcr
+ 0);
1234 writeq(out_param
, hcr
+ 2);
1236 /* Memory barrier */
1239 writel(val0
, hcr
+ 4);
1240 writel(val1
, hcr
+ 5);
1247 static int hns_roce_v2_chk_mbox(struct hns_roce_dev
*hr_dev
,
1248 unsigned long timeout
)
1250 struct device
*dev
= hr_dev
->dev
;
1251 unsigned long end
= 0;
1254 end
= msecs_to_jiffies(timeout
) + jiffies
;
1255 while (hns_roce_v2_cmd_pending(hr_dev
) && time_before(jiffies
, end
))
1258 if (hns_roce_v2_cmd_pending(hr_dev
)) {
1259 dev_err(dev
, "[cmd_poll]hw run cmd TIMEDOUT!\n");
1263 status
= hns_roce_v2_cmd_complete(hr_dev
);
1264 if (status
!= 0x1) {
1265 dev_err(dev
, "mailbox status 0x%x!\n", status
);
1272 static int hns_roce_v2_set_gid(struct hns_roce_dev
*hr_dev
, u8 port
,
1273 int gid_index
, union ib_gid
*gid
,
1274 const struct ib_gid_attr
*attr
)
1276 enum hns_roce_sgid_type sgid_type
= GID_TYPE_FLAG_ROCE_V1
;
1283 if (attr
->gid_type
== IB_GID_TYPE_ROCE
)
1284 sgid_type
= GID_TYPE_FLAG_ROCE_V1
;
1286 if (attr
->gid_type
== IB_GID_TYPE_ROCE_UDP_ENCAP
) {
1287 if (ipv6_addr_v4mapped((void *)gid
))
1288 sgid_type
= GID_TYPE_FLAG_ROCE_V2_IPV4
;
1290 sgid_type
= GID_TYPE_FLAG_ROCE_V2_IPV6
;
1293 p
= (u32
*)&gid
->raw
[0];
1294 roce_raw_write(*p
, hr_dev
->reg_base
+ ROCEE_VF_SGID_CFG0_REG
+
1297 p
= (u32
*)&gid
->raw
[4];
1298 roce_raw_write(*p
, hr_dev
->reg_base
+ ROCEE_VF_SGID_CFG1_REG
+
1301 p
= (u32
*)&gid
->raw
[8];
1302 roce_raw_write(*p
, hr_dev
->reg_base
+ ROCEE_VF_SGID_CFG2_REG
+
1305 p
= (u32
*)&gid
->raw
[0xc];
1306 roce_raw_write(*p
, hr_dev
->reg_base
+ ROCEE_VF_SGID_CFG3_REG
+
1309 val
= roce_read(hr_dev
, ROCEE_VF_SGID_CFG4_REG
+ 0x20 * gid_index
);
1310 roce_set_field(val
, ROCEE_VF_SGID_CFG4_SGID_TYPE_M
,
1311 ROCEE_VF_SGID_CFG4_SGID_TYPE_S
, sgid_type
);
1313 roce_write(hr_dev
, ROCEE_VF_SGID_CFG4_REG
+ 0x20 * gid_index
, val
);
1318 static int hns_roce_v2_set_mac(struct hns_roce_dev
*hr_dev
, u8 phy_port
,
1325 reg_smac_l
= *(u32
*)(&addr
[0]);
1326 roce_raw_write(reg_smac_l
, hr_dev
->reg_base
+ ROCEE_VF_SMAC_CFG0_REG
+
1328 val
= roce_read(hr_dev
, ROCEE_VF_SMAC_CFG1_REG
+ 0x08 * phy_port
);
1330 reg_smac_h
= *(u16
*)(&addr
[4]);
1331 roce_set_field(val
, ROCEE_VF_SMAC_CFG1_VF_SMAC_H_M
,
1332 ROCEE_VF_SMAC_CFG1_VF_SMAC_H_S
, reg_smac_h
);
1333 roce_write(hr_dev
, ROCEE_VF_SMAC_CFG1_REG
+ 0x08 * phy_port
, val
);
1338 static int hns_roce_v2_write_mtpt(void *mb_buf
, struct hns_roce_mr
*mr
,
1339 unsigned long mtpt_idx
)
1341 struct hns_roce_v2_mpt_entry
*mpt_entry
;
1342 struct scatterlist
*sg
;
1350 memset(mpt_entry
, 0, sizeof(*mpt_entry
));
1352 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_MPT_ST_M
,
1353 V2_MPT_BYTE_4_MPT_ST_S
, V2_MPT_ST_VALID
);
1354 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_PBL_HOP_NUM_M
,
1355 V2_MPT_BYTE_4_PBL_HOP_NUM_S
, mr
->pbl_hop_num
==
1356 HNS_ROCE_HOP_NUM_0
? 0 : mr
->pbl_hop_num
);
1357 roce_set_field(mpt_entry
->byte_4_pd_hop_st
,
1358 V2_MPT_BYTE_4_PBL_BA_PG_SZ_M
,
1359 V2_MPT_BYTE_4_PBL_BA_PG_SZ_S
, mr
->pbl_ba_pg_sz
);
1360 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_PD_M
,
1361 V2_MPT_BYTE_4_PD_S
, mr
->pd
);
1362 mpt_entry
->byte_4_pd_hop_st
= cpu_to_le32(mpt_entry
->byte_4_pd_hop_st
);
1364 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_RA_EN_S
, 0);
1365 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_R_INV_EN_S
, 1);
1366 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_L_INV_EN_S
, 0);
1367 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_BIND_EN_S
,
1368 (mr
->access
& IB_ACCESS_MW_BIND
? 1 : 0));
1369 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_ATOMIC_EN_S
, 0);
1370 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_RR_EN_S
,
1371 (mr
->access
& IB_ACCESS_REMOTE_READ
? 1 : 0));
1372 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_RW_EN_S
,
1373 (mr
->access
& IB_ACCESS_REMOTE_WRITE
? 1 : 0));
1374 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_LW_EN_S
,
1375 (mr
->access
& IB_ACCESS_LOCAL_WRITE
? 1 : 0));
1376 mpt_entry
->byte_8_mw_cnt_en
= cpu_to_le32(mpt_entry
->byte_8_mw_cnt_en
);
1378 roce_set_bit(mpt_entry
->byte_12_mw_pa
, V2_MPT_BYTE_12_PA_S
,
1379 mr
->type
== MR_TYPE_MR
? 0 : 1);
1380 mpt_entry
->byte_12_mw_pa
= cpu_to_le32(mpt_entry
->byte_12_mw_pa
);
1382 mpt_entry
->len_l
= cpu_to_le32(lower_32_bits(mr
->size
));
1383 mpt_entry
->len_h
= cpu_to_le32(upper_32_bits(mr
->size
));
1384 mpt_entry
->lkey
= cpu_to_le32(mr
->key
);
1385 mpt_entry
->va_l
= cpu_to_le32(lower_32_bits(mr
->iova
));
1386 mpt_entry
->va_h
= cpu_to_le32(upper_32_bits(mr
->iova
));
1388 if (mr
->type
== MR_TYPE_DMA
)
1391 mpt_entry
->pbl_size
= cpu_to_le32(mr
->pbl_size
);
1393 mpt_entry
->pbl_ba_l
= cpu_to_le32(lower_32_bits(mr
->pbl_ba
>> 3));
1394 roce_set_field(mpt_entry
->byte_48_mode_ba
, V2_MPT_BYTE_48_PBL_BA_H_M
,
1395 V2_MPT_BYTE_48_PBL_BA_H_S
,
1396 upper_32_bits(mr
->pbl_ba
>> 3));
1397 mpt_entry
->byte_48_mode_ba
= cpu_to_le32(mpt_entry
->byte_48_mode_ba
);
1399 pages
= (u64
*)__get_free_page(GFP_KERNEL
);
1404 for_each_sg(mr
->umem
->sg_head
.sgl
, sg
, mr
->umem
->nmap
, entry
) {
1405 len
= sg_dma_len(sg
) >> PAGE_SHIFT
;
1406 for (j
= 0; j
< len
; ++j
) {
1407 page_addr
= sg_dma_address(sg
) +
1408 (j
<< mr
->umem
->page_shift
);
1409 pages
[i
] = page_addr
>> 6;
1411 /* Record the first 2 entry directly to MTPT table */
1412 if (i
>= HNS_ROCE_V2_MAX_INNER_MTPT_NUM
- 1)
1419 mpt_entry
->pa0_l
= cpu_to_le32(lower_32_bits(pages
[0]));
1420 roce_set_field(mpt_entry
->byte_56_pa0_h
, V2_MPT_BYTE_56_PA0_H_M
,
1421 V2_MPT_BYTE_56_PA0_H_S
,
1422 upper_32_bits(pages
[0]));
1423 mpt_entry
->byte_56_pa0_h
= cpu_to_le32(mpt_entry
->byte_56_pa0_h
);
1425 mpt_entry
->pa1_l
= cpu_to_le32(lower_32_bits(pages
[1]));
1426 roce_set_field(mpt_entry
->byte_64_buf_pa1
, V2_MPT_BYTE_64_PA1_H_M
,
1427 V2_MPT_BYTE_64_PA1_H_S
, upper_32_bits(pages
[1]));
1429 free_page((unsigned long)pages
);
1431 roce_set_field(mpt_entry
->byte_64_buf_pa1
,
1432 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M
,
1433 V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S
, mr
->pbl_buf_pg_sz
);
1434 mpt_entry
->byte_64_buf_pa1
= cpu_to_le32(mpt_entry
->byte_64_buf_pa1
);
1439 static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev
*hr_dev
,
1440 struct hns_roce_mr
*mr
, int flags
,
1441 u32 pdn
, int mr_access_flags
, u64 iova
,
1442 u64 size
, void *mb_buf
)
1444 struct hns_roce_v2_mpt_entry
*mpt_entry
= mb_buf
;
1446 if (flags
& IB_MR_REREG_PD
) {
1447 roce_set_field(mpt_entry
->byte_4_pd_hop_st
, V2_MPT_BYTE_4_PD_M
,
1448 V2_MPT_BYTE_4_PD_S
, pdn
);
1452 if (flags
& IB_MR_REREG_ACCESS
) {
1453 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
,
1454 V2_MPT_BYTE_8_BIND_EN_S
,
1455 (mr_access_flags
& IB_ACCESS_MW_BIND
? 1 : 0));
1456 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
,
1457 V2_MPT_BYTE_8_ATOMIC_EN_S
,
1458 (mr_access_flags
& IB_ACCESS_REMOTE_ATOMIC
? 1 : 0));
1459 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_RR_EN_S
,
1460 (mr_access_flags
& IB_ACCESS_REMOTE_READ
? 1 : 0));
1461 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_RW_EN_S
,
1462 (mr_access_flags
& IB_ACCESS_REMOTE_WRITE
? 1 : 0));
1463 roce_set_bit(mpt_entry
->byte_8_mw_cnt_en
, V2_MPT_BYTE_8_LW_EN_S
,
1464 (mr_access_flags
& IB_ACCESS_LOCAL_WRITE
? 1 : 0));
1467 if (flags
& IB_MR_REREG_TRANS
) {
1468 mpt_entry
->va_l
= cpu_to_le32(lower_32_bits(iova
));
1469 mpt_entry
->va_h
= cpu_to_le32(upper_32_bits(iova
));
1470 mpt_entry
->len_l
= cpu_to_le32(lower_32_bits(size
));
1471 mpt_entry
->len_h
= cpu_to_le32(upper_32_bits(size
));
1473 mpt_entry
->pbl_size
= cpu_to_le32(mr
->pbl_size
);
1474 mpt_entry
->pbl_ba_l
=
1475 cpu_to_le32(lower_32_bits(mr
->pbl_ba
>> 3));
1476 roce_set_field(mpt_entry
->byte_48_mode_ba
,
1477 V2_MPT_BYTE_48_PBL_BA_H_M
,
1478 V2_MPT_BYTE_48_PBL_BA_H_S
,
1479 upper_32_bits(mr
->pbl_ba
>> 3));
1480 mpt_entry
->byte_48_mode_ba
=
1481 cpu_to_le32(mpt_entry
->byte_48_mode_ba
);
1490 static void *get_cqe_v2(struct hns_roce_cq
*hr_cq
, int n
)
1492 return hns_roce_buf_offset(&hr_cq
->hr_buf
.hr_buf
,
1493 n
* HNS_ROCE_V2_CQE_ENTRY_SIZE
);
1496 static void *get_sw_cqe_v2(struct hns_roce_cq
*hr_cq
, int n
)
1498 struct hns_roce_v2_cqe
*cqe
= get_cqe_v2(hr_cq
, n
& hr_cq
->ib_cq
.cqe
);
1500 /* Get cqe when Owner bit is Conversely with the MSB of cons_idx */
1501 return (roce_get_bit(cqe
->byte_4
, V2_CQE_BYTE_4_OWNER_S
) ^
1502 !!(n
& (hr_cq
->ib_cq
.cqe
+ 1))) ? cqe
: NULL
;
1505 static struct hns_roce_v2_cqe
*next_cqe_sw_v2(struct hns_roce_cq
*hr_cq
)
1507 return get_sw_cqe_v2(hr_cq
, hr_cq
->cons_index
);
1510 static void hns_roce_v2_cq_set_ci(struct hns_roce_cq
*hr_cq
, u32 cons_index
)
1512 *hr_cq
->set_ci_db
= cons_index
& 0xffffff;
1515 static void __hns_roce_v2_cq_clean(struct hns_roce_cq
*hr_cq
, u32 qpn
,
1516 struct hns_roce_srq
*srq
)
1518 struct hns_roce_v2_cqe
*cqe
, *dest
;
1523 for (prod_index
= hr_cq
->cons_index
; get_sw_cqe_v2(hr_cq
, prod_index
);
1525 if (prod_index
== hr_cq
->cons_index
+ hr_cq
->ib_cq
.cqe
)
1530 * Now backwards through the CQ, removing CQ entries
1531 * that match our QP by overwriting them with next entries.
1533 while ((int) --prod_index
- (int) hr_cq
->cons_index
>= 0) {
1534 cqe
= get_cqe_v2(hr_cq
, prod_index
& hr_cq
->ib_cq
.cqe
);
1535 if ((roce_get_field(cqe
->byte_16
, V2_CQE_BYTE_16_LCL_QPN_M
,
1536 V2_CQE_BYTE_16_LCL_QPN_S
) &
1537 HNS_ROCE_V2_CQE_QPN_MASK
) == qpn
) {
1538 /* In v1 engine, not support SRQ */
1540 } else if (nfreed
) {
1541 dest
= get_cqe_v2(hr_cq
, (prod_index
+ nfreed
) &
1543 owner_bit
= roce_get_bit(dest
->byte_4
,
1544 V2_CQE_BYTE_4_OWNER_S
);
1545 memcpy(dest
, cqe
, sizeof(*cqe
));
1546 roce_set_bit(dest
->byte_4
, V2_CQE_BYTE_4_OWNER_S
,
1552 hr_cq
->cons_index
+= nfreed
;
1554 * Make sure update of buffer contents is done before
1555 * updating consumer index.
1558 hns_roce_v2_cq_set_ci(hr_cq
, hr_cq
->cons_index
);
1562 static void hns_roce_v2_cq_clean(struct hns_roce_cq
*hr_cq
, u32 qpn
,
1563 struct hns_roce_srq
*srq
)
1565 spin_lock_irq(&hr_cq
->lock
);
1566 __hns_roce_v2_cq_clean(hr_cq
, qpn
, srq
);
1567 spin_unlock_irq(&hr_cq
->lock
);
1570 static void hns_roce_v2_write_cqc(struct hns_roce_dev
*hr_dev
,
1571 struct hns_roce_cq
*hr_cq
, void *mb_buf
,
1572 u64
*mtts
, dma_addr_t dma_handle
, int nent
,
1575 struct hns_roce_v2_cq_context
*cq_context
;
1577 cq_context
= mb_buf
;
1578 memset(cq_context
, 0, sizeof(*cq_context
));
1580 roce_set_field(cq_context
->byte_4_pg_ceqn
, V2_CQC_BYTE_4_CQ_ST_M
,
1581 V2_CQC_BYTE_4_CQ_ST_S
, V2_CQ_STATE_VALID
);
1582 roce_set_field(cq_context
->byte_4_pg_ceqn
, V2_CQC_BYTE_4_ARM_ST_M
,
1583 V2_CQC_BYTE_4_ARM_ST_S
, REG_NXT_CEQE
);
1584 roce_set_field(cq_context
->byte_4_pg_ceqn
, V2_CQC_BYTE_4_SHIFT_M
,
1585 V2_CQC_BYTE_4_SHIFT_S
, ilog2((unsigned int)nent
));
1586 roce_set_field(cq_context
->byte_4_pg_ceqn
, V2_CQC_BYTE_4_CEQN_M
,
1587 V2_CQC_BYTE_4_CEQN_S
, vector
);
1588 cq_context
->byte_4_pg_ceqn
= cpu_to_le32(cq_context
->byte_4_pg_ceqn
);
1590 roce_set_field(cq_context
->byte_8_cqn
, V2_CQC_BYTE_8_CQN_M
,
1591 V2_CQC_BYTE_8_CQN_S
, hr_cq
->cqn
);
1593 cq_context
->cqe_cur_blk_addr
= (u32
)(mtts
[0] >> PAGE_ADDR_SHIFT
);
1594 cq_context
->cqe_cur_blk_addr
=
1595 cpu_to_le32(cq_context
->cqe_cur_blk_addr
);
1597 roce_set_field(cq_context
->byte_16_hop_addr
,
1598 V2_CQC_BYTE_16_CQE_CUR_BLK_ADDR_M
,
1599 V2_CQC_BYTE_16_CQE_CUR_BLK_ADDR_S
,
1600 cpu_to_le32((mtts
[0]) >> (32 + PAGE_ADDR_SHIFT
)));
1601 roce_set_field(cq_context
->byte_16_hop_addr
,
1602 V2_CQC_BYTE_16_CQE_HOP_NUM_M
,
1603 V2_CQC_BYTE_16_CQE_HOP_NUM_S
, hr_dev
->caps
.cqe_hop_num
==
1604 HNS_ROCE_HOP_NUM_0
? 0 : hr_dev
->caps
.cqe_hop_num
);
1606 cq_context
->cqe_nxt_blk_addr
= (u32
)(mtts
[1] >> PAGE_ADDR_SHIFT
);
1607 roce_set_field(cq_context
->byte_24_pgsz_addr
,
1608 V2_CQC_BYTE_24_CQE_NXT_BLK_ADDR_M
,
1609 V2_CQC_BYTE_24_CQE_NXT_BLK_ADDR_S
,
1610 cpu_to_le32((mtts
[1]) >> (32 + PAGE_ADDR_SHIFT
)));
1611 roce_set_field(cq_context
->byte_24_pgsz_addr
,
1612 V2_CQC_BYTE_24_CQE_BA_PG_SZ_M
,
1613 V2_CQC_BYTE_24_CQE_BA_PG_SZ_S
,
1614 hr_dev
->caps
.cqe_ba_pg_sz
);
1615 roce_set_field(cq_context
->byte_24_pgsz_addr
,
1616 V2_CQC_BYTE_24_CQE_BUF_PG_SZ_M
,
1617 V2_CQC_BYTE_24_CQE_BUF_PG_SZ_S
,
1618 hr_dev
->caps
.cqe_buf_pg_sz
);
1620 cq_context
->cqe_ba
= (u32
)(dma_handle
>> 3);
1622 roce_set_field(cq_context
->byte_40_cqe_ba
, V2_CQC_BYTE_40_CQE_BA_M
,
1623 V2_CQC_BYTE_40_CQE_BA_S
, (dma_handle
>> (32 + 3)));
1626 roce_set_bit(cq_context
->byte_44_db_record
,
1627 V2_CQC_BYTE_44_DB_RECORD_EN_S
, 1);
1629 roce_set_field(cq_context
->byte_44_db_record
,
1630 V2_CQC_BYTE_44_DB_RECORD_ADDR_M
,
1631 V2_CQC_BYTE_44_DB_RECORD_ADDR_S
,
1632 ((u32
)hr_cq
->db
.dma
) >> 1);
1633 cq_context
->db_record_addr
= hr_cq
->db
.dma
>> 32;
1635 roce_set_field(cq_context
->byte_56_cqe_period_maxcnt
,
1636 V2_CQC_BYTE_56_CQ_MAX_CNT_M
,
1637 V2_CQC_BYTE_56_CQ_MAX_CNT_S
,
1638 HNS_ROCE_V2_CQ_DEFAULT_BURST_NUM
);
1639 roce_set_field(cq_context
->byte_56_cqe_period_maxcnt
,
1640 V2_CQC_BYTE_56_CQ_PERIOD_M
,
1641 V2_CQC_BYTE_56_CQ_PERIOD_S
,
1642 HNS_ROCE_V2_CQ_DEFAULT_INTERVAL
);
1645 static int hns_roce_v2_req_notify_cq(struct ib_cq
*ibcq
,
1646 enum ib_cq_notify_flags flags
)
1648 struct hns_roce_cq
*hr_cq
= to_hr_cq(ibcq
);
1649 u32 notification_flag
;
1655 notification_flag
= (flags
& IB_CQ_SOLICITED_MASK
) == IB_CQ_SOLICITED
?
1656 V2_CQ_DB_REQ_NOT
: V2_CQ_DB_REQ_NOT_SOL
;
1658 * flags = 0; Notification Flag = 1, next
1659 * flags = 1; Notification Flag = 0, solocited
1661 roce_set_field(doorbell
[0], V2_CQ_DB_BYTE_4_TAG_M
, V2_DB_BYTE_4_TAG_S
,
1663 roce_set_field(doorbell
[0], V2_CQ_DB_BYTE_4_CMD_M
, V2_DB_BYTE_4_CMD_S
,
1664 HNS_ROCE_V2_CQ_DB_NTR
);
1665 roce_set_field(doorbell
[1], V2_CQ_DB_PARAMETER_CONS_IDX_M
,
1666 V2_CQ_DB_PARAMETER_CONS_IDX_S
,
1667 hr_cq
->cons_index
& ((hr_cq
->cq_depth
<< 1) - 1));
1668 roce_set_field(doorbell
[1], V2_CQ_DB_PARAMETER_CMD_SN_M
,
1669 V2_CQ_DB_PARAMETER_CMD_SN_S
, hr_cq
->arm_sn
& 0x3);
1670 roce_set_bit(doorbell
[1], V2_CQ_DB_PARAMETER_NOTIFY_S
,
1673 hns_roce_write64_k(doorbell
, hr_cq
->cq_db_l
);
1678 static int hns_roce_handle_recv_inl_wqe(struct hns_roce_v2_cqe
*cqe
,
1679 struct hns_roce_qp
**cur_qp
,
1682 struct hns_roce_rinl_sge
*sge_list
;
1683 u32 wr_num
, wr_cnt
, sge_num
;
1684 u32 sge_cnt
, data_len
, size
;
1687 wr_num
= roce_get_field(cqe
->byte_4
, V2_CQE_BYTE_4_WQE_INDX_M
,
1688 V2_CQE_BYTE_4_WQE_INDX_S
) & 0xffff;
1689 wr_cnt
= wr_num
& ((*cur_qp
)->rq
.wqe_cnt
- 1);
1691 sge_list
= (*cur_qp
)->rq_inl_buf
.wqe_list
[wr_cnt
].sg_list
;
1692 sge_num
= (*cur_qp
)->rq_inl_buf
.wqe_list
[wr_cnt
].sge_cnt
;
1693 wqe_buf
= get_recv_wqe(*cur_qp
, wr_cnt
);
1694 data_len
= wc
->byte_len
;
1696 for (sge_cnt
= 0; (sge_cnt
< sge_num
) && (data_len
); sge_cnt
++) {
1697 size
= min(sge_list
[sge_cnt
].len
, data_len
);
1698 memcpy((void *)sge_list
[sge_cnt
].addr
, wqe_buf
, size
);
1705 wc
->status
= IB_WC_LOC_LEN_ERR
;
1712 static int hns_roce_v2_poll_one(struct hns_roce_cq
*hr_cq
,
1713 struct hns_roce_qp
**cur_qp
, struct ib_wc
*wc
)
1715 struct hns_roce_dev
*hr_dev
;
1716 struct hns_roce_v2_cqe
*cqe
;
1717 struct hns_roce_qp
*hr_qp
;
1718 struct hns_roce_wq
*wq
;
1726 /* Find cqe according to consumer index */
1727 cqe
= next_cqe_sw_v2(hr_cq
);
1731 ++hr_cq
->cons_index
;
1732 /* Memory barrier */
1736 is_send
= !roce_get_bit(cqe
->byte_4
, V2_CQE_BYTE_4_S_R_S
);
1738 qpn
= roce_get_field(cqe
->byte_16
, V2_CQE_BYTE_16_LCL_QPN_M
,
1739 V2_CQE_BYTE_16_LCL_QPN_S
);
1741 if (!*cur_qp
|| (qpn
& HNS_ROCE_V2_CQE_QPN_MASK
) != (*cur_qp
)->qpn
) {
1742 hr_dev
= to_hr_dev(hr_cq
->ib_cq
.device
);
1743 hr_qp
= __hns_roce_qp_lookup(hr_dev
, qpn
);
1744 if (unlikely(!hr_qp
)) {
1745 dev_err(hr_dev
->dev
, "CQ %06lx with entry for unknown QPN %06x\n",
1746 hr_cq
->cqn
, (qpn
& HNS_ROCE_V2_CQE_QPN_MASK
));
1752 wc
->qp
= &(*cur_qp
)->ibqp
;
1755 status
= roce_get_field(cqe
->byte_4
, V2_CQE_BYTE_4_STATUS_M
,
1756 V2_CQE_BYTE_4_STATUS_S
);
1757 switch (status
& HNS_ROCE_V2_CQE_STATUS_MASK
) {
1758 case HNS_ROCE_CQE_V2_SUCCESS
:
1759 wc
->status
= IB_WC_SUCCESS
;
1761 case HNS_ROCE_CQE_V2_LOCAL_LENGTH_ERR
:
1762 wc
->status
= IB_WC_LOC_LEN_ERR
;
1764 case HNS_ROCE_CQE_V2_LOCAL_QP_OP_ERR
:
1765 wc
->status
= IB_WC_LOC_QP_OP_ERR
;
1767 case HNS_ROCE_CQE_V2_LOCAL_PROT_ERR
:
1768 wc
->status
= IB_WC_LOC_PROT_ERR
;
1770 case HNS_ROCE_CQE_V2_WR_FLUSH_ERR
:
1771 wc
->status
= IB_WC_WR_FLUSH_ERR
;
1773 case HNS_ROCE_CQE_V2_MW_BIND_ERR
:
1774 wc
->status
= IB_WC_MW_BIND_ERR
;
1776 case HNS_ROCE_CQE_V2_BAD_RESP_ERR
:
1777 wc
->status
= IB_WC_BAD_RESP_ERR
;
1779 case HNS_ROCE_CQE_V2_LOCAL_ACCESS_ERR
:
1780 wc
->status
= IB_WC_LOC_ACCESS_ERR
;
1782 case HNS_ROCE_CQE_V2_REMOTE_INVAL_REQ_ERR
:
1783 wc
->status
= IB_WC_REM_INV_REQ_ERR
;
1785 case HNS_ROCE_CQE_V2_REMOTE_ACCESS_ERR
:
1786 wc
->status
= IB_WC_REM_ACCESS_ERR
;
1788 case HNS_ROCE_CQE_V2_REMOTE_OP_ERR
:
1789 wc
->status
= IB_WC_REM_OP_ERR
;
1791 case HNS_ROCE_CQE_V2_TRANSPORT_RETRY_EXC_ERR
:
1792 wc
->status
= IB_WC_RETRY_EXC_ERR
;
1794 case HNS_ROCE_CQE_V2_RNR_RETRY_EXC_ERR
:
1795 wc
->status
= IB_WC_RNR_RETRY_EXC_ERR
;
1797 case HNS_ROCE_CQE_V2_REMOTE_ABORT_ERR
:
1798 wc
->status
= IB_WC_REM_ABORT_ERR
;
1801 wc
->status
= IB_WC_GENERAL_ERR
;
1805 /* CQE status error, directly return */
1806 if (wc
->status
!= IB_WC_SUCCESS
)
1811 /* SQ corresponding to CQE */
1812 switch (roce_get_field(cqe
->byte_4
, V2_CQE_BYTE_4_OPCODE_M
,
1813 V2_CQE_BYTE_4_OPCODE_S
) & 0x1f) {
1814 case HNS_ROCE_SQ_OPCODE_SEND
:
1815 wc
->opcode
= IB_WC_SEND
;
1817 case HNS_ROCE_SQ_OPCODE_SEND_WITH_INV
:
1818 wc
->opcode
= IB_WC_SEND
;
1820 case HNS_ROCE_SQ_OPCODE_SEND_WITH_IMM
:
1821 wc
->opcode
= IB_WC_SEND
;
1822 wc
->wc_flags
|= IB_WC_WITH_IMM
;
1824 case HNS_ROCE_SQ_OPCODE_RDMA_READ
:
1825 wc
->opcode
= IB_WC_RDMA_READ
;
1826 wc
->byte_len
= le32_to_cpu(cqe
->byte_cnt
);
1828 case HNS_ROCE_SQ_OPCODE_RDMA_WRITE
:
1829 wc
->opcode
= IB_WC_RDMA_WRITE
;
1831 case HNS_ROCE_SQ_OPCODE_RDMA_WRITE_WITH_IMM
:
1832 wc
->opcode
= IB_WC_RDMA_WRITE
;
1833 wc
->wc_flags
|= IB_WC_WITH_IMM
;
1835 case HNS_ROCE_SQ_OPCODE_LOCAL_INV
:
1836 wc
->opcode
= IB_WC_LOCAL_INV
;
1837 wc
->wc_flags
|= IB_WC_WITH_INVALIDATE
;
1839 case HNS_ROCE_SQ_OPCODE_ATOMIC_COMP_AND_SWAP
:
1840 wc
->opcode
= IB_WC_COMP_SWAP
;
1843 case HNS_ROCE_SQ_OPCODE_ATOMIC_FETCH_AND_ADD
:
1844 wc
->opcode
= IB_WC_FETCH_ADD
;
1847 case HNS_ROCE_SQ_OPCODE_ATOMIC_MASK_COMP_AND_SWAP
:
1848 wc
->opcode
= IB_WC_MASKED_COMP_SWAP
;
1851 case HNS_ROCE_SQ_OPCODE_ATOMIC_MASK_FETCH_AND_ADD
:
1852 wc
->opcode
= IB_WC_MASKED_FETCH_ADD
;
1855 case HNS_ROCE_SQ_OPCODE_FAST_REG_WR
:
1856 wc
->opcode
= IB_WC_REG_MR
;
1858 case HNS_ROCE_SQ_OPCODE_BIND_MW
:
1859 wc
->opcode
= IB_WC_REG_MR
;
1862 wc
->status
= IB_WC_GENERAL_ERR
;
1866 wq
= &(*cur_qp
)->sq
;
1867 if ((*cur_qp
)->sq_signal_bits
) {
1869 * If sg_signal_bit is 1,
1870 * firstly tail pointer updated to wqe
1871 * which current cqe correspond to
1873 wqe_ctr
= (u16
)roce_get_field(cqe
->byte_4
,
1874 V2_CQE_BYTE_4_WQE_INDX_M
,
1875 V2_CQE_BYTE_4_WQE_INDX_S
);
1876 wq
->tail
+= (wqe_ctr
- (u16
)wq
->tail
) &
1880 wc
->wr_id
= wq
->wrid
[wq
->tail
& (wq
->wqe_cnt
- 1)];
1883 /* RQ correspond to CQE */
1884 wc
->byte_len
= le32_to_cpu(cqe
->byte_cnt
);
1886 opcode
= roce_get_field(cqe
->byte_4
, V2_CQE_BYTE_4_OPCODE_M
,
1887 V2_CQE_BYTE_4_OPCODE_S
);
1888 switch (opcode
& 0x1f) {
1889 case HNS_ROCE_V2_OPCODE_RDMA_WRITE_IMM
:
1890 wc
->opcode
= IB_WC_RECV_RDMA_WITH_IMM
;
1891 wc
->wc_flags
= IB_WC_WITH_IMM
;
1892 wc
->ex
.imm_data
= cqe
->immtdata
;
1894 case HNS_ROCE_V2_OPCODE_SEND
:
1895 wc
->opcode
= IB_WC_RECV
;
1898 case HNS_ROCE_V2_OPCODE_SEND_WITH_IMM
:
1899 wc
->opcode
= IB_WC_RECV
;
1900 wc
->wc_flags
= IB_WC_WITH_IMM
;
1901 wc
->ex
.imm_data
= cqe
->immtdata
;
1903 case HNS_ROCE_V2_OPCODE_SEND_WITH_INV
:
1904 wc
->opcode
= IB_WC_RECV
;
1905 wc
->wc_flags
= IB_WC_WITH_INVALIDATE
;
1906 wc
->ex
.invalidate_rkey
= le32_to_cpu(cqe
->rkey
);
1909 wc
->status
= IB_WC_GENERAL_ERR
;
1913 if ((wc
->qp
->qp_type
== IB_QPT_RC
||
1914 wc
->qp
->qp_type
== IB_QPT_UC
) &&
1915 (opcode
== HNS_ROCE_V2_OPCODE_SEND
||
1916 opcode
== HNS_ROCE_V2_OPCODE_SEND_WITH_IMM
||
1917 opcode
== HNS_ROCE_V2_OPCODE_SEND_WITH_INV
) &&
1918 (roce_get_bit(cqe
->byte_4
, V2_CQE_BYTE_4_RQ_INLINE_S
))) {
1919 ret
= hns_roce_handle_recv_inl_wqe(cqe
, cur_qp
, wc
);
1924 /* Update tail pointer, record wr_id */
1925 wq
= &(*cur_qp
)->rq
;
1926 wc
->wr_id
= wq
->wrid
[wq
->tail
& (wq
->wqe_cnt
- 1)];
1929 wc
->sl
= (u8
)roce_get_field(cqe
->byte_32
, V2_CQE_BYTE_32_SL_M
,
1930 V2_CQE_BYTE_32_SL_S
);
1931 wc
->src_qp
= (u8
)roce_get_field(cqe
->byte_32
,
1932 V2_CQE_BYTE_32_RMT_QPN_M
,
1933 V2_CQE_BYTE_32_RMT_QPN_S
);
1934 wc
->wc_flags
|= (roce_get_bit(cqe
->byte_32
,
1935 V2_CQE_BYTE_32_GRH_S
) ?
1937 wc
->port_num
= roce_get_field(cqe
->byte_32
,
1938 V2_CQE_BYTE_32_PORTN_M
, V2_CQE_BYTE_32_PORTN_S
);
1940 memcpy(wc
->smac
, cqe
->smac
, 4);
1941 wc
->smac
[4] = roce_get_field(cqe
->byte_28
,
1942 V2_CQE_BYTE_28_SMAC_4_M
,
1943 V2_CQE_BYTE_28_SMAC_4_S
);
1944 wc
->smac
[5] = roce_get_field(cqe
->byte_28
,
1945 V2_CQE_BYTE_28_SMAC_5_M
,
1946 V2_CQE_BYTE_28_SMAC_5_S
);
1947 wc
->vlan_id
= 0xffff;
1948 wc
->wc_flags
|= (IB_WC_WITH_VLAN
| IB_WC_WITH_SMAC
);
1949 wc
->network_hdr_type
= roce_get_field(cqe
->byte_28
,
1950 V2_CQE_BYTE_28_PORT_TYPE_M
,
1951 V2_CQE_BYTE_28_PORT_TYPE_S
);
1957 static int hns_roce_v2_poll_cq(struct ib_cq
*ibcq
, int num_entries
,
1960 struct hns_roce_cq
*hr_cq
= to_hr_cq(ibcq
);
1961 struct hns_roce_qp
*cur_qp
= NULL
;
1962 unsigned long flags
;
1965 spin_lock_irqsave(&hr_cq
->lock
, flags
);
1967 for (npolled
= 0; npolled
< num_entries
; ++npolled
) {
1968 if (hns_roce_v2_poll_one(hr_cq
, &cur_qp
, wc
+ npolled
))
1973 /* Memory barrier */
1975 hns_roce_v2_cq_set_ci(hr_cq
, hr_cq
->cons_index
);
1978 spin_unlock_irqrestore(&hr_cq
->lock
, flags
);
1983 static int hns_roce_v2_set_hem(struct hns_roce_dev
*hr_dev
,
1984 struct hns_roce_hem_table
*table
, int obj
,
1987 struct device
*dev
= hr_dev
->dev
;
1988 struct hns_roce_cmd_mailbox
*mailbox
;
1989 struct hns_roce_hem_iter iter
;
1990 struct hns_roce_hem_mhop mhop
;
1991 struct hns_roce_hem
*hem
;
1992 unsigned long mhop_obj
= obj
;
2002 if (!hns_roce_check_whether_mhop(hr_dev
, table
->type
))
2005 hns_roce_calc_hem_mhop(hr_dev
, table
, &mhop_obj
, &mhop
);
2009 hop_num
= mhop
.hop_num
;
2010 chunk_ba_num
= mhop
.bt_chunk_size
/ 8;
2013 hem_idx
= i
* chunk_ba_num
* chunk_ba_num
+ j
* chunk_ba_num
+
2015 l1_idx
= i
* chunk_ba_num
+ j
;
2016 } else if (hop_num
== 1) {
2017 hem_idx
= i
* chunk_ba_num
+ j
;
2018 } else if (hop_num
== HNS_ROCE_HOP_NUM_0
) {
2022 switch (table
->type
) {
2024 op
= HNS_ROCE_CMD_WRITE_QPC_BT0
;
2027 op
= HNS_ROCE_CMD_WRITE_MPT_BT0
;
2030 op
= HNS_ROCE_CMD_WRITE_CQC_BT0
;
2033 op
= HNS_ROCE_CMD_WRITE_SRQC_BT0
;
2036 dev_warn(dev
, "Table %d not to be written by mailbox!\n",
2042 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
2043 if (IS_ERR(mailbox
))
2044 return PTR_ERR(mailbox
);
2046 if (check_whether_last_step(hop_num
, step_idx
)) {
2047 hem
= table
->hem
[hem_idx
];
2048 for (hns_roce_hem_first(hem
, &iter
);
2049 !hns_roce_hem_last(&iter
); hns_roce_hem_next(&iter
)) {
2050 bt_ba
= hns_roce_hem_addr(&iter
);
2052 /* configure the ba, tag, and op */
2053 ret
= hns_roce_cmd_mbox(hr_dev
, bt_ba
, mailbox
->dma
,
2055 HNS_ROCE_CMD_TIMEOUT_MSECS
);
2059 bt_ba
= table
->bt_l0_dma_addr
[i
];
2060 else if (step_idx
== 1 && hop_num
== 2)
2061 bt_ba
= table
->bt_l1_dma_addr
[l1_idx
];
2063 /* configure the ba, tag, and op */
2064 ret
= hns_roce_cmd_mbox(hr_dev
, bt_ba
, mailbox
->dma
, obj
,
2065 0, op
, HNS_ROCE_CMD_TIMEOUT_MSECS
);
2068 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
2072 static int hns_roce_v2_clear_hem(struct hns_roce_dev
*hr_dev
,
2073 struct hns_roce_hem_table
*table
, int obj
,
2076 struct device
*dev
= hr_dev
->dev
;
2077 struct hns_roce_cmd_mailbox
*mailbox
;
2081 if (!hns_roce_check_whether_mhop(hr_dev
, table
->type
))
2084 switch (table
->type
) {
2086 op
= HNS_ROCE_CMD_DESTROY_QPC_BT0
;
2089 op
= HNS_ROCE_CMD_DESTROY_MPT_BT0
;
2092 op
= HNS_ROCE_CMD_DESTROY_CQC_BT0
;
2095 op
= HNS_ROCE_CMD_DESTROY_SRQC_BT0
;
2098 dev_warn(dev
, "Table %d not to be destroyed by mailbox!\n",
2104 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
2105 if (IS_ERR(mailbox
))
2106 return PTR_ERR(mailbox
);
2108 /* configure the tag and op */
2109 ret
= hns_roce_cmd_mbox(hr_dev
, 0, mailbox
->dma
, obj
, 0, op
,
2110 HNS_ROCE_CMD_TIMEOUT_MSECS
);
2112 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
2116 static int hns_roce_v2_qp_modify(struct hns_roce_dev
*hr_dev
,
2117 struct hns_roce_mtt
*mtt
,
2118 enum ib_qp_state cur_state
,
2119 enum ib_qp_state new_state
,
2120 struct hns_roce_v2_qp_context
*context
,
2121 struct hns_roce_qp
*hr_qp
)
2123 struct hns_roce_cmd_mailbox
*mailbox
;
2126 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
2127 if (IS_ERR(mailbox
))
2128 return PTR_ERR(mailbox
);
2130 memcpy(mailbox
->buf
, context
, sizeof(*context
) * 2);
2132 ret
= hns_roce_cmd_mbox(hr_dev
, mailbox
->dma
, 0, hr_qp
->qpn
, 0,
2133 HNS_ROCE_CMD_MODIFY_QPC
,
2134 HNS_ROCE_CMD_TIMEOUT_MSECS
);
2136 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
2141 static void set_access_flags(struct hns_roce_qp
*hr_qp
,
2142 struct hns_roce_v2_qp_context
*context
,
2143 struct hns_roce_v2_qp_context
*qpc_mask
,
2144 const struct ib_qp_attr
*attr
, int attr_mask
)
2149 dest_rd_atomic
= (attr_mask
& IB_QP_MAX_DEST_RD_ATOMIC
) ?
2150 attr
->max_dest_rd_atomic
: hr_qp
->resp_depth
;
2152 access_flags
= (attr_mask
& IB_QP_ACCESS_FLAGS
) ?
2153 attr
->qp_access_flags
: hr_qp
->atomic_rd_en
;
2155 if (!dest_rd_atomic
)
2156 access_flags
&= IB_ACCESS_REMOTE_WRITE
;
2158 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RRE_S
,
2159 !!(access_flags
& IB_ACCESS_REMOTE_READ
));
2160 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RRE_S
, 0);
2162 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RWE_S
,
2163 !!(access_flags
& IB_ACCESS_REMOTE_WRITE
));
2164 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RWE_S
, 0);
2166 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_ATE_S
,
2167 !!(access_flags
& IB_ACCESS_REMOTE_ATOMIC
));
2168 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_ATE_S
, 0);
2171 static void modify_qp_reset_to_init(struct ib_qp
*ibqp
,
2172 const struct ib_qp_attr
*attr
,
2174 struct hns_roce_v2_qp_context
*context
,
2175 struct hns_roce_v2_qp_context
*qpc_mask
)
2177 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
2178 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
2181 * In v2 engine, software pass context and context mask to hardware
2182 * when modifying qp. If software need modify some fields in context,
2183 * we should set all bits of the relevant fields in context mask to
2184 * 0 at the same time, else set them to 0x1.
2186 roce_set_field(context
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_TST_M
,
2187 V2_QPC_BYTE_4_TST_S
, to_hr_qp_type(hr_qp
->ibqp
.qp_type
));
2188 roce_set_field(qpc_mask
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_TST_M
,
2189 V2_QPC_BYTE_4_TST_S
, 0);
2191 if (ibqp
->qp_type
== IB_QPT_GSI
)
2192 roce_set_field(context
->byte_4_sqpn_tst
,
2193 V2_QPC_BYTE_4_SGE_SHIFT_M
,
2194 V2_QPC_BYTE_4_SGE_SHIFT_S
,
2195 ilog2((unsigned int)hr_qp
->sge
.sge_cnt
));
2197 roce_set_field(context
->byte_4_sqpn_tst
,
2198 V2_QPC_BYTE_4_SGE_SHIFT_M
,
2199 V2_QPC_BYTE_4_SGE_SHIFT_S
,
2200 hr_qp
->sq
.max_gs
> 2 ?
2201 ilog2((unsigned int)hr_qp
->sge
.sge_cnt
) : 0);
2203 roce_set_field(qpc_mask
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_SGE_SHIFT_M
,
2204 V2_QPC_BYTE_4_SGE_SHIFT_S
, 0);
2206 roce_set_field(context
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_SQPN_M
,
2207 V2_QPC_BYTE_4_SQPN_S
, hr_qp
->qpn
);
2208 roce_set_field(qpc_mask
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_SQPN_M
,
2209 V2_QPC_BYTE_4_SQPN_S
, 0);
2211 roce_set_field(context
->byte_16_buf_ba_pg_sz
, V2_QPC_BYTE_16_PD_M
,
2212 V2_QPC_BYTE_16_PD_S
, to_hr_pd(ibqp
->pd
)->pdn
);
2213 roce_set_field(qpc_mask
->byte_16_buf_ba_pg_sz
, V2_QPC_BYTE_16_PD_M
,
2214 V2_QPC_BYTE_16_PD_S
, 0);
2216 roce_set_field(context
->byte_20_smac_sgid_idx
, V2_QPC_BYTE_20_RQWS_M
,
2217 V2_QPC_BYTE_20_RQWS_S
, ilog2(hr_qp
->rq
.max_gs
));
2218 roce_set_field(qpc_mask
->byte_20_smac_sgid_idx
, V2_QPC_BYTE_20_RQWS_M
,
2219 V2_QPC_BYTE_20_RQWS_S
, 0);
2221 roce_set_field(context
->byte_20_smac_sgid_idx
,
2222 V2_QPC_BYTE_20_SQ_SHIFT_M
, V2_QPC_BYTE_20_SQ_SHIFT_S
,
2223 ilog2((unsigned int)hr_qp
->sq
.wqe_cnt
));
2224 roce_set_field(qpc_mask
->byte_20_smac_sgid_idx
,
2225 V2_QPC_BYTE_20_SQ_SHIFT_M
, V2_QPC_BYTE_20_SQ_SHIFT_S
, 0);
2227 roce_set_field(context
->byte_20_smac_sgid_idx
,
2228 V2_QPC_BYTE_20_RQ_SHIFT_M
, V2_QPC_BYTE_20_RQ_SHIFT_S
,
2229 ilog2((unsigned int)hr_qp
->rq
.wqe_cnt
));
2230 roce_set_field(qpc_mask
->byte_20_smac_sgid_idx
,
2231 V2_QPC_BYTE_20_RQ_SHIFT_M
, V2_QPC_BYTE_20_RQ_SHIFT_S
, 0);
2233 /* No VLAN need to set 0xFFF */
2234 roce_set_field(context
->byte_24_mtu_tc
, V2_QPC_BYTE_24_VLAN_IDX_M
,
2235 V2_QPC_BYTE_24_VLAN_IDX_S
, 0xfff);
2236 roce_set_field(qpc_mask
->byte_24_mtu_tc
, V2_QPC_BYTE_24_VLAN_IDX_M
,
2237 V2_QPC_BYTE_24_VLAN_IDX_S
, 0);
2240 * Set some fields in context to zero, Because the default values
2241 * of all fields in context are zero, we need not set them to 0 again.
2242 * but we should set the relevant fields of context mask to 0.
2244 roce_set_bit(qpc_mask
->byte_56_dqpn_err
, V2_QPC_BYTE_56_SQ_TX_ERR_S
, 0);
2245 roce_set_bit(qpc_mask
->byte_56_dqpn_err
, V2_QPC_BYTE_56_SQ_RX_ERR_S
, 0);
2246 roce_set_bit(qpc_mask
->byte_56_dqpn_err
, V2_QPC_BYTE_56_RQ_TX_ERR_S
, 0);
2247 roce_set_bit(qpc_mask
->byte_56_dqpn_err
, V2_QPC_BYTE_56_RQ_RX_ERR_S
, 0);
2249 roce_set_field(qpc_mask
->byte_60_qpst_mapid
, V2_QPC_BYTE_60_MAPID_M
,
2250 V2_QPC_BYTE_60_MAPID_S
, 0);
2252 roce_set_bit(qpc_mask
->byte_60_qpst_mapid
,
2253 V2_QPC_BYTE_60_INNER_MAP_IND_S
, 0);
2254 roce_set_bit(qpc_mask
->byte_60_qpst_mapid
, V2_QPC_BYTE_60_SQ_MAP_IND_S
,
2256 roce_set_bit(qpc_mask
->byte_60_qpst_mapid
, V2_QPC_BYTE_60_RQ_MAP_IND_S
,
2258 roce_set_bit(qpc_mask
->byte_60_qpst_mapid
, V2_QPC_BYTE_60_EXT_MAP_IND_S
,
2260 roce_set_bit(qpc_mask
->byte_60_qpst_mapid
, V2_QPC_BYTE_60_SQ_RLS_IND_S
,
2262 roce_set_bit(qpc_mask
->byte_60_qpst_mapid
, V2_QPC_BYTE_60_SQ_EXT_IND_S
,
2264 roce_set_bit(qpc_mask
->byte_28_at_fl
, V2_QPC_BYTE_28_CNP_TX_FLAG_S
, 0);
2265 roce_set_bit(qpc_mask
->byte_28_at_fl
, V2_QPC_BYTE_28_CE_FLAG_S
, 0);
2267 if (attr_mask
& IB_QP_QKEY
) {
2268 context
->qkey_xrcd
= attr
->qkey
;
2269 qpc_mask
->qkey_xrcd
= 0;
2270 hr_qp
->qkey
= attr
->qkey
;
2273 if (hr_qp
->rdb_en
) {
2274 roce_set_bit(context
->byte_68_rq_db
,
2275 V2_QPC_BYTE_68_RQ_RECORD_EN_S
, 1);
2276 roce_set_bit(qpc_mask
->byte_68_rq_db
,
2277 V2_QPC_BYTE_68_RQ_RECORD_EN_S
, 0);
2280 roce_set_field(context
->byte_68_rq_db
,
2281 V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_M
,
2282 V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_S
,
2283 ((u32
)hr_qp
->rdb
.dma
) >> 1);
2284 roce_set_field(qpc_mask
->byte_68_rq_db
,
2285 V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_M
,
2286 V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_S
, 0);
2287 context
->rq_db_record_addr
= hr_qp
->rdb
.dma
>> 32;
2288 qpc_mask
->rq_db_record_addr
= 0;
2290 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RQIE_S
,
2291 (hr_dev
->caps
.flags
& HNS_ROCE_CAP_FLAG_RQ_INLINE
) ? 1 : 0);
2292 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RQIE_S
, 0);
2294 roce_set_field(context
->byte_80_rnr_rx_cqn
, V2_QPC_BYTE_80_RX_CQN_M
,
2295 V2_QPC_BYTE_80_RX_CQN_S
, to_hr_cq(ibqp
->recv_cq
)->cqn
);
2296 roce_set_field(qpc_mask
->byte_80_rnr_rx_cqn
, V2_QPC_BYTE_80_RX_CQN_M
,
2297 V2_QPC_BYTE_80_RX_CQN_S
, 0);
2299 roce_set_field(context
->byte_76_srqn_op_en
,
2300 V2_QPC_BYTE_76_SRQN_M
, V2_QPC_BYTE_76_SRQN_S
,
2301 to_hr_srq(ibqp
->srq
)->srqn
);
2302 roce_set_field(qpc_mask
->byte_76_srqn_op_en
,
2303 V2_QPC_BYTE_76_SRQN_M
, V2_QPC_BYTE_76_SRQN_S
, 0);
2304 roce_set_bit(context
->byte_76_srqn_op_en
,
2305 V2_QPC_BYTE_76_SRQ_EN_S
, 1);
2306 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
,
2307 V2_QPC_BYTE_76_SRQ_EN_S
, 0);
2310 roce_set_field(qpc_mask
->byte_84_rq_ci_pi
,
2311 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M
,
2312 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S
, 0);
2313 roce_set_field(qpc_mask
->byte_84_rq_ci_pi
,
2314 V2_QPC_BYTE_84_RQ_CONSUMER_IDX_M
,
2315 V2_QPC_BYTE_84_RQ_CONSUMER_IDX_S
, 0);
2317 roce_set_field(qpc_mask
->byte_92_srq_info
, V2_QPC_BYTE_92_SRQ_INFO_M
,
2318 V2_QPC_BYTE_92_SRQ_INFO_S
, 0);
2320 roce_set_field(qpc_mask
->byte_96_rx_reqmsn
, V2_QPC_BYTE_96_RX_REQ_MSN_M
,
2321 V2_QPC_BYTE_96_RX_REQ_MSN_S
, 0);
2323 roce_set_field(qpc_mask
->byte_104_rq_sge
,
2324 V2_QPC_BYTE_104_RQ_CUR_WQE_SGE_NUM_M
,
2325 V2_QPC_BYTE_104_RQ_CUR_WQE_SGE_NUM_S
, 0);
2327 roce_set_bit(qpc_mask
->byte_108_rx_reqepsn
,
2328 V2_QPC_BYTE_108_RX_REQ_PSN_ERR_S
, 0);
2329 roce_set_field(qpc_mask
->byte_108_rx_reqepsn
,
2330 V2_QPC_BYTE_108_RX_REQ_LAST_OPTYPE_M
,
2331 V2_QPC_BYTE_108_RX_REQ_LAST_OPTYPE_S
, 0);
2332 roce_set_bit(qpc_mask
->byte_108_rx_reqepsn
,
2333 V2_QPC_BYTE_108_RX_REQ_RNR_S
, 0);
2335 qpc_mask
->rq_rnr_timer
= 0;
2336 qpc_mask
->rx_msg_len
= 0;
2337 qpc_mask
->rx_rkey_pkt_info
= 0;
2338 qpc_mask
->rx_va
= 0;
2340 roce_set_field(qpc_mask
->byte_132_trrl
, V2_QPC_BYTE_132_TRRL_HEAD_MAX_M
,
2341 V2_QPC_BYTE_132_TRRL_HEAD_MAX_S
, 0);
2342 roce_set_field(qpc_mask
->byte_132_trrl
, V2_QPC_BYTE_132_TRRL_TAIL_MAX_M
,
2343 V2_QPC_BYTE_132_TRRL_TAIL_MAX_S
, 0);
2345 roce_set_bit(qpc_mask
->byte_140_raq
, V2_QPC_BYTE_140_RSVD_RAQ_MAP_S
, 0);
2346 roce_set_field(qpc_mask
->byte_140_raq
, V2_QPC_BYTE_140_RAQ_TRRL_HEAD_M
,
2347 V2_QPC_BYTE_140_RAQ_TRRL_HEAD_S
, 0);
2348 roce_set_field(qpc_mask
->byte_140_raq
, V2_QPC_BYTE_140_RAQ_TRRL_TAIL_M
,
2349 V2_QPC_BYTE_140_RAQ_TRRL_TAIL_S
, 0);
2351 roce_set_field(qpc_mask
->byte_144_raq
,
2352 V2_QPC_BYTE_144_RAQ_RTY_INI_PSN_M
,
2353 V2_QPC_BYTE_144_RAQ_RTY_INI_PSN_S
, 0);
2354 roce_set_bit(qpc_mask
->byte_144_raq
, V2_QPC_BYTE_144_RAQ_RTY_INI_IND_S
,
2356 roce_set_field(qpc_mask
->byte_144_raq
, V2_QPC_BYTE_144_RAQ_CREDIT_M
,
2357 V2_QPC_BYTE_144_RAQ_CREDIT_S
, 0);
2358 roce_set_bit(qpc_mask
->byte_144_raq
, V2_QPC_BYTE_144_RESP_RTY_FLG_S
, 0);
2360 roce_set_field(qpc_mask
->byte_148_raq
, V2_QPC_BYTE_148_RQ_MSN_M
,
2361 V2_QPC_BYTE_148_RQ_MSN_S
, 0);
2362 roce_set_field(qpc_mask
->byte_148_raq
, V2_QPC_BYTE_148_RAQ_SYNDROME_M
,
2363 V2_QPC_BYTE_148_RAQ_SYNDROME_S
, 0);
2365 roce_set_field(qpc_mask
->byte_152_raq
, V2_QPC_BYTE_152_RAQ_PSN_M
,
2366 V2_QPC_BYTE_152_RAQ_PSN_S
, 0);
2367 roce_set_field(qpc_mask
->byte_152_raq
,
2368 V2_QPC_BYTE_152_RAQ_TRRL_RTY_HEAD_M
,
2369 V2_QPC_BYTE_152_RAQ_TRRL_RTY_HEAD_S
, 0);
2371 roce_set_field(qpc_mask
->byte_156_raq
, V2_QPC_BYTE_156_RAQ_USE_PKTN_M
,
2372 V2_QPC_BYTE_156_RAQ_USE_PKTN_S
, 0);
2374 roce_set_field(qpc_mask
->byte_160_sq_ci_pi
,
2375 V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M
,
2376 V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S
, 0);
2377 roce_set_field(qpc_mask
->byte_160_sq_ci_pi
,
2378 V2_QPC_BYTE_160_SQ_CONSUMER_IDX_M
,
2379 V2_QPC_BYTE_160_SQ_CONSUMER_IDX_S
, 0);
2381 roce_set_field(context
->byte_168_irrl_idx
,
2382 V2_QPC_BYTE_168_SQ_SHIFT_BAK_M
,
2383 V2_QPC_BYTE_168_SQ_SHIFT_BAK_S
,
2384 ilog2((unsigned int)hr_qp
->sq
.wqe_cnt
));
2385 roce_set_field(qpc_mask
->byte_168_irrl_idx
,
2386 V2_QPC_BYTE_168_SQ_SHIFT_BAK_M
,
2387 V2_QPC_BYTE_168_SQ_SHIFT_BAK_S
, 0);
2389 roce_set_bit(qpc_mask
->byte_168_irrl_idx
,
2390 V2_QPC_BYTE_168_MSG_RTY_LP_FLG_S
, 0);
2391 roce_set_bit(qpc_mask
->byte_168_irrl_idx
,
2392 V2_QPC_BYTE_168_SQ_INVLD_FLG_S
, 0);
2393 roce_set_field(qpc_mask
->byte_168_irrl_idx
,
2394 V2_QPC_BYTE_168_IRRL_IDX_LSB_M
,
2395 V2_QPC_BYTE_168_IRRL_IDX_LSB_S
, 0);
2397 roce_set_field(context
->byte_172_sq_psn
, V2_QPC_BYTE_172_ACK_REQ_FREQ_M
,
2398 V2_QPC_BYTE_172_ACK_REQ_FREQ_S
, 4);
2399 roce_set_field(qpc_mask
->byte_172_sq_psn
,
2400 V2_QPC_BYTE_172_ACK_REQ_FREQ_M
,
2401 V2_QPC_BYTE_172_ACK_REQ_FREQ_S
, 0);
2403 roce_set_bit(qpc_mask
->byte_172_sq_psn
, V2_QPC_BYTE_172_MSG_RNR_FLG_S
,
2406 roce_set_field(qpc_mask
->byte_176_msg_pktn
,
2407 V2_QPC_BYTE_176_MSG_USE_PKTN_M
,
2408 V2_QPC_BYTE_176_MSG_USE_PKTN_S
, 0);
2409 roce_set_field(qpc_mask
->byte_176_msg_pktn
,
2410 V2_QPC_BYTE_176_IRRL_HEAD_PRE_M
,
2411 V2_QPC_BYTE_176_IRRL_HEAD_PRE_S
, 0);
2413 roce_set_field(qpc_mask
->byte_184_irrl_idx
,
2414 V2_QPC_BYTE_184_IRRL_IDX_MSB_M
,
2415 V2_QPC_BYTE_184_IRRL_IDX_MSB_S
, 0);
2417 qpc_mask
->cur_sge_offset
= 0;
2419 roce_set_field(qpc_mask
->byte_192_ext_sge
,
2420 V2_QPC_BYTE_192_CUR_SGE_IDX_M
,
2421 V2_QPC_BYTE_192_CUR_SGE_IDX_S
, 0);
2422 roce_set_field(qpc_mask
->byte_192_ext_sge
,
2423 V2_QPC_BYTE_192_EXT_SGE_NUM_LEFT_M
,
2424 V2_QPC_BYTE_192_EXT_SGE_NUM_LEFT_S
, 0);
2426 roce_set_field(qpc_mask
->byte_196_sq_psn
, V2_QPC_BYTE_196_IRRL_HEAD_M
,
2427 V2_QPC_BYTE_196_IRRL_HEAD_S
, 0);
2429 roce_set_field(qpc_mask
->byte_200_sq_max
, V2_QPC_BYTE_200_SQ_MAX_IDX_M
,
2430 V2_QPC_BYTE_200_SQ_MAX_IDX_S
, 0);
2431 roce_set_field(qpc_mask
->byte_200_sq_max
,
2432 V2_QPC_BYTE_200_LCL_OPERATED_CNT_M
,
2433 V2_QPC_BYTE_200_LCL_OPERATED_CNT_S
, 0);
2435 roce_set_bit(qpc_mask
->byte_208_irrl
, V2_QPC_BYTE_208_PKT_RNR_FLG_S
, 0);
2436 roce_set_bit(qpc_mask
->byte_208_irrl
, V2_QPC_BYTE_208_PKT_RTY_FLG_S
, 0);
2438 roce_set_field(qpc_mask
->byte_212_lsn
, V2_QPC_BYTE_212_CHECK_FLG_M
,
2439 V2_QPC_BYTE_212_CHECK_FLG_S
, 0);
2441 qpc_mask
->sq_timer
= 0;
2443 roce_set_field(qpc_mask
->byte_220_retry_psn_msn
,
2444 V2_QPC_BYTE_220_RETRY_MSG_MSN_M
,
2445 V2_QPC_BYTE_220_RETRY_MSG_MSN_S
, 0);
2446 roce_set_field(qpc_mask
->byte_232_irrl_sge
,
2447 V2_QPC_BYTE_232_IRRL_SGE_IDX_M
,
2448 V2_QPC_BYTE_232_IRRL_SGE_IDX_S
, 0);
2450 qpc_mask
->irrl_cur_sge_offset
= 0;
2452 roce_set_field(qpc_mask
->byte_240_irrl_tail
,
2453 V2_QPC_BYTE_240_IRRL_TAIL_REAL_M
,
2454 V2_QPC_BYTE_240_IRRL_TAIL_REAL_S
, 0);
2455 roce_set_field(qpc_mask
->byte_240_irrl_tail
,
2456 V2_QPC_BYTE_240_IRRL_TAIL_RD_M
,
2457 V2_QPC_BYTE_240_IRRL_TAIL_RD_S
, 0);
2458 roce_set_field(qpc_mask
->byte_240_irrl_tail
,
2459 V2_QPC_BYTE_240_RX_ACK_MSN_M
,
2460 V2_QPC_BYTE_240_RX_ACK_MSN_S
, 0);
2462 roce_set_field(qpc_mask
->byte_248_ack_psn
, V2_QPC_BYTE_248_IRRL_PSN_M
,
2463 V2_QPC_BYTE_248_IRRL_PSN_S
, 0);
2464 roce_set_bit(qpc_mask
->byte_248_ack_psn
, V2_QPC_BYTE_248_ACK_PSN_ERR_S
,
2466 roce_set_field(qpc_mask
->byte_248_ack_psn
,
2467 V2_QPC_BYTE_248_ACK_LAST_OPTYPE_M
,
2468 V2_QPC_BYTE_248_ACK_LAST_OPTYPE_S
, 0);
2469 roce_set_bit(qpc_mask
->byte_248_ack_psn
, V2_QPC_BYTE_248_IRRL_PSN_VLD_S
,
2471 roce_set_bit(qpc_mask
->byte_248_ack_psn
,
2472 V2_QPC_BYTE_248_RNR_RETRY_FLAG_S
, 0);
2473 roce_set_bit(qpc_mask
->byte_248_ack_psn
, V2_QPC_BYTE_248_CQ_ERR_IND_S
,
2476 hr_qp
->access_flags
= attr
->qp_access_flags
;
2477 hr_qp
->pkey_index
= attr
->pkey_index
;
2478 roce_set_field(context
->byte_252_err_txcqn
, V2_QPC_BYTE_252_TX_CQN_M
,
2479 V2_QPC_BYTE_252_TX_CQN_S
, to_hr_cq(ibqp
->send_cq
)->cqn
);
2480 roce_set_field(qpc_mask
->byte_252_err_txcqn
, V2_QPC_BYTE_252_TX_CQN_M
,
2481 V2_QPC_BYTE_252_TX_CQN_S
, 0);
2483 roce_set_field(qpc_mask
->byte_252_err_txcqn
, V2_QPC_BYTE_252_ERR_TYPE_M
,
2484 V2_QPC_BYTE_252_ERR_TYPE_S
, 0);
2486 roce_set_field(qpc_mask
->byte_256_sqflush_rqcqe
,
2487 V2_QPC_BYTE_256_RQ_CQE_IDX_M
,
2488 V2_QPC_BYTE_256_RQ_CQE_IDX_S
, 0);
2489 roce_set_field(qpc_mask
->byte_256_sqflush_rqcqe
,
2490 V2_QPC_BYTE_256_SQ_FLUSH_IDX_M
,
2491 V2_QPC_BYTE_256_SQ_FLUSH_IDX_S
, 0);
2494 static void modify_qp_init_to_init(struct ib_qp
*ibqp
,
2495 const struct ib_qp_attr
*attr
, int attr_mask
,
2496 struct hns_roce_v2_qp_context
*context
,
2497 struct hns_roce_v2_qp_context
*qpc_mask
)
2499 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
2502 * In v2 engine, software pass context and context mask to hardware
2503 * when modifying qp. If software need modify some fields in context,
2504 * we should set all bits of the relevant fields in context mask to
2505 * 0 at the same time, else set them to 0x1.
2507 roce_set_field(context
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_TST_M
,
2508 V2_QPC_BYTE_4_TST_S
, to_hr_qp_type(hr_qp
->ibqp
.qp_type
));
2509 roce_set_field(qpc_mask
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_TST_M
,
2510 V2_QPC_BYTE_4_TST_S
, 0);
2512 if (ibqp
->qp_type
== IB_QPT_GSI
)
2513 roce_set_field(context
->byte_4_sqpn_tst
,
2514 V2_QPC_BYTE_4_SGE_SHIFT_M
,
2515 V2_QPC_BYTE_4_SGE_SHIFT_S
,
2516 ilog2((unsigned int)hr_qp
->sge
.sge_cnt
));
2518 roce_set_field(context
->byte_4_sqpn_tst
,
2519 V2_QPC_BYTE_4_SGE_SHIFT_M
,
2520 V2_QPC_BYTE_4_SGE_SHIFT_S
, hr_qp
->sq
.max_gs
> 2 ?
2521 ilog2((unsigned int)hr_qp
->sge
.sge_cnt
) : 0);
2523 roce_set_field(qpc_mask
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_SGE_SHIFT_M
,
2524 V2_QPC_BYTE_4_SGE_SHIFT_S
, 0);
2526 if (attr_mask
& IB_QP_ACCESS_FLAGS
) {
2527 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RRE_S
,
2528 !!(attr
->qp_access_flags
& IB_ACCESS_REMOTE_READ
));
2529 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RRE_S
,
2532 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RWE_S
,
2533 !!(attr
->qp_access_flags
&
2534 IB_ACCESS_REMOTE_WRITE
));
2535 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RWE_S
,
2538 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_ATE_S
,
2539 !!(attr
->qp_access_flags
&
2540 IB_ACCESS_REMOTE_ATOMIC
));
2541 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_ATE_S
,
2544 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RRE_S
,
2545 !!(hr_qp
->access_flags
& IB_ACCESS_REMOTE_READ
));
2546 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RRE_S
,
2549 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RWE_S
,
2550 !!(hr_qp
->access_flags
& IB_ACCESS_REMOTE_WRITE
));
2551 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_RWE_S
,
2554 roce_set_bit(context
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_ATE_S
,
2555 !!(hr_qp
->access_flags
& IB_ACCESS_REMOTE_ATOMIC
));
2556 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
, V2_QPC_BYTE_76_ATE_S
,
2560 roce_set_field(context
->byte_20_smac_sgid_idx
,
2561 V2_QPC_BYTE_20_SQ_SHIFT_M
, V2_QPC_BYTE_20_SQ_SHIFT_S
,
2562 ilog2((unsigned int)hr_qp
->sq
.wqe_cnt
));
2563 roce_set_field(qpc_mask
->byte_20_smac_sgid_idx
,
2564 V2_QPC_BYTE_20_SQ_SHIFT_M
, V2_QPC_BYTE_20_SQ_SHIFT_S
, 0);
2566 roce_set_field(context
->byte_20_smac_sgid_idx
,
2567 V2_QPC_BYTE_20_RQ_SHIFT_M
, V2_QPC_BYTE_20_RQ_SHIFT_S
,
2568 ilog2((unsigned int)hr_qp
->rq
.wqe_cnt
));
2569 roce_set_field(qpc_mask
->byte_20_smac_sgid_idx
,
2570 V2_QPC_BYTE_20_RQ_SHIFT_M
, V2_QPC_BYTE_20_RQ_SHIFT_S
, 0);
2572 roce_set_field(context
->byte_16_buf_ba_pg_sz
, V2_QPC_BYTE_16_PD_M
,
2573 V2_QPC_BYTE_16_PD_S
, to_hr_pd(ibqp
->pd
)->pdn
);
2574 roce_set_field(qpc_mask
->byte_16_buf_ba_pg_sz
, V2_QPC_BYTE_16_PD_M
,
2575 V2_QPC_BYTE_16_PD_S
, 0);
2577 roce_set_field(context
->byte_80_rnr_rx_cqn
, V2_QPC_BYTE_80_RX_CQN_M
,
2578 V2_QPC_BYTE_80_RX_CQN_S
, to_hr_cq(ibqp
->recv_cq
)->cqn
);
2579 roce_set_field(qpc_mask
->byte_80_rnr_rx_cqn
, V2_QPC_BYTE_80_RX_CQN_M
,
2580 V2_QPC_BYTE_80_RX_CQN_S
, 0);
2582 roce_set_field(context
->byte_252_err_txcqn
, V2_QPC_BYTE_252_TX_CQN_M
,
2583 V2_QPC_BYTE_252_TX_CQN_S
, to_hr_cq(ibqp
->send_cq
)->cqn
);
2584 roce_set_field(qpc_mask
->byte_252_err_txcqn
, V2_QPC_BYTE_252_TX_CQN_M
,
2585 V2_QPC_BYTE_252_TX_CQN_S
, 0);
2588 roce_set_bit(context
->byte_76_srqn_op_en
,
2589 V2_QPC_BYTE_76_SRQ_EN_S
, 1);
2590 roce_set_bit(qpc_mask
->byte_76_srqn_op_en
,
2591 V2_QPC_BYTE_76_SRQ_EN_S
, 0);
2592 roce_set_field(context
->byte_76_srqn_op_en
,
2593 V2_QPC_BYTE_76_SRQN_M
, V2_QPC_BYTE_76_SRQN_S
,
2594 to_hr_srq(ibqp
->srq
)->srqn
);
2595 roce_set_field(qpc_mask
->byte_76_srqn_op_en
,
2596 V2_QPC_BYTE_76_SRQN_M
, V2_QPC_BYTE_76_SRQN_S
, 0);
2599 if (attr_mask
& IB_QP_QKEY
) {
2600 context
->qkey_xrcd
= attr
->qkey
;
2601 qpc_mask
->qkey_xrcd
= 0;
2604 roce_set_field(context
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_SQPN_M
,
2605 V2_QPC_BYTE_4_SQPN_S
, hr_qp
->qpn
);
2606 roce_set_field(qpc_mask
->byte_4_sqpn_tst
, V2_QPC_BYTE_4_SQPN_M
,
2607 V2_QPC_BYTE_4_SQPN_S
, 0);
2609 if (attr_mask
& IB_QP_DEST_QPN
) {
2610 roce_set_field(context
->byte_56_dqpn_err
, V2_QPC_BYTE_56_DQPN_M
,
2611 V2_QPC_BYTE_56_DQPN_S
, hr_qp
->qpn
);
2612 roce_set_field(qpc_mask
->byte_56_dqpn_err
,
2613 V2_QPC_BYTE_56_DQPN_M
, V2_QPC_BYTE_56_DQPN_S
, 0);
2615 roce_set_field(context
->byte_168_irrl_idx
,
2616 V2_QPC_BYTE_168_SQ_SHIFT_BAK_M
,
2617 V2_QPC_BYTE_168_SQ_SHIFT_BAK_S
,
2618 ilog2((unsigned int)hr_qp
->sq
.wqe_cnt
));
2619 roce_set_field(qpc_mask
->byte_168_irrl_idx
,
2620 V2_QPC_BYTE_168_SQ_SHIFT_BAK_M
,
2621 V2_QPC_BYTE_168_SQ_SHIFT_BAK_S
, 0);
2624 static int modify_qp_init_to_rtr(struct ib_qp
*ibqp
,
2625 const struct ib_qp_attr
*attr
, int attr_mask
,
2626 struct hns_roce_v2_qp_context
*context
,
2627 struct hns_roce_v2_qp_context
*qpc_mask
)
2629 const struct ib_global_route
*grh
= rdma_ah_read_grh(&attr
->ah_attr
);
2630 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
2631 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
2632 struct device
*dev
= hr_dev
->dev
;
2633 dma_addr_t dma_handle_3
;
2634 dma_addr_t dma_handle_2
;
2635 dma_addr_t dma_handle
;
2645 /* Search qp buf's mtts */
2646 mtts
= hns_roce_table_find(hr_dev
, &hr_dev
->mr_table
.mtt_table
,
2647 hr_qp
->mtt
.first_seg
, &dma_handle
);
2649 dev_err(dev
, "qp buf pa find failed\n");
2653 /* Search IRRL's mtts */
2654 mtts_2
= hns_roce_table_find(hr_dev
, &hr_dev
->qp_table
.irrl_table
,
2655 hr_qp
->qpn
, &dma_handle_2
);
2657 dev_err(dev
, "qp irrl_table find failed\n");
2661 /* Search TRRL's mtts */
2662 mtts_3
= hns_roce_table_find(hr_dev
, &hr_dev
->qp_table
.trrl_table
,
2663 hr_qp
->qpn
, &dma_handle_3
);
2665 dev_err(dev
, "qp trrl_table find failed\n");
2669 if (attr_mask
& IB_QP_ALT_PATH
) {
2670 dev_err(dev
, "INIT2RTR attr_mask (0x%x) error\n", attr_mask
);
2674 dmac
= (u8
*)attr
->ah_attr
.roce
.dmac
;
2675 context
->wqe_sge_ba
= (u32
)(dma_handle
>> 3);
2676 qpc_mask
->wqe_sge_ba
= 0;
2679 * In v2 engine, software pass context and context mask to hardware
2680 * when modifying qp. If software need modify some fields in context,
2681 * we should set all bits of the relevant fields in context mask to
2682 * 0 at the same time, else set them to 0x1.
2684 roce_set_field(context
->byte_12_sq_hop
, V2_QPC_BYTE_12_WQE_SGE_BA_M
,
2685 V2_QPC_BYTE_12_WQE_SGE_BA_S
, dma_handle
>> (32 + 3));
2686 roce_set_field(qpc_mask
->byte_12_sq_hop
, V2_QPC_BYTE_12_WQE_SGE_BA_M
,
2687 V2_QPC_BYTE_12_WQE_SGE_BA_S
, 0);
2689 roce_set_field(context
->byte_12_sq_hop
, V2_QPC_BYTE_12_SQ_HOP_NUM_M
,
2690 V2_QPC_BYTE_12_SQ_HOP_NUM_S
,
2691 hr_dev
->caps
.mtt_hop_num
== HNS_ROCE_HOP_NUM_0
?
2692 0 : hr_dev
->caps
.mtt_hop_num
);
2693 roce_set_field(qpc_mask
->byte_12_sq_hop
, V2_QPC_BYTE_12_SQ_HOP_NUM_M
,
2694 V2_QPC_BYTE_12_SQ_HOP_NUM_S
, 0);
2696 roce_set_field(context
->byte_20_smac_sgid_idx
,
2697 V2_QPC_BYTE_20_SGE_HOP_NUM_M
,
2698 V2_QPC_BYTE_20_SGE_HOP_NUM_S
,
2699 ((ibqp
->qp_type
== IB_QPT_GSI
) || hr_qp
->sq
.max_gs
> 2) ?
2700 hr_dev
->caps
.mtt_hop_num
: 0);
2701 roce_set_field(qpc_mask
->byte_20_smac_sgid_idx
,
2702 V2_QPC_BYTE_20_SGE_HOP_NUM_M
,
2703 V2_QPC_BYTE_20_SGE_HOP_NUM_S
, 0);
2705 roce_set_field(context
->byte_20_smac_sgid_idx
,
2706 V2_QPC_BYTE_20_RQ_HOP_NUM_M
,
2707 V2_QPC_BYTE_20_RQ_HOP_NUM_S
,
2708 hr_dev
->caps
.mtt_hop_num
== HNS_ROCE_HOP_NUM_0
?
2709 0 : hr_dev
->caps
.mtt_hop_num
);
2710 roce_set_field(qpc_mask
->byte_20_smac_sgid_idx
,
2711 V2_QPC_BYTE_20_RQ_HOP_NUM_M
,
2712 V2_QPC_BYTE_20_RQ_HOP_NUM_S
, 0);
2714 roce_set_field(context
->byte_16_buf_ba_pg_sz
,
2715 V2_QPC_BYTE_16_WQE_SGE_BA_PG_SZ_M
,
2716 V2_QPC_BYTE_16_WQE_SGE_BA_PG_SZ_S
,
2717 hr_dev
->caps
.mtt_ba_pg_sz
);
2718 roce_set_field(qpc_mask
->byte_16_buf_ba_pg_sz
,
2719 V2_QPC_BYTE_16_WQE_SGE_BA_PG_SZ_M
,
2720 V2_QPC_BYTE_16_WQE_SGE_BA_PG_SZ_S
, 0);
2722 roce_set_field(context
->byte_16_buf_ba_pg_sz
,
2723 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_M
,
2724 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_S
,
2725 hr_dev
->caps
.mtt_buf_pg_sz
);
2726 roce_set_field(qpc_mask
->byte_16_buf_ba_pg_sz
,
2727 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_M
,
2728 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_S
, 0);
2730 roce_set_field(context
->byte_80_rnr_rx_cqn
,
2731 V2_QPC_BYTE_80_MIN_RNR_TIME_M
,
2732 V2_QPC_BYTE_80_MIN_RNR_TIME_S
, attr
->min_rnr_timer
);
2733 roce_set_field(qpc_mask
->byte_80_rnr_rx_cqn
,
2734 V2_QPC_BYTE_80_MIN_RNR_TIME_M
,
2735 V2_QPC_BYTE_80_MIN_RNR_TIME_S
, 0);
2737 page_size
= 1 << (hr_dev
->caps
.mtt_buf_pg_sz
+ PAGE_SHIFT
);
2738 context
->rq_cur_blk_addr
= (u32
)(mtts
[hr_qp
->rq
.offset
/ page_size
]
2739 >> PAGE_ADDR_SHIFT
);
2740 qpc_mask
->rq_cur_blk_addr
= 0;
2742 roce_set_field(context
->byte_92_srq_info
,
2743 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_M
,
2744 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_S
,
2745 mtts
[hr_qp
->rq
.offset
/ page_size
]
2746 >> (32 + PAGE_ADDR_SHIFT
));
2747 roce_set_field(qpc_mask
->byte_92_srq_info
,
2748 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_M
,
2749 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_S
, 0);
2751 context
->rq_nxt_blk_addr
= (u32
)(mtts
[hr_qp
->rq
.offset
/ page_size
+ 1]
2752 >> PAGE_ADDR_SHIFT
);
2753 qpc_mask
->rq_nxt_blk_addr
= 0;
2755 roce_set_field(context
->byte_104_rq_sge
,
2756 V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_M
,
2757 V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_S
,
2758 mtts
[hr_qp
->rq
.offset
/ page_size
+ 1]
2759 >> (32 + PAGE_ADDR_SHIFT
));
2760 roce_set_field(qpc_mask
->byte_104_rq_sge
,
2761 V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_M
,
2762 V2_QPC_BYTE_104_RQ_NXT_BLK_ADDR_S
, 0);
2764 roce_set_field(context
->byte_108_rx_reqepsn
,
2765 V2_QPC_BYTE_108_RX_REQ_EPSN_M
,
2766 V2_QPC_BYTE_108_RX_REQ_EPSN_S
, attr
->rq_psn
);
2767 roce_set_field(qpc_mask
->byte_108_rx_reqepsn
,
2768 V2_QPC_BYTE_108_RX_REQ_EPSN_M
,
2769 V2_QPC_BYTE_108_RX_REQ_EPSN_S
, 0);
2771 roce_set_field(context
->byte_132_trrl
, V2_QPC_BYTE_132_TRRL_BA_M
,
2772 V2_QPC_BYTE_132_TRRL_BA_S
, dma_handle_3
>> 4);
2773 roce_set_field(qpc_mask
->byte_132_trrl
, V2_QPC_BYTE_132_TRRL_BA_M
,
2774 V2_QPC_BYTE_132_TRRL_BA_S
, 0);
2775 context
->trrl_ba
= (u32
)(dma_handle_3
>> (16 + 4));
2776 qpc_mask
->trrl_ba
= 0;
2777 roce_set_field(context
->byte_140_raq
, V2_QPC_BYTE_140_TRRL_BA_M
,
2778 V2_QPC_BYTE_140_TRRL_BA_S
,
2779 (u32
)(dma_handle_3
>> (32 + 16 + 4)));
2780 roce_set_field(qpc_mask
->byte_140_raq
, V2_QPC_BYTE_140_TRRL_BA_M
,
2781 V2_QPC_BYTE_140_TRRL_BA_S
, 0);
2783 context
->irrl_ba
= (u32
)(dma_handle_2
>> 6);
2784 qpc_mask
->irrl_ba
= 0;
2785 roce_set_field(context
->byte_208_irrl
, V2_QPC_BYTE_208_IRRL_BA_M
,
2786 V2_QPC_BYTE_208_IRRL_BA_S
,
2787 dma_handle_2
>> (32 + 6));
2788 roce_set_field(qpc_mask
->byte_208_irrl
, V2_QPC_BYTE_208_IRRL_BA_M
,
2789 V2_QPC_BYTE_208_IRRL_BA_S
, 0);
2791 roce_set_bit(context
->byte_208_irrl
, V2_QPC_BYTE_208_RMT_E2E_S
, 1);
2792 roce_set_bit(qpc_mask
->byte_208_irrl
, V2_QPC_BYTE_208_RMT_E2E_S
, 0);
2794 roce_set_bit(context
->byte_252_err_txcqn
, V2_QPC_BYTE_252_SIG_TYPE_S
,
2795 hr_qp
->sq_signal_bits
);
2796 roce_set_bit(qpc_mask
->byte_252_err_txcqn
, V2_QPC_BYTE_252_SIG_TYPE_S
,
2799 port
= (attr_mask
& IB_QP_PORT
) ? (attr
->port_num
- 1) : hr_qp
->port
;
2801 smac
= (u8
*)hr_dev
->dev_addr
[port
];
2802 /* when dmac equals smac or loop_idc is 1, it should loopback */
2803 if (ether_addr_equal_unaligned(dmac
, smac
) ||
2804 hr_dev
->loop_idc
== 0x1) {
2805 roce_set_bit(context
->byte_28_at_fl
, V2_QPC_BYTE_28_LBI_S
, 1);
2806 roce_set_bit(qpc_mask
->byte_28_at_fl
, V2_QPC_BYTE_28_LBI_S
, 0);
2809 if ((attr_mask
& IB_QP_MAX_DEST_RD_ATOMIC
) &&
2810 attr
->max_dest_rd_atomic
) {
2811 roce_set_field(context
->byte_140_raq
, V2_QPC_BYTE_140_RR_MAX_M
,
2812 V2_QPC_BYTE_140_RR_MAX_S
,
2813 fls(attr
->max_dest_rd_atomic
- 1));
2814 roce_set_field(qpc_mask
->byte_140_raq
, V2_QPC_BYTE_140_RR_MAX_M
,
2815 V2_QPC_BYTE_140_RR_MAX_S
, 0);
2818 if (attr_mask
& IB_QP_DEST_QPN
) {
2819 roce_set_field(context
->byte_56_dqpn_err
, V2_QPC_BYTE_56_DQPN_M
,
2820 V2_QPC_BYTE_56_DQPN_S
, attr
->dest_qp_num
);
2821 roce_set_field(qpc_mask
->byte_56_dqpn_err
,
2822 V2_QPC_BYTE_56_DQPN_M
, V2_QPC_BYTE_56_DQPN_S
, 0);
2825 /* Configure GID index */
2826 port_num
= rdma_ah_get_port_num(&attr
->ah_attr
);
2827 roce_set_field(context
->byte_20_smac_sgid_idx
,
2828 V2_QPC_BYTE_20_SGID_IDX_M
,
2829 V2_QPC_BYTE_20_SGID_IDX_S
,
2830 hns_get_gid_index(hr_dev
, port_num
- 1,
2832 roce_set_field(qpc_mask
->byte_20_smac_sgid_idx
,
2833 V2_QPC_BYTE_20_SGID_IDX_M
,
2834 V2_QPC_BYTE_20_SGID_IDX_S
, 0);
2835 memcpy(&(context
->dmac
), dmac
, 4);
2836 roce_set_field(context
->byte_52_udpspn_dmac
, V2_QPC_BYTE_52_DMAC_M
,
2837 V2_QPC_BYTE_52_DMAC_S
, *((u16
*)(&dmac
[4])));
2839 roce_set_field(qpc_mask
->byte_52_udpspn_dmac
, V2_QPC_BYTE_52_DMAC_M
,
2840 V2_QPC_BYTE_52_DMAC_S
, 0);
2842 roce_set_field(context
->byte_56_dqpn_err
, V2_QPC_BYTE_56_LP_PKTN_INI_M
,
2843 V2_QPC_BYTE_56_LP_PKTN_INI_S
, 4);
2844 roce_set_field(qpc_mask
->byte_56_dqpn_err
, V2_QPC_BYTE_56_LP_PKTN_INI_M
,
2845 V2_QPC_BYTE_56_LP_PKTN_INI_S
, 0);
2847 roce_set_field(context
->byte_24_mtu_tc
, V2_QPC_BYTE_24_HOP_LIMIT_M
,
2848 V2_QPC_BYTE_24_HOP_LIMIT_S
, grh
->hop_limit
);
2849 roce_set_field(qpc_mask
->byte_24_mtu_tc
, V2_QPC_BYTE_24_HOP_LIMIT_M
,
2850 V2_QPC_BYTE_24_HOP_LIMIT_S
, 0);
2852 roce_set_field(context
->byte_28_at_fl
, V2_QPC_BYTE_28_FL_M
,
2853 V2_QPC_BYTE_28_FL_S
, grh
->flow_label
);
2854 roce_set_field(qpc_mask
->byte_28_at_fl
, V2_QPC_BYTE_28_FL_M
,
2855 V2_QPC_BYTE_28_FL_S
, 0);
2857 roce_set_field(context
->byte_24_mtu_tc
, V2_QPC_BYTE_24_TC_M
,
2858 V2_QPC_BYTE_24_TC_S
, grh
->traffic_class
);
2859 roce_set_field(qpc_mask
->byte_24_mtu_tc
, V2_QPC_BYTE_24_TC_M
,
2860 V2_QPC_BYTE_24_TC_S
, 0);
2862 if (ibqp
->qp_type
== IB_QPT_GSI
|| ibqp
->qp_type
== IB_QPT_UD
)
2863 roce_set_field(context
->byte_24_mtu_tc
, V2_QPC_BYTE_24_MTU_M
,
2864 V2_QPC_BYTE_24_MTU_S
, IB_MTU_4096
);
2865 else if (attr_mask
& IB_QP_PATH_MTU
)
2866 roce_set_field(context
->byte_24_mtu_tc
, V2_QPC_BYTE_24_MTU_M
,
2867 V2_QPC_BYTE_24_MTU_S
, attr
->path_mtu
);
2869 roce_set_field(qpc_mask
->byte_24_mtu_tc
, V2_QPC_BYTE_24_MTU_M
,
2870 V2_QPC_BYTE_24_MTU_S
, 0);
2872 memcpy(context
->dgid
, grh
->dgid
.raw
, sizeof(grh
->dgid
.raw
));
2873 memset(qpc_mask
->dgid
, 0, sizeof(grh
->dgid
.raw
));
2875 roce_set_field(context
->byte_84_rq_ci_pi
,
2876 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M
,
2877 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S
, hr_qp
->rq
.head
);
2878 roce_set_field(qpc_mask
->byte_84_rq_ci_pi
,
2879 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M
,
2880 V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S
, 0);
2882 roce_set_field(qpc_mask
->byte_84_rq_ci_pi
,
2883 V2_QPC_BYTE_84_RQ_CONSUMER_IDX_M
,
2884 V2_QPC_BYTE_84_RQ_CONSUMER_IDX_S
, 0);
2885 roce_set_bit(qpc_mask
->byte_108_rx_reqepsn
,
2886 V2_QPC_BYTE_108_RX_REQ_PSN_ERR_S
, 0);
2887 roce_set_field(qpc_mask
->byte_96_rx_reqmsn
, V2_QPC_BYTE_96_RX_REQ_MSN_M
,
2888 V2_QPC_BYTE_96_RX_REQ_MSN_S
, 0);
2889 roce_set_field(qpc_mask
->byte_108_rx_reqepsn
,
2890 V2_QPC_BYTE_108_RX_REQ_LAST_OPTYPE_M
,
2891 V2_QPC_BYTE_108_RX_REQ_LAST_OPTYPE_S
, 0);
2893 context
->rq_rnr_timer
= 0;
2894 qpc_mask
->rq_rnr_timer
= 0;
2896 roce_set_field(context
->byte_152_raq
, V2_QPC_BYTE_152_RAQ_PSN_M
,
2897 V2_QPC_BYTE_152_RAQ_PSN_S
, attr
->rq_psn
- 1);
2898 roce_set_field(qpc_mask
->byte_152_raq
, V2_QPC_BYTE_152_RAQ_PSN_M
,
2899 V2_QPC_BYTE_152_RAQ_PSN_S
, 0);
2901 roce_set_field(qpc_mask
->byte_132_trrl
, V2_QPC_BYTE_132_TRRL_HEAD_MAX_M
,
2902 V2_QPC_BYTE_132_TRRL_HEAD_MAX_S
, 0);
2903 roce_set_field(qpc_mask
->byte_132_trrl
, V2_QPC_BYTE_132_TRRL_TAIL_MAX_M
,
2904 V2_QPC_BYTE_132_TRRL_TAIL_MAX_S
, 0);
2906 roce_set_field(context
->byte_168_irrl_idx
,
2907 V2_QPC_BYTE_168_LP_SGEN_INI_M
,
2908 V2_QPC_BYTE_168_LP_SGEN_INI_S
, 3);
2909 roce_set_field(qpc_mask
->byte_168_irrl_idx
,
2910 V2_QPC_BYTE_168_LP_SGEN_INI_M
,
2911 V2_QPC_BYTE_168_LP_SGEN_INI_S
, 0);
2913 roce_set_field(context
->byte_28_at_fl
, V2_QPC_BYTE_28_SL_M
,
2914 V2_QPC_BYTE_28_SL_S
, rdma_ah_get_sl(&attr
->ah_attr
));
2915 roce_set_field(qpc_mask
->byte_28_at_fl
, V2_QPC_BYTE_28_SL_M
,
2916 V2_QPC_BYTE_28_SL_S
, 0);
2917 hr_qp
->sl
= rdma_ah_get_sl(&attr
->ah_attr
);
2922 static int modify_qp_rtr_to_rts(struct ib_qp
*ibqp
,
2923 const struct ib_qp_attr
*attr
, int attr_mask
,
2924 struct hns_roce_v2_qp_context
*context
,
2925 struct hns_roce_v2_qp_context
*qpc_mask
)
2927 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
2928 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
2929 struct device
*dev
= hr_dev
->dev
;
2930 dma_addr_t dma_handle
;
2934 /* Search qp buf's mtts */
2935 mtts
= hns_roce_table_find(hr_dev
, &hr_dev
->mr_table
.mtt_table
,
2936 hr_qp
->mtt
.first_seg
, &dma_handle
);
2938 dev_err(dev
, "qp buf pa find failed\n");
2942 /* Not support alternate path and path migration */
2943 if ((attr_mask
& IB_QP_ALT_PATH
) ||
2944 (attr_mask
& IB_QP_PATH_MIG_STATE
)) {
2945 dev_err(dev
, "RTR2RTS attr_mask (0x%x)error\n", attr_mask
);
2950 * In v2 engine, software pass context and context mask to hardware
2951 * when modifying qp. If software need modify some fields in context,
2952 * we should set all bits of the relevant fields in context mask to
2953 * 0 at the same time, else set them to 0x1.
2955 roce_set_field(context
->byte_60_qpst_mapid
,
2956 V2_QPC_BYTE_60_RTY_NUM_INI_BAK_M
,
2957 V2_QPC_BYTE_60_RTY_NUM_INI_BAK_S
, attr
->retry_cnt
);
2958 roce_set_field(qpc_mask
->byte_60_qpst_mapid
,
2959 V2_QPC_BYTE_60_RTY_NUM_INI_BAK_M
,
2960 V2_QPC_BYTE_60_RTY_NUM_INI_BAK_S
, 0);
2962 context
->sq_cur_blk_addr
= (u32
)(mtts
[0] >> PAGE_ADDR_SHIFT
);
2963 roce_set_field(context
->byte_168_irrl_idx
,
2964 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_M
,
2965 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_S
,
2966 mtts
[0] >> (32 + PAGE_ADDR_SHIFT
));
2967 qpc_mask
->sq_cur_blk_addr
= 0;
2968 roce_set_field(qpc_mask
->byte_168_irrl_idx
,
2969 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_M
,
2970 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_S
, 0);
2972 page_size
= 1 << (hr_dev
->caps
.mtt_buf_pg_sz
+ PAGE_SHIFT
);
2973 context
->sq_cur_sge_blk_addr
=
2974 ((ibqp
->qp_type
== IB_QPT_GSI
) || hr_qp
->sq
.max_gs
> 2) ?
2975 ((u32
)(mtts
[hr_qp
->sge
.offset
/ page_size
]
2976 >> PAGE_ADDR_SHIFT
)) : 0;
2977 roce_set_field(context
->byte_184_irrl_idx
,
2978 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_M
,
2979 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_S
,
2980 ((ibqp
->qp_type
== IB_QPT_GSI
) || hr_qp
->sq
.max_gs
> 2) ?
2981 (mtts
[hr_qp
->sge
.offset
/ page_size
] >>
2982 (32 + PAGE_ADDR_SHIFT
)) : 0);
2983 qpc_mask
->sq_cur_sge_blk_addr
= 0;
2984 roce_set_field(qpc_mask
->byte_184_irrl_idx
,
2985 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_M
,
2986 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_S
, 0);
2988 context
->rx_sq_cur_blk_addr
= (u32
)(mtts
[0] >> PAGE_ADDR_SHIFT
);
2989 roce_set_field(context
->byte_232_irrl_sge
,
2990 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_M
,
2991 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_S
,
2992 mtts
[0] >> (32 + PAGE_ADDR_SHIFT
));
2993 qpc_mask
->rx_sq_cur_blk_addr
= 0;
2994 roce_set_field(qpc_mask
->byte_232_irrl_sge
,
2995 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_M
,
2996 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_S
, 0);
2999 * Set some fields in context to zero, Because the default values
3000 * of all fields in context are zero, we need not set them to 0 again.
3001 * but we should set the relevant fields of context mask to 0.
3003 roce_set_field(qpc_mask
->byte_232_irrl_sge
,
3004 V2_QPC_BYTE_232_IRRL_SGE_IDX_M
,
3005 V2_QPC_BYTE_232_IRRL_SGE_IDX_S
, 0);
3007 roce_set_field(qpc_mask
->byte_240_irrl_tail
,
3008 V2_QPC_BYTE_240_RX_ACK_MSN_M
,
3009 V2_QPC_BYTE_240_RX_ACK_MSN_S
, 0);
3011 roce_set_field(context
->byte_244_rnr_rxack
,
3012 V2_QPC_BYTE_244_RX_ACK_EPSN_M
,
3013 V2_QPC_BYTE_244_RX_ACK_EPSN_S
, attr
->sq_psn
);
3014 roce_set_field(qpc_mask
->byte_244_rnr_rxack
,
3015 V2_QPC_BYTE_244_RX_ACK_EPSN_M
,
3016 V2_QPC_BYTE_244_RX_ACK_EPSN_S
, 0);
3018 roce_set_field(qpc_mask
->byte_248_ack_psn
,
3019 V2_QPC_BYTE_248_ACK_LAST_OPTYPE_M
,
3020 V2_QPC_BYTE_248_ACK_LAST_OPTYPE_S
, 0);
3021 roce_set_bit(qpc_mask
->byte_248_ack_psn
,
3022 V2_QPC_BYTE_248_IRRL_PSN_VLD_S
, 0);
3023 roce_set_field(qpc_mask
->byte_248_ack_psn
,
3024 V2_QPC_BYTE_248_IRRL_PSN_M
,
3025 V2_QPC_BYTE_248_IRRL_PSN_S
, 0);
3027 roce_set_field(qpc_mask
->byte_240_irrl_tail
,
3028 V2_QPC_BYTE_240_IRRL_TAIL_REAL_M
,
3029 V2_QPC_BYTE_240_IRRL_TAIL_REAL_S
, 0);
3031 roce_set_field(context
->byte_220_retry_psn_msn
,
3032 V2_QPC_BYTE_220_RETRY_MSG_PSN_M
,
3033 V2_QPC_BYTE_220_RETRY_MSG_PSN_S
, attr
->sq_psn
);
3034 roce_set_field(qpc_mask
->byte_220_retry_psn_msn
,
3035 V2_QPC_BYTE_220_RETRY_MSG_PSN_M
,
3036 V2_QPC_BYTE_220_RETRY_MSG_PSN_S
, 0);
3038 roce_set_field(context
->byte_224_retry_msg
,
3039 V2_QPC_BYTE_224_RETRY_MSG_PSN_M
,
3040 V2_QPC_BYTE_224_RETRY_MSG_PSN_S
, attr
->sq_psn
>> 16);
3041 roce_set_field(qpc_mask
->byte_224_retry_msg
,
3042 V2_QPC_BYTE_224_RETRY_MSG_PSN_M
,
3043 V2_QPC_BYTE_224_RETRY_MSG_PSN_S
, 0);
3045 roce_set_field(context
->byte_224_retry_msg
,
3046 V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_M
,
3047 V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_S
, attr
->sq_psn
);
3048 roce_set_field(qpc_mask
->byte_224_retry_msg
,
3049 V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_M
,
3050 V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_S
, 0);
3052 roce_set_field(qpc_mask
->byte_220_retry_psn_msn
,
3053 V2_QPC_BYTE_220_RETRY_MSG_MSN_M
,
3054 V2_QPC_BYTE_220_RETRY_MSG_MSN_S
, 0);
3056 roce_set_bit(qpc_mask
->byte_248_ack_psn
,
3057 V2_QPC_BYTE_248_RNR_RETRY_FLAG_S
, 0);
3059 roce_set_field(qpc_mask
->byte_212_lsn
, V2_QPC_BYTE_212_CHECK_FLG_M
,
3060 V2_QPC_BYTE_212_CHECK_FLG_S
, 0);
3062 roce_set_field(context
->byte_212_lsn
, V2_QPC_BYTE_212_RETRY_CNT_M
,
3063 V2_QPC_BYTE_212_RETRY_CNT_S
, attr
->retry_cnt
);
3064 roce_set_field(qpc_mask
->byte_212_lsn
, V2_QPC_BYTE_212_RETRY_CNT_M
,
3065 V2_QPC_BYTE_212_RETRY_CNT_S
, 0);
3067 roce_set_field(context
->byte_212_lsn
, V2_QPC_BYTE_212_RETRY_NUM_INIT_M
,
3068 V2_QPC_BYTE_212_RETRY_NUM_INIT_S
, attr
->retry_cnt
);
3069 roce_set_field(qpc_mask
->byte_212_lsn
, V2_QPC_BYTE_212_RETRY_NUM_INIT_M
,
3070 V2_QPC_BYTE_212_RETRY_NUM_INIT_S
, 0);
3072 roce_set_field(context
->byte_244_rnr_rxack
,
3073 V2_QPC_BYTE_244_RNR_NUM_INIT_M
,
3074 V2_QPC_BYTE_244_RNR_NUM_INIT_S
, attr
->rnr_retry
);
3075 roce_set_field(qpc_mask
->byte_244_rnr_rxack
,
3076 V2_QPC_BYTE_244_RNR_NUM_INIT_M
,
3077 V2_QPC_BYTE_244_RNR_NUM_INIT_S
, 0);
3079 roce_set_field(context
->byte_244_rnr_rxack
, V2_QPC_BYTE_244_RNR_CNT_M
,
3080 V2_QPC_BYTE_244_RNR_CNT_S
, attr
->rnr_retry
);
3081 roce_set_field(qpc_mask
->byte_244_rnr_rxack
, V2_QPC_BYTE_244_RNR_CNT_M
,
3082 V2_QPC_BYTE_244_RNR_CNT_S
, 0);
3084 roce_set_field(context
->byte_212_lsn
, V2_QPC_BYTE_212_LSN_M
,
3085 V2_QPC_BYTE_212_LSN_S
, 0x100);
3086 roce_set_field(qpc_mask
->byte_212_lsn
, V2_QPC_BYTE_212_LSN_M
,
3087 V2_QPC_BYTE_212_LSN_S
, 0);
3089 if (attr_mask
& IB_QP_TIMEOUT
) {
3090 roce_set_field(context
->byte_28_at_fl
, V2_QPC_BYTE_28_AT_M
,
3091 V2_QPC_BYTE_28_AT_S
, attr
->timeout
);
3092 roce_set_field(qpc_mask
->byte_28_at_fl
, V2_QPC_BYTE_28_AT_M
,
3093 V2_QPC_BYTE_28_AT_S
, 0);
3096 roce_set_field(context
->byte_28_at_fl
, V2_QPC_BYTE_28_SL_M
,
3097 V2_QPC_BYTE_28_SL_S
,
3098 rdma_ah_get_sl(&attr
->ah_attr
));
3099 roce_set_field(qpc_mask
->byte_28_at_fl
, V2_QPC_BYTE_28_SL_M
,
3100 V2_QPC_BYTE_28_SL_S
, 0);
3101 hr_qp
->sl
= rdma_ah_get_sl(&attr
->ah_attr
);
3103 roce_set_field(context
->byte_172_sq_psn
, V2_QPC_BYTE_172_SQ_CUR_PSN_M
,
3104 V2_QPC_BYTE_172_SQ_CUR_PSN_S
, attr
->sq_psn
);
3105 roce_set_field(qpc_mask
->byte_172_sq_psn
, V2_QPC_BYTE_172_SQ_CUR_PSN_M
,
3106 V2_QPC_BYTE_172_SQ_CUR_PSN_S
, 0);
3108 roce_set_field(qpc_mask
->byte_196_sq_psn
, V2_QPC_BYTE_196_IRRL_HEAD_M
,
3109 V2_QPC_BYTE_196_IRRL_HEAD_S
, 0);
3110 roce_set_field(context
->byte_196_sq_psn
, V2_QPC_BYTE_196_SQ_MAX_PSN_M
,
3111 V2_QPC_BYTE_196_SQ_MAX_PSN_S
, attr
->sq_psn
);
3112 roce_set_field(qpc_mask
->byte_196_sq_psn
, V2_QPC_BYTE_196_SQ_MAX_PSN_M
,
3113 V2_QPC_BYTE_196_SQ_MAX_PSN_S
, 0);
3115 if ((attr_mask
& IB_QP_MAX_QP_RD_ATOMIC
) && attr
->max_rd_atomic
) {
3116 roce_set_field(context
->byte_208_irrl
, V2_QPC_BYTE_208_SR_MAX_M
,
3117 V2_QPC_BYTE_208_SR_MAX_S
,
3118 fls(attr
->max_rd_atomic
- 1));
3119 roce_set_field(qpc_mask
->byte_208_irrl
,
3120 V2_QPC_BYTE_208_SR_MAX_M
,
3121 V2_QPC_BYTE_208_SR_MAX_S
, 0);
3126 static int hns_roce_v2_modify_qp(struct ib_qp
*ibqp
,
3127 const struct ib_qp_attr
*attr
,
3128 int attr_mask
, enum ib_qp_state cur_state
,
3129 enum ib_qp_state new_state
)
3131 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
3132 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
3133 struct hns_roce_v2_qp_context
*context
;
3134 struct hns_roce_v2_qp_context
*qpc_mask
;
3135 struct device
*dev
= hr_dev
->dev
;
3138 context
= kzalloc(2 * sizeof(*context
), GFP_KERNEL
);
3142 qpc_mask
= context
+ 1;
3144 * In v2 engine, software pass context and context mask to hardware
3145 * when modifying qp. If software need modify some fields in context,
3146 * we should set all bits of the relevant fields in context mask to
3147 * 0 at the same time, else set them to 0x1.
3149 memset(qpc_mask
, 0xff, sizeof(*qpc_mask
));
3150 if (cur_state
== IB_QPS_RESET
&& new_state
== IB_QPS_INIT
) {
3151 modify_qp_reset_to_init(ibqp
, attr
, attr_mask
, context
,
3153 } else if (cur_state
== IB_QPS_INIT
&& new_state
== IB_QPS_INIT
) {
3154 modify_qp_init_to_init(ibqp
, attr
, attr_mask
, context
,
3156 } else if (cur_state
== IB_QPS_INIT
&& new_state
== IB_QPS_RTR
) {
3157 ret
= modify_qp_init_to_rtr(ibqp
, attr
, attr_mask
, context
,
3161 } else if (cur_state
== IB_QPS_RTR
&& new_state
== IB_QPS_RTS
) {
3162 ret
= modify_qp_rtr_to_rts(ibqp
, attr
, attr_mask
, context
,
3166 } else if ((cur_state
== IB_QPS_RTS
&& new_state
== IB_QPS_RTS
) ||
3167 (cur_state
== IB_QPS_SQE
&& new_state
== IB_QPS_RTS
) ||
3168 (cur_state
== IB_QPS_RTS
&& new_state
== IB_QPS_SQD
) ||
3169 (cur_state
== IB_QPS_SQD
&& new_state
== IB_QPS_SQD
) ||
3170 (cur_state
== IB_QPS_SQD
&& new_state
== IB_QPS_RTS
) ||
3171 (cur_state
== IB_QPS_INIT
&& new_state
== IB_QPS_RESET
) ||
3172 (cur_state
== IB_QPS_RTR
&& new_state
== IB_QPS_RESET
) ||
3173 (cur_state
== IB_QPS_RTS
&& new_state
== IB_QPS_RESET
) ||
3174 (cur_state
== IB_QPS_ERR
&& new_state
== IB_QPS_RESET
) ||
3175 (cur_state
== IB_QPS_INIT
&& new_state
== IB_QPS_ERR
) ||
3176 (cur_state
== IB_QPS_RTR
&& new_state
== IB_QPS_ERR
) ||
3177 (cur_state
== IB_QPS_RTS
&& new_state
== IB_QPS_ERR
) ||
3178 (cur_state
== IB_QPS_SQD
&& new_state
== IB_QPS_ERR
) ||
3179 (cur_state
== IB_QPS_SQE
&& new_state
== IB_QPS_ERR
) ||
3180 (cur_state
== IB_QPS_ERR
&& new_state
== IB_QPS_ERR
)) {
3184 dev_err(dev
, "Illegal state for QP!\n");
3188 if (attr_mask
& (IB_QP_ACCESS_FLAGS
| IB_QP_MAX_DEST_RD_ATOMIC
))
3189 set_access_flags(hr_qp
, context
, qpc_mask
, attr
, attr_mask
);
3191 /* Every status migrate must change state */
3192 roce_set_field(context
->byte_60_qpst_mapid
, V2_QPC_BYTE_60_QP_ST_M
,
3193 V2_QPC_BYTE_60_QP_ST_S
, new_state
);
3194 roce_set_field(qpc_mask
->byte_60_qpst_mapid
, V2_QPC_BYTE_60_QP_ST_M
,
3195 V2_QPC_BYTE_60_QP_ST_S
, 0);
3197 /* SW pass context to HW */
3198 ret
= hns_roce_v2_qp_modify(hr_dev
, &hr_qp
->mtt
, cur_state
, new_state
,
3201 dev_err(dev
, "hns_roce_qp_modify failed(%d)\n", ret
);
3205 hr_qp
->state
= new_state
;
3207 if (attr_mask
& IB_QP_ACCESS_FLAGS
)
3208 hr_qp
->atomic_rd_en
= attr
->qp_access_flags
;
3210 if (attr_mask
& IB_QP_MAX_DEST_RD_ATOMIC
)
3211 hr_qp
->resp_depth
= attr
->max_dest_rd_atomic
;
3212 if (attr_mask
& IB_QP_PORT
) {
3213 hr_qp
->port
= attr
->port_num
- 1;
3214 hr_qp
->phy_port
= hr_dev
->iboe
.phy_port
[hr_qp
->port
];
3217 if (new_state
== IB_QPS_RESET
&& !ibqp
->uobject
) {
3218 hns_roce_v2_cq_clean(to_hr_cq(ibqp
->recv_cq
), hr_qp
->qpn
,
3219 ibqp
->srq
? to_hr_srq(ibqp
->srq
) : NULL
);
3220 if (ibqp
->send_cq
!= ibqp
->recv_cq
)
3221 hns_roce_v2_cq_clean(to_hr_cq(ibqp
->send_cq
),
3228 hr_qp
->sq_next_wqe
= 0;
3229 hr_qp
->next_sge
= 0;
3230 if (hr_qp
->rq
.wqe_cnt
)
3231 *hr_qp
->rdb
.db_record
= 0;
3239 static inline enum ib_qp_state
to_ib_qp_st(enum hns_roce_v2_qp_state state
)
3242 case HNS_ROCE_QP_ST_RST
: return IB_QPS_RESET
;
3243 case HNS_ROCE_QP_ST_INIT
: return IB_QPS_INIT
;
3244 case HNS_ROCE_QP_ST_RTR
: return IB_QPS_RTR
;
3245 case HNS_ROCE_QP_ST_RTS
: return IB_QPS_RTS
;
3246 case HNS_ROCE_QP_ST_SQ_DRAINING
:
3247 case HNS_ROCE_QP_ST_SQD
: return IB_QPS_SQD
;
3248 case HNS_ROCE_QP_ST_SQER
: return IB_QPS_SQE
;
3249 case HNS_ROCE_QP_ST_ERR
: return IB_QPS_ERR
;
3254 static int hns_roce_v2_query_qpc(struct hns_roce_dev
*hr_dev
,
3255 struct hns_roce_qp
*hr_qp
,
3256 struct hns_roce_v2_qp_context
*hr_context
)
3258 struct hns_roce_cmd_mailbox
*mailbox
;
3261 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
3262 if (IS_ERR(mailbox
))
3263 return PTR_ERR(mailbox
);
3265 ret
= hns_roce_cmd_mbox(hr_dev
, 0, mailbox
->dma
, hr_qp
->qpn
, 0,
3266 HNS_ROCE_CMD_QUERY_QPC
,
3267 HNS_ROCE_CMD_TIMEOUT_MSECS
);
3269 dev_err(hr_dev
->dev
, "QUERY QP cmd process error\n");
3273 memcpy(hr_context
, mailbox
->buf
, sizeof(*hr_context
));
3276 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
3280 static int hns_roce_v2_query_qp(struct ib_qp
*ibqp
, struct ib_qp_attr
*qp_attr
,
3282 struct ib_qp_init_attr
*qp_init_attr
)
3284 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
3285 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
3286 struct hns_roce_v2_qp_context
*context
;
3287 struct device
*dev
= hr_dev
->dev
;
3292 context
= kzalloc(sizeof(*context
), GFP_KERNEL
);
3296 memset(qp_attr
, 0, sizeof(*qp_attr
));
3297 memset(qp_init_attr
, 0, sizeof(*qp_init_attr
));
3299 mutex_lock(&hr_qp
->mutex
);
3301 if (hr_qp
->state
== IB_QPS_RESET
) {
3302 qp_attr
->qp_state
= IB_QPS_RESET
;
3307 ret
= hns_roce_v2_query_qpc(hr_dev
, hr_qp
, context
);
3309 dev_err(dev
, "query qpc error\n");
3314 state
= roce_get_field(context
->byte_60_qpst_mapid
,
3315 V2_QPC_BYTE_60_QP_ST_M
, V2_QPC_BYTE_60_QP_ST_S
);
3316 tmp_qp_state
= to_ib_qp_st((enum hns_roce_v2_qp_state
)state
);
3317 if (tmp_qp_state
== -1) {
3318 dev_err(dev
, "Illegal ib_qp_state\n");
3322 hr_qp
->state
= (u8
)tmp_qp_state
;
3323 qp_attr
->qp_state
= (enum ib_qp_state
)hr_qp
->state
;
3324 qp_attr
->path_mtu
= (enum ib_mtu
)roce_get_field(context
->byte_24_mtu_tc
,
3325 V2_QPC_BYTE_24_MTU_M
,
3326 V2_QPC_BYTE_24_MTU_S
);
3327 qp_attr
->path_mig_state
= IB_MIG_ARMED
;
3328 qp_attr
->ah_attr
.type
= RDMA_AH_ATTR_TYPE_ROCE
;
3329 if (hr_qp
->ibqp
.qp_type
== IB_QPT_UD
)
3330 qp_attr
->qkey
= V2_QKEY_VAL
;
3332 qp_attr
->rq_psn
= roce_get_field(context
->byte_108_rx_reqepsn
,
3333 V2_QPC_BYTE_108_RX_REQ_EPSN_M
,
3334 V2_QPC_BYTE_108_RX_REQ_EPSN_S
);
3335 qp_attr
->sq_psn
= (u32
)roce_get_field(context
->byte_172_sq_psn
,
3336 V2_QPC_BYTE_172_SQ_CUR_PSN_M
,
3337 V2_QPC_BYTE_172_SQ_CUR_PSN_S
);
3338 qp_attr
->dest_qp_num
= (u8
)roce_get_field(context
->byte_56_dqpn_err
,
3339 V2_QPC_BYTE_56_DQPN_M
,
3340 V2_QPC_BYTE_56_DQPN_S
);
3341 qp_attr
->qp_access_flags
= ((roce_get_bit(context
->byte_76_srqn_op_en
,
3342 V2_QPC_BYTE_76_RRE_S
)) << 2) |
3343 ((roce_get_bit(context
->byte_76_srqn_op_en
,
3344 V2_QPC_BYTE_76_RWE_S
)) << 1) |
3345 ((roce_get_bit(context
->byte_76_srqn_op_en
,
3346 V2_QPC_BYTE_76_ATE_S
)) << 3);
3347 if (hr_qp
->ibqp
.qp_type
== IB_QPT_RC
||
3348 hr_qp
->ibqp
.qp_type
== IB_QPT_UC
) {
3349 struct ib_global_route
*grh
=
3350 rdma_ah_retrieve_grh(&qp_attr
->ah_attr
);
3352 rdma_ah_set_sl(&qp_attr
->ah_attr
,
3353 roce_get_field(context
->byte_28_at_fl
,
3354 V2_QPC_BYTE_28_SL_M
,
3355 V2_QPC_BYTE_28_SL_S
));
3356 grh
->flow_label
= roce_get_field(context
->byte_28_at_fl
,
3357 V2_QPC_BYTE_28_FL_M
,
3358 V2_QPC_BYTE_28_FL_S
);
3359 grh
->sgid_index
= roce_get_field(context
->byte_20_smac_sgid_idx
,
3360 V2_QPC_BYTE_20_SGID_IDX_M
,
3361 V2_QPC_BYTE_20_SGID_IDX_S
);
3362 grh
->hop_limit
= roce_get_field(context
->byte_24_mtu_tc
,
3363 V2_QPC_BYTE_24_HOP_LIMIT_M
,
3364 V2_QPC_BYTE_24_HOP_LIMIT_S
);
3365 grh
->traffic_class
= roce_get_field(context
->byte_24_mtu_tc
,
3366 V2_QPC_BYTE_24_TC_M
,
3367 V2_QPC_BYTE_24_TC_S
);
3369 memcpy(grh
->dgid
.raw
, context
->dgid
, sizeof(grh
->dgid
.raw
));
3372 qp_attr
->port_num
= hr_qp
->port
+ 1;
3373 qp_attr
->sq_draining
= 0;
3374 qp_attr
->max_rd_atomic
= 1 << roce_get_field(context
->byte_208_irrl
,
3375 V2_QPC_BYTE_208_SR_MAX_M
,
3376 V2_QPC_BYTE_208_SR_MAX_S
);
3377 qp_attr
->max_dest_rd_atomic
= 1 << roce_get_field(context
->byte_140_raq
,
3378 V2_QPC_BYTE_140_RR_MAX_M
,
3379 V2_QPC_BYTE_140_RR_MAX_S
);
3380 qp_attr
->min_rnr_timer
= (u8
)roce_get_field(context
->byte_80_rnr_rx_cqn
,
3381 V2_QPC_BYTE_80_MIN_RNR_TIME_M
,
3382 V2_QPC_BYTE_80_MIN_RNR_TIME_S
);
3383 qp_attr
->timeout
= (u8
)roce_get_field(context
->byte_28_at_fl
,
3384 V2_QPC_BYTE_28_AT_M
,
3385 V2_QPC_BYTE_28_AT_S
);
3386 qp_attr
->retry_cnt
= roce_get_field(context
->byte_212_lsn
,
3387 V2_QPC_BYTE_212_RETRY_CNT_M
,
3388 V2_QPC_BYTE_212_RETRY_CNT_S
);
3389 qp_attr
->rnr_retry
= context
->rq_rnr_timer
;
3392 qp_attr
->cur_qp_state
= qp_attr
->qp_state
;
3393 qp_attr
->cap
.max_recv_wr
= hr_qp
->rq
.wqe_cnt
;
3394 qp_attr
->cap
.max_recv_sge
= hr_qp
->rq
.max_gs
;
3396 if (!ibqp
->uobject
) {
3397 qp_attr
->cap
.max_send_wr
= hr_qp
->sq
.wqe_cnt
;
3398 qp_attr
->cap
.max_send_sge
= hr_qp
->sq
.max_gs
;
3400 qp_attr
->cap
.max_send_wr
= 0;
3401 qp_attr
->cap
.max_send_sge
= 0;
3404 qp_init_attr
->cap
= qp_attr
->cap
;
3407 mutex_unlock(&hr_qp
->mutex
);
3412 static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev
*hr_dev
,
3413 struct hns_roce_qp
*hr_qp
,
3416 struct hns_roce_cq
*send_cq
, *recv_cq
;
3417 struct device
*dev
= hr_dev
->dev
;
3420 if (hr_qp
->ibqp
.qp_type
== IB_QPT_RC
&& hr_qp
->state
!= IB_QPS_RESET
) {
3421 /* Modify qp to reset before destroying qp */
3422 ret
= hns_roce_v2_modify_qp(&hr_qp
->ibqp
, NULL
, 0,
3423 hr_qp
->state
, IB_QPS_RESET
);
3425 dev_err(dev
, "modify QP %06lx to ERR failed.\n",
3431 send_cq
= to_hr_cq(hr_qp
->ibqp
.send_cq
);
3432 recv_cq
= to_hr_cq(hr_qp
->ibqp
.recv_cq
);
3434 hns_roce_lock_cqs(send_cq
, recv_cq
);
3437 __hns_roce_v2_cq_clean(recv_cq
, hr_qp
->qpn
, hr_qp
->ibqp
.srq
?
3438 to_hr_srq(hr_qp
->ibqp
.srq
) : NULL
);
3439 if (send_cq
!= recv_cq
)
3440 __hns_roce_v2_cq_clean(send_cq
, hr_qp
->qpn
, NULL
);
3443 hns_roce_qp_remove(hr_dev
, hr_qp
);
3445 hns_roce_unlock_cqs(send_cq
, recv_cq
);
3447 hns_roce_qp_free(hr_dev
, hr_qp
);
3449 /* Not special_QP, free their QPN */
3450 if ((hr_qp
->ibqp
.qp_type
== IB_QPT_RC
) ||
3451 (hr_qp
->ibqp
.qp_type
== IB_QPT_UC
) ||
3452 (hr_qp
->ibqp
.qp_type
== IB_QPT_UD
))
3453 hns_roce_release_range_qp(hr_dev
, hr_qp
->qpn
, 1);
3455 hns_roce_mtt_cleanup(hr_dev
, &hr_qp
->mtt
);
3458 if (hr_qp
->rq
.wqe_cnt
&& (hr_qp
->rdb_en
== 1))
3459 hns_roce_db_unmap_user(
3460 to_hr_ucontext(hr_qp
->ibqp
.uobject
->context
),
3462 ib_umem_release(hr_qp
->umem
);
3464 kfree(hr_qp
->sq
.wrid
);
3465 kfree(hr_qp
->rq
.wrid
);
3466 hns_roce_buf_free(hr_dev
, hr_qp
->buff_size
, &hr_qp
->hr_buf
);
3467 if (hr_qp
->rq
.wqe_cnt
)
3468 hns_roce_free_db(hr_dev
, &hr_qp
->rdb
);
3471 if (hr_dev
->caps
.flags
& HNS_ROCE_CAP_FLAG_RQ_INLINE
) {
3472 kfree(hr_qp
->rq_inl_buf
.wqe_list
[0].sg_list
);
3473 kfree(hr_qp
->rq_inl_buf
.wqe_list
);
3479 static int hns_roce_v2_destroy_qp(struct ib_qp
*ibqp
)
3481 struct hns_roce_dev
*hr_dev
= to_hr_dev(ibqp
->device
);
3482 struct hns_roce_qp
*hr_qp
= to_hr_qp(ibqp
);
3485 ret
= hns_roce_v2_destroy_qp_common(hr_dev
, hr_qp
, !!ibqp
->pd
->uobject
);
3487 dev_err(hr_dev
->dev
, "Destroy qp failed(%d)\n", ret
);
3491 if (hr_qp
->ibqp
.qp_type
== IB_QPT_GSI
)
3492 kfree(hr_to_hr_sqp(hr_qp
));
3499 static int hns_roce_v2_modify_cq(struct ib_cq
*cq
, u16 cq_count
, u16 cq_period
)
3501 struct hns_roce_dev
*hr_dev
= to_hr_dev(cq
->device
);
3502 struct hns_roce_v2_cq_context
*cq_context
;
3503 struct hns_roce_cq
*hr_cq
= to_hr_cq(cq
);
3504 struct hns_roce_v2_cq_context
*cqc_mask
;
3505 struct hns_roce_cmd_mailbox
*mailbox
;
3508 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
3509 if (IS_ERR(mailbox
))
3510 return PTR_ERR(mailbox
);
3512 cq_context
= mailbox
->buf
;
3513 cqc_mask
= (struct hns_roce_v2_cq_context
*)mailbox
->buf
+ 1;
3515 memset(cqc_mask
, 0xff, sizeof(*cqc_mask
));
3517 roce_set_field(cq_context
->byte_56_cqe_period_maxcnt
,
3518 V2_CQC_BYTE_56_CQ_MAX_CNT_M
, V2_CQC_BYTE_56_CQ_MAX_CNT_S
,
3520 roce_set_field(cqc_mask
->byte_56_cqe_period_maxcnt
,
3521 V2_CQC_BYTE_56_CQ_MAX_CNT_M
, V2_CQC_BYTE_56_CQ_MAX_CNT_S
,
3523 roce_set_field(cq_context
->byte_56_cqe_period_maxcnt
,
3524 V2_CQC_BYTE_56_CQ_PERIOD_M
, V2_CQC_BYTE_56_CQ_PERIOD_S
,
3526 roce_set_field(cqc_mask
->byte_56_cqe_period_maxcnt
,
3527 V2_CQC_BYTE_56_CQ_PERIOD_M
, V2_CQC_BYTE_56_CQ_PERIOD_S
,
3530 ret
= hns_roce_cmd_mbox(hr_dev
, mailbox
->dma
, 0, hr_cq
->cqn
, 1,
3531 HNS_ROCE_CMD_MODIFY_CQC
,
3532 HNS_ROCE_CMD_TIMEOUT_MSECS
);
3533 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
3535 dev_err(hr_dev
->dev
, "MODIFY CQ Failed to cmd mailbox.\n");
3540 static void set_eq_cons_index_v2(struct hns_roce_eq
*eq
)
3547 if (eq
->type_flag
== HNS_ROCE_AEQ
) {
3548 roce_set_field(doorbell
[0], HNS_ROCE_V2_EQ_DB_CMD_M
,
3549 HNS_ROCE_V2_EQ_DB_CMD_S
,
3550 eq
->arm_st
== HNS_ROCE_V2_EQ_ALWAYS_ARMED
?
3551 HNS_ROCE_EQ_DB_CMD_AEQ
:
3552 HNS_ROCE_EQ_DB_CMD_AEQ_ARMED
);
3554 roce_set_field(doorbell
[0], HNS_ROCE_V2_EQ_DB_TAG_M
,
3555 HNS_ROCE_V2_EQ_DB_TAG_S
, eq
->eqn
);
3557 roce_set_field(doorbell
[0], HNS_ROCE_V2_EQ_DB_CMD_M
,
3558 HNS_ROCE_V2_EQ_DB_CMD_S
,
3559 eq
->arm_st
== HNS_ROCE_V2_EQ_ALWAYS_ARMED
?
3560 HNS_ROCE_EQ_DB_CMD_CEQ
:
3561 HNS_ROCE_EQ_DB_CMD_CEQ_ARMED
);
3564 roce_set_field(doorbell
[1], HNS_ROCE_V2_EQ_DB_PARA_M
,
3565 HNS_ROCE_V2_EQ_DB_PARA_S
,
3566 (eq
->cons_index
& HNS_ROCE_V2_CONS_IDX_M
));
3568 hns_roce_write64_k(doorbell
, eq
->doorbell
);
3571 static void hns_roce_v2_wq_catas_err_handle(struct hns_roce_dev
*hr_dev
,
3572 struct hns_roce_aeqe
*aeqe
,
3575 struct device
*dev
= hr_dev
->dev
;
3578 dev_warn(dev
, "Local work queue catastrophic error.\n");
3579 sub_type
= roce_get_field(aeqe
->asyn
, HNS_ROCE_V2_AEQE_SUB_TYPE_M
,
3580 HNS_ROCE_V2_AEQE_SUB_TYPE_S
);
3582 case HNS_ROCE_LWQCE_QPC_ERROR
:
3583 dev_warn(dev
, "QP %d, QPC error.\n", qpn
);
3585 case HNS_ROCE_LWQCE_MTU_ERROR
:
3586 dev_warn(dev
, "QP %d, MTU error.\n", qpn
);
3588 case HNS_ROCE_LWQCE_WQE_BA_ADDR_ERROR
:
3589 dev_warn(dev
, "QP %d, WQE BA addr error.\n", qpn
);
3591 case HNS_ROCE_LWQCE_WQE_ADDR_ERROR
:
3592 dev_warn(dev
, "QP %d, WQE addr error.\n", qpn
);
3594 case HNS_ROCE_LWQCE_SQ_WQE_SHIFT_ERROR
:
3595 dev_warn(dev
, "QP %d, WQE shift error.\n", qpn
);
3598 dev_err(dev
, "Unhandled sub_event type %d.\n", sub_type
);
3603 static void hns_roce_v2_local_wq_access_err_handle(struct hns_roce_dev
*hr_dev
,
3604 struct hns_roce_aeqe
*aeqe
, u32 qpn
)
3606 struct device
*dev
= hr_dev
->dev
;
3609 dev_warn(dev
, "Local access violation work queue error.\n");
3610 sub_type
= roce_get_field(aeqe
->asyn
, HNS_ROCE_V2_AEQE_SUB_TYPE_M
,
3611 HNS_ROCE_V2_AEQE_SUB_TYPE_S
);
3613 case HNS_ROCE_LAVWQE_R_KEY_VIOLATION
:
3614 dev_warn(dev
, "QP %d, R_key violation.\n", qpn
);
3616 case HNS_ROCE_LAVWQE_LENGTH_ERROR
:
3617 dev_warn(dev
, "QP %d, length error.\n", qpn
);
3619 case HNS_ROCE_LAVWQE_VA_ERROR
:
3620 dev_warn(dev
, "QP %d, VA error.\n", qpn
);
3622 case HNS_ROCE_LAVWQE_PD_ERROR
:
3623 dev_err(dev
, "QP %d, PD error.\n", qpn
);
3625 case HNS_ROCE_LAVWQE_RW_ACC_ERROR
:
3626 dev_warn(dev
, "QP %d, rw acc error.\n", qpn
);
3628 case HNS_ROCE_LAVWQE_KEY_STATE_ERROR
:
3629 dev_warn(dev
, "QP %d, key state error.\n", qpn
);
3631 case HNS_ROCE_LAVWQE_MR_OPERATION_ERROR
:
3632 dev_warn(dev
, "QP %d, MR operation error.\n", qpn
);
3635 dev_err(dev
, "Unhandled sub_event type %d.\n", sub_type
);
3640 static void hns_roce_v2_qp_err_handle(struct hns_roce_dev
*hr_dev
,
3641 struct hns_roce_aeqe
*aeqe
,
3644 struct device
*dev
= hr_dev
->dev
;
3647 qpn
= roce_get_field(aeqe
->event
.qp_event
.qp
,
3648 HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_M
,
3649 HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_S
);
3651 switch (event_type
) {
3652 case HNS_ROCE_EVENT_TYPE_COMM_EST
:
3653 dev_warn(dev
, "Communication established.\n");
3655 case HNS_ROCE_EVENT_TYPE_SQ_DRAINED
:
3656 dev_warn(dev
, "Send queue drained.\n");
3658 case HNS_ROCE_EVENT_TYPE_WQ_CATAS_ERROR
:
3659 hns_roce_v2_wq_catas_err_handle(hr_dev
, aeqe
, qpn
);
3661 case HNS_ROCE_EVENT_TYPE_INV_REQ_LOCAL_WQ_ERROR
:
3662 dev_warn(dev
, "Invalid request local work queue error.\n");
3664 case HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR
:
3665 hns_roce_v2_local_wq_access_err_handle(hr_dev
, aeqe
, qpn
);
3671 hns_roce_qp_event(hr_dev
, qpn
, event_type
);
3674 static void hns_roce_v2_cq_err_handle(struct hns_roce_dev
*hr_dev
,
3675 struct hns_roce_aeqe
*aeqe
,
3678 struct device
*dev
= hr_dev
->dev
;
3681 cqn
= roce_get_field(aeqe
->event
.cq_event
.cq
,
3682 HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_M
,
3683 HNS_ROCE_V2_AEQE_EVENT_QUEUE_NUM_S
);
3685 switch (event_type
) {
3686 case HNS_ROCE_EVENT_TYPE_CQ_ACCESS_ERROR
:
3687 dev_warn(dev
, "CQ 0x%x access err.\n", cqn
);
3689 case HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW
:
3690 dev_warn(dev
, "CQ 0x%x overflow\n", cqn
);
3696 hns_roce_cq_event(hr_dev
, cqn
, event_type
);
3699 static struct hns_roce_aeqe
*get_aeqe_v2(struct hns_roce_eq
*eq
, u32 entry
)
3704 buf_chk_sz
= 1 << (eq
->eqe_buf_pg_sz
+ PAGE_SHIFT
);
3705 off
= (entry
& (eq
->entries
- 1)) * HNS_ROCE_AEQ_ENTRY_SIZE
;
3707 return (struct hns_roce_aeqe
*)((char *)(eq
->buf_list
->buf
) +
3711 static struct hns_roce_aeqe
*mhop_get_aeqe(struct hns_roce_eq
*eq
, u32 entry
)
3716 buf_chk_sz
= 1 << (eq
->eqe_buf_pg_sz
+ PAGE_SHIFT
);
3718 off
= (entry
& (eq
->entries
- 1)) * HNS_ROCE_AEQ_ENTRY_SIZE
;
3720 if (eq
->hop_num
== HNS_ROCE_HOP_NUM_0
)
3721 return (struct hns_roce_aeqe
*)((u8
*)(eq
->bt_l0
) +
3724 return (struct hns_roce_aeqe
*)((u8
*)
3725 (eq
->buf
[off
/ buf_chk_sz
]) + off
% buf_chk_sz
);
3728 static struct hns_roce_aeqe
*next_aeqe_sw_v2(struct hns_roce_eq
*eq
)
3730 struct hns_roce_aeqe
*aeqe
;
3733 aeqe
= get_aeqe_v2(eq
, eq
->cons_index
);
3735 aeqe
= mhop_get_aeqe(eq
, eq
->cons_index
);
3737 return (roce_get_bit(aeqe
->asyn
, HNS_ROCE_V2_AEQ_AEQE_OWNER_S
) ^
3738 !!(eq
->cons_index
& eq
->entries
)) ? aeqe
: NULL
;
3741 static int hns_roce_v2_aeq_int(struct hns_roce_dev
*hr_dev
,
3742 struct hns_roce_eq
*eq
)
3744 struct device
*dev
= hr_dev
->dev
;
3745 struct hns_roce_aeqe
*aeqe
;
3749 while ((aeqe
= next_aeqe_sw_v2(eq
))) {
3751 /* Make sure we read AEQ entry after we have checked the
3756 event_type
= roce_get_field(aeqe
->asyn
,
3757 HNS_ROCE_V2_AEQE_EVENT_TYPE_M
,
3758 HNS_ROCE_V2_AEQE_EVENT_TYPE_S
);
3760 switch (event_type
) {
3761 case HNS_ROCE_EVENT_TYPE_PATH_MIG
:
3762 dev_warn(dev
, "Path migrated succeeded.\n");
3764 case HNS_ROCE_EVENT_TYPE_PATH_MIG_FAILED
:
3765 dev_warn(dev
, "Path migration failed.\n");
3767 case HNS_ROCE_EVENT_TYPE_COMM_EST
:
3768 case HNS_ROCE_EVENT_TYPE_SQ_DRAINED
:
3769 case HNS_ROCE_EVENT_TYPE_WQ_CATAS_ERROR
:
3770 case HNS_ROCE_EVENT_TYPE_INV_REQ_LOCAL_WQ_ERROR
:
3771 case HNS_ROCE_EVENT_TYPE_LOCAL_WQ_ACCESS_ERROR
:
3772 hns_roce_v2_qp_err_handle(hr_dev
, aeqe
, event_type
);
3774 case HNS_ROCE_EVENT_TYPE_SRQ_LIMIT_REACH
:
3775 case HNS_ROCE_EVENT_TYPE_SRQ_LAST_WQE_REACH
:
3776 case HNS_ROCE_EVENT_TYPE_SRQ_CATAS_ERROR
:
3777 dev_warn(dev
, "SRQ not support.\n");
3779 case HNS_ROCE_EVENT_TYPE_CQ_ACCESS_ERROR
:
3780 case HNS_ROCE_EVENT_TYPE_CQ_OVERFLOW
:
3781 hns_roce_v2_cq_err_handle(hr_dev
, aeqe
, event_type
);
3783 case HNS_ROCE_EVENT_TYPE_DB_OVERFLOW
:
3784 dev_warn(dev
, "DB overflow.\n");
3786 case HNS_ROCE_EVENT_TYPE_MB
:
3787 hns_roce_cmd_event(hr_dev
,
3788 le16_to_cpu(aeqe
->event
.cmd
.token
),
3789 aeqe
->event
.cmd
.status
,
3790 le64_to_cpu(aeqe
->event
.cmd
.out_param
));
3792 case HNS_ROCE_EVENT_TYPE_CEQ_OVERFLOW
:
3793 dev_warn(dev
, "CEQ overflow.\n");
3795 case HNS_ROCE_EVENT_TYPE_FLR
:
3796 dev_warn(dev
, "Function level reset.\n");
3799 dev_err(dev
, "Unhandled event %d on EQ %d at idx %u.\n",
3800 event_type
, eq
->eqn
, eq
->cons_index
);
3807 if (eq
->cons_index
> (2 * eq
->entries
- 1)) {
3808 dev_warn(dev
, "cons_index overflow, set back to 0.\n");
3813 set_eq_cons_index_v2(eq
);
3817 static struct hns_roce_ceqe
*get_ceqe_v2(struct hns_roce_eq
*eq
, u32 entry
)
3822 buf_chk_sz
= 1 << (eq
->eqe_buf_pg_sz
+ PAGE_SHIFT
);
3823 off
= (entry
& (eq
->entries
- 1)) * HNS_ROCE_CEQ_ENTRY_SIZE
;
3825 return (struct hns_roce_ceqe
*)((char *)(eq
->buf_list
->buf
) +
3829 static struct hns_roce_ceqe
*mhop_get_ceqe(struct hns_roce_eq
*eq
, u32 entry
)
3834 buf_chk_sz
= 1 << (eq
->eqe_buf_pg_sz
+ PAGE_SHIFT
);
3836 off
= (entry
& (eq
->entries
- 1)) * HNS_ROCE_CEQ_ENTRY_SIZE
;
3838 if (eq
->hop_num
== HNS_ROCE_HOP_NUM_0
)
3839 return (struct hns_roce_ceqe
*)((u8
*)(eq
->bt_l0
) +
3842 return (struct hns_roce_ceqe
*)((u8
*)(eq
->buf
[off
/
3843 buf_chk_sz
]) + off
% buf_chk_sz
);
3846 static struct hns_roce_ceqe
*next_ceqe_sw_v2(struct hns_roce_eq
*eq
)
3848 struct hns_roce_ceqe
*ceqe
;
3851 ceqe
= get_ceqe_v2(eq
, eq
->cons_index
);
3853 ceqe
= mhop_get_ceqe(eq
, eq
->cons_index
);
3855 return (!!(roce_get_bit(ceqe
->comp
, HNS_ROCE_V2_CEQ_CEQE_OWNER_S
))) ^
3856 (!!(eq
->cons_index
& eq
->entries
)) ? ceqe
: NULL
;
3859 static int hns_roce_v2_ceq_int(struct hns_roce_dev
*hr_dev
,
3860 struct hns_roce_eq
*eq
)
3862 struct device
*dev
= hr_dev
->dev
;
3863 struct hns_roce_ceqe
*ceqe
;
3867 while ((ceqe
= next_ceqe_sw_v2(eq
))) {
3869 /* Make sure we read CEQ entry after we have checked the
3874 cqn
= roce_get_field(ceqe
->comp
,
3875 HNS_ROCE_V2_CEQE_COMP_CQN_M
,
3876 HNS_ROCE_V2_CEQE_COMP_CQN_S
);
3878 hns_roce_cq_completion(hr_dev
, cqn
);
3883 if (eq
->cons_index
> (2 * eq
->entries
- 1)) {
3884 dev_warn(dev
, "cons_index overflow, set back to 0.\n");
3889 set_eq_cons_index_v2(eq
);
3894 static irqreturn_t
hns_roce_v2_msix_interrupt_eq(int irq
, void *eq_ptr
)
3896 struct hns_roce_eq
*eq
= eq_ptr
;
3897 struct hns_roce_dev
*hr_dev
= eq
->hr_dev
;
3900 if (eq
->type_flag
== HNS_ROCE_CEQ
)
3901 /* Completion event interrupt */
3902 int_work
= hns_roce_v2_ceq_int(hr_dev
, eq
);
3904 /* Asychronous event interrupt */
3905 int_work
= hns_roce_v2_aeq_int(hr_dev
, eq
);
3907 return IRQ_RETVAL(int_work
);
3910 static irqreturn_t
hns_roce_v2_msix_interrupt_abn(int irq
, void *dev_id
)
3912 struct hns_roce_dev
*hr_dev
= dev_id
;
3913 struct device
*dev
= hr_dev
->dev
;
3918 /* Abnormal interrupt */
3919 int_st
= roce_read(hr_dev
, ROCEE_VF_ABN_INT_ST_REG
);
3920 int_en
= roce_read(hr_dev
, ROCEE_VF_ABN_INT_EN_REG
);
3922 if (roce_get_bit(int_st
, HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S
)) {
3923 dev_err(dev
, "AEQ overflow!\n");
3925 roce_set_bit(int_st
, HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S
, 1);
3926 roce_write(hr_dev
, ROCEE_VF_ABN_INT_ST_REG
, int_st
);
3928 roce_set_bit(int_en
, HNS_ROCE_V2_VF_ABN_INT_EN_S
, 1);
3929 roce_write(hr_dev
, ROCEE_VF_ABN_INT_EN_REG
, int_en
);
3932 } else if (roce_get_bit(int_st
, HNS_ROCE_V2_VF_INT_ST_BUS_ERR_S
)) {
3933 dev_err(dev
, "BUS ERR!\n");
3935 roce_set_bit(int_st
, HNS_ROCE_V2_VF_INT_ST_BUS_ERR_S
, 1);
3936 roce_write(hr_dev
, ROCEE_VF_ABN_INT_ST_REG
, int_st
);
3938 roce_set_bit(int_en
, HNS_ROCE_V2_VF_ABN_INT_EN_S
, 1);
3939 roce_write(hr_dev
, ROCEE_VF_ABN_INT_EN_REG
, int_en
);
3942 } else if (roce_get_bit(int_st
, HNS_ROCE_V2_VF_INT_ST_OTHER_ERR_S
)) {
3943 dev_err(dev
, "OTHER ERR!\n");
3945 roce_set_bit(int_st
, HNS_ROCE_V2_VF_INT_ST_OTHER_ERR_S
, 1);
3946 roce_write(hr_dev
, ROCEE_VF_ABN_INT_ST_REG
, int_st
);
3948 roce_set_bit(int_en
, HNS_ROCE_V2_VF_ABN_INT_EN_S
, 1);
3949 roce_write(hr_dev
, ROCEE_VF_ABN_INT_EN_REG
, int_en
);
3953 dev_err(dev
, "There is no abnormal irq found!\n");
3955 return IRQ_RETVAL(int_work
);
3958 static void hns_roce_v2_int_mask_enable(struct hns_roce_dev
*hr_dev
,
3959 int eq_num
, int enable_flag
)
3963 if (enable_flag
== EQ_ENABLE
) {
3964 for (i
= 0; i
< eq_num
; i
++)
3965 roce_write(hr_dev
, ROCEE_VF_EVENT_INT_EN_REG
+
3967 HNS_ROCE_V2_VF_EVENT_INT_EN_M
);
3969 roce_write(hr_dev
, ROCEE_VF_ABN_INT_EN_REG
,
3970 HNS_ROCE_V2_VF_ABN_INT_EN_M
);
3971 roce_write(hr_dev
, ROCEE_VF_ABN_INT_CFG_REG
,
3972 HNS_ROCE_V2_VF_ABN_INT_CFG_M
);
3974 for (i
= 0; i
< eq_num
; i
++)
3975 roce_write(hr_dev
, ROCEE_VF_EVENT_INT_EN_REG
+
3977 HNS_ROCE_V2_VF_EVENT_INT_EN_M
& 0x0);
3979 roce_write(hr_dev
, ROCEE_VF_ABN_INT_EN_REG
,
3980 HNS_ROCE_V2_VF_ABN_INT_EN_M
& 0x0);
3981 roce_write(hr_dev
, ROCEE_VF_ABN_INT_CFG_REG
,
3982 HNS_ROCE_V2_VF_ABN_INT_CFG_M
& 0x0);
3986 static void hns_roce_v2_destroy_eqc(struct hns_roce_dev
*hr_dev
, int eqn
)
3988 struct device
*dev
= hr_dev
->dev
;
3991 if (eqn
< hr_dev
->caps
.num_comp_vectors
)
3992 ret
= hns_roce_cmd_mbox(hr_dev
, 0, 0, eqn
& HNS_ROCE_V2_EQN_M
,
3993 0, HNS_ROCE_CMD_DESTROY_CEQC
,
3994 HNS_ROCE_CMD_TIMEOUT_MSECS
);
3996 ret
= hns_roce_cmd_mbox(hr_dev
, 0, 0, eqn
& HNS_ROCE_V2_EQN_M
,
3997 0, HNS_ROCE_CMD_DESTROY_AEQC
,
3998 HNS_ROCE_CMD_TIMEOUT_MSECS
);
4000 dev_err(dev
, "[mailbox cmd] destroy eqc(%d) failed.\n", eqn
);
4003 static void hns_roce_mhop_free_eq(struct hns_roce_dev
*hr_dev
,
4004 struct hns_roce_eq
*eq
)
4006 struct device
*dev
= hr_dev
->dev
;
4017 mhop_num
= hr_dev
->caps
.eqe_hop_num
;
4018 buf_chk_sz
= 1 << (hr_dev
->caps
.eqe_buf_pg_sz
+ PAGE_SHIFT
);
4019 bt_chk_sz
= 1 << (hr_dev
->caps
.eqe_ba_pg_sz
+ PAGE_SHIFT
);
4020 ba_num
= (PAGE_ALIGN(eq
->entries
* eq
->eqe_size
) + buf_chk_sz
- 1) /
4024 if (mhop_num
== HNS_ROCE_HOP_NUM_0
) {
4025 dma_free_coherent(dev
, (unsigned int)(eq
->entries
*
4026 eq
->eqe_size
), eq
->bt_l0
, eq
->l0_dma
);
4030 /* hop_num = 1 or hop = 2 */
4031 dma_free_coherent(dev
, bt_chk_sz
, eq
->bt_l0
, eq
->l0_dma
);
4032 if (mhop_num
== 1) {
4033 for (i
= 0; i
< eq
->l0_last_num
; i
++) {
4034 if (i
== eq
->l0_last_num
- 1) {
4035 eqe_alloc
= i
* (buf_chk_sz
/ eq
->eqe_size
);
4036 size
= (eq
->entries
- eqe_alloc
) * eq
->eqe_size
;
4037 dma_free_coherent(dev
, size
, eq
->buf
[i
],
4041 dma_free_coherent(dev
, buf_chk_sz
, eq
->buf
[i
],
4044 } else if (mhop_num
== 2) {
4045 for (i
= 0; i
< eq
->l0_last_num
; i
++) {
4046 dma_free_coherent(dev
, bt_chk_sz
, eq
->bt_l1
[i
],
4049 for (j
= 0; j
< bt_chk_sz
/ 8; j
++) {
4050 idx
= i
* (bt_chk_sz
/ 8) + j
;
4051 if ((i
== eq
->l0_last_num
- 1)
4052 && j
== eq
->l1_last_num
- 1) {
4053 eqe_alloc
= (buf_chk_sz
/ eq
->eqe_size
)
4055 size
= (eq
->entries
- eqe_alloc
)
4057 dma_free_coherent(dev
, size
,
4062 dma_free_coherent(dev
, buf_chk_sz
, eq
->buf
[idx
],
4077 static void hns_roce_v2_free_eq(struct hns_roce_dev
*hr_dev
,
4078 struct hns_roce_eq
*eq
)
4082 buf_chk_sz
= 1 << (eq
->eqe_buf_pg_sz
+ PAGE_SHIFT
);
4084 if (hr_dev
->caps
.eqe_hop_num
) {
4085 hns_roce_mhop_free_eq(hr_dev
, eq
);
4090 dma_free_coherent(hr_dev
->dev
, buf_chk_sz
,
4091 eq
->buf_list
->buf
, eq
->buf_list
->map
);
4094 static void hns_roce_config_eqc(struct hns_roce_dev
*hr_dev
,
4095 struct hns_roce_eq
*eq
,
4098 struct hns_roce_eq_context
*eqc
;
4101 memset(eqc
, 0, sizeof(struct hns_roce_eq_context
));
4104 eq
->doorbell
= hr_dev
->reg_base
+ ROCEE_VF_EQ_DB_CFG0_REG
;
4105 eq
->hop_num
= hr_dev
->caps
.eqe_hop_num
;
4107 eq
->over_ignore
= HNS_ROCE_V2_EQ_OVER_IGNORE_0
;
4108 eq
->coalesce
= HNS_ROCE_V2_EQ_COALESCE_0
;
4109 eq
->arm_st
= HNS_ROCE_V2_EQ_ALWAYS_ARMED
;
4110 eq
->eqe_ba_pg_sz
= hr_dev
->caps
.eqe_ba_pg_sz
;
4111 eq
->eqe_buf_pg_sz
= hr_dev
->caps
.eqe_buf_pg_sz
;
4112 eq
->shift
= ilog2((unsigned int)eq
->entries
);
4115 eq
->eqe_ba
= eq
->buf_list
->map
;
4117 eq
->eqe_ba
= eq
->l0_dma
;
4120 roce_set_field(eqc
->byte_4
,
4121 HNS_ROCE_EQC_EQ_ST_M
,
4122 HNS_ROCE_EQC_EQ_ST_S
,
4123 HNS_ROCE_V2_EQ_STATE_VALID
);
4125 /* set eqe hop num */
4126 roce_set_field(eqc
->byte_4
,
4127 HNS_ROCE_EQC_HOP_NUM_M
,
4128 HNS_ROCE_EQC_HOP_NUM_S
, eq
->hop_num
);
4130 /* set eqc over_ignore */
4131 roce_set_field(eqc
->byte_4
,
4132 HNS_ROCE_EQC_OVER_IGNORE_M
,
4133 HNS_ROCE_EQC_OVER_IGNORE_S
, eq
->over_ignore
);
4135 /* set eqc coalesce */
4136 roce_set_field(eqc
->byte_4
,
4137 HNS_ROCE_EQC_COALESCE_M
,
4138 HNS_ROCE_EQC_COALESCE_S
, eq
->coalesce
);
4140 /* set eqc arm_state */
4141 roce_set_field(eqc
->byte_4
,
4142 HNS_ROCE_EQC_ARM_ST_M
,
4143 HNS_ROCE_EQC_ARM_ST_S
, eq
->arm_st
);
4146 roce_set_field(eqc
->byte_4
,
4148 HNS_ROCE_EQC_EQN_S
, eq
->eqn
);
4151 roce_set_field(eqc
->byte_4
,
4152 HNS_ROCE_EQC_EQE_CNT_M
,
4153 HNS_ROCE_EQC_EQE_CNT_S
,
4154 HNS_ROCE_EQ_INIT_EQE_CNT
);
4156 /* set eqe_ba_pg_sz */
4157 roce_set_field(eqc
->byte_8
,
4158 HNS_ROCE_EQC_BA_PG_SZ_M
,
4159 HNS_ROCE_EQC_BA_PG_SZ_S
, eq
->eqe_ba_pg_sz
);
4161 /* set eqe_buf_pg_sz */
4162 roce_set_field(eqc
->byte_8
,
4163 HNS_ROCE_EQC_BUF_PG_SZ_M
,
4164 HNS_ROCE_EQC_BUF_PG_SZ_S
, eq
->eqe_buf_pg_sz
);
4166 /* set eq_producer_idx */
4167 roce_set_field(eqc
->byte_8
,
4168 HNS_ROCE_EQC_PROD_INDX_M
,
4169 HNS_ROCE_EQC_PROD_INDX_S
,
4170 HNS_ROCE_EQ_INIT_PROD_IDX
);
4172 /* set eq_max_cnt */
4173 roce_set_field(eqc
->byte_12
,
4174 HNS_ROCE_EQC_MAX_CNT_M
,
4175 HNS_ROCE_EQC_MAX_CNT_S
, eq
->eq_max_cnt
);
4178 roce_set_field(eqc
->byte_12
,
4179 HNS_ROCE_EQC_PERIOD_M
,
4180 HNS_ROCE_EQC_PERIOD_S
, eq
->eq_period
);
4182 /* set eqe_report_timer */
4183 roce_set_field(eqc
->eqe_report_timer
,
4184 HNS_ROCE_EQC_REPORT_TIMER_M
,
4185 HNS_ROCE_EQC_REPORT_TIMER_S
,
4186 HNS_ROCE_EQ_INIT_REPORT_TIMER
);
4188 /* set eqe_ba [34:3] */
4189 roce_set_field(eqc
->eqe_ba0
,
4190 HNS_ROCE_EQC_EQE_BA_L_M
,
4191 HNS_ROCE_EQC_EQE_BA_L_S
, eq
->eqe_ba
>> 3);
4193 /* set eqe_ba [64:35] */
4194 roce_set_field(eqc
->eqe_ba1
,
4195 HNS_ROCE_EQC_EQE_BA_H_M
,
4196 HNS_ROCE_EQC_EQE_BA_H_S
, eq
->eqe_ba
>> 35);
4199 roce_set_field(eqc
->byte_28
,
4200 HNS_ROCE_EQC_SHIFT_M
,
4201 HNS_ROCE_EQC_SHIFT_S
, eq
->shift
);
4203 /* set eq MSI_IDX */
4204 roce_set_field(eqc
->byte_28
,
4205 HNS_ROCE_EQC_MSI_INDX_M
,
4206 HNS_ROCE_EQC_MSI_INDX_S
,
4207 HNS_ROCE_EQ_INIT_MSI_IDX
);
4209 /* set cur_eqe_ba [27:12] */
4210 roce_set_field(eqc
->byte_28
,
4211 HNS_ROCE_EQC_CUR_EQE_BA_L_M
,
4212 HNS_ROCE_EQC_CUR_EQE_BA_L_S
, eq
->cur_eqe_ba
>> 12);
4214 /* set cur_eqe_ba [59:28] */
4215 roce_set_field(eqc
->byte_32
,
4216 HNS_ROCE_EQC_CUR_EQE_BA_M_M
,
4217 HNS_ROCE_EQC_CUR_EQE_BA_M_S
, eq
->cur_eqe_ba
>> 28);
4219 /* set cur_eqe_ba [63:60] */
4220 roce_set_field(eqc
->byte_36
,
4221 HNS_ROCE_EQC_CUR_EQE_BA_H_M
,
4222 HNS_ROCE_EQC_CUR_EQE_BA_H_S
, eq
->cur_eqe_ba
>> 60);
4224 /* set eq consumer idx */
4225 roce_set_field(eqc
->byte_36
,
4226 HNS_ROCE_EQC_CONS_INDX_M
,
4227 HNS_ROCE_EQC_CONS_INDX_S
,
4228 HNS_ROCE_EQ_INIT_CONS_IDX
);
4230 /* set nex_eqe_ba[43:12] */
4231 roce_set_field(eqc
->nxt_eqe_ba0
,
4232 HNS_ROCE_EQC_NXT_EQE_BA_L_M
,
4233 HNS_ROCE_EQC_NXT_EQE_BA_L_S
, eq
->nxt_eqe_ba
>> 12);
4235 /* set nex_eqe_ba[63:44] */
4236 roce_set_field(eqc
->nxt_eqe_ba1
,
4237 HNS_ROCE_EQC_NXT_EQE_BA_H_M
,
4238 HNS_ROCE_EQC_NXT_EQE_BA_H_S
, eq
->nxt_eqe_ba
>> 44);
4241 static int hns_roce_mhop_alloc_eq(struct hns_roce_dev
*hr_dev
,
4242 struct hns_roce_eq
*eq
)
4244 struct device
*dev
= hr_dev
->dev
;
4245 int eq_alloc_done
= 0;
4260 mhop_num
= hr_dev
->caps
.eqe_hop_num
;
4261 buf_chk_sz
= 1 << (hr_dev
->caps
.eqe_buf_pg_sz
+ PAGE_SHIFT
);
4262 bt_chk_sz
= 1 << (hr_dev
->caps
.eqe_ba_pg_sz
+ PAGE_SHIFT
);
4264 ba_num
= (PAGE_ALIGN(eq
->entries
* eq
->eqe_size
) + buf_chk_sz
- 1)
4266 bt_num
= (ba_num
+ bt_chk_sz
/ 8 - 1) / (bt_chk_sz
/ 8);
4269 if (mhop_num
== HNS_ROCE_HOP_NUM_0
) {
4270 if (eq
->entries
> buf_chk_sz
/ eq
->eqe_size
) {
4271 dev_err(dev
, "eq entries %d is larger than buf_pg_sz!",
4275 eq
->bt_l0
= dma_alloc_coherent(dev
, eq
->entries
* eq
->eqe_size
,
4276 &(eq
->l0_dma
), GFP_KERNEL
);
4280 eq
->cur_eqe_ba
= eq
->l0_dma
;
4283 memset(eq
->bt_l0
, 0, eq
->entries
* eq
->eqe_size
);
4288 eq
->buf_dma
= kcalloc(ba_num
, sizeof(*eq
->buf_dma
), GFP_KERNEL
);
4291 eq
->buf
= kcalloc(ba_num
, sizeof(*eq
->buf
), GFP_KERNEL
);
4293 goto err_kcalloc_buf
;
4295 if (mhop_num
== 2) {
4296 eq
->l1_dma
= kcalloc(bt_num
, sizeof(*eq
->l1_dma
), GFP_KERNEL
);
4298 goto err_kcalloc_l1_dma
;
4300 eq
->bt_l1
= kcalloc(bt_num
, sizeof(*eq
->bt_l1
), GFP_KERNEL
);
4302 goto err_kcalloc_bt_l1
;
4306 eq
->bt_l0
= dma_alloc_coherent(dev
, bt_chk_sz
, &eq
->l0_dma
, GFP_KERNEL
);
4308 goto err_dma_alloc_l0
;
4310 if (mhop_num
== 1) {
4311 if (ba_num
> (bt_chk_sz
/ 8))
4312 dev_err(dev
, "ba_num %d is too large for 1 hop\n",
4316 for (i
= 0; i
< bt_chk_sz
/ 8; i
++) {
4317 if (eq_buf_cnt
+ 1 < ba_num
) {
4320 eqe_alloc
= i
* (buf_chk_sz
/ eq
->eqe_size
);
4321 size
= (eq
->entries
- eqe_alloc
) * eq
->eqe_size
;
4323 eq
->buf
[i
] = dma_alloc_coherent(dev
, size
,
4327 goto err_dma_alloc_buf
;
4329 memset(eq
->buf
[i
], 0, size
);
4330 *(eq
->bt_l0
+ i
) = eq
->buf_dma
[i
];
4333 if (eq_buf_cnt
>= ba_num
)
4336 eq
->cur_eqe_ba
= eq
->buf_dma
[0];
4337 eq
->nxt_eqe_ba
= eq
->buf_dma
[1];
4339 } else if (mhop_num
== 2) {
4340 /* alloc L1 BT and buf */
4341 for (i
= 0; i
< bt_chk_sz
/ 8; i
++) {
4342 eq
->bt_l1
[i
] = dma_alloc_coherent(dev
, bt_chk_sz
,
4346 goto err_dma_alloc_l1
;
4347 *(eq
->bt_l0
+ i
) = eq
->l1_dma
[i
];
4349 for (j
= 0; j
< bt_chk_sz
/ 8; j
++) {
4350 idx
= i
* bt_chk_sz
/ 8 + j
;
4351 if (eq_buf_cnt
+ 1 < ba_num
) {
4354 eqe_alloc
= (buf_chk_sz
/ eq
->eqe_size
)
4356 size
= (eq
->entries
- eqe_alloc
)
4359 eq
->buf
[idx
] = dma_alloc_coherent(dev
, size
,
4360 &(eq
->buf_dma
[idx
]),
4363 goto err_dma_alloc_buf
;
4365 memset(eq
->buf
[idx
], 0, size
);
4366 *(eq
->bt_l1
[i
] + j
) = eq
->buf_dma
[idx
];
4369 if (eq_buf_cnt
>= ba_num
) {
4378 eq
->cur_eqe_ba
= eq
->buf_dma
[0];
4379 eq
->nxt_eqe_ba
= eq
->buf_dma
[1];
4382 eq
->l0_last_num
= i
+ 1;
4384 eq
->l1_last_num
= j
+ 1;
4389 dma_free_coherent(dev
, bt_chk_sz
, eq
->bt_l0
, eq
->l0_dma
);
4392 for (i
-= 1; i
>= 0; i
--) {
4393 dma_free_coherent(dev
, bt_chk_sz
, eq
->bt_l1
[i
],
4396 for (j
= 0; j
< bt_chk_sz
/ 8; j
++) {
4397 idx
= i
* bt_chk_sz
/ 8 + j
;
4398 dma_free_coherent(dev
, buf_chk_sz
, eq
->buf
[idx
],
4402 goto err_dma_alloc_l0
;
4405 dma_free_coherent(dev
, bt_chk_sz
, eq
->bt_l0
, eq
->l0_dma
);
4410 for (i
-= 1; i
>= 0; i
--)
4411 dma_free_coherent(dev
, buf_chk_sz
, eq
->buf
[i
],
4413 else if (mhop_num
== 2) {
4416 for (; i
>= 0; i
--) {
4417 dma_free_coherent(dev
, bt_chk_sz
, eq
->bt_l1
[i
],
4420 for (j
= 0; j
< bt_chk_sz
/ 8; j
++) {
4421 if (i
== record_i
&& j
>= record_j
)
4424 idx
= i
* bt_chk_sz
/ 8 + j
;
4425 dma_free_coherent(dev
, buf_chk_sz
,
4451 static int hns_roce_v2_create_eq(struct hns_roce_dev
*hr_dev
,
4452 struct hns_roce_eq
*eq
,
4453 unsigned int eq_cmd
)
4455 struct device
*dev
= hr_dev
->dev
;
4456 struct hns_roce_cmd_mailbox
*mailbox
;
4460 /* Allocate mailbox memory */
4461 mailbox
= hns_roce_alloc_cmd_mailbox(hr_dev
);
4462 if (IS_ERR(mailbox
))
4463 return PTR_ERR(mailbox
);
4465 if (!hr_dev
->caps
.eqe_hop_num
) {
4466 buf_chk_sz
= 1 << (hr_dev
->caps
.eqe_buf_pg_sz
+ PAGE_SHIFT
);
4468 eq
->buf_list
= kzalloc(sizeof(struct hns_roce_buf_list
),
4470 if (!eq
->buf_list
) {
4475 eq
->buf_list
->buf
= dma_alloc_coherent(dev
, buf_chk_sz
,
4476 &(eq
->buf_list
->map
),
4478 if (!eq
->buf_list
->buf
) {
4483 memset(eq
->buf_list
->buf
, 0, buf_chk_sz
);
4485 ret
= hns_roce_mhop_alloc_eq(hr_dev
, eq
);
4492 hns_roce_config_eqc(hr_dev
, eq
, mailbox
->buf
);
4494 ret
= hns_roce_cmd_mbox(hr_dev
, mailbox
->dma
, 0, eq
->eqn
, 0,
4495 eq_cmd
, HNS_ROCE_CMD_TIMEOUT_MSECS
);
4497 dev_err(dev
, "[mailbox cmd] create eqc failed.\n");
4501 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
4506 if (!hr_dev
->caps
.eqe_hop_num
)
4507 dma_free_coherent(dev
, buf_chk_sz
, eq
->buf_list
->buf
,
4510 hns_roce_mhop_free_eq(hr_dev
, eq
);
4515 kfree(eq
->buf_list
);
4518 hns_roce_free_cmd_mailbox(hr_dev
, mailbox
);
4523 static int hns_roce_v2_init_eq_table(struct hns_roce_dev
*hr_dev
)
4525 struct hns_roce_eq_table
*eq_table
= &hr_dev
->eq_table
;
4526 struct device
*dev
= hr_dev
->dev
;
4527 struct hns_roce_eq
*eq
;
4528 unsigned int eq_cmd
;
4537 other_num
= hr_dev
->caps
.num_other_vectors
;
4538 comp_num
= hr_dev
->caps
.num_comp_vectors
;
4539 aeq_num
= hr_dev
->caps
.num_aeq_vectors
;
4541 eq_num
= comp_num
+ aeq_num
;
4542 irq_num
= eq_num
+ other_num
;
4544 eq_table
->eq
= kcalloc(eq_num
, sizeof(*eq_table
->eq
), GFP_KERNEL
);
4548 for (i
= 0; i
< irq_num
; i
++) {
4549 hr_dev
->irq_names
[i
] = kzalloc(HNS_ROCE_INT_NAME_LEN
,
4551 if (!hr_dev
->irq_names
[i
]) {
4553 goto err_failed_kzalloc
;
4558 for (j
= 0; j
< eq_num
; j
++) {
4559 eq
= &eq_table
->eq
[j
];
4560 eq
->hr_dev
= hr_dev
;
4564 eq_cmd
= HNS_ROCE_CMD_CREATE_CEQC
;
4565 eq
->type_flag
= HNS_ROCE_CEQ
;
4566 eq
->entries
= hr_dev
->caps
.ceqe_depth
;
4567 eq
->eqe_size
= HNS_ROCE_CEQ_ENTRY_SIZE
;
4568 eq
->irq
= hr_dev
->irq
[j
+ other_num
+ aeq_num
];
4569 eq
->eq_max_cnt
= HNS_ROCE_CEQ_DEFAULT_BURST_NUM
;
4570 eq
->eq_period
= HNS_ROCE_CEQ_DEFAULT_INTERVAL
;
4573 eq_cmd
= HNS_ROCE_CMD_CREATE_AEQC
;
4574 eq
->type_flag
= HNS_ROCE_AEQ
;
4575 eq
->entries
= hr_dev
->caps
.aeqe_depth
;
4576 eq
->eqe_size
= HNS_ROCE_AEQ_ENTRY_SIZE
;
4577 eq
->irq
= hr_dev
->irq
[j
- comp_num
+ other_num
];
4578 eq
->eq_max_cnt
= HNS_ROCE_AEQ_DEFAULT_BURST_NUM
;
4579 eq
->eq_period
= HNS_ROCE_AEQ_DEFAULT_INTERVAL
;
4582 ret
= hns_roce_v2_create_eq(hr_dev
, eq
, eq_cmd
);
4584 dev_err(dev
, "eq create failed.\n");
4585 goto err_create_eq_fail
;
4590 hns_roce_v2_int_mask_enable(hr_dev
, eq_num
, EQ_ENABLE
);
4592 /* irq contains: abnormal + AEQ + CEQ*/
4593 for (k
= 0; k
< irq_num
; k
++)
4595 snprintf((char *)hr_dev
->irq_names
[k
],
4596 HNS_ROCE_INT_NAME_LEN
, "hns-abn-%d", k
);
4597 else if (k
< (other_num
+ aeq_num
))
4598 snprintf((char *)hr_dev
->irq_names
[k
],
4599 HNS_ROCE_INT_NAME_LEN
, "hns-aeq-%d",
4602 snprintf((char *)hr_dev
->irq_names
[k
],
4603 HNS_ROCE_INT_NAME_LEN
, "hns-ceq-%d",
4604 k
- other_num
- aeq_num
);
4606 for (k
= 0; k
< irq_num
; k
++) {
4608 ret
= request_irq(hr_dev
->irq
[k
],
4609 hns_roce_v2_msix_interrupt_abn
,
4610 0, hr_dev
->irq_names
[k
], hr_dev
);
4612 else if (k
< (other_num
+ comp_num
))
4613 ret
= request_irq(eq_table
->eq
[k
- other_num
].irq
,
4614 hns_roce_v2_msix_interrupt_eq
,
4615 0, hr_dev
->irq_names
[k
+ aeq_num
],
4616 &eq_table
->eq
[k
- other_num
]);
4618 ret
= request_irq(eq_table
->eq
[k
- other_num
].irq
,
4619 hns_roce_v2_msix_interrupt_eq
,
4620 0, hr_dev
->irq_names
[k
- comp_num
],
4621 &eq_table
->eq
[k
- other_num
]);
4623 dev_err(dev
, "Request irq error!\n");
4624 goto err_request_irq_fail
;
4630 err_request_irq_fail
:
4631 for (k
-= 1; k
>= 0; k
--)
4633 free_irq(hr_dev
->irq
[k
], hr_dev
);
4635 free_irq(eq_table
->eq
[k
- other_num
].irq
,
4636 &eq_table
->eq
[k
- other_num
]);
4639 for (j
-= 1; j
>= 0; j
--)
4640 hns_roce_v2_free_eq(hr_dev
, &eq_table
->eq
[j
]);
4643 for (i
-= 1; i
>= 0; i
--)
4644 kfree(hr_dev
->irq_names
[i
]);
4645 kfree(eq_table
->eq
);
4650 static void hns_roce_v2_cleanup_eq_table(struct hns_roce_dev
*hr_dev
)
4652 struct hns_roce_eq_table
*eq_table
= &hr_dev
->eq_table
;
4657 eq_num
= hr_dev
->caps
.num_comp_vectors
+ hr_dev
->caps
.num_aeq_vectors
;
4658 irq_num
= eq_num
+ hr_dev
->caps
.num_other_vectors
;
4661 hns_roce_v2_int_mask_enable(hr_dev
, eq_num
, EQ_DISABLE
);
4663 for (i
= 0; i
< hr_dev
->caps
.num_other_vectors
; i
++)
4664 free_irq(hr_dev
->irq
[i
], hr_dev
);
4666 for (i
= 0; i
< eq_num
; i
++) {
4667 hns_roce_v2_destroy_eqc(hr_dev
, i
);
4669 free_irq(eq_table
->eq
[i
].irq
, &eq_table
->eq
[i
]);
4671 hns_roce_v2_free_eq(hr_dev
, &eq_table
->eq
[i
]);
4674 for (i
= 0; i
< irq_num
; i
++)
4675 kfree(hr_dev
->irq_names
[i
]);
4677 kfree(eq_table
->eq
);
4680 static const struct hns_roce_hw hns_roce_hw_v2
= {
4681 .cmq_init
= hns_roce_v2_cmq_init
,
4682 .cmq_exit
= hns_roce_v2_cmq_exit
,
4683 .hw_profile
= hns_roce_v2_profile
,
4684 .post_mbox
= hns_roce_v2_post_mbox
,
4685 .chk_mbox
= hns_roce_v2_chk_mbox
,
4686 .set_gid
= hns_roce_v2_set_gid
,
4687 .set_mac
= hns_roce_v2_set_mac
,
4688 .write_mtpt
= hns_roce_v2_write_mtpt
,
4689 .rereg_write_mtpt
= hns_roce_v2_rereg_write_mtpt
,
4690 .write_cqc
= hns_roce_v2_write_cqc
,
4691 .set_hem
= hns_roce_v2_set_hem
,
4692 .clear_hem
= hns_roce_v2_clear_hem
,
4693 .modify_qp
= hns_roce_v2_modify_qp
,
4694 .query_qp
= hns_roce_v2_query_qp
,
4695 .destroy_qp
= hns_roce_v2_destroy_qp
,
4696 .modify_cq
= hns_roce_v2_modify_cq
,
4697 .post_send
= hns_roce_v2_post_send
,
4698 .post_recv
= hns_roce_v2_post_recv
,
4699 .req_notify_cq
= hns_roce_v2_req_notify_cq
,
4700 .poll_cq
= hns_roce_v2_poll_cq
,
4701 .init_eq
= hns_roce_v2_init_eq_table
,
4702 .cleanup_eq
= hns_roce_v2_cleanup_eq_table
,
4705 static const struct pci_device_id hns_roce_hw_v2_pci_tbl
[] = {
4706 {PCI_VDEVICE(HUAWEI
, HNAE3_DEV_ID_25GE_RDMA
), 0},
4707 {PCI_VDEVICE(HUAWEI
, HNAE3_DEV_ID_25GE_RDMA_MACSEC
), 0},
4708 {PCI_VDEVICE(HUAWEI
, HNAE3_DEV_ID_100G_RDMA_MACSEC
), 0},
4709 /* required last entry */
4713 MODULE_DEVICE_TABLE(pci
, hns_roce_hw_v2_pci_tbl
);
4715 static int hns_roce_hw_v2_get_cfg(struct hns_roce_dev
*hr_dev
,
4716 struct hnae3_handle
*handle
)
4718 const struct pci_device_id
*id
;
4721 id
= pci_match_id(hns_roce_hw_v2_pci_tbl
, hr_dev
->pci_dev
);
4723 dev_err(hr_dev
->dev
, "device is not compatible!\n");
4727 hr_dev
->hw
= &hns_roce_hw_v2
;
4728 hr_dev
->sdb_offset
= ROCEE_DB_SQ_L_0_REG
;
4729 hr_dev
->odb_offset
= hr_dev
->sdb_offset
;
4731 /* Get info from NIC driver. */
4732 hr_dev
->reg_base
= handle
->rinfo
.roce_io_base
;
4733 hr_dev
->caps
.num_ports
= 1;
4734 hr_dev
->iboe
.netdevs
[0] = handle
->rinfo
.netdev
;
4735 hr_dev
->iboe
.phy_port
[0] = 0;
4737 addrconf_addr_eui48((u8
*)&hr_dev
->ib_dev
.node_guid
,
4738 hr_dev
->iboe
.netdevs
[0]->dev_addr
);
4740 for (i
= 0; i
< HNS_ROCE_V2_MAX_IRQ_NUM
; i
++)
4741 hr_dev
->irq
[i
] = pci_irq_vector(handle
->pdev
,
4742 i
+ handle
->rinfo
.base_vector
);
4744 /* cmd issue mode: 0 is poll, 1 is event */
4745 hr_dev
->cmd_mod
= 1;
4746 hr_dev
->loop_idc
= 0;
4751 static int hns_roce_hw_v2_init_instance(struct hnae3_handle
*handle
)
4753 struct hns_roce_dev
*hr_dev
;
4756 hr_dev
= (struct hns_roce_dev
*)ib_alloc_device(sizeof(*hr_dev
));
4760 hr_dev
->priv
= kzalloc(sizeof(struct hns_roce_v2_priv
), GFP_KERNEL
);
4761 if (!hr_dev
->priv
) {
4763 goto error_failed_kzalloc
;
4766 hr_dev
->pci_dev
= handle
->pdev
;
4767 hr_dev
->dev
= &handle
->pdev
->dev
;
4768 handle
->priv
= hr_dev
;
4770 ret
= hns_roce_hw_v2_get_cfg(hr_dev
, handle
);
4772 dev_err(hr_dev
->dev
, "Get Configuration failed!\n");
4773 goto error_failed_get_cfg
;
4776 ret
= hns_roce_init(hr_dev
);
4778 dev_err(hr_dev
->dev
, "RoCE Engine init failed!\n");
4779 goto error_failed_get_cfg
;
4784 error_failed_get_cfg
:
4785 kfree(hr_dev
->priv
);
4787 error_failed_kzalloc
:
4788 ib_dealloc_device(&hr_dev
->ib_dev
);
4793 static void hns_roce_hw_v2_uninit_instance(struct hnae3_handle
*handle
,
4796 struct hns_roce_dev
*hr_dev
= (struct hns_roce_dev
*)handle
->priv
;
4798 hns_roce_exit(hr_dev
);
4799 kfree(hr_dev
->priv
);
4800 ib_dealloc_device(&hr_dev
->ib_dev
);
4803 static const struct hnae3_client_ops hns_roce_hw_v2_ops
= {
4804 .init_instance
= hns_roce_hw_v2_init_instance
,
4805 .uninit_instance
= hns_roce_hw_v2_uninit_instance
,
4808 static struct hnae3_client hns_roce_hw_v2_client
= {
4809 .name
= "hns_roce_hw_v2",
4810 .type
= HNAE3_CLIENT_ROCE
,
4811 .ops
= &hns_roce_hw_v2_ops
,
4814 static int __init
hns_roce_hw_v2_init(void)
4816 return hnae3_register_client(&hns_roce_hw_v2_client
);
4819 static void __exit
hns_roce_hw_v2_exit(void)
4821 hnae3_unregister_client(&hns_roce_hw_v2_client
);
4824 module_init(hns_roce_hw_v2_init
);
4825 module_exit(hns_roce_hw_v2_exit
);
4827 MODULE_LICENSE("Dual BSD/GPL");
4828 MODULE_AUTHOR("Wei Hu <xavier.huwei@huawei.com>");
4829 MODULE_AUTHOR("Lijun Ou <oulijun@huawei.com>");
4830 MODULE_AUTHOR("Shaobo Xu <xushaobo2@huawei.com>");
4831 MODULE_DESCRIPTION("Hisilicon Hip08 Family RoCE Driver");