xref: /freebsd/sys/dev/bnxt/bnxt_re/ib_verbs.c (revision 84d7ec4c657f406c6cbd29baf32c8e057b663d17)
1 /*
2  * Copyright (c) 2015-2024, Broadcom. All rights reserved.  The term
3  * Broadcom refers to Broadcom Limited and/or its subsidiaries.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in
13  *    the documentation and/or other materials provided with the
14  *    distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * Description: IB Verbs interpreter
29  */
30 
31 #include <linux/if_ether.h>
32 #include <linux/etherdevice.h>
33 #include <rdma/uverbs_ioctl.h>
34 
35 #include "bnxt_re.h"
36 #include "ib_verbs.h"
37 
38 static inline
get_ib_umem_sgl(struct ib_umem * umem,u32 * nmap)39 struct scatterlist *get_ib_umem_sgl(struct ib_umem *umem, u32 *nmap)
40 {
41 
42 	*nmap = umem->nmap;
43 	return umem->sg_head.sgl;
44 }
45 
bnxt_re_peer_mem_release(struct ib_umem * umem)46 static inline void bnxt_re_peer_mem_release(struct ib_umem *umem)
47 {
48 	dev_dbg(NULL, "ib_umem_release getting invoked \n");
49 	ib_umem_release(umem);
50 }
51 
bnxt_re_resolve_dmac_task(struct work_struct * work)52 void bnxt_re_resolve_dmac_task(struct work_struct *work)
53 {
54 	int rc = -1;
55 	struct bnxt_re_dev *rdev;
56 	struct ib_ah_attr	*ah_attr;
57 	struct bnxt_re_resolve_dmac_work *dmac_work =
58 			container_of(work, struct bnxt_re_resolve_dmac_work, work);
59 
60 	rdev = dmac_work->rdev;
61 	ah_attr = dmac_work->ah_attr;
62 	rc = ib_resolve_eth_dmac(&rdev->ibdev, ah_attr);
63 	if (rc)
64 		dev_err(rdev_to_dev(dmac_work->rdev),
65 			"Failed to resolve dest mac rc = %d\n", rc);
66 	atomic_set(&dmac_work->status_wait, rc << 8);
67 }
68 
__from_ib_access_flags(int iflags)69 static int __from_ib_access_flags(int iflags)
70 {
71 	int qflags = 0;
72 
73 	if (iflags & IB_ACCESS_LOCAL_WRITE)
74 		qflags |= BNXT_QPLIB_ACCESS_LOCAL_WRITE;
75 	if (iflags & IB_ACCESS_REMOTE_READ)
76 		qflags |= BNXT_QPLIB_ACCESS_REMOTE_READ;
77 	if (iflags & IB_ACCESS_REMOTE_WRITE)
78 		qflags |= BNXT_QPLIB_ACCESS_REMOTE_WRITE;
79 	if (iflags & IB_ACCESS_REMOTE_ATOMIC)
80 		qflags |= BNXT_QPLIB_ACCESS_REMOTE_ATOMIC;
81 	if (iflags & IB_ACCESS_MW_BIND)
82 		qflags |= BNXT_QPLIB_ACCESS_MW_BIND;
83 	if (iflags & IB_ZERO_BASED)
84 		qflags |= BNXT_QPLIB_ACCESS_ZERO_BASED;
85 	if (iflags & IB_ACCESS_ON_DEMAND)
86 		qflags |= BNXT_QPLIB_ACCESS_ON_DEMAND;
87 	return qflags;
88 };
89 
__to_ib_access_flags(int qflags)90 static enum ib_access_flags __to_ib_access_flags(int qflags)
91 {
92 	enum ib_access_flags iflags = 0;
93 
94 	if (qflags & BNXT_QPLIB_ACCESS_LOCAL_WRITE)
95 		iflags |= IB_ACCESS_LOCAL_WRITE;
96 	if (qflags & BNXT_QPLIB_ACCESS_REMOTE_WRITE)
97 		iflags |= IB_ACCESS_REMOTE_WRITE;
98 	if (qflags & BNXT_QPLIB_ACCESS_REMOTE_READ)
99 		iflags |= IB_ACCESS_REMOTE_READ;
100 	if (qflags & BNXT_QPLIB_ACCESS_REMOTE_ATOMIC)
101 		iflags |= IB_ACCESS_REMOTE_ATOMIC;
102 	if (qflags & BNXT_QPLIB_ACCESS_MW_BIND)
103 		iflags |= IB_ACCESS_MW_BIND;
104 	if (qflags & BNXT_QPLIB_ACCESS_ZERO_BASED)
105 		iflags |= IB_ZERO_BASED;
106 	if (qflags & BNXT_QPLIB_ACCESS_ON_DEMAND)
107 		iflags |= IB_ACCESS_ON_DEMAND;
108 	return iflags;
109 };
110 
bnxt_re_copy_to_udata(struct bnxt_re_dev * rdev,void * data,int len,struct ib_udata * udata)111 static int bnxt_re_copy_to_udata(struct bnxt_re_dev *rdev, void *data,
112 				 int len, struct ib_udata *udata)
113 {
114 	int rc;
115 
116 	rc = ib_copy_to_udata(udata, data, len);
117 	if (rc)
118 		dev_err(rdev_to_dev(rdev),
119 			"ucontext copy failed from %ps rc %d\n",
120 			__builtin_return_address(0), rc);
121 
122 	return rc;
123 }
124 
bnxt_re_get_netdev(struct ib_device * ibdev,u8 port_num)125 struct ifnet *bnxt_re_get_netdev(struct ib_device *ibdev,
126 				 u8 port_num)
127 {
128 	struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
129 	struct ifnet *netdev = NULL;
130 
131 	rcu_read_lock();
132 
133 	if (!rdev || !rdev->netdev)
134 		goto end;
135 
136 	netdev = rdev->netdev;
137 
138 	/* In case of active-backup bond mode, return active slave */
139 	if (netdev)
140 		dev_hold(netdev);
141 
142 end:
143 	rcu_read_unlock();
144 	return netdev;
145 }
146 
bnxt_re_query_device(struct ib_device * ibdev,struct ib_device_attr * ib_attr,struct ib_udata * udata)147 int bnxt_re_query_device(struct ib_device *ibdev,
148 			 struct ib_device_attr *ib_attr,
149 			 struct ib_udata *udata)
150 {
151 	struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
152 	struct bnxt_qplib_dev_attr *dev_attr = rdev->dev_attr;
153 
154 	memset(ib_attr, 0, sizeof(*ib_attr));
155 
156 	memcpy(&ib_attr->fw_ver, dev_attr->fw_ver, 4);
157 	bnxt_qplib_get_guid(rdev->dev_addr, (u8 *)&ib_attr->sys_image_guid);
158 	ib_attr->max_mr_size = BNXT_RE_MAX_MR_SIZE;
159 	ib_attr->page_size_cap = dev_attr->page_size_cap;
160 	ib_attr->vendor_id = rdev->en_dev->pdev->vendor;
161 	ib_attr->vendor_part_id = rdev->en_dev->pdev->device;
162 	ib_attr->hw_ver = rdev->en_dev->pdev->subsystem_device;
163 	ib_attr->max_qp = dev_attr->max_qp;
164 	ib_attr->max_qp_wr = dev_attr->max_qp_wqes;
165 	/*
166 	 * Read and set from the module param 'min_tx_depth'
167 	 * only once after the driver load
168 	 */
169 	if (rdev->min_tx_depth == 1 &&
170 	    min_tx_depth < dev_attr->max_qp_wqes)
171 		rdev->min_tx_depth = min_tx_depth;
172 	ib_attr->device_cap_flags =
173 				    IB_DEVICE_CURR_QP_STATE_MOD
174 				    | IB_DEVICE_RC_RNR_NAK_GEN
175 				    | IB_DEVICE_SHUTDOWN_PORT
176 				    | IB_DEVICE_SYS_IMAGE_GUID
177 				    | IB_DEVICE_LOCAL_DMA_LKEY
178 				    | IB_DEVICE_RESIZE_MAX_WR
179 				    | IB_DEVICE_PORT_ACTIVE_EVENT
180 				    | IB_DEVICE_N_NOTIFY_CQ
181 				    | IB_DEVICE_MEM_WINDOW
182 				    | IB_DEVICE_MEM_WINDOW_TYPE_2B
183 				    | IB_DEVICE_MEM_MGT_EXTENSIONS;
184 	ib_attr->max_send_sge = dev_attr->max_qp_sges;
185 	ib_attr->max_recv_sge = dev_attr->max_qp_sges;
186 	ib_attr->max_sge_rd = dev_attr->max_qp_sges;
187 	ib_attr->max_cq = dev_attr->max_cq;
188 	ib_attr->max_cqe = dev_attr->max_cq_wqes;
189 	ib_attr->max_mr = dev_attr->max_mr;
190 	ib_attr->max_pd = dev_attr->max_pd;
191 	ib_attr->max_qp_rd_atom = dev_attr->max_qp_rd_atom;
192 	ib_attr->max_qp_init_rd_atom = dev_attr->max_qp_init_rd_atom;
193 	if (dev_attr->is_atomic) {
194 		ib_attr->atomic_cap = IB_ATOMIC_GLOB;
195 		ib_attr->masked_atomic_cap = IB_ATOMIC_GLOB;
196 	}
197 	ib_attr->max_ee_rd_atom = 0;
198 	ib_attr->max_res_rd_atom = 0;
199 	ib_attr->max_ee_init_rd_atom = 0;
200 	ib_attr->max_ee = 0;
201 	ib_attr->max_rdd = 0;
202 	ib_attr->max_mw = dev_attr->max_mw;
203 	ib_attr->max_raw_ipv6_qp = 0;
204 	ib_attr->max_raw_ethy_qp = dev_attr->max_raw_ethy_qp;
205 	ib_attr->max_mcast_grp = 0;
206 	ib_attr->max_mcast_qp_attach = 0;
207 	ib_attr->max_total_mcast_qp_attach = 0;
208 	ib_attr->max_ah = dev_attr->max_ah;
209 	ib_attr->max_srq = dev_attr->max_srq;
210 	ib_attr->max_srq_wr = dev_attr->max_srq_wqes;
211 	ib_attr->max_srq_sge = dev_attr->max_srq_sges;
212 
213 	ib_attr->max_fast_reg_page_list_len = MAX_PBL_LVL_1_PGS;
214 	ib_attr->max_pkeys = 1;
215 	ib_attr->local_ca_ack_delay = BNXT_RE_DEFAULT_ACK_DELAY;
216 	ib_attr->sig_prot_cap = 0;
217 	ib_attr->sig_guard_cap = 0;
218 	ib_attr->odp_caps.general_caps = 0;
219 
220 	return 0;
221 }
222 
bnxt_re_modify_device(struct ib_device * ibdev,int device_modify_mask,struct ib_device_modify * device_modify)223 int bnxt_re_modify_device(struct ib_device *ibdev,
224 			  int device_modify_mask,
225 			  struct ib_device_modify *device_modify)
226 {
227 	dev_dbg(rdev_to_dev(rdev), "Modify device with mask 0x%x\n",
228 		device_modify_mask);
229 
230 	switch (device_modify_mask) {
231 	case IB_DEVICE_MODIFY_SYS_IMAGE_GUID:
232 		/* Modify the GUID requires the modification of the GID table */
233 		/* GUID should be made as READ-ONLY */
234 		break;
235 	case IB_DEVICE_MODIFY_NODE_DESC:
236 		/* Node Desc should be made as READ-ONLY */
237 		break;
238 	default:
239 		break;
240 	}
241 	return 0;
242 }
243 
__to_ib_speed_width(u32 espeed,u8 * speed,u8 * width)244 static void __to_ib_speed_width(u32 espeed, u8 *speed, u8 *width)
245 {
246 	switch (espeed) {
247 	case SPEED_1000:
248 		*speed = IB_SPEED_SDR;
249 		*width = IB_WIDTH_1X;
250 		break;
251 	case SPEED_10000:
252 		*speed = IB_SPEED_QDR;
253 		*width = IB_WIDTH_1X;
254 		break;
255 	case SPEED_20000:
256 		*speed = IB_SPEED_DDR;
257 		*width = IB_WIDTH_4X;
258 		break;
259 	case SPEED_25000:
260 		*speed = IB_SPEED_EDR;
261 		*width = IB_WIDTH_1X;
262 		break;
263 	case SPEED_40000:
264 		*speed = IB_SPEED_QDR;
265 		*width = IB_WIDTH_4X;
266 		break;
267 	case SPEED_50000:
268 		*speed = IB_SPEED_EDR;
269 		*width = IB_WIDTH_2X;
270 		break;
271 	case SPEED_100000:
272 		*speed = IB_SPEED_EDR;
273 		*width = IB_WIDTH_4X;
274 		break;
275 	case SPEED_200000:
276 		*speed = IB_SPEED_HDR;
277 		*width = IB_WIDTH_4X;
278 		break;
279 	default:
280 		*speed = IB_SPEED_SDR;
281 		*width = IB_WIDTH_1X;
282 		break;
283 	}
284 }
285 
286 /* Port */
bnxt_re_query_port(struct ib_device * ibdev,u8 port_num,struct ib_port_attr * port_attr)287 int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num,
288 		       struct ib_port_attr *port_attr)
289 {
290 	struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
291 	struct bnxt_qplib_dev_attr *dev_attr = rdev->dev_attr;
292 	u8 active_speed = 0, active_width = 0;
293 
294 	dev_dbg(rdev_to_dev(rdev), "QUERY PORT with port_num 0x%x\n", port_num);
295 	memset(port_attr, 0, sizeof(*port_attr));
296 
297 	port_attr->phys_state = IB_PORT_PHYS_STATE_DISABLED;
298 	port_attr->state = bnxt_re_get_link_state(rdev);
299 	if (port_attr->state == IB_PORT_ACTIVE)
300 		port_attr->phys_state = IB_PORT_PHYS_STATE_LINK_UP;
301 	port_attr->max_mtu = IB_MTU_4096;
302 	port_attr->active_mtu = iboe_get_mtu(if_getmtu(rdev->netdev));
303 	port_attr->gid_tbl_len = dev_attr->max_sgid;
304 	port_attr->port_cap_flags = IB_PORT_CM_SUP | IB_PORT_REINIT_SUP |
305 				    IB_PORT_DEVICE_MGMT_SUP |
306 				    IB_PORT_VENDOR_CLASS_SUP |
307 				    IB_PORT_IP_BASED_GIDS;
308 
309 	port_attr->max_msg_sz = (u32)BNXT_RE_MAX_MR_SIZE_LOW;
310 	port_attr->bad_pkey_cntr = 0;
311 	port_attr->qkey_viol_cntr = 0;
312 	port_attr->pkey_tbl_len = dev_attr->max_pkey;
313 	port_attr->lid = 0;
314 	port_attr->sm_lid = 0;
315 	port_attr->lmc = 0;
316 	port_attr->max_vl_num = 4;
317 	port_attr->sm_sl = 0;
318 	port_attr->subnet_timeout = 0;
319 	port_attr->init_type_reply = 0;
320 	rdev->espeed = rdev->en_dev->espeed;
321 
322 	if (test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags))
323 		__to_ib_speed_width(rdev->espeed, &active_speed,
324 				    &active_width);
325 
326 	port_attr->active_speed = active_speed;
327 	port_attr->active_width = active_width;
328 
329 	return 0;
330 }
331 
bnxt_re_modify_port(struct ib_device * ibdev,u8 port_num,int port_modify_mask,struct ib_port_modify * port_modify)332 int bnxt_re_modify_port(struct ib_device *ibdev, u8 port_num,
333 			int port_modify_mask,
334 			struct ib_port_modify *port_modify)
335 {
336 	dev_dbg(rdev_to_dev(rdev), "Modify port with mask 0x%x\n",
337 		port_modify_mask);
338 
339 	switch (port_modify_mask) {
340 	case IB_PORT_SHUTDOWN:
341 		break;
342 	case IB_PORT_INIT_TYPE:
343 		break;
344 	case IB_PORT_RESET_QKEY_CNTR:
345 		break;
346 	default:
347 		break;
348 	}
349 	return 0;
350 }
351 
bnxt_re_get_port_immutable(struct ib_device * ibdev,u8 port_num,struct ib_port_immutable * immutable)352 int bnxt_re_get_port_immutable(struct ib_device *ibdev, u8 port_num,
353 			       struct ib_port_immutable *immutable)
354 {
355 	struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
356 	struct ib_port_attr port_attr;
357 
358 	if (bnxt_re_query_port(ibdev, port_num, &port_attr))
359 		return -EINVAL;
360 
361 	immutable->pkey_tbl_len = port_attr.pkey_tbl_len;
362 	immutable->gid_tbl_len = port_attr.gid_tbl_len;
363 	if (rdev->roce_mode == BNXT_RE_FLAG_ROCEV1_CAP)
364 		immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE;
365 	else if (rdev->roce_mode == BNXT_RE_FLAG_ROCEV2_CAP)
366 		immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP;
367 	else
368 		immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE |
369 					    RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP;
370 	immutable->max_mad_size = IB_MGMT_MAD_SIZE;
371 	return 0;
372 }
373 
bnxt_re_compat_qfwstr(void)374 void bnxt_re_compat_qfwstr(void)
375 {
376 	struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
377 
378 	sprintf(str, "%d.%d.%d.%d", rdev->dev_attr->fw_ver[0],
379 		rdev->dev_attr->fw_ver[1], rdev->dev_attr->fw_ver[2],
380 		rdev->dev_attr->fw_ver[3]);
381 }
382 
bnxt_re_query_pkey(struct ib_device * ibdev,u8 port_num,u16 index,u16 * pkey)383 int bnxt_re_query_pkey(struct ib_device *ibdev, u8 port_num,
384 		       u16 index, u16 *pkey)
385 {
386 	if (index > 0)
387 		return -EINVAL;
388 
389 	*pkey = IB_DEFAULT_PKEY_FULL;
390 
391 	return 0;
392 }
393 
bnxt_re_query_gid(struct ib_device * ibdev,u8 port_num,int index,union ib_gid * gid)394 int bnxt_re_query_gid(struct ib_device *ibdev, u8 port_num,
395 		      int index, union ib_gid *gid)
396 {
397 	struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
398 	int rc = 0;
399 
400 	/* Ignore port_num */
401 	memset(gid, 0, sizeof(*gid));
402 	rc = bnxt_qplib_get_sgid(&rdev->qplib_res,
403 				 &rdev->qplib_res.sgid_tbl, index,
404 				 (struct bnxt_qplib_gid *)gid);
405 	return rc;
406 }
407 
bnxt_re_del_gid(struct ib_device * ibdev,u8 port_num,unsigned int index,void ** context)408 int bnxt_re_del_gid(struct ib_device *ibdev, u8 port_num,
409 		    unsigned int index, void **context)
410 {
411 	int rc = 0;
412 	struct bnxt_re_gid_ctx *ctx, **ctx_tbl;
413 	struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
414 	struct bnxt_qplib_sgid_tbl *sgid_tbl = &rdev->qplib_res.sgid_tbl;
415 	struct bnxt_qplib_gid *gid_to_del;
416 	u16 vlan_id = 0xFFFF;
417 
418 	/* Delete the entry from the hardware */
419 	ctx = *context;
420 	if (!ctx) {
421 		dev_err(rdev_to_dev(rdev), "GID entry has no ctx?!\n");
422 		return -EINVAL;
423 	}
424 	if (sgid_tbl && sgid_tbl->active) {
425 		if (ctx->idx >= sgid_tbl->max) {
426 			dev_dbg(rdev_to_dev(rdev), "GID index out of range?!\n");
427 			return -EINVAL;
428 		}
429 		gid_to_del = &sgid_tbl->tbl[ctx->idx].gid;
430 		vlan_id = sgid_tbl->tbl[ctx->idx].vlan_id;
431 		ctx->refcnt--;
432 		/* DEL_GID is called via WQ context(netdevice_event_work_handler)
433 		 * or via the ib_unregister_device path. In the former case QP1
434 		 * may not be destroyed yet, in which case just return as FW
435 		 * needs that entry to be present and will fail it's deletion.
436 		 * We could get invoked again after QP1 is destroyed OR get an
437 		 * ADD_GID call with a different GID value for the same index
438 		 * where we issue MODIFY_GID cmd to update the GID entry -- TBD
439 		 */
440 		if (ctx->idx == 0 &&
441 		    rdma_link_local_addr((struct in6_addr *)gid_to_del) &&
442 		    (rdev->gsi_ctx.gsi_sqp ||
443 		     rdev->gsi_ctx.gsi_qp_mode == BNXT_RE_GSI_MODE_UD)) {
444 			dev_dbg(rdev_to_dev(rdev),
445 				"Trying to delete GID0 while QP1 is alive\n");
446 			if (!ctx->refcnt) {
447 				rdev->gid_map[index] = -1;
448 				ctx_tbl = sgid_tbl->ctx;
449 				ctx_tbl[ctx->idx] = NULL;
450 				kfree(ctx);
451 			}
452 			return 0;
453 		}
454 		rdev->gid_map[index] = -1;
455 		if (!ctx->refcnt) {
456 			rc = bnxt_qplib_del_sgid(sgid_tbl, gid_to_del,
457 						 vlan_id, true);
458 			if (!rc) {
459 				dev_dbg(rdev_to_dev(rdev), "GID remove success\n");
460 				ctx_tbl = sgid_tbl->ctx;
461 				ctx_tbl[ctx->idx] = NULL;
462 				kfree(ctx);
463 			} else {
464 				dev_err(rdev_to_dev(rdev),
465 					"Remove GID failed rc = 0x%x\n", rc);
466 			}
467 		}
468 	} else {
469 		dev_dbg(rdev_to_dev(rdev), "GID sgid_tbl does not exist!\n");
470 		return -EINVAL;
471 	}
472 	return rc;
473 }
474 
bnxt_re_add_gid(struct ib_device * ibdev,u8 port_num,unsigned int index,const union ib_gid * gid,const struct ib_gid_attr * attr,void ** context)475 int bnxt_re_add_gid(struct ib_device *ibdev, u8 port_num,
476 		    unsigned int index, const union ib_gid *gid,
477 		    const struct ib_gid_attr *attr, void **context)
478 {
479 	int rc;
480 	u32 tbl_idx = 0;
481 	u16 vlan_id = 0xFFFF;
482 	struct bnxt_re_gid_ctx *ctx, **ctx_tbl;
483 	struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
484 	struct bnxt_qplib_sgid_tbl *sgid_tbl = &rdev->qplib_res.sgid_tbl;
485 	if ((attr->ndev) && is_vlan_dev(attr->ndev))
486 		vlan_id = vlan_dev_vlan_id(attr->ndev);
487 
488 	rc = bnxt_qplib_add_sgid(sgid_tbl, gid,
489 				 rdev->dev_addr,
490 				 vlan_id, true, &tbl_idx);
491 	if (rc == -EALREADY) {
492 		dev_dbg(rdev_to_dev(rdev), "GID %pI6 is already present\n", gid);
493 		ctx_tbl = sgid_tbl->ctx;
494 		if (!ctx_tbl[tbl_idx]) {
495 			ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
496 			if (!ctx)
497 				return -ENOMEM;
498 			ctx->idx = tbl_idx;
499 			ctx->refcnt = 1;
500 			ctx_tbl[tbl_idx] = ctx;
501 		} else {
502 			ctx_tbl[tbl_idx]->refcnt++;
503 		}
504 		*context = ctx_tbl[tbl_idx];
505 		/* tbl_idx is the HW table index and index is the stack index */
506 		rdev->gid_map[index] = tbl_idx;
507 		return 0;
508 	} else if (rc < 0) {
509 		dev_err(rdev_to_dev(rdev), "Add GID failed rc = 0x%x\n", rc);
510 		return rc;
511 	} else {
512 		ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
513 		if (!ctx) {
514 			dev_err(rdev_to_dev(rdev), "Add GID ctx failed\n");
515 			return -ENOMEM;
516 		}
517 		ctx_tbl = sgid_tbl->ctx;
518 		ctx->idx = tbl_idx;
519 		ctx->refcnt = 1;
520 		ctx_tbl[tbl_idx] = ctx;
521 		/* tbl_idx is the HW table index and index is the stack index */
522 		rdev->gid_map[index] = tbl_idx;
523 		*context = ctx;
524 	}
525 	return rc;
526 }
527 
bnxt_re_get_link_layer(struct ib_device * ibdev,u8 port_num)528 enum rdma_link_layer bnxt_re_get_link_layer(struct ib_device *ibdev,
529 					    u8 port_num)
530 {
531 	return IB_LINK_LAYER_ETHERNET;
532 }
533 
bnxt_re_legacy_create_fence_wqe(struct bnxt_re_pd * pd)534 static void bnxt_re_legacy_create_fence_wqe(struct bnxt_re_pd *pd)
535 {
536 	struct bnxt_re_legacy_fence_data *fence = &pd->fence;
537 	struct ib_mr *ib_mr = &fence->mr->ib_mr;
538 	struct bnxt_qplib_swqe *wqe = &fence->bind_wqe;
539 	struct bnxt_re_dev *rdev = pd->rdev;
540 
541 	if (!_is_chip_gen_p5_p7(rdev->chip_ctx))
542 		return;
543 
544 	memset(wqe, 0, sizeof(*wqe));
545 	wqe->type = BNXT_QPLIB_SWQE_TYPE_BIND_MW;
546 	wqe->wr_id = BNXT_QPLIB_FENCE_WRID;
547 	wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_SIGNAL_COMP;
548 	wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_UC_FENCE;
549 	wqe->bind.zero_based = false;
550 	wqe->bind.parent_l_key = ib_mr->lkey;
551 	wqe->bind.va = (u64)fence->va;
552 	wqe->bind.length = fence->size;
553 	wqe->bind.access_cntl = __from_ib_access_flags(IB_ACCESS_REMOTE_READ);
554 	wqe->bind.mw_type = SQ_BIND_MW_TYPE_TYPE1;
555 
556 	/* Save the initial rkey in fence structure for now;
557 	 * wqe->bind.r_key will be set at (re)bind time.
558 	 */
559 	fence->bind_rkey = ib_inc_rkey(fence->mw->rkey);
560 }
561 
bnxt_re_legacy_bind_fence_mw(struct bnxt_qplib_qp * qplib_qp)562 static int bnxt_re_legacy_bind_fence_mw(struct bnxt_qplib_qp *qplib_qp)
563 {
564 	struct bnxt_re_qp *qp = container_of(qplib_qp, struct bnxt_re_qp,
565 					     qplib_qp);
566 	struct ib_pd *ib_pd = qp->ib_qp.pd;
567 	struct bnxt_re_pd *pd = to_bnxt_re(ib_pd, struct bnxt_re_pd, ibpd);
568 	struct bnxt_re_legacy_fence_data *fence = &pd->fence;
569 	struct bnxt_qplib_swqe *fence_wqe = &fence->bind_wqe;
570 	struct bnxt_qplib_swqe wqe;
571 	int rc;
572 
573 	/* TODO: Need SQ locking here when Fence WQE
574 	 * posting moves up into bnxt_re from bnxt_qplib.
575 	 */
576 	memcpy(&wqe, fence_wqe, sizeof(wqe));
577 	wqe.bind.r_key = fence->bind_rkey;
578 	fence->bind_rkey = ib_inc_rkey(fence->bind_rkey);
579 
580 	dev_dbg(rdev_to_dev(qp->rdev),
581 		"Posting bind fence-WQE: rkey: %#x QP: %d PD: %p\n",
582 		wqe.bind.r_key, qp->qplib_qp.id, pd);
583 	rc = bnxt_qplib_post_send(&qp->qplib_qp, &wqe);
584 	if (rc) {
585 		dev_err(rdev_to_dev(qp->rdev), "Failed to bind fence-WQE\n");
586 		return rc;
587 	}
588 	bnxt_qplib_post_send_db(&qp->qplib_qp);
589 
590 	return rc;
591 }
592 
bnxt_re_legacy_create_fence_mr(struct bnxt_re_pd * pd)593 static int bnxt_re_legacy_create_fence_mr(struct bnxt_re_pd *pd)
594 {
595 	int mr_access_flags = IB_ACCESS_LOCAL_WRITE | IB_ACCESS_MW_BIND;
596 	struct bnxt_re_legacy_fence_data *fence = &pd->fence;
597 	struct bnxt_re_dev *rdev = pd->rdev;
598 	struct bnxt_qplib_mrinfo mrinfo;
599 	struct bnxt_re_mr *mr = NULL;
600 	struct ib_mw *ib_mw = NULL;
601 	dma_addr_t dma_addr = 0;
602 	u32 max_mr_count;
603 	u64 pbl_tbl;
604 	int rc;
605 
606 	if (!_is_chip_gen_p5_p7(rdev->chip_ctx))
607 		return 0;
608 
609 	memset(&mrinfo, 0, sizeof(mrinfo));
610 	/* Allocate a small chunk of memory and dma-map it */
611 	fence->va = kzalloc(BNXT_RE_LEGACY_FENCE_BYTES, GFP_KERNEL);
612 	if (!fence->va)
613 		return -ENOMEM;
614 	dma_addr = ib_dma_map_single(&rdev->ibdev, fence->va,
615 				     BNXT_RE_LEGACY_FENCE_BYTES,
616 				     DMA_BIDIRECTIONAL);
617 	rc = ib_dma_mapping_error(&rdev->ibdev, dma_addr);
618 	if (rc) {
619 		dev_err(rdev_to_dev(rdev), "Failed to dma-map fence-MR-mem\n");
620 		rc = -EIO;
621 		fence->dma_addr = 0;
622 		goto free_va;
623 	}
624 	fence->dma_addr = dma_addr;
625 
626 	/* Allocate a MR */
627 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
628 	if (!mr)
629 		goto free_dma_addr;
630 	fence->mr = mr;
631 	mr->rdev = rdev;
632 	mr->qplib_mr.pd = &pd->qplib_pd;
633 	mr->qplib_mr.type = CMDQ_ALLOCATE_MRW_MRW_FLAGS_PMR;
634 	mr->qplib_mr.flags = __from_ib_access_flags(mr_access_flags);
635 	if (!_is_alloc_mr_unified(rdev->qplib_res.dattr)) {
636 		rc = bnxt_qplib_alloc_mrw(&rdev->qplib_res, &mr->qplib_mr);
637 		if (rc) {
638 			dev_err(rdev_to_dev(rdev), "Failed to alloc fence-HW-MR\n");
639 			goto free_mr;
640 		}
641 		/* Register MR */
642 		mr->ib_mr.lkey = mr->qplib_mr.lkey;
643 	}
644 	mr->qplib_mr.va         = (u64)fence->va;
645 	mr->qplib_mr.total_size = BNXT_RE_LEGACY_FENCE_BYTES;
646 	pbl_tbl = dma_addr;
647 
648 	mrinfo.mrw = &mr->qplib_mr;
649 	mrinfo.ptes = &pbl_tbl;
650 	mrinfo.sg.npages = BNXT_RE_LEGACY_FENCE_PBL_SIZE;
651 
652 	mrinfo.sg.nmap = 0;
653 	mrinfo.sg.sghead = 0;
654 	mrinfo.sg.pgshft = PAGE_SHIFT;
655 	mrinfo.sg.pgsize = PAGE_SIZE;
656 	rc = bnxt_qplib_reg_mr(&rdev->qplib_res, &mrinfo, false);
657 	if (rc) {
658 		dev_err(rdev_to_dev(rdev), "Failed to register fence-MR\n");
659 		goto free_mr;
660 	}
661 	mr->ib_mr.lkey = mr->qplib_mr.lkey;
662 	mr->ib_mr.rkey = mr->qplib_mr.rkey;
663 	atomic_inc(&rdev->stats.rsors.mr_count);
664 	max_mr_count =  atomic_read(&rdev->stats.rsors.mr_count);
665 	if (max_mr_count > (atomic_read(&rdev->stats.rsors.max_mr_count)))
666 		atomic_set(&rdev->stats.rsors.max_mr_count, max_mr_count);
667 
668 	ib_mw = bnxt_re_alloc_mw(&pd->ibpd, IB_MW_TYPE_1, NULL);
669 	/* Create a fence MW only for kernel consumers */
670 	if (!ib_mw) {
671 		dev_err(rdev_to_dev(rdev),
672 			"Failed to create fence-MW for PD: %p\n", pd);
673 		rc = -EINVAL;
674 		goto free_mr;
675 	}
676 	fence->mw = ib_mw;
677 
678 	bnxt_re_legacy_create_fence_wqe(pd);
679 	return 0;
680 
681 free_mr:
682 	if (mr->ib_mr.lkey) {
683 		bnxt_qplib_free_mrw(&rdev->qplib_res, &mr->qplib_mr);
684 		atomic_dec(&rdev->stats.rsors.mr_count);
685 	}
686 	kfree(mr);
687 	fence->mr = NULL;
688 
689 free_dma_addr:
690 	ib_dma_unmap_single(&rdev->ibdev, fence->dma_addr,
691 			    BNXT_RE_LEGACY_FENCE_BYTES, DMA_BIDIRECTIONAL);
692 	fence->dma_addr = 0;
693 
694 free_va:
695 	kfree(fence->va);
696 	fence->va = NULL;
697 	return rc;
698 }
699 
bnxt_re_legacy_destroy_fence_mr(struct bnxt_re_pd * pd)700 static void bnxt_re_legacy_destroy_fence_mr(struct bnxt_re_pd *pd)
701 {
702 	struct bnxt_re_legacy_fence_data *fence = &pd->fence;
703 	struct bnxt_re_dev *rdev = pd->rdev;
704 	struct bnxt_re_mr *mr = fence->mr;
705 
706 	if (!_is_chip_gen_p5_p7(rdev->chip_ctx))
707 		return;
708 
709 	if (fence->mw) {
710 		bnxt_re_dealloc_mw(fence->mw);
711 		fence->mw = NULL;
712 	}
713 	if (mr) {
714 		if (mr->ib_mr.rkey)
715 			bnxt_qplib_dereg_mrw(&rdev->qplib_res, &mr->qplib_mr,
716 					     false);
717 		if (mr->ib_mr.lkey)
718 			bnxt_qplib_free_mrw(&rdev->qplib_res, &mr->qplib_mr);
719 		kfree(mr);
720 		fence->mr = NULL;
721 		atomic_dec(&rdev->stats.rsors.mr_count);
722 	}
723 	if (fence->dma_addr) {
724 		ib_dma_unmap_single(&rdev->ibdev, fence->dma_addr,
725 				    BNXT_RE_LEGACY_FENCE_BYTES,
726 				    DMA_BIDIRECTIONAL);
727 		fence->dma_addr = 0;
728 	}
729 	kfree(fence->va);
730 	fence->va = NULL;
731 }
732 
733 
bnxt_re_get_user_dpi(struct bnxt_re_dev * rdev,struct bnxt_re_ucontext * cntx)734 static int bnxt_re_get_user_dpi(struct bnxt_re_dev *rdev,
735 				struct bnxt_re_ucontext *cntx)
736 {
737 	struct bnxt_qplib_chip_ctx *cctx = rdev->chip_ctx;
738 	int ret = 0;
739 	u8 type;
740 	/* Allocate DPI in alloc_pd or in create_cq to avoid failing of
741 	 * ibv_devinfo and family of application when DPIs are depleted.
742 	 */
743 	type = BNXT_QPLIB_DPI_TYPE_UC;
744 	ret = bnxt_qplib_alloc_dpi(&rdev->qplib_res, &cntx->dpi, cntx, type);
745 	if (ret) {
746 		dev_err(rdev_to_dev(rdev), "Alloc doorbell page failed!\n");
747 		goto out;
748 	}
749 
750 	if (cctx->modes.db_push) {
751 		type = BNXT_QPLIB_DPI_TYPE_WC;
752 		ret = bnxt_qplib_alloc_dpi(&rdev->qplib_res, &cntx->wcdpi,
753 					   cntx, type);
754 		if (ret)
755 			dev_err(rdev_to_dev(rdev), "push dp alloc failed\n");
756 	}
757 out:
758 	return ret;
759 }
760 
761 /* Protection Domains */
bnxt_re_dealloc_pd(struct ib_pd * ib_pd,struct ib_udata * udata)762 void bnxt_re_dealloc_pd(struct ib_pd *ib_pd, struct ib_udata *udata)
763 {
764 	struct bnxt_re_pd *pd = to_bnxt_re(ib_pd, struct bnxt_re_pd, ibpd);
765 	struct bnxt_re_dev *rdev = pd->rdev;
766 	int rc;
767 
768 	bnxt_re_legacy_destroy_fence_mr(pd);
769 
770 	rc = bnxt_qplib_dealloc_pd(&rdev->qplib_res,
771 				   &rdev->qplib_res.pd_tbl,
772 				   &pd->qplib_pd);
773 	if (rc)
774 		dev_err_ratelimited(rdev_to_dev(rdev),
775 				    "%s failed rc = %d\n", __func__, rc);
776 	atomic_dec(&rdev->stats.rsors.pd_count);
777 
778 	return;
779 }
780 
bnxt_re_alloc_pd(struct ib_pd * pd_in,struct ib_udata * udata)781 int bnxt_re_alloc_pd(struct ib_pd *pd_in,
782 		     struct ib_udata *udata)
783 {
784 	struct ib_pd *ibpd = pd_in;
785 	struct ib_device *ibdev = ibpd->device;
786 	struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
787 	struct bnxt_re_ucontext *ucntx =
788 		rdma_udata_to_drv_context(udata, struct bnxt_re_ucontext,
789 					  ibucontext);
790 	u32 max_pd_count;
791 	int rc;
792 	struct bnxt_re_pd *pd = container_of(ibpd, struct bnxt_re_pd, ibpd);
793 
794 	pd->rdev = rdev;
795 	if (bnxt_qplib_alloc_pd(&rdev->qplib_res, &pd->qplib_pd)) {
796 		dev_err(rdev_to_dev(rdev),
797 			"Allocate HW Protection Domain failed!\n");
798 		rc = -ENOMEM;
799 		goto fail;
800 	}
801 
802 	if (udata) {
803 		struct bnxt_re_pd_resp resp = {};
804 
805 		if (!ucntx->dpi.dbr) {
806 			rc = bnxt_re_get_user_dpi(rdev, ucntx);
807 			if (rc)
808 				goto dbfail;
809 		}
810 
811 		resp.pdid = pd->qplib_pd.id;
812 		/* Still allow mapping this DBR to the new user PD. */
813 		resp.dpi = ucntx->dpi.dpi;
814 		resp.dbr = (u64)ucntx->dpi.umdbr;
815 		/* Copy only on a valid wcpdi */
816 		if (ucntx->wcdpi.dpi) {
817 			resp.wcdpi = ucntx->wcdpi.dpi;
818 			resp.comp_mask = BNXT_RE_COMP_MASK_PD_HAS_WC_DPI;
819 		}
820 		if (rdev->dbr_pacing) {
821 			WARN_ON(!rdev->dbr_bar_addr);
822 			resp.dbr_bar_addr = (u64)rdev->dbr_bar_addr;
823 			resp.comp_mask |= BNXT_RE_COMP_MASK_PD_HAS_DBR_BAR_ADDR;
824 		}
825 
826 		rc = bnxt_re_copy_to_udata(rdev, &resp,
827 					   min(udata->outlen, sizeof(resp)),
828 					   udata);
829 		if (rc)
830 			goto dbfail;
831 	}
832 
833 	if (!udata)
834 		if (bnxt_re_legacy_create_fence_mr(pd))
835 			dev_warn(rdev_to_dev(rdev),
836 				 "Failed to create Fence-MR\n");
837 
838 	atomic_inc(&rdev->stats.rsors.pd_count);
839 	max_pd_count = atomic_read(&rdev->stats.rsors.pd_count);
840 	if (max_pd_count > atomic_read(&rdev->stats.rsors.max_pd_count))
841 		atomic_set(&rdev->stats.rsors.max_pd_count, max_pd_count);
842 
843 	return 0;
844 dbfail:
845 	(void)bnxt_qplib_dealloc_pd(&rdev->qplib_res, &rdev->qplib_res.pd_tbl,
846 				    &pd->qplib_pd);
847 fail:
848 	return rc;
849 }
850 
851 /* Address Handles */
bnxt_re_destroy_ah(struct ib_ah * ib_ah,u32 flags)852 void bnxt_re_destroy_ah(struct ib_ah *ib_ah, u32 flags)
853 {
854 	struct bnxt_re_ah *ah = to_bnxt_re(ib_ah, struct bnxt_re_ah, ibah);
855 	struct bnxt_re_dev *rdev = ah->rdev;
856 	int rc = 0;
857 	bool block = true;
858 
859 	block = !(flags & RDMA_DESTROY_AH_SLEEPABLE);
860 
861 	rc = bnxt_qplib_destroy_ah(&rdev->qplib_res, &ah->qplib_ah, block);
862 	if (rc)
863 		dev_err_ratelimited(rdev_to_dev(rdev),
864 				   "%s id = %d blocking %d failed rc = %d\n",
865 				    __func__, ah->qplib_ah.id, block, rc);
866 	atomic_dec(&rdev->stats.rsors.ah_count);
867 
868 	return;
869 }
870 
_to_bnxt_re_nw_type(enum rdma_network_type ntype)871 static u8 _to_bnxt_re_nw_type(enum rdma_network_type ntype)
872 {
873 	u8 nw_type;
874 	switch (ntype) {
875 		case RDMA_NETWORK_IPV4:
876 			nw_type = CMDQ_CREATE_AH_TYPE_V2IPV4;
877 			break;
878 		case RDMA_NETWORK_IPV6:
879 			nw_type = CMDQ_CREATE_AH_TYPE_V2IPV6;
880 			break;
881 		default:
882 			nw_type = CMDQ_CREATE_AH_TYPE_V1;
883 			break;
884 	}
885 	return nw_type;
886 }
887 
888 static inline int
bnxt_re_get_cached_gid(struct ib_device * dev,u8 port_num,int index,union ib_gid * sgid,struct ib_gid_attr ** sgid_attr,struct ib_global_route * grh,struct ib_ah * ah)889 bnxt_re_get_cached_gid(struct ib_device *dev, u8 port_num, int index,
890 		       union ib_gid *sgid, struct ib_gid_attr **sgid_attr,
891 		       struct ib_global_route *grh, struct ib_ah *ah)
892 {
893 	int ret = 0;
894 
895 	ret = ib_get_cached_gid(dev, port_num, index, sgid, *sgid_attr);
896 	return ret;
897 }
898 
899 static inline enum rdma_network_type
bnxt_re_gid_to_network_type(struct ib_gid_attr * sgid_attr,union ib_gid * sgid)900 bnxt_re_gid_to_network_type(struct ib_gid_attr *sgid_attr,
901 			    union ib_gid *sgid)
902 {
903 	return ib_gid_to_network_type(sgid_attr->gid_type, sgid);
904 }
905 
bnxt_re_get_ah_info(struct bnxt_re_dev * rdev,struct ib_ah_attr * ah_attr,struct bnxt_re_ah_info * ah_info)906 static int bnxt_re_get_ah_info(struct bnxt_re_dev *rdev,
907 			       struct ib_ah_attr *ah_attr,
908 			       struct bnxt_re_ah_info *ah_info)
909 {
910 	struct ib_gid_attr *gattr;
911 	enum rdma_network_type ib_ntype;
912 	u8 ntype;
913 	union ib_gid *gid;
914 	int rc = 0;
915 
916 	gid = &ah_info->sgid;
917 	gattr = &ah_info->sgid_attr;
918 
919 	rc = bnxt_re_get_cached_gid(&rdev->ibdev, 1, ah_attr->grh.sgid_index,
920 				    gid, &gattr, &ah_attr->grh, NULL);
921 	if (rc)
922 		return rc;
923 
924 	/* Get vlan tag */
925 	if (gattr->ndev) {
926 		if (is_vlan_dev(gattr->ndev))
927 			ah_info->vlan_tag = vlan_dev_vlan_id(gattr->ndev);
928 		if_rele(gattr->ndev);
929 	}
930 
931 	/* Get network header type for this GID */
932 
933 	ib_ntype = bnxt_re_gid_to_network_type(gattr, gid);
934 	ntype = _to_bnxt_re_nw_type(ib_ntype);
935 	ah_info->nw_type = ntype;
936 
937 	return rc;
938 }
939 
_get_sgid_index(struct bnxt_re_dev * rdev,u8 gindx)940 static u8 _get_sgid_index(struct bnxt_re_dev *rdev, u8 gindx)
941 {
942 	gindx = rdev->gid_map[gindx];
943 	return gindx;
944 }
945 
bnxt_re_init_dmac(struct bnxt_re_dev * rdev,struct ib_ah_attr * ah_attr,struct bnxt_re_ah_info * ah_info,bool is_user,struct bnxt_re_ah * ah)946 static int bnxt_re_init_dmac(struct bnxt_re_dev *rdev, struct ib_ah_attr *ah_attr,
947 			     struct bnxt_re_ah_info *ah_info, bool is_user,
948 			     struct bnxt_re_ah *ah)
949 {
950 	int rc = 0;
951 	u8 *dmac;
952 
953 	if (is_user && !rdma_is_multicast_addr((struct in6_addr *)
954 						ah_attr->grh.dgid.raw) &&
955 	    !rdma_link_local_addr((struct in6_addr *)ah_attr->grh.dgid.raw)) {
956 
957 		u32 retry_count = BNXT_RE_RESOLVE_RETRY_COUNT_US;
958 		struct bnxt_re_resolve_dmac_work *resolve_dmac_work;
959 
960 
961 		resolve_dmac_work = kzalloc(sizeof(*resolve_dmac_work), GFP_ATOMIC);
962 
963 		resolve_dmac_work->rdev = rdev;
964 		resolve_dmac_work->ah_attr = ah_attr;
965 		resolve_dmac_work->ah_info = ah_info;
966 
967 		atomic_set(&resolve_dmac_work->status_wait, 1);
968 		INIT_WORK(&resolve_dmac_work->work, bnxt_re_resolve_dmac_task);
969 		queue_work(rdev->resolve_wq, &resolve_dmac_work->work);
970 
971 		do {
972 			rc = atomic_read(&resolve_dmac_work->status_wait) & 0xFF;
973 			if (!rc)
974 				break;
975 			udelay(1);
976 		} while (--retry_count);
977 		if (atomic_read(&resolve_dmac_work->status_wait)) {
978 			INIT_LIST_HEAD(&resolve_dmac_work->list);
979 			list_add_tail(&resolve_dmac_work->list,
980 					&rdev->mac_wq_list);
981 			return -EFAULT;
982 		}
983 		kfree(resolve_dmac_work);
984 	}
985 	dmac = ROCE_DMAC(ah_attr);
986 	if (dmac)
987 		memcpy(ah->qplib_ah.dmac, dmac, ETH_ALEN);
988 	return rc;
989 }
990 
bnxt_re_create_ah(struct ib_ah * ah_in,struct ib_ah_attr * attr,u32 flags,struct ib_udata * udata)991 int bnxt_re_create_ah(struct ib_ah *ah_in, struct ib_ah_attr *attr,
992 		      u32 flags, struct ib_udata *udata)
993 {
994 
995 	struct ib_ah *ib_ah = ah_in;
996 	struct ib_pd *ib_pd = ib_ah->pd;
997 	struct bnxt_re_ah *ah = container_of(ib_ah, struct bnxt_re_ah, ibah);
998 	struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ibpd);
999 	struct bnxt_re_dev *rdev = pd->rdev;
1000 	struct bnxt_re_ah_info ah_info;
1001 	u32 max_ah_count;
1002 	bool is_user;
1003 	int rc;
1004 	bool block = true;
1005 	struct ib_ah_attr *ah_attr = attr;
1006 	block = !(flags & RDMA_CREATE_AH_SLEEPABLE);
1007 
1008 	if (!(ah_attr->ah_flags & IB_AH_GRH))
1009 		dev_err(rdev_to_dev(rdev), "ah_attr->ah_flags GRH is not set\n");
1010 
1011 	ah->rdev = rdev;
1012 	ah->qplib_ah.pd = &pd->qplib_pd;
1013 	is_user = ib_pd->uobject ? true : false;
1014 
1015 	/* Supply the configuration for the HW */
1016 	memcpy(ah->qplib_ah.dgid.data, ah_attr->grh.dgid.raw,
1017 			sizeof(union ib_gid));
1018 	ah->qplib_ah.sgid_index = _get_sgid_index(rdev, ah_attr->grh.sgid_index);
1019 	if (ah->qplib_ah.sgid_index == 0xFF) {
1020 		dev_err(rdev_to_dev(rdev), "invalid sgid_index!\n");
1021 		rc = -EINVAL;
1022 		goto fail;
1023 	}
1024 	ah->qplib_ah.host_sgid_index = ah_attr->grh.sgid_index;
1025 	ah->qplib_ah.traffic_class = ah_attr->grh.traffic_class;
1026 	ah->qplib_ah.flow_label = ah_attr->grh.flow_label;
1027 	ah->qplib_ah.hop_limit = ah_attr->grh.hop_limit;
1028 	ah->qplib_ah.sl = ah_attr->sl;
1029 	rc = bnxt_re_get_ah_info(rdev, ah_attr, &ah_info);
1030 	if (rc)
1031 		goto fail;
1032 	ah->qplib_ah.nw_type = ah_info.nw_type;
1033 
1034 	rc = bnxt_re_init_dmac(rdev, ah_attr, &ah_info, is_user, ah);
1035 	if (rc)
1036 		goto fail;
1037 
1038 	rc = bnxt_qplib_create_ah(&rdev->qplib_res, &ah->qplib_ah, block);
1039 	if (rc) {
1040 		dev_err(rdev_to_dev(rdev),
1041 			"Allocate HW Address Handle failed!\n");
1042 		goto fail;
1043 	}
1044 
1045 	/* Write AVID to shared page. */
1046 	if (ib_pd->uobject) {
1047 		struct ib_ucontext *ib_uctx = ib_pd->uobject->context;
1048 		struct bnxt_re_ucontext *uctx;
1049 		unsigned long flag;
1050 		u32 *wrptr;
1051 
1052 		uctx = to_bnxt_re(ib_uctx, struct bnxt_re_ucontext, ibucontext);
1053 		spin_lock_irqsave(&uctx->sh_lock, flag);
1054 		wrptr = (u32 *)((u8 *)uctx->shpg + BNXT_RE_AVID_OFFT);
1055 		*wrptr = ah->qplib_ah.id;
1056 		wmb(); /* make sure cache is updated. */
1057 		spin_unlock_irqrestore(&uctx->sh_lock, flag);
1058 	}
1059 	atomic_inc(&rdev->stats.rsors.ah_count);
1060 	max_ah_count = atomic_read(&rdev->stats.rsors.ah_count);
1061 	if (max_ah_count > atomic_read(&rdev->stats.rsors.max_ah_count))
1062 		atomic_set(&rdev->stats.rsors.max_ah_count, max_ah_count);
1063 
1064 	return 0;
1065 fail:
1066 	return rc;
1067 }
1068 
bnxt_re_modify_ah(struct ib_ah * ib_ah,struct ib_ah_attr * ah_attr)1069 int bnxt_re_modify_ah(struct ib_ah *ib_ah, struct ib_ah_attr *ah_attr)
1070 {
1071 	return 0;
1072 }
1073 
bnxt_re_query_ah(struct ib_ah * ib_ah,struct ib_ah_attr * ah_attr)1074 int bnxt_re_query_ah(struct ib_ah *ib_ah, struct ib_ah_attr *ah_attr)
1075 {
1076 	struct bnxt_re_ah *ah = to_bnxt_re(ib_ah, struct bnxt_re_ah, ibah);
1077 
1078 	memcpy(ah_attr->grh.dgid.raw, ah->qplib_ah.dgid.data,
1079 	       sizeof(union ib_gid));
1080 	ah_attr->grh.sgid_index = ah->qplib_ah.host_sgid_index;
1081 	ah_attr->grh.traffic_class = ah->qplib_ah.traffic_class;
1082 	ah_attr->sl = ah->qplib_ah.sl;
1083 	memcpy(ROCE_DMAC(ah_attr), ah->qplib_ah.dmac, ETH_ALEN);
1084 	ah_attr->ah_flags = IB_AH_GRH;
1085 	ah_attr->port_num = 1;
1086 	ah_attr->static_rate = 0;
1087 
1088 	return 0;
1089 }
1090 
1091 /* Shared Receive Queues */
bnxt_re_destroy_srq(struct ib_srq * ib_srq,struct ib_udata * udata)1092 void bnxt_re_destroy_srq(struct ib_srq *ib_srq,
1093 			 struct ib_udata *udata)
1094 {
1095 	struct bnxt_re_srq *srq = to_bnxt_re(ib_srq, struct bnxt_re_srq, ibsrq);
1096 	struct bnxt_re_dev *rdev = srq->rdev;
1097 	struct bnxt_qplib_srq *qplib_srq = &srq->qplib_srq;
1098 	int rc = 0;
1099 
1100 
1101 	rc = bnxt_qplib_destroy_srq(&rdev->qplib_res, qplib_srq);
1102 	if (rc)
1103 		dev_err_ratelimited(rdev_to_dev(rdev),
1104 				   "%s id = %d failed rc = %d\n",
1105 				    __func__, qplib_srq->id, rc);
1106 
1107 	if (srq->umem && !IS_ERR(srq->umem))
1108 		ib_umem_release(srq->umem);
1109 
1110 	atomic_dec(&rdev->stats.rsors.srq_count);
1111 
1112 	return;
1113 }
1114 
_max_rwqe_sz(int nsge)1115 static u16 _max_rwqe_sz(int nsge)
1116 {
1117 	return sizeof(struct rq_wqe_hdr) + (nsge * sizeof(struct sq_sge));
1118 }
1119 
bnxt_re_get_rwqe_size(struct bnxt_qplib_qp * qplqp,int rsge,int max)1120 static u16 bnxt_re_get_rwqe_size(struct bnxt_qplib_qp *qplqp,
1121 				 int rsge, int max)
1122 {
1123 	if (qplqp->wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC)
1124 		rsge = max;
1125 
1126 	return _max_rwqe_sz(rsge);
1127 }
1128 
1129 static inline
ib_umem_get_compat(struct bnxt_re_dev * rdev,struct ib_ucontext * ucontext,struct ib_udata * udata,unsigned long addr,size_t size,int access,int dmasync)1130 struct ib_umem *ib_umem_get_compat(struct bnxt_re_dev *rdev,
1131 				   struct ib_ucontext *ucontext,
1132 				   struct ib_udata *udata,
1133 				   unsigned long addr,
1134 				   size_t size, int access, int dmasync)
1135 {
1136 	return ib_umem_get(ucontext, addr, size, access, dmasync);
1137 }
1138 
1139 static inline
ib_umem_get_flags_compat(struct bnxt_re_dev * rdev,struct ib_ucontext * ucontext,struct ib_udata * udata,unsigned long addr,size_t size,int access,int dmasync)1140 struct ib_umem *ib_umem_get_flags_compat(struct bnxt_re_dev *rdev,
1141 					 struct ib_ucontext *ucontext,
1142 					 struct ib_udata *udata,
1143 					 unsigned long addr,
1144 					 size_t size, int access, int dmasync)
1145 {
1146 	return ib_umem_get_compat(rdev, ucontext, udata, addr, size,
1147 				  access, 0);
1148 }
1149 
ib_umem_num_pages_compat(struct ib_umem * umem)1150 static inline size_t ib_umem_num_pages_compat(struct ib_umem *umem)
1151 {
1152 	return ib_umem_num_pages(umem);
1153 }
1154 
bnxt_re_init_user_srq(struct bnxt_re_dev * rdev,struct bnxt_re_pd * pd,struct bnxt_re_srq * srq,struct ib_udata * udata)1155 static int bnxt_re_init_user_srq(struct bnxt_re_dev *rdev,
1156 				 struct bnxt_re_pd *pd,
1157 				 struct bnxt_re_srq *srq,
1158 				 struct ib_udata *udata)
1159 {
1160 	struct bnxt_qplib_sg_info *sginfo;
1161 	struct bnxt_qplib_srq *qplib_srq;
1162 	struct bnxt_re_ucontext *cntx;
1163 	struct ib_ucontext *context;
1164 	struct bnxt_re_srq_req ureq;
1165 	struct ib_umem *umem;
1166 	int rc, bytes = 0;
1167 
1168 	context = pd->ibpd.uobject->context;
1169 	cntx = to_bnxt_re(context, struct bnxt_re_ucontext, ibucontext);
1170 	qplib_srq = &srq->qplib_srq;
1171 	sginfo = &qplib_srq->sginfo;
1172 
1173 	if (udata->inlen < sizeof(ureq))
1174 		dev_warn(rdev_to_dev(rdev),
1175 			 "Update the library ulen %d klen %d\n",
1176 			 (unsigned int)udata->inlen,
1177 			 (unsigned int)sizeof(ureq));
1178 
1179 	rc = ib_copy_from_udata(&ureq, udata,
1180 				min(udata->inlen, sizeof(ureq)));
1181 	if (rc)
1182 		return rc;
1183 
1184 	bytes = (qplib_srq->max_wqe * qplib_srq->wqe_size);
1185 	bytes = PAGE_ALIGN(bytes);
1186 	umem = ib_umem_get_compat(rdev, context, udata, ureq.srqva, bytes,
1187 				  IB_ACCESS_LOCAL_WRITE, 1);
1188 	if (IS_ERR(umem)) {
1189 		dev_err(rdev_to_dev(rdev), "%s: ib_umem_get failed with %ld\n",
1190 			__func__, PTR_ERR(umem));
1191 		return PTR_ERR(umem);
1192 	}
1193 
1194 	srq->umem = umem;
1195 	sginfo->sghead = get_ib_umem_sgl(umem, &sginfo->nmap);
1196 	sginfo->npages = ib_umem_num_pages_compat(umem);
1197 	qplib_srq->srq_handle = ureq.srq_handle;
1198 	qplib_srq->dpi = &cntx->dpi;
1199 	qplib_srq->is_user = true;
1200 
1201 	return 0;
1202 }
1203 
bnxt_re_create_srq(struct ib_srq * srq_in,struct ib_srq_init_attr * srq_init_attr,struct ib_udata * udata)1204 int bnxt_re_create_srq(struct ib_srq *srq_in, struct ib_srq_init_attr *srq_init_attr,
1205 		       struct ib_udata *udata)
1206 {
1207 	struct bnxt_qplib_dev_attr *dev_attr;
1208 	struct bnxt_re_ucontext *cntx = NULL;
1209 	struct ib_ucontext *context;
1210 	struct bnxt_re_dev *rdev;
1211 	struct bnxt_re_pd *pd;
1212 	int rc, entries;
1213 	struct ib_srq *ib_srq = srq_in;
1214 	struct ib_pd *ib_pd = ib_srq->pd;
1215 	struct bnxt_re_srq *srq =
1216 		container_of(ib_srq, struct bnxt_re_srq, ibsrq);
1217 	u32 max_srq_count;
1218 
1219 	pd = to_bnxt_re(ib_pd, struct bnxt_re_pd, ibpd);
1220 	rdev = pd->rdev;
1221 	dev_attr = rdev->dev_attr;
1222 
1223 	if (rdev->mod_exit) {
1224 		dev_dbg(rdev_to_dev(rdev), "%s(): in mod_exit, just return!\n", __func__);
1225 		rc = -EIO;
1226 		goto exit;
1227 	}
1228 
1229 	if (srq_init_attr->srq_type != IB_SRQT_BASIC) {
1230 		dev_err(rdev_to_dev(rdev), "SRQ type not supported\n");
1231 		rc = -ENOTSUPP;
1232 		goto exit;
1233 	}
1234 
1235 	if (udata) {
1236 		context = pd->ibpd.uobject->context;
1237 		cntx = to_bnxt_re(context, struct bnxt_re_ucontext, ibucontext);
1238 	}
1239 
1240 	if (atomic_read(&rdev->stats.rsors.srq_count) >= dev_attr->max_srq) {
1241 		dev_err(rdev_to_dev(rdev), "Create SRQ failed - max exceeded(SRQs)\n");
1242 		rc = -EINVAL;
1243 		goto exit;
1244 	}
1245 
1246 	if (srq_init_attr->attr.max_wr >= dev_attr->max_srq_wqes) {
1247 		dev_err(rdev_to_dev(rdev), "Create SRQ failed - max exceeded(SRQ_WQs)\n");
1248 		rc = -EINVAL;
1249 		goto exit;
1250 	}
1251 
1252 	srq->rdev = rdev;
1253 	srq->qplib_srq.pd = &pd->qplib_pd;
1254 	srq->qplib_srq.dpi = &rdev->dpi_privileged;
1255 
1256 	/* Allocate 1 more than what's provided so posting max doesn't
1257 	   mean empty */
1258 	entries = srq_init_attr->attr.max_wr + 1;
1259 	entries = bnxt_re_init_depth(entries, cntx);
1260 	if (entries > dev_attr->max_srq_wqes + 1)
1261 		entries = dev_attr->max_srq_wqes + 1;
1262 
1263 	srq->qplib_srq.wqe_size = _max_rwqe_sz(6); /* 128 byte wqe size */
1264 	srq->qplib_srq.max_wqe = entries;
1265 	srq->qplib_srq.max_sge = srq_init_attr->attr.max_sge;
1266 	srq->qplib_srq.threshold = srq_init_attr->attr.srq_limit;
1267 	srq->srq_limit = srq_init_attr->attr.srq_limit;
1268 	srq->qplib_srq.eventq_hw_ring_id = rdev->nqr.nq[0].ring_id;
1269 	srq->qplib_srq.sginfo.pgsize = PAGE_SIZE;
1270 	srq->qplib_srq.sginfo.pgshft = PAGE_SHIFT;
1271 
1272 	if (udata) {
1273 		rc = bnxt_re_init_user_srq(rdev, pd, srq, udata);
1274 		if (rc)
1275 			goto fail;
1276 	}
1277 
1278 	rc = bnxt_qplib_create_srq(&rdev->qplib_res, &srq->qplib_srq);
1279 	if (rc) {
1280 		dev_err(rdev_to_dev(rdev), "Create HW SRQ failed!\n");
1281 		goto fail;
1282 	}
1283 
1284 	if (udata) {
1285 		struct bnxt_re_srq_resp resp;
1286 
1287 		resp.srqid = srq->qplib_srq.id;
1288 		rc = bnxt_re_copy_to_udata(rdev, &resp,
1289 					   min(udata->outlen, sizeof(resp)),
1290 					   udata);
1291 		if (rc) {
1292 			bnxt_qplib_destroy_srq(&rdev->qplib_res, &srq->qplib_srq);
1293 			goto fail;
1294 		}
1295 	}
1296 	atomic_inc(&rdev->stats.rsors.srq_count);
1297 	max_srq_count = atomic_read(&rdev->stats.rsors.srq_count);
1298 	if (max_srq_count > atomic_read(&rdev->stats.rsors.max_srq_count))
1299 		atomic_set(&rdev->stats.rsors.max_srq_count, max_srq_count);
1300 	spin_lock_init(&srq->lock);
1301 
1302 	return 0;
1303 fail:
1304 	if (udata && srq->umem && !IS_ERR(srq->umem)) {
1305 		ib_umem_release(srq->umem);
1306 		srq->umem = NULL;
1307 	}
1308 exit:
1309 	return rc;
1310 }
1311 
bnxt_re_modify_srq(struct ib_srq * ib_srq,struct ib_srq_attr * srq_attr,enum ib_srq_attr_mask srq_attr_mask,struct ib_udata * udata)1312 int bnxt_re_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *srq_attr,
1313 		       enum ib_srq_attr_mask srq_attr_mask,
1314 		       struct ib_udata *udata)
1315 {
1316 	struct bnxt_re_srq *srq = to_bnxt_re(ib_srq, struct bnxt_re_srq,
1317 					     ibsrq);
1318 	struct bnxt_re_dev *rdev = srq->rdev;
1319 	int rc;
1320 
1321 	switch (srq_attr_mask) {
1322 	case IB_SRQ_MAX_WR:
1323 		/* SRQ resize is not supported */
1324 		break;
1325 	case IB_SRQ_LIMIT:
1326 		/* Change the SRQ threshold */
1327 		if (srq_attr->srq_limit > srq->qplib_srq.max_wqe)
1328 			return -EINVAL;
1329 
1330 		srq->qplib_srq.threshold = srq_attr->srq_limit;
1331 		rc = bnxt_qplib_modify_srq(&rdev->qplib_res, &srq->qplib_srq);
1332 		if (rc) {
1333 			dev_err(rdev_to_dev(rdev), "Modify HW SRQ failed!\n");
1334 			return rc;
1335 		}
1336 		/* On success, update the shadow */
1337 		srq->srq_limit = srq_attr->srq_limit;
1338 
1339 		if (udata) {
1340 			/* Build and send response back to udata */
1341 			rc = bnxt_re_copy_to_udata(rdev, srq, 0, udata);
1342 			if (rc)
1343 				return rc;
1344 		}
1345 		break;
1346 	default:
1347 		dev_err(rdev_to_dev(rdev),
1348 			"Unsupported srq_attr_mask 0x%x\n", srq_attr_mask);
1349 		return -EINVAL;
1350 	}
1351 	return 0;
1352 }
1353 
bnxt_re_query_srq(struct ib_srq * ib_srq,struct ib_srq_attr * srq_attr)1354 int bnxt_re_query_srq(struct ib_srq *ib_srq, struct ib_srq_attr *srq_attr)
1355 {
1356 	struct bnxt_re_srq *srq = to_bnxt_re(ib_srq, struct bnxt_re_srq,
1357 					     ibsrq);
1358 	struct bnxt_re_dev *rdev = srq->rdev;
1359 	int rc;
1360 
1361 	rc = bnxt_qplib_query_srq(&rdev->qplib_res, &srq->qplib_srq);
1362 	if (rc) {
1363 		dev_err(rdev_to_dev(rdev), "Query HW SRQ (0x%x) failed! rc = %d\n",
1364 			srq->qplib_srq.id, rc);
1365 		return rc;
1366 	}
1367 	srq_attr->max_wr = srq->qplib_srq.max_wqe;
1368 	srq_attr->max_sge = srq->qplib_srq.max_sge;
1369 	srq_attr->srq_limit = srq->qplib_srq.threshold;
1370 
1371 	return 0;
1372 }
1373 
bnxt_re_post_srq_recv(struct ib_srq * ib_srq,const struct ib_recv_wr * wr,const struct ib_recv_wr ** bad_wr)1374 int bnxt_re_post_srq_recv(struct ib_srq *ib_srq, const struct ib_recv_wr *wr,
1375 			  const struct ib_recv_wr **bad_wr)
1376 {
1377 	struct bnxt_re_srq *srq = to_bnxt_re(ib_srq, struct bnxt_re_srq,
1378 					     ibsrq);
1379 	struct bnxt_qplib_swqe wqe = {};
1380 	unsigned long flags;
1381 	int rc = 0;
1382 
1383 	spin_lock_irqsave(&srq->lock, flags);
1384 	while (wr) {
1385 		/* Transcribe each ib_recv_wr to qplib_swqe */
1386 		wqe.num_sge = wr->num_sge;
1387 		wqe.sg_list = (struct bnxt_qplib_sge *)wr->sg_list;
1388 		wqe.wr_id = wr->wr_id;
1389 		wqe.type = BNXT_QPLIB_SWQE_TYPE_RECV;
1390 		rc = bnxt_qplib_post_srq_recv(&srq->qplib_srq, &wqe);
1391 		if (rc) {
1392 			*bad_wr = wr;
1393 			break;
1394 		}
1395 		wr = wr->next;
1396 	}
1397 	spin_unlock_irqrestore(&srq->lock, flags);
1398 
1399 	return rc;
1400 }
1401 
bnxt_re_lock_cqs(struct bnxt_re_qp * qp)1402 unsigned long bnxt_re_lock_cqs(struct bnxt_re_qp *qp)
1403 {
1404 	unsigned long flags;
1405 
1406 	spin_lock_irqsave(&qp->scq->cq_lock, flags);
1407 	if (qp->rcq && qp->rcq != qp->scq)
1408 		spin_lock(&qp->rcq->cq_lock);
1409 
1410 	return flags;
1411 }
1412 
bnxt_re_unlock_cqs(struct bnxt_re_qp * qp,unsigned long flags)1413 void bnxt_re_unlock_cqs(struct bnxt_re_qp *qp,
1414 				  unsigned long flags)
1415 {
1416 	if (qp->rcq && qp->rcq != qp->scq)
1417 		spin_unlock(&qp->rcq->cq_lock);
1418 	spin_unlock_irqrestore(&qp->scq->cq_lock, flags);
1419 }
1420 
1421 /* Queue Pairs */
bnxt_re_destroy_gsi_sqp(struct bnxt_re_qp * qp)1422 static int bnxt_re_destroy_gsi_sqp(struct bnxt_re_qp *qp)
1423 {
1424 	struct bnxt_re_qp *gsi_sqp;
1425 	struct bnxt_re_ah *gsi_sah;
1426 	struct bnxt_re_dev *rdev;
1427 	unsigned long flags;
1428 	int rc = 0;
1429 
1430 	rdev = qp->rdev;
1431 	gsi_sqp = rdev->gsi_ctx.gsi_sqp;
1432 	gsi_sah = rdev->gsi_ctx.gsi_sah;
1433 
1434 	/* remove from active qp list */
1435 	mutex_lock(&rdev->qp_lock);
1436 	list_del(&gsi_sqp->list);
1437 	mutex_unlock(&rdev->qp_lock);
1438 
1439 	if (gsi_sah) {
1440 		dev_dbg(rdev_to_dev(rdev), "Destroy the shadow AH\n");
1441 		rc = bnxt_qplib_destroy_ah(&rdev->qplib_res, &gsi_sah->qplib_ah,
1442 					   true);
1443 		if (rc)
1444 			dev_err(rdev_to_dev(rdev),
1445 				"Destroy HW AH for shadow QP failed!\n");
1446 		atomic_dec(&rdev->stats.rsors.ah_count);
1447 	}
1448 
1449 	dev_dbg(rdev_to_dev(rdev), "Destroy the shadow QP\n");
1450 	rc = bnxt_qplib_destroy_qp(&rdev->qplib_res, &gsi_sqp->qplib_qp);
1451 	if (rc)
1452 		dev_err(rdev_to_dev(rdev), "Destroy Shadow QP failed\n");
1453 
1454 	/* Clean the CQ for shadow QP completions */
1455 	flags = bnxt_re_lock_cqs(gsi_sqp);
1456 	bnxt_qplib_clean_qp(&gsi_sqp->qplib_qp);
1457 	bnxt_re_unlock_cqs(gsi_sqp, flags);
1458 
1459 	bnxt_qplib_free_qp_res(&rdev->qplib_res, &gsi_sqp->qplib_qp);
1460 	bnxt_qplib_free_hdr_buf(&rdev->qplib_res, &gsi_sqp->qplib_qp);
1461 	kfree(rdev->gsi_ctx.sqp_tbl);
1462 	kfree(gsi_sah);
1463 	kfree(gsi_sqp);
1464 	rdev->gsi_ctx.gsi_sqp = NULL;
1465 	rdev->gsi_ctx.gsi_sah = NULL;
1466 	rdev->gsi_ctx.sqp_tbl = NULL;
1467 	atomic_dec(&rdev->stats.rsors.qp_count);
1468 
1469 	return 0;
1470 }
1471 
bnxt_re_dump_debug_stats(struct bnxt_re_dev * rdev,u32 active_qps)1472 static void bnxt_re_dump_debug_stats(struct bnxt_re_dev *rdev, u32 active_qps)
1473 {
1474 	u32	total_qp = 0;
1475 	u64	avg_time = 0;
1476 	int	i;
1477 
1478 	if (!rdev->rcfw.sp_perf_stats_enabled)
1479 		return;
1480 
1481 	switch (active_qps) {
1482 	case 1:
1483 		/* Potential hint for Test Stop */
1484 		for (i = 0; i < RCFW_MAX_STAT_INDEX; i++) {
1485 			if (rdev->rcfw.qp_destroy_stats[i]) {
1486 				total_qp++;
1487 				avg_time += rdev->rcfw.qp_destroy_stats[i];
1488 			}
1489 		}
1490 		if (total_qp >= 0 || avg_time >= 0)
1491 			dev_dbg(rdev_to_dev(rdev),
1492 				"Perf Debug: %ps Total (%d) QP destroyed in (%ld) msec\n",
1493 				__builtin_return_address(0), total_qp,
1494 				(long)jiffies_to_msecs(avg_time));
1495 		break;
1496 	case 2:
1497 		/* Potential hint for Test Start */
1498 		dev_dbg(rdev_to_dev(rdev),
1499 			"Perf Debug: %ps active_qps = %d\n",
1500 			__builtin_return_address(0), active_qps);
1501 		break;
1502 	default:
1503 		/* Potential hint to know latency of QP destroy.
1504 		 * Average time taken for 1K QP Destroy.
1505 		 */
1506 		if (active_qps > 1024 && !(active_qps % 1024))
1507 			dev_dbg(rdev_to_dev(rdev),
1508 				"Perf Debug: %ps Active QP (%d) Watermark (%d)\n",
1509 				__builtin_return_address(0), active_qps,
1510 				atomic_read(&rdev->stats.rsors.max_qp_count));
1511 		break;
1512 	}
1513 }
1514 
bnxt_re_destroy_qp(struct ib_qp * ib_qp,struct ib_udata * udata)1515 int bnxt_re_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata)
1516 {
1517 	struct bnxt_re_qp *qp = to_bnxt_re(ib_qp, struct bnxt_re_qp, ib_qp);
1518 	struct bnxt_re_dev *rdev = qp->rdev;
1519 	unsigned long flags;
1520 	u32 active_qps;
1521 	int rc;
1522 
1523 	mutex_lock(&rdev->qp_lock);
1524 	list_del(&qp->list);
1525 	active_qps = atomic_dec_return(&rdev->stats.rsors.qp_count);
1526 	if (qp->qplib_qp.type == CMDQ_CREATE_QP_TYPE_RC)
1527 		atomic_dec(&rdev->stats.rsors.rc_qp_count);
1528 	else if (qp->qplib_qp.type == CMDQ_CREATE_QP_TYPE_UD)
1529 		atomic_dec(&rdev->stats.rsors.ud_qp_count);
1530 	mutex_unlock(&rdev->qp_lock);
1531 
1532 	rc = bnxt_qplib_destroy_qp(&rdev->qplib_res, &qp->qplib_qp);
1533 	if (rc)
1534 		dev_err_ratelimited(rdev_to_dev(rdev),
1535 				   "%s id = %d failed rc = %d\n",
1536 				    __func__, qp->qplib_qp.id, rc);
1537 
1538 	if (!ib_qp->uobject) {
1539 		flags = bnxt_re_lock_cqs(qp);
1540 		bnxt_qplib_clean_qp(&qp->qplib_qp);
1541 		bnxt_re_unlock_cqs(qp, flags);
1542 	}
1543 
1544 	bnxt_qplib_free_qp_res(&rdev->qplib_res, &qp->qplib_qp);
1545 	if (ib_qp->qp_type == IB_QPT_GSI &&
1546 	    rdev->gsi_ctx.gsi_qp_mode != BNXT_RE_GSI_MODE_UD) {
1547 		if (rdev->gsi_ctx.gsi_qp_mode == BNXT_RE_GSI_MODE_ALL &&
1548 		    rdev->gsi_ctx.gsi_sqp) {
1549 			bnxt_re_destroy_gsi_sqp(qp);
1550 		}
1551 		bnxt_qplib_free_hdr_buf(&rdev->qplib_res, &qp->qplib_qp);
1552 	}
1553 
1554 	if (qp->rumem && !IS_ERR(qp->rumem))
1555 		ib_umem_release(qp->rumem);
1556 	if (qp->sumem && !IS_ERR(qp->sumem))
1557 		ib_umem_release(qp->sumem);
1558 	kfree(qp);
1559 
1560 	bnxt_re_dump_debug_stats(rdev, active_qps);
1561 
1562 	return 0;
1563 }
1564 
__from_ib_qp_type(enum ib_qp_type type)1565 static u8 __from_ib_qp_type(enum ib_qp_type type)
1566 {
1567 	switch (type) {
1568 	case IB_QPT_GSI:
1569 		return CMDQ_CREATE_QP1_TYPE_GSI;
1570 	case IB_QPT_RC:
1571 		return CMDQ_CREATE_QP_TYPE_RC;
1572 	case IB_QPT_UD:
1573 		return CMDQ_CREATE_QP_TYPE_UD;
1574 	case IB_QPT_RAW_ETHERTYPE:
1575 		return CMDQ_CREATE_QP_TYPE_RAW_ETHERTYPE;
1576 	default:
1577 		return IB_QPT_MAX;
1578 	}
1579 }
1580 
_get_swqe_sz(int nsge)1581 static u16 _get_swqe_sz(int nsge)
1582 {
1583 	return sizeof(struct sq_send_hdr) + nsge * sizeof(struct sq_sge);
1584 }
1585 
bnxt_re_get_swqe_size(int ilsize,int nsge)1586 static int bnxt_re_get_swqe_size(int ilsize, int nsge)
1587 {
1588 	u16 wqe_size, calc_ils;
1589 
1590 	wqe_size = _get_swqe_sz(nsge);
1591 	if (ilsize) {
1592 		calc_ils = (sizeof(struct sq_send_hdr) + ilsize);
1593 		wqe_size = max_t(int, calc_ils, wqe_size);
1594 		wqe_size = ALIGN(wqe_size, 32);
1595 	}
1596 	return wqe_size;
1597 }
1598 
bnxt_re_setup_swqe_size(struct bnxt_re_qp * qp,struct ib_qp_init_attr * init_attr)1599 static int bnxt_re_setup_swqe_size(struct bnxt_re_qp *qp,
1600 				   struct ib_qp_init_attr *init_attr)
1601 {
1602 	struct bnxt_qplib_dev_attr *dev_attr;
1603 	struct bnxt_qplib_qp *qplqp;
1604 	struct bnxt_re_dev *rdev;
1605 	struct bnxt_qplib_q *sq;
1606 	int align, ilsize;
1607 
1608 	rdev = qp->rdev;
1609 	qplqp = &qp->qplib_qp;
1610 	sq = &qplqp->sq;
1611 	dev_attr = rdev->dev_attr;
1612 
1613 	align = sizeof(struct sq_send_hdr);
1614 	ilsize = ALIGN(init_attr->cap.max_inline_data, align);
1615 
1616 	sq->wqe_size = bnxt_re_get_swqe_size(ilsize, sq->max_sge);
1617 	if (sq->wqe_size > _get_swqe_sz(dev_attr->max_qp_sges))
1618 		return -EINVAL;
1619 	/* For Cu/Wh and gen p5 backward compatibility mode
1620 	 * wqe size is fixed to 128 bytes
1621 	 */
1622 	if (sq->wqe_size < _get_swqe_sz(dev_attr->max_qp_sges) &&
1623 	    qplqp->wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC)
1624 		sq->wqe_size = _get_swqe_sz(dev_attr->max_qp_sges);
1625 
1626 	if (init_attr->cap.max_inline_data) {
1627 		qplqp->max_inline_data = sq->wqe_size -
1628 					 sizeof(struct sq_send_hdr);
1629 		init_attr->cap.max_inline_data = qplqp->max_inline_data;
1630 		if (qplqp->wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC)
1631 			sq->max_sge = qplqp->max_inline_data /
1632 				      sizeof(struct sq_sge);
1633 	}
1634 
1635 	return 0;
1636 }
1637 
bnxt_re_init_user_qp(struct bnxt_re_dev * rdev,struct bnxt_re_pd * pd,struct bnxt_re_qp * qp,struct ib_udata * udata)1638 static int bnxt_re_init_user_qp(struct bnxt_re_dev *rdev,
1639 				struct bnxt_re_pd *pd, struct bnxt_re_qp *qp,
1640 				struct ib_udata *udata)
1641 {
1642 	struct bnxt_qplib_sg_info *sginfo;
1643 	struct bnxt_qplib_qp *qplib_qp;
1644 	struct bnxt_re_ucontext *cntx;
1645 	struct ib_ucontext *context;
1646 	struct bnxt_re_qp_req ureq;
1647 	struct ib_umem *umem;
1648 	int rc, bytes = 0;
1649 	int psn_nume;
1650 	int psn_sz;
1651 
1652 	qplib_qp = &qp->qplib_qp;
1653 	context = pd->ibpd.uobject->context;
1654 	cntx = to_bnxt_re(context, struct bnxt_re_ucontext, ibucontext);
1655 	sginfo = &qplib_qp->sq.sginfo;
1656 
1657 	if (udata->inlen < sizeof(ureq))
1658 		dev_warn(rdev_to_dev(rdev),
1659 			 "Update the library ulen %d klen %d\n",
1660 			 (unsigned int)udata->inlen,
1661 			 (unsigned int)sizeof(ureq));
1662 
1663 	rc = ib_copy_from_udata(&ureq, udata,
1664 				min(udata->inlen, sizeof(ureq)));
1665 	if (rc)
1666 		return rc;
1667 
1668 	bytes = (qplib_qp->sq.max_wqe * qplib_qp->sq.wqe_size);
1669 	/* Consider mapping PSN search memory only for RC QPs. */
1670 	if (qplib_qp->type == CMDQ_CREATE_QP_TYPE_RC) {
1671 		psn_sz = _is_chip_gen_p5_p7(rdev->chip_ctx) ?
1672 				sizeof(struct sq_psn_search_ext) :
1673 				sizeof(struct sq_psn_search);
1674 		if (rdev->dev_attr && BNXT_RE_HW_RETX(rdev->dev_attr->dev_cap_flags))
1675 			psn_sz = sizeof(struct sq_msn_search);
1676 		psn_nume = (qplib_qp->wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC) ?
1677 			    qplib_qp->sq.max_wqe :
1678 			    ((qplib_qp->sq.max_wqe * qplib_qp->sq.wqe_size) /
1679 			     sizeof(struct bnxt_qplib_sge));
1680 		if (BNXT_RE_HW_RETX(rdev->dev_attr->dev_cap_flags))
1681 			psn_nume = roundup_pow_of_two(psn_nume);
1682 
1683 		bytes += (psn_nume * psn_sz);
1684 	}
1685 	bytes = PAGE_ALIGN(bytes);
1686 	umem = ib_umem_get_compat(rdev, context, udata, ureq.qpsva, bytes,
1687 				  IB_ACCESS_LOCAL_WRITE, 1);
1688 	if (IS_ERR(umem)) {
1689 		dev_err(rdev_to_dev(rdev), "%s: ib_umem_get failed with %ld\n",
1690 			__func__, PTR_ERR(umem));
1691 		return PTR_ERR(umem);
1692 	}
1693 
1694 	qp->sumem = umem;
1695 	/* pgsize and pgshft were initialize already. */
1696 	sginfo->sghead = get_ib_umem_sgl(umem, &sginfo->nmap);
1697 	sginfo->npages = ib_umem_num_pages_compat(umem);
1698 	qplib_qp->qp_handle = ureq.qp_handle;
1699 
1700 	if (!qp->qplib_qp.srq) {
1701 		sginfo = &qplib_qp->rq.sginfo;
1702 		bytes = (qplib_qp->rq.max_wqe * qplib_qp->rq.wqe_size);
1703 		bytes = PAGE_ALIGN(bytes);
1704 		umem = ib_umem_get_compat(rdev,
1705 					  context, udata, ureq.qprva, bytes,
1706 					  IB_ACCESS_LOCAL_WRITE, 1);
1707 		if (IS_ERR(umem)) {
1708 			dev_err(rdev_to_dev(rdev),
1709 				"%s: ib_umem_get failed ret =%ld\n",
1710 				__func__, PTR_ERR(umem));
1711 			goto rqfail;
1712 		}
1713 		qp->rumem = umem;
1714 		/* pgsize and pgshft were initialize already. */
1715 		sginfo->sghead = get_ib_umem_sgl(umem, &sginfo->nmap);
1716 		sginfo->npages = ib_umem_num_pages_compat(umem);
1717 	}
1718 
1719 	qplib_qp->dpi = &cntx->dpi;
1720 	qplib_qp->is_user = true;
1721 
1722 	return 0;
1723 rqfail:
1724 	ib_umem_release(qp->sumem);
1725 	qp->sumem = NULL;
1726 	qplib_qp->sq.sginfo.sghead = NULL;
1727 	qplib_qp->sq.sginfo.nmap = 0;
1728 
1729 	return PTR_ERR(umem);
1730 }
1731 
bnxt_re_create_shadow_qp_ah(struct bnxt_re_pd * pd,struct bnxt_qplib_res * qp1_res,struct bnxt_qplib_qp * qp1_qp)1732 static struct bnxt_re_ah *bnxt_re_create_shadow_qp_ah(struct bnxt_re_pd *pd,
1733 					       struct bnxt_qplib_res *qp1_res,
1734 					       struct bnxt_qplib_qp *qp1_qp)
1735 {
1736 	struct bnxt_re_dev *rdev = pd->rdev;
1737 	struct bnxt_re_ah *ah;
1738 	union ib_gid sgid;
1739 	int rc;
1740 
1741 	ah = kzalloc(sizeof(*ah), GFP_KERNEL);
1742 	if (!ah) {
1743 		dev_err(rdev_to_dev(rdev), "Allocate Address Handle failed!\n");
1744 		return NULL;
1745 	}
1746 	memset(ah, 0, sizeof(*ah));
1747 	ah->rdev = rdev;
1748 	ah->qplib_ah.pd = &pd->qplib_pd;
1749 
1750 	rc = bnxt_re_query_gid(&rdev->ibdev, 1, 0, &sgid);
1751 	if (rc)
1752 		goto fail;
1753 
1754 	/* supply the dgid data same as sgid */
1755 	memcpy(ah->qplib_ah.dgid.data, &sgid.raw,
1756 	       sizeof(union ib_gid));
1757 	ah->qplib_ah.sgid_index = 0;
1758 
1759 	ah->qplib_ah.traffic_class = 0;
1760 	ah->qplib_ah.flow_label = 0;
1761 	ah->qplib_ah.hop_limit = 1;
1762 	ah->qplib_ah.sl = 0;
1763 	/* Have DMAC same as SMAC */
1764 	ether_addr_copy(ah->qplib_ah.dmac, rdev->dev_addr);
1765 	dev_dbg(rdev_to_dev(rdev), "ah->qplib_ah.dmac = %x:%x:%x:%x:%x:%x\n",
1766 		ah->qplib_ah.dmac[0], ah->qplib_ah.dmac[1], ah->qplib_ah.dmac[2],
1767 		ah->qplib_ah.dmac[3], ah->qplib_ah.dmac[4], ah->qplib_ah.dmac[5]);
1768 
1769 	rc = bnxt_qplib_create_ah(&rdev->qplib_res, &ah->qplib_ah, true);
1770 	if (rc) {
1771 		dev_err(rdev_to_dev(rdev),
1772 			"Allocate HW AH for Shadow QP failed!\n");
1773 		goto fail;
1774 	}
1775 	dev_dbg(rdev_to_dev(rdev), "AH ID = %d\n", ah->qplib_ah.id);
1776 	atomic_inc(&rdev->stats.rsors.ah_count);
1777 
1778 	return ah;
1779 fail:
1780 	kfree(ah);
1781 	return NULL;
1782 }
1783 
bnxt_re_update_shadow_ah(struct bnxt_re_dev * rdev)1784 void bnxt_re_update_shadow_ah(struct bnxt_re_dev *rdev)
1785 {
1786 	struct bnxt_re_qp *gsi_qp;
1787 	struct bnxt_re_ah *sah;
1788 	struct bnxt_re_pd *pd;
1789 	struct ib_pd *ib_pd;
1790 	int rc;
1791 
1792 	if (!rdev)
1793 		return;
1794 
1795 	sah = rdev->gsi_ctx.gsi_sah;
1796 
1797 	dev_dbg(rdev_to_dev(rdev), "Updating the AH\n");
1798 	if (sah) {
1799 		/* Check if the AH created with current mac address */
1800 		if (!compare_ether_header(sah->qplib_ah.dmac, rdev->dev_addr)) {
1801 			dev_dbg(rdev_to_dev(rdev),
1802 				"Not modifying shadow AH during AH update\n");
1803 			return;
1804 		}
1805 
1806 		gsi_qp = rdev->gsi_ctx.gsi_qp;
1807 		ib_pd = gsi_qp->ib_qp.pd;
1808 		pd = to_bnxt_re(ib_pd, struct bnxt_re_pd, ibpd);
1809 		rc = bnxt_qplib_destroy_ah(&rdev->qplib_res,
1810 					   &sah->qplib_ah, false);
1811 		if (rc) {
1812 			dev_err(rdev_to_dev(rdev),
1813 				"Failed to destroy shadow AH during AH update\n");
1814 			return;
1815 		}
1816 		atomic_dec(&rdev->stats.rsors.ah_count);
1817 		kfree(sah);
1818 		rdev->gsi_ctx.gsi_sah = NULL;
1819 
1820 		sah = bnxt_re_create_shadow_qp_ah(pd, &rdev->qplib_res,
1821 						  &gsi_qp->qplib_qp);
1822 		if (!sah) {
1823 			dev_err(rdev_to_dev(rdev),
1824 				"Failed to update AH for ShadowQP\n");
1825 			return;
1826 		}
1827 		rdev->gsi_ctx.gsi_sah = sah;
1828 		atomic_inc(&rdev->stats.rsors.ah_count);
1829 	}
1830 }
1831 
bnxt_re_create_shadow_qp(struct bnxt_re_pd * pd,struct bnxt_qplib_res * qp1_res,struct bnxt_qplib_qp * qp1_qp)1832 static struct bnxt_re_qp *bnxt_re_create_shadow_qp(struct bnxt_re_pd *pd,
1833 					    struct bnxt_qplib_res *qp1_res,
1834 					    struct bnxt_qplib_qp *qp1_qp)
1835 {
1836 	struct bnxt_re_dev *rdev = pd->rdev;
1837 	struct bnxt_re_qp *qp;
1838 	int rc;
1839 
1840 	qp = kzalloc(sizeof(*qp), GFP_KERNEL);
1841 	if (!qp) {
1842 		dev_err(rdev_to_dev(rdev), "Allocate internal UD QP failed!\n");
1843 		return NULL;
1844 	}
1845 	memset(qp, 0, sizeof(*qp));
1846 	qp->rdev = rdev;
1847 
1848 	/* Initialize the shadow QP structure from the QP1 values */
1849 	ether_addr_copy(qp->qplib_qp.smac, rdev->dev_addr);
1850 	qp->qplib_qp.pd = &pd->qplib_pd;
1851 	qp->qplib_qp.qp_handle = (u64)&qp->qplib_qp;
1852 	qp->qplib_qp.type = IB_QPT_UD;
1853 
1854 	qp->qplib_qp.max_inline_data = 0;
1855 	qp->qplib_qp.sig_type = true;
1856 
1857 	/* Shadow QP SQ depth should be same as QP1 RQ depth */
1858 	qp->qplib_qp.sq.wqe_size = bnxt_re_get_swqe_size(0, 6);
1859 	qp->qplib_qp.sq.max_wqe = qp1_qp->rq.max_wqe;
1860 	qp->qplib_qp.sq.max_sge = 2;
1861 	/* Q full delta can be 1 since it is internal QP */
1862 	qp->qplib_qp.sq.q_full_delta = 1;
1863 	qp->qplib_qp.sq.sginfo.pgsize = PAGE_SIZE;
1864 	qp->qplib_qp.sq.sginfo.pgshft = PAGE_SHIFT;
1865 
1866 	qp->qplib_qp.scq = qp1_qp->scq;
1867 	qp->qplib_qp.rcq = qp1_qp->rcq;
1868 
1869 	qp->qplib_qp.rq.wqe_size = _max_rwqe_sz(6); /* 128 Byte wqe size */
1870 	qp->qplib_qp.rq.max_wqe = qp1_qp->rq.max_wqe;
1871 	qp->qplib_qp.rq.max_sge = qp1_qp->rq.max_sge;
1872 	qp->qplib_qp.rq.sginfo.pgsize = PAGE_SIZE;
1873 	qp->qplib_qp.rq.sginfo.pgshft = PAGE_SHIFT;
1874 	/* Q full delta can be 1 since it is internal QP */
1875 	qp->qplib_qp.rq.q_full_delta = 1;
1876 	qp->qplib_qp.mtu = qp1_qp->mtu;
1877 	qp->qplib_qp.dpi = &rdev->dpi_privileged;
1878 
1879 	rc = bnxt_qplib_alloc_hdr_buf(qp1_res, &qp->qplib_qp, 0,
1880 				      BNXT_QPLIB_MAX_GRH_HDR_SIZE_IPV6);
1881 	if (rc)
1882 		goto fail;
1883 
1884 	rc = bnxt_qplib_create_qp(qp1_res, &qp->qplib_qp);
1885 	if (rc) {
1886 		dev_err(rdev_to_dev(rdev), "create HW QP failed!\n");
1887 		goto qp_fail;
1888 	}
1889 
1890 	dev_dbg(rdev_to_dev(rdev), "Created shadow QP with ID = %d\n",
1891 		qp->qplib_qp.id);
1892 	spin_lock_init(&qp->sq_lock);
1893 	INIT_LIST_HEAD(&qp->list);
1894 	mutex_lock(&rdev->qp_lock);
1895 	list_add_tail(&qp->list, &rdev->qp_list);
1896 	atomic_inc(&rdev->stats.rsors.qp_count);
1897 	mutex_unlock(&rdev->qp_lock);
1898 	return qp;
1899 qp_fail:
1900 	bnxt_qplib_free_hdr_buf(qp1_res, &qp->qplib_qp);
1901 fail:
1902 	kfree(qp);
1903 	return NULL;
1904 }
1905 
bnxt_re_init_rq_attr(struct bnxt_re_qp * qp,struct ib_qp_init_attr * init_attr,void * cntx)1906 static int bnxt_re_init_rq_attr(struct bnxt_re_qp *qp,
1907 				struct ib_qp_init_attr *init_attr, void *cntx)
1908 {
1909 	struct bnxt_qplib_dev_attr *dev_attr;
1910 	struct bnxt_qplib_qp *qplqp;
1911 	struct bnxt_re_dev *rdev;
1912 	struct bnxt_qplib_q *rq;
1913 	int entries;
1914 
1915 	rdev = qp->rdev;
1916 	qplqp = &qp->qplib_qp;
1917 	rq = &qplqp->rq;
1918 	dev_attr = rdev->dev_attr;
1919 
1920 	if (init_attr->srq) {
1921 		struct bnxt_re_srq *srq;
1922 
1923 		srq = to_bnxt_re(init_attr->srq, struct bnxt_re_srq, ibsrq);
1924 		if (!srq) {
1925 			dev_err(rdev_to_dev(rdev), "SRQ not found\n");
1926 			return -EINVAL;
1927 		}
1928 		qplqp->srq = &srq->qplib_srq;
1929 		rq->max_wqe = 0;
1930 	} else {
1931 		rq->max_sge = init_attr->cap.max_recv_sge;
1932 		if (rq->max_sge > dev_attr->max_qp_sges)
1933 			rq->max_sge = dev_attr->max_qp_sges;
1934 		init_attr->cap.max_recv_sge = rq->max_sge;
1935 		rq->wqe_size = bnxt_re_get_rwqe_size(qplqp, rq->max_sge,
1936 						     dev_attr->max_qp_sges);
1937 
1938 		/* Allocate 1 more than what's provided so posting max doesn't
1939 		   mean empty */
1940 		entries = init_attr->cap.max_recv_wr + 1;
1941 		entries = bnxt_re_init_depth(entries, cntx);
1942 		rq->max_wqe = min_t(u32, entries, dev_attr->max_qp_wqes + 1);
1943 		rq->q_full_delta = 0;
1944 		rq->sginfo.pgsize = PAGE_SIZE;
1945 		rq->sginfo.pgshft = PAGE_SHIFT;
1946 	}
1947 
1948 	return 0;
1949 }
1950 
bnxt_re_adjust_gsi_rq_attr(struct bnxt_re_qp * qp)1951 static void bnxt_re_adjust_gsi_rq_attr(struct bnxt_re_qp *qp)
1952 {
1953 	struct bnxt_qplib_dev_attr *dev_attr;
1954 	struct bnxt_qplib_qp *qplqp;
1955 	struct bnxt_re_dev *rdev;
1956 
1957 	rdev = qp->rdev;
1958 	qplqp = &qp->qplib_qp;
1959 	dev_attr = rdev->dev_attr;
1960 
1961 	if (rdev->gsi_ctx.gsi_qp_mode != BNXT_RE_GSI_MODE_UD)
1962 		qplqp->rq.max_sge = dev_attr->max_qp_sges;
1963 }
1964 
bnxt_re_init_sq_attr(struct bnxt_re_qp * qp,struct ib_qp_init_attr * init_attr,void * cntx)1965 static int bnxt_re_init_sq_attr(struct bnxt_re_qp *qp,
1966 				struct ib_qp_init_attr *init_attr,
1967 				void *cntx)
1968 {
1969 	struct bnxt_qplib_dev_attr *dev_attr;
1970 	struct bnxt_qplib_qp *qplqp;
1971 	struct bnxt_re_dev *rdev;
1972 	struct bnxt_qplib_q *sq;
1973 	int diff = 0;
1974 	int entries;
1975 	int rc;
1976 
1977 	rdev = qp->rdev;
1978 	qplqp = &qp->qplib_qp;
1979 	sq = &qplqp->sq;
1980 	dev_attr = rdev->dev_attr;
1981 
1982 	sq->max_sge = init_attr->cap.max_send_sge;
1983 	if (sq->max_sge > dev_attr->max_qp_sges) {
1984 		sq->max_sge = dev_attr->max_qp_sges;
1985 		init_attr->cap.max_send_sge = sq->max_sge;
1986 	}
1987 	rc = bnxt_re_setup_swqe_size(qp, init_attr);
1988 	if (rc)
1989 		return rc;
1990 	/*
1991 	 * Change the SQ depth if user has requested minimum using
1992 	 * configfs. Only supported for kernel consumers. Setting
1993 	 * min_tx_depth to 4096 to handle iser SQ full condition
1994 	 * in most of the newer OS distros
1995 	 */
1996 	entries = init_attr->cap.max_send_wr;
1997 	if (!cntx && rdev->min_tx_depth && init_attr->qp_type != IB_QPT_GSI) {
1998 		/*
1999 		 * If users specify any value greater than 1 use min_tx_depth
2000 		 * provided by user for comparison. Else, compare it with the
2001 		 * BNXT_RE_MIN_KERNEL_QP_TX_DEPTH and adjust it accordingly.
2002 		 */
2003 		if (rdev->min_tx_depth > 1 && entries < rdev->min_tx_depth)
2004 			entries = rdev->min_tx_depth;
2005 		else if (entries < BNXT_RE_MIN_KERNEL_QP_TX_DEPTH)
2006 			entries = BNXT_RE_MIN_KERNEL_QP_TX_DEPTH;
2007 	}
2008 	diff = bnxt_re_get_diff(cntx, rdev->chip_ctx);
2009 	entries = bnxt_re_init_depth(entries + diff + 1, cntx);
2010 	sq->max_wqe = min_t(u32, entries, dev_attr->max_qp_wqes + diff + 1);
2011 	sq->q_full_delta = diff + 1;
2012 	/*
2013 	 * Reserving one slot for Phantom WQE. Application can
2014 	 * post one extra entry in this case. But allowing this to avoid
2015 	 * unexpected Queue full condition
2016 	 */
2017 	sq->q_full_delta -= 1; /* becomes 0 for gen-p5 */
2018 	sq->sginfo.pgsize = PAGE_SIZE;
2019 	sq->sginfo.pgshft = PAGE_SHIFT;
2020 	return 0;
2021 }
2022 
bnxt_re_adjust_gsi_sq_attr(struct bnxt_re_qp * qp,struct ib_qp_init_attr * init_attr,void * cntx)2023 static void bnxt_re_adjust_gsi_sq_attr(struct bnxt_re_qp *qp,
2024 				       struct ib_qp_init_attr *init_attr,
2025 				       void *cntx)
2026 {
2027 	struct bnxt_qplib_dev_attr *dev_attr;
2028 	struct bnxt_qplib_qp *qplqp;
2029 	struct bnxt_re_dev *rdev;
2030 	int entries;
2031 
2032 	rdev = qp->rdev;
2033 	qplqp = &qp->qplib_qp;
2034 	dev_attr = rdev->dev_attr;
2035 
2036 	if (rdev->gsi_ctx.gsi_qp_mode != BNXT_RE_GSI_MODE_UD) {
2037 		entries = init_attr->cap.max_send_wr + 1;
2038 		entries = bnxt_re_init_depth(entries, cntx);
2039 		qplqp->sq.max_wqe = min_t(u32, entries,
2040 					  dev_attr->max_qp_wqes + 1);
2041 		qplqp->sq.q_full_delta = qplqp->sq.max_wqe -
2042 					 init_attr->cap.max_send_wr;
2043 		qplqp->sq.max_sge++; /* Need one extra sge to put UD header */
2044 		if (qplqp->sq.max_sge > dev_attr->max_qp_sges)
2045 			qplqp->sq.max_sge = dev_attr->max_qp_sges;
2046 	}
2047 }
2048 
bnxt_re_init_qp_type(struct bnxt_re_dev * rdev,struct ib_qp_init_attr * init_attr)2049 static int bnxt_re_init_qp_type(struct bnxt_re_dev *rdev,
2050 				struct ib_qp_init_attr *init_attr)
2051 {
2052 	struct bnxt_qplib_chip_ctx *chip_ctx;
2053 	struct bnxt_re_gsi_context *gsi_ctx;
2054 	int qptype;
2055 
2056 	chip_ctx = rdev->chip_ctx;
2057 	gsi_ctx = &rdev->gsi_ctx;
2058 
2059 	qptype = __from_ib_qp_type(init_attr->qp_type);
2060 	if (qptype == IB_QPT_MAX) {
2061 		dev_err(rdev_to_dev(rdev), "QP type 0x%x not supported\n",
2062 			qptype);
2063 		qptype = -EINVAL;
2064 		goto out;
2065 	}
2066 
2067 	if (_is_chip_gen_p5_p7(chip_ctx) && init_attr->qp_type == IB_QPT_GSI) {
2068 		/* For Thor always force UD mode. */
2069 		qptype = CMDQ_CREATE_QP_TYPE_GSI;
2070 		gsi_ctx->gsi_qp_mode = BNXT_RE_GSI_MODE_UD;
2071 	}
2072 out:
2073 	return qptype;
2074 }
2075 
bnxt_re_init_qp_wqe_mode(struct bnxt_re_dev * rdev)2076 static int bnxt_re_init_qp_wqe_mode(struct bnxt_re_dev *rdev)
2077 {
2078 	return rdev->chip_ctx->modes.wqe_mode;
2079 }
2080 
bnxt_re_init_qp_attr(struct bnxt_re_qp * qp,struct bnxt_re_pd * pd,struct ib_qp_init_attr * init_attr,struct ib_udata * udata)2081 static int bnxt_re_init_qp_attr(struct bnxt_re_qp *qp, struct bnxt_re_pd *pd,
2082 				struct ib_qp_init_attr *init_attr,
2083 				struct ib_udata *udata)
2084 {
2085 	struct bnxt_qplib_dev_attr *dev_attr;
2086 	struct bnxt_re_ucontext *cntx = NULL;
2087 	struct ib_ucontext *context;
2088 	struct bnxt_qplib_qp *qplqp;
2089 	struct bnxt_re_dev *rdev;
2090 	struct bnxt_re_cq *cq;
2091 	int rc = 0, qptype;
2092 
2093 	rdev = qp->rdev;
2094 	qplqp = &qp->qplib_qp;
2095 	dev_attr = rdev->dev_attr;
2096 
2097 	if (udata) {
2098 		context = pd->ibpd.uobject->context;
2099 		cntx = to_bnxt_re(context, struct bnxt_re_ucontext, ibucontext);
2100 	}
2101 
2102 	/* Setup misc params */
2103 	qplqp->is_user = false;
2104 	qplqp->pd = &pd->qplib_pd;
2105 	qplqp->qp_handle = (u64)qplqp;
2106 	qplqp->sig_type = ((init_attr->sq_sig_type == IB_SIGNAL_ALL_WR) ?
2107 			    true : false);
2108 	qptype = bnxt_re_init_qp_type(rdev, init_attr);
2109 	if (qptype < 0) {
2110 		rc = qptype;
2111 		goto out;
2112 	}
2113 	qplqp->type = (u8)qptype;
2114 	qplqp->wqe_mode = bnxt_re_init_qp_wqe_mode(rdev);
2115 	ether_addr_copy(qplqp->smac, rdev->dev_addr);
2116 
2117 	if (init_attr->qp_type == IB_QPT_RC) {
2118 		qplqp->max_rd_atomic = dev_attr->max_qp_rd_atom;
2119 		qplqp->max_dest_rd_atomic = dev_attr->max_qp_init_rd_atom;
2120 	}
2121 	qplqp->mtu = ib_mtu_enum_to_int(iboe_get_mtu(if_getmtu(rdev->netdev)));
2122 	qplqp->dpi = &rdev->dpi_privileged; /* Doorbell page */
2123 	if (init_attr->create_flags) {
2124 		dev_dbg(rdev_to_dev(rdev),
2125 			"QP create flags 0x%x not supported\n",
2126 			init_attr->create_flags);
2127 		return -EOPNOTSUPP;
2128 	}
2129 
2130 	/* Setup CQs */
2131 	if (init_attr->send_cq) {
2132 		cq = to_bnxt_re(init_attr->send_cq, struct bnxt_re_cq, ibcq);
2133 		if (!cq) {
2134 			dev_err(rdev_to_dev(rdev), "Send CQ not found\n");
2135 			rc = -EINVAL;
2136 			goto out;
2137 		}
2138 		qplqp->scq = &cq->qplib_cq;
2139 		qp->scq = cq;
2140 	}
2141 
2142 	if (init_attr->recv_cq) {
2143 		cq = to_bnxt_re(init_attr->recv_cq, struct bnxt_re_cq, ibcq);
2144 		if (!cq) {
2145 			dev_err(rdev_to_dev(rdev), "Receive CQ not found\n");
2146 			rc = -EINVAL;
2147 			goto out;
2148 		}
2149 		qplqp->rcq = &cq->qplib_cq;
2150 		qp->rcq = cq;
2151 	}
2152 
2153 	/* Setup RQ/SRQ */
2154 	rc = bnxt_re_init_rq_attr(qp, init_attr, cntx);
2155 	if (rc)
2156 		goto out;
2157 	if (init_attr->qp_type == IB_QPT_GSI)
2158 		bnxt_re_adjust_gsi_rq_attr(qp);
2159 
2160 	/* Setup SQ */
2161 	rc = bnxt_re_init_sq_attr(qp, init_attr, cntx);
2162 	if (rc)
2163 		goto out;
2164 	if (init_attr->qp_type == IB_QPT_GSI)
2165 		bnxt_re_adjust_gsi_sq_attr(qp, init_attr, cntx);
2166 
2167 	if (udata) /* This will update DPI and qp_handle */
2168 		rc = bnxt_re_init_user_qp(rdev, pd, qp, udata);
2169 out:
2170 	return rc;
2171 }
2172 
bnxt_re_create_shadow_gsi(struct bnxt_re_qp * qp,struct bnxt_re_pd * pd)2173 static int bnxt_re_create_shadow_gsi(struct bnxt_re_qp *qp,
2174 				     struct bnxt_re_pd *pd)
2175 {
2176 	struct bnxt_re_sqp_entries *sqp_tbl = NULL;
2177 	struct bnxt_re_dev *rdev;
2178 	struct bnxt_re_qp *sqp;
2179 	struct bnxt_re_ah *sah;
2180 	int rc = 0;
2181 
2182 	rdev = qp->rdev;
2183 	/* Create a shadow QP to handle the QP1 traffic */
2184 	sqp_tbl = kzalloc(sizeof(*sqp_tbl) * BNXT_RE_MAX_GSI_SQP_ENTRIES,
2185 			  GFP_KERNEL);
2186 	if (!sqp_tbl)
2187 		return -ENOMEM;
2188 	rdev->gsi_ctx.sqp_tbl = sqp_tbl;
2189 
2190 	sqp = bnxt_re_create_shadow_qp(pd, &rdev->qplib_res, &qp->qplib_qp);
2191 	if (!sqp) {
2192 		rc = -ENODEV;
2193 		dev_err(rdev_to_dev(rdev),
2194 			"Failed to create Shadow QP for QP1\n");
2195 		goto out;
2196 	}
2197 	rdev->gsi_ctx.gsi_sqp = sqp;
2198 
2199 	sqp->rcq = qp->rcq;
2200 	sqp->scq = qp->scq;
2201 	sah = bnxt_re_create_shadow_qp_ah(pd, &rdev->qplib_res,
2202 			&qp->qplib_qp);
2203 	if (!sah) {
2204 		bnxt_qplib_destroy_qp(&rdev->qplib_res,
2205 				&sqp->qplib_qp);
2206 		rc = -ENODEV;
2207 		dev_err(rdev_to_dev(rdev),
2208 				"Failed to create AH entry for ShadowQP\n");
2209 		goto out;
2210 	}
2211 	rdev->gsi_ctx.gsi_sah = sah;
2212 
2213 	return 0;
2214 out:
2215 	kfree(sqp_tbl);
2216 	return rc;
2217 }
2218 
__get_rq_hdr_buf_size(u8 gsi_mode)2219 static int __get_rq_hdr_buf_size(u8 gsi_mode)
2220 {
2221 	return (gsi_mode == BNXT_RE_GSI_MODE_ALL) ?
2222 		BNXT_QPLIB_MAX_QP1_RQ_HDR_SIZE_V2 :
2223 		BNXT_QPLIB_MAX_QP1_RQ_HDR_SIZE;
2224 }
2225 
__get_sq_hdr_buf_size(u8 gsi_mode)2226 static int __get_sq_hdr_buf_size(u8 gsi_mode)
2227 {
2228 	return (gsi_mode != BNXT_RE_GSI_MODE_ROCE_V1) ?
2229 		BNXT_QPLIB_MAX_QP1_SQ_HDR_SIZE_V2 :
2230 		BNXT_QPLIB_MAX_QP1_SQ_HDR_SIZE;
2231 }
2232 
bnxt_re_create_gsi_qp(struct bnxt_re_qp * qp,struct bnxt_re_pd * pd)2233 static int bnxt_re_create_gsi_qp(struct bnxt_re_qp *qp, struct bnxt_re_pd *pd)
2234 {
2235 	struct bnxt_qplib_qp *qplqp;
2236 	struct bnxt_qplib_res *res;
2237 	struct bnxt_re_dev *rdev;
2238 	u32 sstep, rstep;
2239 	u8 gsi_mode;
2240 	int rc = 0;
2241 
2242 	rdev = qp->rdev;
2243 	qplqp = &qp->qplib_qp;
2244 	res = &rdev->qplib_res;
2245 	gsi_mode = rdev->gsi_ctx.gsi_qp_mode;
2246 
2247 	rstep = __get_rq_hdr_buf_size(gsi_mode);
2248 	sstep = __get_sq_hdr_buf_size(gsi_mode);
2249 	rc = bnxt_qplib_alloc_hdr_buf(res, qplqp, sstep, rstep);
2250 	if (rc)
2251 		goto out;
2252 
2253 	rc = bnxt_qplib_create_qp1(res, qplqp);
2254 	if (rc) {
2255 		dev_err(rdev_to_dev(rdev), "create HW QP1 failed!\n");
2256 		goto out;
2257 	}
2258 
2259 	if (gsi_mode == BNXT_RE_GSI_MODE_ALL)
2260 		rc = bnxt_re_create_shadow_gsi(qp, pd);
2261 out:
2262 	return rc;
2263 }
2264 
bnxt_re_test_qp_limits(struct bnxt_re_dev * rdev,struct ib_qp_init_attr * init_attr,struct bnxt_qplib_dev_attr * dev_attr)2265 static bool bnxt_re_test_qp_limits(struct bnxt_re_dev *rdev,
2266 				   struct ib_qp_init_attr *init_attr,
2267 				   struct bnxt_qplib_dev_attr *dev_attr)
2268 {
2269 	bool rc = true;
2270 	int ilsize;
2271 
2272 	ilsize = ALIGN(init_attr->cap.max_inline_data, sizeof(struct sq_sge));
2273 	if ((init_attr->cap.max_send_wr > dev_attr->max_qp_wqes) ||
2274 	    (init_attr->cap.max_recv_wr > dev_attr->max_qp_wqes) ||
2275 	    (init_attr->cap.max_send_sge > dev_attr->max_qp_sges) ||
2276 	    (init_attr->cap.max_recv_sge > dev_attr->max_qp_sges) ||
2277 	    (ilsize > dev_attr->max_inline_data)) {
2278 		dev_err(rdev_to_dev(rdev), "Create QP failed - max exceeded! "
2279 			"0x%x/0x%x 0x%x/0x%x 0x%x/0x%x "
2280 			"0x%x/0x%x 0x%x/0x%x\n",
2281 			init_attr->cap.max_send_wr, dev_attr->max_qp_wqes,
2282 			init_attr->cap.max_recv_wr, dev_attr->max_qp_wqes,
2283 			init_attr->cap.max_send_sge, dev_attr->max_qp_sges,
2284 			init_attr->cap.max_recv_sge, dev_attr->max_qp_sges,
2285 			init_attr->cap.max_inline_data,
2286 			dev_attr->max_inline_data);
2287 		rc = false;
2288 	}
2289 	return rc;
2290 }
2291 
2292 static inline struct
__get_qp_from_qp_in(struct ib_pd * qp_in,struct bnxt_re_dev * rdev)2293 bnxt_re_qp *__get_qp_from_qp_in(struct ib_pd *qp_in,
2294 				struct bnxt_re_dev *rdev)
2295 {
2296 	struct bnxt_re_qp *qp;
2297 
2298 	qp = kzalloc(sizeof(*qp), GFP_KERNEL);
2299 	if (!qp)
2300 		dev_err(rdev_to_dev(rdev), "Allocate QP failed!\n");
2301 	return qp;
2302 }
2303 
bnxt_re_create_qp(struct ib_pd * qp_in,struct ib_qp_init_attr * qp_init_attr,struct ib_udata * udata)2304 struct ib_qp *bnxt_re_create_qp(struct ib_pd *qp_in,
2305 			       struct ib_qp_init_attr *qp_init_attr,
2306 			       struct ib_udata *udata)
2307 {
2308 	struct bnxt_re_pd *pd;
2309 	struct ib_pd *ib_pd = qp_in;
2310 	struct bnxt_qplib_dev_attr *dev_attr;
2311 	struct bnxt_re_dev *rdev;
2312 	u32 active_qps, tmp_qps;
2313 	struct bnxt_re_qp *qp;
2314 	int rc;
2315 
2316 	pd = to_bnxt_re(ib_pd, struct bnxt_re_pd, ibpd);
2317 	rdev = pd->rdev;
2318 	dev_attr = rdev->dev_attr;
2319 	if (rdev->mod_exit) {
2320 		rc = -EIO;
2321 		dev_dbg(rdev_to_dev(rdev), "%s(): in mod_exit, just return!\n", __func__);
2322 		goto exit;
2323 	}
2324 
2325 	if (atomic_read(&rdev->stats.rsors.qp_count) >= dev_attr->max_qp) {
2326 		dev_err(rdev_to_dev(rdev), "Create QP failed - max exceeded(QPs Alloc'd %u of max %u)\n",
2327 			atomic_read(&rdev->stats.rsors.qp_count), dev_attr->max_qp);
2328 		rc = -EINVAL;
2329 		goto exit;
2330 	}
2331 
2332 	rc = bnxt_re_test_qp_limits(rdev, qp_init_attr, dev_attr);
2333 	if (!rc) {
2334 		rc = -EINVAL;
2335 		goto exit;
2336 	}
2337 	qp = __get_qp_from_qp_in(qp_in, rdev);
2338 	if (!qp) {
2339 		rc = -ENOMEM;
2340 		goto exit;
2341 	}
2342 	qp->rdev = rdev;
2343 
2344 	rc = bnxt_re_init_qp_attr(qp, pd, qp_init_attr, udata);
2345 	if (rc)
2346 		goto fail;
2347 
2348 	if (qp_init_attr->qp_type == IB_QPT_GSI &&
2349 	    !_is_chip_gen_p5_p7(rdev->chip_ctx)) {
2350 		rc = bnxt_re_create_gsi_qp(qp, pd);
2351 		if (rc == -ENODEV)
2352 			goto qp_destroy;
2353 		if (rc)
2354 			goto fail;
2355 	} else {
2356 		rc = bnxt_qplib_create_qp(&rdev->qplib_res, &qp->qplib_qp);
2357 		if (rc) {
2358 			dev_err(rdev_to_dev(rdev), "create HW QP failed!\n");
2359 			goto free_umem;
2360 		}
2361 
2362 		if (udata) {
2363 			struct bnxt_re_qp_resp resp;
2364 
2365 			resp.qpid = qp->qplib_qp.id;
2366 			rc = bnxt_re_copy_to_udata(rdev, &resp,
2367 						   min(udata->outlen, sizeof(resp)),
2368 						   udata);
2369 			if (rc)
2370 				goto qp_destroy;
2371 		}
2372 	}
2373 
2374 	qp->ib_qp.qp_num = qp->qplib_qp.id;
2375 	if (qp_init_attr->qp_type == IB_QPT_GSI)
2376 		rdev->gsi_ctx.gsi_qp = qp;
2377 	spin_lock_init(&qp->sq_lock);
2378 	spin_lock_init(&qp->rq_lock);
2379 	INIT_LIST_HEAD(&qp->list);
2380 	mutex_lock(&rdev->qp_lock);
2381 	list_add_tail(&qp->list, &rdev->qp_list);
2382 	mutex_unlock(&rdev->qp_lock);
2383 	atomic_inc(&rdev->stats.rsors.qp_count);
2384 	active_qps = atomic_read(&rdev->stats.rsors.qp_count);
2385 	if (active_qps > atomic_read(&rdev->stats.rsors.max_qp_count))
2386 		atomic_set(&rdev->stats.rsors.max_qp_count, active_qps);
2387 
2388 	bnxt_re_dump_debug_stats(rdev, active_qps);
2389 
2390 	/* Get the counters for RC QPs and UD QPs */
2391 	if (qp_init_attr->qp_type == IB_QPT_RC) {
2392 		tmp_qps = atomic_inc_return(&rdev->stats.rsors.rc_qp_count);
2393 		if (tmp_qps > atomic_read(&rdev->stats.rsors.max_rc_qp_count))
2394 			atomic_set(&rdev->stats.rsors.max_rc_qp_count, tmp_qps);
2395 	} else if (qp_init_attr->qp_type == IB_QPT_UD) {
2396 		tmp_qps = atomic_inc_return(&rdev->stats.rsors.ud_qp_count);
2397 		if (tmp_qps > atomic_read(&rdev->stats.rsors.max_ud_qp_count))
2398 			atomic_set(&rdev->stats.rsors.max_ud_qp_count, tmp_qps);
2399 	}
2400 
2401 	return &qp->ib_qp;
2402 
2403 qp_destroy:
2404 	bnxt_qplib_destroy_qp(&rdev->qplib_res, &qp->qplib_qp);
2405 free_umem:
2406 	if (udata) {
2407 		if (qp->rumem && !IS_ERR(qp->rumem))
2408 			ib_umem_release(qp->rumem);
2409 		if (qp->sumem && !IS_ERR(qp->sumem))
2410 			ib_umem_release(qp->sumem);
2411 	}
2412 fail:
2413 	kfree(qp);
2414 exit:
2415 	return ERR_PTR(rc);
2416 }
2417 
bnxt_re_modify_shadow_qp(struct bnxt_re_dev * rdev,struct bnxt_re_qp * qp1_qp,int qp_attr_mask)2418 static int bnxt_re_modify_shadow_qp(struct bnxt_re_dev *rdev,
2419 			     struct bnxt_re_qp *qp1_qp,
2420 			     int qp_attr_mask)
2421 {
2422 	struct bnxt_re_qp *qp = rdev->gsi_ctx.gsi_sqp;
2423 	int rc = 0;
2424 
2425 	if (qp_attr_mask & IB_QP_STATE) {
2426 		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_STATE;
2427 		qp->qplib_qp.state = qp1_qp->qplib_qp.state;
2428 	}
2429 	if (qp_attr_mask & IB_QP_PKEY_INDEX) {
2430 		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_PKEY;
2431 		qp->qplib_qp.pkey_index = qp1_qp->qplib_qp.pkey_index;
2432 	}
2433 
2434 	if (qp_attr_mask & IB_QP_QKEY) {
2435 		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_QKEY;
2436 		/* Using a Random  QKEY */
2437 		qp->qplib_qp.qkey = BNXT_RE_QP_RANDOM_QKEY;
2438 	}
2439 	if (qp_attr_mask & IB_QP_SQ_PSN) {
2440 		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_SQ_PSN;
2441 		qp->qplib_qp.sq.psn = qp1_qp->qplib_qp.sq.psn;
2442 	}
2443 
2444 	rc = bnxt_qplib_modify_qp(&rdev->qplib_res, &qp->qplib_qp);
2445 	if (rc)
2446 		dev_err(rdev_to_dev(rdev), "Modify Shadow QP for QP1 failed\n");
2447 	return rc;
2448 }
2449 
ipv4_from_gid(u8 * gid)2450 static u32 ipv4_from_gid(u8 *gid)
2451 {
2452 	return (gid[15] << 24 | gid[14] << 16 | gid[13] << 8 | gid[12]);
2453 }
2454 
get_source_port(struct bnxt_re_dev * rdev,struct bnxt_re_qp * qp)2455 static u16 get_source_port(struct bnxt_re_dev *rdev,
2456 			   struct bnxt_re_qp *qp)
2457 {
2458 	u8 ip_off, data[48], smac[ETH_ALEN];
2459 	u16 crc = 0, buf_len = 0, i;
2460 	u8 addr_len;
2461 	u32 qpn;
2462 
2463 	if (qp->qplib_qp.nw_type == CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV6) {
2464 		addr_len = 6;
2465 		ip_off = 10;
2466 	} else {
2467 		addr_len = 4;
2468 		ip_off = 12;
2469 	}
2470 
2471 	memcpy(smac, qp->qplib_qp.smac, ETH_ALEN);
2472 
2473 	memset(data, 0, 48);
2474 	memcpy(data, qp->qplib_qp.ah.dmac, ETH_ALEN);
2475 	buf_len += ETH_ALEN;
2476 
2477 	memcpy(data + buf_len, smac, ETH_ALEN);
2478 	buf_len += ETH_ALEN;
2479 
2480 	memcpy(data + buf_len, qp->qplib_qp.ah.dgid.data + ip_off, addr_len);
2481 	buf_len += addr_len;
2482 
2483 	memcpy(data + buf_len, qp->qp_info_entry.sgid.raw + ip_off, addr_len);
2484 	buf_len += addr_len;
2485 
2486 	qpn = htonl(qp->qplib_qp.dest_qpn);
2487 	memcpy(data + buf_len, (u8 *)&qpn + 1, 3);
2488 	buf_len += 3;
2489 
2490 	for (i = 0; i < buf_len; i++)
2491 		crc = crc16(crc, (data + i), 1);
2492 
2493 	return crc;
2494 }
2495 
bnxt_re_update_qp_info(struct bnxt_re_dev * rdev,struct bnxt_re_qp * qp)2496 static void bnxt_re_update_qp_info(struct bnxt_re_dev *rdev, struct bnxt_re_qp *qp)
2497 {
2498 	u16 type;
2499 
2500 	type = __from_hw_to_ib_qp_type(qp->qplib_qp.type);
2501 
2502 	/* User-space can extract ip address with sgid_index. */
2503 	if (ipv6_addr_v4mapped((struct in6_addr *)&qp->qplib_qp.ah.dgid)) {
2504 		qp->qp_info_entry.s_ip.ipv4_addr = ipv4_from_gid(qp->qp_info_entry.sgid.raw);
2505 		qp->qp_info_entry.d_ip.ipv4_addr = ipv4_from_gid(qp->qplib_qp.ah.dgid.data);
2506 	} else {
2507 		memcpy(&qp->qp_info_entry.s_ip.ipv6_addr, qp->qp_info_entry.sgid.raw,
2508 		       sizeof(qp->qp_info_entry.s_ip.ipv6_addr));
2509 		memcpy(&qp->qp_info_entry.d_ip.ipv6_addr, qp->qplib_qp.ah.dgid.data,
2510 		       sizeof(qp->qp_info_entry.d_ip.ipv6_addr));
2511 	}
2512 
2513 	if (type == IB_QPT_RC &&
2514 	    (qp->qplib_qp.nw_type == CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV4 ||
2515 	     qp->qplib_qp.nw_type == CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV6)) {
2516 		qp->qp_info_entry.s_port = get_source_port(rdev, qp);
2517 	}
2518 	qp->qp_info_entry.d_port = BNXT_RE_QP_DEST_PORT;
2519 }
2520 
bnxt_qplib_manage_flush_qp(struct bnxt_re_qp * qp)2521 static void bnxt_qplib_manage_flush_qp(struct bnxt_re_qp *qp)
2522 {
2523 	struct bnxt_qplib_q *rq, *sq;
2524 	unsigned long flags;
2525 
2526 	if (qp->sumem)
2527 		return;
2528 
2529 	if (qp->qplib_qp.state == CMDQ_MODIFY_QP_NEW_STATE_ERR) {
2530 		rq = &qp->qplib_qp.rq;
2531 		sq = &qp->qplib_qp.sq;
2532 
2533 		dev_dbg(rdev_to_dev(qp->rdev),
2534 			"Move QP = %p to flush list\n", qp);
2535 		flags = bnxt_re_lock_cqs(qp);
2536 		bnxt_qplib_add_flush_qp(&qp->qplib_qp);
2537 		bnxt_re_unlock_cqs(qp, flags);
2538 
2539 		if (sq->hwq.prod != sq->hwq.cons)
2540 			bnxt_re_handle_cqn(&qp->scq->qplib_cq);
2541 
2542 		if (qp->rcq && (qp->rcq != qp->scq) &&
2543 		    (rq->hwq.prod != rq->hwq.cons))
2544 			bnxt_re_handle_cqn(&qp->rcq->qplib_cq);
2545 	}
2546 
2547 	if (qp->qplib_qp.state == CMDQ_MODIFY_QP_NEW_STATE_RESET) {
2548 		dev_dbg(rdev_to_dev(qp->rdev),
2549 			"Move QP = %p out of flush list\n", qp);
2550 		flags = bnxt_re_lock_cqs(qp);
2551 		bnxt_qplib_clean_qp(&qp->qplib_qp);
2552 		bnxt_re_unlock_cqs(qp, flags);
2553 	}
2554 }
2555 
ib_modify_qp_is_ok_compat(enum ib_qp_state cur_state,enum ib_qp_state next_state,enum ib_qp_type type,enum ib_qp_attr_mask mask)2556 bool ib_modify_qp_is_ok_compat(enum ib_qp_state cur_state,
2557 			       enum ib_qp_state next_state,
2558 			       enum ib_qp_type type,
2559 			       enum ib_qp_attr_mask mask)
2560 {
2561 		return (ib_modify_qp_is_ok(cur_state, next_state,
2562 					   type, mask));
2563 }
2564 
bnxt_re_modify_qp(struct ib_qp * ib_qp,struct ib_qp_attr * qp_attr,int qp_attr_mask,struct ib_udata * udata)2565 int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
2566 		      int qp_attr_mask, struct ib_udata *udata)
2567 {
2568 	enum ib_qp_state curr_qp_state, new_qp_state;
2569 	struct bnxt_re_modify_qp_ex_resp resp = {};
2570 	struct bnxt_re_modify_qp_ex_req ureq = {};
2571 	struct bnxt_qplib_dev_attr *dev_attr;
2572 	struct bnxt_qplib_ppp *ppp = NULL;
2573 	struct bnxt_re_dev *rdev;
2574 	struct bnxt_re_qp *qp;
2575 	struct ib_gid_attr *sgid_attr;
2576 	struct ib_gid_attr gid_attr;
2577 	union ib_gid sgid, *gid_ptr = NULL;
2578 	u8 nw_type;
2579 	int rc, entries, status;
2580 	bool is_copy_to_udata = false;
2581 	bool is_qpmtu_high = false;
2582 
2583 	qp = to_bnxt_re(ib_qp, struct bnxt_re_qp, ib_qp);
2584 	rdev = qp->rdev;
2585 	dev_attr = rdev->dev_attr;
2586 
2587 	qp->qplib_qp.modify_flags = 0;
2588 	ppp = &qp->qplib_qp.ppp;
2589 	if (qp_attr_mask & IB_QP_STATE) {
2590 		curr_qp_state = __to_ib_qp_state(qp->qplib_qp.cur_qp_state);
2591 		new_qp_state = qp_attr->qp_state;
2592 		if (!ib_modify_qp_is_ok_compat(curr_qp_state, new_qp_state,
2593 					       ib_qp->qp_type, qp_attr_mask)) {
2594 			dev_err(rdev_to_dev(rdev),"invalid attribute mask=0x%x"
2595 				" specified for qpn=0x%x of type=0x%x"
2596 				" current_qp_state=0x%x, new_qp_state=0x%x\n",
2597 				qp_attr_mask, ib_qp->qp_num, ib_qp->qp_type,
2598 				curr_qp_state, new_qp_state);
2599 			return -EINVAL;
2600 		}
2601 		dev_dbg(rdev_to_dev(rdev), "%s:%d INFO attribute mask=0x%x qpn=0x%x "
2602 			"of type=0x%x current_qp_state=0x%x, new_qp_state=0x%x\n",
2603 			__func__, __LINE__, qp_attr_mask, ib_qp->qp_num,
2604 			ib_qp->qp_type, curr_qp_state, new_qp_state);
2605 		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_STATE;
2606 		qp->qplib_qp.state = __from_ib_qp_state(qp_attr->qp_state);
2607 
2608 		if (udata && curr_qp_state == IB_QPS_RESET &&
2609 		    new_qp_state == IB_QPS_INIT) {
2610 			if (!ib_copy_from_udata(&ureq, udata, sizeof(ureq))) {
2611 				if (ureq.comp_mask &
2612 				    BNXT_RE_COMP_MASK_MQP_EX_PPP_REQ_EN_MASK) {
2613 					ppp->req = BNXT_QPLIB_PPP_REQ;
2614 					ppp->dpi = ureq.dpi;
2615 				}
2616 			}
2617 		}
2618 	}
2619 	if (qp_attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY) {
2620 		qp->qplib_qp.modify_flags |=
2621 				CMDQ_MODIFY_QP_MODIFY_MASK_EN_SQD_ASYNC_NOTIFY;
2622 		qp->qplib_qp.en_sqd_async_notify = true;
2623 	}
2624 	if (qp_attr_mask & IB_QP_ACCESS_FLAGS) {
2625 		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_ACCESS;
2626 		qp->qplib_qp.access =
2627 			__from_ib_access_flags(qp_attr->qp_access_flags);
2628 		/* LOCAL_WRITE access must be set to allow RC receive */
2629 		qp->qplib_qp.access |= BNXT_QPLIB_ACCESS_LOCAL_WRITE;
2630 		qp->qplib_qp.access |= CMDQ_MODIFY_QP_ACCESS_REMOTE_WRITE;
2631 		qp->qplib_qp.access |= CMDQ_MODIFY_QP_ACCESS_REMOTE_READ;
2632 	}
2633 	if (qp_attr_mask & IB_QP_PKEY_INDEX) {
2634 		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_PKEY;
2635 		qp->qplib_qp.pkey_index = qp_attr->pkey_index;
2636 	}
2637 	if (qp_attr_mask & IB_QP_QKEY) {
2638 		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_QKEY;
2639 		qp->qplib_qp.qkey = qp_attr->qkey;
2640 	}
2641 	if (qp_attr_mask & IB_QP_AV) {
2642 		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_DGID |
2643 				     CMDQ_MODIFY_QP_MODIFY_MASK_FLOW_LABEL |
2644 				     CMDQ_MODIFY_QP_MODIFY_MASK_SGID_INDEX |
2645 				     CMDQ_MODIFY_QP_MODIFY_MASK_HOP_LIMIT |
2646 				     CMDQ_MODIFY_QP_MODIFY_MASK_TRAFFIC_CLASS |
2647 				     CMDQ_MODIFY_QP_MODIFY_MASK_DEST_MAC |
2648 				     CMDQ_MODIFY_QP_MODIFY_MASK_VLAN_ID;
2649 		memcpy(qp->qplib_qp.ah.dgid.data, qp_attr->ah_attr.grh.dgid.raw,
2650 		       sizeof(qp->qplib_qp.ah.dgid.data));
2651 		qp->qplib_qp.ah.flow_label = qp_attr->ah_attr.grh.flow_label;
2652 		qp->qplib_qp.ah.sgid_index = _get_sgid_index(rdev,
2653 						qp_attr->ah_attr.grh.sgid_index);
2654 		qp->qplib_qp.ah.host_sgid_index = qp_attr->ah_attr.grh.sgid_index;
2655 		qp->qplib_qp.ah.hop_limit = qp_attr->ah_attr.grh.hop_limit;
2656 		qp->qplib_qp.ah.traffic_class =
2657 					qp_attr->ah_attr.grh.traffic_class;
2658 		qp->qplib_qp.ah.sl = qp_attr->ah_attr.sl;
2659 		ether_addr_copy(qp->qplib_qp.ah.dmac, ROCE_DMAC(&qp_attr->ah_attr));
2660 		sgid_attr = &gid_attr;
2661 		status = bnxt_re_get_cached_gid(&rdev->ibdev, 1,
2662 						qp_attr->ah_attr.grh.sgid_index,
2663 						&sgid, &sgid_attr,
2664 						&qp_attr->ah_attr.grh, NULL);
2665 		if (!status)
2666 			if_rele(sgid_attr->ndev);
2667 		gid_ptr = &sgid;
2668 		if (sgid_attr->ndev) {
2669 			memcpy(qp->qplib_qp.smac, rdev->dev_addr,
2670 			       ETH_ALEN);
2671 			nw_type = bnxt_re_gid_to_network_type(sgid_attr, &sgid);
2672 			dev_dbg(rdev_to_dev(rdev),
2673 				 "Connection using the nw_type %d\n", nw_type);
2674 			switch (nw_type) {
2675 			case RDMA_NETWORK_IPV4:
2676 				qp->qplib_qp.nw_type =
2677 					CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV4;
2678 				break;
2679 			case RDMA_NETWORK_IPV6:
2680 				qp->qplib_qp.nw_type =
2681 					CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV2_IPV6;
2682 				break;
2683 			default:
2684 				qp->qplib_qp.nw_type =
2685 					CMDQ_MODIFY_QP_NETWORK_TYPE_ROCEV1;
2686 				break;
2687 			}
2688 		}
2689 		memcpy(&qp->qp_info_entry.sgid, gid_ptr, sizeof(qp->qp_info_entry.sgid));
2690 	}
2691 
2692 	/* MTU settings allowed only during INIT -> RTR */
2693 	if (qp_attr->qp_state == IB_QPS_RTR) {
2694 		bnxt_re_init_qpmtu(qp, if_getmtu(rdev->netdev), qp_attr_mask, qp_attr,
2695 				   &is_qpmtu_high);
2696 		if (udata && !ib_copy_from_udata(&ureq, udata, sizeof(ureq))) {
2697 			if (ureq.comp_mask & BNXT_RE_COMP_MASK_MQP_EX_PATH_MTU_MASK) {
2698 				resp.comp_mask |= BNXT_RE_COMP_MASK_MQP_EX_PATH_MTU_MASK;
2699 				resp.path_mtu = qp->qplib_qp.mtu;
2700 				is_copy_to_udata = true;
2701 			} else if (is_qpmtu_high) {
2702 				dev_err(rdev_to_dev(rdev), "qp %#x invalid mtu\n",
2703 					qp->qplib_qp.id);
2704 				return -EINVAL;
2705 			}
2706 		}
2707 	}
2708 
2709 	if (qp_attr_mask & IB_QP_TIMEOUT) {
2710 		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_TIMEOUT;
2711 		qp->qplib_qp.timeout = qp_attr->timeout;
2712 	}
2713 	if (qp_attr_mask & IB_QP_RETRY_CNT) {
2714 		qp->qplib_qp.modify_flags |=
2715 				CMDQ_MODIFY_QP_MODIFY_MASK_RETRY_CNT;
2716 		qp->qplib_qp.retry_cnt = qp_attr->retry_cnt;
2717 	}
2718 	if (qp_attr_mask & IB_QP_RNR_RETRY) {
2719 		qp->qplib_qp.modify_flags |=
2720 				CMDQ_MODIFY_QP_MODIFY_MASK_RNR_RETRY;
2721 		qp->qplib_qp.rnr_retry = qp_attr->rnr_retry;
2722 	}
2723 	if (qp_attr_mask & IB_QP_MIN_RNR_TIMER) {
2724 		qp->qplib_qp.modify_flags |=
2725 				CMDQ_MODIFY_QP_MODIFY_MASK_MIN_RNR_TIMER;
2726 		qp->qplib_qp.min_rnr_timer = qp_attr->min_rnr_timer;
2727 	}
2728 	if (qp_attr_mask & IB_QP_RQ_PSN) {
2729 		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_RQ_PSN;
2730 		qp->qplib_qp.rq.psn = qp_attr->rq_psn;
2731 	}
2732 	if (qp_attr_mask & IB_QP_MAX_QP_RD_ATOMIC) {
2733 		qp->qplib_qp.modify_flags |=
2734 				CMDQ_MODIFY_QP_MODIFY_MASK_MAX_RD_ATOMIC;
2735 		/* Cap the max_rd_atomic to device max */
2736 		if (qp_attr->max_rd_atomic > dev_attr->max_qp_rd_atom)
2737 			dev_dbg(rdev_to_dev(rdev),
2738 				"max_rd_atomic requested %d is > device max %d\n",
2739 				qp_attr->max_rd_atomic,
2740 				dev_attr->max_qp_rd_atom);
2741 		qp->qplib_qp.max_rd_atomic = min_t(u32, qp_attr->max_rd_atomic,
2742 						   dev_attr->max_qp_rd_atom);
2743 	}
2744 	if (qp_attr_mask & IB_QP_SQ_PSN) {
2745 		qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_SQ_PSN;
2746 		qp->qplib_qp.sq.psn = qp_attr->sq_psn;
2747 	}
2748 	if (qp_attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) {
2749 		if (qp_attr->max_dest_rd_atomic >
2750 		    dev_attr->max_qp_init_rd_atom) {
2751 			dev_err(rdev_to_dev(rdev),
2752 				"max_dest_rd_atomic requested %d is > device max %d\n",
2753 				qp_attr->max_dest_rd_atomic,
2754 				dev_attr->max_qp_init_rd_atom);
2755 			return -EINVAL;
2756 		}
2757 		qp->qplib_qp.modify_flags |=
2758 				CMDQ_MODIFY_QP_MODIFY_MASK_MAX_DEST_RD_ATOMIC;
2759 		qp->qplib_qp.max_dest_rd_atomic = qp_attr->max_dest_rd_atomic;
2760 	}
2761 	if (qp_attr_mask & IB_QP_CAP) {
2762 		qp->qplib_qp.modify_flags |=
2763 				CMDQ_MODIFY_QP_MODIFY_MASK_SQ_SIZE |
2764 				CMDQ_MODIFY_QP_MODIFY_MASK_RQ_SIZE |
2765 				CMDQ_MODIFY_QP_MODIFY_MASK_SQ_SGE |
2766 				CMDQ_MODIFY_QP_MODIFY_MASK_RQ_SGE |
2767 				CMDQ_MODIFY_QP_MODIFY_MASK_MAX_INLINE_DATA;
2768 		if ((qp_attr->cap.max_send_wr >= dev_attr->max_qp_wqes) ||
2769 		    (qp_attr->cap.max_recv_wr >= dev_attr->max_qp_wqes) ||
2770 		    (qp_attr->cap.max_send_sge >= dev_attr->max_qp_sges) ||
2771 		    (qp_attr->cap.max_recv_sge >= dev_attr->max_qp_sges) ||
2772 		    (qp_attr->cap.max_inline_data >=
2773 						dev_attr->max_inline_data)) {
2774 			dev_err(rdev_to_dev(rdev),
2775 				"Create QP failed - max exceeded\n");
2776 			return -EINVAL;
2777 		}
2778 		entries = roundup_pow_of_two(qp_attr->cap.max_send_wr);
2779 		if (entries > dev_attr->max_qp_wqes)
2780 			entries = dev_attr->max_qp_wqes;
2781 		entries = min_t(u32, entries, dev_attr->max_qp_wqes);
2782 		qp->qplib_qp.sq.max_wqe = entries;
2783 		qp->qplib_qp.sq.q_full_delta = qp->qplib_qp.sq.max_wqe -
2784 						qp_attr->cap.max_send_wr;
2785 		/*
2786 		 * Reserving one slot for Phantom WQE. Some application can
2787 		 * post one extra entry in this case. Allowing this to avoid
2788 		 * unexpected Queue full condition
2789 		 */
2790 		qp->qplib_qp.sq.q_full_delta -= 1;
2791 		qp->qplib_qp.sq.max_sge = qp_attr->cap.max_send_sge;
2792 		if (qp->qplib_qp.rq.max_wqe) {
2793 			entries = roundup_pow_of_two(qp_attr->cap.max_recv_wr);
2794 			if (entries > dev_attr->max_qp_wqes)
2795 				entries = dev_attr->max_qp_wqes;
2796 			qp->qplib_qp.rq.max_wqe = entries;
2797 			qp->qplib_qp.rq.q_full_delta = qp->qplib_qp.rq.max_wqe -
2798 						       qp_attr->cap.max_recv_wr;
2799 			qp->qplib_qp.rq.max_sge = qp_attr->cap.max_recv_sge;
2800 		} else {
2801 			/* SRQ was used prior, just ignore the RQ caps */
2802 		}
2803 	}
2804 	if (qp_attr_mask & IB_QP_DEST_QPN) {
2805 		qp->qplib_qp.modify_flags |=
2806 				CMDQ_MODIFY_QP_MODIFY_MASK_DEST_QP_ID;
2807 		qp->qplib_qp.dest_qpn = qp_attr->dest_qp_num;
2808 	}
2809 
2810 	rc = bnxt_qplib_modify_qp(&rdev->qplib_res, &qp->qplib_qp);
2811 	if (rc) {
2812 		dev_err(rdev_to_dev(rdev), "Modify HW QP failed!\n");
2813 		return rc;
2814 	}
2815 	if (qp_attr_mask & IB_QP_STATE)
2816 		bnxt_qplib_manage_flush_qp(qp);
2817 	if (ureq.comp_mask & BNXT_RE_COMP_MASK_MQP_EX_PPP_REQ_EN_MASK &&
2818 	    ppp->st_idx_en & CREQ_MODIFY_QP_RESP_PINGPONG_PUSH_ENABLED) {
2819 		resp.comp_mask |= BNXT_RE_COMP_MASK_MQP_EX_PPP_REQ_EN;
2820 		resp.ppp_st_idx = ppp->st_idx_en >>
2821 				  BNXT_QPLIB_PPP_ST_IDX_SHIFT;
2822 		is_copy_to_udata = true;
2823 	}
2824 
2825 	if (is_copy_to_udata) {
2826 		rc = bnxt_re_copy_to_udata(rdev, &resp,
2827 					   min(udata->outlen, sizeof(resp)),
2828 					   udata);
2829 		if (rc)
2830 			return rc;
2831 	}
2832 
2833 	if (ib_qp->qp_type == IB_QPT_GSI &&
2834 	    rdev->gsi_ctx.gsi_qp_mode == BNXT_RE_GSI_MODE_ALL &&
2835 	    rdev->gsi_ctx.gsi_sqp)
2836 		rc = bnxt_re_modify_shadow_qp(rdev, qp, qp_attr_mask);
2837 	/*
2838 	 * Update info when qp_info_info
2839 	 */
2840 	bnxt_re_update_qp_info(rdev, qp);
2841 	return rc;
2842 }
2843 
bnxt_re_query_qp(struct ib_qp * ib_qp,struct ib_qp_attr * qp_attr,int qp_attr_mask,struct ib_qp_init_attr * qp_init_attr)2844 int bnxt_re_query_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
2845 		     int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr)
2846 {
2847 	struct bnxt_re_qp *qp = to_bnxt_re(ib_qp, struct bnxt_re_qp, ib_qp);
2848 	struct bnxt_re_dev *rdev = qp->rdev;
2849 	struct bnxt_qplib_qp *qplib_qp;
2850 	int rc;
2851 
2852 	qplib_qp = kcalloc(1, sizeof(*qplib_qp), GFP_KERNEL);
2853 	if (!qplib_qp)
2854 		return -ENOMEM;
2855 
2856 	qplib_qp->id = qp->qplib_qp.id;
2857 	qplib_qp->ah.host_sgid_index = qp->qplib_qp.ah.host_sgid_index;
2858 
2859 	rc = bnxt_qplib_query_qp(&rdev->qplib_res, qplib_qp);
2860 	if (rc) {
2861 		dev_err(rdev_to_dev(rdev), "Query HW QP (0x%x) failed! rc = %d\n",
2862 			qplib_qp->id, rc);
2863 		goto free_mem;
2864 	}
2865 	qp_attr->qp_state = __to_ib_qp_state(qplib_qp->state);
2866 	qp_attr->cur_qp_state = __to_ib_qp_state(qplib_qp->cur_qp_state);
2867 	qp_attr->en_sqd_async_notify = qplib_qp->en_sqd_async_notify ? 1 : 0;
2868 	qp_attr->qp_access_flags = __to_ib_access_flags(qplib_qp->access);
2869 	qp_attr->pkey_index = qplib_qp->pkey_index;
2870 	qp_attr->qkey = qplib_qp->qkey;
2871 	memcpy(qp_attr->ah_attr.grh.dgid.raw, qplib_qp->ah.dgid.data,
2872 	       sizeof(qplib_qp->ah.dgid.data));
2873 	qp_attr->ah_attr.grh.flow_label = qplib_qp->ah.flow_label;
2874 	qp_attr->ah_attr.grh.sgid_index = qplib_qp->ah.host_sgid_index;
2875 	qp_attr->ah_attr.grh.hop_limit = qplib_qp->ah.hop_limit;
2876 	qp_attr->ah_attr.grh.traffic_class = qplib_qp->ah.traffic_class;
2877 	qp_attr->ah_attr.sl = qplib_qp->ah.sl;
2878 	ether_addr_copy(ROCE_DMAC(&qp_attr->ah_attr), qplib_qp->ah.dmac);
2879 	qp_attr->path_mtu = __to_ib_mtu(qplib_qp->path_mtu);
2880 	qp_attr->timeout = qplib_qp->timeout;
2881 	qp_attr->retry_cnt = qplib_qp->retry_cnt;
2882 	qp_attr->rnr_retry = qplib_qp->rnr_retry;
2883 	qp_attr->min_rnr_timer = qplib_qp->min_rnr_timer;
2884 	qp_attr->rq_psn = qplib_qp->rq.psn;
2885 	qp_attr->max_rd_atomic = qplib_qp->max_rd_atomic;
2886 	qp_attr->sq_psn = qplib_qp->sq.psn;
2887 	qp_attr->max_dest_rd_atomic = qplib_qp->max_dest_rd_atomic;
2888 	qp_init_attr->sq_sig_type = qplib_qp->sig_type ? IB_SIGNAL_ALL_WR :
2889 							IB_SIGNAL_REQ_WR;
2890 	qp_attr->dest_qp_num = qplib_qp->dest_qpn;
2891 
2892 	qp_attr->cap.max_send_wr = qp->qplib_qp.sq.max_wqe;
2893 	qp_attr->cap.max_send_sge = qp->qplib_qp.sq.max_sge;
2894 	qp_attr->cap.max_recv_wr = qp->qplib_qp.rq.max_wqe;
2895 	qp_attr->cap.max_recv_sge = qp->qplib_qp.rq.max_sge;
2896 	qp_attr->cap.max_inline_data = qp->qplib_qp.max_inline_data;
2897 	qp_init_attr->cap = qp_attr->cap;
2898 
2899 free_mem:
2900 	kfree(qplib_qp);
2901 	return rc;
2902 }
2903 
2904 /* Builders */
2905 
2906 /* For Raw, the application is responsible to build the entire packet */
bnxt_re_build_raw_send(const struct ib_send_wr * wr,struct bnxt_qplib_swqe * wqe)2907 static void bnxt_re_build_raw_send(const struct ib_send_wr *wr,
2908 				   struct bnxt_qplib_swqe *wqe)
2909 {
2910 	switch (wr->send_flags) {
2911 	case IB_SEND_IP_CSUM:
2912 		wqe->rawqp1.lflags |= SQ_SEND_RAWETH_QP1_LFLAGS_IP_CHKSUM;
2913 		break;
2914 	default:
2915 		/* Pad HW RoCE iCRC */
2916 		wqe->rawqp1.lflags |= SQ_SEND_RAWETH_QP1_LFLAGS_ROCE_CRC;
2917 		break;
2918 	}
2919 }
2920 
2921 /* For QP1, the driver must build the entire RoCE (v1/v2) packet hdr
2922  * as according to the sgid and AV
2923  */
bnxt_re_build_qp1_send(struct bnxt_re_qp * qp,const struct ib_send_wr * wr,struct bnxt_qplib_swqe * wqe,int payload_size)2924 static int bnxt_re_build_qp1_send(struct bnxt_re_qp *qp, const struct ib_send_wr *wr,
2925 				  struct bnxt_qplib_swqe *wqe, int payload_size)
2926 {
2927 	struct bnxt_re_ah *ah = to_bnxt_re(ud_wr(wr)->ah, struct bnxt_re_ah,
2928 					   ibah);
2929 	struct bnxt_qplib_ah *qplib_ah = &ah->qplib_ah;
2930 	struct bnxt_qplib_sge sge;
2931 	int i, rc = 0;
2932 	union ib_gid sgid;
2933 	u16 vlan_id;
2934 	u8 *ptmac;
2935 	void *buf;
2936 
2937 	memset(&qp->qp1_hdr, 0, sizeof(qp->qp1_hdr));
2938 
2939 	/* Get sgid */
2940 	rc = bnxt_re_query_gid(&qp->rdev->ibdev, 1, qplib_ah->sgid_index, &sgid);
2941 	if (rc)
2942 		return rc;
2943 
2944 	/* ETH */
2945 	qp->qp1_hdr.eth_present = 1;
2946 	ptmac = ah->qplib_ah.dmac;
2947 	memcpy(qp->qp1_hdr.eth.dmac_h, ptmac, 4);
2948 	ptmac += 4;
2949 	memcpy(qp->qp1_hdr.eth.dmac_l, ptmac, 2);
2950 
2951 	ptmac = qp->qplib_qp.smac;
2952 	memcpy(qp->qp1_hdr.eth.smac_h, ptmac, 2);
2953 	ptmac += 2;
2954 	memcpy(qp->qp1_hdr.eth.smac_l, ptmac, 4);
2955 
2956 	qp->qp1_hdr.eth.type = cpu_to_be16(BNXT_QPLIB_ETHTYPE_ROCEV1);
2957 
2958 	/* For vlan, check the sgid for vlan existence */
2959 	vlan_id = rdma_get_vlan_id(&sgid);
2960 	if (vlan_id && vlan_id < 0x1000) {
2961 		qp->qp1_hdr.vlan_present = 1;
2962 		qp->qp1_hdr.eth.type = cpu_to_be16(ETH_P_8021Q);
2963 	}
2964 	/* GRH */
2965 	qp->qp1_hdr.grh_present = 1;
2966 	qp->qp1_hdr.grh.ip_version = 6;
2967 	qp->qp1_hdr.grh.payload_length =
2968 		cpu_to_be16((IB_BTH_BYTES + IB_DETH_BYTES + payload_size + 7)
2969 			    & ~3);
2970 	qp->qp1_hdr.grh.next_header = 0x1b;
2971 	memcpy(qp->qp1_hdr.grh.source_gid.raw, sgid.raw, sizeof(sgid));
2972 	memcpy(qp->qp1_hdr.grh.destination_gid.raw, qplib_ah->dgid.data,
2973 	       sizeof(sgid));
2974 
2975 	/* BTH */
2976 	if (wr->opcode == IB_WR_SEND_WITH_IMM) {
2977 		qp->qp1_hdr.bth.opcode = IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE;
2978 		qp->qp1_hdr.immediate_present = 1;
2979 	} else {
2980 		qp->qp1_hdr.bth.opcode = IB_OPCODE_UD_SEND_ONLY;
2981 	}
2982 	if (wr->send_flags & IB_SEND_SOLICITED)
2983 		qp->qp1_hdr.bth.solicited_event = 1;
2984 	qp->qp1_hdr.bth.pad_count = (4 - payload_size) & 3;
2985 	/* P_key for QP1 is for all members */
2986 	qp->qp1_hdr.bth.pkey = cpu_to_be16(0xFFFF);
2987 	qp->qp1_hdr.bth.destination_qpn = IB_QP1;
2988 	qp->qp1_hdr.bth.ack_req = 0;
2989 	qp->send_psn++;
2990 	qp->send_psn &= BTH_PSN_MASK;
2991 	qp->qp1_hdr.bth.psn = cpu_to_be32(qp->send_psn);
2992 	/* DETH */
2993 	/* Use the priviledged Q_Key for QP1 */
2994 	qp->qp1_hdr.deth.qkey = cpu_to_be32(IB_QP1_QKEY);
2995 	qp->qp1_hdr.deth.source_qpn = IB_QP1;
2996 
2997 	/* Pack the QP1 to the transmit buffer */
2998 	buf = bnxt_qplib_get_qp1_sq_buf(&qp->qplib_qp, &sge);
2999 	if (!buf) {
3000 		dev_err(rdev_to_dev(qp->rdev), "QP1 buffer is empty!\n");
3001 		rc = -ENOMEM;
3002 	}
3003 	for (i = wqe->num_sge; i; i--) {
3004 		wqe->sg_list[i].addr = wqe->sg_list[i - 1].addr;
3005 		wqe->sg_list[i].lkey = wqe->sg_list[i - 1].lkey;
3006 		wqe->sg_list[i].size = wqe->sg_list[i - 1].size;
3007 	}
3008 	wqe->sg_list[0].addr = sge.addr;
3009 	wqe->sg_list[0].lkey = sge.lkey;
3010 	wqe->sg_list[0].size = sge.size;
3011 	wqe->num_sge++;
3012 
3013 	return rc;
3014 }
3015 
bnxt_re_build_gsi_send(struct bnxt_re_qp * qp,const struct ib_send_wr * wr,struct bnxt_qplib_swqe * wqe)3016 static int bnxt_re_build_gsi_send(struct bnxt_re_qp *qp,
3017 				  const struct ib_send_wr *wr,
3018 				  struct bnxt_qplib_swqe *wqe)
3019 {
3020 	struct bnxt_re_dev *rdev;
3021 	int rc, indx, len = 0;
3022 
3023 	rdev = qp->rdev;
3024 
3025 	/* Mode UD is applicable to Gen P5 only */
3026 	if (rdev->gsi_ctx.gsi_qp_mode == BNXT_RE_GSI_MODE_UD)
3027 		return 0;
3028 
3029 	for (indx = 0; indx < wr->num_sge; indx++) {
3030 		wqe->sg_list[indx].addr = wr->sg_list[indx].addr;
3031 		wqe->sg_list[indx].lkey = wr->sg_list[indx].lkey;
3032 		wqe->sg_list[indx].size = wr->sg_list[indx].length;
3033 		len += wr->sg_list[indx].length;
3034 	}
3035 	rc = bnxt_re_build_qp1_send(qp, wr, wqe, len);
3036 	wqe->rawqp1.lflags |= SQ_SEND_RAWETH_QP1_LFLAGS_ROCE_CRC;
3037 
3038 	return rc;
3039 }
3040 
3041 /* For the MAD layer, it only provides the recv SGE the size of
3042    ib_grh + MAD datagram.  No Ethernet headers, Ethertype, BTH, DETH,
3043    nor RoCE iCRC.  The Cu+ solution must provide buffer for the entire
3044    receive packet (334 bytes) with no VLAN and then copy the GRH
3045    and the MAD datagram out to the provided SGE.
3046 */
3047 
bnxt_re_build_qp1_recv(struct bnxt_re_qp * qp,const struct ib_recv_wr * wr,struct bnxt_qplib_swqe * wqe)3048 static int bnxt_re_build_qp1_recv(struct bnxt_re_qp *qp,
3049 				  const struct ib_recv_wr *wr,
3050 				  struct bnxt_qplib_swqe *wqe)
3051 {
3052 	struct bnxt_re_dev *rdev = qp->rdev;
3053 	struct bnxt_qplib_sge ref, sge;
3054 	u8 udp_hdr_size = 0;
3055 	u8 ip_hdr_size = 0;
3056 	int rc = 0;
3057 	int size;
3058 
3059 	if (bnxt_qplib_get_qp1_rq_buf(&qp->qplib_qp, &sge)) {
3060 		/* Create 5 SGEs as according to the following:
3061 		 * Ethernet header (14)
3062 		 * ib_grh (40) - as provided from the wr
3063 		 * ib_bth + ib_deth + UDP(RoCE v2 only)  (28)
3064 		 * MAD (256) - as provided from the wr
3065 		 * iCRC (4)
3066 		 */
3067 
3068 		/* Set RoCE v2 header size and offsets */
3069 		if (rdev->gsi_ctx.gsi_qp_mode == BNXT_RE_GSI_MODE_ROCE_V2_IPV4)
3070 			ip_hdr_size = 20;
3071 		if (rdev->gsi_ctx.gsi_qp_mode != BNXT_RE_GSI_MODE_ROCE_V1)
3072 			udp_hdr_size = 8;
3073 
3074 		/* Save the reference from ULP */
3075 		ref.addr = wr->sg_list[0].addr;
3076 		ref.lkey = wr->sg_list[0].lkey;
3077 		ref.size = wr->sg_list[0].length;
3078 
3079 		/* SGE 1 */
3080 		size = sge.size;
3081 		wqe->sg_list[0].addr = sge.addr;
3082 		wqe->sg_list[0].lkey = sge.lkey;
3083 		wqe->sg_list[0].size = BNXT_QPLIB_MAX_QP1_RQ_ETH_HDR_SIZE;
3084 		size -= wqe->sg_list[0].size;
3085 		if (size <= 0) {
3086 			dev_err(rdev_to_dev(qp->rdev),"QP1 rq buffer is empty!\n");
3087 			rc = -ENOMEM;
3088 			goto done;
3089 		}
3090 		sge.size = (u32)size;
3091 		sge.addr += wqe->sg_list[0].size;
3092 
3093 		/* SGE 2 */
3094 		/* In case of RoCE v2 ipv4 lower 20 bytes should have IP hdr */
3095 		wqe->sg_list[1].addr = ref.addr + ip_hdr_size;
3096 		wqe->sg_list[1].lkey = ref.lkey;
3097 		wqe->sg_list[1].size = sizeof(struct ib_grh) - ip_hdr_size;
3098 		ref.size -= wqe->sg_list[1].size;
3099 		if (ref.size <= 0) {
3100 			dev_err(rdev_to_dev(qp->rdev),
3101 				"QP1 ref buffer is empty!\n");
3102 			rc = -ENOMEM;
3103 			goto done;
3104 		}
3105 		ref.addr += wqe->sg_list[1].size + ip_hdr_size;
3106 
3107 		/* SGE 3 */
3108 		wqe->sg_list[2].addr = sge.addr;
3109 		wqe->sg_list[2].lkey = sge.lkey;
3110 		wqe->sg_list[2].size = BNXT_QPLIB_MAX_QP1_RQ_BDETH_HDR_SIZE +
3111 				       udp_hdr_size;
3112 		size -= wqe->sg_list[2].size;
3113 		if (size <= 0) {
3114 			dev_err(rdev_to_dev(qp->rdev),
3115 				"QP1 rq buffer is empty!\n");
3116 			rc = -ENOMEM;
3117 			goto done;
3118 		}
3119 		sge.size = (u32)size;
3120 		sge.addr += wqe->sg_list[2].size;
3121 
3122 		/* SGE 4 */
3123 		wqe->sg_list[3].addr = ref.addr;
3124 		wqe->sg_list[3].lkey = ref.lkey;
3125 		wqe->sg_list[3].size = ref.size;
3126 		ref.size -= wqe->sg_list[3].size;
3127 		if (ref.size) {
3128 			dev_err(rdev_to_dev(qp->rdev),
3129 				"QP1 ref buffer is incorrect!\n");
3130 			rc = -ENOMEM;
3131 			goto done;
3132 		}
3133 		/* SGE 5 */
3134 		wqe->sg_list[4].addr = sge.addr;
3135 		wqe->sg_list[4].lkey = sge.lkey;
3136 		wqe->sg_list[4].size = sge.size;
3137 		size -= wqe->sg_list[4].size;
3138 		if (size) {
3139 			dev_err(rdev_to_dev(qp->rdev),
3140 				"QP1 rq buffer is incorrect!\n");
3141 			rc = -ENOMEM;
3142 			goto done;
3143 		}
3144 		sge.size = (u32)size;
3145 		wqe->num_sge = 5;
3146 	} else {
3147 		dev_err(rdev_to_dev(qp->rdev), "QP1 buffer is empty!\n");
3148 		rc = -ENOMEM;
3149 	}
3150 done:
3151 	return rc;
3152 }
3153 
bnxt_re_build_qp1_shadow_qp_recv(struct bnxt_re_qp * qp,const struct ib_recv_wr * wr,struct bnxt_qplib_swqe * wqe)3154 static int bnxt_re_build_qp1_shadow_qp_recv(struct bnxt_re_qp *qp,
3155 					    const struct ib_recv_wr *wr,
3156 					    struct bnxt_qplib_swqe *wqe)
3157 {
3158 	struct bnxt_re_sqp_entries *sqp_entry;
3159 	struct bnxt_qplib_sge sge;
3160 	struct bnxt_re_dev *rdev;
3161 	u32 rq_prod_index;
3162 	int rc = 0;
3163 
3164 	rdev = qp->rdev;
3165 
3166 	rq_prod_index = bnxt_qplib_get_rq_prod_index(&qp->qplib_qp);
3167 
3168 	if (bnxt_qplib_get_qp1_rq_buf(&qp->qplib_qp, &sge)) {
3169 		/* Create 1 SGE to receive the entire
3170 		 * ethernet packet
3171 		 */
3172 		/* SGE 1 */
3173 		wqe->sg_list[0].addr = sge.addr;
3174 		/* TODO check the lkey to be used */
3175 		wqe->sg_list[0].lkey = sge.lkey;
3176 		wqe->sg_list[0].size = BNXT_QPLIB_MAX_QP1_RQ_HDR_SIZE_V2;
3177 		if (sge.size < wqe->sg_list[0].size) {
3178 			dev_err(rdev_to_dev(qp->rdev),
3179 				"QP1 rq buffer is empty!\n");
3180 			rc = -ENOMEM;
3181 			goto done;
3182 		}
3183 
3184 		sqp_entry = &rdev->gsi_ctx.sqp_tbl[rq_prod_index];
3185 		sqp_entry->sge.addr = wr->sg_list[0].addr;
3186 		sqp_entry->sge.lkey = wr->sg_list[0].lkey;
3187 		sqp_entry->sge.size = wr->sg_list[0].length;
3188 		/* Store the wrid for reporting completion */
3189 		sqp_entry->wrid = wqe->wr_id;
3190 		/* change the wqe->wrid to table index */
3191 		wqe->wr_id = rq_prod_index;
3192 	}
3193 done:
3194 	return rc;
3195 }
3196 
is_ud_qp(struct bnxt_re_qp * qp)3197 static bool is_ud_qp(struct bnxt_re_qp *qp)
3198 {
3199 	return (qp->qplib_qp.type == CMDQ_CREATE_QP_TYPE_UD ||
3200 		qp->qplib_qp.type == CMDQ_CREATE_QP_TYPE_GSI);
3201 }
3202 
bnxt_re_build_send_wqe(struct bnxt_re_qp * qp,const struct ib_send_wr * wr,struct bnxt_qplib_swqe * wqe)3203 static int bnxt_re_build_send_wqe(struct bnxt_re_qp *qp,
3204 				  const struct ib_send_wr *wr,
3205 				  struct bnxt_qplib_swqe *wqe)
3206 {
3207 	struct bnxt_re_ah *ah = NULL;
3208 
3209 	if(is_ud_qp(qp)) {
3210 		ah = to_bnxt_re(ud_wr(wr)->ah, struct bnxt_re_ah, ibah);
3211 		wqe->send.q_key = ud_wr(wr)->remote_qkey;
3212 		wqe->send.dst_qp = ud_wr(wr)->remote_qpn;
3213 		wqe->send.avid = ah->qplib_ah.id;
3214 	}
3215 	switch (wr->opcode) {
3216 	case IB_WR_SEND:
3217 		wqe->type = BNXT_QPLIB_SWQE_TYPE_SEND;
3218 		break;
3219 	case IB_WR_SEND_WITH_IMM:
3220 		wqe->type = BNXT_QPLIB_SWQE_TYPE_SEND_WITH_IMM;
3221 		wqe->send.imm_data = wr->ex.imm_data;
3222 		break;
3223 	case IB_WR_SEND_WITH_INV:
3224 		wqe->type = BNXT_QPLIB_SWQE_TYPE_SEND_WITH_INV;
3225 		wqe->send.inv_key = wr->ex.invalidate_rkey;
3226 		break;
3227 	default:
3228 		dev_err(rdev_to_dev(qp->rdev), "%s Invalid opcode %d!\n",
3229 			__func__, wr->opcode);
3230 		return -EINVAL;
3231 	}
3232 	if (wr->send_flags & IB_SEND_SIGNALED)
3233 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_SIGNAL_COMP;
3234 	if (wr->send_flags & IB_SEND_FENCE)
3235 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_UC_FENCE;
3236 	if (wr->send_flags & IB_SEND_SOLICITED)
3237 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_SOLICIT_EVENT;
3238 	if (wr->send_flags & IB_SEND_INLINE)
3239 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_INLINE;
3240 
3241 	return 0;
3242 }
3243 
bnxt_re_build_rdma_wqe(const struct ib_send_wr * wr,struct bnxt_qplib_swqe * wqe)3244 static int bnxt_re_build_rdma_wqe(const struct ib_send_wr *wr,
3245 				  struct bnxt_qplib_swqe *wqe)
3246 {
3247 	switch (wr->opcode) {
3248 	case IB_WR_RDMA_WRITE:
3249 		wqe->type = BNXT_QPLIB_SWQE_TYPE_RDMA_WRITE;
3250 		break;
3251 	case IB_WR_RDMA_WRITE_WITH_IMM:
3252 		wqe->type = BNXT_QPLIB_SWQE_TYPE_RDMA_WRITE_WITH_IMM;
3253 		wqe->rdma.imm_data = wr->ex.imm_data;
3254 		break;
3255 	case IB_WR_RDMA_READ:
3256 		wqe->type = BNXT_QPLIB_SWQE_TYPE_RDMA_READ;
3257 		wqe->rdma.inv_key = wr->ex.invalidate_rkey;
3258 		break;
3259 	default:
3260 		return -EINVAL;
3261 	}
3262 	wqe->rdma.remote_va = rdma_wr(wr)->remote_addr;
3263 	wqe->rdma.r_key = rdma_wr(wr)->rkey;
3264 	if (wr->send_flags & IB_SEND_SIGNALED)
3265 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_SIGNAL_COMP;
3266 	if (wr->send_flags & IB_SEND_FENCE)
3267 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_UC_FENCE;
3268 	if (wr->send_flags & IB_SEND_SOLICITED)
3269 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_SOLICIT_EVENT;
3270 	if (wr->send_flags & IB_SEND_INLINE)
3271 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_INLINE;
3272 
3273 	return 0;
3274 }
3275 
bnxt_re_build_atomic_wqe(const struct ib_send_wr * wr,struct bnxt_qplib_swqe * wqe)3276 static int bnxt_re_build_atomic_wqe(const struct ib_send_wr *wr,
3277 				    struct bnxt_qplib_swqe *wqe)
3278 {
3279 	switch (wr->opcode) {
3280 	case IB_WR_ATOMIC_CMP_AND_SWP:
3281 		wqe->type = BNXT_QPLIB_SWQE_TYPE_ATOMIC_CMP_AND_SWP;
3282 		wqe->atomic.cmp_data = atomic_wr(wr)->compare_add;
3283 		wqe->atomic.swap_data = atomic_wr(wr)->swap;
3284 		break;
3285 	case IB_WR_ATOMIC_FETCH_AND_ADD:
3286 		wqe->type = BNXT_QPLIB_SWQE_TYPE_ATOMIC_FETCH_AND_ADD;
3287 		wqe->atomic.cmp_data = atomic_wr(wr)->compare_add;
3288 		break;
3289 	default:
3290 		return -EINVAL;
3291 	}
3292 	wqe->atomic.remote_va = atomic_wr(wr)->remote_addr;
3293 	wqe->atomic.r_key = atomic_wr(wr)->rkey;
3294 	if (wr->send_flags & IB_SEND_SIGNALED)
3295 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_SIGNAL_COMP;
3296 	if (wr->send_flags & IB_SEND_FENCE)
3297 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_UC_FENCE;
3298 	if (wr->send_flags & IB_SEND_SOLICITED)
3299 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_SOLICIT_EVENT;
3300 	return 0;
3301 }
3302 
bnxt_re_build_inv_wqe(const struct ib_send_wr * wr,struct bnxt_qplib_swqe * wqe)3303 static int bnxt_re_build_inv_wqe(const struct ib_send_wr *wr,
3304 				 struct bnxt_qplib_swqe *wqe)
3305 {
3306 	wqe->type = BNXT_QPLIB_SWQE_TYPE_LOCAL_INV;
3307 	wqe->local_inv.inv_l_key = wr->ex.invalidate_rkey;
3308 	if (wr->send_flags & IB_SEND_SIGNALED)
3309 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_SIGNAL_COMP;
3310 	if (wr->send_flags & IB_SEND_FENCE)
3311 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_UC_FENCE;
3312 	if (wr->send_flags & IB_SEND_SOLICITED)
3313 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_SOLICIT_EVENT;
3314 
3315 	return 0;
3316 }
3317 
bnxt_re_build_reg_wqe(const struct ib_reg_wr * wr,struct bnxt_qplib_swqe * wqe)3318 static int bnxt_re_build_reg_wqe(const struct ib_reg_wr *wr,
3319 				 struct bnxt_qplib_swqe *wqe)
3320 {
3321 	struct bnxt_re_mr *mr = to_bnxt_re(wr->mr, struct bnxt_re_mr, ib_mr);
3322 	struct bnxt_qplib_frpl *qplib_frpl = &mr->qplib_frpl;
3323 	int reg_len, i, access = wr->access;
3324 
3325 	if (mr->npages > qplib_frpl->max_pg_ptrs) {
3326 		dev_err_ratelimited(rdev_to_dev(mr->rdev),
3327 			" %s: failed npages %d > %d\n", __func__,
3328 			mr->npages, qplib_frpl->max_pg_ptrs);
3329 		return -EINVAL;
3330 	}
3331 
3332 	wqe->frmr.pbl_ptr = (__le64 *)qplib_frpl->hwq.pbl_ptr[0];
3333 	wqe->frmr.pbl_dma_ptr = qplib_frpl->hwq.pbl_dma_ptr[0];
3334 	wqe->frmr.levels = qplib_frpl->hwq.level;
3335 	wqe->frmr.page_list = mr->pages;
3336 	wqe->frmr.page_list_len = mr->npages;
3337 	wqe->type = BNXT_QPLIB_SWQE_TYPE_REG_MR;
3338 
3339 	if (wr->wr.send_flags & IB_SEND_SIGNALED)
3340 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_SIGNAL_COMP;
3341 	if (access & IB_ACCESS_LOCAL_WRITE)
3342 		wqe->frmr.access_cntl |= SQ_FR_PMR_ACCESS_CNTL_LOCAL_WRITE;
3343 	if (access & IB_ACCESS_REMOTE_READ)
3344 		wqe->frmr.access_cntl |= SQ_FR_PMR_ACCESS_CNTL_REMOTE_READ;
3345 	if (access & IB_ACCESS_REMOTE_WRITE)
3346 		wqe->frmr.access_cntl |= SQ_FR_PMR_ACCESS_CNTL_REMOTE_WRITE;
3347 	if (access & IB_ACCESS_REMOTE_ATOMIC)
3348 		wqe->frmr.access_cntl |= SQ_FR_PMR_ACCESS_CNTL_REMOTE_ATOMIC;
3349 	if (access & IB_ACCESS_MW_BIND)
3350 		wqe->frmr.access_cntl |= SQ_FR_PMR_ACCESS_CNTL_WINDOW_BIND;
3351 
3352 	/* TODO: OFED provides the rkey of the MR instead of the lkey */
3353 	wqe->frmr.l_key = wr->key;
3354 	wqe->frmr.length = wr->mr->length;
3355 	wqe->frmr.pbl_pg_sz_log = ilog2(PAGE_SIZE >> PAGE_SHIFT_4K);
3356 	wqe->frmr.pg_sz_log = ilog2(wr->mr->page_size >> PAGE_SHIFT_4K);
3357 	wqe->frmr.va = wr->mr->iova;
3358 	reg_len = wqe->frmr.page_list_len * wr->mr->page_size;
3359 
3360 	if (wqe->frmr.length > reg_len) {
3361 		dev_err_ratelimited(rdev_to_dev(mr->rdev),
3362 				    "%s: bnxt_re_mr 0x%px  len (%d > %d)\n",
3363 				    __func__, (void *)mr, wqe->frmr.length,
3364 				    reg_len);
3365 
3366 		for (i = 0; i < mr->npages; i++)
3367 			dev_dbg(rdev_to_dev(mr->rdev),
3368 				"%s: build_reg_wqe page[%d] = 0x%llx\n",
3369 				__func__, i, mr->pages[i]);
3370 
3371 		return -EINVAL;
3372 	}
3373 
3374 	return 0;
3375 }
3376 
bnxt_re_set_sg_list(const struct ib_send_wr * wr,struct bnxt_qplib_swqe * wqe)3377 static void bnxt_re_set_sg_list(const struct ib_send_wr *wr,
3378 				struct bnxt_qplib_swqe *wqe)
3379 {
3380 	wqe->sg_list = (struct bnxt_qplib_sge *)wr->sg_list;
3381 	wqe->num_sge = wr->num_sge;
3382 }
3383 
bnxt_ud_qp_hw_stall_workaround(struct bnxt_re_qp * qp)3384 static void bnxt_ud_qp_hw_stall_workaround(struct bnxt_re_qp *qp)
3385 {
3386 	if ((qp->ib_qp.qp_type == IB_QPT_UD || qp->ib_qp.qp_type == IB_QPT_GSI ||
3387 	    qp->ib_qp.qp_type == IB_QPT_RAW_ETHERTYPE) &&
3388 	    qp->qplib_qp.wqe_cnt == BNXT_RE_UD_QP_HW_STALL) {
3389 		int qp_attr_mask;
3390 		struct ib_qp_attr qp_attr;
3391 
3392 		qp_attr_mask = IB_QP_STATE;
3393 		qp_attr.qp_state = IB_QPS_RTS;
3394 		bnxt_re_modify_qp(&qp->ib_qp, &qp_attr, qp_attr_mask, NULL);
3395 		qp->qplib_qp.wqe_cnt = 0;
3396 	}
3397 }
3398 
bnxt_re_post_send_shadow_qp(struct bnxt_re_dev * rdev,struct bnxt_re_qp * qp,const struct ib_send_wr * wr)3399 static int bnxt_re_post_send_shadow_qp(struct bnxt_re_dev *rdev,
3400 				       struct bnxt_re_qp *qp,
3401 				       const struct ib_send_wr *wr)
3402 {
3403 	struct bnxt_qplib_swqe wqe;
3404 	unsigned long flags;
3405 	int rc = 0;
3406 
3407 	spin_lock_irqsave(&qp->sq_lock, flags);
3408 	while (wr) {
3409 		/* House keeping */
3410 		memset(&wqe, 0, sizeof(wqe));
3411 		/* Common */
3412 		if (wr->num_sge > qp->qplib_qp.sq.max_sge) {
3413 			dev_err(rdev_to_dev(rdev),
3414 				"Limit exceeded for Send SGEs\n");
3415 			rc = -EINVAL;
3416 			break;
3417 		}
3418 
3419 		bnxt_re_set_sg_list(wr, &wqe);
3420 		wqe.wr_id = wr->wr_id;
3421 		wqe.type = BNXT_QPLIB_SWQE_TYPE_SEND;
3422 		rc = bnxt_re_build_send_wqe(qp, wr, &wqe);
3423 		if (rc)
3424 			break;
3425 
3426 		rc = bnxt_qplib_post_send(&qp->qplib_qp, &wqe);
3427 		if (rc) {
3428 			dev_err(rdev_to_dev(rdev),
3429 				"bad_wr seen with opcode = 0x%x rc = %d\n",
3430 				wr->opcode, rc);
3431 			break;
3432 		}
3433 		wr = wr->next;
3434 	}
3435 	bnxt_qplib_post_send_db(&qp->qplib_qp);
3436 	bnxt_ud_qp_hw_stall_workaround(qp);
3437 	spin_unlock_irqrestore(&qp->sq_lock, flags);
3438 	return rc;
3439 }
3440 
bnxt_re_legacy_set_uc_fence(struct bnxt_qplib_swqe * wqe)3441 static void bnxt_re_legacy_set_uc_fence(struct bnxt_qplib_swqe *wqe)
3442 {
3443 	/* Need unconditional fence for non-wire memory opcode
3444 	 * to work as expected.
3445 	 */
3446 	if (wqe->type == BNXT_QPLIB_SWQE_TYPE_LOCAL_INV ||
3447 	    wqe->type == BNXT_QPLIB_SWQE_TYPE_FAST_REG_MR ||
3448 	    wqe->type == BNXT_QPLIB_SWQE_TYPE_REG_MR ||
3449 	    wqe->type == BNXT_QPLIB_SWQE_TYPE_BIND_MW)
3450 		wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_UC_FENCE;
3451 }
3452 
bnxt_re_post_send(struct ib_qp * ib_qp,const struct ib_send_wr * wr,const struct ib_send_wr ** bad_wr)3453 int bnxt_re_post_send(struct ib_qp *ib_qp, const struct ib_send_wr *wr,
3454 		      const struct ib_send_wr **bad_wr)
3455 {
3456 	struct bnxt_re_qp *qp = to_bnxt_re(ib_qp, struct bnxt_re_qp, ib_qp);
3457 	struct bnxt_qplib_sge sge[6];
3458 	struct bnxt_qplib_swqe wqe;
3459 	struct bnxt_re_dev *rdev;
3460 	unsigned long flags;
3461 	int rc = 0;
3462 
3463 	rdev = qp->rdev;
3464 	spin_lock_irqsave(&qp->sq_lock, flags);
3465 	while (wr) {
3466 		/* House keeping */
3467 		memset(&wqe, 0, sizeof(wqe));
3468 		/* Common */
3469 		if (wr->num_sge > qp->qplib_qp.sq.max_sge) {
3470 			dev_err(rdev_to_dev(rdev),
3471 				"Limit exceeded for Send SGEs\n");
3472 			rc = -EINVAL;
3473 			goto bad;
3474 		}
3475 
3476 		bnxt_re_set_sg_list(wr, &wqe);
3477 		wqe.wr_id = wr->wr_id;
3478 
3479 		switch (wr->opcode) {
3480 		case IB_WR_SEND:
3481 		case IB_WR_SEND_WITH_IMM:
3482 			if (ib_qp->qp_type == IB_QPT_GSI &&
3483 			    rdev->gsi_ctx.gsi_qp_mode != BNXT_RE_GSI_MODE_UD) {
3484 				memset(sge, 0, sizeof(sge));
3485 				wqe.sg_list = sge;
3486 				rc = bnxt_re_build_gsi_send(qp, wr, &wqe);
3487 				if (rc)
3488 					goto bad;
3489 			} else if (ib_qp->qp_type == IB_QPT_RAW_ETHERTYPE) {
3490 				bnxt_re_build_raw_send(wr, &wqe);
3491 			}
3492 			switch (wr->send_flags) {
3493 			case IB_SEND_IP_CSUM:
3494 				wqe.rawqp1.lflags |=
3495 					SQ_SEND_RAWETH_QP1_LFLAGS_IP_CHKSUM;
3496 				break;
3497 			default:
3498 				break;
3499 			}
3500 			fallthrough;
3501 		case IB_WR_SEND_WITH_INV:
3502 			rc = bnxt_re_build_send_wqe(qp, wr, &wqe);
3503 			break;
3504 		case IB_WR_RDMA_WRITE:
3505 		case IB_WR_RDMA_WRITE_WITH_IMM:
3506 		case IB_WR_RDMA_READ:
3507 			rc = bnxt_re_build_rdma_wqe(wr, &wqe);
3508 			break;
3509 		case IB_WR_ATOMIC_CMP_AND_SWP:
3510 		case IB_WR_ATOMIC_FETCH_AND_ADD:
3511 			rc = bnxt_re_build_atomic_wqe(wr, &wqe);
3512 			break;
3513 		case IB_WR_RDMA_READ_WITH_INV:
3514 			dev_err(rdev_to_dev(rdev),
3515 				"RDMA Read with Invalidate is not supported\n");
3516 			rc = -EINVAL;
3517 			goto bad;
3518 		case IB_WR_LOCAL_INV:
3519 			rc = bnxt_re_build_inv_wqe(wr, &wqe);
3520 			break;
3521 		case IB_WR_REG_MR:
3522 			rc = bnxt_re_build_reg_wqe(reg_wr(wr), &wqe);
3523 			break;
3524 		default:
3525 			/* Unsupported WRs */
3526 			dev_err(rdev_to_dev(rdev),
3527 				"WR (0x%x) is not supported\n", wr->opcode);
3528 			rc = -EINVAL;
3529 			goto bad;
3530 		}
3531 
3532 		if (likely(!rc)) {
3533 			if (!_is_chip_gen_p5_p7(rdev->chip_ctx))
3534 				bnxt_re_legacy_set_uc_fence(&wqe);
3535 			rc = bnxt_qplib_post_send(&qp->qplib_qp, &wqe);
3536 		}
3537 bad:
3538 		if (unlikely(rc)) {
3539 			dev_err(rdev_to_dev(rdev),
3540 				"bad_wr seen with opcode = 0x%x\n", wr->opcode);
3541 			*bad_wr = wr;
3542 			break;
3543 		}
3544 		wr = wr->next;
3545 	}
3546 	bnxt_qplib_post_send_db(&qp->qplib_qp);
3547 	if (!_is_chip_gen_p5_p7(rdev->chip_ctx))
3548 		bnxt_ud_qp_hw_stall_workaround(qp);
3549 	spin_unlock_irqrestore(&qp->sq_lock, flags);
3550 
3551 	return rc;
3552 }
3553 
bnxt_re_post_recv_shadow_qp(struct bnxt_re_dev * rdev,struct bnxt_re_qp * qp,struct ib_recv_wr * wr)3554 static int bnxt_re_post_recv_shadow_qp(struct bnxt_re_dev *rdev,
3555 				struct bnxt_re_qp *qp,
3556 				struct ib_recv_wr *wr)
3557 {
3558 	struct bnxt_qplib_swqe wqe;
3559 	int rc = 0;
3560 
3561 	/* rq lock can be pardoned here. */
3562 	while (wr) {
3563 		/* House keeping */
3564 		memset(&wqe, 0, sizeof(wqe));
3565 		/* Common */
3566 		if (wr->num_sge > qp->qplib_qp.rq.max_sge) {
3567 			dev_err(rdev_to_dev(rdev),
3568 				"Limit exceeded for Receive SGEs\n");
3569 			rc = -EINVAL;
3570 			goto bad;
3571 		}
3572 
3573 		wqe.sg_list = (struct bnxt_qplib_sge *)wr->sg_list;
3574 		wqe.num_sge = wr->num_sge;
3575 		wqe.wr_id = wr->wr_id;
3576 		wqe.type = BNXT_QPLIB_SWQE_TYPE_RECV;
3577 		rc = bnxt_qplib_post_recv(&qp->qplib_qp, &wqe);
3578 bad:
3579 		if (rc) {
3580 			dev_err(rdev_to_dev(rdev),
3581 				"bad_wr seen with RQ post\n");
3582 			break;
3583 		}
3584 		wr = wr->next;
3585 	}
3586 	bnxt_qplib_post_recv_db(&qp->qplib_qp);
3587 	return rc;
3588 }
3589 
bnxt_re_build_gsi_recv(struct bnxt_re_qp * qp,const struct ib_recv_wr * wr,struct bnxt_qplib_swqe * wqe)3590 static int bnxt_re_build_gsi_recv(struct bnxt_re_qp *qp,
3591 				  const struct ib_recv_wr *wr,
3592 				  struct bnxt_qplib_swqe *wqe)
3593 {
3594 	struct bnxt_re_dev *rdev = qp->rdev;
3595 	int rc = 0;
3596 
3597 	if (rdev->gsi_ctx.gsi_qp_mode == BNXT_RE_GSI_MODE_ALL)
3598 		rc = bnxt_re_build_qp1_shadow_qp_recv(qp, wr, wqe);
3599 	else
3600 		rc = bnxt_re_build_qp1_recv(qp, wr, wqe);
3601 
3602 	return rc;
3603 }
3604 
bnxt_re_post_recv(struct ib_qp * ib_qp,const struct ib_recv_wr * wr,const struct ib_recv_wr ** bad_wr)3605 int bnxt_re_post_recv(struct ib_qp *ib_qp, const struct ib_recv_wr *wr,
3606 		      const struct ib_recv_wr **bad_wr)
3607 {
3608 	struct bnxt_re_qp *qp = to_bnxt_re(ib_qp, struct bnxt_re_qp, ib_qp);
3609 	struct bnxt_qplib_sge sge[6];
3610 	struct bnxt_qplib_swqe wqe;
3611 	unsigned long flags;
3612 	u32 count = 0;
3613 	int rc = 0;
3614 
3615 	spin_lock_irqsave(&qp->rq_lock, flags);
3616 	while (wr) {
3617 		memset(&wqe, 0, sizeof(wqe));
3618 		if (wr->num_sge > qp->qplib_qp.rq.max_sge) {
3619 			dev_err(rdev_to_dev(qp->rdev),
3620 				"Limit exceeded for Receive SGEs\n");
3621 			rc = -EINVAL;
3622 			goto bad;
3623 		}
3624 		wqe.num_sge = wr->num_sge;
3625 		wqe.sg_list = (struct bnxt_qplib_sge *)wr->sg_list;
3626 		wqe.wr_id = wr->wr_id;
3627 		wqe.type = BNXT_QPLIB_SWQE_TYPE_RECV;
3628 
3629 		if (ib_qp->qp_type == IB_QPT_GSI &&
3630 		    qp->rdev->gsi_ctx.gsi_qp_mode != BNXT_RE_GSI_MODE_UD) {
3631 			memset(sge, 0, sizeof(sge));
3632 			wqe.sg_list = sge;
3633 			rc = bnxt_re_build_gsi_recv(qp, wr, &wqe);
3634 			if (rc)
3635 				goto bad;
3636 		}
3637 		rc = bnxt_qplib_post_recv(&qp->qplib_qp, &wqe);
3638 bad:
3639 		if (rc) {
3640 			dev_err(rdev_to_dev(qp->rdev),
3641 				"bad_wr seen with RQ post\n");
3642 			*bad_wr = wr;
3643 			break;
3644 		}
3645 		/* Ring DB if the RQEs posted reaches a threshold value */
3646 		if (++count >= BNXT_RE_RQ_WQE_THRESHOLD) {
3647 			bnxt_qplib_post_recv_db(&qp->qplib_qp);
3648 			count = 0;
3649 		}
3650 		wr = wr->next;
3651 	}
3652 
3653 	if (count)
3654 		bnxt_qplib_post_recv_db(&qp->qplib_qp);
3655 	spin_unlock_irqrestore(&qp->rq_lock, flags);
3656 
3657 	return rc;
3658 }
3659 
3660 /* Completion Queues */
bnxt_re_destroy_cq(struct ib_cq * ib_cq,struct ib_udata * udata)3661 void bnxt_re_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata)
3662 {
3663 	struct bnxt_re_cq *cq = to_bnxt_re(ib_cq, struct bnxt_re_cq, ibcq);
3664 	struct bnxt_re_dev *rdev = cq->rdev;
3665 	int rc =  0;
3666 
3667 	if (cq->uctx_cq_page) {
3668 		BNXT_RE_CQ_PAGE_LIST_DEL(cq->uctx, cq);
3669 		free_page((u64)cq->uctx_cq_page);
3670 		cq->uctx_cq_page = NULL;
3671 	}
3672 	if (cq->is_dbr_soft_cq && cq->uctx) {
3673 		void *dbr_page;
3674 
3675 		if (cq->uctx->dbr_recov_cq) {
3676 			dbr_page = cq->uctx->dbr_recov_cq_page;
3677 			cq->uctx->dbr_recov_cq_page = NULL;
3678 			cq->uctx->dbr_recov_cq = NULL;
3679 			free_page((unsigned long)dbr_page);
3680 		}
3681 		goto end;
3682 	}
3683 	/* CQ getting destroyed. Set this state for cqn handler */
3684 	spin_lock_bh(&cq->qplib_cq.compl_lock);
3685 	cq->qplib_cq.destroyed = true;
3686 	spin_unlock_bh(&cq->qplib_cq.compl_lock);
3687 	if (ib_cq->poll_ctx == IB_POLL_WORKQUEUE ||
3688 	    ib_cq->poll_ctx == IB_POLL_UNBOUND_WORKQUEUE)
3689 		cancel_work_sync(&ib_cq->work);
3690 
3691 	rc = bnxt_qplib_destroy_cq(&rdev->qplib_res, &cq->qplib_cq);
3692 	if (rc)
3693 		dev_err_ratelimited(rdev_to_dev(rdev),
3694 				   "%s id = %d failed rc = %d\n",
3695 				   __func__, cq->qplib_cq.id, rc);
3696 
3697 	bnxt_re_put_nq(rdev, cq->qplib_cq.nq);
3698 	if (cq->umem && !IS_ERR(cq->umem))
3699 		ib_umem_release(cq->umem);
3700 
3701 	kfree(cq->cql);
3702 	atomic_dec(&rdev->stats.rsors.cq_count);
3703 end:
3704 	return;
3705 }
3706 
3707 static inline struct
__get_cq_from_cq_in(struct ib_cq * cq_in,struct bnxt_re_dev * rdev)3708 bnxt_re_cq *__get_cq_from_cq_in(struct ib_cq *cq_in,
3709 				struct bnxt_re_dev *rdev)
3710 {
3711 	struct bnxt_re_cq *cq;
3712 	cq = container_of(cq_in, struct bnxt_re_cq, ibcq);
3713 	return cq;
3714 }
3715 
bnxt_re_create_cq(struct ib_cq * cq_in,const struct ib_cq_init_attr * attr,struct ib_udata * udata)3716 int bnxt_re_create_cq(struct ib_cq *cq_in,
3717 		      const struct ib_cq_init_attr *attr,
3718 		      struct ib_udata *udata)
3719 {
3720 	struct bnxt_qplib_dev_attr *dev_attr;
3721 	struct bnxt_re_ucontext *uctx = NULL;
3722 	struct ib_ucontext *context = NULL;
3723 	struct bnxt_qplib_cq *qplcq;
3724 	struct bnxt_re_cq_req ureq;
3725 	struct bnxt_re_dev *rdev;
3726 	int rc, entries;
3727 	struct bnxt_re_cq *cq;
3728 	u32 max_active_cqs;
3729 	int cqe = attr->cqe;
3730 
3731 	if (attr->flags)
3732 		return -EOPNOTSUPP;
3733 
3734 	rdev = rdev_from_cq_in(cq_in);
3735 	if (rdev->mod_exit) {
3736 		rc = -EIO;
3737 		dev_dbg(rdev_to_dev(rdev), "%s(): in mod_exit, just return!\n", __func__);
3738 		goto exit;
3739 	}
3740 	if (udata) {
3741 		uctx = rdma_udata_to_drv_context(udata,
3742 						 struct bnxt_re_ucontext,
3743 						 ibucontext);
3744 		context = &uctx->ibucontext;
3745 	}
3746 	dev_attr = rdev->dev_attr;
3747 
3748 	if (atomic_read(&rdev->stats.rsors.cq_count) >= dev_attr->max_cq) {
3749 		dev_err(rdev_to_dev(rdev), "Create CQ failed - max exceeded(CQs)\n");
3750 		rc = -EINVAL;
3751 		goto exit;
3752 	}
3753 	/* Validate CQ fields */
3754 	if (cqe < 1 || cqe > dev_attr->max_cq_wqes) {
3755 		dev_err(rdev_to_dev(rdev), "Create CQ failed - max exceeded(CQ_WQs)\n");
3756 		rc = -EINVAL;
3757 		goto exit;
3758 	}
3759 
3760 	cq = __get_cq_from_cq_in(cq_in, rdev);
3761 	if (!cq) {
3762 		rc = -ENOMEM;
3763 		goto exit;
3764 	}
3765 	cq->rdev = rdev;
3766 	cq->uctx = uctx;
3767 	qplcq = &cq->qplib_cq;
3768 	qplcq->cq_handle = (u64)qplcq;
3769 	/*
3770 	 * Since CQ is for QP1 is shared with Shadow CQ, the size
3771 	 * should be double the size. There is no way to identify
3772 	 * whether this CQ is for GSI QP. So assuming that the first
3773 	 * CQ created is for QP1
3774 	 */
3775 	if (!udata && !rdev->gsi_ctx.first_cq_created &&
3776 	    rdev->gsi_ctx.gsi_qp_mode == BNXT_RE_GSI_MODE_ALL) {
3777 		rdev->gsi_ctx.first_cq_created = true;
3778 		/*
3779 		 * Total CQE required for the CQ = CQE for QP1 RQ +
3780 		 * CQE for Shadow QP SQEs + CQE for Shadow QP RQEs.
3781 		 * Max entries of shadow QP SQ and RQ = QP1 RQEs = cqe
3782 		 */
3783 		cqe *= 3;
3784 	}
3785 
3786 	entries = bnxt_re_init_depth(cqe + 1, uctx);
3787 	if (entries > dev_attr->max_cq_wqes + 1)
3788 		entries = dev_attr->max_cq_wqes + 1;
3789 
3790 	qplcq->sginfo.pgshft = PAGE_SHIFT;
3791 	qplcq->sginfo.pgsize = PAGE_SIZE;
3792 	if (udata) {
3793 		if (udata->inlen < sizeof(ureq))
3794 			dev_warn(rdev_to_dev(rdev),
3795 				 "Update the library ulen %d klen %d\n",
3796 				 (unsigned int)udata->inlen,
3797 				 (unsigned int)sizeof(ureq));
3798 
3799 		rc = ib_copy_from_udata(&ureq, udata,
3800 					min(udata->inlen, sizeof(ureq)));
3801 		if (rc)
3802 			goto fail;
3803 
3804 		if (BNXT_RE_IS_DBR_PACING_NOTIFY_CQ(ureq)) {
3805 			cq->is_dbr_soft_cq = true;
3806 			goto success;
3807 		}
3808 
3809 		if (BNXT_RE_IS_DBR_RECOV_CQ(ureq)) {
3810 			void *dbr_page;
3811 			u32 *epoch;
3812 
3813 			dbr_page = (void *)__get_free_page(GFP_KERNEL);
3814 			if (!dbr_page) {
3815 				dev_err(rdev_to_dev(rdev),
3816 					"DBR recov CQ page allocation failed!");
3817 				rc = -ENOMEM;
3818 				goto fail;
3819 			}
3820 
3821 			/* memset the epoch and epoch_ack to 0 */
3822 			epoch = dbr_page;
3823 			epoch[0] = 0x0;
3824 			epoch[1] = 0x0;
3825 
3826 			uctx->dbr_recov_cq = cq;
3827 			uctx->dbr_recov_cq_page = dbr_page;
3828 
3829 			cq->is_dbr_soft_cq = true;
3830 			goto success;
3831 		}
3832 
3833 		cq->umem = ib_umem_get_compat
3834 				      (rdev, context, udata, ureq.cq_va,
3835 				       entries * sizeof(struct cq_base),
3836 				       IB_ACCESS_LOCAL_WRITE, 1);
3837 		if (IS_ERR(cq->umem)) {
3838 			rc = PTR_ERR(cq->umem);
3839 			dev_err(rdev_to_dev(rdev),
3840 				"%s: ib_umem_get failed! rc = %d\n",
3841 				__func__, rc);
3842 			goto fail;
3843 		}
3844 		qplcq->sginfo.sghead = get_ib_umem_sgl(cq->umem,
3845 						       &qplcq->sginfo.nmap);
3846 		qplcq->sginfo.npages = ib_umem_num_pages_compat(cq->umem);
3847 		if (!uctx->dpi.dbr) {
3848 			rc = bnxt_re_get_user_dpi(rdev, uctx);
3849 			if (rc)
3850 				goto c2fail;
3851 		}
3852 		qplcq->dpi = &uctx->dpi;
3853 	} else {
3854 		cq->max_cql = entries > MAX_CQL_PER_POLL ? MAX_CQL_PER_POLL : entries;
3855 		cq->cql = kcalloc(cq->max_cql, sizeof(struct bnxt_qplib_cqe),
3856 				  GFP_KERNEL);
3857 		if (!cq->cql) {
3858 			dev_err(rdev_to_dev(rdev),
3859 				"Allocate CQL for %d failed!\n", cq->max_cql);
3860 			rc = -ENOMEM;
3861 			goto fail;
3862 		}
3863 		qplcq->dpi = &rdev->dpi_privileged;
3864 	}
3865 	/*
3866 	 * Allocating the NQ in a round robin fashion. nq_alloc_cnt is a
3867 	 * used for getting the NQ index.
3868 	 */
3869 	qplcq->max_wqe = entries;
3870 	qplcq->nq = bnxt_re_get_nq(rdev);
3871 	qplcq->cnq_hw_ring_id = qplcq->nq->ring_id;
3872 
3873 	rc = bnxt_qplib_create_cq(&rdev->qplib_res, qplcq);
3874 	if (rc) {
3875 		dev_err(rdev_to_dev(rdev), "Create HW CQ failed!\n");
3876 		goto fail;
3877 	}
3878 
3879 	INIT_LIST_HEAD(&cq->cq_list);
3880 	cq->ibcq.cqe = entries;
3881 	cq->cq_period = qplcq->period;
3882 
3883 	atomic_inc(&rdev->stats.rsors.cq_count);
3884 	max_active_cqs = atomic_read(&rdev->stats.rsors.cq_count);
3885 	if (max_active_cqs > atomic_read(&rdev->stats.rsors.max_cq_count))
3886 		atomic_set(&rdev->stats.rsors.max_cq_count, max_active_cqs);
3887 	spin_lock_init(&cq->cq_lock);
3888 
3889 	if (udata) {
3890 		struct bnxt_re_cq_resp resp;
3891 
3892 		resp.cqid = qplcq->id;
3893 		resp.tail = qplcq->hwq.cons;
3894 		resp.phase = qplcq->period;
3895 		resp.comp_mask = 0;
3896 		resp.dbr = (u64)uctx->dpi.umdbr;
3897 		resp.dpi = uctx->dpi.dpi;
3898 		resp.comp_mask |= BNXT_RE_COMP_MASK_CQ_HAS_DB_INFO;
3899 		/* Copy only on a valid wcpdi */
3900 		if (uctx->wcdpi.dpi) {
3901 			resp.wcdpi = uctx->wcdpi.dpi;
3902 			resp.comp_mask |= BNXT_RE_COMP_MASK_CQ_HAS_WC_DPI;
3903 		}
3904 
3905 		if (_is_chip_p7(rdev->chip_ctx)) {
3906 			cq->uctx_cq_page = (void *)__get_free_page(GFP_KERNEL);
3907 
3908 			if (!cq->uctx_cq_page) {
3909 				dev_err(rdev_to_dev(rdev),
3910 					"CQ page allocation failed!\n");
3911 				bnxt_qplib_destroy_cq(&rdev->qplib_res, qplcq);
3912 				rc = -ENOMEM;
3913 				goto c2fail;
3914 			}
3915 
3916 			resp.uctx_cq_page = (u64)cq->uctx_cq_page;
3917 			resp.comp_mask |= BNXT_RE_COMP_MASK_CQ_HAS_CQ_PAGE;
3918 		}
3919 
3920 		rc = bnxt_re_copy_to_udata(rdev, &resp,
3921 					   min(udata->outlen, sizeof(resp)),
3922 					   udata);
3923 		if (rc) {
3924 			free_page((u64)cq->uctx_cq_page);
3925 			cq->uctx_cq_page = NULL;
3926 			bnxt_qplib_destroy_cq(&rdev->qplib_res, qplcq);
3927 			goto c2fail;
3928 		}
3929 
3930 		if (cq->uctx_cq_page)
3931 			BNXT_RE_CQ_PAGE_LIST_ADD(uctx, cq);
3932 	}
3933 
3934 success:
3935 	return 0;
3936 c2fail:
3937 	if (udata && cq->umem && !IS_ERR(cq->umem))
3938 		ib_umem_release(cq->umem);
3939 fail:
3940 	if (cq) {
3941 		if (cq->cql)
3942 			kfree(cq->cql);
3943 	}
3944 exit:
3945 	return rc;
3946 }
3947 
bnxt_re_modify_cq(struct ib_cq * ib_cq,u16 cq_count,u16 cq_period)3948 int bnxt_re_modify_cq(struct ib_cq *ib_cq, u16 cq_count, u16 cq_period)
3949 {
3950 	struct bnxt_re_cq *cq = to_bnxt_re(ib_cq, struct bnxt_re_cq, ibcq);
3951 	struct bnxt_re_dev *rdev = cq->rdev;
3952 	int rc;
3953 
3954 	if ((cq->cq_count != cq_count) || (cq->cq_period != cq_period)) {
3955 		cq->qplib_cq.count = cq_count;
3956 		cq->qplib_cq.period = cq_period;
3957 		rc = bnxt_qplib_modify_cq(&rdev->qplib_res, &cq->qplib_cq);
3958 		if (rc) {
3959 			dev_err(rdev_to_dev(rdev), "Modify HW CQ %#x failed!\n",
3960 				cq->qplib_cq.id);
3961 			return rc;
3962 		}
3963 		/* On success, update the shadow */
3964 		cq->cq_count = cq_count;
3965 		cq->cq_period = cq_period;
3966 	}
3967 	return 0;
3968 }
3969 
bnxt_re_resize_cq_complete(struct bnxt_re_cq * cq)3970 static void bnxt_re_resize_cq_complete(struct bnxt_re_cq *cq)
3971 {
3972 	struct bnxt_re_dev *rdev = cq->rdev;
3973 
3974 	bnxt_qplib_resize_cq_complete(&rdev->qplib_res, &cq->qplib_cq);
3975 
3976 	cq->qplib_cq.max_wqe = cq->resize_cqe;
3977 	if (cq->resize_umem) {
3978 		ib_umem_release(cq->umem);
3979 		cq->umem = cq->resize_umem;
3980 		cq->resize_umem = NULL;
3981 		cq->resize_cqe = 0;
3982 	}
3983 }
3984 
bnxt_re_resize_cq(struct ib_cq * ib_cq,int cqe,struct ib_udata * udata)3985 int bnxt_re_resize_cq(struct ib_cq *ib_cq, int cqe, struct ib_udata *udata)
3986 {
3987 	struct bnxt_qplib_sg_info sginfo = {};
3988 	struct bnxt_qplib_dpi *orig_dpi = NULL;
3989 	struct bnxt_qplib_dev_attr *dev_attr;
3990 	struct bnxt_re_ucontext *uctx = NULL;
3991 	struct bnxt_re_resize_cq_req ureq;
3992 	struct ib_ucontext *context = NULL;
3993 	struct bnxt_re_dev *rdev;
3994 	struct bnxt_re_cq *cq;
3995 	int rc, entries;
3996 
3997 	/* Don't allow more than one resize request at the same time.
3998 	 * TODO: need a mutex here when we support kernel consumers of resize.
3999 	 */
4000 	cq =  to_bnxt_re(ib_cq, struct bnxt_re_cq, ibcq);
4001 	rdev = cq->rdev;
4002 	dev_attr = rdev->dev_attr;
4003 	if (ib_cq->uobject) {
4004 		uctx = rdma_udata_to_drv_context(udata,
4005 						 struct bnxt_re_ucontext,
4006 						 ibucontext);
4007 		context = &uctx->ibucontext;
4008 	}
4009 
4010 	if (cq->resize_umem) {
4011 		dev_err(rdev_to_dev(rdev), "Resize CQ %#x failed - Busy\n",
4012 			cq->qplib_cq.id);
4013 		return -EBUSY;
4014 	}
4015 
4016 	/* Check the requested cq depth out of supported depth */
4017 	if (cqe < 1 || cqe > dev_attr->max_cq_wqes) {
4018 		dev_err(rdev_to_dev(rdev), "Resize CQ %#x failed - max exceeded\n",
4019 			cq->qplib_cq.id);
4020 		return -EINVAL;
4021 	}
4022 
4023 	entries = bnxt_re_init_depth(cqe + 1, uctx);
4024 	entries = min_t(u32, (u32)entries, dev_attr->max_cq_wqes + 1);
4025 
4026 	/* Check to see if the new requested size can be handled by already
4027 	 * existing CQ
4028 	 */
4029 	if (entries == cq->ibcq.cqe) {
4030 		dev_info(rdev_to_dev(rdev), "CQ is already at size %d\n", cqe);
4031 		return 0;
4032 	}
4033 
4034 	if (ib_cq->uobject && udata) {
4035 		if (udata->inlen < sizeof(ureq))
4036 			dev_warn(rdev_to_dev(rdev),
4037 				 "Update the library ulen %d klen %d\n",
4038 				 (unsigned int)udata->inlen,
4039 				 (unsigned int)sizeof(ureq));
4040 
4041 		rc = ib_copy_from_udata(&ureq, udata,
4042 					min(udata->inlen, sizeof(ureq)));
4043 		if (rc)
4044 			goto fail;
4045 
4046 		dev_dbg(rdev_to_dev(rdev), "%s: va %p\n", __func__,
4047 			(void *)ureq.cq_va);
4048 		cq->resize_umem = ib_umem_get_compat
4049 				       (rdev,
4050 					context, udata, ureq.cq_va,
4051 					entries * sizeof(struct cq_base),
4052 					IB_ACCESS_LOCAL_WRITE, 1);
4053 		if (IS_ERR(cq->resize_umem)) {
4054 			rc = PTR_ERR(cq->resize_umem);
4055 			cq->resize_umem = NULL;
4056 			dev_err(rdev_to_dev(rdev), "%s: ib_umem_get failed! rc = %d\n",
4057 				__func__, rc);
4058 			goto fail;
4059 		}
4060 		cq->resize_cqe = entries;
4061 		dev_dbg(rdev_to_dev(rdev), "%s: ib_umem_get() success\n",
4062 			__func__);
4063 		memcpy(&sginfo, &cq->qplib_cq.sginfo, sizeof(sginfo));
4064 		orig_dpi = cq->qplib_cq.dpi;
4065 
4066 		cq->qplib_cq.sginfo.sghead = get_ib_umem_sgl(cq->resize_umem,
4067 						&cq->qplib_cq.sginfo.nmap);
4068 		cq->qplib_cq.sginfo.npages =
4069 				ib_umem_num_pages_compat(cq->resize_umem);
4070 		cq->qplib_cq.sginfo.pgsize = PAGE_SIZE;
4071 		cq->qplib_cq.sginfo.pgshft = PAGE_SHIFT;
4072 		cq->qplib_cq.dpi = &uctx->dpi;
4073 	} else {
4074 		/* TODO: kernel consumer */
4075 	}
4076 
4077 	rc = bnxt_qplib_resize_cq(&rdev->qplib_res, &cq->qplib_cq, entries);
4078 	if (rc) {
4079 		dev_err(rdev_to_dev(rdev), "Resize HW CQ %#x failed!\n",
4080 			cq->qplib_cq.id);
4081 		goto fail;
4082 	}
4083 
4084 	cq->ibcq.cqe = cq->resize_cqe;
4085 	/* For kernel consumers complete resize here. For uverbs consumers,
4086 	 * we complete it in the context of ibv_poll_cq().
4087 	 */
4088 	if (!cq->resize_umem)
4089 		bnxt_qplib_resize_cq_complete(&rdev->qplib_res, &cq->qplib_cq);
4090 
4091 	atomic_inc(&rdev->stats.rsors.resize_count);
4092 	return 0;
4093 
4094 fail:
4095 	if (cq->resize_umem) {
4096 		ib_umem_release(cq->resize_umem);
4097 		cq->resize_umem = NULL;
4098 		cq->resize_cqe = 0;
4099 		memcpy(&cq->qplib_cq.sginfo, &sginfo, sizeof(sginfo));
4100 		cq->qplib_cq.dpi = orig_dpi;
4101 	}
4102 	return rc;
4103 }
4104 
__req_to_ib_wc_status(u8 qstatus)4105 static enum ib_wc_status __req_to_ib_wc_status(u8 qstatus)
4106 {
4107 	switch(qstatus) {
4108 	case CQ_REQ_STATUS_OK:
4109 		return IB_WC_SUCCESS;
4110 	case CQ_REQ_STATUS_BAD_RESPONSE_ERR:
4111 		return IB_WC_BAD_RESP_ERR;
4112 	case CQ_REQ_STATUS_LOCAL_LENGTH_ERR:
4113 		return IB_WC_LOC_LEN_ERR;
4114 	case CQ_REQ_STATUS_LOCAL_QP_OPERATION_ERR:
4115 		return IB_WC_LOC_QP_OP_ERR;
4116 	case CQ_REQ_STATUS_LOCAL_PROTECTION_ERR:
4117 		return IB_WC_LOC_PROT_ERR;
4118 	case CQ_REQ_STATUS_MEMORY_MGT_OPERATION_ERR:
4119 		return IB_WC_GENERAL_ERR;
4120 	case CQ_REQ_STATUS_REMOTE_INVALID_REQUEST_ERR:
4121 		return IB_WC_REM_INV_REQ_ERR;
4122 	case CQ_REQ_STATUS_REMOTE_ACCESS_ERR:
4123 		return IB_WC_REM_ACCESS_ERR;
4124 	case CQ_REQ_STATUS_REMOTE_OPERATION_ERR:
4125 		return IB_WC_REM_OP_ERR;
4126 	case CQ_REQ_STATUS_RNR_NAK_RETRY_CNT_ERR:
4127 		return IB_WC_RNR_RETRY_EXC_ERR;
4128 	case CQ_REQ_STATUS_TRANSPORT_RETRY_CNT_ERR:
4129 		return IB_WC_RETRY_EXC_ERR;
4130 	case CQ_REQ_STATUS_WORK_REQUEST_FLUSHED_ERR:
4131 		return IB_WC_WR_FLUSH_ERR;
4132 	default:
4133 		return IB_WC_GENERAL_ERR;
4134 	}
4135 	return 0;
4136 }
4137 
__rawqp1_to_ib_wc_status(u8 qstatus)4138 static enum ib_wc_status __rawqp1_to_ib_wc_status(u8 qstatus)
4139 {
4140 	switch(qstatus) {
4141 	case CQ_RES_RAWETH_QP1_STATUS_OK:
4142 		return IB_WC_SUCCESS;
4143 	case CQ_RES_RAWETH_QP1_STATUS_LOCAL_ACCESS_ERROR:
4144 		return IB_WC_LOC_ACCESS_ERR;
4145 	case CQ_RES_RAWETH_QP1_STATUS_HW_LOCAL_LENGTH_ERR:
4146 		return IB_WC_LOC_LEN_ERR;
4147 	case CQ_RES_RAWETH_QP1_STATUS_LOCAL_PROTECTION_ERR:
4148 		return IB_WC_LOC_PROT_ERR;
4149 	case CQ_RES_RAWETH_QP1_STATUS_LOCAL_QP_OPERATION_ERR:
4150 		return IB_WC_LOC_QP_OP_ERR;
4151 	case CQ_RES_RAWETH_QP1_STATUS_MEMORY_MGT_OPERATION_ERR:
4152 		return IB_WC_GENERAL_ERR;
4153 	case CQ_RES_RAWETH_QP1_STATUS_WORK_REQUEST_FLUSHED_ERR:
4154 		return IB_WC_WR_FLUSH_ERR;
4155 	case CQ_RES_RAWETH_QP1_STATUS_HW_FLUSH_ERR:
4156 		return IB_WC_WR_FLUSH_ERR;
4157 	default:
4158 		return IB_WC_GENERAL_ERR;
4159 	}
4160 }
4161 
__rc_to_ib_wc_status(u8 qstatus)4162 static enum ib_wc_status __rc_to_ib_wc_status(u8 qstatus)
4163 {
4164 	switch(qstatus) {
4165 	case CQ_RES_RC_STATUS_OK:
4166 		return IB_WC_SUCCESS;
4167 	case CQ_RES_RC_STATUS_LOCAL_ACCESS_ERROR:
4168 		return IB_WC_LOC_ACCESS_ERR;
4169 	case CQ_RES_RC_STATUS_LOCAL_LENGTH_ERR:
4170 		return IB_WC_LOC_LEN_ERR;
4171 	case CQ_RES_RC_STATUS_LOCAL_PROTECTION_ERR:
4172 		return IB_WC_LOC_PROT_ERR;
4173 	case CQ_RES_RC_STATUS_LOCAL_QP_OPERATION_ERR:
4174 		return IB_WC_LOC_QP_OP_ERR;
4175 	case CQ_RES_RC_STATUS_MEMORY_MGT_OPERATION_ERR:
4176 		return IB_WC_GENERAL_ERR;
4177 	case CQ_RES_RC_STATUS_REMOTE_INVALID_REQUEST_ERR:
4178 		return IB_WC_REM_INV_REQ_ERR;
4179 	case CQ_RES_RC_STATUS_WORK_REQUEST_FLUSHED_ERR:
4180 		return IB_WC_WR_FLUSH_ERR;
4181 	case CQ_RES_RC_STATUS_HW_FLUSH_ERR:
4182 		return IB_WC_WR_FLUSH_ERR;
4183 	default:
4184 		return IB_WC_GENERAL_ERR;
4185 	}
4186 }
4187 
bnxt_re_process_req_wc(struct ib_wc * wc,struct bnxt_qplib_cqe * cqe)4188 static void bnxt_re_process_req_wc(struct ib_wc *wc, struct bnxt_qplib_cqe *cqe)
4189 {
4190 	switch (cqe->type) {
4191 	case BNXT_QPLIB_SWQE_TYPE_SEND:
4192 		wc->opcode = IB_WC_SEND;
4193 		break;
4194 	case BNXT_QPLIB_SWQE_TYPE_SEND_WITH_IMM:
4195 		wc->opcode = IB_WC_SEND;
4196 		wc->wc_flags |= IB_WC_WITH_IMM;
4197 		break;
4198 	case BNXT_QPLIB_SWQE_TYPE_SEND_WITH_INV:
4199 		wc->opcode = IB_WC_SEND;
4200 		wc->wc_flags |= IB_WC_WITH_INVALIDATE;
4201 		break;
4202 	case BNXT_QPLIB_SWQE_TYPE_RDMA_WRITE:
4203 		wc->opcode = IB_WC_RDMA_WRITE;
4204 		break;
4205 	case BNXT_QPLIB_SWQE_TYPE_RDMA_WRITE_WITH_IMM:
4206 		wc->opcode = IB_WC_RDMA_WRITE;
4207 		wc->wc_flags |= IB_WC_WITH_IMM;
4208 		break;
4209 	case BNXT_QPLIB_SWQE_TYPE_RDMA_READ:
4210 		wc->opcode = IB_WC_RDMA_READ;
4211 		break;
4212 	case BNXT_QPLIB_SWQE_TYPE_ATOMIC_CMP_AND_SWP:
4213 		wc->opcode = IB_WC_COMP_SWAP;
4214 		break;
4215 	case BNXT_QPLIB_SWQE_TYPE_ATOMIC_FETCH_AND_ADD:
4216 		wc->opcode = IB_WC_FETCH_ADD;
4217 		break;
4218 	case BNXT_QPLIB_SWQE_TYPE_LOCAL_INV:
4219 		wc->opcode = IB_WC_LOCAL_INV;
4220 		break;
4221 	case BNXT_QPLIB_SWQE_TYPE_REG_MR:
4222 		wc->opcode = IB_WC_REG_MR;
4223 		break;
4224 	default:
4225 		wc->opcode = IB_WC_SEND;
4226 		break;
4227 	}
4228 
4229 	wc->status = __req_to_ib_wc_status(cqe->status);
4230 }
4231 
bnxt_re_check_packet_type(u16 raweth_qp1_flags,u16 raweth_qp1_flags2)4232 static int bnxt_re_check_packet_type(u16 raweth_qp1_flags, u16 raweth_qp1_flags2)
4233 {
4234 	bool is_ipv6 = false, is_ipv4 = false;
4235 
4236 	/* raweth_qp1_flags Bit 9-6 indicates itype */
4237 
4238 	if ((raweth_qp1_flags & CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_ROCE)
4239 	    != CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS_ITYPE_ROCE)
4240 		return -1;
4241 
4242 	if (raweth_qp1_flags2 &
4243 	    CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_IP_CS_CALC &&
4244 	    raweth_qp1_flags2 &
4245 	    CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_L4_CS_CALC) {
4246 		/* raweth_qp1_flags2 Bit 8 indicates ip_type. 0-v4 1 - v6 */
4247 		(raweth_qp1_flags2 &
4248 		 CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_IP_TYPE) ?
4249 			(is_ipv6 = true) : (is_ipv4 = true);
4250 		return ((is_ipv6) ?
4251 			 BNXT_RE_ROCEV2_IPV6_PACKET :
4252 			 BNXT_RE_ROCEV2_IPV4_PACKET);
4253 	} else {
4254 		return BNXT_RE_ROCE_V1_PACKET;
4255 	}
4256 }
4257 
bnxt_re_is_loopback_packet(struct bnxt_re_dev * rdev,void * rq_hdr_buf)4258 static bool bnxt_re_is_loopback_packet(struct bnxt_re_dev *rdev,
4259 					    void *rq_hdr_buf)
4260 {
4261 	u8 *tmp_buf = NULL;
4262 	struct ethhdr *eth_hdr;
4263 	u16 eth_type;
4264 	bool rc = false;
4265 
4266 	tmp_buf = (u8 *)rq_hdr_buf;
4267 	/*
4268 	 * If dest mac is not same as I/F mac, this could be a
4269 	 * loopback address or multicast address, check whether
4270 	 * it is a loopback packet
4271 	 */
4272 	if (!ether_addr_equal(tmp_buf, rdev->dev_addr)) {
4273 		tmp_buf += 4;
4274 		/* Check the  ether type */
4275 		eth_hdr = (struct ethhdr *)tmp_buf;
4276 		eth_type = ntohs(eth_hdr->h_proto);
4277 		switch (eth_type) {
4278 		case BNXT_QPLIB_ETHTYPE_ROCEV1:
4279 			rc = true;
4280 			break;
4281 		default:
4282 			break;
4283 		}
4284 	}
4285 
4286 	return rc;
4287 }
4288 
bnxt_re_is_vlan_in_packet(struct bnxt_re_dev * rdev,void * rq_hdr_buf,struct bnxt_qplib_cqe * cqe)4289 static bool bnxt_re_is_vlan_in_packet(struct bnxt_re_dev *rdev,
4290 				      void *rq_hdr_buf,
4291 				      struct bnxt_qplib_cqe *cqe)
4292 {
4293 	struct vlan_hdr *vlan_hdr;
4294 	struct ethhdr *eth_hdr;
4295 	u8 *tmp_buf = NULL;
4296 	u16 eth_type;
4297 
4298 	tmp_buf = (u8 *)rq_hdr_buf;
4299 	/* Check the  ether type */
4300 	eth_hdr = (struct ethhdr *)tmp_buf;
4301 	eth_type = ntohs(eth_hdr->h_proto);
4302 	if (eth_type == ETH_P_8021Q) {
4303 		tmp_buf += sizeof(struct ethhdr);
4304 		vlan_hdr = (struct vlan_hdr *)tmp_buf;
4305 		cqe->raweth_qp1_metadata =
4306 			ntohs(vlan_hdr->h_vlan_TCI) |
4307 			(eth_type <<
4308 			 CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_TPID_SFT);
4309 		cqe->raweth_qp1_flags2 |=
4310 			CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_VLAN;
4311 		return true;
4312 	}
4313 
4314 	return false;
4315 }
4316 
bnxt_re_process_raw_qp_packet_receive(struct bnxt_re_qp * gsi_qp,struct bnxt_qplib_cqe * cqe)4317 static int bnxt_re_process_raw_qp_packet_receive(struct bnxt_re_qp *gsi_qp,
4318 						 struct bnxt_qplib_cqe *cqe)
4319 {
4320 	struct bnxt_re_sqp_entries *sqp_entry = NULL;
4321 	struct bnxt_qplib_hdrbuf *hdr_buf;
4322 	dma_addr_t shrq_hdr_buf_map;
4323 	struct ib_sge s_sge[2] = {};
4324 	struct ib_sge r_sge[2] = {};
4325 	struct ib_recv_wr rwr = {};
4326 	struct bnxt_re_ah *gsi_sah;
4327 	struct bnxt_re_qp *gsi_sqp;
4328 	dma_addr_t rq_hdr_buf_map;
4329 	struct bnxt_re_dev *rdev;
4330 	struct ib_send_wr *swr;
4331 	u32 skip_bytes = 0;
4332 	void *rq_hdr_buf;
4333 	int pkt_type = 0;
4334 	u32 offset = 0;
4335 	u32 tbl_idx;
4336 	int rc;
4337 	struct ib_ud_wr udwr = {};
4338 
4339 	swr = &udwr.wr;
4340 	rdev = gsi_qp->rdev;
4341 	gsi_sqp = rdev->gsi_ctx.gsi_sqp;
4342 	tbl_idx = cqe->wr_id;
4343 
4344 	hdr_buf = gsi_qp->qplib_qp.rq_hdr_buf;
4345 	rq_hdr_buf = (u8 *) hdr_buf->va + tbl_idx * hdr_buf->step;
4346 	rq_hdr_buf_map = bnxt_qplib_get_qp_buf_from_index(&gsi_qp->qplib_qp,
4347 							  tbl_idx);
4348 	/* Shadow QP header buffer */
4349 	shrq_hdr_buf_map = bnxt_qplib_get_qp_buf_from_index(&gsi_sqp->qplib_qp,
4350 							    tbl_idx);
4351 	sqp_entry = &rdev->gsi_ctx.sqp_tbl[tbl_idx];
4352 
4353 	/* Find packet type from the cqe */
4354 	pkt_type = bnxt_re_check_packet_type(cqe->raweth_qp1_flags,
4355 					     cqe->raweth_qp1_flags2);
4356 	if (pkt_type < 0) {
4357 		dev_err(rdev_to_dev(rdev), "Not handling this packet\n");
4358 		return -EINVAL;
4359 	}
4360 
4361 	/* Adjust the offset for the user buffer and post in the rq */
4362 
4363 	if (pkt_type == BNXT_RE_ROCEV2_IPV4_PACKET)
4364 		offset = 20;
4365 
4366 	/*
4367 	 * QP1 loopback packet has 4 bytes of internal header before
4368 	 * ether header. Skip these four bytes.
4369 	 */
4370 	if (bnxt_re_is_loopback_packet(rdev, rq_hdr_buf))
4371 		skip_bytes = 4;
4372 
4373 	if (bnxt_re_is_vlan_in_packet(rdev, rq_hdr_buf, cqe))
4374 		skip_bytes += VLAN_HLEN;
4375 
4376 	/* Store this cqe */
4377 	memcpy(&sqp_entry->cqe, cqe, sizeof(struct bnxt_qplib_cqe));
4378 	sqp_entry->qp1_qp = gsi_qp;
4379 
4380 	/* First send SGE . Skip the ether header*/
4381 	s_sge[0].addr = rq_hdr_buf_map + BNXT_QPLIB_MAX_QP1_RQ_ETH_HDR_SIZE
4382 			+ skip_bytes;
4383 	s_sge[0].lkey = 0xFFFFFFFF;
4384 	s_sge[0].length = offset ? BNXT_QPLIB_MAX_GRH_HDR_SIZE_IPV4 :
4385 				BNXT_QPLIB_MAX_GRH_HDR_SIZE_IPV6;
4386 
4387 	/* Second Send SGE */
4388 	s_sge[1].addr = s_sge[0].addr + s_sge[0].length +
4389 			BNXT_QPLIB_MAX_QP1_RQ_BDETH_HDR_SIZE;
4390 	if (pkt_type != BNXT_RE_ROCE_V1_PACKET)
4391 		s_sge[1].addr += 8;
4392 	s_sge[1].lkey = 0xFFFFFFFF;
4393 	s_sge[1].length = 256;
4394 
4395 	/* First recv SGE */
4396 	r_sge[0].addr = shrq_hdr_buf_map;
4397 	r_sge[0].lkey = 0xFFFFFFFF;
4398 	r_sge[0].length = 40;
4399 
4400 	r_sge[1].addr = sqp_entry->sge.addr + offset;
4401 	r_sge[1].lkey = sqp_entry->sge.lkey;
4402 	r_sge[1].length = BNXT_QPLIB_MAX_GRH_HDR_SIZE_IPV6 + 256 - offset;
4403 
4404 	/* Create receive work request */
4405 	rwr.num_sge = 2;
4406 	rwr.sg_list = r_sge;
4407 	rwr.wr_id = tbl_idx;
4408 	rwr.next = NULL;
4409 
4410 	rc = bnxt_re_post_recv_shadow_qp(rdev, gsi_sqp, &rwr);
4411 	if (rc) {
4412 		dev_err(rdev_to_dev(rdev),
4413 			"Failed to post Rx buffers to shadow QP\n");
4414 		return -ENOMEM;
4415 	}
4416 
4417 	swr->num_sge = 2;
4418 	swr->sg_list = s_sge;
4419 	swr->wr_id = tbl_idx;
4420 	swr->opcode = IB_WR_SEND;
4421 	swr->next = NULL;
4422 
4423 	gsi_sah = rdev->gsi_ctx.gsi_sah;
4424 	udwr.ah = &gsi_sah->ibah;
4425 	udwr.remote_qpn = gsi_sqp->qplib_qp.id;
4426 	udwr.remote_qkey = gsi_sqp->qplib_qp.qkey;
4427 	/* post data received in the send queue */
4428 	rc = bnxt_re_post_send_shadow_qp(rdev, gsi_sqp, swr);
4429 
4430 	return rc;
4431 }
4432 
bnxt_re_process_res_rawqp1_wc(struct ib_wc * wc,struct bnxt_qplib_cqe * cqe)4433 static void bnxt_re_process_res_rawqp1_wc(struct ib_wc *wc,
4434 					  struct bnxt_qplib_cqe *cqe)
4435 {
4436 	wc->opcode = IB_WC_RECV;
4437 	wc->status = __rawqp1_to_ib_wc_status(cqe->status);
4438 	wc->wc_flags |= IB_WC_GRH;
4439 }
4440 
bnxt_re_process_res_rc_wc(struct ib_wc * wc,struct bnxt_qplib_cqe * cqe)4441 static void bnxt_re_process_res_rc_wc(struct ib_wc *wc,
4442 				      struct bnxt_qplib_cqe *cqe)
4443 {
4444 	wc->opcode = IB_WC_RECV;
4445 	wc->status = __rc_to_ib_wc_status(cqe->status);
4446 
4447 	if (cqe->flags & CQ_RES_RC_FLAGS_IMM)
4448 		wc->wc_flags |= IB_WC_WITH_IMM;
4449 	if (cqe->flags & CQ_RES_RC_FLAGS_INV)
4450 		wc->wc_flags |= IB_WC_WITH_INVALIDATE;
4451 	if ((cqe->flags & (CQ_RES_RC_FLAGS_RDMA | CQ_RES_RC_FLAGS_IMM)) ==
4452 	    (CQ_RES_RC_FLAGS_RDMA | CQ_RES_RC_FLAGS_IMM))
4453 		wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
4454 }
4455 
4456 /* Returns TRUE if pkt has valid VLAN and if VLAN id is non-zero */
bnxt_re_is_nonzero_vlanid_pkt(struct bnxt_qplib_cqe * orig_cqe,u16 * vid,u8 * sl)4457 static bool bnxt_re_is_nonzero_vlanid_pkt(struct bnxt_qplib_cqe *orig_cqe,
4458 					  u16 *vid, u8 *sl)
4459 {
4460 	u32 metadata;
4461 	u16 tpid;
4462 	bool ret = false;
4463 	metadata = orig_cqe->raweth_qp1_metadata;
4464 	if (orig_cqe->raweth_qp1_flags2 &
4465 	    CQ_RES_RAWETH_QP1_RAWETH_QP1_FLAGS2_META_FORMAT_VLAN) {
4466 		tpid = ((metadata &
4467 			 CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_TPID_MASK) >>
4468 			 CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_TPID_SFT);
4469 		if (tpid == ETH_P_8021Q) {
4470 			*vid = metadata &
4471 			       CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_VID_MASK;
4472 			*sl = (metadata &
4473 			       CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_PRI_MASK) >>
4474 			       CQ_RES_RAWETH_QP1_RAWETH_QP1_METADATA_PRI_SFT;
4475 			ret = !!(*vid);
4476 		}
4477 	}
4478 
4479 	return ret;
4480 }
4481 
bnxt_re_process_res_shadow_qp_wc(struct bnxt_re_qp * gsi_sqp,struct ib_wc * wc,struct bnxt_qplib_cqe * cqe)4482 static void bnxt_re_process_res_shadow_qp_wc(struct bnxt_re_qp *gsi_sqp,
4483 					     struct ib_wc *wc,
4484 					     struct bnxt_qplib_cqe *cqe)
4485 {
4486 	u32 tbl_idx;
4487 	struct bnxt_re_dev *rdev = gsi_sqp->rdev;
4488 	struct bnxt_re_qp *gsi_qp = NULL;
4489 	struct bnxt_qplib_cqe *orig_cqe = NULL;
4490 	struct bnxt_re_sqp_entries *sqp_entry = NULL;
4491 	int nw_type;
4492 	u16 vlan_id;
4493 	u8 sl;
4494 
4495 	tbl_idx = cqe->wr_id;
4496 
4497 	sqp_entry = &rdev->gsi_ctx.sqp_tbl[tbl_idx];
4498 	gsi_qp = sqp_entry->qp1_qp;
4499 	orig_cqe = &sqp_entry->cqe;
4500 
4501 	wc->wr_id = sqp_entry->wrid;
4502 	wc->byte_len = orig_cqe->length;
4503 	wc->qp = &gsi_qp->ib_qp;
4504 
4505 	wc->ex.imm_data = orig_cqe->immdata;
4506 	wc->src_qp = orig_cqe->src_qp;
4507 	memcpy(wc->smac, orig_cqe->smac, ETH_ALEN);
4508 	if (bnxt_re_is_nonzero_vlanid_pkt(orig_cqe, &vlan_id, &sl)) {
4509 		if (bnxt_re_check_if_vlan_valid(rdev, vlan_id)) {
4510 			wc->sl = sl;
4511 			wc->vlan_id = vlan_id;
4512 			wc->wc_flags |= IB_WC_WITH_VLAN;
4513 		}
4514 	}
4515 	wc->port_num = 1;
4516 	wc->vendor_err = orig_cqe->status;
4517 
4518 	wc->opcode = IB_WC_RECV;
4519 	wc->status = __rawqp1_to_ib_wc_status(orig_cqe->status);
4520 	wc->wc_flags |= IB_WC_GRH;
4521 
4522 	nw_type = bnxt_re_check_packet_type(orig_cqe->raweth_qp1_flags,
4523 					    orig_cqe->raweth_qp1_flags2);
4524 	if(nw_type >= 0)
4525 		dev_dbg(rdev_to_dev(rdev), "%s nw_type = %d\n", __func__, nw_type);
4526 }
4527 
bnxt_re_process_res_ud_wc(struct bnxt_re_dev * rdev,struct bnxt_re_qp * qp,struct ib_wc * wc,struct bnxt_qplib_cqe * cqe)4528 static void bnxt_re_process_res_ud_wc(struct bnxt_re_dev *rdev,
4529 				      struct bnxt_re_qp *qp, struct ib_wc *wc,
4530 				      struct bnxt_qplib_cqe *cqe)
4531 {
4532 	u16 vlan_id = 0;
4533 
4534 	wc->opcode = IB_WC_RECV;
4535 	wc->status = __rc_to_ib_wc_status(cqe->status);
4536 	if (cqe->flags & CQ_RES_UD_FLAGS_IMM)
4537 		wc->wc_flags |= IB_WC_WITH_IMM;
4538 	if (cqe->flags & CQ_RES_RC_FLAGS_INV)
4539 		wc->wc_flags |= IB_WC_WITH_INVALIDATE;
4540 	/* report only on GSI QP for Thor */
4541 	if (rdev->gsi_ctx.gsi_qp->qplib_qp.id == qp->qplib_qp.id &&
4542 	    rdev->gsi_ctx.gsi_qp_mode == BNXT_RE_GSI_MODE_UD) {
4543 		wc->wc_flags |= IB_WC_GRH;
4544 		memcpy(wc->smac, cqe->smac, ETH_ALEN);
4545 		wc->wc_flags |= IB_WC_WITH_SMAC;
4546 		if (_is_cqe_v2_supported(rdev->dev_attr->dev_cap_flags)) {
4547 			if (cqe->flags & CQ_RES_UD_V2_FLAGS_META_FORMAT_MASK) {
4548 				if (cqe->cfa_meta &
4549 				    BNXT_QPLIB_CQE_CFA_META1_VALID)
4550 					vlan_id = (cqe->cfa_meta & 0xFFF);
4551 			}
4552 		} else if (cqe->flags & CQ_RES_UD_FLAGS_META_FORMAT_VLAN) {
4553 			vlan_id = (cqe->cfa_meta & 0xFFF);
4554 		}
4555 		/* Mark only if vlan_id is non zero */
4556 		if (vlan_id && bnxt_re_check_if_vlan_valid(rdev, vlan_id)) {
4557 			wc->vlan_id = vlan_id;
4558 			wc->wc_flags |= IB_WC_WITH_VLAN;
4559 		}
4560 	}
4561 }
4562 
bnxt_re_legacy_send_phantom_wqe(struct bnxt_re_qp * qp)4563 static int bnxt_re_legacy_send_phantom_wqe(struct bnxt_re_qp *qp)
4564 {
4565 	struct bnxt_qplib_qp *lib_qp = &qp->qplib_qp;
4566 	unsigned long flags;
4567 	int rc = 0;
4568 
4569 	spin_lock_irqsave(&qp->sq_lock, flags);
4570 
4571 	rc = bnxt_re_legacy_bind_fence_mw(lib_qp);
4572 	if (!rc) {
4573 		lib_qp->sq.phantom_wqe_cnt++;
4574 		dev_dbg(&lib_qp->sq.hwq.pdev->dev,
4575 			"qp %#x sq->prod %#x sw_prod %#x phantom_wqe_cnt %d\n",
4576 			lib_qp->id, lib_qp->sq.hwq.prod,
4577 			HWQ_CMP(lib_qp->sq.hwq.prod, &lib_qp->sq.hwq),
4578 			lib_qp->sq.phantom_wqe_cnt);
4579 	}
4580 
4581 	spin_unlock_irqrestore(&qp->sq_lock, flags);
4582 	return rc;
4583 }
4584 
bnxt_re_poll_cq(struct ib_cq * ib_cq,int num_entries,struct ib_wc * wc)4585 int bnxt_re_poll_cq(struct ib_cq *ib_cq, int num_entries, struct ib_wc *wc)
4586 {
4587 	struct bnxt_re_cq *cq = to_bnxt_re(ib_cq, struct bnxt_re_cq, ibcq);
4588 	struct bnxt_re_dev *rdev = cq->rdev;
4589 	struct bnxt_re_qp *qp;
4590 	struct bnxt_qplib_cqe *cqe;
4591 	int i, ncqe, budget, init_budget;
4592 	struct bnxt_qplib_q *sq;
4593 	struct bnxt_qplib_qp *lib_qp;
4594 	u32 tbl_idx;
4595 	struct bnxt_re_sqp_entries *sqp_entry = NULL;
4596 	unsigned long flags;
4597 	u8 gsi_mode;
4598 
4599 	/*
4600 	 * DB recovery CQ; only process the door bell pacing alert from
4601 	 * the user lib
4602 	 */
4603 	if (cq->is_dbr_soft_cq) {
4604 		bnxt_re_pacing_alert(rdev);
4605 		return 0;
4606 	}
4607 
4608 	/* User CQ; the only processing we do is to
4609 	 * complete any pending CQ resize operation.
4610 	 */
4611 	if (cq->umem) {
4612 		if (cq->resize_umem)
4613 			bnxt_re_resize_cq_complete(cq);
4614 		return 0;
4615 	}
4616 
4617 	spin_lock_irqsave(&cq->cq_lock, flags);
4618 
4619 	budget = min_t(u32, num_entries, cq->max_cql);
4620 	init_budget = budget;
4621 	if (!cq->cql) {
4622 		dev_err(rdev_to_dev(rdev), "POLL CQ no CQL to use\n");
4623 		goto exit;
4624 	}
4625 	cqe = &cq->cql[0];
4626 	gsi_mode = rdev->gsi_ctx.gsi_qp_mode;
4627 	while (budget) {
4628 		lib_qp = NULL;
4629 		ncqe = bnxt_qplib_poll_cq(&cq->qplib_cq, cqe, budget, &lib_qp);
4630 		if (lib_qp) {
4631 			sq = &lib_qp->sq;
4632 			if (sq->legacy_send_phantom == true) {
4633 				qp = container_of(lib_qp, struct bnxt_re_qp, qplib_qp);
4634 				if (bnxt_re_legacy_send_phantom_wqe(qp) == -ENOMEM)
4635 					dev_err(rdev_to_dev(rdev),
4636 						"Phantom failed! Scheduled to send again\n");
4637 				else
4638 					sq->legacy_send_phantom = false;
4639 			}
4640 		}
4641 		if (ncqe < budget)
4642 			ncqe += bnxt_qplib_process_flush_list(&cq->qplib_cq,
4643 							      cqe + ncqe,
4644 							      budget - ncqe);
4645 
4646 		if (!ncqe)
4647 			break;
4648 
4649 		for (i = 0; i < ncqe; i++, cqe++) {
4650 			/* Transcribe each qplib_wqe back to ib_wc */
4651 			memset(wc, 0, sizeof(*wc));
4652 
4653 			wc->wr_id = cqe->wr_id;
4654 			wc->byte_len = cqe->length;
4655 			qp = to_bnxt_re((struct bnxt_qplib_qp *)cqe->qp_handle,
4656 					struct bnxt_re_qp, qplib_qp);
4657 			if (!qp) {
4658 				dev_err(rdev_to_dev(rdev),
4659 					"POLL CQ bad QP handle\n");
4660 				continue;
4661 			}
4662 			wc->qp = &qp->ib_qp;
4663 			wc->ex.imm_data = cqe->immdata;
4664 			wc->src_qp = cqe->src_qp;
4665 			memcpy(wc->smac, cqe->smac, ETH_ALEN);
4666 			wc->port_num = 1;
4667 			wc->vendor_err = cqe->status;
4668 
4669 			switch(cqe->opcode) {
4670 			case CQ_BASE_CQE_TYPE_REQ:
4671 				if (gsi_mode == BNXT_RE_GSI_MODE_ALL &&
4672 				    qp->qplib_qp.id ==
4673 				    rdev->gsi_ctx.gsi_sqp->qplib_qp.id) {
4674 					/* Handle this completion with
4675 					 * the stored completion */
4676 					 dev_dbg(rdev_to_dev(rdev),
4677 						 "Skipping this UD Send CQ\n");
4678 					memset(wc, 0, sizeof(*wc));
4679 					continue;
4680 				}
4681 				bnxt_re_process_req_wc(wc, cqe);
4682 				break;
4683 			case CQ_BASE_CQE_TYPE_RES_RAWETH_QP1:
4684 				if (gsi_mode == BNXT_RE_GSI_MODE_ALL) {
4685 					if (!cqe->status) {
4686 						int rc = 0;
4687 						rc = bnxt_re_process_raw_qp_packet_receive(qp, cqe);
4688 						if (!rc) {
4689 							memset(wc, 0,
4690 							       sizeof(*wc));
4691 							continue;
4692 						}
4693 						cqe->status = -1;
4694 					}
4695 					/* Errors need not be looped back.
4696 					 * But change the wr_id to the one
4697 					 * stored in the table
4698 					 */
4699 					tbl_idx = cqe->wr_id;
4700 					sqp_entry = &rdev->gsi_ctx.sqp_tbl[tbl_idx];
4701 					wc->wr_id = sqp_entry->wrid;
4702 				}
4703 
4704 				bnxt_re_process_res_rawqp1_wc(wc, cqe);
4705 				break;
4706 			case CQ_BASE_CQE_TYPE_RES_RC:
4707 				bnxt_re_process_res_rc_wc(wc, cqe);
4708 				break;
4709 			case CQ_BASE_CQE_TYPE_RES_UD:
4710 				if (gsi_mode == BNXT_RE_GSI_MODE_ALL &&
4711 				    qp->qplib_qp.id ==
4712 				    rdev->gsi_ctx.gsi_sqp->qplib_qp.id) {
4713 					/* Handle this completion with
4714 					 * the stored completion
4715 					 */
4716 					dev_dbg(rdev_to_dev(rdev),
4717 						"Handling the UD receive CQ\n");
4718 					if (cqe->status) {
4719 						/* TODO handle this completion  as a failure in
4720 						 * loopback porocedure
4721 						 */
4722 						continue;
4723 					} else {
4724 						bnxt_re_process_res_shadow_qp_wc(qp, wc, cqe);
4725 						break;
4726 					}
4727 				}
4728 				bnxt_re_process_res_ud_wc(rdev, qp, wc, cqe);
4729 				break;
4730 			default:
4731 				dev_err(rdev_to_dev(cq->rdev),
4732 					"POLL CQ type 0x%x not handled, skip!\n",
4733 					cqe->opcode);
4734 				continue;
4735 			}
4736 			wc++;
4737 			budget--;
4738 		}
4739 	}
4740 exit:
4741 	spin_unlock_irqrestore(&cq->cq_lock, flags);
4742 	return init_budget - budget;
4743 }
4744 
bnxt_re_req_notify_cq(struct ib_cq * ib_cq,enum ib_cq_notify_flags ib_cqn_flags)4745 int bnxt_re_req_notify_cq(struct ib_cq *ib_cq,
4746 			  enum ib_cq_notify_flags ib_cqn_flags)
4747 {
4748 	struct bnxt_re_cq *cq = to_bnxt_re(ib_cq, struct bnxt_re_cq, ibcq);
4749 	int type = 0, rc = 0;
4750 	unsigned long flags;
4751 
4752 	spin_lock_irqsave(&cq->cq_lock, flags);
4753 	/* Trigger on the very next completion */
4754 	if (ib_cqn_flags & IB_CQ_NEXT_COMP)
4755 		type = DBC_DBC_TYPE_CQ_ARMALL;
4756 	/* Trigger on the next solicited completion */
4757 	else if (ib_cqn_flags & IB_CQ_SOLICITED)
4758 		type = DBC_DBC_TYPE_CQ_ARMSE;
4759 
4760 	bnxt_qplib_req_notify_cq(&cq->qplib_cq, type);
4761 
4762 	/* Poll to see if there are missed events */
4763 	if ((ib_cqn_flags & IB_CQ_REPORT_MISSED_EVENTS) &&
4764 	    !(bnxt_qplib_is_cq_empty(&cq->qplib_cq)))
4765 		rc = 1;
4766 
4767 	spin_unlock_irqrestore(&cq->cq_lock, flags);
4768 
4769 	return rc;
4770 }
4771 
4772 /* Memory Regions */
bnxt_re_get_dma_mr(struct ib_pd * ib_pd,int mr_access_flags)4773 struct ib_mr *bnxt_re_get_dma_mr(struct ib_pd *ib_pd, int mr_access_flags)
4774 {
4775 	struct bnxt_qplib_mrinfo mrinfo;
4776 	struct bnxt_re_dev *rdev;
4777 	struct bnxt_re_mr *mr;
4778 	struct bnxt_re_pd *pd;
4779 	u32 max_mr_count;
4780 	u64 pbl = 0;
4781 	int rc;
4782 
4783 	memset(&mrinfo, 0, sizeof(mrinfo));
4784 	pd = to_bnxt_re(ib_pd, struct bnxt_re_pd, ibpd);
4785 	rdev = pd->rdev;
4786 
4787 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
4788 	if (!mr) {
4789 		dev_err(rdev_to_dev(rdev),
4790 			"Allocate memory for DMA MR failed!\n");
4791 		return ERR_PTR(-ENOMEM);
4792 	}
4793 	mr->rdev = rdev;
4794 	mr->qplib_mr.pd = &pd->qplib_pd;
4795 	mr->qplib_mr.flags = __from_ib_access_flags(mr_access_flags);
4796 	mr->qplib_mr.type = CMDQ_ALLOCATE_MRW_MRW_FLAGS_PMR;
4797 
4798 	/* Allocate and register 0 as the address */
4799 	rc = bnxt_qplib_alloc_mrw(&rdev->qplib_res, &mr->qplib_mr);
4800 	if (rc) {
4801 		dev_err(rdev_to_dev(rdev), "Allocate DMA MR failed!\n");
4802 		goto fail;
4803 	}
4804 	mr->qplib_mr.total_size = -1; /* Infinite length */
4805 	mrinfo.ptes = &pbl;
4806 	mrinfo.sg.npages = 0;
4807 	mrinfo.sg.pgsize = PAGE_SIZE;
4808 	mrinfo.sg.pgshft = PAGE_SHIFT;
4809 	mrinfo.sg.pgsize = PAGE_SIZE;
4810 	mrinfo.mrw = &mr->qplib_mr;
4811 	mrinfo.is_dma = true;
4812 	rc = bnxt_qplib_reg_mr(&rdev->qplib_res, &mrinfo, false);
4813 	if (rc) {
4814 		dev_err(rdev_to_dev(rdev), "Register DMA MR failed!\n");
4815 		goto fail_mr;
4816 	}
4817 	mr->ib_mr.lkey = mr->qplib_mr.lkey;
4818 	if (mr_access_flags & (IB_ACCESS_REMOTE_WRITE | IB_ACCESS_REMOTE_READ |
4819 			       IB_ACCESS_REMOTE_ATOMIC))
4820 		mr->ib_mr.rkey = mr->ib_mr.lkey;
4821 	atomic_inc(&rdev->stats.rsors.mr_count);
4822 	max_mr_count =  atomic_read(&rdev->stats.rsors.mr_count);
4823 	if (max_mr_count > atomic_read(&rdev->stats.rsors.max_mr_count))
4824 		atomic_set(&rdev->stats.rsors.max_mr_count, max_mr_count);
4825 
4826 	return &mr->ib_mr;
4827 
4828 fail_mr:
4829 	bnxt_qplib_free_mrw(&rdev->qplib_res, &mr->qplib_mr);
4830 fail:
4831 	kfree(mr);
4832 	return ERR_PTR(rc);
4833 }
4834 
bnxt_re_dereg_mr(struct ib_mr * ib_mr,struct ib_udata * udata)4835 int bnxt_re_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
4836 {
4837 	struct bnxt_re_mr *mr = to_bnxt_re(ib_mr, struct bnxt_re_mr, ib_mr);
4838 	struct bnxt_re_dev *rdev = mr->rdev;
4839 	int rc = 0;
4840 
4841 	rc = bnxt_qplib_free_mrw(&rdev->qplib_res, &mr->qplib_mr);
4842 	if (rc)
4843 		dev_err(rdev_to_dev(rdev), "Dereg MR failed (%d): rc - %#x\n",
4844 			mr->qplib_mr.lkey, rc);
4845 
4846 	if (mr->pages) {
4847 		bnxt_qplib_free_fast_reg_page_list(&rdev->qplib_res,
4848 						   &mr->qplib_frpl);
4849 		kfree(mr->pages);
4850 		mr->npages = 0;
4851 		mr->pages = NULL;
4852 	}
4853 	if (!IS_ERR(mr->ib_umem) && mr->ib_umem) {
4854 		mr->is_invalcb_active = false;
4855 		bnxt_re_peer_mem_release(mr->ib_umem);
4856 	}
4857 	kfree(mr);
4858 	atomic_dec(&rdev->stats.rsors.mr_count);
4859 	return 0;
4860 }
4861 
bnxt_re_set_page(struct ib_mr * ib_mr,u64 addr)4862 static int bnxt_re_set_page(struct ib_mr *ib_mr, u64 addr)
4863 {
4864 	struct bnxt_re_mr *mr = to_bnxt_re(ib_mr, struct bnxt_re_mr, ib_mr);
4865 
4866 	if (unlikely(mr->npages == mr->qplib_frpl.max_pg_ptrs))
4867 		return -ENOMEM;
4868 
4869 	mr->pages[mr->npages++] = addr;
4870 	dev_dbg(NULL, "%s: ibdev %p Set MR pages[%d] = 0x%lx\n",
4871 		ROCE_DRV_MODULE_NAME, ib_mr->device, mr->npages - 1,
4872 		mr->pages[mr->npages - 1]);
4873 	return 0;
4874 }
4875 
bnxt_re_map_mr_sg(struct ib_mr * ib_mr,struct scatterlist * sg,int sg_nents,unsigned int * sg_offset)4876 int bnxt_re_map_mr_sg(struct ib_mr *ib_mr, struct scatterlist *sg,
4877 		      int sg_nents, unsigned int *sg_offset)
4878 {
4879 	struct bnxt_re_mr *mr = to_bnxt_re(ib_mr, struct bnxt_re_mr, ib_mr);
4880 
4881 	mr->npages = 0;
4882 	return ib_sg_to_pages(ib_mr, sg, sg_nents,
4883 			      sg_offset, bnxt_re_set_page);
4884 }
4885 
bnxt_re_alloc_mr(struct ib_pd * ib_pd,enum ib_mr_type type,u32 max_num_sg,struct ib_udata * udata)4886 struct ib_mr *bnxt_re_alloc_mr(struct ib_pd *ib_pd, enum ib_mr_type type,
4887 			       u32 max_num_sg, struct ib_udata *udata)
4888 {
4889 	struct bnxt_re_pd *pd = to_bnxt_re(ib_pd, struct bnxt_re_pd, ibpd);
4890 	struct bnxt_re_dev *rdev = pd->rdev;
4891 	struct bnxt_re_mr *mr;
4892 	u32 max_mr_count;
4893 	int rc;
4894 
4895 	dev_dbg(rdev_to_dev(rdev), "Alloc MR\n");
4896 	if (type != IB_MR_TYPE_MEM_REG) {
4897 		dev_dbg(rdev_to_dev(rdev), "MR type 0x%x not supported\n", type);
4898 		return ERR_PTR(-EINVAL);
4899 	}
4900 	if (max_num_sg > MAX_PBL_LVL_1_PGS) {
4901 		dev_dbg(rdev_to_dev(rdev), "Max SG exceeded\n");
4902 		return ERR_PTR(-EINVAL);
4903 	}
4904 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
4905 	if (!mr) {
4906 		dev_err(rdev_to_dev(rdev), "Allocate MR mem failed!\n");
4907 		return ERR_PTR(-ENOMEM);
4908 	}
4909 	mr->rdev = rdev;
4910 	mr->qplib_mr.pd = &pd->qplib_pd;
4911 	mr->qplib_mr.flags = BNXT_QPLIB_FR_PMR;
4912 	mr->qplib_mr.type = CMDQ_ALLOCATE_MRW_MRW_FLAGS_PMR;
4913 
4914 	rc = bnxt_qplib_alloc_mrw(&rdev->qplib_res, &mr->qplib_mr);
4915 	if (rc) {
4916 		dev_err(rdev_to_dev(rdev), "Allocate MR failed!\n");
4917 		goto fail;
4918 	}
4919 	mr->ib_mr.lkey = mr->qplib_mr.lkey;
4920 	mr->ib_mr.rkey = mr->ib_mr.lkey;
4921 	mr->pages = kzalloc(sizeof(u64) * max_num_sg, GFP_KERNEL);
4922 	if (!mr->pages) {
4923 		dev_err(rdev_to_dev(rdev),
4924 			"Allocate MR page list mem failed!\n");
4925 		rc = -ENOMEM;
4926 		goto fail_mr;
4927 	}
4928 	rc = bnxt_qplib_alloc_fast_reg_page_list(&rdev->qplib_res,
4929 						 &mr->qplib_frpl, max_num_sg);
4930 	if (rc) {
4931 		dev_err(rdev_to_dev(rdev),
4932 			"Allocate HW Fast reg page list failed!\n");
4933 		goto free_page;
4934 	}
4935 	dev_dbg(rdev_to_dev(rdev), "Alloc MR pages = 0x%p\n", mr->pages);
4936 
4937 	atomic_inc(&rdev->stats.rsors.mr_count);
4938 	max_mr_count =  atomic_read(&rdev->stats.rsors.mr_count);
4939 	if (max_mr_count > atomic_read(&rdev->stats.rsors.max_mr_count))
4940 		atomic_set(&rdev->stats.rsors.max_mr_count, max_mr_count);
4941 	return &mr->ib_mr;
4942 
4943 free_page:
4944 	kfree(mr->pages);
4945 fail_mr:
4946 	bnxt_qplib_free_mrw(&rdev->qplib_res, &mr->qplib_mr);
4947 fail:
4948 	kfree(mr);
4949 	return ERR_PTR(rc);
4950 }
4951 
4952 /* Memory Windows */
bnxt_re_alloc_mw(struct ib_pd * ib_pd,enum ib_mw_type type,struct ib_udata * udata)4953 struct ib_mw *bnxt_re_alloc_mw(struct ib_pd *ib_pd, enum ib_mw_type type,
4954 			       struct ib_udata *udata)
4955 {
4956 	struct bnxt_re_pd *pd = to_bnxt_re(ib_pd, struct bnxt_re_pd, ibpd);
4957 	struct bnxt_re_dev *rdev = pd->rdev;
4958 	struct bnxt_re_mw *mw;
4959 	u32 max_mw_count;
4960 	int rc;
4961 
4962 	mw = kzalloc(sizeof(*mw), GFP_KERNEL);
4963 	if (!mw) {
4964 		dev_err(rdev_to_dev(rdev), "Allocate MW failed!\n");
4965 		rc = -ENOMEM;
4966 		goto exit;
4967 	}
4968 	mw->rdev = rdev;
4969 	mw->qplib_mw.pd = &pd->qplib_pd;
4970 
4971 	mw->qplib_mw.type = (type == IB_MW_TYPE_1 ?
4972 			       CMDQ_ALLOCATE_MRW_MRW_FLAGS_MW_TYPE1 :
4973 			       CMDQ_ALLOCATE_MRW_MRW_FLAGS_MW_TYPE2B);
4974 	rc = bnxt_qplib_alloc_mrw(&rdev->qplib_res, &mw->qplib_mw);
4975 	if (rc) {
4976 		dev_err(rdev_to_dev(rdev), "Allocate MW failed!\n");
4977 		goto fail;
4978 	}
4979 	mw->ib_mw.rkey = mw->qplib_mw.rkey;
4980 	atomic_inc(&rdev->stats.rsors.mw_count);
4981 	max_mw_count = atomic_read(&rdev->stats.rsors.mw_count);
4982 	if (max_mw_count > atomic_read(&rdev->stats.rsors.max_mw_count))
4983 		atomic_set(&rdev->stats.rsors.max_mw_count, max_mw_count);
4984 
4985 	return &mw->ib_mw;
4986 fail:
4987 	kfree(mw);
4988 exit:
4989 	return ERR_PTR(rc);
4990 }
4991 
bnxt_re_dealloc_mw(struct ib_mw * ib_mw)4992 int bnxt_re_dealloc_mw(struct ib_mw *ib_mw)
4993 {
4994 	struct bnxt_re_mw *mw = to_bnxt_re(ib_mw, struct bnxt_re_mw, ib_mw);
4995 	struct bnxt_re_dev *rdev = mw->rdev;
4996 	int rc;
4997 
4998 	rc = bnxt_qplib_free_mrw(&rdev->qplib_res, &mw->qplib_mw);
4999 	if (rc) {
5000 		dev_err(rdev_to_dev(rdev), "Free MW failed: %#x\n", rc);
5001 		return rc;
5002 	}
5003 
5004 	kfree(mw);
5005 	atomic_dec(&rdev->stats.rsors.mw_count);
5006 	return rc;
5007 }
5008 
bnxt_re_page_size_ok(int page_shift)5009 static int bnxt_re_page_size_ok(int page_shift)
5010 {
5011 	switch (page_shift) {
5012 	case CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_4K:
5013 	case CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_8K:
5014 	case CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_64K:
5015 	case CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_2M:
5016 	case CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_256K:
5017 	case CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_1M:
5018 	case CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_4M:
5019 	case CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_256MB:
5020 	case CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_1G:
5021 		return 1;
5022 	default:
5023 		return 0;
5024 	}
5025 }
5026 
bnxt_re_get_page_shift(struct ib_umem * umem,u64 va,u64 st,u64 cmask)5027 static int bnxt_re_get_page_shift(struct ib_umem *umem,
5028 				  u64 va, u64 st, u64 cmask)
5029 {
5030 	int pgshft;
5031 
5032 	pgshft = ilog2(umem->page_size);
5033 
5034 	return pgshft;
5035 }
5036 
bnxt_re_get_num_pages(struct ib_umem * umem,u64 start,u64 length,int page_shift)5037 static int bnxt_re_get_num_pages(struct ib_umem *umem, u64 start, u64 length, int page_shift)
5038 {
5039 	int npages = 0;
5040 
5041 	if (page_shift == PAGE_SHIFT) {
5042 		npages = ib_umem_num_pages_compat(umem);
5043 	} else {
5044 		npages = ALIGN(length, BIT(page_shift)) / BIT(page_shift);
5045 		if (start %  BIT(page_shift))
5046 			npages++;
5047 	}
5048 	return npages;
5049 }
5050 
5051 /* uverbs */
bnxt_re_reg_user_mr(struct ib_pd * ib_pd,u64 start,u64 length,u64 virt_addr,int mr_access_flags,struct ib_udata * udata)5052 struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *ib_pd, u64 start, u64 length,
5053 				  u64 virt_addr, int mr_access_flags,
5054 				  struct ib_udata *udata)
5055 {
5056 	struct bnxt_re_pd *pd = to_bnxt_re(ib_pd, struct bnxt_re_pd, ibpd);
5057 	struct bnxt_re_dev *rdev = pd->rdev;
5058 	struct bnxt_qplib_mrinfo mrinfo;
5059 	int umem_pgs, page_shift, rc;
5060 	struct bnxt_re_mr *mr;
5061 	struct ib_umem *umem;
5062 	u32 max_mr_count;
5063 	int npages;
5064 
5065 	dev_dbg(rdev_to_dev(rdev), "Reg user MR\n");
5066 
5067 	if (bnxt_re_get_total_mr_mw_count(rdev) >= rdev->dev_attr->max_mr)
5068 		return ERR_PTR(-ENOMEM);
5069 
5070 	if (rdev->mod_exit) {
5071 		dev_dbg(rdev_to_dev(rdev), "%s(): in mod_exit, just return!\n", __func__);
5072 		return ERR_PTR(-EIO);
5073 	}
5074 	memset(&mrinfo, 0, sizeof(mrinfo));
5075 	if (length > BNXT_RE_MAX_MR_SIZE) {
5076 		dev_err(rdev_to_dev(rdev), "Requested MR Size: %lu "
5077 			"> Max supported: %ld\n", length, BNXT_RE_MAX_MR_SIZE);
5078 		return ERR_PTR(-ENOMEM);
5079 	}
5080 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
5081 	if (!mr) {
5082 		dev_err(rdev_to_dev(rdev), "Allocate MR failed!\n");
5083 		return ERR_PTR (-ENOMEM);
5084 	}
5085 	mr->rdev = rdev;
5086 	mr->qplib_mr.pd = &pd->qplib_pd;
5087 	mr->qplib_mr.flags = __from_ib_access_flags(mr_access_flags);
5088 	mr->qplib_mr.type = CMDQ_ALLOCATE_MRW_MRW_FLAGS_MR;
5089 
5090 	if (!_is_alloc_mr_unified(rdev->qplib_res.dattr)) {
5091 		rc = bnxt_qplib_alloc_mrw(&rdev->qplib_res, &mr->qplib_mr);
5092 		if (rc) {
5093 			dev_err(rdev_to_dev(rdev), "Alloc MR failed!\n");
5094 			goto fail;
5095 		}
5096 		/* The fixed portion of the rkey is the same as the lkey */
5097 		mr->ib_mr.rkey = mr->qplib_mr.rkey;
5098 	}
5099 
5100 	umem = ib_umem_get_flags_compat(rdev, ib_pd->uobject->context,
5101 					udata, start, length,
5102 					mr_access_flags, 0);
5103 	if (IS_ERR(umem)) {
5104 		rc = PTR_ERR(umem);
5105 		dev_err(rdev_to_dev(rdev), "%s: ib_umem_get failed! rc = %d\n",
5106 			__func__, rc);
5107 		goto free_mr;
5108 	}
5109 	mr->ib_umem = umem;
5110 
5111 	mr->qplib_mr.va = virt_addr;
5112 	umem_pgs = ib_umem_num_pages_compat(umem);
5113 	if (!umem_pgs) {
5114 		dev_err(rdev_to_dev(rdev), "umem is invalid!\n");
5115 		rc = -EINVAL;
5116 		goto free_umem;
5117 	}
5118 	mr->qplib_mr.total_size = length;
5119 	page_shift = bnxt_re_get_page_shift(umem, virt_addr, start,
5120 					    rdev->dev_attr->page_size_cap);
5121 	if (!bnxt_re_page_size_ok(page_shift)) {
5122 		dev_err(rdev_to_dev(rdev), "umem page size unsupported!\n");
5123 		rc = -EFAULT;
5124 		goto free_umem;
5125 	}
5126 	npages = bnxt_re_get_num_pages(umem, start, length, page_shift);
5127 
5128 	/* Map umem buf ptrs to the PBL */
5129 	mrinfo.sg.npages = npages;
5130 	mrinfo.sg.sghead = get_ib_umem_sgl(umem, &mrinfo.sg.nmap);
5131 	mrinfo.sg.pgshft = page_shift;
5132 	mrinfo.sg.pgsize = BIT(page_shift);
5133 
5134 	mrinfo.mrw = &mr->qplib_mr;
5135 
5136 	rc = bnxt_qplib_reg_mr(&rdev->qplib_res, &mrinfo, false);
5137 	if (rc) {
5138 		dev_err(rdev_to_dev(rdev), "Reg user MR failed!\n");
5139 		goto free_umem;
5140 	}
5141 
5142 	mr->ib_mr.lkey = mr->ib_mr.rkey = mr->qplib_mr.lkey;
5143 	atomic_inc(&rdev->stats.rsors.mr_count);
5144 	max_mr_count =  atomic_read(&rdev->stats.rsors.mr_count);
5145 	if (max_mr_count > atomic_read(&rdev->stats.rsors.max_mr_count))
5146 		atomic_set(&rdev->stats.rsors.max_mr_count, max_mr_count);
5147 
5148 	return &mr->ib_mr;
5149 
5150 free_umem:
5151 	bnxt_re_peer_mem_release(mr->ib_umem);
5152 free_mr:
5153 	if (!_is_alloc_mr_unified(rdev->qplib_res.dattr))
5154 		bnxt_qplib_free_mrw(&rdev->qplib_res, &mr->qplib_mr);
5155 fail:
5156 	kfree(mr);
5157 	return ERR_PTR(rc);
5158 }
5159 
5160 int
bnxt_re_rereg_user_mr(struct ib_mr * ib_mr,int flags,u64 start,u64 length,u64 virt_addr,int mr_access_flags,struct ib_pd * ib_pd,struct ib_udata * udata)5161 bnxt_re_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start, u64 length,
5162 		      u64 virt_addr, int mr_access_flags,
5163 		      struct ib_pd *ib_pd, struct ib_udata *udata)
5164 {
5165 	struct bnxt_re_mr *mr = to_bnxt_re(ib_mr, struct bnxt_re_mr, ib_mr);
5166 	struct bnxt_re_pd *pd = to_bnxt_re(ib_pd, struct bnxt_re_pd, ibpd);
5167 	int umem_pgs = 0, page_shift = PAGE_SHIFT, rc;
5168 	struct bnxt_re_dev *rdev = mr->rdev;
5169 	struct bnxt_qplib_mrinfo mrinfo;
5170 	struct ib_umem *umem;
5171 	u32 npages;
5172 
5173 	/* TODO: Must decipher what to modify based on the flags */
5174 	memset(&mrinfo, 0, sizeof(mrinfo));
5175 	if (flags & IB_MR_REREG_TRANS) {
5176 		umem = ib_umem_get_flags_compat(rdev, ib_pd->uobject->context,
5177 						udata, start, length,
5178 						mr_access_flags, 0);
5179 		if (IS_ERR(umem)) {
5180 			rc = PTR_ERR(umem);
5181 			dev_err(rdev_to_dev(rdev),
5182 				"%s: ib_umem_get failed! ret =  %d\n",
5183 				__func__, rc);
5184 			goto fail;
5185 		}
5186 		mr->ib_umem = umem;
5187 
5188 		mr->qplib_mr.va = virt_addr;
5189 		umem_pgs = ib_umem_num_pages_compat(umem);
5190 		if (!umem_pgs) {
5191 			dev_err(rdev_to_dev(rdev), "umem is invalid!\n");
5192 			rc = -EINVAL;
5193 			goto fail_free_umem;
5194 		}
5195 		mr->qplib_mr.total_size = length;
5196 		page_shift = bnxt_re_get_page_shift(umem, virt_addr, start,
5197 					    rdev->dev_attr->page_size_cap);
5198 		if (!bnxt_re_page_size_ok(page_shift)) {
5199 			dev_err(rdev_to_dev(rdev),
5200 				"umem page size unsupported!\n");
5201 			rc = -EFAULT;
5202 			goto fail_free_umem;
5203 		}
5204 		npages = bnxt_re_get_num_pages(umem, start, length, page_shift);
5205 		/* Map umem buf ptrs to the PBL */
5206 		mrinfo.sg.npages = npages;
5207 		mrinfo.sg.sghead = get_ib_umem_sgl(umem, &mrinfo.sg.nmap);
5208 		mrinfo.sg.pgshft = page_shift;
5209 		mrinfo.sg.pgsize = BIT(page_shift);
5210 	}
5211 
5212 	mrinfo.mrw = &mr->qplib_mr;
5213 	if (flags & IB_MR_REREG_PD)
5214 		mr->qplib_mr.pd = &pd->qplib_pd;
5215 
5216 	if (flags & IB_MR_REREG_ACCESS)
5217 		mr->qplib_mr.flags = __from_ib_access_flags(mr_access_flags);
5218 
5219 	rc = bnxt_qplib_reg_mr(&rdev->qplib_res, &mrinfo, false);
5220 	if (rc) {
5221 		dev_err(rdev_to_dev(rdev), "Rereg user MR failed!\n");
5222 		goto fail_free_umem;
5223 	}
5224 	mr->ib_mr.rkey = mr->qplib_mr.rkey;
5225 
5226 	return 0;
5227 
5228 fail_free_umem:
5229 	bnxt_re_peer_mem_release(mr->ib_umem);
5230 fail:
5231 	return rc;
5232 }
5233 
bnxt_re_check_abi_version(struct bnxt_re_dev * rdev)5234 static int bnxt_re_check_abi_version(struct bnxt_re_dev *rdev)
5235 {
5236 	struct ib_device *ibdev = &rdev->ibdev;
5237 	u32 uverbs_abi_ver;
5238 
5239 	uverbs_abi_ver = GET_UVERBS_ABI_VERSION(ibdev);
5240 	dev_dbg(rdev_to_dev(rdev), "ABI version requested %d\n",
5241 		uverbs_abi_ver);
5242 	if (uverbs_abi_ver != BNXT_RE_ABI_VERSION) {
5243 		dev_dbg(rdev_to_dev(rdev), " is different from the device %d \n",
5244 			BNXT_RE_ABI_VERSION);
5245 		return -EPERM;
5246 	}
5247 	return 0;
5248 }
5249 
bnxt_re_alloc_ucontext(struct ib_ucontext * uctx_in,struct ib_udata * udata)5250 int bnxt_re_alloc_ucontext(struct ib_ucontext *uctx_in,
5251 			   struct ib_udata *udata)
5252 {
5253 	struct ib_ucontext *ctx = uctx_in;
5254 	struct ib_device *ibdev = ctx->device;
5255 	struct bnxt_re_ucontext *uctx =
5256 		container_of(ctx, struct bnxt_re_ucontext, ibucontext);
5257 
5258 	struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev);
5259 	struct bnxt_qplib_dev_attr *dev_attr = rdev->dev_attr;
5260 	struct bnxt_re_uctx_resp resp = {};
5261 	struct bnxt_re_uctx_req ureq = {};
5262 	struct bnxt_qplib_chip_ctx *cctx;
5263 	u32 chip_met_rev_num;
5264 	bool genp5 = false;
5265 	int rc;
5266 
5267 	cctx = rdev->chip_ctx;
5268 	rc = bnxt_re_check_abi_version(rdev);
5269 	if (rc)
5270 		goto fail;
5271 
5272 	uctx->rdev = rdev;
5273 	uctx->shpg = (void *)__get_free_page(GFP_KERNEL);
5274 	if (!uctx->shpg) {
5275 		dev_err(rdev_to_dev(rdev), "shared memory allocation failed!\n");
5276 		rc = -ENOMEM;
5277 		goto fail;
5278 	}
5279 	spin_lock_init(&uctx->sh_lock);
5280 	if (BNXT_RE_ABI_VERSION >= 4) {
5281 		chip_met_rev_num = cctx->chip_num;
5282 		chip_met_rev_num |= ((u32)cctx->chip_rev & 0xFF) <<
5283 				     BNXT_RE_CHIP_ID0_CHIP_REV_SFT;
5284 		chip_met_rev_num |= ((u32)cctx->chip_metal & 0xFF) <<
5285 				     BNXT_RE_CHIP_ID0_CHIP_MET_SFT;
5286 		resp.chip_id0 = chip_met_rev_num;
5287 		resp.chip_id1 = 0; /* future extension of chip info */
5288 	}
5289 
5290 	if (BNXT_RE_ABI_VERSION != 4) {
5291 		/*Temp, Use idr_alloc instead*/
5292 		resp.dev_id = rdev->en_dev->pdev->devfn;
5293 		resp.max_qp = rdev->qplib_res.hctx->qp_ctx.max;
5294 	}
5295 
5296 	genp5 = _is_chip_gen_p5_p7(cctx);
5297 	if (BNXT_RE_ABI_VERSION > 5) {
5298 		resp.modes = genp5 ? cctx->modes.wqe_mode : 0;
5299 		if (rdev->dev_attr && BNXT_RE_HW_RETX(rdev->dev_attr->dev_cap_flags))
5300 			resp.comp_mask = BNXT_RE_COMP_MASK_UCNTX_HW_RETX_ENABLED;
5301 	}
5302 
5303 	resp.pg_size = PAGE_SIZE;
5304 	resp.cqe_sz = sizeof(struct cq_base);
5305 	resp.max_cqd = dev_attr->max_cq_wqes;
5306 	if (genp5 && cctx->modes.db_push) {
5307 		resp.comp_mask |= BNXT_RE_COMP_MASK_UCNTX_WC_DPI_ENABLED;
5308 		if (_is_chip_p7(cctx) &&
5309 		    !(dev_attr->dev_cap_flags &
5310 		      CREQ_QUERY_FUNC_RESP_SB_PINGPONG_PUSH_MODE))
5311 			resp.comp_mask &=
5312 				~BNXT_RE_COMP_MASK_UCNTX_WC_DPI_ENABLED;
5313 	}
5314 
5315 	resp.comp_mask |= BNXT_RE_COMP_MASK_UCNTX_MQP_EX_SUPPORTED;
5316 
5317 	if (rdev->dbr_pacing)
5318 		resp.comp_mask |= BNXT_RE_COMP_MASK_UCNTX_DBR_PACING_ENABLED;
5319 
5320 	if (rdev->dbr_drop_recov && rdev->user_dbr_drop_recov)
5321 		resp.comp_mask |= BNXT_RE_COMP_MASK_UCNTX_DBR_RECOVERY_ENABLED;
5322 
5323 	if (udata->inlen >= sizeof(ureq)) {
5324 		rc = ib_copy_from_udata(&ureq, udata,
5325 					min(udata->inlen, sizeof(ureq)));
5326 		if (rc)
5327 			goto cfail;
5328 		if (bnxt_re_init_pow2_flag(&ureq, &resp))
5329 			dev_warn(rdev_to_dev(rdev),
5330 				 "Enabled roundup logic. Library bug?\n");
5331 		if (bnxt_re_init_rsvd_wqe_flag(&ureq, &resp, genp5))
5332 			dev_warn(rdev_to_dev(rdev),
5333 				 "Rsvd wqe in use! Try the updated library.\n");
5334 	} else {
5335 		dev_warn(rdev_to_dev(rdev),
5336 			 "Enabled roundup logic. Update the library!\n");
5337 		resp.comp_mask &= ~BNXT_RE_COMP_MASK_UCNTX_POW2_DISABLED;
5338 
5339 		dev_warn(rdev_to_dev(rdev),
5340 			 "Rsvd wqe in use. Update the library!\n");
5341 		resp.comp_mask &= ~BNXT_RE_COMP_MASK_UCNTX_RSVD_WQE_DISABLED;
5342 	}
5343 
5344 	uctx->cmask = (uint64_t)resp.comp_mask;
5345 	rc = bnxt_re_copy_to_udata(rdev, &resp,
5346 				   min(udata->outlen, sizeof(resp)),
5347 				   udata);
5348 	if (rc)
5349 		goto cfail;
5350 
5351 	INIT_LIST_HEAD(&uctx->cq_list);
5352 	mutex_init(&uctx->cq_lock);
5353 
5354 	return 0;
5355 cfail:
5356 	free_page((u64)uctx->shpg);
5357 	uctx->shpg = NULL;
5358 fail:
5359 	return rc;
5360 }
5361 
bnxt_re_dealloc_ucontext(struct ib_ucontext * ib_uctx)5362 void bnxt_re_dealloc_ucontext(struct ib_ucontext *ib_uctx)
5363 {
5364 	struct bnxt_re_ucontext *uctx = to_bnxt_re(ib_uctx,
5365 						   struct bnxt_re_ucontext,
5366 						   ibucontext);
5367 	struct bnxt_re_dev *rdev = uctx->rdev;
5368 	int rc = 0;
5369 
5370 	if (uctx->shpg)
5371 		free_page((u64)uctx->shpg);
5372 
5373 	if (uctx->dpi.dbr) {
5374 		/* Free DPI only if this is the first PD allocated by the
5375 		 * application and mark the context dpi as NULL
5376 		 */
5377 		if (_is_chip_gen_p5_p7(rdev->chip_ctx) && uctx->wcdpi.dbr) {
5378 			rc = bnxt_qplib_dealloc_dpi(&rdev->qplib_res,
5379 						    &uctx->wcdpi);
5380 			if (rc)
5381 				dev_err(rdev_to_dev(rdev),
5382 						"dealloc push dp failed\n");
5383 			uctx->wcdpi.dbr = NULL;
5384 		}
5385 
5386 		rc = bnxt_qplib_dealloc_dpi(&rdev->qplib_res,
5387 					    &uctx->dpi);
5388 		if (rc)
5389 			dev_err(rdev_to_dev(rdev), "Deallocte HW DPI failed!\n");
5390 			/* Don't fail, continue*/
5391 		uctx->dpi.dbr = NULL;
5392 	}
5393 	return;
5394 }
5395 
is_bnxt_re_cq_page(struct bnxt_re_ucontext * uctx,u64 pg_off)5396 static struct bnxt_re_cq *is_bnxt_re_cq_page(struct bnxt_re_ucontext *uctx,
5397 				      u64 pg_off)
5398 {
5399 	struct bnxt_re_cq *cq = NULL, *tmp_cq;
5400 
5401 	if (!_is_chip_p7(uctx->rdev->chip_ctx))
5402 		return NULL;
5403 
5404 	mutex_lock(&uctx->cq_lock);
5405 	list_for_each_entry(tmp_cq, &uctx->cq_list, cq_list) {
5406 		if (((u64)tmp_cq->uctx_cq_page >> PAGE_SHIFT) == pg_off) {
5407 			cq = tmp_cq;
5408 			break;
5409 		}
5410 	}
5411 	mutex_unlock(&uctx->cq_lock);
5412 	return cq;
5413 }
5414 
5415 /* Helper function to mmap the virtual memory from user app */
bnxt_re_mmap(struct ib_ucontext * ib_uctx,struct vm_area_struct * vma)5416 int bnxt_re_mmap(struct ib_ucontext *ib_uctx, struct vm_area_struct *vma)
5417 {
5418 	struct bnxt_re_ucontext *uctx = to_bnxt_re(ib_uctx,
5419 						   struct bnxt_re_ucontext,
5420 						   ibucontext);
5421 	struct bnxt_re_dev *rdev = uctx->rdev;
5422 	struct bnxt_re_cq *cq = NULL;
5423 	int rc = 0;
5424 	u64 pfn;
5425 
5426 	switch (vma->vm_pgoff) {
5427 	case BNXT_RE_MAP_SH_PAGE:
5428 		pfn = vtophys(uctx->shpg) >> PAGE_SHIFT;
5429 		return rdma_user_mmap_io(&uctx->ibucontext, vma, pfn, PAGE_SIZE, vma->vm_page_prot, NULL);
5430 		dev_dbg(rdev_to_dev(rdev), "%s:%d uctx->shpg 0x%lx, vtophys(uctx->shpg) 0x%lx, pfn = 0x%lx \n",
5431 				__func__, __LINE__, (u64) uctx->shpg, vtophys(uctx->shpg), pfn);
5432 		if (rc) {
5433 			dev_err(rdev_to_dev(rdev), "Shared page mapping failed!\n");
5434 			rc = -EAGAIN;
5435 		}
5436 		return rc;
5437 	case BNXT_RE_MAP_WC:
5438 		vma->vm_page_prot =
5439 			pgprot_writecombine(vma->vm_page_prot);
5440 		pfn = (uctx->wcdpi.umdbr >> PAGE_SHIFT);
5441 		if (!pfn)
5442 			return -EFAULT;
5443 		break;
5444 	case BNXT_RE_DBR_PAGE:
5445 		/* Driver doesn't expect write access request */
5446 		if (vma->vm_flags & VM_WRITE)
5447 			return -EFAULT;
5448 
5449 		pfn = vtophys(rdev->dbr_page) >> PAGE_SHIFT;
5450 		if (!pfn)
5451 			return -EFAULT;
5452 		break;
5453 	case BNXT_RE_MAP_DB_RECOVERY_PAGE:
5454 		pfn = vtophys(uctx->dbr_recov_cq_page) >> PAGE_SHIFT;
5455 		if (!pfn)
5456 			return -EFAULT;
5457 		break;
5458 	default:
5459 		cq = is_bnxt_re_cq_page(uctx, vma->vm_pgoff);
5460 		if (cq) {
5461 			pfn = vtophys((void *)cq->uctx_cq_page) >> PAGE_SHIFT;
5462 			rc = rdma_user_mmap_io(&uctx->ibucontext, vma, pfn, PAGE_SIZE, vma->vm_page_prot, NULL);
5463 			if (rc) {
5464 				dev_err(rdev_to_dev(rdev),
5465 					"CQ page mapping failed!\n");
5466 				rc = -EAGAIN;
5467 			}
5468 			goto out;
5469 		} else {
5470 			vma->vm_page_prot =
5471 				pgprot_noncached(vma->vm_page_prot);
5472 			pfn = vma->vm_pgoff;
5473 		}
5474 		break;
5475 	}
5476 
5477 	rc = rdma_user_mmap_io(&uctx->ibucontext, vma, pfn, PAGE_SIZE, vma->vm_page_prot, NULL);
5478 	if (rc) {
5479 		dev_err(rdev_to_dev(rdev), "DPI mapping failed!\n");
5480 		return -EAGAIN;
5481 	}
5482 	rc = __bnxt_re_set_vma_data(uctx, vma);
5483 out:
5484 	return rc;
5485 }
5486 
bnxt_re_process_mad(struct ib_device * ibdev,int mad_flags,u8 port_num,const struct ib_wc * wc,const struct ib_grh * grh,const struct ib_mad_hdr * in_mad,size_t in_mad_size,struct ib_mad_hdr * out_mad,size_t * out_mad_size,u16 * out_mad_pkey_index)5487 int bnxt_re_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
5488 			const struct ib_wc *wc, const struct ib_grh *grh,
5489 			const struct ib_mad_hdr *in_mad, size_t in_mad_size,
5490 			struct ib_mad_hdr *out_mad, size_t *out_mad_size,
5491 			u16 *out_mad_pkey_index)
5492 {
5493 	return IB_MAD_RESULT_SUCCESS;
5494 }
5495 
bnxt_re_disassociate_ucntx(struct ib_ucontext * ib_uctx)5496 void bnxt_re_disassociate_ucntx(struct ib_ucontext *ib_uctx)
5497 {
5498 }
5499