• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* QLogic qedr NIC Driver
2  * Copyright (c) 2015-2016  QLogic Corporation
3  *
4  * This software is available to you under a choice of one of two
5  * licenses.  You may choose to be licensed under the terms of the GNU
6  * General Public License (GPL) Version 2, available from the file
7  * COPYING in the main directory of this source tree, or the
8  * OpenIB.org BSD license below:
9  *
10  *     Redistribution and use in source and binary forms, with or
11  *     without modification, are permitted provided that the following
12  *     conditions are met:
13  *
14  *      - Redistributions of source code must retain the above
15  *        copyright notice, this list of conditions and the following
16  *        disclaimer.
17  *
18  *      - Redistributions in binary form must reproduce the above
19  *        copyright notice, this list of conditions and the following
20  *        disclaimer in the documentation and /or other materials
21  *        provided with the distribution.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30  * SOFTWARE.
31  */
32 #include <linux/dma-mapping.h>
33 #include <linux/crc32.h>
34 #include <net/ip.h>
35 #include <net/ipv6.h>
36 #include <net/udp.h>
37 #include <linux/iommu.h>
38 
39 #include <rdma/ib_verbs.h>
40 #include <rdma/ib_user_verbs.h>
41 #include <rdma/iw_cm.h>
42 #include <rdma/ib_umem.h>
43 #include <rdma/ib_addr.h>
44 #include <rdma/ib_cache.h>
45 #include <rdma/uverbs_ioctl.h>
46 
47 #include <linux/qed/common_hsi.h>
48 #include "qedr_hsi_rdma.h"
49 #include <linux/qed/qed_if.h>
50 #include "qedr.h"
51 #include "verbs.h"
52 #include <rdma/qedr-abi.h>
53 #include "qedr_roce_cm.h"
54 
55 #define QEDR_SRQ_WQE_ELEM_SIZE	sizeof(union rdma_srq_elm)
56 #define	RDMA_MAX_SGE_PER_SRQ	(4)
57 #define RDMA_MAX_SRQ_WQE_SIZE	(RDMA_MAX_SGE_PER_SRQ + 1)
58 
59 #define DB_ADDR_SHIFT(addr)		((addr) << DB_PWM_ADDR_OFFSET_SHIFT)
60 
qedr_ib_copy_to_udata(struct ib_udata * udata,void * src,size_t len)61 static inline int qedr_ib_copy_to_udata(struct ib_udata *udata, void *src,
62 					size_t len)
63 {
64 	size_t min_len = min_t(size_t, len, udata->outlen);
65 
66 	return ib_copy_to_udata(udata, src, min_len);
67 }
68 
qedr_query_pkey(struct ib_device * ibdev,u8 port,u16 index,u16 * pkey)69 int qedr_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
70 {
71 	if (index >= QEDR_ROCE_PKEY_TABLE_LEN)
72 		return -EINVAL;
73 
74 	*pkey = QEDR_ROCE_PKEY_DEFAULT;
75 	return 0;
76 }
77 
qedr_iw_query_gid(struct ib_device * ibdev,u8 port,int index,union ib_gid * sgid)78 int qedr_iw_query_gid(struct ib_device *ibdev, u8 port,
79 		      int index, union ib_gid *sgid)
80 {
81 	struct qedr_dev *dev = get_qedr_dev(ibdev);
82 
83 	memset(sgid->raw, 0, sizeof(sgid->raw));
84 	ether_addr_copy(sgid->raw, dev->ndev->dev_addr);
85 
86 	DP_DEBUG(dev, QEDR_MSG_INIT, "QUERY sgid[%d]=%llx:%llx\n", index,
87 		 sgid->global.interface_id, sgid->global.subnet_prefix);
88 
89 	return 0;
90 }
91 
qedr_query_srq(struct ib_srq * ibsrq,struct ib_srq_attr * srq_attr)92 int qedr_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr)
93 {
94 	struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
95 	struct qedr_device_attr *qattr = &dev->attr;
96 	struct qedr_srq *srq = get_qedr_srq(ibsrq);
97 
98 	srq_attr->srq_limit = srq->srq_limit;
99 	srq_attr->max_wr = qattr->max_srq_wr;
100 	srq_attr->max_sge = qattr->max_sge;
101 
102 	return 0;
103 }
104 
qedr_query_device(struct ib_device * ibdev,struct ib_device_attr * attr,struct ib_udata * udata)105 int qedr_query_device(struct ib_device *ibdev,
106 		      struct ib_device_attr *attr, struct ib_udata *udata)
107 {
108 	struct qedr_dev *dev = get_qedr_dev(ibdev);
109 	struct qedr_device_attr *qattr = &dev->attr;
110 
111 	if (!dev->rdma_ctx) {
112 		DP_ERR(dev,
113 		       "qedr_query_device called with invalid params rdma_ctx=%p\n",
114 		       dev->rdma_ctx);
115 		return -EINVAL;
116 	}
117 
118 	memset(attr, 0, sizeof(*attr));
119 
120 	attr->fw_ver = qattr->fw_ver;
121 	attr->sys_image_guid = qattr->sys_image_guid;
122 	attr->max_mr_size = qattr->max_mr_size;
123 	attr->page_size_cap = qattr->page_size_caps;
124 	attr->vendor_id = qattr->vendor_id;
125 	attr->vendor_part_id = qattr->vendor_part_id;
126 	attr->hw_ver = qattr->hw_ver;
127 	attr->max_qp = qattr->max_qp;
128 	attr->max_qp_wr = max_t(u32, qattr->max_sqe, qattr->max_rqe);
129 	attr->device_cap_flags = IB_DEVICE_CURR_QP_STATE_MOD |
130 	    IB_DEVICE_RC_RNR_NAK_GEN |
131 	    IB_DEVICE_LOCAL_DMA_LKEY | IB_DEVICE_MEM_MGT_EXTENSIONS;
132 
133 	attr->max_send_sge = qattr->max_sge;
134 	attr->max_recv_sge = qattr->max_sge;
135 	attr->max_sge_rd = qattr->max_sge;
136 	attr->max_cq = qattr->max_cq;
137 	attr->max_cqe = qattr->max_cqe;
138 	attr->max_mr = qattr->max_mr;
139 	attr->max_mw = qattr->max_mw;
140 	attr->max_pd = qattr->max_pd;
141 	attr->atomic_cap = dev->atomic_cap;
142 	attr->max_fmr = qattr->max_fmr;
143 	attr->max_map_per_fmr = 16;
144 	attr->max_qp_init_rd_atom =
145 	    1 << (fls(qattr->max_qp_req_rd_atomic_resc) - 1);
146 	attr->max_qp_rd_atom =
147 	    min(1 << (fls(qattr->max_qp_resp_rd_atomic_resc) - 1),
148 		attr->max_qp_init_rd_atom);
149 
150 	attr->max_srq = qattr->max_srq;
151 	attr->max_srq_sge = qattr->max_srq_sge;
152 	attr->max_srq_wr = qattr->max_srq_wr;
153 
154 	attr->local_ca_ack_delay = qattr->dev_ack_delay;
155 	attr->max_fast_reg_page_list_len = qattr->max_mr / 8;
156 	attr->max_pkeys = QEDR_ROCE_PKEY_MAX;
157 	attr->max_ah = qattr->max_ah;
158 
159 	return 0;
160 }
161 
get_link_speed_and_width(int speed,u8 * ib_speed,u8 * ib_width)162 static inline void get_link_speed_and_width(int speed, u8 *ib_speed,
163 					    u8 *ib_width)
164 {
165 	switch (speed) {
166 	case 1000:
167 		*ib_speed = IB_SPEED_SDR;
168 		*ib_width = IB_WIDTH_1X;
169 		break;
170 	case 10000:
171 		*ib_speed = IB_SPEED_QDR;
172 		*ib_width = IB_WIDTH_1X;
173 		break;
174 
175 	case 20000:
176 		*ib_speed = IB_SPEED_DDR;
177 		*ib_width = IB_WIDTH_4X;
178 		break;
179 
180 	case 25000:
181 		*ib_speed = IB_SPEED_EDR;
182 		*ib_width = IB_WIDTH_1X;
183 		break;
184 
185 	case 40000:
186 		*ib_speed = IB_SPEED_QDR;
187 		*ib_width = IB_WIDTH_4X;
188 		break;
189 
190 	case 50000:
191 		*ib_speed = IB_SPEED_HDR;
192 		*ib_width = IB_WIDTH_1X;
193 		break;
194 
195 	case 100000:
196 		*ib_speed = IB_SPEED_EDR;
197 		*ib_width = IB_WIDTH_4X;
198 		break;
199 
200 	default:
201 		/* Unsupported */
202 		*ib_speed = IB_SPEED_SDR;
203 		*ib_width = IB_WIDTH_1X;
204 	}
205 }
206 
qedr_query_port(struct ib_device * ibdev,u8 port,struct ib_port_attr * attr)207 int qedr_query_port(struct ib_device *ibdev, u8 port, struct ib_port_attr *attr)
208 {
209 	struct qedr_dev *dev;
210 	struct qed_rdma_port *rdma_port;
211 
212 	dev = get_qedr_dev(ibdev);
213 
214 	if (!dev->rdma_ctx) {
215 		DP_ERR(dev, "rdma_ctx is NULL\n");
216 		return -EINVAL;
217 	}
218 
219 	rdma_port = dev->ops->rdma_query_port(dev->rdma_ctx);
220 
221 	/* *attr being zeroed by the caller, avoid zeroing it here */
222 	if (rdma_port->port_state == QED_RDMA_PORT_UP) {
223 		attr->state = IB_PORT_ACTIVE;
224 		attr->phys_state = IB_PORT_PHYS_STATE_LINK_UP;
225 	} else {
226 		attr->state = IB_PORT_DOWN;
227 		attr->phys_state = IB_PORT_PHYS_STATE_DISABLED;
228 	}
229 	attr->max_mtu = IB_MTU_4096;
230 	attr->active_mtu = iboe_get_mtu(dev->ndev->mtu);
231 	attr->lid = 0;
232 	attr->lmc = 0;
233 	attr->sm_lid = 0;
234 	attr->sm_sl = 0;
235 	attr->ip_gids = true;
236 	if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
237 		attr->gid_tbl_len = 1;
238 		attr->pkey_tbl_len = 1;
239 	} else {
240 		attr->gid_tbl_len = QEDR_MAX_SGID;
241 		attr->pkey_tbl_len = QEDR_ROCE_PKEY_TABLE_LEN;
242 	}
243 	attr->bad_pkey_cntr = rdma_port->pkey_bad_counter;
244 	attr->qkey_viol_cntr = 0;
245 	get_link_speed_and_width(rdma_port->link_speed,
246 				 &attr->active_speed, &attr->active_width);
247 	attr->max_msg_sz = rdma_port->max_msg_size;
248 	attr->max_vl_num = 4;
249 
250 	return 0;
251 }
252 
qedr_modify_port(struct ib_device * ibdev,u8 port,int mask,struct ib_port_modify * props)253 int qedr_modify_port(struct ib_device *ibdev, u8 port, int mask,
254 		     struct ib_port_modify *props)
255 {
256 	return 0;
257 }
258 
qedr_add_mmap(struct qedr_ucontext * uctx,u64 phy_addr,unsigned long len)259 static int qedr_add_mmap(struct qedr_ucontext *uctx, u64 phy_addr,
260 			 unsigned long len)
261 {
262 	struct qedr_mm *mm;
263 
264 	mm = kzalloc(sizeof(*mm), GFP_KERNEL);
265 	if (!mm)
266 		return -ENOMEM;
267 
268 	mm->key.phy_addr = phy_addr;
269 	/* This function might be called with a length which is not a multiple
270 	 * of PAGE_SIZE, while the mapping is PAGE_SIZE grained and the kernel
271 	 * forces this granularity by increasing the requested size if needed.
272 	 * When qedr_mmap is called, it will search the list with the updated
273 	 * length as a key. To prevent search failures, the length is rounded up
274 	 * in advance to PAGE_SIZE.
275 	 */
276 	mm->key.len = roundup(len, PAGE_SIZE);
277 	INIT_LIST_HEAD(&mm->entry);
278 
279 	mutex_lock(&uctx->mm_list_lock);
280 	list_add(&mm->entry, &uctx->mm_head);
281 	mutex_unlock(&uctx->mm_list_lock);
282 
283 	DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
284 		 "added (addr=0x%llx,len=0x%lx) for ctx=%p\n",
285 		 (unsigned long long)mm->key.phy_addr,
286 		 (unsigned long)mm->key.len, uctx);
287 
288 	return 0;
289 }
290 
qedr_search_mmap(struct qedr_ucontext * uctx,u64 phy_addr,unsigned long len)291 static bool qedr_search_mmap(struct qedr_ucontext *uctx, u64 phy_addr,
292 			     unsigned long len)
293 {
294 	bool found = false;
295 	struct qedr_mm *mm;
296 
297 	mutex_lock(&uctx->mm_list_lock);
298 	list_for_each_entry(mm, &uctx->mm_head, entry) {
299 		if (len != mm->key.len || phy_addr != mm->key.phy_addr)
300 			continue;
301 
302 		found = true;
303 		break;
304 	}
305 	mutex_unlock(&uctx->mm_list_lock);
306 	DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
307 		 "searched for (addr=0x%llx,len=0x%lx) for ctx=%p, result=%d\n",
308 		 mm->key.phy_addr, mm->key.len, uctx, found);
309 
310 	return found;
311 }
312 
qedr_alloc_ucontext(struct ib_ucontext * uctx,struct ib_udata * udata)313 int qedr_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata)
314 {
315 	struct ib_device *ibdev = uctx->device;
316 	int rc;
317 	struct qedr_ucontext *ctx = get_qedr_ucontext(uctx);
318 	struct qedr_alloc_ucontext_resp uresp = {};
319 	struct qedr_dev *dev = get_qedr_dev(ibdev);
320 	struct qed_rdma_add_user_out_params oparams;
321 
322 	if (!udata)
323 		return -EFAULT;
324 
325 	rc = dev->ops->rdma_add_user(dev->rdma_ctx, &oparams);
326 	if (rc) {
327 		DP_ERR(dev,
328 		       "failed to allocate a DPI for a new RoCE application, rc=%d. To overcome this consider to increase the number of DPIs, increase the doorbell BAR size or just close unnecessary RoCE applications. In order to increase the number of DPIs consult the qedr readme\n",
329 		       rc);
330 		return rc;
331 	}
332 
333 	ctx->dpi = oparams.dpi;
334 	ctx->dpi_addr = oparams.dpi_addr;
335 	ctx->dpi_phys_addr = oparams.dpi_phys_addr;
336 	ctx->dpi_size = oparams.dpi_size;
337 	INIT_LIST_HEAD(&ctx->mm_head);
338 	mutex_init(&ctx->mm_list_lock);
339 
340 	uresp.dpm_enabled = dev->user_dpm_enabled;
341 	uresp.wids_enabled = 1;
342 	uresp.wid_count = oparams.wid_count;
343 	uresp.db_pa = ctx->dpi_phys_addr;
344 	uresp.db_size = ctx->dpi_size;
345 	uresp.max_send_wr = dev->attr.max_sqe;
346 	uresp.max_recv_wr = dev->attr.max_rqe;
347 	uresp.max_srq_wr = dev->attr.max_srq_wr;
348 	uresp.sges_per_send_wr = QEDR_MAX_SQE_ELEMENTS_PER_SQE;
349 	uresp.sges_per_recv_wr = QEDR_MAX_RQE_ELEMENTS_PER_RQE;
350 	uresp.sges_per_srq_wr = dev->attr.max_srq_sge;
351 	uresp.max_cqes = QEDR_MAX_CQES;
352 
353 	rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
354 	if (rc)
355 		return rc;
356 
357 	ctx->dev = dev;
358 
359 	rc = qedr_add_mmap(ctx, ctx->dpi_phys_addr, ctx->dpi_size);
360 	if (rc)
361 		return rc;
362 
363 	DP_DEBUG(dev, QEDR_MSG_INIT, "Allocating user context %p\n",
364 		 &ctx->ibucontext);
365 	return 0;
366 }
367 
qedr_dealloc_ucontext(struct ib_ucontext * ibctx)368 void qedr_dealloc_ucontext(struct ib_ucontext *ibctx)
369 {
370 	struct qedr_ucontext *uctx = get_qedr_ucontext(ibctx);
371 	struct qedr_mm *mm, *tmp;
372 
373 	DP_DEBUG(uctx->dev, QEDR_MSG_INIT, "Deallocating user context %p\n",
374 		 uctx);
375 	uctx->dev->ops->rdma_remove_user(uctx->dev->rdma_ctx, uctx->dpi);
376 
377 	list_for_each_entry_safe(mm, tmp, &uctx->mm_head, entry) {
378 		DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
379 			 "deleted (addr=0x%llx,len=0x%lx) for ctx=%p\n",
380 			 mm->key.phy_addr, mm->key.len, uctx);
381 		list_del(&mm->entry);
382 		kfree(mm);
383 	}
384 }
385 
qedr_mmap(struct ib_ucontext * context,struct vm_area_struct * vma)386 int qedr_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
387 {
388 	struct qedr_ucontext *ucontext = get_qedr_ucontext(context);
389 	struct qedr_dev *dev = get_qedr_dev(context->device);
390 	unsigned long phys_addr = vma->vm_pgoff << PAGE_SHIFT;
391 	unsigned long len = (vma->vm_end - vma->vm_start);
392 	unsigned long dpi_start;
393 
394 	dpi_start = dev->db_phys_addr + (ucontext->dpi * ucontext->dpi_size);
395 
396 	DP_DEBUG(dev, QEDR_MSG_INIT,
397 		 "mmap invoked with vm_start=0x%pK, vm_end=0x%pK,vm_pgoff=0x%pK; dpi_start=0x%pK dpi_size=0x%x\n",
398 		 (void *)vma->vm_start, (void *)vma->vm_end,
399 		 (void *)vma->vm_pgoff, (void *)dpi_start, ucontext->dpi_size);
400 
401 	if ((vma->vm_start & (PAGE_SIZE - 1)) || (len & (PAGE_SIZE - 1))) {
402 		DP_ERR(dev,
403 		       "failed mmap, addresses must be page aligned: start=0x%pK, end=0x%pK\n",
404 		       (void *)vma->vm_start, (void *)vma->vm_end);
405 		return -EINVAL;
406 	}
407 
408 	if (!qedr_search_mmap(ucontext, phys_addr, len)) {
409 		DP_ERR(dev, "failed mmap, vm_pgoff=0x%lx is not authorized\n",
410 		       vma->vm_pgoff);
411 		return -EINVAL;
412 	}
413 
414 	if (phys_addr < dpi_start ||
415 	    ((phys_addr + len) > (dpi_start + ucontext->dpi_size))) {
416 		DP_ERR(dev,
417 		       "failed mmap, pages are outside of dpi; page address=0x%pK, dpi_start=0x%pK, dpi_size=0x%x\n",
418 		       (void *)phys_addr, (void *)dpi_start,
419 		       ucontext->dpi_size);
420 		return -EINVAL;
421 	}
422 
423 	if (vma->vm_flags & VM_READ) {
424 		DP_ERR(dev, "failed mmap, cannot map doorbell bar for read\n");
425 		return -EINVAL;
426 	}
427 
428 	vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
429 	return io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, len,
430 				  vma->vm_page_prot);
431 }
432 
qedr_alloc_pd(struct ib_pd * ibpd,struct ib_udata * udata)433 int qedr_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
434 {
435 	struct ib_device *ibdev = ibpd->device;
436 	struct qedr_dev *dev = get_qedr_dev(ibdev);
437 	struct qedr_pd *pd = get_qedr_pd(ibpd);
438 	u16 pd_id;
439 	int rc;
440 
441 	DP_DEBUG(dev, QEDR_MSG_INIT, "Function called from: %s\n",
442 		 udata ? "User Lib" : "Kernel");
443 
444 	if (!dev->rdma_ctx) {
445 		DP_ERR(dev, "invalid RDMA context\n");
446 		return -EINVAL;
447 	}
448 
449 	rc = dev->ops->rdma_alloc_pd(dev->rdma_ctx, &pd_id);
450 	if (rc)
451 		return rc;
452 
453 	pd->pd_id = pd_id;
454 
455 	if (udata) {
456 		struct qedr_alloc_pd_uresp uresp = {
457 			.pd_id = pd_id,
458 		};
459 		struct qedr_ucontext *context = rdma_udata_to_drv_context(
460 			udata, struct qedr_ucontext, ibucontext);
461 
462 		rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
463 		if (rc) {
464 			DP_ERR(dev, "copy error pd_id=0x%x.\n", pd_id);
465 			dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd_id);
466 			return rc;
467 		}
468 
469 		pd->uctx = context;
470 		pd->uctx->pd = pd;
471 	}
472 
473 	return 0;
474 }
475 
qedr_dealloc_pd(struct ib_pd * ibpd,struct ib_udata * udata)476 void qedr_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
477 {
478 	struct qedr_dev *dev = get_qedr_dev(ibpd->device);
479 	struct qedr_pd *pd = get_qedr_pd(ibpd);
480 
481 	DP_DEBUG(dev, QEDR_MSG_INIT, "Deallocating PD %d\n", pd->pd_id);
482 	dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd->pd_id);
483 }
484 
qedr_free_pbl(struct qedr_dev * dev,struct qedr_pbl_info * pbl_info,struct qedr_pbl * pbl)485 static void qedr_free_pbl(struct qedr_dev *dev,
486 			  struct qedr_pbl_info *pbl_info, struct qedr_pbl *pbl)
487 {
488 	struct pci_dev *pdev = dev->pdev;
489 	int i;
490 
491 	for (i = 0; i < pbl_info->num_pbls; i++) {
492 		if (!pbl[i].va)
493 			continue;
494 		dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
495 				  pbl[i].va, pbl[i].pa);
496 	}
497 
498 	kfree(pbl);
499 }
500 
501 #define MIN_FW_PBL_PAGE_SIZE (4 * 1024)
502 #define MAX_FW_PBL_PAGE_SIZE (64 * 1024)
503 
504 #define NUM_PBES_ON_PAGE(_page_size) (_page_size / sizeof(u64))
505 #define MAX_PBES_ON_PAGE NUM_PBES_ON_PAGE(MAX_FW_PBL_PAGE_SIZE)
506 #define MAX_PBES_TWO_LAYER (MAX_PBES_ON_PAGE * MAX_PBES_ON_PAGE)
507 
qedr_alloc_pbl_tbl(struct qedr_dev * dev,struct qedr_pbl_info * pbl_info,gfp_t flags)508 static struct qedr_pbl *qedr_alloc_pbl_tbl(struct qedr_dev *dev,
509 					   struct qedr_pbl_info *pbl_info,
510 					   gfp_t flags)
511 {
512 	struct pci_dev *pdev = dev->pdev;
513 	struct qedr_pbl *pbl_table;
514 	dma_addr_t *pbl_main_tbl;
515 	dma_addr_t pa;
516 	void *va;
517 	int i;
518 
519 	pbl_table = kcalloc(pbl_info->num_pbls, sizeof(*pbl_table), flags);
520 	if (!pbl_table)
521 		return ERR_PTR(-ENOMEM);
522 
523 	for (i = 0; i < pbl_info->num_pbls; i++) {
524 		va = dma_alloc_coherent(&pdev->dev, pbl_info->pbl_size, &pa,
525 					flags);
526 		if (!va)
527 			goto err;
528 
529 		pbl_table[i].va = va;
530 		pbl_table[i].pa = pa;
531 	}
532 
533 	/* Two-Layer PBLs, if we have more than one pbl we need to initialize
534 	 * the first one with physical pointers to all of the rest
535 	 */
536 	pbl_main_tbl = (dma_addr_t *)pbl_table[0].va;
537 	for (i = 0; i < pbl_info->num_pbls - 1; i++)
538 		pbl_main_tbl[i] = pbl_table[i + 1].pa;
539 
540 	return pbl_table;
541 
542 err:
543 	for (i--; i >= 0; i--)
544 		dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
545 				  pbl_table[i].va, pbl_table[i].pa);
546 
547 	qedr_free_pbl(dev, pbl_info, pbl_table);
548 
549 	return ERR_PTR(-ENOMEM);
550 }
551 
qedr_prepare_pbl_tbl(struct qedr_dev * dev,struct qedr_pbl_info * pbl_info,u32 num_pbes,int two_layer_capable)552 static int qedr_prepare_pbl_tbl(struct qedr_dev *dev,
553 				struct qedr_pbl_info *pbl_info,
554 				u32 num_pbes, int two_layer_capable)
555 {
556 	u32 pbl_capacity;
557 	u32 pbl_size;
558 	u32 num_pbls;
559 
560 	if ((num_pbes > MAX_PBES_ON_PAGE) && two_layer_capable) {
561 		if (num_pbes > MAX_PBES_TWO_LAYER) {
562 			DP_ERR(dev, "prepare pbl table: too many pages %d\n",
563 			       num_pbes);
564 			return -EINVAL;
565 		}
566 
567 		/* calculate required pbl page size */
568 		pbl_size = MIN_FW_PBL_PAGE_SIZE;
569 		pbl_capacity = NUM_PBES_ON_PAGE(pbl_size) *
570 			       NUM_PBES_ON_PAGE(pbl_size);
571 
572 		while (pbl_capacity < num_pbes) {
573 			pbl_size *= 2;
574 			pbl_capacity = pbl_size / sizeof(u64);
575 			pbl_capacity = pbl_capacity * pbl_capacity;
576 		}
577 
578 		num_pbls = DIV_ROUND_UP(num_pbes, NUM_PBES_ON_PAGE(pbl_size));
579 		num_pbls++;	/* One for the layer0 ( points to the pbls) */
580 		pbl_info->two_layered = true;
581 	} else {
582 		/* One layered PBL */
583 		num_pbls = 1;
584 		pbl_size = max_t(u32, MIN_FW_PBL_PAGE_SIZE,
585 				 roundup_pow_of_two((num_pbes * sizeof(u64))));
586 		pbl_info->two_layered = false;
587 	}
588 
589 	pbl_info->num_pbls = num_pbls;
590 	pbl_info->pbl_size = pbl_size;
591 	pbl_info->num_pbes = num_pbes;
592 
593 	DP_DEBUG(dev, QEDR_MSG_MR,
594 		 "prepare pbl table: num_pbes=%d, num_pbls=%d, pbl_size=%d\n",
595 		 pbl_info->num_pbes, pbl_info->num_pbls, pbl_info->pbl_size);
596 
597 	return 0;
598 }
599 
qedr_populate_pbls(struct qedr_dev * dev,struct ib_umem * umem,struct qedr_pbl * pbl,struct qedr_pbl_info * pbl_info,u32 pg_shift)600 static void qedr_populate_pbls(struct qedr_dev *dev, struct ib_umem *umem,
601 			       struct qedr_pbl *pbl,
602 			       struct qedr_pbl_info *pbl_info, u32 pg_shift)
603 {
604 	int pbe_cnt, total_num_pbes = 0;
605 	u32 fw_pg_cnt, fw_pg_per_umem_pg;
606 	struct qedr_pbl *pbl_tbl;
607 	struct sg_dma_page_iter sg_iter;
608 	struct regpair *pbe;
609 	u64 pg_addr;
610 
611 	if (!pbl_info->num_pbes)
612 		return;
613 
614 	/* If we have a two layered pbl, the first pbl points to the rest
615 	 * of the pbls and the first entry lays on the second pbl in the table
616 	 */
617 	if (pbl_info->two_layered)
618 		pbl_tbl = &pbl[1];
619 	else
620 		pbl_tbl = pbl;
621 
622 	pbe = (struct regpair *)pbl_tbl->va;
623 	if (!pbe) {
624 		DP_ERR(dev, "cannot populate PBL due to a NULL PBE\n");
625 		return;
626 	}
627 
628 	pbe_cnt = 0;
629 
630 	fw_pg_per_umem_pg = BIT(PAGE_SHIFT - pg_shift);
631 
632 	for_each_sg_dma_page (umem->sg_head.sgl, &sg_iter, umem->nmap, 0) {
633 		pg_addr = sg_page_iter_dma_address(&sg_iter);
634 		for (fw_pg_cnt = 0; fw_pg_cnt < fw_pg_per_umem_pg;) {
635 			pbe->lo = cpu_to_le32(pg_addr);
636 			pbe->hi = cpu_to_le32(upper_32_bits(pg_addr));
637 
638 			pg_addr += BIT(pg_shift);
639 			pbe_cnt++;
640 			total_num_pbes++;
641 			pbe++;
642 
643 			if (total_num_pbes == pbl_info->num_pbes)
644 				return;
645 
646 			/* If the given pbl is full storing the pbes,
647 			 * move to next pbl.
648 			 */
649 			if (pbe_cnt == (pbl_info->pbl_size / sizeof(u64))) {
650 				pbl_tbl++;
651 				pbe = (struct regpair *)pbl_tbl->va;
652 				pbe_cnt = 0;
653 			}
654 
655 			fw_pg_cnt++;
656 		}
657 	}
658 }
659 
qedr_copy_cq_uresp(struct qedr_dev * dev,struct qedr_cq * cq,struct ib_udata * udata)660 static int qedr_copy_cq_uresp(struct qedr_dev *dev,
661 			      struct qedr_cq *cq, struct ib_udata *udata)
662 {
663 	struct qedr_create_cq_uresp uresp;
664 	int rc;
665 
666 	memset(&uresp, 0, sizeof(uresp));
667 
668 	uresp.db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
669 	uresp.icid = cq->icid;
670 
671 	rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
672 	if (rc)
673 		DP_ERR(dev, "copy error cqid=0x%x.\n", cq->icid);
674 
675 	return rc;
676 }
677 
consume_cqe(struct qedr_cq * cq)678 static void consume_cqe(struct qedr_cq *cq)
679 {
680 	if (cq->latest_cqe == cq->toggle_cqe)
681 		cq->pbl_toggle ^= RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
682 
683 	cq->latest_cqe = qed_chain_consume(&cq->pbl);
684 }
685 
qedr_align_cq_entries(int entries)686 static inline int qedr_align_cq_entries(int entries)
687 {
688 	u64 size, aligned_size;
689 
690 	/* We allocate an extra entry that we don't report to the FW. */
691 	size = (entries + 1) * QEDR_CQE_SIZE;
692 	aligned_size = ALIGN(size, PAGE_SIZE);
693 
694 	return aligned_size / QEDR_CQE_SIZE;
695 }
696 
qedr_init_user_queue(struct ib_udata * udata,struct qedr_dev * dev,struct qedr_userq * q,u64 buf_addr,size_t buf_len,int access,int dmasync,int alloc_and_init)697 static inline int qedr_init_user_queue(struct ib_udata *udata,
698 				       struct qedr_dev *dev,
699 				       struct qedr_userq *q, u64 buf_addr,
700 				       size_t buf_len, int access, int dmasync,
701 				       int alloc_and_init)
702 {
703 	u32 fw_pages;
704 	int rc;
705 
706 	q->buf_addr = buf_addr;
707 	q->buf_len = buf_len;
708 	q->umem = ib_umem_get(udata, q->buf_addr, q->buf_len, access, dmasync);
709 	if (IS_ERR(q->umem)) {
710 		DP_ERR(dev, "create user queue: failed ib_umem_get, got %ld\n",
711 		       PTR_ERR(q->umem));
712 		return PTR_ERR(q->umem);
713 	}
714 
715 	fw_pages = ib_umem_page_count(q->umem) <<
716 	    (PAGE_SHIFT - FW_PAGE_SHIFT);
717 
718 	rc = qedr_prepare_pbl_tbl(dev, &q->pbl_info, fw_pages, 0);
719 	if (rc)
720 		goto err0;
721 
722 	if (alloc_and_init) {
723 		q->pbl_tbl = qedr_alloc_pbl_tbl(dev, &q->pbl_info, GFP_KERNEL);
724 		if (IS_ERR(q->pbl_tbl)) {
725 			rc = PTR_ERR(q->pbl_tbl);
726 			goto err0;
727 		}
728 		qedr_populate_pbls(dev, q->umem, q->pbl_tbl, &q->pbl_info,
729 				   FW_PAGE_SHIFT);
730 	} else {
731 		q->pbl_tbl = kzalloc(sizeof(*q->pbl_tbl), GFP_KERNEL);
732 		if (!q->pbl_tbl) {
733 			rc = -ENOMEM;
734 			goto err0;
735 		}
736 	}
737 
738 	return 0;
739 
740 err0:
741 	ib_umem_release(q->umem);
742 	q->umem = NULL;
743 
744 	return rc;
745 }
746 
qedr_init_cq_params(struct qedr_cq * cq,struct qedr_ucontext * ctx,struct qedr_dev * dev,int vector,int chain_entries,int page_cnt,u64 pbl_ptr,struct qed_rdma_create_cq_in_params * params)747 static inline void qedr_init_cq_params(struct qedr_cq *cq,
748 				       struct qedr_ucontext *ctx,
749 				       struct qedr_dev *dev, int vector,
750 				       int chain_entries, int page_cnt,
751 				       u64 pbl_ptr,
752 				       struct qed_rdma_create_cq_in_params
753 				       *params)
754 {
755 	memset(params, 0, sizeof(*params));
756 	params->cq_handle_hi = upper_32_bits((uintptr_t)cq);
757 	params->cq_handle_lo = lower_32_bits((uintptr_t)cq);
758 	params->cnq_id = vector;
759 	params->cq_size = chain_entries - 1;
760 	params->dpi = (ctx) ? ctx->dpi : dev->dpi;
761 	params->pbl_num_pages = page_cnt;
762 	params->pbl_ptr = pbl_ptr;
763 	params->pbl_two_level = 0;
764 }
765 
doorbell_cq(struct qedr_cq * cq,u32 cons,u8 flags)766 static void doorbell_cq(struct qedr_cq *cq, u32 cons, u8 flags)
767 {
768 	cq->db.data.agg_flags = flags;
769 	cq->db.data.value = cpu_to_le32(cons);
770 	writeq(cq->db.raw, cq->db_addr);
771 }
772 
qedr_arm_cq(struct ib_cq * ibcq,enum ib_cq_notify_flags flags)773 int qedr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
774 {
775 	struct qedr_cq *cq = get_qedr_cq(ibcq);
776 	unsigned long sflags;
777 	struct qedr_dev *dev;
778 
779 	dev = get_qedr_dev(ibcq->device);
780 
781 	if (cq->destroyed) {
782 		DP_ERR(dev,
783 		       "warning: arm was invoked after destroy for cq %p (icid=%d)\n",
784 		       cq, cq->icid);
785 		return -EINVAL;
786 	}
787 
788 
789 	if (cq->cq_type == QEDR_CQ_TYPE_GSI)
790 		return 0;
791 
792 	spin_lock_irqsave(&cq->cq_lock, sflags);
793 
794 	cq->arm_flags = 0;
795 
796 	if (flags & IB_CQ_SOLICITED)
797 		cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_SE_CF_CMD;
798 
799 	if (flags & IB_CQ_NEXT_COMP)
800 		cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_CF_CMD;
801 
802 	doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
803 
804 	spin_unlock_irqrestore(&cq->cq_lock, sflags);
805 
806 	return 0;
807 }
808 
qedr_create_cq(struct ib_cq * ibcq,const struct ib_cq_init_attr * attr,struct ib_udata * udata)809 int qedr_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
810 		   struct ib_udata *udata)
811 {
812 	struct ib_device *ibdev = ibcq->device;
813 	struct qedr_ucontext *ctx = rdma_udata_to_drv_context(
814 		udata, struct qedr_ucontext, ibucontext);
815 	struct qed_rdma_destroy_cq_out_params destroy_oparams;
816 	struct qed_rdma_destroy_cq_in_params destroy_iparams;
817 	struct qedr_dev *dev = get_qedr_dev(ibdev);
818 	struct qed_rdma_create_cq_in_params params;
819 	struct qedr_create_cq_ureq ureq = {};
820 	int vector = attr->comp_vector;
821 	int entries = attr->cqe;
822 	struct qedr_cq *cq = get_qedr_cq(ibcq);
823 	int chain_entries;
824 	int page_cnt;
825 	u64 pbl_ptr;
826 	u16 icid;
827 	int rc;
828 
829 	DP_DEBUG(dev, QEDR_MSG_INIT,
830 		 "create_cq: called from %s. entries=%d, vector=%d\n",
831 		 udata ? "User Lib" : "Kernel", entries, vector);
832 
833 	if (entries > QEDR_MAX_CQES) {
834 		DP_ERR(dev,
835 		       "create cq: the number of entries %d is too high. Must be equal or below %d.\n",
836 		       entries, QEDR_MAX_CQES);
837 		return -EINVAL;
838 	}
839 
840 	chain_entries = qedr_align_cq_entries(entries);
841 	chain_entries = min_t(int, chain_entries, QEDR_MAX_CQES);
842 
843 	if (udata) {
844 		if (ib_copy_from_udata(&ureq, udata, sizeof(ureq))) {
845 			DP_ERR(dev,
846 			       "create cq: problem copying data from user space\n");
847 			goto err0;
848 		}
849 
850 		if (!ureq.len) {
851 			DP_ERR(dev,
852 			       "create cq: cannot create a cq with 0 entries\n");
853 			goto err0;
854 		}
855 
856 		cq->cq_type = QEDR_CQ_TYPE_USER;
857 
858 		rc = qedr_init_user_queue(udata, dev, &cq->q, ureq.addr,
859 					  ureq.len, IB_ACCESS_LOCAL_WRITE, 1,
860 					  1);
861 		if (rc)
862 			goto err0;
863 
864 		pbl_ptr = cq->q.pbl_tbl->pa;
865 		page_cnt = cq->q.pbl_info.num_pbes;
866 
867 		cq->ibcq.cqe = chain_entries;
868 	} else {
869 		cq->cq_type = QEDR_CQ_TYPE_KERNEL;
870 
871 		rc = dev->ops->common->chain_alloc(dev->cdev,
872 						   QED_CHAIN_USE_TO_CONSUME,
873 						   QED_CHAIN_MODE_PBL,
874 						   QED_CHAIN_CNT_TYPE_U32,
875 						   chain_entries,
876 						   sizeof(union rdma_cqe),
877 						   &cq->pbl, NULL);
878 		if (rc)
879 			goto err1;
880 
881 		page_cnt = qed_chain_get_page_cnt(&cq->pbl);
882 		pbl_ptr = qed_chain_get_pbl_phys(&cq->pbl);
883 		cq->ibcq.cqe = cq->pbl.capacity;
884 	}
885 
886 	qedr_init_cq_params(cq, ctx, dev, vector, chain_entries, page_cnt,
887 			    pbl_ptr, &params);
888 
889 	rc = dev->ops->rdma_create_cq(dev->rdma_ctx, &params, &icid);
890 	if (rc)
891 		goto err2;
892 
893 	cq->icid = icid;
894 	cq->sig = QEDR_CQ_MAGIC_NUMBER;
895 	spin_lock_init(&cq->cq_lock);
896 
897 	if (udata) {
898 		rc = qedr_copy_cq_uresp(dev, cq, udata);
899 		if (rc)
900 			goto err3;
901 	} else {
902 		/* Generate doorbell address. */
903 		cq->db_addr = dev->db_addr +
904 		    DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
905 		cq->db.data.icid = cq->icid;
906 		cq->db.data.params = DB_AGG_CMD_SET <<
907 		    RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT;
908 
909 		/* point to the very last element, passing it we will toggle */
910 		cq->toggle_cqe = qed_chain_get_last_elem(&cq->pbl);
911 		cq->pbl_toggle = RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
912 		cq->latest_cqe = NULL;
913 		consume_cqe(cq);
914 		cq->cq_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
915 	}
916 
917 	DP_DEBUG(dev, QEDR_MSG_CQ,
918 		 "create cq: icid=0x%0x, addr=%p, size(entries)=0x%0x\n",
919 		 cq->icid, cq, params.cq_size);
920 
921 	return 0;
922 
923 err3:
924 	destroy_iparams.icid = cq->icid;
925 	dev->ops->rdma_destroy_cq(dev->rdma_ctx, &destroy_iparams,
926 				  &destroy_oparams);
927 err2:
928 	if (udata)
929 		qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
930 	else
931 		dev->ops->common->chain_free(dev->cdev, &cq->pbl);
932 err1:
933 	if (udata)
934 		ib_umem_release(cq->q.umem);
935 err0:
936 	return -EINVAL;
937 }
938 
qedr_resize_cq(struct ib_cq * ibcq,int new_cnt,struct ib_udata * udata)939 int qedr_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata)
940 {
941 	struct qedr_dev *dev = get_qedr_dev(ibcq->device);
942 	struct qedr_cq *cq = get_qedr_cq(ibcq);
943 
944 	DP_ERR(dev, "cq %p RESIZE NOT SUPPORTED\n", cq);
945 
946 	return 0;
947 }
948 
949 #define QEDR_DESTROY_CQ_MAX_ITERATIONS		(10)
950 #define QEDR_DESTROY_CQ_ITER_DURATION		(10)
951 
qedr_destroy_cq(struct ib_cq * ibcq,struct ib_udata * udata)952 void qedr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
953 {
954 	struct qedr_dev *dev = get_qedr_dev(ibcq->device);
955 	struct qed_rdma_destroy_cq_out_params oparams;
956 	struct qed_rdma_destroy_cq_in_params iparams;
957 	struct qedr_cq *cq = get_qedr_cq(ibcq);
958 	int iter;
959 
960 	DP_DEBUG(dev, QEDR_MSG_CQ, "destroy cq %p (icid=%d)\n", cq, cq->icid);
961 
962 	cq->destroyed = 1;
963 
964 	/* GSIs CQs are handled by driver, so they don't exist in the FW */
965 	if (cq->cq_type == QEDR_CQ_TYPE_GSI)
966 		return;
967 
968 	iparams.icid = cq->icid;
969 	dev->ops->rdma_destroy_cq(dev->rdma_ctx, &iparams, &oparams);
970 	dev->ops->common->chain_free(dev->cdev, &cq->pbl);
971 
972 	if (udata) {
973 		qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
974 		ib_umem_release(cq->q.umem);
975 	}
976 
977 	/* We don't want the IRQ handler to handle a non-existing CQ so we
978 	 * wait until all CNQ interrupts, if any, are received. This will always
979 	 * happen and will always happen very fast. If not, then a serious error
980 	 * has occured. That is why we can use a long delay.
981 	 * We spin for a short time so we don’t lose time on context switching
982 	 * in case all the completions are handled in that span. Otherwise
983 	 * we sleep for a while and check again. Since the CNQ may be
984 	 * associated with (only) the current CPU we use msleep to allow the
985 	 * current CPU to be freed.
986 	 * The CNQ notification is increased in qedr_irq_handler().
987 	 */
988 	iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
989 	while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
990 		udelay(QEDR_DESTROY_CQ_ITER_DURATION);
991 		iter--;
992 	}
993 
994 	iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
995 	while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
996 		msleep(QEDR_DESTROY_CQ_ITER_DURATION);
997 		iter--;
998 	}
999 
1000 	/* Note that we don't need to have explicit code to wait for the
1001 	 * completion of the event handler because it is invoked from the EQ.
1002 	 * Since the destroy CQ ramrod has also been received on the EQ we can
1003 	 * be certain that there's no event handler in process.
1004 	 */
1005 }
1006 
get_gid_info_from_table(struct ib_qp * ibqp,struct ib_qp_attr * attr,int attr_mask,struct qed_rdma_modify_qp_in_params * qp_params)1007 static inline int get_gid_info_from_table(struct ib_qp *ibqp,
1008 					  struct ib_qp_attr *attr,
1009 					  int attr_mask,
1010 					  struct qed_rdma_modify_qp_in_params
1011 					  *qp_params)
1012 {
1013 	const struct ib_gid_attr *gid_attr;
1014 	enum rdma_network_type nw_type;
1015 	const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
1016 	u32 ipv4_addr;
1017 	int ret;
1018 	int i;
1019 
1020 	gid_attr = grh->sgid_attr;
1021 	ret = rdma_read_gid_l2_fields(gid_attr, &qp_params->vlan_id, NULL);
1022 	if (ret)
1023 		return ret;
1024 
1025 	nw_type = rdma_gid_attr_network_type(gid_attr);
1026 	switch (nw_type) {
1027 	case RDMA_NETWORK_IPV6:
1028 		memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0],
1029 		       sizeof(qp_params->sgid));
1030 		memcpy(&qp_params->dgid.bytes[0],
1031 		       &grh->dgid,
1032 		       sizeof(qp_params->dgid));
1033 		qp_params->roce_mode = ROCE_V2_IPV6;
1034 		SET_FIELD(qp_params->modify_flags,
1035 			  QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1036 		break;
1037 	case RDMA_NETWORK_IB:
1038 		memcpy(&qp_params->sgid.bytes[0], &gid_attr->gid.raw[0],
1039 		       sizeof(qp_params->sgid));
1040 		memcpy(&qp_params->dgid.bytes[0],
1041 		       &grh->dgid,
1042 		       sizeof(qp_params->dgid));
1043 		qp_params->roce_mode = ROCE_V1;
1044 		break;
1045 	case RDMA_NETWORK_IPV4:
1046 		memset(&qp_params->sgid, 0, sizeof(qp_params->sgid));
1047 		memset(&qp_params->dgid, 0, sizeof(qp_params->dgid));
1048 		ipv4_addr = qedr_get_ipv4_from_gid(gid_attr->gid.raw);
1049 		qp_params->sgid.ipv4_addr = ipv4_addr;
1050 		ipv4_addr =
1051 		    qedr_get_ipv4_from_gid(grh->dgid.raw);
1052 		qp_params->dgid.ipv4_addr = ipv4_addr;
1053 		SET_FIELD(qp_params->modify_flags,
1054 			  QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1055 		qp_params->roce_mode = ROCE_V2_IPV4;
1056 		break;
1057 	}
1058 
1059 	for (i = 0; i < 4; i++) {
1060 		qp_params->sgid.dwords[i] = ntohl(qp_params->sgid.dwords[i]);
1061 		qp_params->dgid.dwords[i] = ntohl(qp_params->dgid.dwords[i]);
1062 	}
1063 
1064 	if (qp_params->vlan_id >= VLAN_CFI_MASK)
1065 		qp_params->vlan_id = 0;
1066 
1067 	return 0;
1068 }
1069 
qedr_check_qp_attrs(struct ib_pd * ibpd,struct qedr_dev * dev,struct ib_qp_init_attr * attrs,struct ib_udata * udata)1070 static int qedr_check_qp_attrs(struct ib_pd *ibpd, struct qedr_dev *dev,
1071 			       struct ib_qp_init_attr *attrs,
1072 			       struct ib_udata *udata)
1073 {
1074 	struct qedr_device_attr *qattr = &dev->attr;
1075 
1076 	/* QP0... attrs->qp_type == IB_QPT_GSI */
1077 	if (attrs->qp_type != IB_QPT_RC && attrs->qp_type != IB_QPT_GSI) {
1078 		DP_DEBUG(dev, QEDR_MSG_QP,
1079 			 "create qp: unsupported qp type=0x%x requested\n",
1080 			 attrs->qp_type);
1081 		return -EINVAL;
1082 	}
1083 
1084 	if (attrs->cap.max_send_wr > qattr->max_sqe) {
1085 		DP_ERR(dev,
1086 		       "create qp: cannot create a SQ with %d elements (max_send_wr=0x%x)\n",
1087 		       attrs->cap.max_send_wr, qattr->max_sqe);
1088 		return -EINVAL;
1089 	}
1090 
1091 	if (attrs->cap.max_inline_data > qattr->max_inline) {
1092 		DP_ERR(dev,
1093 		       "create qp: unsupported inline data size=0x%x requested (max_inline=0x%x)\n",
1094 		       attrs->cap.max_inline_data, qattr->max_inline);
1095 		return -EINVAL;
1096 	}
1097 
1098 	if (attrs->cap.max_send_sge > qattr->max_sge) {
1099 		DP_ERR(dev,
1100 		       "create qp: unsupported send_sge=0x%x requested (max_send_sge=0x%x)\n",
1101 		       attrs->cap.max_send_sge, qattr->max_sge);
1102 		return -EINVAL;
1103 	}
1104 
1105 	if (attrs->cap.max_recv_sge > qattr->max_sge) {
1106 		DP_ERR(dev,
1107 		       "create qp: unsupported recv_sge=0x%x requested (max_recv_sge=0x%x)\n",
1108 		       attrs->cap.max_recv_sge, qattr->max_sge);
1109 		return -EINVAL;
1110 	}
1111 
1112 	/* Unprivileged user space cannot create special QP */
1113 	if (udata && attrs->qp_type == IB_QPT_GSI) {
1114 		DP_ERR(dev,
1115 		       "create qp: userspace can't create special QPs of type=0x%x\n",
1116 		       attrs->qp_type);
1117 		return -EINVAL;
1118 	}
1119 
1120 	return 0;
1121 }
1122 
qedr_copy_srq_uresp(struct qedr_dev * dev,struct qedr_srq * srq,struct ib_udata * udata)1123 static int qedr_copy_srq_uresp(struct qedr_dev *dev,
1124 			       struct qedr_srq *srq, struct ib_udata *udata)
1125 {
1126 	struct qedr_create_srq_uresp uresp = {};
1127 	int rc;
1128 
1129 	uresp.srq_id = srq->srq_id;
1130 
1131 	rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1132 	if (rc)
1133 		DP_ERR(dev, "create srq: problem copying data to user space\n");
1134 
1135 	return rc;
1136 }
1137 
qedr_copy_rq_uresp(struct qedr_dev * dev,struct qedr_create_qp_uresp * uresp,struct qedr_qp * qp)1138 static void qedr_copy_rq_uresp(struct qedr_dev *dev,
1139 			       struct qedr_create_qp_uresp *uresp,
1140 			       struct qedr_qp *qp)
1141 {
1142 	/* iWARP requires two doorbells per RQ. */
1143 	if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1144 		uresp->rq_db_offset =
1145 		    DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
1146 		uresp->rq_db2_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
1147 	} else {
1148 		uresp->rq_db_offset =
1149 		    DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1150 	}
1151 
1152 	uresp->rq_icid = qp->icid;
1153 }
1154 
qedr_copy_sq_uresp(struct qedr_dev * dev,struct qedr_create_qp_uresp * uresp,struct qedr_qp * qp)1155 static void qedr_copy_sq_uresp(struct qedr_dev *dev,
1156 			       struct qedr_create_qp_uresp *uresp,
1157 			       struct qedr_qp *qp)
1158 {
1159 	uresp->sq_db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1160 
1161 	/* iWARP uses the same cid for rq and sq */
1162 	if (rdma_protocol_iwarp(&dev->ibdev, 1))
1163 		uresp->sq_icid = qp->icid;
1164 	else
1165 		uresp->sq_icid = qp->icid + 1;
1166 }
1167 
qedr_copy_qp_uresp(struct qedr_dev * dev,struct qedr_qp * qp,struct ib_udata * udata)1168 static int qedr_copy_qp_uresp(struct qedr_dev *dev,
1169 			      struct qedr_qp *qp, struct ib_udata *udata)
1170 {
1171 	struct qedr_create_qp_uresp uresp;
1172 	int rc;
1173 
1174 	memset(&uresp, 0, sizeof(uresp));
1175 	qedr_copy_sq_uresp(dev, &uresp, qp);
1176 	qedr_copy_rq_uresp(dev, &uresp, qp);
1177 
1178 	uresp.atomic_supported = dev->atomic_cap != IB_ATOMIC_NONE;
1179 	uresp.qp_id = qp->qp_id;
1180 
1181 	rc = qedr_ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1182 	if (rc)
1183 		DP_ERR(dev,
1184 		       "create qp: failed a copy to user space with qp icid=0x%x.\n",
1185 		       qp->icid);
1186 
1187 	return rc;
1188 }
1189 
qedr_set_common_qp_params(struct qedr_dev * dev,struct qedr_qp * qp,struct qedr_pd * pd,struct ib_qp_init_attr * attrs)1190 static void qedr_set_common_qp_params(struct qedr_dev *dev,
1191 				      struct qedr_qp *qp,
1192 				      struct qedr_pd *pd,
1193 				      struct ib_qp_init_attr *attrs)
1194 {
1195 	spin_lock_init(&qp->q_lock);
1196 	atomic_set(&qp->refcnt, 1);
1197 	qp->pd = pd;
1198 	qp->qp_type = attrs->qp_type;
1199 	qp->max_inline_data = attrs->cap.max_inline_data;
1200 	qp->sq.max_sges = attrs->cap.max_send_sge;
1201 	qp->state = QED_ROCE_QP_STATE_RESET;
1202 	qp->signaled = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR) ? true : false;
1203 	qp->sq_cq = get_qedr_cq(attrs->send_cq);
1204 	qp->dev = dev;
1205 
1206 	if (attrs->srq) {
1207 		qp->srq = get_qedr_srq(attrs->srq);
1208 	} else {
1209 		qp->rq_cq = get_qedr_cq(attrs->recv_cq);
1210 		qp->rq.max_sges = attrs->cap.max_recv_sge;
1211 		DP_DEBUG(dev, QEDR_MSG_QP,
1212 			 "RQ params:\trq_max_sges = %d, rq_cq_id = %d\n",
1213 			 qp->rq.max_sges, qp->rq_cq->icid);
1214 	}
1215 
1216 	DP_DEBUG(dev, QEDR_MSG_QP,
1217 		 "QP params:\tpd = %d, qp_type = %d, max_inline_data = %d, state = %d, signaled = %d, use_srq=%d\n",
1218 		 pd->pd_id, qp->qp_type, qp->max_inline_data,
1219 		 qp->state, qp->signaled, (attrs->srq) ? 1 : 0);
1220 	DP_DEBUG(dev, QEDR_MSG_QP,
1221 		 "SQ params:\tsq_max_sges = %d, sq_cq_id = %d\n",
1222 		 qp->sq.max_sges, qp->sq_cq->icid);
1223 }
1224 
qedr_set_roce_db_info(struct qedr_dev * dev,struct qedr_qp * qp)1225 static void qedr_set_roce_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
1226 {
1227 	qp->sq.db = dev->db_addr +
1228 		    DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1229 	qp->sq.db_data.data.icid = qp->icid + 1;
1230 	if (!qp->srq) {
1231 		qp->rq.db = dev->db_addr +
1232 			    DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1233 		qp->rq.db_data.data.icid = qp->icid;
1234 	}
1235 }
1236 
qedr_check_srq_params(struct qedr_dev * dev,struct ib_srq_init_attr * attrs,struct ib_udata * udata)1237 static int qedr_check_srq_params(struct qedr_dev *dev,
1238 				 struct ib_srq_init_attr *attrs,
1239 				 struct ib_udata *udata)
1240 {
1241 	struct qedr_device_attr *qattr = &dev->attr;
1242 
1243 	if (attrs->attr.max_wr > qattr->max_srq_wr) {
1244 		DP_ERR(dev,
1245 		       "create srq: unsupported srq_wr=0x%x requested (max_srq_wr=0x%x)\n",
1246 		       attrs->attr.max_wr, qattr->max_srq_wr);
1247 		return -EINVAL;
1248 	}
1249 
1250 	if (attrs->attr.max_sge > qattr->max_sge) {
1251 		DP_ERR(dev,
1252 		       "create srq: unsupported sge=0x%x requested (max_srq_sge=0x%x)\n",
1253 		       attrs->attr.max_sge, qattr->max_sge);
1254 		return -EINVAL;
1255 	}
1256 
1257 	return 0;
1258 }
1259 
qedr_free_srq_user_params(struct qedr_srq * srq)1260 static void qedr_free_srq_user_params(struct qedr_srq *srq)
1261 {
1262 	qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1263 	ib_umem_release(srq->usrq.umem);
1264 	ib_umem_release(srq->prod_umem);
1265 }
1266 
qedr_free_srq_kernel_params(struct qedr_srq * srq)1267 static void qedr_free_srq_kernel_params(struct qedr_srq *srq)
1268 {
1269 	struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1270 	struct qedr_dev *dev = srq->dev;
1271 
1272 	dev->ops->common->chain_free(dev->cdev, &hw_srq->pbl);
1273 
1274 	dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1275 			  hw_srq->virt_prod_pair_addr,
1276 			  hw_srq->phy_prod_pair_addr);
1277 }
1278 
qedr_init_srq_user_params(struct ib_udata * udata,struct qedr_srq * srq,struct qedr_create_srq_ureq * ureq,int access,int dmasync)1279 static int qedr_init_srq_user_params(struct ib_udata *udata,
1280 				     struct qedr_srq *srq,
1281 				     struct qedr_create_srq_ureq *ureq,
1282 				     int access, int dmasync)
1283 {
1284 	struct scatterlist *sg;
1285 	int rc;
1286 
1287 	rc = qedr_init_user_queue(udata, srq->dev, &srq->usrq, ureq->srq_addr,
1288 				  ureq->srq_len, access, dmasync, 1);
1289 	if (rc)
1290 		return rc;
1291 
1292 	srq->prod_umem =
1293 		ib_umem_get(udata, ureq->prod_pair_addr,
1294 			    sizeof(struct rdma_srq_producers), access, dmasync);
1295 	if (IS_ERR(srq->prod_umem)) {
1296 		qedr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
1297 		ib_umem_release(srq->usrq.umem);
1298 		DP_ERR(srq->dev,
1299 		       "create srq: failed ib_umem_get for producer, got %ld\n",
1300 		       PTR_ERR(srq->prod_umem));
1301 		return PTR_ERR(srq->prod_umem);
1302 	}
1303 
1304 	sg = srq->prod_umem->sg_head.sgl;
1305 	srq->hw_srq.phy_prod_pair_addr = sg_dma_address(sg);
1306 
1307 	return 0;
1308 }
1309 
qedr_alloc_srq_kernel_params(struct qedr_srq * srq,struct qedr_dev * dev,struct ib_srq_init_attr * init_attr)1310 static int qedr_alloc_srq_kernel_params(struct qedr_srq *srq,
1311 					struct qedr_dev *dev,
1312 					struct ib_srq_init_attr *init_attr)
1313 {
1314 	struct qedr_srq_hwq_info *hw_srq = &srq->hw_srq;
1315 	dma_addr_t phy_prod_pair_addr;
1316 	u32 num_elems;
1317 	void *va;
1318 	int rc;
1319 
1320 	va = dma_alloc_coherent(&dev->pdev->dev,
1321 				sizeof(struct rdma_srq_producers),
1322 				&phy_prod_pair_addr, GFP_KERNEL);
1323 	if (!va) {
1324 		DP_ERR(dev,
1325 		       "create srq: failed to allocate dma memory for producer\n");
1326 		return -ENOMEM;
1327 	}
1328 
1329 	hw_srq->phy_prod_pair_addr = phy_prod_pair_addr;
1330 	hw_srq->virt_prod_pair_addr = va;
1331 
1332 	num_elems = init_attr->attr.max_wr * RDMA_MAX_SRQ_WQE_SIZE;
1333 	rc = dev->ops->common->chain_alloc(dev->cdev,
1334 					   QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1335 					   QED_CHAIN_MODE_PBL,
1336 					   QED_CHAIN_CNT_TYPE_U32,
1337 					   num_elems,
1338 					   QEDR_SRQ_WQE_ELEM_SIZE,
1339 					   &hw_srq->pbl, NULL);
1340 	if (rc)
1341 		goto err0;
1342 
1343 	hw_srq->num_elems = num_elems;
1344 
1345 	return 0;
1346 
1347 err0:
1348 	dma_free_coherent(&dev->pdev->dev, sizeof(struct rdma_srq_producers),
1349 			  va, phy_prod_pair_addr);
1350 	return rc;
1351 }
1352 
qedr_create_srq(struct ib_srq * ibsrq,struct ib_srq_init_attr * init_attr,struct ib_udata * udata)1353 int qedr_create_srq(struct ib_srq *ibsrq, struct ib_srq_init_attr *init_attr,
1354 		    struct ib_udata *udata)
1355 {
1356 	struct qed_rdma_destroy_srq_in_params destroy_in_params;
1357 	struct qed_rdma_create_srq_in_params in_params = {};
1358 	struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1359 	struct qed_rdma_create_srq_out_params out_params;
1360 	struct qedr_pd *pd = get_qedr_pd(ibsrq->pd);
1361 	struct qedr_create_srq_ureq ureq = {};
1362 	u64 pbl_base_addr, phy_prod_pair_addr;
1363 	struct qedr_srq_hwq_info *hw_srq;
1364 	u32 page_cnt, page_size;
1365 	struct qedr_srq *srq = get_qedr_srq(ibsrq);
1366 	int rc = 0;
1367 
1368 	DP_DEBUG(dev, QEDR_MSG_QP,
1369 		 "create SRQ called from %s (pd %p)\n",
1370 		 (udata) ? "User lib" : "kernel", pd);
1371 
1372 	rc = qedr_check_srq_params(dev, init_attr, udata);
1373 	if (rc)
1374 		return -EINVAL;
1375 
1376 	srq->dev = dev;
1377 	hw_srq = &srq->hw_srq;
1378 	spin_lock_init(&srq->lock);
1379 
1380 	hw_srq->max_wr = init_attr->attr.max_wr;
1381 	hw_srq->max_sges = init_attr->attr.max_sge;
1382 
1383 	if (udata) {
1384 		if (ib_copy_from_udata(&ureq, udata, sizeof(ureq))) {
1385 			DP_ERR(dev,
1386 			       "create srq: problem copying data from user space\n");
1387 			goto err0;
1388 		}
1389 
1390 		rc = qedr_init_srq_user_params(udata, srq, &ureq, 0, 0);
1391 		if (rc)
1392 			goto err0;
1393 
1394 		page_cnt = srq->usrq.pbl_info.num_pbes;
1395 		pbl_base_addr = srq->usrq.pbl_tbl->pa;
1396 		phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1397 		page_size = PAGE_SIZE;
1398 	} else {
1399 		struct qed_chain *pbl;
1400 
1401 		rc = qedr_alloc_srq_kernel_params(srq, dev, init_attr);
1402 		if (rc)
1403 			goto err0;
1404 
1405 		pbl = &hw_srq->pbl;
1406 		page_cnt = qed_chain_get_page_cnt(pbl);
1407 		pbl_base_addr = qed_chain_get_pbl_phys(pbl);
1408 		phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
1409 		page_size = QED_CHAIN_PAGE_SIZE;
1410 	}
1411 
1412 	in_params.pd_id = pd->pd_id;
1413 	in_params.pbl_base_addr = pbl_base_addr;
1414 	in_params.prod_pair_addr = phy_prod_pair_addr;
1415 	in_params.num_pages = page_cnt;
1416 	in_params.page_size = page_size;
1417 
1418 	rc = dev->ops->rdma_create_srq(dev->rdma_ctx, &in_params, &out_params);
1419 	if (rc)
1420 		goto err1;
1421 
1422 	srq->srq_id = out_params.srq_id;
1423 
1424 	if (udata) {
1425 		rc = qedr_copy_srq_uresp(dev, srq, udata);
1426 		if (rc)
1427 			goto err2;
1428 	}
1429 
1430 	rc = xa_insert_irq(&dev->srqs, srq->srq_id, srq, GFP_KERNEL);
1431 	if (rc)
1432 		goto err2;
1433 
1434 	DP_DEBUG(dev, QEDR_MSG_SRQ,
1435 		 "create srq: created srq with srq_id=0x%0x\n", srq->srq_id);
1436 	return 0;
1437 
1438 err2:
1439 	destroy_in_params.srq_id = srq->srq_id;
1440 
1441 	dev->ops->rdma_destroy_srq(dev->rdma_ctx, &destroy_in_params);
1442 err1:
1443 	if (udata)
1444 		qedr_free_srq_user_params(srq);
1445 	else
1446 		qedr_free_srq_kernel_params(srq);
1447 err0:
1448 	return -EFAULT;
1449 }
1450 
qedr_destroy_srq(struct ib_srq * ibsrq,struct ib_udata * udata)1451 void qedr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
1452 {
1453 	struct qed_rdma_destroy_srq_in_params in_params = {};
1454 	struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1455 	struct qedr_srq *srq = get_qedr_srq(ibsrq);
1456 
1457 	xa_erase_irq(&dev->srqs, srq->srq_id);
1458 	in_params.srq_id = srq->srq_id;
1459 	dev->ops->rdma_destroy_srq(dev->rdma_ctx, &in_params);
1460 
1461 	if (ibsrq->uobject)
1462 		qedr_free_srq_user_params(srq);
1463 	else
1464 		qedr_free_srq_kernel_params(srq);
1465 
1466 	DP_DEBUG(dev, QEDR_MSG_SRQ,
1467 		 "destroy srq: destroyed srq with srq_id=0x%0x\n",
1468 		 srq->srq_id);
1469 }
1470 
qedr_modify_srq(struct ib_srq * ibsrq,struct ib_srq_attr * attr,enum ib_srq_attr_mask attr_mask,struct ib_udata * udata)1471 int qedr_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
1472 		    enum ib_srq_attr_mask attr_mask, struct ib_udata *udata)
1473 {
1474 	struct qed_rdma_modify_srq_in_params in_params = {};
1475 	struct qedr_dev *dev = get_qedr_dev(ibsrq->device);
1476 	struct qedr_srq *srq = get_qedr_srq(ibsrq);
1477 	int rc;
1478 
1479 	if (attr_mask & IB_SRQ_MAX_WR) {
1480 		DP_ERR(dev,
1481 		       "modify srq: invalid attribute mask=0x%x specified for %p\n",
1482 		       attr_mask, srq);
1483 		return -EINVAL;
1484 	}
1485 
1486 	if (attr_mask & IB_SRQ_LIMIT) {
1487 		if (attr->srq_limit >= srq->hw_srq.max_wr) {
1488 			DP_ERR(dev,
1489 			       "modify srq: invalid srq_limit=0x%x (max_srq_limit=0x%x)\n",
1490 			       attr->srq_limit, srq->hw_srq.max_wr);
1491 			return -EINVAL;
1492 		}
1493 
1494 		in_params.srq_id = srq->srq_id;
1495 		in_params.wqe_limit = attr->srq_limit;
1496 		rc = dev->ops->rdma_modify_srq(dev->rdma_ctx, &in_params);
1497 		if (rc)
1498 			return rc;
1499 	}
1500 
1501 	srq->srq_limit = attr->srq_limit;
1502 
1503 	DP_DEBUG(dev, QEDR_MSG_SRQ,
1504 		 "modify srq: modified srq with srq_id=0x%0x\n", srq->srq_id);
1505 
1506 	return 0;
1507 }
1508 
1509 static inline void
qedr_init_common_qp_in_params(struct qedr_dev * dev,struct qedr_pd * pd,struct qedr_qp * qp,struct ib_qp_init_attr * attrs,bool fmr_and_reserved_lkey,struct qed_rdma_create_qp_in_params * params)1510 qedr_init_common_qp_in_params(struct qedr_dev *dev,
1511 			      struct qedr_pd *pd,
1512 			      struct qedr_qp *qp,
1513 			      struct ib_qp_init_attr *attrs,
1514 			      bool fmr_and_reserved_lkey,
1515 			      struct qed_rdma_create_qp_in_params *params)
1516 {
1517 	/* QP handle to be written in an async event */
1518 	params->qp_handle_async_lo = lower_32_bits((uintptr_t) qp);
1519 	params->qp_handle_async_hi = upper_32_bits((uintptr_t) qp);
1520 
1521 	params->signal_all = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR);
1522 	params->fmr_and_reserved_lkey = fmr_and_reserved_lkey;
1523 	params->pd = pd->pd_id;
1524 	params->dpi = pd->uctx ? pd->uctx->dpi : dev->dpi;
1525 	params->sq_cq_id = get_qedr_cq(attrs->send_cq)->icid;
1526 	params->stats_queue = 0;
1527 	params->srq_id = 0;
1528 	params->use_srq = false;
1529 
1530 	if (!qp->srq) {
1531 		params->rq_cq_id = get_qedr_cq(attrs->recv_cq)->icid;
1532 
1533 	} else {
1534 		params->rq_cq_id = get_qedr_cq(attrs->recv_cq)->icid;
1535 		params->srq_id = qp->srq->srq_id;
1536 		params->use_srq = true;
1537 	}
1538 }
1539 
qedr_qp_user_print(struct qedr_dev * dev,struct qedr_qp * qp)1540 static inline void qedr_qp_user_print(struct qedr_dev *dev, struct qedr_qp *qp)
1541 {
1542 	DP_DEBUG(dev, QEDR_MSG_QP, "create qp: successfully created user QP. "
1543 		 "qp=%p. "
1544 		 "sq_addr=0x%llx, "
1545 		 "sq_len=%zd, "
1546 		 "rq_addr=0x%llx, "
1547 		 "rq_len=%zd"
1548 		 "\n",
1549 		 qp,
1550 		 qp->usq.buf_addr,
1551 		 qp->usq.buf_len, qp->urq.buf_addr, qp->urq.buf_len);
1552 }
1553 
1554 static inline void
qedr_iwarp_populate_user_qp(struct qedr_dev * dev,struct qedr_qp * qp,struct qed_rdma_create_qp_out_params * out_params)1555 qedr_iwarp_populate_user_qp(struct qedr_dev *dev,
1556 			    struct qedr_qp *qp,
1557 			    struct qed_rdma_create_qp_out_params *out_params)
1558 {
1559 	qp->usq.pbl_tbl->va = out_params->sq_pbl_virt;
1560 	qp->usq.pbl_tbl->pa = out_params->sq_pbl_phys;
1561 
1562 	qedr_populate_pbls(dev, qp->usq.umem, qp->usq.pbl_tbl,
1563 			   &qp->usq.pbl_info, FW_PAGE_SHIFT);
1564 	if (!qp->srq) {
1565 		qp->urq.pbl_tbl->va = out_params->rq_pbl_virt;
1566 		qp->urq.pbl_tbl->pa = out_params->rq_pbl_phys;
1567 	}
1568 
1569 	qedr_populate_pbls(dev, qp->urq.umem, qp->urq.pbl_tbl,
1570 			   &qp->urq.pbl_info, FW_PAGE_SHIFT);
1571 }
1572 
qedr_cleanup_user(struct qedr_dev * dev,struct qedr_qp * qp)1573 static void qedr_cleanup_user(struct qedr_dev *dev, struct qedr_qp *qp)
1574 {
1575 	ib_umem_release(qp->usq.umem);
1576 	qp->usq.umem = NULL;
1577 
1578 	ib_umem_release(qp->urq.umem);
1579 	qp->urq.umem = NULL;
1580 
1581 	if (rdma_protocol_roce(&dev->ibdev, 1)) {
1582 		qedr_free_pbl(dev, &qp->usq.pbl_info, qp->usq.pbl_tbl);
1583 		qedr_free_pbl(dev, &qp->urq.pbl_info, qp->urq.pbl_tbl);
1584 	} else {
1585 		kfree(qp->usq.pbl_tbl);
1586 		kfree(qp->urq.pbl_tbl);
1587 	}
1588 }
1589 
qedr_create_user_qp(struct qedr_dev * dev,struct qedr_qp * qp,struct ib_pd * ibpd,struct ib_udata * udata,struct ib_qp_init_attr * attrs)1590 static int qedr_create_user_qp(struct qedr_dev *dev,
1591 			       struct qedr_qp *qp,
1592 			       struct ib_pd *ibpd,
1593 			       struct ib_udata *udata,
1594 			       struct ib_qp_init_attr *attrs)
1595 {
1596 	struct qed_rdma_create_qp_in_params in_params;
1597 	struct qed_rdma_create_qp_out_params out_params;
1598 	struct qedr_pd *pd = get_qedr_pd(ibpd);
1599 	struct qedr_create_qp_ureq ureq;
1600 	int alloc_and_init = rdma_protocol_roce(&dev->ibdev, 1);
1601 	int rc = -EINVAL;
1602 
1603 	memset(&ureq, 0, sizeof(ureq));
1604 	rc = ib_copy_from_udata(&ureq, udata, sizeof(ureq));
1605 	if (rc) {
1606 		DP_ERR(dev, "Problem copying data from user space\n");
1607 		return rc;
1608 	}
1609 
1610 	/* SQ - read access only (0), dma sync not required (0) */
1611 	rc = qedr_init_user_queue(udata, dev, &qp->usq, ureq.sq_addr,
1612 				  ureq.sq_len, 0, 0, alloc_and_init);
1613 	if (rc)
1614 		return rc;
1615 
1616 	if (!qp->srq) {
1617 		/* RQ - read access only (0), dma sync not required (0) */
1618 		rc = qedr_init_user_queue(udata, dev, &qp->urq, ureq.rq_addr,
1619 					  ureq.rq_len, 0, 0, alloc_and_init);
1620 		if (rc)
1621 			return rc;
1622 	}
1623 
1624 	memset(&in_params, 0, sizeof(in_params));
1625 	qedr_init_common_qp_in_params(dev, pd, qp, attrs, false, &in_params);
1626 	in_params.qp_handle_lo = ureq.qp_handle_lo;
1627 	in_params.qp_handle_hi = ureq.qp_handle_hi;
1628 	in_params.sq_num_pages = qp->usq.pbl_info.num_pbes;
1629 	in_params.sq_pbl_ptr = qp->usq.pbl_tbl->pa;
1630 	if (!qp->srq) {
1631 		in_params.rq_num_pages = qp->urq.pbl_info.num_pbes;
1632 		in_params.rq_pbl_ptr = qp->urq.pbl_tbl->pa;
1633 	}
1634 
1635 	qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1636 					      &in_params, &out_params);
1637 
1638 	if (!qp->qed_qp) {
1639 		rc = -ENOMEM;
1640 		goto err1;
1641 	}
1642 
1643 	if (rdma_protocol_iwarp(&dev->ibdev, 1))
1644 		qedr_iwarp_populate_user_qp(dev, qp, &out_params);
1645 
1646 	qp->qp_id = out_params.qp_id;
1647 	qp->icid = out_params.icid;
1648 
1649 	rc = qedr_copy_qp_uresp(dev, qp, udata);
1650 	if (rc)
1651 		goto err;
1652 
1653 	qedr_qp_user_print(dev, qp);
1654 
1655 	return 0;
1656 err:
1657 	rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
1658 	if (rc)
1659 		DP_ERR(dev, "create qp: fatal fault. rc=%d", rc);
1660 
1661 err1:
1662 	qedr_cleanup_user(dev, qp);
1663 	return rc;
1664 }
1665 
qedr_set_iwarp_db_info(struct qedr_dev * dev,struct qedr_qp * qp)1666 static void qedr_set_iwarp_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
1667 {
1668 	qp->sq.db = dev->db_addr +
1669 	    DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1670 	qp->sq.db_data.data.icid = qp->icid;
1671 
1672 	qp->rq.db = dev->db_addr +
1673 		    DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
1674 	qp->rq.db_data.data.icid = qp->icid;
1675 	qp->rq.iwarp_db2 = dev->db_addr +
1676 			   DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
1677 	qp->rq.iwarp_db2_data.data.icid = qp->icid;
1678 	qp->rq.iwarp_db2_data.data.value = DQ_TCM_IWARP_POST_RQ_CF_CMD;
1679 }
1680 
1681 static int
qedr_roce_create_kernel_qp(struct qedr_dev * dev,struct qedr_qp * qp,struct qed_rdma_create_qp_in_params * in_params,u32 n_sq_elems,u32 n_rq_elems)1682 qedr_roce_create_kernel_qp(struct qedr_dev *dev,
1683 			   struct qedr_qp *qp,
1684 			   struct qed_rdma_create_qp_in_params *in_params,
1685 			   u32 n_sq_elems, u32 n_rq_elems)
1686 {
1687 	struct qed_rdma_create_qp_out_params out_params;
1688 	int rc;
1689 
1690 	rc = dev->ops->common->chain_alloc(dev->cdev,
1691 					   QED_CHAIN_USE_TO_PRODUCE,
1692 					   QED_CHAIN_MODE_PBL,
1693 					   QED_CHAIN_CNT_TYPE_U32,
1694 					   n_sq_elems,
1695 					   QEDR_SQE_ELEMENT_SIZE,
1696 					   &qp->sq.pbl, NULL);
1697 
1698 	if (rc)
1699 		return rc;
1700 
1701 	in_params->sq_num_pages = qed_chain_get_page_cnt(&qp->sq.pbl);
1702 	in_params->sq_pbl_ptr = qed_chain_get_pbl_phys(&qp->sq.pbl);
1703 
1704 	rc = dev->ops->common->chain_alloc(dev->cdev,
1705 					   QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1706 					   QED_CHAIN_MODE_PBL,
1707 					   QED_CHAIN_CNT_TYPE_U32,
1708 					   n_rq_elems,
1709 					   QEDR_RQE_ELEMENT_SIZE,
1710 					   &qp->rq.pbl, NULL);
1711 	if (rc)
1712 		return rc;
1713 
1714 	in_params->rq_num_pages = qed_chain_get_page_cnt(&qp->rq.pbl);
1715 	in_params->rq_pbl_ptr = qed_chain_get_pbl_phys(&qp->rq.pbl);
1716 
1717 	qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1718 					      in_params, &out_params);
1719 
1720 	if (!qp->qed_qp)
1721 		return -EINVAL;
1722 
1723 	qp->qp_id = out_params.qp_id;
1724 	qp->icid = out_params.icid;
1725 
1726 	qedr_set_roce_db_info(dev, qp);
1727 	return rc;
1728 }
1729 
1730 static int
qedr_iwarp_create_kernel_qp(struct qedr_dev * dev,struct qedr_qp * qp,struct qed_rdma_create_qp_in_params * in_params,u32 n_sq_elems,u32 n_rq_elems)1731 qedr_iwarp_create_kernel_qp(struct qedr_dev *dev,
1732 			    struct qedr_qp *qp,
1733 			    struct qed_rdma_create_qp_in_params *in_params,
1734 			    u32 n_sq_elems, u32 n_rq_elems)
1735 {
1736 	struct qed_rdma_create_qp_out_params out_params;
1737 	struct qed_chain_ext_pbl ext_pbl;
1738 	int rc;
1739 
1740 	in_params->sq_num_pages = QED_CHAIN_PAGE_CNT(n_sq_elems,
1741 						     QEDR_SQE_ELEMENT_SIZE,
1742 						     QED_CHAIN_MODE_PBL);
1743 	in_params->rq_num_pages = QED_CHAIN_PAGE_CNT(n_rq_elems,
1744 						     QEDR_RQE_ELEMENT_SIZE,
1745 						     QED_CHAIN_MODE_PBL);
1746 
1747 	qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1748 					      in_params, &out_params);
1749 
1750 	if (!qp->qed_qp)
1751 		return -EINVAL;
1752 
1753 	/* Now we allocate the chain */
1754 	ext_pbl.p_pbl_virt = out_params.sq_pbl_virt;
1755 	ext_pbl.p_pbl_phys = out_params.sq_pbl_phys;
1756 
1757 	rc = dev->ops->common->chain_alloc(dev->cdev,
1758 					   QED_CHAIN_USE_TO_PRODUCE,
1759 					   QED_CHAIN_MODE_PBL,
1760 					   QED_CHAIN_CNT_TYPE_U32,
1761 					   n_sq_elems,
1762 					   QEDR_SQE_ELEMENT_SIZE,
1763 					   &qp->sq.pbl, &ext_pbl);
1764 
1765 	if (rc)
1766 		goto err;
1767 
1768 	ext_pbl.p_pbl_virt = out_params.rq_pbl_virt;
1769 	ext_pbl.p_pbl_phys = out_params.rq_pbl_phys;
1770 
1771 	rc = dev->ops->common->chain_alloc(dev->cdev,
1772 					   QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1773 					   QED_CHAIN_MODE_PBL,
1774 					   QED_CHAIN_CNT_TYPE_U32,
1775 					   n_rq_elems,
1776 					   QEDR_RQE_ELEMENT_SIZE,
1777 					   &qp->rq.pbl, &ext_pbl);
1778 
1779 	if (rc)
1780 		goto err;
1781 
1782 	qp->qp_id = out_params.qp_id;
1783 	qp->icid = out_params.icid;
1784 
1785 	qedr_set_iwarp_db_info(dev, qp);
1786 	return rc;
1787 
1788 err:
1789 	dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
1790 
1791 	return rc;
1792 }
1793 
qedr_cleanup_kernel(struct qedr_dev * dev,struct qedr_qp * qp)1794 static void qedr_cleanup_kernel(struct qedr_dev *dev, struct qedr_qp *qp)
1795 {
1796 	dev->ops->common->chain_free(dev->cdev, &qp->sq.pbl);
1797 	kfree(qp->wqe_wr_id);
1798 
1799 	dev->ops->common->chain_free(dev->cdev, &qp->rq.pbl);
1800 	kfree(qp->rqe_wr_id);
1801 }
1802 
qedr_create_kernel_qp(struct qedr_dev * dev,struct qedr_qp * qp,struct ib_pd * ibpd,struct ib_qp_init_attr * attrs)1803 static int qedr_create_kernel_qp(struct qedr_dev *dev,
1804 				 struct qedr_qp *qp,
1805 				 struct ib_pd *ibpd,
1806 				 struct ib_qp_init_attr *attrs)
1807 {
1808 	struct qed_rdma_create_qp_in_params in_params;
1809 	struct qedr_pd *pd = get_qedr_pd(ibpd);
1810 	int rc = -EINVAL;
1811 	u32 n_rq_elems;
1812 	u32 n_sq_elems;
1813 	u32 n_sq_entries;
1814 
1815 	memset(&in_params, 0, sizeof(in_params));
1816 
1817 	/* A single work request may take up to QEDR_MAX_SQ_WQE_SIZE elements in
1818 	 * the ring. The ring should allow at least a single WR, even if the
1819 	 * user requested none, due to allocation issues.
1820 	 * We should add an extra WR since the prod and cons indices of
1821 	 * wqe_wr_id are managed in such a way that the WQ is considered full
1822 	 * when (prod+1)%max_wr==cons. We currently don't do that because we
1823 	 * double the number of entries due an iSER issue that pushes far more
1824 	 * WRs than indicated. If we decline its ib_post_send() then we get
1825 	 * error prints in the dmesg we'd like to avoid.
1826 	 */
1827 	qp->sq.max_wr = min_t(u32, attrs->cap.max_send_wr * dev->wq_multiplier,
1828 			      dev->attr.max_sqe);
1829 
1830 	qp->wqe_wr_id = kcalloc(qp->sq.max_wr, sizeof(*qp->wqe_wr_id),
1831 				GFP_KERNEL);
1832 	if (!qp->wqe_wr_id) {
1833 		DP_ERR(dev, "create qp: failed SQ shadow memory allocation\n");
1834 		return -ENOMEM;
1835 	}
1836 
1837 	/* QP handle to be written in CQE */
1838 	in_params.qp_handle_lo = lower_32_bits((uintptr_t) qp);
1839 	in_params.qp_handle_hi = upper_32_bits((uintptr_t) qp);
1840 
1841 	/* A single work request may take up to QEDR_MAX_RQ_WQE_SIZE elements in
1842 	 * the ring. There ring should allow at least a single WR, even if the
1843 	 * user requested none, due to allocation issues.
1844 	 */
1845 	qp->rq.max_wr = (u16) max_t(u32, attrs->cap.max_recv_wr, 1);
1846 
1847 	/* Allocate driver internal RQ array */
1848 	qp->rqe_wr_id = kcalloc(qp->rq.max_wr, sizeof(*qp->rqe_wr_id),
1849 				GFP_KERNEL);
1850 	if (!qp->rqe_wr_id) {
1851 		DP_ERR(dev,
1852 		       "create qp: failed RQ shadow memory allocation\n");
1853 		kfree(qp->wqe_wr_id);
1854 		return -ENOMEM;
1855 	}
1856 
1857 	qedr_init_common_qp_in_params(dev, pd, qp, attrs, true, &in_params);
1858 
1859 	n_sq_entries = attrs->cap.max_send_wr;
1860 	n_sq_entries = min_t(u32, n_sq_entries, dev->attr.max_sqe);
1861 	n_sq_entries = max_t(u32, n_sq_entries, 1);
1862 	n_sq_elems = n_sq_entries * QEDR_MAX_SQE_ELEMENTS_PER_SQE;
1863 
1864 	n_rq_elems = qp->rq.max_wr * QEDR_MAX_RQE_ELEMENTS_PER_RQE;
1865 
1866 	if (rdma_protocol_iwarp(&dev->ibdev, 1))
1867 		rc = qedr_iwarp_create_kernel_qp(dev, qp, &in_params,
1868 						 n_sq_elems, n_rq_elems);
1869 	else
1870 		rc = qedr_roce_create_kernel_qp(dev, qp, &in_params,
1871 						n_sq_elems, n_rq_elems);
1872 	if (rc)
1873 		qedr_cleanup_kernel(dev, qp);
1874 
1875 	return rc;
1876 }
1877 
qedr_create_qp(struct ib_pd * ibpd,struct ib_qp_init_attr * attrs,struct ib_udata * udata)1878 struct ib_qp *qedr_create_qp(struct ib_pd *ibpd,
1879 			     struct ib_qp_init_attr *attrs,
1880 			     struct ib_udata *udata)
1881 {
1882 	struct qedr_dev *dev = get_qedr_dev(ibpd->device);
1883 	struct qedr_pd *pd = get_qedr_pd(ibpd);
1884 	struct qedr_qp *qp;
1885 	struct ib_qp *ibqp;
1886 	int rc = 0;
1887 
1888 	DP_DEBUG(dev, QEDR_MSG_QP, "create qp: called from %s, pd=%p\n",
1889 		 udata ? "user library" : "kernel", pd);
1890 
1891 	rc = qedr_check_qp_attrs(ibpd, dev, attrs, udata);
1892 	if (rc)
1893 		return ERR_PTR(rc);
1894 
1895 	DP_DEBUG(dev, QEDR_MSG_QP,
1896 		 "create qp: called from %s, event_handler=%p, eepd=%p sq_cq=%p, sq_icid=%d, rq_cq=%p, rq_icid=%d\n",
1897 		 udata ? "user library" : "kernel", attrs->event_handler, pd,
1898 		 get_qedr_cq(attrs->send_cq),
1899 		 get_qedr_cq(attrs->send_cq)->icid,
1900 		 get_qedr_cq(attrs->recv_cq),
1901 		 attrs->recv_cq ? get_qedr_cq(attrs->recv_cq)->icid : 0);
1902 
1903 	qp = kzalloc(sizeof(*qp), GFP_KERNEL);
1904 	if (!qp) {
1905 		DP_ERR(dev, "create qp: failed allocating memory\n");
1906 		return ERR_PTR(-ENOMEM);
1907 	}
1908 
1909 	qedr_set_common_qp_params(dev, qp, pd, attrs);
1910 
1911 	if (attrs->qp_type == IB_QPT_GSI) {
1912 		ibqp = qedr_create_gsi_qp(dev, attrs, qp);
1913 		if (IS_ERR(ibqp))
1914 			kfree(qp);
1915 		return ibqp;
1916 	}
1917 
1918 	if (udata)
1919 		rc = qedr_create_user_qp(dev, qp, ibpd, udata, attrs);
1920 	else
1921 		rc = qedr_create_kernel_qp(dev, qp, ibpd, attrs);
1922 
1923 	if (rc)
1924 		goto err;
1925 
1926 	qp->ibqp.qp_num = qp->qp_id;
1927 
1928 	if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
1929 		rc = xa_insert_irq(&dev->qps, qp->qp_id, qp, GFP_KERNEL);
1930 		if (rc)
1931 			goto err;
1932 	}
1933 
1934 	return &qp->ibqp;
1935 
1936 err:
1937 	kfree(qp);
1938 
1939 	return ERR_PTR(-EFAULT);
1940 }
1941 
qedr_get_ibqp_state(enum qed_roce_qp_state qp_state)1942 static enum ib_qp_state qedr_get_ibqp_state(enum qed_roce_qp_state qp_state)
1943 {
1944 	switch (qp_state) {
1945 	case QED_ROCE_QP_STATE_RESET:
1946 		return IB_QPS_RESET;
1947 	case QED_ROCE_QP_STATE_INIT:
1948 		return IB_QPS_INIT;
1949 	case QED_ROCE_QP_STATE_RTR:
1950 		return IB_QPS_RTR;
1951 	case QED_ROCE_QP_STATE_RTS:
1952 		return IB_QPS_RTS;
1953 	case QED_ROCE_QP_STATE_SQD:
1954 		return IB_QPS_SQD;
1955 	case QED_ROCE_QP_STATE_ERR:
1956 		return IB_QPS_ERR;
1957 	case QED_ROCE_QP_STATE_SQE:
1958 		return IB_QPS_SQE;
1959 	}
1960 	return IB_QPS_ERR;
1961 }
1962 
qedr_get_state_from_ibqp(enum ib_qp_state qp_state)1963 static enum qed_roce_qp_state qedr_get_state_from_ibqp(
1964 					enum ib_qp_state qp_state)
1965 {
1966 	switch (qp_state) {
1967 	case IB_QPS_RESET:
1968 		return QED_ROCE_QP_STATE_RESET;
1969 	case IB_QPS_INIT:
1970 		return QED_ROCE_QP_STATE_INIT;
1971 	case IB_QPS_RTR:
1972 		return QED_ROCE_QP_STATE_RTR;
1973 	case IB_QPS_RTS:
1974 		return QED_ROCE_QP_STATE_RTS;
1975 	case IB_QPS_SQD:
1976 		return QED_ROCE_QP_STATE_SQD;
1977 	case IB_QPS_ERR:
1978 		return QED_ROCE_QP_STATE_ERR;
1979 	default:
1980 		return QED_ROCE_QP_STATE_ERR;
1981 	}
1982 }
1983 
qedr_reset_qp_hwq_info(struct qedr_qp_hwq_info * qph)1984 static void qedr_reset_qp_hwq_info(struct qedr_qp_hwq_info *qph)
1985 {
1986 	qed_chain_reset(&qph->pbl);
1987 	qph->prod = 0;
1988 	qph->cons = 0;
1989 	qph->wqe_cons = 0;
1990 	qph->db_data.data.value = cpu_to_le16(0);
1991 }
1992 
qedr_update_qp_state(struct qedr_dev * dev,struct qedr_qp * qp,enum qed_roce_qp_state cur_state,enum qed_roce_qp_state new_state)1993 static int qedr_update_qp_state(struct qedr_dev *dev,
1994 				struct qedr_qp *qp,
1995 				enum qed_roce_qp_state cur_state,
1996 				enum qed_roce_qp_state new_state)
1997 {
1998 	int status = 0;
1999 
2000 	if (new_state == cur_state)
2001 		return 0;
2002 
2003 	switch (cur_state) {
2004 	case QED_ROCE_QP_STATE_RESET:
2005 		switch (new_state) {
2006 		case QED_ROCE_QP_STATE_INIT:
2007 			qp->prev_wqe_size = 0;
2008 			qedr_reset_qp_hwq_info(&qp->sq);
2009 			qedr_reset_qp_hwq_info(&qp->rq);
2010 			break;
2011 		default:
2012 			status = -EINVAL;
2013 			break;
2014 		}
2015 		break;
2016 	case QED_ROCE_QP_STATE_INIT:
2017 		switch (new_state) {
2018 		case QED_ROCE_QP_STATE_RTR:
2019 			/* Update doorbell (in case post_recv was
2020 			 * done before move to RTR)
2021 			 */
2022 
2023 			if (rdma_protocol_roce(&dev->ibdev, 1)) {
2024 				writel(qp->rq.db_data.raw, qp->rq.db);
2025 			}
2026 			break;
2027 		case QED_ROCE_QP_STATE_ERR:
2028 			break;
2029 		default:
2030 			/* Invalid state change. */
2031 			status = -EINVAL;
2032 			break;
2033 		}
2034 		break;
2035 	case QED_ROCE_QP_STATE_RTR:
2036 		/* RTR->XXX */
2037 		switch (new_state) {
2038 		case QED_ROCE_QP_STATE_RTS:
2039 			break;
2040 		case QED_ROCE_QP_STATE_ERR:
2041 			break;
2042 		default:
2043 			/* Invalid state change. */
2044 			status = -EINVAL;
2045 			break;
2046 		}
2047 		break;
2048 	case QED_ROCE_QP_STATE_RTS:
2049 		/* RTS->XXX */
2050 		switch (new_state) {
2051 		case QED_ROCE_QP_STATE_SQD:
2052 			break;
2053 		case QED_ROCE_QP_STATE_ERR:
2054 			break;
2055 		default:
2056 			/* Invalid state change. */
2057 			status = -EINVAL;
2058 			break;
2059 		}
2060 		break;
2061 	case QED_ROCE_QP_STATE_SQD:
2062 		/* SQD->XXX */
2063 		switch (new_state) {
2064 		case QED_ROCE_QP_STATE_RTS:
2065 		case QED_ROCE_QP_STATE_ERR:
2066 			break;
2067 		default:
2068 			/* Invalid state change. */
2069 			status = -EINVAL;
2070 			break;
2071 		}
2072 		break;
2073 	case QED_ROCE_QP_STATE_ERR:
2074 		/* ERR->XXX */
2075 		switch (new_state) {
2076 		case QED_ROCE_QP_STATE_RESET:
2077 			if ((qp->rq.prod != qp->rq.cons) ||
2078 			    (qp->sq.prod != qp->sq.cons)) {
2079 				DP_NOTICE(dev,
2080 					  "Error->Reset with rq/sq not empty rq.prod=%x rq.cons=%x sq.prod=%x sq.cons=%x\n",
2081 					  qp->rq.prod, qp->rq.cons, qp->sq.prod,
2082 					  qp->sq.cons);
2083 				status = -EINVAL;
2084 			}
2085 			break;
2086 		default:
2087 			status = -EINVAL;
2088 			break;
2089 		}
2090 		break;
2091 	default:
2092 		status = -EINVAL;
2093 		break;
2094 	}
2095 
2096 	return status;
2097 }
2098 
qedr_modify_qp(struct ib_qp * ibqp,struct ib_qp_attr * attr,int attr_mask,struct ib_udata * udata)2099 int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
2100 		   int attr_mask, struct ib_udata *udata)
2101 {
2102 	struct qedr_qp *qp = get_qedr_qp(ibqp);
2103 	struct qed_rdma_modify_qp_in_params qp_params = { 0 };
2104 	struct qedr_dev *dev = get_qedr_dev(&qp->dev->ibdev);
2105 	const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr);
2106 	enum ib_qp_state old_qp_state, new_qp_state;
2107 	enum qed_roce_qp_state cur_state;
2108 	int rc = 0;
2109 
2110 	DP_DEBUG(dev, QEDR_MSG_QP,
2111 		 "modify qp: qp %p attr_mask=0x%x, state=%d", qp, attr_mask,
2112 		 attr->qp_state);
2113 
2114 	old_qp_state = qedr_get_ibqp_state(qp->state);
2115 	if (attr_mask & IB_QP_STATE)
2116 		new_qp_state = attr->qp_state;
2117 	else
2118 		new_qp_state = old_qp_state;
2119 
2120 	if (rdma_protocol_roce(&dev->ibdev, 1)) {
2121 		if (!ib_modify_qp_is_ok(old_qp_state, new_qp_state,
2122 					ibqp->qp_type, attr_mask)) {
2123 			DP_ERR(dev,
2124 			       "modify qp: invalid attribute mask=0x%x specified for\n"
2125 			       "qpn=0x%x of type=0x%x old_qp_state=0x%x, new_qp_state=0x%x\n",
2126 			       attr_mask, qp->qp_id, ibqp->qp_type,
2127 			       old_qp_state, new_qp_state);
2128 			rc = -EINVAL;
2129 			goto err;
2130 		}
2131 	}
2132 
2133 	/* Translate the masks... */
2134 	if (attr_mask & IB_QP_STATE) {
2135 		SET_FIELD(qp_params.modify_flags,
2136 			  QED_RDMA_MODIFY_QP_VALID_NEW_STATE, 1);
2137 		qp_params.new_state = qedr_get_state_from_ibqp(attr->qp_state);
2138 	}
2139 
2140 	if (attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY)
2141 		qp_params.sqd_async = true;
2142 
2143 	if (attr_mask & IB_QP_PKEY_INDEX) {
2144 		SET_FIELD(qp_params.modify_flags,
2145 			  QED_ROCE_MODIFY_QP_VALID_PKEY, 1);
2146 		if (attr->pkey_index >= QEDR_ROCE_PKEY_TABLE_LEN) {
2147 			rc = -EINVAL;
2148 			goto err;
2149 		}
2150 
2151 		qp_params.pkey = QEDR_ROCE_PKEY_DEFAULT;
2152 	}
2153 
2154 	if (attr_mask & IB_QP_QKEY)
2155 		qp->qkey = attr->qkey;
2156 
2157 	if (attr_mask & IB_QP_ACCESS_FLAGS) {
2158 		SET_FIELD(qp_params.modify_flags,
2159 			  QED_RDMA_MODIFY_QP_VALID_RDMA_OPS_EN, 1);
2160 		qp_params.incoming_rdma_read_en = attr->qp_access_flags &
2161 						  IB_ACCESS_REMOTE_READ;
2162 		qp_params.incoming_rdma_write_en = attr->qp_access_flags &
2163 						   IB_ACCESS_REMOTE_WRITE;
2164 		qp_params.incoming_atomic_en = attr->qp_access_flags &
2165 					       IB_ACCESS_REMOTE_ATOMIC;
2166 	}
2167 
2168 	if (attr_mask & (IB_QP_AV | IB_QP_PATH_MTU)) {
2169 		if (rdma_protocol_iwarp(&dev->ibdev, 1))
2170 			return -EINVAL;
2171 
2172 		if (attr_mask & IB_QP_PATH_MTU) {
2173 			if (attr->path_mtu < IB_MTU_256 ||
2174 			    attr->path_mtu > IB_MTU_4096) {
2175 				pr_err("error: Only MTU sizes of 256, 512, 1024, 2048 and 4096 are supported by RoCE\n");
2176 				rc = -EINVAL;
2177 				goto err;
2178 			}
2179 			qp->mtu = min(ib_mtu_enum_to_int(attr->path_mtu),
2180 				      ib_mtu_enum_to_int(iboe_get_mtu
2181 							 (dev->ndev->mtu)));
2182 		}
2183 
2184 		if (!qp->mtu) {
2185 			qp->mtu =
2186 			ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
2187 			pr_err("Fixing zeroed MTU to qp->mtu = %d\n", qp->mtu);
2188 		}
2189 
2190 		SET_FIELD(qp_params.modify_flags,
2191 			  QED_ROCE_MODIFY_QP_VALID_ADDRESS_VECTOR, 1);
2192 
2193 		qp_params.traffic_class_tos = grh->traffic_class;
2194 		qp_params.flow_label = grh->flow_label;
2195 		qp_params.hop_limit_ttl = grh->hop_limit;
2196 
2197 		qp->sgid_idx = grh->sgid_index;
2198 
2199 		rc = get_gid_info_from_table(ibqp, attr, attr_mask, &qp_params);
2200 		if (rc) {
2201 			DP_ERR(dev,
2202 			       "modify qp: problems with GID index %d (rc=%d)\n",
2203 			       grh->sgid_index, rc);
2204 			return rc;
2205 		}
2206 
2207 		rc = qedr_get_dmac(dev, &attr->ah_attr,
2208 				   qp_params.remote_mac_addr);
2209 		if (rc)
2210 			return rc;
2211 
2212 		qp_params.use_local_mac = true;
2213 		ether_addr_copy(qp_params.local_mac_addr, dev->ndev->dev_addr);
2214 
2215 		DP_DEBUG(dev, QEDR_MSG_QP, "dgid=%x:%x:%x:%x\n",
2216 			 qp_params.dgid.dwords[0], qp_params.dgid.dwords[1],
2217 			 qp_params.dgid.dwords[2], qp_params.dgid.dwords[3]);
2218 		DP_DEBUG(dev, QEDR_MSG_QP, "sgid=%x:%x:%x:%x\n",
2219 			 qp_params.sgid.dwords[0], qp_params.sgid.dwords[1],
2220 			 qp_params.sgid.dwords[2], qp_params.sgid.dwords[3]);
2221 		DP_DEBUG(dev, QEDR_MSG_QP, "remote_mac=[%pM]\n",
2222 			 qp_params.remote_mac_addr);
2223 
2224 		qp_params.mtu = qp->mtu;
2225 		qp_params.lb_indication = false;
2226 	}
2227 
2228 	if (!qp_params.mtu) {
2229 		/* Stay with current MTU */
2230 		if (qp->mtu)
2231 			qp_params.mtu = qp->mtu;
2232 		else
2233 			qp_params.mtu =
2234 			    ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
2235 	}
2236 
2237 	if (attr_mask & IB_QP_TIMEOUT) {
2238 		SET_FIELD(qp_params.modify_flags,
2239 			  QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1);
2240 
2241 		/* The received timeout value is an exponent used like this:
2242 		 *    "12.7.34 LOCAL ACK TIMEOUT
2243 		 *    Value representing the transport (ACK) timeout for use by
2244 		 *    the remote, expressed as: 4.096 * 2^timeout [usec]"
2245 		 * The FW expects timeout in msec so we need to divide the usec
2246 		 * result by 1000. We'll approximate 1000~2^10, and 4.096 ~ 2^2,
2247 		 * so we get: 2^2 * 2^timeout / 2^10 = 2^(timeout - 8).
2248 		 * The value of zero means infinite so we use a 'max_t' to make
2249 		 * sure that sub 1 msec values will be configured as 1 msec.
2250 		 */
2251 		if (attr->timeout)
2252 			qp_params.ack_timeout =
2253 					1 << max_t(int, attr->timeout - 8, 0);
2254 		else
2255 			qp_params.ack_timeout = 0;
2256 	}
2257 
2258 	if (attr_mask & IB_QP_RETRY_CNT) {
2259 		SET_FIELD(qp_params.modify_flags,
2260 			  QED_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1);
2261 		qp_params.retry_cnt = attr->retry_cnt;
2262 	}
2263 
2264 	if (attr_mask & IB_QP_RNR_RETRY) {
2265 		SET_FIELD(qp_params.modify_flags,
2266 			  QED_ROCE_MODIFY_QP_VALID_RNR_RETRY_CNT, 1);
2267 		qp_params.rnr_retry_cnt = attr->rnr_retry;
2268 	}
2269 
2270 	if (attr_mask & IB_QP_RQ_PSN) {
2271 		SET_FIELD(qp_params.modify_flags,
2272 			  QED_ROCE_MODIFY_QP_VALID_RQ_PSN, 1);
2273 		qp_params.rq_psn = attr->rq_psn;
2274 		qp->rq_psn = attr->rq_psn;
2275 	}
2276 
2277 	if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC) {
2278 		if (attr->max_rd_atomic > dev->attr.max_qp_req_rd_atomic_resc) {
2279 			rc = -EINVAL;
2280 			DP_ERR(dev,
2281 			       "unsupported max_rd_atomic=%d, supported=%d\n",
2282 			       attr->max_rd_atomic,
2283 			       dev->attr.max_qp_req_rd_atomic_resc);
2284 			goto err;
2285 		}
2286 
2287 		SET_FIELD(qp_params.modify_flags,
2288 			  QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_REQ, 1);
2289 		qp_params.max_rd_atomic_req = attr->max_rd_atomic;
2290 	}
2291 
2292 	if (attr_mask & IB_QP_MIN_RNR_TIMER) {
2293 		SET_FIELD(qp_params.modify_flags,
2294 			  QED_ROCE_MODIFY_QP_VALID_MIN_RNR_NAK_TIMER, 1);
2295 		qp_params.min_rnr_nak_timer = attr->min_rnr_timer;
2296 	}
2297 
2298 	if (attr_mask & IB_QP_SQ_PSN) {
2299 		SET_FIELD(qp_params.modify_flags,
2300 			  QED_ROCE_MODIFY_QP_VALID_SQ_PSN, 1);
2301 		qp_params.sq_psn = attr->sq_psn;
2302 		qp->sq_psn = attr->sq_psn;
2303 	}
2304 
2305 	if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) {
2306 		if (attr->max_dest_rd_atomic >
2307 		    dev->attr.max_qp_resp_rd_atomic_resc) {
2308 			DP_ERR(dev,
2309 			       "unsupported max_dest_rd_atomic=%d, supported=%d\n",
2310 			       attr->max_dest_rd_atomic,
2311 			       dev->attr.max_qp_resp_rd_atomic_resc);
2312 
2313 			rc = -EINVAL;
2314 			goto err;
2315 		}
2316 
2317 		SET_FIELD(qp_params.modify_flags,
2318 			  QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_RESP, 1);
2319 		qp_params.max_rd_atomic_resp = attr->max_dest_rd_atomic;
2320 	}
2321 
2322 	if (attr_mask & IB_QP_DEST_QPN) {
2323 		SET_FIELD(qp_params.modify_flags,
2324 			  QED_ROCE_MODIFY_QP_VALID_DEST_QP, 1);
2325 
2326 		qp_params.dest_qp = attr->dest_qp_num;
2327 		qp->dest_qp_num = attr->dest_qp_num;
2328 	}
2329 
2330 	cur_state = qp->state;
2331 
2332 	/* Update the QP state before the actual ramrod to prevent a race with
2333 	 * fast path. Modifying the QP state to error will cause the device to
2334 	 * flush the CQEs and while polling the flushed CQEs will considered as
2335 	 * a potential issue if the QP isn't in error state.
2336 	 */
2337 	if ((attr_mask & IB_QP_STATE) && qp->qp_type != IB_QPT_GSI &&
2338 	    !udata && qp_params.new_state == QED_ROCE_QP_STATE_ERR)
2339 		qp->state = QED_ROCE_QP_STATE_ERR;
2340 
2341 	if (qp->qp_type != IB_QPT_GSI)
2342 		rc = dev->ops->rdma_modify_qp(dev->rdma_ctx,
2343 					      qp->qed_qp, &qp_params);
2344 
2345 	if (attr_mask & IB_QP_STATE) {
2346 		if ((qp->qp_type != IB_QPT_GSI) && (!udata))
2347 			rc = qedr_update_qp_state(dev, qp, cur_state,
2348 						  qp_params.new_state);
2349 		qp->state = qp_params.new_state;
2350 	}
2351 
2352 err:
2353 	return rc;
2354 }
2355 
qedr_to_ib_qp_acc_flags(struct qed_rdma_query_qp_out_params * params)2356 static int qedr_to_ib_qp_acc_flags(struct qed_rdma_query_qp_out_params *params)
2357 {
2358 	int ib_qp_acc_flags = 0;
2359 
2360 	if (params->incoming_rdma_write_en)
2361 		ib_qp_acc_flags |= IB_ACCESS_REMOTE_WRITE;
2362 	if (params->incoming_rdma_read_en)
2363 		ib_qp_acc_flags |= IB_ACCESS_REMOTE_READ;
2364 	if (params->incoming_atomic_en)
2365 		ib_qp_acc_flags |= IB_ACCESS_REMOTE_ATOMIC;
2366 	ib_qp_acc_flags |= IB_ACCESS_LOCAL_WRITE;
2367 	return ib_qp_acc_flags;
2368 }
2369 
qedr_query_qp(struct ib_qp * ibqp,struct ib_qp_attr * qp_attr,int attr_mask,struct ib_qp_init_attr * qp_init_attr)2370 int qedr_query_qp(struct ib_qp *ibqp,
2371 		  struct ib_qp_attr *qp_attr,
2372 		  int attr_mask, struct ib_qp_init_attr *qp_init_attr)
2373 {
2374 	struct qed_rdma_query_qp_out_params params;
2375 	struct qedr_qp *qp = get_qedr_qp(ibqp);
2376 	struct qedr_dev *dev = qp->dev;
2377 	int rc = 0;
2378 
2379 	memset(&params, 0, sizeof(params));
2380 
2381 	rc = dev->ops->rdma_query_qp(dev->rdma_ctx, qp->qed_qp, &params);
2382 	if (rc)
2383 		goto err;
2384 
2385 	memset(qp_attr, 0, sizeof(*qp_attr));
2386 	memset(qp_init_attr, 0, sizeof(*qp_init_attr));
2387 
2388 	qp_attr->qp_state = qedr_get_ibqp_state(params.state);
2389 	qp_attr->cur_qp_state = qedr_get_ibqp_state(params.state);
2390 	qp_attr->path_mtu = ib_mtu_int_to_enum(params.mtu);
2391 	qp_attr->path_mig_state = IB_MIG_MIGRATED;
2392 	qp_attr->rq_psn = params.rq_psn;
2393 	qp_attr->sq_psn = params.sq_psn;
2394 	qp_attr->dest_qp_num = params.dest_qp;
2395 
2396 	qp_attr->qp_access_flags = qedr_to_ib_qp_acc_flags(&params);
2397 
2398 	qp_attr->cap.max_send_wr = qp->sq.max_wr;
2399 	qp_attr->cap.max_recv_wr = qp->rq.max_wr;
2400 	qp_attr->cap.max_send_sge = qp->sq.max_sges;
2401 	qp_attr->cap.max_recv_sge = qp->rq.max_sges;
2402 	qp_attr->cap.max_inline_data = ROCE_REQ_MAX_INLINE_DATA_SIZE;
2403 	qp_init_attr->cap = qp_attr->cap;
2404 
2405 	qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE;
2406 	rdma_ah_set_grh(&qp_attr->ah_attr, NULL,
2407 			params.flow_label, qp->sgid_idx,
2408 			params.hop_limit_ttl, params.traffic_class_tos);
2409 	rdma_ah_set_dgid_raw(&qp_attr->ah_attr, &params.dgid.bytes[0]);
2410 	rdma_ah_set_port_num(&qp_attr->ah_attr, 1);
2411 	rdma_ah_set_sl(&qp_attr->ah_attr, 0);
2412 	qp_attr->timeout = params.timeout;
2413 	qp_attr->rnr_retry = params.rnr_retry;
2414 	qp_attr->retry_cnt = params.retry_cnt;
2415 	qp_attr->min_rnr_timer = params.min_rnr_nak_timer;
2416 	qp_attr->pkey_index = params.pkey_index;
2417 	qp_attr->port_num = 1;
2418 	rdma_ah_set_path_bits(&qp_attr->ah_attr, 0);
2419 	rdma_ah_set_static_rate(&qp_attr->ah_attr, 0);
2420 	qp_attr->alt_pkey_index = 0;
2421 	qp_attr->alt_port_num = 0;
2422 	qp_attr->alt_timeout = 0;
2423 	memset(&qp_attr->alt_ah_attr, 0, sizeof(qp_attr->alt_ah_attr));
2424 
2425 	qp_attr->sq_draining = (params.state == QED_ROCE_QP_STATE_SQD) ? 1 : 0;
2426 	qp_attr->max_dest_rd_atomic = params.max_dest_rd_atomic;
2427 	qp_attr->max_rd_atomic = params.max_rd_atomic;
2428 	qp_attr->en_sqd_async_notify = (params.sqd_async) ? 1 : 0;
2429 
2430 	DP_DEBUG(dev, QEDR_MSG_QP, "QEDR_QUERY_QP: max_inline_data=%d\n",
2431 		 qp_attr->cap.max_inline_data);
2432 
2433 err:
2434 	return rc;
2435 }
2436 
qedr_free_qp_resources(struct qedr_dev * dev,struct qedr_qp * qp,struct ib_udata * udata)2437 static int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp,
2438 				  struct ib_udata *udata)
2439 {
2440 	int rc = 0;
2441 
2442 	if (qp->qp_type != IB_QPT_GSI) {
2443 		rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
2444 		if (rc)
2445 			return rc;
2446 	}
2447 
2448 	if (udata)
2449 		qedr_cleanup_user(dev, qp);
2450 	else
2451 		qedr_cleanup_kernel(dev, qp);
2452 
2453 	return 0;
2454 }
2455 
qedr_destroy_qp(struct ib_qp * ibqp,struct ib_udata * udata)2456 int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
2457 {
2458 	struct qedr_qp *qp = get_qedr_qp(ibqp);
2459 	struct qedr_dev *dev = qp->dev;
2460 	struct ib_qp_attr attr;
2461 	int attr_mask = 0;
2462 
2463 	DP_DEBUG(dev, QEDR_MSG_QP, "destroy qp: destroying %p, qp type=%d\n",
2464 		 qp, qp->qp_type);
2465 
2466 	if (rdma_protocol_roce(&dev->ibdev, 1)) {
2467 		if ((qp->state != QED_ROCE_QP_STATE_RESET) &&
2468 		    (qp->state != QED_ROCE_QP_STATE_ERR) &&
2469 		    (qp->state != QED_ROCE_QP_STATE_INIT)) {
2470 
2471 			attr.qp_state = IB_QPS_ERR;
2472 			attr_mask |= IB_QP_STATE;
2473 
2474 			/* Change the QP state to ERROR */
2475 			qedr_modify_qp(ibqp, &attr, attr_mask, NULL);
2476 		}
2477 	} else {
2478 		/* Wait for the connect/accept to complete */
2479 		if (qp->ep) {
2480 			int wait_count = 1;
2481 
2482 			while (qp->ep->during_connect) {
2483 				DP_DEBUG(dev, QEDR_MSG_QP,
2484 					 "Still in during connect/accept\n");
2485 
2486 				msleep(100);
2487 				if (wait_count++ > 200) {
2488 					DP_NOTICE(dev,
2489 						  "during connect timeout\n");
2490 					break;
2491 				}
2492 			}
2493 		}
2494 	}
2495 
2496 	if (qp->qp_type == IB_QPT_GSI)
2497 		qedr_destroy_gsi_qp(dev);
2498 
2499 	qedr_free_qp_resources(dev, qp, udata);
2500 
2501 	if (atomic_dec_and_test(&qp->refcnt) &&
2502 	    rdma_protocol_iwarp(&dev->ibdev, 1)) {
2503 		xa_erase_irq(&dev->qps, qp->qp_id);
2504 		kfree(qp);
2505 	}
2506 	return 0;
2507 }
2508 
qedr_create_ah(struct ib_ah * ibah,struct rdma_ah_attr * attr,u32 flags,struct ib_udata * udata)2509 int qedr_create_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr, u32 flags,
2510 		   struct ib_udata *udata)
2511 {
2512 	struct qedr_ah *ah = get_qedr_ah(ibah);
2513 
2514 	rdma_copy_ah_attr(&ah->attr, attr);
2515 
2516 	return 0;
2517 }
2518 
qedr_destroy_ah(struct ib_ah * ibah,u32 flags)2519 void qedr_destroy_ah(struct ib_ah *ibah, u32 flags)
2520 {
2521 	struct qedr_ah *ah = get_qedr_ah(ibah);
2522 
2523 	rdma_destroy_ah_attr(&ah->attr);
2524 }
2525 
free_mr_info(struct qedr_dev * dev,struct mr_info * info)2526 static void free_mr_info(struct qedr_dev *dev, struct mr_info *info)
2527 {
2528 	struct qedr_pbl *pbl, *tmp;
2529 
2530 	if (info->pbl_table)
2531 		list_add_tail(&info->pbl_table->list_entry,
2532 			      &info->free_pbl_list);
2533 
2534 	if (!list_empty(&info->inuse_pbl_list))
2535 		list_splice(&info->inuse_pbl_list, &info->free_pbl_list);
2536 
2537 	list_for_each_entry_safe(pbl, tmp, &info->free_pbl_list, list_entry) {
2538 		list_del(&pbl->list_entry);
2539 		qedr_free_pbl(dev, &info->pbl_info, pbl);
2540 	}
2541 }
2542 
init_mr_info(struct qedr_dev * dev,struct mr_info * info,size_t page_list_len,bool two_layered)2543 static int init_mr_info(struct qedr_dev *dev, struct mr_info *info,
2544 			size_t page_list_len, bool two_layered)
2545 {
2546 	struct qedr_pbl *tmp;
2547 	int rc;
2548 
2549 	INIT_LIST_HEAD(&info->free_pbl_list);
2550 	INIT_LIST_HEAD(&info->inuse_pbl_list);
2551 
2552 	rc = qedr_prepare_pbl_tbl(dev, &info->pbl_info,
2553 				  page_list_len, two_layered);
2554 	if (rc)
2555 		goto done;
2556 
2557 	info->pbl_table = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
2558 	if (IS_ERR(info->pbl_table)) {
2559 		rc = PTR_ERR(info->pbl_table);
2560 		goto done;
2561 	}
2562 
2563 	DP_DEBUG(dev, QEDR_MSG_MR, "pbl_table_pa = %pa\n",
2564 		 &info->pbl_table->pa);
2565 
2566 	/* in usual case we use 2 PBLs, so we add one to free
2567 	 * list and allocating another one
2568 	 */
2569 	tmp = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
2570 	if (IS_ERR(tmp)) {
2571 		DP_DEBUG(dev, QEDR_MSG_MR, "Extra PBL is not allocated\n");
2572 		goto done;
2573 	}
2574 
2575 	list_add_tail(&tmp->list_entry, &info->free_pbl_list);
2576 
2577 	DP_DEBUG(dev, QEDR_MSG_MR, "extra pbl_table_pa = %pa\n", &tmp->pa);
2578 
2579 done:
2580 	if (rc)
2581 		free_mr_info(dev, info);
2582 
2583 	return rc;
2584 }
2585 
qedr_reg_user_mr(struct ib_pd * ibpd,u64 start,u64 len,u64 usr_addr,int acc,struct ib_udata * udata)2586 struct ib_mr *qedr_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
2587 			       u64 usr_addr, int acc, struct ib_udata *udata)
2588 {
2589 	struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2590 	struct qedr_mr *mr;
2591 	struct qedr_pd *pd;
2592 	int rc = -ENOMEM;
2593 
2594 	pd = get_qedr_pd(ibpd);
2595 	DP_DEBUG(dev, QEDR_MSG_MR,
2596 		 "qedr_register user mr pd = %d start = %lld, len = %lld, usr_addr = %lld, acc = %d\n",
2597 		 pd->pd_id, start, len, usr_addr, acc);
2598 
2599 	if (acc & IB_ACCESS_REMOTE_WRITE && !(acc & IB_ACCESS_LOCAL_WRITE))
2600 		return ERR_PTR(-EINVAL);
2601 
2602 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2603 	if (!mr)
2604 		return ERR_PTR(rc);
2605 
2606 	mr->type = QEDR_MR_USER;
2607 
2608 	mr->umem = ib_umem_get(udata, start, len, acc, 0);
2609 	if (IS_ERR(mr->umem)) {
2610 		rc = -EFAULT;
2611 		goto err0;
2612 	}
2613 
2614 	rc = init_mr_info(dev, &mr->info, ib_umem_page_count(mr->umem), 1);
2615 	if (rc)
2616 		goto err1;
2617 
2618 	qedr_populate_pbls(dev, mr->umem, mr->info.pbl_table,
2619 			   &mr->info.pbl_info, PAGE_SHIFT);
2620 
2621 	rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2622 	if (rc) {
2623 		DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2624 		goto err1;
2625 	}
2626 
2627 	/* Index only, 18 bit long, lkey = itid << 8 | key */
2628 	mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
2629 	mr->hw_mr.key = 0;
2630 	mr->hw_mr.pd = pd->pd_id;
2631 	mr->hw_mr.local_read = 1;
2632 	mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
2633 	mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
2634 	mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
2635 	mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
2636 	mr->hw_mr.mw_bind = false;
2637 	mr->hw_mr.pbl_ptr = mr->info.pbl_table[0].pa;
2638 	mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
2639 	mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
2640 	mr->hw_mr.page_size_log = PAGE_SHIFT;
2641 	mr->hw_mr.fbo = ib_umem_offset(mr->umem);
2642 	mr->hw_mr.length = len;
2643 	mr->hw_mr.vaddr = usr_addr;
2644 	mr->hw_mr.zbva = false;
2645 	mr->hw_mr.phy_mr = false;
2646 	mr->hw_mr.dma_mr = false;
2647 
2648 	rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2649 	if (rc) {
2650 		DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2651 		goto err2;
2652 	}
2653 
2654 	mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2655 	if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
2656 	    mr->hw_mr.remote_atomic)
2657 		mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2658 
2659 	DP_DEBUG(dev, QEDR_MSG_MR, "register user mr lkey: %x\n",
2660 		 mr->ibmr.lkey);
2661 	return &mr->ibmr;
2662 
2663 err2:
2664 	dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2665 err1:
2666 	qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
2667 err0:
2668 	kfree(mr);
2669 	return ERR_PTR(rc);
2670 }
2671 
qedr_dereg_mr(struct ib_mr * ib_mr,struct ib_udata * udata)2672 int qedr_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
2673 {
2674 	struct qedr_mr *mr = get_qedr_mr(ib_mr);
2675 	struct qedr_dev *dev = get_qedr_dev(ib_mr->device);
2676 	int rc = 0;
2677 
2678 	rc = dev->ops->rdma_deregister_tid(dev->rdma_ctx, mr->hw_mr.itid);
2679 	if (rc)
2680 		return rc;
2681 
2682 	dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2683 
2684 	if (mr->type != QEDR_MR_DMA)
2685 		free_mr_info(dev, &mr->info);
2686 
2687 	/* it could be user registered memory. */
2688 	ib_umem_release(mr->umem);
2689 
2690 	kfree(mr);
2691 
2692 	return rc;
2693 }
2694 
__qedr_alloc_mr(struct ib_pd * ibpd,int max_page_list_len)2695 static struct qedr_mr *__qedr_alloc_mr(struct ib_pd *ibpd,
2696 				       int max_page_list_len)
2697 {
2698 	struct qedr_pd *pd = get_qedr_pd(ibpd);
2699 	struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2700 	struct qedr_mr *mr;
2701 	int rc = -ENOMEM;
2702 
2703 	DP_DEBUG(dev, QEDR_MSG_MR,
2704 		 "qedr_alloc_frmr pd = %d max_page_list_len= %d\n", pd->pd_id,
2705 		 max_page_list_len);
2706 
2707 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2708 	if (!mr)
2709 		return ERR_PTR(rc);
2710 
2711 	mr->dev = dev;
2712 	mr->type = QEDR_MR_FRMR;
2713 
2714 	rc = init_mr_info(dev, &mr->info, max_page_list_len, 1);
2715 	if (rc)
2716 		goto err0;
2717 
2718 	rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2719 	if (rc) {
2720 		DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2721 		goto err0;
2722 	}
2723 
2724 	/* Index only, 18 bit long, lkey = itid << 8 | key */
2725 	mr->hw_mr.tid_type = QED_RDMA_TID_FMR;
2726 	mr->hw_mr.key = 0;
2727 	mr->hw_mr.pd = pd->pd_id;
2728 	mr->hw_mr.local_read = 1;
2729 	mr->hw_mr.local_write = 0;
2730 	mr->hw_mr.remote_read = 0;
2731 	mr->hw_mr.remote_write = 0;
2732 	mr->hw_mr.remote_atomic = 0;
2733 	mr->hw_mr.mw_bind = false;
2734 	mr->hw_mr.pbl_ptr = 0;
2735 	mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
2736 	mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
2737 	mr->hw_mr.fbo = 0;
2738 	mr->hw_mr.length = 0;
2739 	mr->hw_mr.vaddr = 0;
2740 	mr->hw_mr.zbva = false;
2741 	mr->hw_mr.phy_mr = true;
2742 	mr->hw_mr.dma_mr = false;
2743 
2744 	rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2745 	if (rc) {
2746 		DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2747 		goto err1;
2748 	}
2749 
2750 	mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2751 	mr->ibmr.rkey = mr->ibmr.lkey;
2752 
2753 	DP_DEBUG(dev, QEDR_MSG_MR, "alloc frmr: %x\n", mr->ibmr.lkey);
2754 	return mr;
2755 
2756 err1:
2757 	dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2758 err0:
2759 	kfree(mr);
2760 	return ERR_PTR(rc);
2761 }
2762 
qedr_alloc_mr(struct ib_pd * ibpd,enum ib_mr_type mr_type,u32 max_num_sg,struct ib_udata * udata)2763 struct ib_mr *qedr_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
2764 			    u32 max_num_sg, struct ib_udata *udata)
2765 {
2766 	struct qedr_mr *mr;
2767 
2768 	if (mr_type != IB_MR_TYPE_MEM_REG)
2769 		return ERR_PTR(-EINVAL);
2770 
2771 	mr = __qedr_alloc_mr(ibpd, max_num_sg);
2772 
2773 	if (IS_ERR(mr))
2774 		return ERR_PTR(-EINVAL);
2775 
2776 	return &mr->ibmr;
2777 }
2778 
qedr_set_page(struct ib_mr * ibmr,u64 addr)2779 static int qedr_set_page(struct ib_mr *ibmr, u64 addr)
2780 {
2781 	struct qedr_mr *mr = get_qedr_mr(ibmr);
2782 	struct qedr_pbl *pbl_table;
2783 	struct regpair *pbe;
2784 	u32 pbes_in_page;
2785 
2786 	if (unlikely(mr->npages == mr->info.pbl_info.num_pbes)) {
2787 		DP_ERR(mr->dev, "qedr_set_page fails when %d\n", mr->npages);
2788 		return -ENOMEM;
2789 	}
2790 
2791 	DP_DEBUG(mr->dev, QEDR_MSG_MR, "qedr_set_page pages[%d] = 0x%llx\n",
2792 		 mr->npages, addr);
2793 
2794 	pbes_in_page = mr->info.pbl_info.pbl_size / sizeof(u64);
2795 	pbl_table = mr->info.pbl_table + (mr->npages / pbes_in_page);
2796 	pbe = (struct regpair *)pbl_table->va;
2797 	pbe +=  mr->npages % pbes_in_page;
2798 	pbe->lo = cpu_to_le32((u32)addr);
2799 	pbe->hi = cpu_to_le32((u32)upper_32_bits(addr));
2800 
2801 	mr->npages++;
2802 
2803 	return 0;
2804 }
2805 
handle_completed_mrs(struct qedr_dev * dev,struct mr_info * info)2806 static void handle_completed_mrs(struct qedr_dev *dev, struct mr_info *info)
2807 {
2808 	int work = info->completed - info->completed_handled - 1;
2809 
2810 	DP_DEBUG(dev, QEDR_MSG_MR, "Special FMR work = %d\n", work);
2811 	while (work-- > 0 && !list_empty(&info->inuse_pbl_list)) {
2812 		struct qedr_pbl *pbl;
2813 
2814 		/* Free all the page list that are possible to be freed
2815 		 * (all the ones that were invalidated), under the assumption
2816 		 * that if an FMR was completed successfully that means that
2817 		 * if there was an invalidate operation before it also ended
2818 		 */
2819 		pbl = list_first_entry(&info->inuse_pbl_list,
2820 				       struct qedr_pbl, list_entry);
2821 		list_move_tail(&pbl->list_entry, &info->free_pbl_list);
2822 		info->completed_handled++;
2823 	}
2824 }
2825 
qedr_map_mr_sg(struct ib_mr * ibmr,struct scatterlist * sg,int sg_nents,unsigned int * sg_offset)2826 int qedr_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
2827 		   int sg_nents, unsigned int *sg_offset)
2828 {
2829 	struct qedr_mr *mr = get_qedr_mr(ibmr);
2830 
2831 	mr->npages = 0;
2832 
2833 	handle_completed_mrs(mr->dev, &mr->info);
2834 	return ib_sg_to_pages(ibmr, sg, sg_nents, NULL, qedr_set_page);
2835 }
2836 
qedr_get_dma_mr(struct ib_pd * ibpd,int acc)2837 struct ib_mr *qedr_get_dma_mr(struct ib_pd *ibpd, int acc)
2838 {
2839 	struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2840 	struct qedr_pd *pd = get_qedr_pd(ibpd);
2841 	struct qedr_mr *mr;
2842 	int rc;
2843 
2844 	mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2845 	if (!mr)
2846 		return ERR_PTR(-ENOMEM);
2847 
2848 	mr->type = QEDR_MR_DMA;
2849 
2850 	rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2851 	if (rc) {
2852 		DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2853 		goto err1;
2854 	}
2855 
2856 	/* index only, 18 bit long, lkey = itid << 8 | key */
2857 	mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
2858 	mr->hw_mr.pd = pd->pd_id;
2859 	mr->hw_mr.local_read = 1;
2860 	mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
2861 	mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
2862 	mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
2863 	mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
2864 	mr->hw_mr.dma_mr = true;
2865 
2866 	rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2867 	if (rc) {
2868 		DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2869 		goto err2;
2870 	}
2871 
2872 	mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2873 	if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
2874 	    mr->hw_mr.remote_atomic)
2875 		mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2876 
2877 	DP_DEBUG(dev, QEDR_MSG_MR, "get dma mr: lkey = %x\n", mr->ibmr.lkey);
2878 	return &mr->ibmr;
2879 
2880 err2:
2881 	dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2882 err1:
2883 	kfree(mr);
2884 	return ERR_PTR(rc);
2885 }
2886 
qedr_wq_is_full(struct qedr_qp_hwq_info * wq)2887 static inline int qedr_wq_is_full(struct qedr_qp_hwq_info *wq)
2888 {
2889 	return (((wq->prod + 1) % wq->max_wr) == wq->cons);
2890 }
2891 
sge_data_len(struct ib_sge * sg_list,int num_sge)2892 static int sge_data_len(struct ib_sge *sg_list, int num_sge)
2893 {
2894 	int i, len = 0;
2895 
2896 	for (i = 0; i < num_sge; i++)
2897 		len += sg_list[i].length;
2898 
2899 	return len;
2900 }
2901 
swap_wqe_data64(u64 * p)2902 static void swap_wqe_data64(u64 *p)
2903 {
2904 	int i;
2905 
2906 	for (i = 0; i < QEDR_SQE_ELEMENT_SIZE / sizeof(u64); i++, p++)
2907 		*p = cpu_to_be64(cpu_to_le64(*p));
2908 }
2909 
qedr_prepare_sq_inline_data(struct qedr_dev * dev,struct qedr_qp * qp,u8 * wqe_size,const struct ib_send_wr * wr,const struct ib_send_wr ** bad_wr,u8 * bits,u8 bit)2910 static u32 qedr_prepare_sq_inline_data(struct qedr_dev *dev,
2911 				       struct qedr_qp *qp, u8 *wqe_size,
2912 				       const struct ib_send_wr *wr,
2913 				       const struct ib_send_wr **bad_wr,
2914 				       u8 *bits, u8 bit)
2915 {
2916 	u32 data_size = sge_data_len(wr->sg_list, wr->num_sge);
2917 	char *seg_prt, *wqe;
2918 	int i, seg_siz;
2919 
2920 	if (data_size > ROCE_REQ_MAX_INLINE_DATA_SIZE) {
2921 		DP_ERR(dev, "Too much inline data in WR: %d\n", data_size);
2922 		*bad_wr = wr;
2923 		return 0;
2924 	}
2925 
2926 	if (!data_size)
2927 		return data_size;
2928 
2929 	*bits |= bit;
2930 
2931 	seg_prt = NULL;
2932 	wqe = NULL;
2933 	seg_siz = 0;
2934 
2935 	/* Copy data inline */
2936 	for (i = 0; i < wr->num_sge; i++) {
2937 		u32 len = wr->sg_list[i].length;
2938 		void *src = (void *)(uintptr_t)wr->sg_list[i].addr;
2939 
2940 		while (len > 0) {
2941 			u32 cur;
2942 
2943 			/* New segment required */
2944 			if (!seg_siz) {
2945 				wqe = (char *)qed_chain_produce(&qp->sq.pbl);
2946 				seg_prt = wqe;
2947 				seg_siz = sizeof(struct rdma_sq_common_wqe);
2948 				(*wqe_size)++;
2949 			}
2950 
2951 			/* Calculate currently allowed length */
2952 			cur = min_t(u32, len, seg_siz);
2953 			memcpy(seg_prt, src, cur);
2954 
2955 			/* Update segment variables */
2956 			seg_prt += cur;
2957 			seg_siz -= cur;
2958 
2959 			/* Update sge variables */
2960 			src += cur;
2961 			len -= cur;
2962 
2963 			/* Swap fully-completed segments */
2964 			if (!seg_siz)
2965 				swap_wqe_data64((u64 *)wqe);
2966 		}
2967 	}
2968 
2969 	/* swap last not completed segment */
2970 	if (seg_siz)
2971 		swap_wqe_data64((u64 *)wqe);
2972 
2973 	return data_size;
2974 }
2975 
2976 #define RQ_SGE_SET(sge, vaddr, vlength, vflags)			\
2977 	do {							\
2978 		DMA_REGPAIR_LE(sge->addr, vaddr);		\
2979 		(sge)->length = cpu_to_le32(vlength);		\
2980 		(sge)->flags = cpu_to_le32(vflags);		\
2981 	} while (0)
2982 
2983 #define SRQ_HDR_SET(hdr, vwr_id, num_sge)			\
2984 	do {							\
2985 		DMA_REGPAIR_LE(hdr->wr_id, vwr_id);		\
2986 		(hdr)->num_sges = num_sge;			\
2987 	} while (0)
2988 
2989 #define SRQ_SGE_SET(sge, vaddr, vlength, vlkey)			\
2990 	do {							\
2991 		DMA_REGPAIR_LE(sge->addr, vaddr);		\
2992 		(sge)->length = cpu_to_le32(vlength);		\
2993 		(sge)->l_key = cpu_to_le32(vlkey);		\
2994 	} while (0)
2995 
qedr_prepare_sq_sges(struct qedr_qp * qp,u8 * wqe_size,const struct ib_send_wr * wr)2996 static u32 qedr_prepare_sq_sges(struct qedr_qp *qp, u8 *wqe_size,
2997 				const struct ib_send_wr *wr)
2998 {
2999 	u32 data_size = 0;
3000 	int i;
3001 
3002 	for (i = 0; i < wr->num_sge; i++) {
3003 		struct rdma_sq_sge *sge = qed_chain_produce(&qp->sq.pbl);
3004 
3005 		DMA_REGPAIR_LE(sge->addr, wr->sg_list[i].addr);
3006 		sge->l_key = cpu_to_le32(wr->sg_list[i].lkey);
3007 		sge->length = cpu_to_le32(wr->sg_list[i].length);
3008 		data_size += wr->sg_list[i].length;
3009 	}
3010 
3011 	if (wqe_size)
3012 		*wqe_size += wr->num_sge;
3013 
3014 	return data_size;
3015 }
3016 
qedr_prepare_sq_rdma_data(struct qedr_dev * dev,struct qedr_qp * qp,struct rdma_sq_rdma_wqe_1st * rwqe,struct rdma_sq_rdma_wqe_2nd * rwqe2,const struct ib_send_wr * wr,const struct ib_send_wr ** bad_wr)3017 static u32 qedr_prepare_sq_rdma_data(struct qedr_dev *dev,
3018 				     struct qedr_qp *qp,
3019 				     struct rdma_sq_rdma_wqe_1st *rwqe,
3020 				     struct rdma_sq_rdma_wqe_2nd *rwqe2,
3021 				     const struct ib_send_wr *wr,
3022 				     const struct ib_send_wr **bad_wr)
3023 {
3024 	rwqe2->r_key = cpu_to_le32(rdma_wr(wr)->rkey);
3025 	DMA_REGPAIR_LE(rwqe2->remote_va, rdma_wr(wr)->remote_addr);
3026 
3027 	if (wr->send_flags & IB_SEND_INLINE &&
3028 	    (wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM ||
3029 	     wr->opcode == IB_WR_RDMA_WRITE)) {
3030 		u8 flags = 0;
3031 
3032 		SET_FIELD2(flags, RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG, 1);
3033 		return qedr_prepare_sq_inline_data(dev, qp, &rwqe->wqe_size, wr,
3034 						   bad_wr, &rwqe->flags, flags);
3035 	}
3036 
3037 	return qedr_prepare_sq_sges(qp, &rwqe->wqe_size, wr);
3038 }
3039 
qedr_prepare_sq_send_data(struct qedr_dev * dev,struct qedr_qp * qp,struct rdma_sq_send_wqe_1st * swqe,struct rdma_sq_send_wqe_2st * swqe2,const struct ib_send_wr * wr,const struct ib_send_wr ** bad_wr)3040 static u32 qedr_prepare_sq_send_data(struct qedr_dev *dev,
3041 				     struct qedr_qp *qp,
3042 				     struct rdma_sq_send_wqe_1st *swqe,
3043 				     struct rdma_sq_send_wqe_2st *swqe2,
3044 				     const struct ib_send_wr *wr,
3045 				     const struct ib_send_wr **bad_wr)
3046 {
3047 	memset(swqe2, 0, sizeof(*swqe2));
3048 	if (wr->send_flags & IB_SEND_INLINE) {
3049 		u8 flags = 0;
3050 
3051 		SET_FIELD2(flags, RDMA_SQ_SEND_WQE_INLINE_FLG, 1);
3052 		return qedr_prepare_sq_inline_data(dev, qp, &swqe->wqe_size, wr,
3053 						   bad_wr, &swqe->flags, flags);
3054 	}
3055 
3056 	return qedr_prepare_sq_sges(qp, &swqe->wqe_size, wr);
3057 }
3058 
qedr_prepare_reg(struct qedr_qp * qp,struct rdma_sq_fmr_wqe_1st * fwqe1,const struct ib_reg_wr * wr)3059 static int qedr_prepare_reg(struct qedr_qp *qp,
3060 			    struct rdma_sq_fmr_wqe_1st *fwqe1,
3061 			    const struct ib_reg_wr *wr)
3062 {
3063 	struct qedr_mr *mr = get_qedr_mr(wr->mr);
3064 	struct rdma_sq_fmr_wqe_2nd *fwqe2;
3065 
3066 	fwqe2 = (struct rdma_sq_fmr_wqe_2nd *)qed_chain_produce(&qp->sq.pbl);
3067 	fwqe1->addr.hi = upper_32_bits(mr->ibmr.iova);
3068 	fwqe1->addr.lo = lower_32_bits(mr->ibmr.iova);
3069 	fwqe1->l_key = wr->key;
3070 
3071 	fwqe2->access_ctrl = 0;
3072 
3073 	SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_READ,
3074 		   !!(wr->access & IB_ACCESS_REMOTE_READ));
3075 	SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE,
3076 		   !!(wr->access & IB_ACCESS_REMOTE_WRITE));
3077 	SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC,
3078 		   !!(wr->access & IB_ACCESS_REMOTE_ATOMIC));
3079 	SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_READ, 1);
3080 	SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE,
3081 		   !!(wr->access & IB_ACCESS_LOCAL_WRITE));
3082 	fwqe2->fmr_ctrl = 0;
3083 
3084 	SET_FIELD2(fwqe2->fmr_ctrl, RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG,
3085 		   ilog2(mr->ibmr.page_size) - 12);
3086 
3087 	fwqe2->length_hi = 0;
3088 	fwqe2->length_lo = mr->ibmr.length;
3089 	fwqe2->pbl_addr.hi = upper_32_bits(mr->info.pbl_table->pa);
3090 	fwqe2->pbl_addr.lo = lower_32_bits(mr->info.pbl_table->pa);
3091 
3092 	qp->wqe_wr_id[qp->sq.prod].mr = mr;
3093 
3094 	return 0;
3095 }
3096 
qedr_ib_to_wc_opcode(enum ib_wr_opcode opcode)3097 static enum ib_wc_opcode qedr_ib_to_wc_opcode(enum ib_wr_opcode opcode)
3098 {
3099 	switch (opcode) {
3100 	case IB_WR_RDMA_WRITE:
3101 	case IB_WR_RDMA_WRITE_WITH_IMM:
3102 		return IB_WC_RDMA_WRITE;
3103 	case IB_WR_SEND_WITH_IMM:
3104 	case IB_WR_SEND:
3105 	case IB_WR_SEND_WITH_INV:
3106 		return IB_WC_SEND;
3107 	case IB_WR_RDMA_READ:
3108 	case IB_WR_RDMA_READ_WITH_INV:
3109 		return IB_WC_RDMA_READ;
3110 	case IB_WR_ATOMIC_CMP_AND_SWP:
3111 		return IB_WC_COMP_SWAP;
3112 	case IB_WR_ATOMIC_FETCH_AND_ADD:
3113 		return IB_WC_FETCH_ADD;
3114 	case IB_WR_REG_MR:
3115 		return IB_WC_REG_MR;
3116 	case IB_WR_LOCAL_INV:
3117 		return IB_WC_LOCAL_INV;
3118 	default:
3119 		return IB_WC_SEND;
3120 	}
3121 }
3122 
qedr_can_post_send(struct qedr_qp * qp,const struct ib_send_wr * wr)3123 static inline bool qedr_can_post_send(struct qedr_qp *qp,
3124 				      const struct ib_send_wr *wr)
3125 {
3126 	int wq_is_full, err_wr, pbl_is_full;
3127 	struct qedr_dev *dev = qp->dev;
3128 
3129 	/* prevent SQ overflow and/or processing of a bad WR */
3130 	err_wr = wr->num_sge > qp->sq.max_sges;
3131 	wq_is_full = qedr_wq_is_full(&qp->sq);
3132 	pbl_is_full = qed_chain_get_elem_left_u32(&qp->sq.pbl) <
3133 		      QEDR_MAX_SQE_ELEMENTS_PER_SQE;
3134 	if (wq_is_full || err_wr || pbl_is_full) {
3135 		if (wq_is_full && !(qp->err_bitmap & QEDR_QP_ERR_SQ_FULL)) {
3136 			DP_ERR(dev,
3137 			       "error: WQ is full. Post send on QP %p failed (this error appears only once)\n",
3138 			       qp);
3139 			qp->err_bitmap |= QEDR_QP_ERR_SQ_FULL;
3140 		}
3141 
3142 		if (err_wr && !(qp->err_bitmap & QEDR_QP_ERR_BAD_SR)) {
3143 			DP_ERR(dev,
3144 			       "error: WR is bad. Post send on QP %p failed (this error appears only once)\n",
3145 			       qp);
3146 			qp->err_bitmap |= QEDR_QP_ERR_BAD_SR;
3147 		}
3148 
3149 		if (pbl_is_full &&
3150 		    !(qp->err_bitmap & QEDR_QP_ERR_SQ_PBL_FULL)) {
3151 			DP_ERR(dev,
3152 			       "error: WQ PBL is full. Post send on QP %p failed (this error appears only once)\n",
3153 			       qp);
3154 			qp->err_bitmap |= QEDR_QP_ERR_SQ_PBL_FULL;
3155 		}
3156 		return false;
3157 	}
3158 	return true;
3159 }
3160 
__qedr_post_send(struct ib_qp * ibqp,const struct ib_send_wr * wr,const struct ib_send_wr ** bad_wr)3161 static int __qedr_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
3162 			    const struct ib_send_wr **bad_wr)
3163 {
3164 	struct qedr_dev *dev = get_qedr_dev(ibqp->device);
3165 	struct qedr_qp *qp = get_qedr_qp(ibqp);
3166 	struct rdma_sq_atomic_wqe_1st *awqe1;
3167 	struct rdma_sq_atomic_wqe_2nd *awqe2;
3168 	struct rdma_sq_atomic_wqe_3rd *awqe3;
3169 	struct rdma_sq_send_wqe_2st *swqe2;
3170 	struct rdma_sq_local_inv_wqe *iwqe;
3171 	struct rdma_sq_rdma_wqe_2nd *rwqe2;
3172 	struct rdma_sq_send_wqe_1st *swqe;
3173 	struct rdma_sq_rdma_wqe_1st *rwqe;
3174 	struct rdma_sq_fmr_wqe_1st *fwqe1;
3175 	struct rdma_sq_common_wqe *wqe;
3176 	u32 length;
3177 	int rc = 0;
3178 	bool comp;
3179 
3180 	if (!qedr_can_post_send(qp, wr)) {
3181 		*bad_wr = wr;
3182 		return -ENOMEM;
3183 	}
3184 
3185 	wqe = qed_chain_produce(&qp->sq.pbl);
3186 	qp->wqe_wr_id[qp->sq.prod].signaled =
3187 		!!(wr->send_flags & IB_SEND_SIGNALED) || qp->signaled;
3188 
3189 	wqe->flags = 0;
3190 	SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_SE_FLG,
3191 		   !!(wr->send_flags & IB_SEND_SOLICITED));
3192 	comp = (!!(wr->send_flags & IB_SEND_SIGNALED)) || qp->signaled;
3193 	SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_COMP_FLG, comp);
3194 	SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_RD_FENCE_FLG,
3195 		   !!(wr->send_flags & IB_SEND_FENCE));
3196 	wqe->prev_wqe_size = qp->prev_wqe_size;
3197 
3198 	qp->wqe_wr_id[qp->sq.prod].opcode = qedr_ib_to_wc_opcode(wr->opcode);
3199 
3200 	switch (wr->opcode) {
3201 	case IB_WR_SEND_WITH_IMM:
3202 		if (unlikely(rdma_protocol_iwarp(&dev->ibdev, 1))) {
3203 			rc = -EINVAL;
3204 			*bad_wr = wr;
3205 			break;
3206 		}
3207 		wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_IMM;
3208 		swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3209 		swqe->wqe_size = 2;
3210 		swqe2 = qed_chain_produce(&qp->sq.pbl);
3211 
3212 		swqe->inv_key_or_imm_data = cpu_to_le32(be32_to_cpu(wr->ex.imm_data));
3213 		length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3214 						   wr, bad_wr);
3215 		swqe->length = cpu_to_le32(length);
3216 		qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3217 		qp->prev_wqe_size = swqe->wqe_size;
3218 		qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3219 		break;
3220 	case IB_WR_SEND:
3221 		wqe->req_type = RDMA_SQ_REQ_TYPE_SEND;
3222 		swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3223 
3224 		swqe->wqe_size = 2;
3225 		swqe2 = qed_chain_produce(&qp->sq.pbl);
3226 		length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3227 						   wr, bad_wr);
3228 		swqe->length = cpu_to_le32(length);
3229 		qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3230 		qp->prev_wqe_size = swqe->wqe_size;
3231 		qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3232 		break;
3233 	case IB_WR_SEND_WITH_INV:
3234 		wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_INVALIDATE;
3235 		swqe = (struct rdma_sq_send_wqe_1st *)wqe;
3236 		swqe2 = qed_chain_produce(&qp->sq.pbl);
3237 		swqe->wqe_size = 2;
3238 		swqe->inv_key_or_imm_data = cpu_to_le32(wr->ex.invalidate_rkey);
3239 		length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
3240 						   wr, bad_wr);
3241 		swqe->length = cpu_to_le32(length);
3242 		qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
3243 		qp->prev_wqe_size = swqe->wqe_size;
3244 		qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
3245 		break;
3246 
3247 	case IB_WR_RDMA_WRITE_WITH_IMM:
3248 		if (unlikely(rdma_protocol_iwarp(&dev->ibdev, 1))) {
3249 			rc = -EINVAL;
3250 			*bad_wr = wr;
3251 			break;
3252 		}
3253 		wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR_WITH_IMM;
3254 		rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3255 
3256 		rwqe->wqe_size = 2;
3257 		rwqe->imm_data = htonl(cpu_to_le32(wr->ex.imm_data));
3258 		rwqe2 = qed_chain_produce(&qp->sq.pbl);
3259 		length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3260 						   wr, bad_wr);
3261 		rwqe->length = cpu_to_le32(length);
3262 		qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3263 		qp->prev_wqe_size = rwqe->wqe_size;
3264 		qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3265 		break;
3266 	case IB_WR_RDMA_WRITE:
3267 		wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR;
3268 		rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3269 
3270 		rwqe->wqe_size = 2;
3271 		rwqe2 = qed_chain_produce(&qp->sq.pbl);
3272 		length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3273 						   wr, bad_wr);
3274 		rwqe->length = cpu_to_le32(length);
3275 		qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3276 		qp->prev_wqe_size = rwqe->wqe_size;
3277 		qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3278 		break;
3279 	case IB_WR_RDMA_READ_WITH_INV:
3280 		SET_FIELD2(wqe->flags, RDMA_SQ_RDMA_WQE_1ST_READ_INV_FLG, 1);
3281 		/* fallthrough -- same is identical to RDMA READ */
3282 
3283 	case IB_WR_RDMA_READ:
3284 		wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_RD;
3285 		rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
3286 
3287 		rwqe->wqe_size = 2;
3288 		rwqe2 = qed_chain_produce(&qp->sq.pbl);
3289 		length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
3290 						   wr, bad_wr);
3291 		rwqe->length = cpu_to_le32(length);
3292 		qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
3293 		qp->prev_wqe_size = rwqe->wqe_size;
3294 		qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
3295 		break;
3296 
3297 	case IB_WR_ATOMIC_CMP_AND_SWP:
3298 	case IB_WR_ATOMIC_FETCH_AND_ADD:
3299 		awqe1 = (struct rdma_sq_atomic_wqe_1st *)wqe;
3300 		awqe1->wqe_size = 4;
3301 
3302 		awqe2 = qed_chain_produce(&qp->sq.pbl);
3303 		DMA_REGPAIR_LE(awqe2->remote_va, atomic_wr(wr)->remote_addr);
3304 		awqe2->r_key = cpu_to_le32(atomic_wr(wr)->rkey);
3305 
3306 		awqe3 = qed_chain_produce(&qp->sq.pbl);
3307 
3308 		if (wr->opcode == IB_WR_ATOMIC_FETCH_AND_ADD) {
3309 			wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_ADD;
3310 			DMA_REGPAIR_LE(awqe3->swap_data,
3311 				       atomic_wr(wr)->compare_add);
3312 		} else {
3313 			wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP;
3314 			DMA_REGPAIR_LE(awqe3->swap_data,
3315 				       atomic_wr(wr)->swap);
3316 			DMA_REGPAIR_LE(awqe3->cmp_data,
3317 				       atomic_wr(wr)->compare_add);
3318 		}
3319 
3320 		qedr_prepare_sq_sges(qp, NULL, wr);
3321 
3322 		qp->wqe_wr_id[qp->sq.prod].wqe_size = awqe1->wqe_size;
3323 		qp->prev_wqe_size = awqe1->wqe_size;
3324 		break;
3325 
3326 	case IB_WR_LOCAL_INV:
3327 		iwqe = (struct rdma_sq_local_inv_wqe *)wqe;
3328 		iwqe->wqe_size = 1;
3329 
3330 		iwqe->req_type = RDMA_SQ_REQ_TYPE_LOCAL_INVALIDATE;
3331 		iwqe->inv_l_key = wr->ex.invalidate_rkey;
3332 		qp->wqe_wr_id[qp->sq.prod].wqe_size = iwqe->wqe_size;
3333 		qp->prev_wqe_size = iwqe->wqe_size;
3334 		break;
3335 	case IB_WR_REG_MR:
3336 		DP_DEBUG(dev, QEDR_MSG_CQ, "REG_MR\n");
3337 		wqe->req_type = RDMA_SQ_REQ_TYPE_FAST_MR;
3338 		fwqe1 = (struct rdma_sq_fmr_wqe_1st *)wqe;
3339 		fwqe1->wqe_size = 2;
3340 
3341 		rc = qedr_prepare_reg(qp, fwqe1, reg_wr(wr));
3342 		if (rc) {
3343 			DP_ERR(dev, "IB_REG_MR failed rc=%d\n", rc);
3344 			*bad_wr = wr;
3345 			break;
3346 		}
3347 
3348 		qp->wqe_wr_id[qp->sq.prod].wqe_size = fwqe1->wqe_size;
3349 		qp->prev_wqe_size = fwqe1->wqe_size;
3350 		break;
3351 	default:
3352 		DP_ERR(dev, "invalid opcode 0x%x!\n", wr->opcode);
3353 		rc = -EINVAL;
3354 		*bad_wr = wr;
3355 		break;
3356 	}
3357 
3358 	if (*bad_wr) {
3359 		u16 value;
3360 
3361 		/* Restore prod to its position before
3362 		 * this WR was processed
3363 		 */
3364 		value = le16_to_cpu(qp->sq.db_data.data.value);
3365 		qed_chain_set_prod(&qp->sq.pbl, value, wqe);
3366 
3367 		/* Restore prev_wqe_size */
3368 		qp->prev_wqe_size = wqe->prev_wqe_size;
3369 		rc = -EINVAL;
3370 		DP_ERR(dev, "POST SEND FAILED\n");
3371 	}
3372 
3373 	return rc;
3374 }
3375 
qedr_post_send(struct ib_qp * ibqp,const struct ib_send_wr * wr,const struct ib_send_wr ** bad_wr)3376 int qedr_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr,
3377 		   const struct ib_send_wr **bad_wr)
3378 {
3379 	struct qedr_dev *dev = get_qedr_dev(ibqp->device);
3380 	struct qedr_qp *qp = get_qedr_qp(ibqp);
3381 	unsigned long flags;
3382 	int rc = 0;
3383 
3384 	*bad_wr = NULL;
3385 
3386 	if (qp->qp_type == IB_QPT_GSI)
3387 		return qedr_gsi_post_send(ibqp, wr, bad_wr);
3388 
3389 	spin_lock_irqsave(&qp->q_lock, flags);
3390 
3391 	if (rdma_protocol_roce(&dev->ibdev, 1)) {
3392 		if ((qp->state != QED_ROCE_QP_STATE_RTS) &&
3393 		    (qp->state != QED_ROCE_QP_STATE_ERR) &&
3394 		    (qp->state != QED_ROCE_QP_STATE_SQD)) {
3395 			spin_unlock_irqrestore(&qp->q_lock, flags);
3396 			*bad_wr = wr;
3397 			DP_DEBUG(dev, QEDR_MSG_CQ,
3398 				 "QP in wrong state! QP icid=0x%x state %d\n",
3399 				 qp->icid, qp->state);
3400 			return -EINVAL;
3401 		}
3402 	}
3403 
3404 	while (wr) {
3405 		rc = __qedr_post_send(ibqp, wr, bad_wr);
3406 		if (rc)
3407 			break;
3408 
3409 		qp->wqe_wr_id[qp->sq.prod].wr_id = wr->wr_id;
3410 
3411 		qedr_inc_sw_prod(&qp->sq);
3412 
3413 		qp->sq.db_data.data.value++;
3414 
3415 		wr = wr->next;
3416 	}
3417 
3418 	/* Trigger doorbell
3419 	 * If there was a failure in the first WR then it will be triggered in
3420 	 * vane. However this is not harmful (as long as the producer value is
3421 	 * unchanged). For performance reasons we avoid checking for this
3422 	 * redundant doorbell.
3423 	 *
3424 	 * qp->wqe_wr_id is accessed during qedr_poll_cq, as
3425 	 * soon as we give the doorbell, we could get a completion
3426 	 * for this wr, therefore we need to make sure that the
3427 	 * memory is updated before giving the doorbell.
3428 	 * During qedr_poll_cq, rmb is called before accessing the
3429 	 * cqe. This covers for the smp_rmb as well.
3430 	 */
3431 	smp_wmb();
3432 	writel(qp->sq.db_data.raw, qp->sq.db);
3433 
3434 	spin_unlock_irqrestore(&qp->q_lock, flags);
3435 
3436 	return rc;
3437 }
3438 
qedr_srq_elem_left(struct qedr_srq_hwq_info * hw_srq)3439 static u32 qedr_srq_elem_left(struct qedr_srq_hwq_info *hw_srq)
3440 {
3441 	u32 used;
3442 
3443 	/* Calculate number of elements used based on producer
3444 	 * count and consumer count and subtract it from max
3445 	 * work request supported so that we get elements left.
3446 	 */
3447 	used = hw_srq->wr_prod_cnt - hw_srq->wr_cons_cnt;
3448 
3449 	return hw_srq->max_wr - used;
3450 }
3451 
qedr_post_srq_recv(struct ib_srq * ibsrq,const struct ib_recv_wr * wr,const struct ib_recv_wr ** bad_wr)3452 int qedr_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
3453 		       const struct ib_recv_wr **bad_wr)
3454 {
3455 	struct qedr_srq *srq = get_qedr_srq(ibsrq);
3456 	struct qedr_srq_hwq_info *hw_srq;
3457 	struct qedr_dev *dev = srq->dev;
3458 	struct qed_chain *pbl;
3459 	unsigned long flags;
3460 	int status = 0;
3461 	u32 num_sge;
3462 	u32 offset;
3463 
3464 	spin_lock_irqsave(&srq->lock, flags);
3465 
3466 	hw_srq = &srq->hw_srq;
3467 	pbl = &srq->hw_srq.pbl;
3468 	while (wr) {
3469 		struct rdma_srq_wqe_header *hdr;
3470 		int i;
3471 
3472 		if (!qedr_srq_elem_left(hw_srq) ||
3473 		    wr->num_sge > srq->hw_srq.max_sges) {
3474 			DP_ERR(dev, "Can't post WR  (%d,%d) || (%d > %d)\n",
3475 			       hw_srq->wr_prod_cnt, hw_srq->wr_cons_cnt,
3476 			       wr->num_sge, srq->hw_srq.max_sges);
3477 			status = -ENOMEM;
3478 			*bad_wr = wr;
3479 			break;
3480 		}
3481 
3482 		hdr = qed_chain_produce(pbl);
3483 		num_sge = wr->num_sge;
3484 		/* Set number of sge and work request id in header */
3485 		SRQ_HDR_SET(hdr, wr->wr_id, num_sge);
3486 
3487 		srq->hw_srq.wr_prod_cnt++;
3488 		hw_srq->wqe_prod++;
3489 		hw_srq->sge_prod++;
3490 
3491 		DP_DEBUG(dev, QEDR_MSG_SRQ,
3492 			 "SRQ WR: SGEs: %d with wr_id[%d] = %llx\n",
3493 			 wr->num_sge, hw_srq->wqe_prod, wr->wr_id);
3494 
3495 		for (i = 0; i < wr->num_sge; i++) {
3496 			struct rdma_srq_sge *srq_sge = qed_chain_produce(pbl);
3497 
3498 			/* Set SGE length, lkey and address */
3499 			SRQ_SGE_SET(srq_sge, wr->sg_list[i].addr,
3500 				    wr->sg_list[i].length, wr->sg_list[i].lkey);
3501 
3502 			DP_DEBUG(dev, QEDR_MSG_SRQ,
3503 				 "[%d]: len %d key %x addr %x:%x\n",
3504 				 i, srq_sge->length, srq_sge->l_key,
3505 				 srq_sge->addr.hi, srq_sge->addr.lo);
3506 			hw_srq->sge_prod++;
3507 		}
3508 
3509 		/* Flush WQE and SGE information before
3510 		 * updating producer.
3511 		 */
3512 		wmb();
3513 
3514 		/* SRQ producer is 8 bytes. Need to update SGE producer index
3515 		 * in first 4 bytes and need to update WQE producer in
3516 		 * next 4 bytes.
3517 		 */
3518 		*srq->hw_srq.virt_prod_pair_addr = hw_srq->sge_prod;
3519 		offset = offsetof(struct rdma_srq_producers, wqe_prod);
3520 		*((u8 *)srq->hw_srq.virt_prod_pair_addr + offset) =
3521 			hw_srq->wqe_prod;
3522 
3523 		/* Flush producer after updating it. */
3524 		wmb();
3525 		wr = wr->next;
3526 	}
3527 
3528 	DP_DEBUG(dev, QEDR_MSG_SRQ, "POST: Elements in S-RQ: %d\n",
3529 		 qed_chain_get_elem_left(pbl));
3530 	spin_unlock_irqrestore(&srq->lock, flags);
3531 
3532 	return status;
3533 }
3534 
qedr_post_recv(struct ib_qp * ibqp,const struct ib_recv_wr * wr,const struct ib_recv_wr ** bad_wr)3535 int qedr_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr,
3536 		   const struct ib_recv_wr **bad_wr)
3537 {
3538 	struct qedr_qp *qp = get_qedr_qp(ibqp);
3539 	struct qedr_dev *dev = qp->dev;
3540 	unsigned long flags;
3541 	int status = 0;
3542 
3543 	if (qp->qp_type == IB_QPT_GSI)
3544 		return qedr_gsi_post_recv(ibqp, wr, bad_wr);
3545 
3546 	spin_lock_irqsave(&qp->q_lock, flags);
3547 
3548 	if (qp->state == QED_ROCE_QP_STATE_RESET) {
3549 		spin_unlock_irqrestore(&qp->q_lock, flags);
3550 		*bad_wr = wr;
3551 		return -EINVAL;
3552 	}
3553 
3554 	while (wr) {
3555 		int i;
3556 
3557 		if (qed_chain_get_elem_left_u32(&qp->rq.pbl) <
3558 		    QEDR_MAX_RQE_ELEMENTS_PER_RQE ||
3559 		    wr->num_sge > qp->rq.max_sges) {
3560 			DP_ERR(dev, "Can't post WR  (%d < %d) || (%d > %d)\n",
3561 			       qed_chain_get_elem_left_u32(&qp->rq.pbl),
3562 			       QEDR_MAX_RQE_ELEMENTS_PER_RQE, wr->num_sge,
3563 			       qp->rq.max_sges);
3564 			status = -ENOMEM;
3565 			*bad_wr = wr;
3566 			break;
3567 		}
3568 		for (i = 0; i < wr->num_sge; i++) {
3569 			u32 flags = 0;
3570 			struct rdma_rq_sge *rqe =
3571 			    qed_chain_produce(&qp->rq.pbl);
3572 
3573 			/* First one must include the number
3574 			 * of SGE in the list
3575 			 */
3576 			if (!i)
3577 				SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES,
3578 					  wr->num_sge);
3579 
3580 			SET_FIELD(flags, RDMA_RQ_SGE_L_KEY_LO,
3581 				  wr->sg_list[i].lkey);
3582 
3583 			RQ_SGE_SET(rqe, wr->sg_list[i].addr,
3584 				   wr->sg_list[i].length, flags);
3585 		}
3586 
3587 		/* Special case of no sges. FW requires between 1-4 sges...
3588 		 * in this case we need to post 1 sge with length zero. this is
3589 		 * because rdma write with immediate consumes an RQ.
3590 		 */
3591 		if (!wr->num_sge) {
3592 			u32 flags = 0;
3593 			struct rdma_rq_sge *rqe =
3594 			    qed_chain_produce(&qp->rq.pbl);
3595 
3596 			/* First one must include the number
3597 			 * of SGE in the list
3598 			 */
3599 			SET_FIELD(flags, RDMA_RQ_SGE_L_KEY_LO, 0);
3600 			SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES, 1);
3601 
3602 			RQ_SGE_SET(rqe, 0, 0, flags);
3603 			i = 1;
3604 		}
3605 
3606 		qp->rqe_wr_id[qp->rq.prod].wr_id = wr->wr_id;
3607 		qp->rqe_wr_id[qp->rq.prod].wqe_size = i;
3608 
3609 		qedr_inc_sw_prod(&qp->rq);
3610 
3611 		/* qp->rqe_wr_id is accessed during qedr_poll_cq, as
3612 		 * soon as we give the doorbell, we could get a completion
3613 		 * for this wr, therefore we need to make sure that the
3614 		 * memory is update before giving the doorbell.
3615 		 * During qedr_poll_cq, rmb is called before accessing the
3616 		 * cqe. This covers for the smp_rmb as well.
3617 		 */
3618 		smp_wmb();
3619 
3620 		qp->rq.db_data.data.value++;
3621 
3622 		writel(qp->rq.db_data.raw, qp->rq.db);
3623 
3624 		if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
3625 			writel(qp->rq.iwarp_db2_data.raw, qp->rq.iwarp_db2);
3626 		}
3627 
3628 		wr = wr->next;
3629 	}
3630 
3631 	spin_unlock_irqrestore(&qp->q_lock, flags);
3632 
3633 	return status;
3634 }
3635 
is_valid_cqe(struct qedr_cq * cq,union rdma_cqe * cqe)3636 static int is_valid_cqe(struct qedr_cq *cq, union rdma_cqe *cqe)
3637 {
3638 	struct rdma_cqe_requester *resp_cqe = &cqe->req;
3639 
3640 	return (resp_cqe->flags & RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK) ==
3641 		cq->pbl_toggle;
3642 }
3643 
cqe_get_qp(union rdma_cqe * cqe)3644 static struct qedr_qp *cqe_get_qp(union rdma_cqe *cqe)
3645 {
3646 	struct rdma_cqe_requester *resp_cqe = &cqe->req;
3647 	struct qedr_qp *qp;
3648 
3649 	qp = (struct qedr_qp *)(uintptr_t)HILO_GEN(resp_cqe->qp_handle.hi,
3650 						   resp_cqe->qp_handle.lo,
3651 						   u64);
3652 	return qp;
3653 }
3654 
cqe_get_type(union rdma_cqe * cqe)3655 static enum rdma_cqe_type cqe_get_type(union rdma_cqe *cqe)
3656 {
3657 	struct rdma_cqe_requester *resp_cqe = &cqe->req;
3658 
3659 	return GET_FIELD(resp_cqe->flags, RDMA_CQE_REQUESTER_TYPE);
3660 }
3661 
3662 /* Return latest CQE (needs processing) */
get_cqe(struct qedr_cq * cq)3663 static union rdma_cqe *get_cqe(struct qedr_cq *cq)
3664 {
3665 	return cq->latest_cqe;
3666 }
3667 
3668 /* In fmr we need to increase the number of fmr completed counter for the fmr
3669  * algorithm determining whether we can free a pbl or not.
3670  * we need to perform this whether the work request was signaled or not. for
3671  * this purpose we call this function from the condition that checks if a wr
3672  * should be skipped, to make sure we don't miss it ( possibly this fmr
3673  * operation was not signalted)
3674  */
qedr_chk_if_fmr(struct qedr_qp * qp)3675 static inline void qedr_chk_if_fmr(struct qedr_qp *qp)
3676 {
3677 	if (qp->wqe_wr_id[qp->sq.cons].opcode == IB_WC_REG_MR)
3678 		qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
3679 }
3680 
process_req(struct qedr_dev * dev,struct qedr_qp * qp,struct qedr_cq * cq,int num_entries,struct ib_wc * wc,u16 hw_cons,enum ib_wc_status status,int force)3681 static int process_req(struct qedr_dev *dev, struct qedr_qp *qp,
3682 		       struct qedr_cq *cq, int num_entries,
3683 		       struct ib_wc *wc, u16 hw_cons, enum ib_wc_status status,
3684 		       int force)
3685 {
3686 	u16 cnt = 0;
3687 
3688 	while (num_entries && qp->sq.wqe_cons != hw_cons) {
3689 		if (!qp->wqe_wr_id[qp->sq.cons].signaled && !force) {
3690 			qedr_chk_if_fmr(qp);
3691 			/* skip WC */
3692 			goto next_cqe;
3693 		}
3694 
3695 		/* fill WC */
3696 		wc->status = status;
3697 		wc->vendor_err = 0;
3698 		wc->wc_flags = 0;
3699 		wc->src_qp = qp->id;
3700 		wc->qp = &qp->ibqp;
3701 
3702 		wc->wr_id = qp->wqe_wr_id[qp->sq.cons].wr_id;
3703 		wc->opcode = qp->wqe_wr_id[qp->sq.cons].opcode;
3704 
3705 		switch (wc->opcode) {
3706 		case IB_WC_RDMA_WRITE:
3707 			wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
3708 			break;
3709 		case IB_WC_COMP_SWAP:
3710 		case IB_WC_FETCH_ADD:
3711 			wc->byte_len = 8;
3712 			break;
3713 		case IB_WC_REG_MR:
3714 			qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
3715 			break;
3716 		case IB_WC_RDMA_READ:
3717 		case IB_WC_SEND:
3718 			wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
3719 			break;
3720 		default:
3721 			break;
3722 		}
3723 
3724 		num_entries--;
3725 		wc++;
3726 		cnt++;
3727 next_cqe:
3728 		while (qp->wqe_wr_id[qp->sq.cons].wqe_size--)
3729 			qed_chain_consume(&qp->sq.pbl);
3730 		qedr_inc_sw_cons(&qp->sq);
3731 	}
3732 
3733 	return cnt;
3734 }
3735 
qedr_poll_cq_req(struct qedr_dev * dev,struct qedr_qp * qp,struct qedr_cq * cq,int num_entries,struct ib_wc * wc,struct rdma_cqe_requester * req)3736 static int qedr_poll_cq_req(struct qedr_dev *dev,
3737 			    struct qedr_qp *qp, struct qedr_cq *cq,
3738 			    int num_entries, struct ib_wc *wc,
3739 			    struct rdma_cqe_requester *req)
3740 {
3741 	int cnt = 0;
3742 
3743 	switch (req->status) {
3744 	case RDMA_CQE_REQ_STS_OK:
3745 		cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
3746 				  IB_WC_SUCCESS, 0);
3747 		break;
3748 	case RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR:
3749 		if (qp->state != QED_ROCE_QP_STATE_ERR)
3750 			DP_DEBUG(dev, QEDR_MSG_CQ,
3751 				 "Error: POLL CQ with RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3752 				 cq->icid, qp->icid);
3753 		cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
3754 				  IB_WC_WR_FLUSH_ERR, 1);
3755 		break;
3756 	default:
3757 		/* process all WQE before the cosumer */
3758 		qp->state = QED_ROCE_QP_STATE_ERR;
3759 		cnt = process_req(dev, qp, cq, num_entries, wc,
3760 				  req->sq_cons - 1, IB_WC_SUCCESS, 0);
3761 		wc += cnt;
3762 		/* if we have extra WC fill it with actual error info */
3763 		if (cnt < num_entries) {
3764 			enum ib_wc_status wc_status;
3765 
3766 			switch (req->status) {
3767 			case RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR:
3768 				DP_ERR(dev,
3769 				       "Error: POLL CQ with RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3770 				       cq->icid, qp->icid);
3771 				wc_status = IB_WC_BAD_RESP_ERR;
3772 				break;
3773 			case RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR:
3774 				DP_ERR(dev,
3775 				       "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3776 				       cq->icid, qp->icid);
3777 				wc_status = IB_WC_LOC_LEN_ERR;
3778 				break;
3779 			case RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR:
3780 				DP_ERR(dev,
3781 				       "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3782 				       cq->icid, qp->icid);
3783 				wc_status = IB_WC_LOC_QP_OP_ERR;
3784 				break;
3785 			case RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR:
3786 				DP_ERR(dev,
3787 				       "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3788 				       cq->icid, qp->icid);
3789 				wc_status = IB_WC_LOC_PROT_ERR;
3790 				break;
3791 			case RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR:
3792 				DP_ERR(dev,
3793 				       "Error: POLL CQ with RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3794 				       cq->icid, qp->icid);
3795 				wc_status = IB_WC_MW_BIND_ERR;
3796 				break;
3797 			case RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR:
3798 				DP_ERR(dev,
3799 				       "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3800 				       cq->icid, qp->icid);
3801 				wc_status = IB_WC_REM_INV_REQ_ERR;
3802 				break;
3803 			case RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR:
3804 				DP_ERR(dev,
3805 				       "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3806 				       cq->icid, qp->icid);
3807 				wc_status = IB_WC_REM_ACCESS_ERR;
3808 				break;
3809 			case RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR:
3810 				DP_ERR(dev,
3811 				       "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3812 				       cq->icid, qp->icid);
3813 				wc_status = IB_WC_REM_OP_ERR;
3814 				break;
3815 			case RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR:
3816 				DP_ERR(dev,
3817 				       "Error: POLL CQ with RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3818 				       cq->icid, qp->icid);
3819 				wc_status = IB_WC_RNR_RETRY_EXC_ERR;
3820 				break;
3821 			case RDMA_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR:
3822 				DP_ERR(dev,
3823 				       "Error: POLL CQ with ROCE_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3824 				       cq->icid, qp->icid);
3825 				wc_status = IB_WC_RETRY_EXC_ERR;
3826 				break;
3827 			default:
3828 				DP_ERR(dev,
3829 				       "Error: POLL CQ with IB_WC_GENERAL_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3830 				       cq->icid, qp->icid);
3831 				wc_status = IB_WC_GENERAL_ERR;
3832 			}
3833 			cnt += process_req(dev, qp, cq, 1, wc, req->sq_cons,
3834 					   wc_status, 1);
3835 		}
3836 	}
3837 
3838 	return cnt;
3839 }
3840 
qedr_cqe_resp_status_to_ib(u8 status)3841 static inline int qedr_cqe_resp_status_to_ib(u8 status)
3842 {
3843 	switch (status) {
3844 	case RDMA_CQE_RESP_STS_LOCAL_ACCESS_ERR:
3845 		return IB_WC_LOC_ACCESS_ERR;
3846 	case RDMA_CQE_RESP_STS_LOCAL_LENGTH_ERR:
3847 		return IB_WC_LOC_LEN_ERR;
3848 	case RDMA_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR:
3849 		return IB_WC_LOC_QP_OP_ERR;
3850 	case RDMA_CQE_RESP_STS_LOCAL_PROTECTION_ERR:
3851 		return IB_WC_LOC_PROT_ERR;
3852 	case RDMA_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR:
3853 		return IB_WC_MW_BIND_ERR;
3854 	case RDMA_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR:
3855 		return IB_WC_REM_INV_RD_REQ_ERR;
3856 	case RDMA_CQE_RESP_STS_OK:
3857 		return IB_WC_SUCCESS;
3858 	default:
3859 		return IB_WC_GENERAL_ERR;
3860 	}
3861 }
3862 
qedr_set_ok_cqe_resp_wc(struct rdma_cqe_responder * resp,struct ib_wc * wc)3863 static inline int qedr_set_ok_cqe_resp_wc(struct rdma_cqe_responder *resp,
3864 					  struct ib_wc *wc)
3865 {
3866 	wc->status = IB_WC_SUCCESS;
3867 	wc->byte_len = le32_to_cpu(resp->length);
3868 
3869 	if (resp->flags & QEDR_RESP_IMM) {
3870 		wc->ex.imm_data = cpu_to_be32(le32_to_cpu(resp->imm_data_or_inv_r_Key));
3871 		wc->wc_flags |= IB_WC_WITH_IMM;
3872 
3873 		if (resp->flags & QEDR_RESP_RDMA)
3874 			wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
3875 
3876 		if (resp->flags & QEDR_RESP_INV)
3877 			return -EINVAL;
3878 
3879 	} else if (resp->flags & QEDR_RESP_INV) {
3880 		wc->ex.imm_data = le32_to_cpu(resp->imm_data_or_inv_r_Key);
3881 		wc->wc_flags |= IB_WC_WITH_INVALIDATE;
3882 
3883 		if (resp->flags & QEDR_RESP_RDMA)
3884 			return -EINVAL;
3885 
3886 	} else if (resp->flags & QEDR_RESP_RDMA) {
3887 		return -EINVAL;
3888 	}
3889 
3890 	return 0;
3891 }
3892 
__process_resp_one(struct qedr_dev * dev,struct qedr_qp * qp,struct qedr_cq * cq,struct ib_wc * wc,struct rdma_cqe_responder * resp,u64 wr_id)3893 static void __process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
3894 			       struct qedr_cq *cq, struct ib_wc *wc,
3895 			       struct rdma_cqe_responder *resp, u64 wr_id)
3896 {
3897 	/* Must fill fields before qedr_set_ok_cqe_resp_wc() */
3898 	wc->opcode = IB_WC_RECV;
3899 	wc->wc_flags = 0;
3900 
3901 	if (likely(resp->status == RDMA_CQE_RESP_STS_OK)) {
3902 		if (qedr_set_ok_cqe_resp_wc(resp, wc))
3903 			DP_ERR(dev,
3904 			       "CQ %p (icid=%d) has invalid CQE responder flags=0x%x\n",
3905 			       cq, cq->icid, resp->flags);
3906 
3907 	} else {
3908 		wc->status = qedr_cqe_resp_status_to_ib(resp->status);
3909 		if (wc->status == IB_WC_GENERAL_ERR)
3910 			DP_ERR(dev,
3911 			       "CQ %p (icid=%d) contains an invalid CQE status %d\n",
3912 			       cq, cq->icid, resp->status);
3913 	}
3914 
3915 	/* Fill the rest of the WC */
3916 	wc->vendor_err = 0;
3917 	wc->src_qp = qp->id;
3918 	wc->qp = &qp->ibqp;
3919 	wc->wr_id = wr_id;
3920 }
3921 
process_resp_one_srq(struct qedr_dev * dev,struct qedr_qp * qp,struct qedr_cq * cq,struct ib_wc * wc,struct rdma_cqe_responder * resp)3922 static int process_resp_one_srq(struct qedr_dev *dev, struct qedr_qp *qp,
3923 				struct qedr_cq *cq, struct ib_wc *wc,
3924 				struct rdma_cqe_responder *resp)
3925 {
3926 	struct qedr_srq *srq = qp->srq;
3927 	u64 wr_id;
3928 
3929 	wr_id = HILO_GEN(le32_to_cpu(resp->srq_wr_id.hi),
3930 			 le32_to_cpu(resp->srq_wr_id.lo), u64);
3931 
3932 	if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
3933 		wc->status = IB_WC_WR_FLUSH_ERR;
3934 		wc->vendor_err = 0;
3935 		wc->wr_id = wr_id;
3936 		wc->byte_len = 0;
3937 		wc->src_qp = qp->id;
3938 		wc->qp = &qp->ibqp;
3939 		wc->wr_id = wr_id;
3940 	} else {
3941 		__process_resp_one(dev, qp, cq, wc, resp, wr_id);
3942 	}
3943 	srq->hw_srq.wr_cons_cnt++;
3944 
3945 	return 1;
3946 }
process_resp_one(struct qedr_dev * dev,struct qedr_qp * qp,struct qedr_cq * cq,struct ib_wc * wc,struct rdma_cqe_responder * resp)3947 static int process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
3948 			    struct qedr_cq *cq, struct ib_wc *wc,
3949 			    struct rdma_cqe_responder *resp)
3950 {
3951 	u64 wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
3952 
3953 	__process_resp_one(dev, qp, cq, wc, resp, wr_id);
3954 
3955 	while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
3956 		qed_chain_consume(&qp->rq.pbl);
3957 	qedr_inc_sw_cons(&qp->rq);
3958 
3959 	return 1;
3960 }
3961 
process_resp_flush(struct qedr_qp * qp,struct qedr_cq * cq,int num_entries,struct ib_wc * wc,u16 hw_cons)3962 static int process_resp_flush(struct qedr_qp *qp, struct qedr_cq *cq,
3963 			      int num_entries, struct ib_wc *wc, u16 hw_cons)
3964 {
3965 	u16 cnt = 0;
3966 
3967 	while (num_entries && qp->rq.wqe_cons != hw_cons) {
3968 		/* fill WC */
3969 		wc->status = IB_WC_WR_FLUSH_ERR;
3970 		wc->vendor_err = 0;
3971 		wc->wc_flags = 0;
3972 		wc->src_qp = qp->id;
3973 		wc->byte_len = 0;
3974 		wc->wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
3975 		wc->qp = &qp->ibqp;
3976 		num_entries--;
3977 		wc++;
3978 		cnt++;
3979 		while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
3980 			qed_chain_consume(&qp->rq.pbl);
3981 		qedr_inc_sw_cons(&qp->rq);
3982 	}
3983 
3984 	return cnt;
3985 }
3986 
try_consume_resp_cqe(struct qedr_cq * cq,struct qedr_qp * qp,struct rdma_cqe_responder * resp,int * update)3987 static void try_consume_resp_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
3988 				 struct rdma_cqe_responder *resp, int *update)
3989 {
3990 	if (le16_to_cpu(resp->rq_cons_or_srq_id) == qp->rq.wqe_cons) {
3991 		consume_cqe(cq);
3992 		*update |= 1;
3993 	}
3994 }
3995 
qedr_poll_cq_resp_srq(struct qedr_dev * dev,struct qedr_qp * qp,struct qedr_cq * cq,int num_entries,struct ib_wc * wc,struct rdma_cqe_responder * resp)3996 static int qedr_poll_cq_resp_srq(struct qedr_dev *dev, struct qedr_qp *qp,
3997 				 struct qedr_cq *cq, int num_entries,
3998 				 struct ib_wc *wc,
3999 				 struct rdma_cqe_responder *resp)
4000 {
4001 	int cnt;
4002 
4003 	cnt = process_resp_one_srq(dev, qp, cq, wc, resp);
4004 	consume_cqe(cq);
4005 
4006 	return cnt;
4007 }
4008 
qedr_poll_cq_resp(struct qedr_dev * dev,struct qedr_qp * qp,struct qedr_cq * cq,int num_entries,struct ib_wc * wc,struct rdma_cqe_responder * resp,int * update)4009 static int qedr_poll_cq_resp(struct qedr_dev *dev, struct qedr_qp *qp,
4010 			     struct qedr_cq *cq, int num_entries,
4011 			     struct ib_wc *wc, struct rdma_cqe_responder *resp,
4012 			     int *update)
4013 {
4014 	int cnt;
4015 
4016 	if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
4017 		cnt = process_resp_flush(qp, cq, num_entries, wc,
4018 					 resp->rq_cons_or_srq_id);
4019 		try_consume_resp_cqe(cq, qp, resp, update);
4020 	} else {
4021 		cnt = process_resp_one(dev, qp, cq, wc, resp);
4022 		consume_cqe(cq);
4023 		*update |= 1;
4024 	}
4025 
4026 	return cnt;
4027 }
4028 
try_consume_req_cqe(struct qedr_cq * cq,struct qedr_qp * qp,struct rdma_cqe_requester * req,int * update)4029 static void try_consume_req_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
4030 				struct rdma_cqe_requester *req, int *update)
4031 {
4032 	if (le16_to_cpu(req->sq_cons) == qp->sq.wqe_cons) {
4033 		consume_cqe(cq);
4034 		*update |= 1;
4035 	}
4036 }
4037 
qedr_poll_cq(struct ib_cq * ibcq,int num_entries,struct ib_wc * wc)4038 int qedr_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)
4039 {
4040 	struct qedr_dev *dev = get_qedr_dev(ibcq->device);
4041 	struct qedr_cq *cq = get_qedr_cq(ibcq);
4042 	union rdma_cqe *cqe;
4043 	u32 old_cons, new_cons;
4044 	unsigned long flags;
4045 	int update = 0;
4046 	int done = 0;
4047 
4048 	if (cq->destroyed) {
4049 		DP_ERR(dev,
4050 		       "warning: poll was invoked after destroy for cq %p (icid=%d)\n",
4051 		       cq, cq->icid);
4052 		return 0;
4053 	}
4054 
4055 	if (cq->cq_type == QEDR_CQ_TYPE_GSI)
4056 		return qedr_gsi_poll_cq(ibcq, num_entries, wc);
4057 
4058 	spin_lock_irqsave(&cq->cq_lock, flags);
4059 	cqe = cq->latest_cqe;
4060 	old_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
4061 	while (num_entries && is_valid_cqe(cq, cqe)) {
4062 		struct qedr_qp *qp;
4063 		int cnt = 0;
4064 
4065 		/* prevent speculative reads of any field of CQE */
4066 		rmb();
4067 
4068 		qp = cqe_get_qp(cqe);
4069 		if (!qp) {
4070 			WARN(1, "Error: CQE QP pointer is NULL. CQE=%p\n", cqe);
4071 			break;
4072 		}
4073 
4074 		wc->qp = &qp->ibqp;
4075 
4076 		switch (cqe_get_type(cqe)) {
4077 		case RDMA_CQE_TYPE_REQUESTER:
4078 			cnt = qedr_poll_cq_req(dev, qp, cq, num_entries, wc,
4079 					       &cqe->req);
4080 			try_consume_req_cqe(cq, qp, &cqe->req, &update);
4081 			break;
4082 		case RDMA_CQE_TYPE_RESPONDER_RQ:
4083 			cnt = qedr_poll_cq_resp(dev, qp, cq, num_entries, wc,
4084 						&cqe->resp, &update);
4085 			break;
4086 		case RDMA_CQE_TYPE_RESPONDER_SRQ:
4087 			cnt = qedr_poll_cq_resp_srq(dev, qp, cq, num_entries,
4088 						    wc, &cqe->resp);
4089 			update = 1;
4090 			break;
4091 		case RDMA_CQE_TYPE_INVALID:
4092 		default:
4093 			DP_ERR(dev, "Error: invalid CQE type = %d\n",
4094 			       cqe_get_type(cqe));
4095 		}
4096 		num_entries -= cnt;
4097 		wc += cnt;
4098 		done += cnt;
4099 
4100 		cqe = get_cqe(cq);
4101 	}
4102 	new_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
4103 
4104 	cq->cq_cons += new_cons - old_cons;
4105 
4106 	if (update)
4107 		/* doorbell notifies abount latest VALID entry,
4108 		 * but chain already point to the next INVALID one
4109 		 */
4110 		doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
4111 
4112 	spin_unlock_irqrestore(&cq->cq_lock, flags);
4113 	return done;
4114 }
4115 
qedr_process_mad(struct ib_device * ibdev,int process_mad_flags,u8 port_num,const struct ib_wc * in_wc,const struct ib_grh * in_grh,const struct ib_mad_hdr * mad_hdr,size_t in_mad_size,struct ib_mad_hdr * out_mad,size_t * out_mad_size,u16 * out_mad_pkey_index)4116 int qedr_process_mad(struct ib_device *ibdev, int process_mad_flags,
4117 		     u8 port_num,
4118 		     const struct ib_wc *in_wc,
4119 		     const struct ib_grh *in_grh,
4120 		     const struct ib_mad_hdr *mad_hdr,
4121 		     size_t in_mad_size, struct ib_mad_hdr *out_mad,
4122 		     size_t *out_mad_size, u16 *out_mad_pkey_index)
4123 {
4124 	struct qedr_dev *dev = get_qedr_dev(ibdev);
4125 
4126 	DP_DEBUG(dev, QEDR_MSG_GSI,
4127 		 "QEDR_PROCESS_MAD in_mad %x %x %x %x %x %x %x %x\n",
4128 		 mad_hdr->attr_id, mad_hdr->base_version, mad_hdr->attr_mod,
4129 		 mad_hdr->class_specific, mad_hdr->class_version,
4130 		 mad_hdr->method, mad_hdr->mgmt_class, mad_hdr->status);
4131 	return IB_MAD_RESULT_SUCCESS;
4132 }
4133