blob: a3afd2b21cc595fec8349915c6b31c4f42b6e958 [file] [log] [blame]
Ram Amraniac1b36e2016-10-10 13:15:32 +03001/* 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
Mintz, Yuvalbe086e72017-03-11 18:39:18 +020046#include <linux/qed/common_hsi.h>
47#include "qedr_hsi_rdma.h"
Ram Amraniac1b36e2016-10-10 13:15:32 +030048#include <linux/qed/qed_if.h>
49#include "qedr.h"
50#include "verbs.h"
51#include <rdma/qedr-abi.h>
Ram Amranicecbcdd2016-10-10 13:15:34 +030052#include "qedr_cm.h"
Ram Amraniac1b36e2016-10-10 13:15:32 +030053
Ram Amrania7efd772016-10-10 13:15:33 +030054#define DB_ADDR_SHIFT(addr) ((addr) << DB_PWM_ADDR_OFFSET_SHIFT)
55
56int qedr_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
57{
58 if (index > QEDR_ROCE_PKEY_TABLE_LEN)
59 return -EINVAL;
60
61 *pkey = QEDR_ROCE_PKEY_DEFAULT;
62 return 0;
63}
64
Ram Amraniac1b36e2016-10-10 13:15:32 +030065int qedr_query_gid(struct ib_device *ibdev, u8 port, int index,
66 union ib_gid *sgid)
67{
68 struct qedr_dev *dev = get_qedr_dev(ibdev);
69 int rc = 0;
70
71 if (!rdma_cap_roce_gid_table(ibdev, port))
72 return -ENODEV;
73
74 rc = ib_get_cached_gid(ibdev, port, index, sgid, NULL);
75 if (rc == -EAGAIN) {
76 memcpy(sgid, &zgid, sizeof(*sgid));
77 return 0;
78 }
79
80 DP_DEBUG(dev, QEDR_MSG_INIT, "query gid: index=%d %llx:%llx\n", index,
81 sgid->global.interface_id, sgid->global.subnet_prefix);
82
83 return rc;
84}
85
86int qedr_add_gid(struct ib_device *device, u8 port_num,
87 unsigned int index, const union ib_gid *gid,
88 const struct ib_gid_attr *attr, void **context)
89{
90 if (!rdma_cap_roce_gid_table(device, port_num))
91 return -EINVAL;
92
93 if (port_num > QEDR_MAX_PORT)
94 return -EINVAL;
95
96 if (!context)
97 return -EINVAL;
98
99 return 0;
100}
101
102int qedr_del_gid(struct ib_device *device, u8 port_num,
103 unsigned int index, void **context)
104{
105 if (!rdma_cap_roce_gid_table(device, port_num))
106 return -EINVAL;
107
108 if (port_num > QEDR_MAX_PORT)
109 return -EINVAL;
110
111 if (!context)
112 return -EINVAL;
113
114 return 0;
115}
116
117int qedr_query_device(struct ib_device *ibdev,
118 struct ib_device_attr *attr, struct ib_udata *udata)
119{
120 struct qedr_dev *dev = get_qedr_dev(ibdev);
121 struct qedr_device_attr *qattr = &dev->attr;
122
123 if (!dev->rdma_ctx) {
124 DP_ERR(dev,
125 "qedr_query_device called with invalid params rdma_ctx=%p\n",
126 dev->rdma_ctx);
127 return -EINVAL;
128 }
129
130 memset(attr, 0, sizeof(*attr));
131
132 attr->fw_ver = qattr->fw_ver;
133 attr->sys_image_guid = qattr->sys_image_guid;
134 attr->max_mr_size = qattr->max_mr_size;
135 attr->page_size_cap = qattr->page_size_caps;
136 attr->vendor_id = qattr->vendor_id;
137 attr->vendor_part_id = qattr->vendor_part_id;
138 attr->hw_ver = qattr->hw_ver;
139 attr->max_qp = qattr->max_qp;
140 attr->max_qp_wr = max_t(u32, qattr->max_sqe, qattr->max_rqe);
141 attr->device_cap_flags = IB_DEVICE_CURR_QP_STATE_MOD |
142 IB_DEVICE_RC_RNR_NAK_GEN |
143 IB_DEVICE_LOCAL_DMA_LKEY | IB_DEVICE_MEM_MGT_EXTENSIONS;
144
145 attr->max_sge = qattr->max_sge;
146 attr->max_sge_rd = qattr->max_sge;
147 attr->max_cq = qattr->max_cq;
148 attr->max_cqe = qattr->max_cqe;
149 attr->max_mr = qattr->max_mr;
150 attr->max_mw = qattr->max_mw;
151 attr->max_pd = qattr->max_pd;
152 attr->atomic_cap = dev->atomic_cap;
153 attr->max_fmr = qattr->max_fmr;
154 attr->max_map_per_fmr = 16;
155 attr->max_qp_init_rd_atom =
156 1 << (fls(qattr->max_qp_req_rd_atomic_resc) - 1);
157 attr->max_qp_rd_atom =
158 min(1 << (fls(qattr->max_qp_resp_rd_atomic_resc) - 1),
159 attr->max_qp_init_rd_atom);
160
161 attr->max_srq = qattr->max_srq;
162 attr->max_srq_sge = qattr->max_srq_sge;
163 attr->max_srq_wr = qattr->max_srq_wr;
164
165 attr->local_ca_ack_delay = qattr->dev_ack_delay;
166 attr->max_fast_reg_page_list_len = qattr->max_mr / 8;
167 attr->max_pkeys = QEDR_ROCE_PKEY_MAX;
168 attr->max_ah = qattr->max_ah;
169
170 return 0;
171}
172
173#define QEDR_SPEED_SDR (1)
174#define QEDR_SPEED_DDR (2)
175#define QEDR_SPEED_QDR (4)
176#define QEDR_SPEED_FDR10 (8)
177#define QEDR_SPEED_FDR (16)
178#define QEDR_SPEED_EDR (32)
179
180static inline void get_link_speed_and_width(int speed, u8 *ib_speed,
181 u8 *ib_width)
182{
183 switch (speed) {
184 case 1000:
185 *ib_speed = QEDR_SPEED_SDR;
186 *ib_width = IB_WIDTH_1X;
187 break;
188 case 10000:
189 *ib_speed = QEDR_SPEED_QDR;
190 *ib_width = IB_WIDTH_1X;
191 break;
192
193 case 20000:
194 *ib_speed = QEDR_SPEED_DDR;
195 *ib_width = IB_WIDTH_4X;
196 break;
197
198 case 25000:
199 *ib_speed = QEDR_SPEED_EDR;
200 *ib_width = IB_WIDTH_1X;
201 break;
202
203 case 40000:
204 *ib_speed = QEDR_SPEED_QDR;
205 *ib_width = IB_WIDTH_4X;
206 break;
207
208 case 50000:
209 *ib_speed = QEDR_SPEED_QDR;
210 *ib_width = IB_WIDTH_4X;
211 break;
212
213 case 100000:
214 *ib_speed = QEDR_SPEED_EDR;
215 *ib_width = IB_WIDTH_4X;
216 break;
217
218 default:
219 /* Unsupported */
220 *ib_speed = QEDR_SPEED_SDR;
221 *ib_width = IB_WIDTH_1X;
222 }
223}
224
225int qedr_query_port(struct ib_device *ibdev, u8 port, struct ib_port_attr *attr)
226{
227 struct qedr_dev *dev;
228 struct qed_rdma_port *rdma_port;
229
230 dev = get_qedr_dev(ibdev);
231 if (port > 1) {
232 DP_ERR(dev, "invalid_port=0x%x\n", port);
233 return -EINVAL;
234 }
235
236 if (!dev->rdma_ctx) {
237 DP_ERR(dev, "rdma_ctx is NULL\n");
238 return -EINVAL;
239 }
240
241 rdma_port = dev->ops->rdma_query_port(dev->rdma_ctx);
Ram Amraniac1b36e2016-10-10 13:15:32 +0300242
Or Gerlitzc4550c62017-01-24 13:02:39 +0200243 /* *attr being zeroed by the caller, avoid zeroing it here */
Ram Amraniac1b36e2016-10-10 13:15:32 +0300244 if (rdma_port->port_state == QED_RDMA_PORT_UP) {
245 attr->state = IB_PORT_ACTIVE;
246 attr->phys_state = 5;
247 } else {
248 attr->state = IB_PORT_DOWN;
249 attr->phys_state = 3;
250 }
251 attr->max_mtu = IB_MTU_4096;
252 attr->active_mtu = iboe_get_mtu(dev->ndev->mtu);
253 attr->lid = 0;
254 attr->lmc = 0;
255 attr->sm_lid = 0;
256 attr->sm_sl = 0;
257 attr->port_cap_flags = IB_PORT_IP_BASED_GIDS;
258 attr->gid_tbl_len = QEDR_MAX_SGID;
259 attr->pkey_tbl_len = QEDR_ROCE_PKEY_TABLE_LEN;
260 attr->bad_pkey_cntr = rdma_port->pkey_bad_counter;
261 attr->qkey_viol_cntr = 0;
262 get_link_speed_and_width(rdma_port->link_speed,
263 &attr->active_speed, &attr->active_width);
264 attr->max_msg_sz = rdma_port->max_msg_size;
265 attr->max_vl_num = 4;
266
267 return 0;
268}
269
270int qedr_modify_port(struct ib_device *ibdev, u8 port, int mask,
271 struct ib_port_modify *props)
272{
273 struct qedr_dev *dev;
274
275 dev = get_qedr_dev(ibdev);
276 if (port > 1) {
277 DP_ERR(dev, "invalid_port=0x%x\n", port);
278 return -EINVAL;
279 }
280
281 return 0;
282}
283
284static int qedr_add_mmap(struct qedr_ucontext *uctx, u64 phy_addr,
285 unsigned long len)
286{
287 struct qedr_mm *mm;
288
289 mm = kzalloc(sizeof(*mm), GFP_KERNEL);
290 if (!mm)
291 return -ENOMEM;
292
293 mm->key.phy_addr = phy_addr;
294 /* This function might be called with a length which is not a multiple
295 * of PAGE_SIZE, while the mapping is PAGE_SIZE grained and the kernel
296 * forces this granularity by increasing the requested size if needed.
297 * When qedr_mmap is called, it will search the list with the updated
298 * length as a key. To prevent search failures, the length is rounded up
299 * in advance to PAGE_SIZE.
300 */
301 mm->key.len = roundup(len, PAGE_SIZE);
302 INIT_LIST_HEAD(&mm->entry);
303
304 mutex_lock(&uctx->mm_list_lock);
305 list_add(&mm->entry, &uctx->mm_head);
306 mutex_unlock(&uctx->mm_list_lock);
307
308 DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
309 "added (addr=0x%llx,len=0x%lx) for ctx=%p\n",
310 (unsigned long long)mm->key.phy_addr,
311 (unsigned long)mm->key.len, uctx);
312
313 return 0;
314}
315
316static bool qedr_search_mmap(struct qedr_ucontext *uctx, u64 phy_addr,
317 unsigned long len)
318{
319 bool found = false;
320 struct qedr_mm *mm;
321
322 mutex_lock(&uctx->mm_list_lock);
323 list_for_each_entry(mm, &uctx->mm_head, entry) {
324 if (len != mm->key.len || phy_addr != mm->key.phy_addr)
325 continue;
326
327 found = true;
328 break;
329 }
330 mutex_unlock(&uctx->mm_list_lock);
331 DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
332 "searched for (addr=0x%llx,len=0x%lx) for ctx=%p, result=%d\n",
333 mm->key.phy_addr, mm->key.len, uctx, found);
334
335 return found;
336}
337
338struct ib_ucontext *qedr_alloc_ucontext(struct ib_device *ibdev,
339 struct ib_udata *udata)
340{
341 int rc;
342 struct qedr_ucontext *ctx;
343 struct qedr_alloc_ucontext_resp uresp;
344 struct qedr_dev *dev = get_qedr_dev(ibdev);
345 struct qed_rdma_add_user_out_params oparams;
346
347 if (!udata)
348 return ERR_PTR(-EFAULT);
349
350 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
351 if (!ctx)
352 return ERR_PTR(-ENOMEM);
353
354 rc = dev->ops->rdma_add_user(dev->rdma_ctx, &oparams);
355 if (rc) {
356 DP_ERR(dev,
357 "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",
358 rc);
359 goto err;
360 }
361
362 ctx->dpi = oparams.dpi;
363 ctx->dpi_addr = oparams.dpi_addr;
364 ctx->dpi_phys_addr = oparams.dpi_phys_addr;
365 ctx->dpi_size = oparams.dpi_size;
366 INIT_LIST_HEAD(&ctx->mm_head);
367 mutex_init(&ctx->mm_list_lock);
368
369 memset(&uresp, 0, sizeof(uresp));
370
371 uresp.db_pa = ctx->dpi_phys_addr;
372 uresp.db_size = ctx->dpi_size;
373 uresp.max_send_wr = dev->attr.max_sqe;
374 uresp.max_recv_wr = dev->attr.max_rqe;
375 uresp.max_srq_wr = dev->attr.max_srq_wr;
376 uresp.sges_per_send_wr = QEDR_MAX_SQE_ELEMENTS_PER_SQE;
377 uresp.sges_per_recv_wr = QEDR_MAX_RQE_ELEMENTS_PER_RQE;
378 uresp.sges_per_srq_wr = dev->attr.max_srq_sge;
379 uresp.max_cqes = QEDR_MAX_CQES;
380
381 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
382 if (rc)
383 goto err;
384
385 ctx->dev = dev;
386
387 rc = qedr_add_mmap(ctx, ctx->dpi_phys_addr, ctx->dpi_size);
388 if (rc)
389 goto err;
390
391 DP_DEBUG(dev, QEDR_MSG_INIT, "Allocating user context %p\n",
392 &ctx->ibucontext);
393 return &ctx->ibucontext;
394
395err:
396 kfree(ctx);
397 return ERR_PTR(rc);
398}
399
400int qedr_dealloc_ucontext(struct ib_ucontext *ibctx)
401{
402 struct qedr_ucontext *uctx = get_qedr_ucontext(ibctx);
403 struct qedr_mm *mm, *tmp;
404 int status = 0;
405
406 DP_DEBUG(uctx->dev, QEDR_MSG_INIT, "Deallocating user context %p\n",
407 uctx);
408 uctx->dev->ops->rdma_remove_user(uctx->dev->rdma_ctx, uctx->dpi);
409
410 list_for_each_entry_safe(mm, tmp, &uctx->mm_head, entry) {
411 DP_DEBUG(uctx->dev, QEDR_MSG_MISC,
412 "deleted (addr=0x%llx,len=0x%lx) for ctx=%p\n",
413 mm->key.phy_addr, mm->key.len, uctx);
414 list_del(&mm->entry);
415 kfree(mm);
416 }
417
418 kfree(uctx);
419 return status;
420}
421
422int qedr_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
423{
424 struct qedr_ucontext *ucontext = get_qedr_ucontext(context);
425 struct qedr_dev *dev = get_qedr_dev(context->device);
426 unsigned long vm_page = vma->vm_pgoff << PAGE_SHIFT;
427 u64 unmapped_db = dev->db_phys_addr;
428 unsigned long len = (vma->vm_end - vma->vm_start);
429 int rc = 0;
430 bool found;
431
432 DP_DEBUG(dev, QEDR_MSG_INIT,
433 "qedr_mmap called vm_page=0x%lx vm_pgoff=0x%lx unmapped_db=0x%llx db_size=%x, len=%lx\n",
434 vm_page, vma->vm_pgoff, unmapped_db, dev->db_size, len);
435 if (vma->vm_start & (PAGE_SIZE - 1)) {
436 DP_ERR(dev, "Vma_start not page aligned = %ld\n",
437 vma->vm_start);
438 return -EINVAL;
439 }
440
441 found = qedr_search_mmap(ucontext, vm_page, len);
442 if (!found) {
443 DP_ERR(dev, "Vma_pgoff not found in mapped array = %ld\n",
444 vma->vm_pgoff);
445 return -EINVAL;
446 }
447
448 DP_DEBUG(dev, QEDR_MSG_INIT, "Mapping doorbell bar\n");
449
450 if ((vm_page >= unmapped_db) && (vm_page <= (unmapped_db +
451 dev->db_size))) {
452 DP_DEBUG(dev, QEDR_MSG_INIT, "Mapping doorbell bar\n");
453 if (vma->vm_flags & VM_READ) {
454 DP_ERR(dev, "Trying to map doorbell bar for read\n");
455 return -EPERM;
456 }
457
458 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
459
460 rc = io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
461 PAGE_SIZE, vma->vm_page_prot);
462 } else {
463 DP_DEBUG(dev, QEDR_MSG_INIT, "Mapping chains\n");
464 rc = remap_pfn_range(vma, vma->vm_start,
465 vma->vm_pgoff, len, vma->vm_page_prot);
466 }
467 DP_DEBUG(dev, QEDR_MSG_INIT, "qedr_mmap return code: %d\n", rc);
468 return rc;
469}
Ram Amrania7efd772016-10-10 13:15:33 +0300470
471struct ib_pd *qedr_alloc_pd(struct ib_device *ibdev,
472 struct ib_ucontext *context, struct ib_udata *udata)
473{
474 struct qedr_dev *dev = get_qedr_dev(ibdev);
Ram Amrania7efd772016-10-10 13:15:33 +0300475 struct qedr_pd *pd;
476 u16 pd_id;
477 int rc;
478
479 DP_DEBUG(dev, QEDR_MSG_INIT, "Function called from: %s\n",
480 (udata && context) ? "User Lib" : "Kernel");
481
482 if (!dev->rdma_ctx) {
483 DP_ERR(dev, "invlaid RDMA context\n");
484 return ERR_PTR(-EINVAL);
485 }
486
487 pd = kzalloc(sizeof(*pd), GFP_KERNEL);
488 if (!pd)
489 return ERR_PTR(-ENOMEM);
490
Ram Amrani9c1e0222017-01-24 13:51:42 +0200491 rc = dev->ops->rdma_alloc_pd(dev->rdma_ctx, &pd_id);
492 if (rc)
493 goto err;
Ram Amrania7efd772016-10-10 13:15:33 +0300494
Ram Amrania7efd772016-10-10 13:15:33 +0300495 pd->pd_id = pd_id;
496
497 if (udata && context) {
Ram Amrani9c1e0222017-01-24 13:51:42 +0200498 struct qedr_alloc_pd_uresp uresp;
499
500 uresp.pd_id = pd_id;
501
Ram Amrania7efd772016-10-10 13:15:33 +0300502 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
Ram Amrani9c1e0222017-01-24 13:51:42 +0200503 if (rc) {
Ram Amrania7efd772016-10-10 13:15:33 +0300504 DP_ERR(dev, "copy error pd_id=0x%x.\n", pd_id);
Ram Amrani9c1e0222017-01-24 13:51:42 +0200505 dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd_id);
506 goto err;
507 }
508
509 pd->uctx = get_qedr_ucontext(context);
510 pd->uctx->pd = pd;
Ram Amrania7efd772016-10-10 13:15:33 +0300511 }
512
513 return &pd->ibpd;
Ram Amrani9c1e0222017-01-24 13:51:42 +0200514
515err:
516 kfree(pd);
517 return ERR_PTR(rc);
Ram Amrania7efd772016-10-10 13:15:33 +0300518}
519
520int qedr_dealloc_pd(struct ib_pd *ibpd)
521{
522 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
523 struct qedr_pd *pd = get_qedr_pd(ibpd);
524
Colin Ian Kingea7ef2a2016-10-18 19:39:28 +0100525 if (!pd) {
Ram Amrania7efd772016-10-10 13:15:33 +0300526 pr_err("Invalid PD received in dealloc_pd\n");
Colin Ian Kingea7ef2a2016-10-18 19:39:28 +0100527 return -EINVAL;
528 }
Ram Amrania7efd772016-10-10 13:15:33 +0300529
530 DP_DEBUG(dev, QEDR_MSG_INIT, "Deallocating PD %d\n", pd->pd_id);
531 dev->ops->rdma_dealloc_pd(dev->rdma_ctx, pd->pd_id);
532
533 kfree(pd);
534
535 return 0;
536}
537
538static void qedr_free_pbl(struct qedr_dev *dev,
539 struct qedr_pbl_info *pbl_info, struct qedr_pbl *pbl)
540{
541 struct pci_dev *pdev = dev->pdev;
542 int i;
543
544 for (i = 0; i < pbl_info->num_pbls; i++) {
545 if (!pbl[i].va)
546 continue;
547 dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
548 pbl[i].va, pbl[i].pa);
549 }
550
551 kfree(pbl);
552}
553
554#define MIN_FW_PBL_PAGE_SIZE (4 * 1024)
555#define MAX_FW_PBL_PAGE_SIZE (64 * 1024)
556
557#define NUM_PBES_ON_PAGE(_page_size) (_page_size / sizeof(u64))
558#define MAX_PBES_ON_PAGE NUM_PBES_ON_PAGE(MAX_FW_PBL_PAGE_SIZE)
559#define MAX_PBES_TWO_LAYER (MAX_PBES_ON_PAGE * MAX_PBES_ON_PAGE)
560
561static struct qedr_pbl *qedr_alloc_pbl_tbl(struct qedr_dev *dev,
562 struct qedr_pbl_info *pbl_info,
563 gfp_t flags)
564{
565 struct pci_dev *pdev = dev->pdev;
566 struct qedr_pbl *pbl_table;
567 dma_addr_t *pbl_main_tbl;
568 dma_addr_t pa;
569 void *va;
570 int i;
571
572 pbl_table = kcalloc(pbl_info->num_pbls, sizeof(*pbl_table), flags);
573 if (!pbl_table)
574 return ERR_PTR(-ENOMEM);
575
576 for (i = 0; i < pbl_info->num_pbls; i++) {
577 va = dma_alloc_coherent(&pdev->dev, pbl_info->pbl_size,
578 &pa, flags);
579 if (!va)
580 goto err;
581
582 memset(va, 0, pbl_info->pbl_size);
583 pbl_table[i].va = va;
584 pbl_table[i].pa = pa;
585 }
586
587 /* Two-Layer PBLs, if we have more than one pbl we need to initialize
588 * the first one with physical pointers to all of the rest
589 */
590 pbl_main_tbl = (dma_addr_t *)pbl_table[0].va;
591 for (i = 0; i < pbl_info->num_pbls - 1; i++)
592 pbl_main_tbl[i] = pbl_table[i + 1].pa;
593
594 return pbl_table;
595
596err:
597 for (i--; i >= 0; i--)
598 dma_free_coherent(&pdev->dev, pbl_info->pbl_size,
599 pbl_table[i].va, pbl_table[i].pa);
600
601 qedr_free_pbl(dev, pbl_info, pbl_table);
602
603 return ERR_PTR(-ENOMEM);
604}
605
606static int qedr_prepare_pbl_tbl(struct qedr_dev *dev,
607 struct qedr_pbl_info *pbl_info,
608 u32 num_pbes, int two_layer_capable)
609{
610 u32 pbl_capacity;
611 u32 pbl_size;
612 u32 num_pbls;
613
614 if ((num_pbes > MAX_PBES_ON_PAGE) && two_layer_capable) {
615 if (num_pbes > MAX_PBES_TWO_LAYER) {
616 DP_ERR(dev, "prepare pbl table: too many pages %d\n",
617 num_pbes);
618 return -EINVAL;
619 }
620
621 /* calculate required pbl page size */
622 pbl_size = MIN_FW_PBL_PAGE_SIZE;
623 pbl_capacity = NUM_PBES_ON_PAGE(pbl_size) *
624 NUM_PBES_ON_PAGE(pbl_size);
625
626 while (pbl_capacity < num_pbes) {
627 pbl_size *= 2;
628 pbl_capacity = pbl_size / sizeof(u64);
629 pbl_capacity = pbl_capacity * pbl_capacity;
630 }
631
632 num_pbls = DIV_ROUND_UP(num_pbes, NUM_PBES_ON_PAGE(pbl_size));
633 num_pbls++; /* One for the layer0 ( points to the pbls) */
634 pbl_info->two_layered = true;
635 } else {
636 /* One layered PBL */
637 num_pbls = 1;
638 pbl_size = max_t(u32, MIN_FW_PBL_PAGE_SIZE,
639 roundup_pow_of_two((num_pbes * sizeof(u64))));
640 pbl_info->two_layered = false;
641 }
642
643 pbl_info->num_pbls = num_pbls;
644 pbl_info->pbl_size = pbl_size;
645 pbl_info->num_pbes = num_pbes;
646
647 DP_DEBUG(dev, QEDR_MSG_MR,
648 "prepare pbl table: num_pbes=%d, num_pbls=%d, pbl_size=%d\n",
649 pbl_info->num_pbes, pbl_info->num_pbls, pbl_info->pbl_size);
650
651 return 0;
652}
653
654static void qedr_populate_pbls(struct qedr_dev *dev, struct ib_umem *umem,
655 struct qedr_pbl *pbl,
656 struct qedr_pbl_info *pbl_info)
657{
658 int shift, pg_cnt, pages, pbe_cnt, total_num_pbes = 0;
659 struct qedr_pbl *pbl_tbl;
660 struct scatterlist *sg;
661 struct regpair *pbe;
662 int entry;
663 u32 addr;
664
665 if (!pbl_info->num_pbes)
666 return;
667
668 /* If we have a two layered pbl, the first pbl points to the rest
669 * of the pbls and the first entry lays on the second pbl in the table
670 */
671 if (pbl_info->two_layered)
672 pbl_tbl = &pbl[1];
673 else
674 pbl_tbl = pbl;
675
676 pbe = (struct regpair *)pbl_tbl->va;
677 if (!pbe) {
678 DP_ERR(dev, "cannot populate PBL due to a NULL PBE\n");
679 return;
680 }
681
682 pbe_cnt = 0;
683
Artemy Kovalyov3e7e1192017-04-05 09:23:50 +0300684 shift = umem->page_shift;
Ram Amrania7efd772016-10-10 13:15:33 +0300685
686 for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry) {
687 pages = sg_dma_len(sg) >> shift;
688 for (pg_cnt = 0; pg_cnt < pages; pg_cnt++) {
689 /* store the page address in pbe */
690 pbe->lo = cpu_to_le32(sg_dma_address(sg) +
Artemy Kovalyov3e7e1192017-04-05 09:23:50 +0300691 (pg_cnt << shift));
Ram Amrania7efd772016-10-10 13:15:33 +0300692 addr = upper_32_bits(sg_dma_address(sg) +
Artemy Kovalyov3e7e1192017-04-05 09:23:50 +0300693 (pg_cnt << shift));
Ram Amrania7efd772016-10-10 13:15:33 +0300694 pbe->hi = cpu_to_le32(addr);
695 pbe_cnt++;
696 total_num_pbes++;
697 pbe++;
698
699 if (total_num_pbes == pbl_info->num_pbes)
700 return;
701
702 /* If the given pbl is full storing the pbes,
703 * move to next pbl.
704 */
705 if (pbe_cnt == (pbl_info->pbl_size / sizeof(u64))) {
706 pbl_tbl++;
707 pbe = (struct regpair *)pbl_tbl->va;
708 pbe_cnt = 0;
709 }
710 }
711 }
712}
713
714static int qedr_copy_cq_uresp(struct qedr_dev *dev,
715 struct qedr_cq *cq, struct ib_udata *udata)
716{
717 struct qedr_create_cq_uresp uresp;
718 int rc;
719
720 memset(&uresp, 0, sizeof(uresp));
721
722 uresp.db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
723 uresp.icid = cq->icid;
724
725 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
726 if (rc)
727 DP_ERR(dev, "copy error cqid=0x%x.\n", cq->icid);
728
729 return rc;
730}
731
732static void consume_cqe(struct qedr_cq *cq)
733{
734 if (cq->latest_cqe == cq->toggle_cqe)
735 cq->pbl_toggle ^= RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
736
737 cq->latest_cqe = qed_chain_consume(&cq->pbl);
738}
739
740static inline int qedr_align_cq_entries(int entries)
741{
742 u64 size, aligned_size;
743
744 /* We allocate an extra entry that we don't report to the FW. */
745 size = (entries + 1) * QEDR_CQE_SIZE;
746 aligned_size = ALIGN(size, PAGE_SIZE);
747
748 return aligned_size / QEDR_CQE_SIZE;
749}
750
751static inline int qedr_init_user_queue(struct ib_ucontext *ib_ctx,
752 struct qedr_dev *dev,
753 struct qedr_userq *q,
754 u64 buf_addr, size_t buf_len,
755 int access, int dmasync)
756{
757 int page_cnt;
758 int rc;
759
760 q->buf_addr = buf_addr;
761 q->buf_len = buf_len;
762 q->umem = ib_umem_get(ib_ctx, q->buf_addr, q->buf_len, access, dmasync);
763 if (IS_ERR(q->umem)) {
764 DP_ERR(dev, "create user queue: failed ib_umem_get, got %ld\n",
765 PTR_ERR(q->umem));
766 return PTR_ERR(q->umem);
767 }
768
769 page_cnt = ib_umem_page_count(q->umem);
770 rc = qedr_prepare_pbl_tbl(dev, &q->pbl_info, page_cnt, 0);
771 if (rc)
772 goto err0;
773
774 q->pbl_tbl = qedr_alloc_pbl_tbl(dev, &q->pbl_info, GFP_KERNEL);
Christophe Jaillet4cd33aa2017-02-18 12:28:15 +0100775 if (IS_ERR(q->pbl_tbl)) {
776 rc = PTR_ERR(q->pbl_tbl);
Ram Amrania7efd772016-10-10 13:15:33 +0300777 goto err0;
Christophe Jaillet4cd33aa2017-02-18 12:28:15 +0100778 }
Ram Amrania7efd772016-10-10 13:15:33 +0300779
780 qedr_populate_pbls(dev, q->umem, q->pbl_tbl, &q->pbl_info);
781
782 return 0;
783
784err0:
785 ib_umem_release(q->umem);
786
787 return rc;
788}
789
790static inline void qedr_init_cq_params(struct qedr_cq *cq,
791 struct qedr_ucontext *ctx,
792 struct qedr_dev *dev, int vector,
793 int chain_entries, int page_cnt,
794 u64 pbl_ptr,
795 struct qed_rdma_create_cq_in_params
796 *params)
797{
798 memset(params, 0, sizeof(*params));
799 params->cq_handle_hi = upper_32_bits((uintptr_t)cq);
800 params->cq_handle_lo = lower_32_bits((uintptr_t)cq);
801 params->cnq_id = vector;
802 params->cq_size = chain_entries - 1;
803 params->dpi = (ctx) ? ctx->dpi : dev->dpi;
804 params->pbl_num_pages = page_cnt;
805 params->pbl_ptr = pbl_ptr;
806 params->pbl_two_level = 0;
807}
808
809static void doorbell_cq(struct qedr_cq *cq, u32 cons, u8 flags)
810{
811 /* Flush data before signalling doorbell */
812 wmb();
813 cq->db.data.agg_flags = flags;
814 cq->db.data.value = cpu_to_le32(cons);
815 writeq(cq->db.raw, cq->db_addr);
816
817 /* Make sure write would stick */
818 mmiowb();
819}
820
821int qedr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
822{
823 struct qedr_cq *cq = get_qedr_cq(ibcq);
824 unsigned long sflags;
Amrani, Ram4dd72632017-04-27 13:35:34 +0300825 struct qedr_dev *dev;
826
827 dev = get_qedr_dev(ibcq->device);
828
829 if (cq->destroyed) {
830 DP_ERR(dev,
831 "warning: arm was invoked after destroy for cq %p (icid=%d)\n",
832 cq, cq->icid);
833 return -EINVAL;
834 }
835
Ram Amrania7efd772016-10-10 13:15:33 +0300836
837 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
838 return 0;
839
840 spin_lock_irqsave(&cq->cq_lock, sflags);
841
842 cq->arm_flags = 0;
843
844 if (flags & IB_CQ_SOLICITED)
845 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_SE_CF_CMD;
846
847 if (flags & IB_CQ_NEXT_COMP)
848 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_CF_CMD;
849
850 doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
851
852 spin_unlock_irqrestore(&cq->cq_lock, sflags);
853
854 return 0;
855}
856
857struct ib_cq *qedr_create_cq(struct ib_device *ibdev,
858 const struct ib_cq_init_attr *attr,
859 struct ib_ucontext *ib_ctx, struct ib_udata *udata)
860{
861 struct qedr_ucontext *ctx = get_qedr_ucontext(ib_ctx);
862 struct qed_rdma_destroy_cq_out_params destroy_oparams;
863 struct qed_rdma_destroy_cq_in_params destroy_iparams;
864 struct qedr_dev *dev = get_qedr_dev(ibdev);
865 struct qed_rdma_create_cq_in_params params;
866 struct qedr_create_cq_ureq ureq;
867 int vector = attr->comp_vector;
868 int entries = attr->cqe;
869 struct qedr_cq *cq;
870 int chain_entries;
871 int page_cnt;
872 u64 pbl_ptr;
873 u16 icid;
874 int rc;
875
876 DP_DEBUG(dev, QEDR_MSG_INIT,
877 "create_cq: called from %s. entries=%d, vector=%d\n",
878 udata ? "User Lib" : "Kernel", entries, vector);
879
880 if (entries > QEDR_MAX_CQES) {
881 DP_ERR(dev,
882 "create cq: the number of entries %d is too high. Must be equal or below %d.\n",
883 entries, QEDR_MAX_CQES);
884 return ERR_PTR(-EINVAL);
885 }
886
887 chain_entries = qedr_align_cq_entries(entries);
888 chain_entries = min_t(int, chain_entries, QEDR_MAX_CQES);
889
890 cq = kzalloc(sizeof(*cq), GFP_KERNEL);
891 if (!cq)
892 return ERR_PTR(-ENOMEM);
893
894 if (udata) {
895 memset(&ureq, 0, sizeof(ureq));
896 if (ib_copy_from_udata(&ureq, udata, sizeof(ureq))) {
897 DP_ERR(dev,
898 "create cq: problem copying data from user space\n");
899 goto err0;
900 }
901
902 if (!ureq.len) {
903 DP_ERR(dev,
904 "create cq: cannot create a cq with 0 entries\n");
905 goto err0;
906 }
907
908 cq->cq_type = QEDR_CQ_TYPE_USER;
909
910 rc = qedr_init_user_queue(ib_ctx, dev, &cq->q, ureq.addr,
911 ureq.len, IB_ACCESS_LOCAL_WRITE, 1);
912 if (rc)
913 goto err0;
914
915 pbl_ptr = cq->q.pbl_tbl->pa;
916 page_cnt = cq->q.pbl_info.num_pbes;
Amrani, Ramc7eb3bc2016-12-22 14:40:33 +0200917
918 cq->ibcq.cqe = chain_entries;
Ram Amrania7efd772016-10-10 13:15:33 +0300919 } else {
920 cq->cq_type = QEDR_CQ_TYPE_KERNEL;
921
922 rc = dev->ops->common->chain_alloc(dev->cdev,
923 QED_CHAIN_USE_TO_CONSUME,
924 QED_CHAIN_MODE_PBL,
925 QED_CHAIN_CNT_TYPE_U32,
926 chain_entries,
927 sizeof(union rdma_cqe),
928 &cq->pbl);
929 if (rc)
930 goto err1;
931
932 page_cnt = qed_chain_get_page_cnt(&cq->pbl);
933 pbl_ptr = qed_chain_get_pbl_phys(&cq->pbl);
Amrani, Ramc7eb3bc2016-12-22 14:40:33 +0200934 cq->ibcq.cqe = cq->pbl.capacity;
Ram Amrania7efd772016-10-10 13:15:33 +0300935 }
936
937 qedr_init_cq_params(cq, ctx, dev, vector, chain_entries, page_cnt,
938 pbl_ptr, &params);
939
940 rc = dev->ops->rdma_create_cq(dev->rdma_ctx, &params, &icid);
941 if (rc)
942 goto err2;
943
944 cq->icid = icid;
945 cq->sig = QEDR_CQ_MAGIC_NUMBER;
946 spin_lock_init(&cq->cq_lock);
947
948 if (ib_ctx) {
949 rc = qedr_copy_cq_uresp(dev, cq, udata);
950 if (rc)
951 goto err3;
952 } else {
953 /* Generate doorbell address. */
954 cq->db_addr = dev->db_addr +
955 DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
956 cq->db.data.icid = cq->icid;
957 cq->db.data.params = DB_AGG_CMD_SET <<
958 RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT;
959
960 /* point to the very last element, passing it we will toggle */
961 cq->toggle_cqe = qed_chain_get_last_elem(&cq->pbl);
962 cq->pbl_toggle = RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK;
963 cq->latest_cqe = NULL;
964 consume_cqe(cq);
965 cq->cq_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
966 }
967
968 DP_DEBUG(dev, QEDR_MSG_CQ,
969 "create cq: icid=0x%0x, addr=%p, size(entries)=0x%0x\n",
970 cq->icid, cq, params.cq_size);
971
972 return &cq->ibcq;
973
974err3:
975 destroy_iparams.icid = cq->icid;
976 dev->ops->rdma_destroy_cq(dev->rdma_ctx, &destroy_iparams,
977 &destroy_oparams);
978err2:
979 if (udata)
980 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
981 else
982 dev->ops->common->chain_free(dev->cdev, &cq->pbl);
983err1:
984 if (udata)
985 ib_umem_release(cq->q.umem);
986err0:
987 kfree(cq);
988 return ERR_PTR(-EINVAL);
989}
990
991int qedr_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata)
992{
993 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
994 struct qedr_cq *cq = get_qedr_cq(ibcq);
995
996 DP_ERR(dev, "cq %p RESIZE NOT SUPPORTED\n", cq);
997
998 return 0;
999}
1000
Amrani, Ram4dd72632017-04-27 13:35:34 +03001001#define QEDR_DESTROY_CQ_MAX_ITERATIONS (10)
1002#define QEDR_DESTROY_CQ_ITER_DURATION (10)
1003
Ram Amrania7efd772016-10-10 13:15:33 +03001004int qedr_destroy_cq(struct ib_cq *ibcq)
1005{
1006 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
1007 struct qed_rdma_destroy_cq_out_params oparams;
1008 struct qed_rdma_destroy_cq_in_params iparams;
1009 struct qedr_cq *cq = get_qedr_cq(ibcq);
Amrani, Ram4dd72632017-04-27 13:35:34 +03001010 int iter;
Amrani, Ram942b3b22017-04-27 13:35:33 +03001011 int rc;
Ram Amrania7efd772016-10-10 13:15:33 +03001012
Amrani, Ram942b3b22017-04-27 13:35:33 +03001013 DP_DEBUG(dev, QEDR_MSG_CQ, "destroy cq %p (icid=%d)\n", cq, cq->icid);
Ram Amrania7efd772016-10-10 13:15:33 +03001014
Amrani, Ram4dd72632017-04-27 13:35:34 +03001015 cq->destroyed = 1;
1016
Ram Amrania7efd772016-10-10 13:15:33 +03001017 /* GSIs CQs are handled by driver, so they don't exist in the FW */
Amrani, Ram942b3b22017-04-27 13:35:33 +03001018 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
1019 goto done;
Amrani, Rama1211352016-12-22 14:40:34 +02001020
Amrani, Ram942b3b22017-04-27 13:35:33 +03001021 iparams.icid = cq->icid;
1022 rc = dev->ops->rdma_destroy_cq(dev->rdma_ctx, &iparams, &oparams);
1023 if (rc)
1024 return rc;
1025
1026 dev->ops->common->chain_free(dev->cdev, &cq->pbl);
Ram Amrania7efd772016-10-10 13:15:33 +03001027
1028 if (ibcq->uobject && ibcq->uobject->context) {
1029 qedr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
1030 ib_umem_release(cq->q.umem);
1031 }
1032
Amrani, Ram4dd72632017-04-27 13:35:34 +03001033 /* We don't want the IRQ handler to handle a non-existing CQ so we
1034 * wait until all CNQ interrupts, if any, are received. This will always
1035 * happen and will always happen very fast. If not, then a serious error
1036 * has occured. That is why we can use a long delay.
1037 * We spin for a short time so we don’t lose time on context switching
1038 * in case all the completions are handled in that span. Otherwise
1039 * we sleep for a while and check again. Since the CNQ may be
1040 * associated with (only) the current CPU we use msleep to allow the
1041 * current CPU to be freed.
1042 * The CNQ notification is increased in qedr_irq_handler().
1043 */
1044 iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
1045 while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
1046 udelay(QEDR_DESTROY_CQ_ITER_DURATION);
1047 iter--;
1048 }
1049
1050 iter = QEDR_DESTROY_CQ_MAX_ITERATIONS;
1051 while (oparams.num_cq_notif != READ_ONCE(cq->cnq_notif) && iter) {
1052 msleep(QEDR_DESTROY_CQ_ITER_DURATION);
1053 iter--;
1054 }
1055
1056 if (oparams.num_cq_notif != cq->cnq_notif)
1057 goto err;
1058
1059 /* Note that we don't need to have explicit code to wait for the
1060 * completion of the event handler because it is invoked from the EQ.
1061 * Since the destroy CQ ramrod has also been received on the EQ we can
1062 * be certain that there's no event handler in process.
1063 */
Amrani, Ram942b3b22017-04-27 13:35:33 +03001064done:
Amrani, Ram4dd72632017-04-27 13:35:34 +03001065 cq->sig = ~cq->sig;
1066
Ram Amrania7efd772016-10-10 13:15:33 +03001067 kfree(cq);
1068
1069 return 0;
Amrani, Ram4dd72632017-04-27 13:35:34 +03001070
1071err:
1072 DP_ERR(dev,
1073 "CQ %p (icid=%d) not freed, expecting %d ints but got %d ints\n",
1074 cq, cq->icid, oparams.num_cq_notif, cq->cnq_notif);
1075
1076 return -EINVAL;
Ram Amrania7efd772016-10-10 13:15:33 +03001077}
Ram Amranicecbcdd2016-10-10 13:15:34 +03001078
1079static inline int get_gid_info_from_table(struct ib_qp *ibqp,
1080 struct ib_qp_attr *attr,
1081 int attr_mask,
1082 struct qed_rdma_modify_qp_in_params
1083 *qp_params)
1084{
1085 enum rdma_network_type nw_type;
1086 struct ib_gid_attr gid_attr;
1087 union ib_gid gid;
1088 u32 ipv4_addr;
1089 int rc = 0;
1090 int i;
1091
1092 rc = ib_get_cached_gid(ibqp->device, attr->ah_attr.port_num,
1093 attr->ah_attr.grh.sgid_index, &gid, &gid_attr);
1094 if (rc)
1095 return rc;
1096
1097 if (!memcmp(&gid, &zgid, sizeof(gid)))
1098 return -ENOENT;
1099
1100 if (gid_attr.ndev) {
1101 qp_params->vlan_id = rdma_vlan_dev_vlan_id(gid_attr.ndev);
1102
1103 dev_put(gid_attr.ndev);
1104 nw_type = ib_gid_to_network_type(gid_attr.gid_type, &gid);
1105 switch (nw_type) {
1106 case RDMA_NETWORK_IPV6:
1107 memcpy(&qp_params->sgid.bytes[0], &gid.raw[0],
1108 sizeof(qp_params->sgid));
1109 memcpy(&qp_params->dgid.bytes[0],
1110 &attr->ah_attr.grh.dgid,
1111 sizeof(qp_params->dgid));
1112 qp_params->roce_mode = ROCE_V2_IPV6;
1113 SET_FIELD(qp_params->modify_flags,
1114 QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1115 break;
1116 case RDMA_NETWORK_IB:
1117 memcpy(&qp_params->sgid.bytes[0], &gid.raw[0],
1118 sizeof(qp_params->sgid));
1119 memcpy(&qp_params->dgid.bytes[0],
1120 &attr->ah_attr.grh.dgid,
1121 sizeof(qp_params->dgid));
1122 qp_params->roce_mode = ROCE_V1;
1123 break;
1124 case RDMA_NETWORK_IPV4:
1125 memset(&qp_params->sgid, 0, sizeof(qp_params->sgid));
1126 memset(&qp_params->dgid, 0, sizeof(qp_params->dgid));
1127 ipv4_addr = qedr_get_ipv4_from_gid(gid.raw);
1128 qp_params->sgid.ipv4_addr = ipv4_addr;
1129 ipv4_addr =
1130 qedr_get_ipv4_from_gid(attr->ah_attr.grh.dgid.raw);
1131 qp_params->dgid.ipv4_addr = ipv4_addr;
1132 SET_FIELD(qp_params->modify_flags,
1133 QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1);
1134 qp_params->roce_mode = ROCE_V2_IPV4;
1135 break;
1136 }
1137 }
1138
1139 for (i = 0; i < 4; i++) {
1140 qp_params->sgid.dwords[i] = ntohl(qp_params->sgid.dwords[i]);
1141 qp_params->dgid.dwords[i] = ntohl(qp_params->dgid.dwords[i]);
1142 }
1143
1144 if (qp_params->vlan_id >= VLAN_CFI_MASK)
1145 qp_params->vlan_id = 0;
1146
1147 return 0;
1148}
1149
Ram Amranicecbcdd2016-10-10 13:15:34 +03001150static int qedr_check_qp_attrs(struct ib_pd *ibpd, struct qedr_dev *dev,
1151 struct ib_qp_init_attr *attrs)
1152{
1153 struct qedr_device_attr *qattr = &dev->attr;
1154
1155 /* QP0... attrs->qp_type == IB_QPT_GSI */
1156 if (attrs->qp_type != IB_QPT_RC && attrs->qp_type != IB_QPT_GSI) {
1157 DP_DEBUG(dev, QEDR_MSG_QP,
1158 "create qp: unsupported qp type=0x%x requested\n",
1159 attrs->qp_type);
1160 return -EINVAL;
1161 }
1162
1163 if (attrs->cap.max_send_wr > qattr->max_sqe) {
1164 DP_ERR(dev,
1165 "create qp: cannot create a SQ with %d elements (max_send_wr=0x%x)\n",
1166 attrs->cap.max_send_wr, qattr->max_sqe);
1167 return -EINVAL;
1168 }
1169
1170 if (attrs->cap.max_inline_data > qattr->max_inline) {
1171 DP_ERR(dev,
1172 "create qp: unsupported inline data size=0x%x requested (max_inline=0x%x)\n",
1173 attrs->cap.max_inline_data, qattr->max_inline);
1174 return -EINVAL;
1175 }
1176
1177 if (attrs->cap.max_send_sge > qattr->max_sge) {
1178 DP_ERR(dev,
1179 "create qp: unsupported send_sge=0x%x requested (max_send_sge=0x%x)\n",
1180 attrs->cap.max_send_sge, qattr->max_sge);
1181 return -EINVAL;
1182 }
1183
1184 if (attrs->cap.max_recv_sge > qattr->max_sge) {
1185 DP_ERR(dev,
1186 "create qp: unsupported recv_sge=0x%x requested (max_recv_sge=0x%x)\n",
1187 attrs->cap.max_recv_sge, qattr->max_sge);
1188 return -EINVAL;
1189 }
1190
1191 /* Unprivileged user space cannot create special QP */
1192 if (ibpd->uobject && attrs->qp_type == IB_QPT_GSI) {
1193 DP_ERR(dev,
1194 "create qp: userspace can't create special QPs of type=0x%x\n",
1195 attrs->qp_type);
1196 return -EINVAL;
1197 }
1198
1199 return 0;
1200}
1201
1202static void qedr_copy_rq_uresp(struct qedr_create_qp_uresp *uresp,
1203 struct qedr_qp *qp)
1204{
1205 uresp->rq_db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1206 uresp->rq_icid = qp->icid;
1207}
1208
1209static void qedr_copy_sq_uresp(struct qedr_create_qp_uresp *uresp,
1210 struct qedr_qp *qp)
1211{
1212 uresp->sq_db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1213 uresp->sq_icid = qp->icid + 1;
1214}
1215
1216static int qedr_copy_qp_uresp(struct qedr_dev *dev,
1217 struct qedr_qp *qp, struct ib_udata *udata)
1218{
1219 struct qedr_create_qp_uresp uresp;
1220 int rc;
1221
1222 memset(&uresp, 0, sizeof(uresp));
1223 qedr_copy_sq_uresp(&uresp, qp);
1224 qedr_copy_rq_uresp(&uresp, qp);
1225
1226 uresp.atomic_supported = dev->atomic_cap != IB_ATOMIC_NONE;
1227 uresp.qp_id = qp->qp_id;
1228
1229 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1230 if (rc)
1231 DP_ERR(dev,
1232 "create qp: failed a copy to user space with qp icid=0x%x.\n",
1233 qp->icid);
1234
1235 return rc;
1236}
1237
Amrani, Ramdf158562016-12-22 14:52:24 +02001238static void qedr_set_common_qp_params(struct qedr_dev *dev,
1239 struct qedr_qp *qp,
1240 struct qedr_pd *pd,
1241 struct ib_qp_init_attr *attrs)
Ram Amranicecbcdd2016-10-10 13:15:34 +03001242{
Ram Amranicecbcdd2016-10-10 13:15:34 +03001243 spin_lock_init(&qp->q_lock);
Amrani, Ramdf158562016-12-22 14:52:24 +02001244 qp->pd = pd;
Ram Amranicecbcdd2016-10-10 13:15:34 +03001245 qp->qp_type = attrs->qp_type;
1246 qp->max_inline_data = attrs->cap.max_inline_data;
1247 qp->sq.max_sges = attrs->cap.max_send_sge;
1248 qp->state = QED_ROCE_QP_STATE_RESET;
1249 qp->signaled = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR) ? true : false;
1250 qp->sq_cq = get_qedr_cq(attrs->send_cq);
1251 qp->rq_cq = get_qedr_cq(attrs->recv_cq);
1252 qp->dev = dev;
Amrani, Ramdf158562016-12-22 14:52:24 +02001253 qp->rq.max_sges = attrs->cap.max_recv_sge;
Ram Amranicecbcdd2016-10-10 13:15:34 +03001254
1255 DP_DEBUG(dev, QEDR_MSG_QP,
Amrani, Ramdf158562016-12-22 14:52:24 +02001256 "RQ params:\trq_max_sges = %d, rq_cq_id = %d\n",
1257 qp->rq.max_sges, qp->rq_cq->icid);
1258 DP_DEBUG(dev, QEDR_MSG_QP,
Ram Amranicecbcdd2016-10-10 13:15:34 +03001259 "QP params:\tpd = %d, qp_type = %d, max_inline_data = %d, state = %d, signaled = %d, use_srq=%d\n",
1260 pd->pd_id, qp->qp_type, qp->max_inline_data,
1261 qp->state, qp->signaled, (attrs->srq) ? 1 : 0);
1262 DP_DEBUG(dev, QEDR_MSG_QP,
1263 "SQ params:\tsq_max_sges = %d, sq_cq_id = %d\n",
1264 qp->sq.max_sges, qp->sq_cq->icid);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001265}
1266
Amrani, Ramdf158562016-12-22 14:52:24 +02001267static void qedr_set_roce_db_info(struct qedr_dev *dev, struct qedr_qp *qp)
Ram Amranicecbcdd2016-10-10 13:15:34 +03001268{
1269 qp->sq.db = dev->db_addr +
1270 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
1271 qp->sq.db_data.data.icid = qp->icid + 1;
Ram Amranicecbcdd2016-10-10 13:15:34 +03001272 qp->rq.db = dev->db_addr +
1273 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
1274 qp->rq.db_data.data.icid = qp->icid;
1275}
1276
Amrani, Ramdf158562016-12-22 14:52:24 +02001277static inline void
1278qedr_init_common_qp_in_params(struct qedr_dev *dev,
1279 struct qedr_pd *pd,
Ram Amranicecbcdd2016-10-10 13:15:34 +03001280 struct qedr_qp *qp,
1281 struct ib_qp_init_attr *attrs,
Amrani, Ramdf158562016-12-22 14:52:24 +02001282 bool fmr_and_reserved_lkey,
Ram Amranicecbcdd2016-10-10 13:15:34 +03001283 struct qed_rdma_create_qp_in_params *params)
1284{
Amrani, Ramdf158562016-12-22 14:52:24 +02001285 /* QP handle to be written in an async event */
1286 params->qp_handle_async_lo = lower_32_bits((uintptr_t) qp);
1287 params->qp_handle_async_hi = upper_32_bits((uintptr_t) qp);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001288
Amrani, Ramdf158562016-12-22 14:52:24 +02001289 params->signal_all = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR);
1290 params->fmr_and_reserved_lkey = fmr_and_reserved_lkey;
1291 params->pd = pd->pd_id;
1292 params->dpi = pd->uctx ? pd->uctx->dpi : dev->dpi;
1293 params->sq_cq_id = get_qedr_cq(attrs->send_cq)->icid;
1294 params->stats_queue = 0;
1295 params->rq_cq_id = get_qedr_cq(attrs->recv_cq)->icid;
1296 params->srq_id = 0;
1297 params->use_srq = false;
Ram Amranicecbcdd2016-10-10 13:15:34 +03001298}
1299
Amrani, Ramdf158562016-12-22 14:52:24 +02001300static inline void qedr_qp_user_print(struct qedr_dev *dev, struct qedr_qp *qp)
Ram Amranicecbcdd2016-10-10 13:15:34 +03001301{
Amrani, Ramdf158562016-12-22 14:52:24 +02001302 DP_DEBUG(dev, QEDR_MSG_QP, "create qp: successfully created user QP. "
1303 "qp=%p. "
1304 "sq_addr=0x%llx, "
1305 "sq_len=%zd, "
1306 "rq_addr=0x%llx, "
1307 "rq_len=%zd"
1308 "\n",
1309 qp,
1310 qp->usq.buf_addr,
1311 qp->usq.buf_len, qp->urq.buf_addr, qp->urq.buf_len);
1312}
1313
1314static void qedr_cleanup_user(struct qedr_dev *dev, struct qedr_qp *qp)
1315{
1316 if (qp->usq.umem)
1317 ib_umem_release(qp->usq.umem);
1318 qp->usq.umem = NULL;
1319
1320 if (qp->urq.umem)
1321 ib_umem_release(qp->urq.umem);
1322 qp->urq.umem = NULL;
1323}
1324
1325static int qedr_create_user_qp(struct qedr_dev *dev,
1326 struct qedr_qp *qp,
1327 struct ib_pd *ibpd,
1328 struct ib_udata *udata,
1329 struct ib_qp_init_attr *attrs)
1330{
1331 struct qed_rdma_create_qp_in_params in_params;
1332 struct qed_rdma_create_qp_out_params out_params;
1333 struct qedr_pd *pd = get_qedr_pd(ibpd);
1334 struct ib_ucontext *ib_ctx = NULL;
1335 struct qedr_ucontext *ctx = NULL;
1336 struct qedr_create_qp_ureq ureq;
1337 int rc = -EINVAL;
1338
1339 ib_ctx = ibpd->uobject->context;
1340 ctx = get_qedr_ucontext(ib_ctx);
1341
1342 memset(&ureq, 0, sizeof(ureq));
1343 rc = ib_copy_from_udata(&ureq, udata, sizeof(ureq));
1344 if (rc) {
1345 DP_ERR(dev, "Problem copying data from user space\n");
1346 return rc;
1347 }
1348
1349 /* SQ - read access only (0), dma sync not required (0) */
1350 rc = qedr_init_user_queue(ib_ctx, dev, &qp->usq, ureq.sq_addr,
1351 ureq.sq_len, 0, 0);
1352 if (rc)
1353 return rc;
1354
1355 /* RQ - read access only (0), dma sync not required (0) */
1356 rc = qedr_init_user_queue(ib_ctx, dev, &qp->urq, ureq.rq_addr,
1357 ureq.rq_len, 0, 0);
1358
1359 if (rc)
1360 return rc;
1361
1362 memset(&in_params, 0, sizeof(in_params));
1363 qedr_init_common_qp_in_params(dev, pd, qp, attrs, false, &in_params);
1364 in_params.qp_handle_lo = ureq.qp_handle_lo;
1365 in_params.qp_handle_hi = ureq.qp_handle_hi;
1366 in_params.sq_num_pages = qp->usq.pbl_info.num_pbes;
1367 in_params.sq_pbl_ptr = qp->usq.pbl_tbl->pa;
1368 in_params.rq_num_pages = qp->urq.pbl_info.num_pbes;
1369 in_params.rq_pbl_ptr = qp->urq.pbl_tbl->pa;
1370
1371 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1372 &in_params, &out_params);
1373
1374 if (!qp->qed_qp) {
1375 rc = -ENOMEM;
1376 goto err1;
1377 }
1378
1379 qp->qp_id = out_params.qp_id;
1380 qp->icid = out_params.icid;
1381
1382 rc = qedr_copy_qp_uresp(dev, qp, udata);
1383 if (rc)
1384 goto err;
1385
1386 qedr_qp_user_print(dev, qp);
1387
1388 return 0;
1389err:
1390 rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
1391 if (rc)
1392 DP_ERR(dev, "create qp: fatal fault. rc=%d", rc);
1393
1394err1:
1395 qedr_cleanup_user(dev, qp);
1396 return rc;
1397}
1398
1399static int
1400qedr_roce_create_kernel_qp(struct qedr_dev *dev,
1401 struct qedr_qp *qp,
1402 struct qed_rdma_create_qp_in_params *in_params,
1403 u32 n_sq_elems, u32 n_rq_elems)
1404{
1405 struct qed_rdma_create_qp_out_params out_params;
Ram Amranicecbcdd2016-10-10 13:15:34 +03001406 int rc;
1407
Ram Amranicecbcdd2016-10-10 13:15:34 +03001408 rc = dev->ops->common->chain_alloc(dev->cdev,
1409 QED_CHAIN_USE_TO_PRODUCE,
1410 QED_CHAIN_MODE_PBL,
1411 QED_CHAIN_CNT_TYPE_U32,
1412 n_sq_elems,
1413 QEDR_SQE_ELEMENT_SIZE,
1414 &qp->sq.pbl);
Amrani, Ramdf158562016-12-22 14:52:24 +02001415
1416 if (rc)
Ram Amranicecbcdd2016-10-10 13:15:34 +03001417 return rc;
Ram Amranicecbcdd2016-10-10 13:15:34 +03001418
Amrani, Ramdf158562016-12-22 14:52:24 +02001419 in_params->sq_num_pages = qed_chain_get_page_cnt(&qp->sq.pbl);
1420 in_params->sq_pbl_ptr = qed_chain_get_pbl_phys(&qp->sq.pbl);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001421
Ram Amranicecbcdd2016-10-10 13:15:34 +03001422 rc = dev->ops->common->chain_alloc(dev->cdev,
1423 QED_CHAIN_USE_TO_CONSUME_PRODUCE,
1424 QED_CHAIN_MODE_PBL,
1425 QED_CHAIN_CNT_TYPE_U32,
1426 n_rq_elems,
1427 QEDR_RQE_ELEMENT_SIZE,
1428 &qp->rq.pbl);
Amrani, Ramdf158562016-12-22 14:52:24 +02001429 if (rc)
1430 return rc;
Ram Amranicecbcdd2016-10-10 13:15:34 +03001431
Amrani, Ramdf158562016-12-22 14:52:24 +02001432 in_params->rq_num_pages = qed_chain_get_page_cnt(&qp->rq.pbl);
1433 in_params->rq_pbl_ptr = qed_chain_get_pbl_phys(&qp->rq.pbl);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001434
Amrani, Ramdf158562016-12-22 14:52:24 +02001435 qp->qed_qp = dev->ops->rdma_create_qp(dev->rdma_ctx,
1436 in_params, &out_params);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001437
Amrani, Ramdf158562016-12-22 14:52:24 +02001438 if (!qp->qed_qp)
1439 return -EINVAL;
1440
1441 qp->qp_id = out_params.qp_id;
1442 qp->icid = out_params.icid;
1443
1444 qedr_set_roce_db_info(dev, qp);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001445
1446 return 0;
1447}
1448
Amrani, Ramdf158562016-12-22 14:52:24 +02001449static void qedr_cleanup_kernel(struct qedr_dev *dev, struct qedr_qp *qp)
Ram Amranicecbcdd2016-10-10 13:15:34 +03001450{
Amrani, Ramdf158562016-12-22 14:52:24 +02001451 dev->ops->common->chain_free(dev->cdev, &qp->sq.pbl);
1452 kfree(qp->wqe_wr_id);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001453
Amrani, Ramdf158562016-12-22 14:52:24 +02001454 dev->ops->common->chain_free(dev->cdev, &qp->rq.pbl);
1455 kfree(qp->rqe_wr_id);
1456}
Ram Amranicecbcdd2016-10-10 13:15:34 +03001457
Amrani, Ramdf158562016-12-22 14:52:24 +02001458static int qedr_create_kernel_qp(struct qedr_dev *dev,
1459 struct qedr_qp *qp,
1460 struct ib_pd *ibpd,
1461 struct ib_qp_init_attr *attrs)
1462{
1463 struct qed_rdma_create_qp_in_params in_params;
1464 struct qedr_pd *pd = get_qedr_pd(ibpd);
1465 int rc = -EINVAL;
1466 u32 n_rq_elems;
1467 u32 n_sq_elems;
1468 u32 n_sq_entries;
1469
1470 memset(&in_params, 0, sizeof(in_params));
1471
1472 /* A single work request may take up to QEDR_MAX_SQ_WQE_SIZE elements in
1473 * the ring. The ring should allow at least a single WR, even if the
1474 * user requested none, due to allocation issues.
1475 * We should add an extra WR since the prod and cons indices of
1476 * wqe_wr_id are managed in such a way that the WQ is considered full
1477 * when (prod+1)%max_wr==cons. We currently don't do that because we
1478 * double the number of entries due an iSER issue that pushes far more
1479 * WRs than indicated. If we decline its ib_post_send() then we get
1480 * error prints in the dmesg we'd like to avoid.
1481 */
1482 qp->sq.max_wr = min_t(u32, attrs->cap.max_send_wr * dev->wq_multiplier,
1483 dev->attr.max_sqe);
1484
1485 qp->wqe_wr_id = kzalloc(qp->sq.max_wr * sizeof(*qp->wqe_wr_id),
1486 GFP_KERNEL);
1487 if (!qp->wqe_wr_id) {
1488 DP_ERR(dev, "create qp: failed SQ shadow memory allocation\n");
1489 return -ENOMEM;
Ram Amranicecbcdd2016-10-10 13:15:34 +03001490 }
Ram Amranicecbcdd2016-10-10 13:15:34 +03001491
Amrani, Ramdf158562016-12-22 14:52:24 +02001492 /* QP handle to be written in CQE */
1493 in_params.qp_handle_lo = lower_32_bits((uintptr_t) qp);
1494 in_params.qp_handle_hi = upper_32_bits((uintptr_t) qp);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001495
Amrani, Ramdf158562016-12-22 14:52:24 +02001496 /* A single work request may take up to QEDR_MAX_RQ_WQE_SIZE elements in
1497 * the ring. There ring should allow at least a single WR, even if the
1498 * user requested none, due to allocation issues.
1499 */
1500 qp->rq.max_wr = (u16) max_t(u32, attrs->cap.max_recv_wr, 1);
1501
1502 /* Allocate driver internal RQ array */
1503 qp->rqe_wr_id = kzalloc(qp->rq.max_wr * sizeof(*qp->rqe_wr_id),
1504 GFP_KERNEL);
1505 if (!qp->rqe_wr_id) {
1506 DP_ERR(dev,
1507 "create qp: failed RQ shadow memory allocation\n");
1508 kfree(qp->wqe_wr_id);
1509 return -ENOMEM;
Ram Amranicecbcdd2016-10-10 13:15:34 +03001510 }
Ram Amranicecbcdd2016-10-10 13:15:34 +03001511
Amrani, Ramdf158562016-12-22 14:52:24 +02001512 qedr_init_common_qp_in_params(dev, pd, qp, attrs, true, &in_params);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001513
Amrani, Ramdf158562016-12-22 14:52:24 +02001514 n_sq_entries = attrs->cap.max_send_wr;
1515 n_sq_entries = min_t(u32, n_sq_entries, dev->attr.max_sqe);
1516 n_sq_entries = max_t(u32, n_sq_entries, 1);
1517 n_sq_elems = n_sq_entries * QEDR_MAX_SQE_ELEMENTS_PER_SQE;
Ram Amranicecbcdd2016-10-10 13:15:34 +03001518
Amrani, Ramdf158562016-12-22 14:52:24 +02001519 n_rq_elems = qp->rq.max_wr * QEDR_MAX_RQE_ELEMENTS_PER_RQE;
1520
1521 rc = qedr_roce_create_kernel_qp(dev, qp, &in_params,
1522 n_sq_elems, n_rq_elems);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001523 if (rc)
Amrani, Ramdf158562016-12-22 14:52:24 +02001524 qedr_cleanup_kernel(dev, qp);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001525
1526 return rc;
1527}
1528
1529struct ib_qp *qedr_create_qp(struct ib_pd *ibpd,
1530 struct ib_qp_init_attr *attrs,
1531 struct ib_udata *udata)
1532{
1533 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001534 struct qedr_pd *pd = get_qedr_pd(ibpd);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001535 struct qedr_qp *qp;
Wei Yongjun181d8012016-10-28 16:33:47 +00001536 struct ib_qp *ibqp;
Ram Amranicecbcdd2016-10-10 13:15:34 +03001537 int rc = 0;
1538
1539 DP_DEBUG(dev, QEDR_MSG_QP, "create qp: called from %s, pd=%p\n",
1540 udata ? "user library" : "kernel", pd);
1541
1542 rc = qedr_check_qp_attrs(ibpd, dev, attrs);
1543 if (rc)
1544 return ERR_PTR(rc);
1545
Wei Yongjun181d8012016-10-28 16:33:47 +00001546 if (attrs->srq)
1547 return ERR_PTR(-EINVAL);
1548
Ram Amranicecbcdd2016-10-10 13:15:34 +03001549 DP_DEBUG(dev, QEDR_MSG_QP,
Amrani, Ramdf158562016-12-22 14:52:24 +02001550 "create qp: called from %s, event_handler=%p, eepd=%p sq_cq=%p, sq_icid=%d, rq_cq=%p, rq_icid=%d\n",
1551 udata ? "user library" : "kernel", attrs->event_handler, pd,
Ram Amranicecbcdd2016-10-10 13:15:34 +03001552 get_qedr_cq(attrs->send_cq),
1553 get_qedr_cq(attrs->send_cq)->icid,
1554 get_qedr_cq(attrs->recv_cq),
1555 get_qedr_cq(attrs->recv_cq)->icid);
1556
Amrani, Ramdf158562016-12-22 14:52:24 +02001557 qp = kzalloc(sizeof(*qp), GFP_KERNEL);
1558 if (!qp) {
1559 DP_ERR(dev, "create qp: failed allocating memory\n");
1560 return ERR_PTR(-ENOMEM);
1561 }
1562
1563 qedr_set_common_qp_params(dev, qp, pd, attrs);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001564
Ram Amrani04886772016-10-10 13:15:38 +03001565 if (attrs->qp_type == IB_QPT_GSI) {
Wei Yongjun181d8012016-10-28 16:33:47 +00001566 ibqp = qedr_create_gsi_qp(dev, attrs, qp);
1567 if (IS_ERR(ibqp))
1568 kfree(qp);
1569 return ibqp;
Ram Amrani04886772016-10-10 13:15:38 +03001570 }
1571
Amrani, Ramdf158562016-12-22 14:52:24 +02001572 if (udata)
1573 rc = qedr_create_user_qp(dev, qp, ibpd, udata, attrs);
1574 else
1575 rc = qedr_create_kernel_qp(dev, qp, ibpd, attrs);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001576
Amrani, Ramdf158562016-12-22 14:52:24 +02001577 if (rc)
1578 goto err;
Ram Amranicecbcdd2016-10-10 13:15:34 +03001579
Ram Amranicecbcdd2016-10-10 13:15:34 +03001580 qp->ibqp.qp_num = qp->qp_id;
1581
Ram Amranicecbcdd2016-10-10 13:15:34 +03001582 return &qp->ibqp;
1583
Amrani, Ramdf158562016-12-22 14:52:24 +02001584err:
Ram Amranicecbcdd2016-10-10 13:15:34 +03001585 kfree(qp);
1586
1587 return ERR_PTR(-EFAULT);
1588}
1589
Ram Amrani27a4b1a2017-01-24 13:51:39 +02001590static enum ib_qp_state qedr_get_ibqp_state(enum qed_roce_qp_state qp_state)
Ram Amranicecbcdd2016-10-10 13:15:34 +03001591{
1592 switch (qp_state) {
1593 case QED_ROCE_QP_STATE_RESET:
1594 return IB_QPS_RESET;
1595 case QED_ROCE_QP_STATE_INIT:
1596 return IB_QPS_INIT;
1597 case QED_ROCE_QP_STATE_RTR:
1598 return IB_QPS_RTR;
1599 case QED_ROCE_QP_STATE_RTS:
1600 return IB_QPS_RTS;
1601 case QED_ROCE_QP_STATE_SQD:
1602 return IB_QPS_SQD;
1603 case QED_ROCE_QP_STATE_ERR:
1604 return IB_QPS_ERR;
1605 case QED_ROCE_QP_STATE_SQE:
1606 return IB_QPS_SQE;
1607 }
1608 return IB_QPS_ERR;
1609}
1610
Ram Amrani27a4b1a2017-01-24 13:51:39 +02001611static enum qed_roce_qp_state qedr_get_state_from_ibqp(
1612 enum ib_qp_state qp_state)
Ram Amranicecbcdd2016-10-10 13:15:34 +03001613{
1614 switch (qp_state) {
1615 case IB_QPS_RESET:
1616 return QED_ROCE_QP_STATE_RESET;
1617 case IB_QPS_INIT:
1618 return QED_ROCE_QP_STATE_INIT;
1619 case IB_QPS_RTR:
1620 return QED_ROCE_QP_STATE_RTR;
1621 case IB_QPS_RTS:
1622 return QED_ROCE_QP_STATE_RTS;
1623 case IB_QPS_SQD:
1624 return QED_ROCE_QP_STATE_SQD;
1625 case IB_QPS_ERR:
1626 return QED_ROCE_QP_STATE_ERR;
1627 default:
1628 return QED_ROCE_QP_STATE_ERR;
1629 }
1630}
1631
1632static void qedr_reset_qp_hwq_info(struct qedr_qp_hwq_info *qph)
1633{
1634 qed_chain_reset(&qph->pbl);
1635 qph->prod = 0;
1636 qph->cons = 0;
1637 qph->wqe_cons = 0;
1638 qph->db_data.data.value = cpu_to_le16(0);
1639}
1640
1641static int qedr_update_qp_state(struct qedr_dev *dev,
1642 struct qedr_qp *qp,
1643 enum qed_roce_qp_state new_state)
1644{
1645 int status = 0;
1646
1647 if (new_state == qp->state)
Ram Amrani865cea42017-01-24 13:50:34 +02001648 return 0;
Ram Amranicecbcdd2016-10-10 13:15:34 +03001649
1650 switch (qp->state) {
1651 case QED_ROCE_QP_STATE_RESET:
1652 switch (new_state) {
1653 case QED_ROCE_QP_STATE_INIT:
1654 qp->prev_wqe_size = 0;
1655 qedr_reset_qp_hwq_info(&qp->sq);
1656 qedr_reset_qp_hwq_info(&qp->rq);
1657 break;
1658 default:
1659 status = -EINVAL;
1660 break;
1661 };
1662 break;
1663 case QED_ROCE_QP_STATE_INIT:
1664 switch (new_state) {
1665 case QED_ROCE_QP_STATE_RTR:
1666 /* Update doorbell (in case post_recv was
1667 * done before move to RTR)
1668 */
1669 wmb();
1670 writel(qp->rq.db_data.raw, qp->rq.db);
1671 /* Make sure write takes effect */
1672 mmiowb();
1673 break;
1674 case QED_ROCE_QP_STATE_ERR:
1675 break;
1676 default:
1677 /* Invalid state change. */
1678 status = -EINVAL;
1679 break;
1680 };
1681 break;
1682 case QED_ROCE_QP_STATE_RTR:
1683 /* RTR->XXX */
1684 switch (new_state) {
1685 case QED_ROCE_QP_STATE_RTS:
1686 break;
1687 case QED_ROCE_QP_STATE_ERR:
1688 break;
1689 default:
1690 /* Invalid state change. */
1691 status = -EINVAL;
1692 break;
1693 };
1694 break;
1695 case QED_ROCE_QP_STATE_RTS:
1696 /* RTS->XXX */
1697 switch (new_state) {
1698 case QED_ROCE_QP_STATE_SQD:
1699 break;
1700 case QED_ROCE_QP_STATE_ERR:
1701 break;
1702 default:
1703 /* Invalid state change. */
1704 status = -EINVAL;
1705 break;
1706 };
1707 break;
1708 case QED_ROCE_QP_STATE_SQD:
1709 /* SQD->XXX */
1710 switch (new_state) {
1711 case QED_ROCE_QP_STATE_RTS:
1712 case QED_ROCE_QP_STATE_ERR:
1713 break;
1714 default:
1715 /* Invalid state change. */
1716 status = -EINVAL;
1717 break;
1718 };
1719 break;
1720 case QED_ROCE_QP_STATE_ERR:
1721 /* ERR->XXX */
1722 switch (new_state) {
1723 case QED_ROCE_QP_STATE_RESET:
Ram Amrani933e6dc2017-01-24 13:50:38 +02001724 if ((qp->rq.prod != qp->rq.cons) ||
1725 (qp->sq.prod != qp->sq.cons)) {
1726 DP_NOTICE(dev,
1727 "Error->Reset with rq/sq not empty rq.prod=%x rq.cons=%x sq.prod=%x sq.cons=%x\n",
1728 qp->rq.prod, qp->rq.cons, qp->sq.prod,
1729 qp->sq.cons);
1730 status = -EINVAL;
1731 }
Ram Amranicecbcdd2016-10-10 13:15:34 +03001732 break;
1733 default:
1734 status = -EINVAL;
1735 break;
1736 };
1737 break;
1738 default:
1739 status = -EINVAL;
1740 break;
1741 };
1742
1743 return status;
1744}
1745
1746int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
1747 int attr_mask, struct ib_udata *udata)
1748{
1749 struct qedr_qp *qp = get_qedr_qp(ibqp);
1750 struct qed_rdma_modify_qp_in_params qp_params = { 0 };
1751 struct qedr_dev *dev = get_qedr_dev(&qp->dev->ibdev);
1752 enum ib_qp_state old_qp_state, new_qp_state;
1753 int rc = 0;
1754
1755 DP_DEBUG(dev, QEDR_MSG_QP,
1756 "modify qp: qp %p attr_mask=0x%x, state=%d", qp, attr_mask,
1757 attr->qp_state);
1758
1759 old_qp_state = qedr_get_ibqp_state(qp->state);
1760 if (attr_mask & IB_QP_STATE)
1761 new_qp_state = attr->qp_state;
1762 else
1763 new_qp_state = old_qp_state;
1764
1765 if (!ib_modify_qp_is_ok
1766 (old_qp_state, new_qp_state, ibqp->qp_type, attr_mask,
1767 IB_LINK_LAYER_ETHERNET)) {
1768 DP_ERR(dev,
1769 "modify qp: invalid attribute mask=0x%x specified for\n"
1770 "qpn=0x%x of type=0x%x old_qp_state=0x%x, new_qp_state=0x%x\n",
1771 attr_mask, qp->qp_id, ibqp->qp_type, old_qp_state,
1772 new_qp_state);
1773 rc = -EINVAL;
1774 goto err;
1775 }
1776
1777 /* Translate the masks... */
1778 if (attr_mask & IB_QP_STATE) {
1779 SET_FIELD(qp_params.modify_flags,
1780 QED_RDMA_MODIFY_QP_VALID_NEW_STATE, 1);
1781 qp_params.new_state = qedr_get_state_from_ibqp(attr->qp_state);
1782 }
1783
1784 if (attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY)
1785 qp_params.sqd_async = true;
1786
1787 if (attr_mask & IB_QP_PKEY_INDEX) {
1788 SET_FIELD(qp_params.modify_flags,
1789 QED_ROCE_MODIFY_QP_VALID_PKEY, 1);
1790 if (attr->pkey_index >= QEDR_ROCE_PKEY_TABLE_LEN) {
1791 rc = -EINVAL;
1792 goto err;
1793 }
1794
1795 qp_params.pkey = QEDR_ROCE_PKEY_DEFAULT;
1796 }
1797
1798 if (attr_mask & IB_QP_QKEY)
1799 qp->qkey = attr->qkey;
1800
1801 if (attr_mask & IB_QP_ACCESS_FLAGS) {
1802 SET_FIELD(qp_params.modify_flags,
1803 QED_RDMA_MODIFY_QP_VALID_RDMA_OPS_EN, 1);
1804 qp_params.incoming_rdma_read_en = attr->qp_access_flags &
1805 IB_ACCESS_REMOTE_READ;
1806 qp_params.incoming_rdma_write_en = attr->qp_access_flags &
1807 IB_ACCESS_REMOTE_WRITE;
1808 qp_params.incoming_atomic_en = attr->qp_access_flags &
1809 IB_ACCESS_REMOTE_ATOMIC;
1810 }
1811
1812 if (attr_mask & (IB_QP_AV | IB_QP_PATH_MTU)) {
1813 if (attr_mask & IB_QP_PATH_MTU) {
1814 if (attr->path_mtu < IB_MTU_256 ||
1815 attr->path_mtu > IB_MTU_4096) {
1816 pr_err("error: Only MTU sizes of 256, 512, 1024, 2048 and 4096 are supported by RoCE\n");
1817 rc = -EINVAL;
1818 goto err;
1819 }
1820 qp->mtu = min(ib_mtu_enum_to_int(attr->path_mtu),
1821 ib_mtu_enum_to_int(iboe_get_mtu
1822 (dev->ndev->mtu)));
1823 }
1824
1825 if (!qp->mtu) {
1826 qp->mtu =
1827 ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
1828 pr_err("Fixing zeroed MTU to qp->mtu = %d\n", qp->mtu);
1829 }
1830
1831 SET_FIELD(qp_params.modify_flags,
1832 QED_ROCE_MODIFY_QP_VALID_ADDRESS_VECTOR, 1);
1833
1834 qp_params.traffic_class_tos = attr->ah_attr.grh.traffic_class;
1835 qp_params.flow_label = attr->ah_attr.grh.flow_label;
1836 qp_params.hop_limit_ttl = attr->ah_attr.grh.hop_limit;
1837
1838 qp->sgid_idx = attr->ah_attr.grh.sgid_index;
1839
1840 rc = get_gid_info_from_table(ibqp, attr, attr_mask, &qp_params);
1841 if (rc) {
1842 DP_ERR(dev,
1843 "modify qp: problems with GID index %d (rc=%d)\n",
1844 attr->ah_attr.grh.sgid_index, rc);
1845 return rc;
1846 }
1847
1848 rc = qedr_get_dmac(dev, &attr->ah_attr,
1849 qp_params.remote_mac_addr);
1850 if (rc)
1851 return rc;
1852
1853 qp_params.use_local_mac = true;
1854 ether_addr_copy(qp_params.local_mac_addr, dev->ndev->dev_addr);
1855
1856 DP_DEBUG(dev, QEDR_MSG_QP, "dgid=%x:%x:%x:%x\n",
1857 qp_params.dgid.dwords[0], qp_params.dgid.dwords[1],
1858 qp_params.dgid.dwords[2], qp_params.dgid.dwords[3]);
1859 DP_DEBUG(dev, QEDR_MSG_QP, "sgid=%x:%x:%x:%x\n",
1860 qp_params.sgid.dwords[0], qp_params.sgid.dwords[1],
1861 qp_params.sgid.dwords[2], qp_params.sgid.dwords[3]);
1862 DP_DEBUG(dev, QEDR_MSG_QP, "remote_mac=[%pM]\n",
1863 qp_params.remote_mac_addr);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001864
1865 qp_params.mtu = qp->mtu;
1866 qp_params.lb_indication = false;
1867 }
1868
1869 if (!qp_params.mtu) {
1870 /* Stay with current MTU */
1871 if (qp->mtu)
1872 qp_params.mtu = qp->mtu;
1873 else
1874 qp_params.mtu =
1875 ib_mtu_enum_to_int(iboe_get_mtu(dev->ndev->mtu));
1876 }
1877
1878 if (attr_mask & IB_QP_TIMEOUT) {
1879 SET_FIELD(qp_params.modify_flags,
1880 QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1);
1881
1882 qp_params.ack_timeout = attr->timeout;
1883 if (attr->timeout) {
1884 u32 temp;
1885
1886 temp = 4096 * (1UL << attr->timeout) / 1000 / 1000;
1887 /* FW requires [msec] */
1888 qp_params.ack_timeout = temp;
1889 } else {
1890 /* Infinite */
1891 qp_params.ack_timeout = 0;
1892 }
1893 }
1894 if (attr_mask & IB_QP_RETRY_CNT) {
1895 SET_FIELD(qp_params.modify_flags,
1896 QED_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1);
1897 qp_params.retry_cnt = attr->retry_cnt;
1898 }
1899
1900 if (attr_mask & IB_QP_RNR_RETRY) {
1901 SET_FIELD(qp_params.modify_flags,
1902 QED_ROCE_MODIFY_QP_VALID_RNR_RETRY_CNT, 1);
1903 qp_params.rnr_retry_cnt = attr->rnr_retry;
1904 }
1905
1906 if (attr_mask & IB_QP_RQ_PSN) {
1907 SET_FIELD(qp_params.modify_flags,
1908 QED_ROCE_MODIFY_QP_VALID_RQ_PSN, 1);
1909 qp_params.rq_psn = attr->rq_psn;
1910 qp->rq_psn = attr->rq_psn;
1911 }
1912
1913 if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC) {
1914 if (attr->max_rd_atomic > dev->attr.max_qp_req_rd_atomic_resc) {
1915 rc = -EINVAL;
1916 DP_ERR(dev,
1917 "unsupported max_rd_atomic=%d, supported=%d\n",
1918 attr->max_rd_atomic,
1919 dev->attr.max_qp_req_rd_atomic_resc);
1920 goto err;
1921 }
1922
1923 SET_FIELD(qp_params.modify_flags,
1924 QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_REQ, 1);
1925 qp_params.max_rd_atomic_req = attr->max_rd_atomic;
1926 }
1927
1928 if (attr_mask & IB_QP_MIN_RNR_TIMER) {
1929 SET_FIELD(qp_params.modify_flags,
1930 QED_ROCE_MODIFY_QP_VALID_MIN_RNR_NAK_TIMER, 1);
1931 qp_params.min_rnr_nak_timer = attr->min_rnr_timer;
1932 }
1933
1934 if (attr_mask & IB_QP_SQ_PSN) {
1935 SET_FIELD(qp_params.modify_flags,
1936 QED_ROCE_MODIFY_QP_VALID_SQ_PSN, 1);
1937 qp_params.sq_psn = attr->sq_psn;
1938 qp->sq_psn = attr->sq_psn;
1939 }
1940
1941 if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) {
1942 if (attr->max_dest_rd_atomic >
1943 dev->attr.max_qp_resp_rd_atomic_resc) {
1944 DP_ERR(dev,
1945 "unsupported max_dest_rd_atomic=%d, supported=%d\n",
1946 attr->max_dest_rd_atomic,
1947 dev->attr.max_qp_resp_rd_atomic_resc);
1948
1949 rc = -EINVAL;
1950 goto err;
1951 }
1952
1953 SET_FIELD(qp_params.modify_flags,
1954 QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_RESP, 1);
1955 qp_params.max_rd_atomic_resp = attr->max_dest_rd_atomic;
1956 }
1957
1958 if (attr_mask & IB_QP_DEST_QPN) {
1959 SET_FIELD(qp_params.modify_flags,
1960 QED_ROCE_MODIFY_QP_VALID_DEST_QP, 1);
1961
1962 qp_params.dest_qp = attr->dest_qp_num;
1963 qp->dest_qp_num = attr->dest_qp_num;
1964 }
1965
1966 if (qp->qp_type != IB_QPT_GSI)
1967 rc = dev->ops->rdma_modify_qp(dev->rdma_ctx,
1968 qp->qed_qp, &qp_params);
1969
1970 if (attr_mask & IB_QP_STATE) {
1971 if ((qp->qp_type != IB_QPT_GSI) && (!udata))
Amrani, Ramd6ebbf22016-12-22 14:40:35 +02001972 rc = qedr_update_qp_state(dev, qp, qp_params.new_state);
Ram Amranicecbcdd2016-10-10 13:15:34 +03001973 qp->state = qp_params.new_state;
1974 }
1975
1976err:
1977 return rc;
1978}
1979
1980static int qedr_to_ib_qp_acc_flags(struct qed_rdma_query_qp_out_params *params)
1981{
1982 int ib_qp_acc_flags = 0;
1983
1984 if (params->incoming_rdma_write_en)
1985 ib_qp_acc_flags |= IB_ACCESS_REMOTE_WRITE;
1986 if (params->incoming_rdma_read_en)
1987 ib_qp_acc_flags |= IB_ACCESS_REMOTE_READ;
1988 if (params->incoming_atomic_en)
1989 ib_qp_acc_flags |= IB_ACCESS_REMOTE_ATOMIC;
1990 ib_qp_acc_flags |= IB_ACCESS_LOCAL_WRITE;
1991 return ib_qp_acc_flags;
1992}
1993
1994int qedr_query_qp(struct ib_qp *ibqp,
1995 struct ib_qp_attr *qp_attr,
1996 int attr_mask, struct ib_qp_init_attr *qp_init_attr)
1997{
1998 struct qed_rdma_query_qp_out_params params;
1999 struct qedr_qp *qp = get_qedr_qp(ibqp);
2000 struct qedr_dev *dev = qp->dev;
2001 int rc = 0;
2002
2003 memset(&params, 0, sizeof(params));
2004
2005 rc = dev->ops->rdma_query_qp(dev->rdma_ctx, qp->qed_qp, &params);
2006 if (rc)
2007 goto err;
2008
2009 memset(qp_attr, 0, sizeof(*qp_attr));
2010 memset(qp_init_attr, 0, sizeof(*qp_init_attr));
2011
2012 qp_attr->qp_state = qedr_get_ibqp_state(params.state);
2013 qp_attr->cur_qp_state = qedr_get_ibqp_state(params.state);
Amrani, Ram097b6152016-12-26 08:40:58 +02002014 qp_attr->path_mtu = ib_mtu_int_to_enum(params.mtu);
Ram Amranicecbcdd2016-10-10 13:15:34 +03002015 qp_attr->path_mig_state = IB_MIG_MIGRATED;
2016 qp_attr->rq_psn = params.rq_psn;
2017 qp_attr->sq_psn = params.sq_psn;
2018 qp_attr->dest_qp_num = params.dest_qp;
2019
2020 qp_attr->qp_access_flags = qedr_to_ib_qp_acc_flags(&params);
2021
2022 qp_attr->cap.max_send_wr = qp->sq.max_wr;
2023 qp_attr->cap.max_recv_wr = qp->rq.max_wr;
2024 qp_attr->cap.max_send_sge = qp->sq.max_sges;
2025 qp_attr->cap.max_recv_sge = qp->rq.max_sges;
Ram Amrani59e89702017-01-24 13:50:35 +02002026 qp_attr->cap.max_inline_data = ROCE_REQ_MAX_INLINE_DATA_SIZE;
Ram Amranicecbcdd2016-10-10 13:15:34 +03002027 qp_init_attr->cap = qp_attr->cap;
2028
2029 memcpy(&qp_attr->ah_attr.grh.dgid.raw[0], &params.dgid.bytes[0],
2030 sizeof(qp_attr->ah_attr.grh.dgid.raw));
2031
2032 qp_attr->ah_attr.grh.flow_label = params.flow_label;
2033 qp_attr->ah_attr.grh.sgid_index = qp->sgid_idx;
2034 qp_attr->ah_attr.grh.hop_limit = params.hop_limit_ttl;
2035 qp_attr->ah_attr.grh.traffic_class = params.traffic_class_tos;
2036
2037 qp_attr->ah_attr.ah_flags = IB_AH_GRH;
2038 qp_attr->ah_attr.port_num = 1;
2039 qp_attr->ah_attr.sl = 0;
2040 qp_attr->timeout = params.timeout;
2041 qp_attr->rnr_retry = params.rnr_retry;
2042 qp_attr->retry_cnt = params.retry_cnt;
2043 qp_attr->min_rnr_timer = params.min_rnr_nak_timer;
2044 qp_attr->pkey_index = params.pkey_index;
2045 qp_attr->port_num = 1;
2046 qp_attr->ah_attr.src_path_bits = 0;
2047 qp_attr->ah_attr.static_rate = 0;
2048 qp_attr->alt_pkey_index = 0;
2049 qp_attr->alt_port_num = 0;
2050 qp_attr->alt_timeout = 0;
2051 memset(&qp_attr->alt_ah_attr, 0, sizeof(qp_attr->alt_ah_attr));
2052
2053 qp_attr->sq_draining = (params.state == QED_ROCE_QP_STATE_SQD) ? 1 : 0;
2054 qp_attr->max_dest_rd_atomic = params.max_dest_rd_atomic;
2055 qp_attr->max_rd_atomic = params.max_rd_atomic;
2056 qp_attr->en_sqd_async_notify = (params.sqd_async) ? 1 : 0;
2057
2058 DP_DEBUG(dev, QEDR_MSG_QP, "QEDR_QUERY_QP: max_inline_data=%d\n",
2059 qp_attr->cap.max_inline_data);
2060
2061err:
2062 return rc;
2063}
2064
Amrani, Ramdf158562016-12-22 14:52:24 +02002065int qedr_free_qp_resources(struct qedr_dev *dev, struct qedr_qp *qp)
2066{
2067 int rc = 0;
2068
2069 if (qp->qp_type != IB_QPT_GSI) {
2070 rc = dev->ops->rdma_destroy_qp(dev->rdma_ctx, qp->qed_qp);
2071 if (rc)
2072 return rc;
2073 }
2074
2075 if (qp->ibqp.uobject && qp->ibqp.uobject->context)
2076 qedr_cleanup_user(dev, qp);
2077 else
2078 qedr_cleanup_kernel(dev, qp);
2079
2080 return 0;
2081}
2082
Ram Amranicecbcdd2016-10-10 13:15:34 +03002083int qedr_destroy_qp(struct ib_qp *ibqp)
2084{
2085 struct qedr_qp *qp = get_qedr_qp(ibqp);
2086 struct qedr_dev *dev = qp->dev;
2087 struct ib_qp_attr attr;
2088 int attr_mask = 0;
2089 int rc = 0;
2090
2091 DP_DEBUG(dev, QEDR_MSG_QP, "destroy qp: destroying %p, qp type=%d\n",
2092 qp, qp->qp_type);
2093
Amrani, Ramb4c2cc42016-12-22 14:40:36 +02002094 if ((qp->state != QED_ROCE_QP_STATE_RESET) &&
2095 (qp->state != QED_ROCE_QP_STATE_ERR) &&
2096 (qp->state != QED_ROCE_QP_STATE_INIT)) {
2097
Ram Amranicecbcdd2016-10-10 13:15:34 +03002098 attr.qp_state = IB_QPS_ERR;
2099 attr_mask |= IB_QP_STATE;
2100
2101 /* Change the QP state to ERROR */
2102 qedr_modify_qp(ibqp, &attr, attr_mask, NULL);
2103 }
2104
Amrani, Ramdf158562016-12-22 14:52:24 +02002105 if (qp->qp_type == IB_QPT_GSI)
Ram Amrani04886772016-10-10 13:15:38 +03002106 qedr_destroy_gsi_qp(dev);
Ram Amranicecbcdd2016-10-10 13:15:34 +03002107
Amrani, Ramdf158562016-12-22 14:52:24 +02002108 qedr_free_qp_resources(dev, qp);
Ram Amranicecbcdd2016-10-10 13:15:34 +03002109
2110 kfree(qp);
2111
2112 return rc;
2113}
Ram Amranie0290cc2016-10-10 13:15:35 +03002114
Moni Shoua477864c2016-11-23 08:23:24 +02002115struct ib_ah *qedr_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr,
2116 struct ib_udata *udata)
Ram Amrani04886772016-10-10 13:15:38 +03002117{
2118 struct qedr_ah *ah;
2119
2120 ah = kzalloc(sizeof(*ah), GFP_ATOMIC);
2121 if (!ah)
2122 return ERR_PTR(-ENOMEM);
2123
2124 ah->attr = *attr;
2125
2126 return &ah->ibah;
2127}
2128
2129int qedr_destroy_ah(struct ib_ah *ibah)
2130{
2131 struct qedr_ah *ah = get_qedr_ah(ibah);
2132
2133 kfree(ah);
2134 return 0;
2135}
2136
Ram Amranie0290cc2016-10-10 13:15:35 +03002137static void free_mr_info(struct qedr_dev *dev, struct mr_info *info)
2138{
2139 struct qedr_pbl *pbl, *tmp;
2140
2141 if (info->pbl_table)
2142 list_add_tail(&info->pbl_table->list_entry,
2143 &info->free_pbl_list);
2144
2145 if (!list_empty(&info->inuse_pbl_list))
2146 list_splice(&info->inuse_pbl_list, &info->free_pbl_list);
2147
2148 list_for_each_entry_safe(pbl, tmp, &info->free_pbl_list, list_entry) {
2149 list_del(&pbl->list_entry);
2150 qedr_free_pbl(dev, &info->pbl_info, pbl);
2151 }
2152}
2153
2154static int init_mr_info(struct qedr_dev *dev, struct mr_info *info,
2155 size_t page_list_len, bool two_layered)
2156{
2157 struct qedr_pbl *tmp;
2158 int rc;
2159
2160 INIT_LIST_HEAD(&info->free_pbl_list);
2161 INIT_LIST_HEAD(&info->inuse_pbl_list);
2162
2163 rc = qedr_prepare_pbl_tbl(dev, &info->pbl_info,
2164 page_list_len, two_layered);
2165 if (rc)
2166 goto done;
2167
2168 info->pbl_table = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
Christophe Jaillet4cd33aa2017-02-18 12:28:15 +01002169 if (IS_ERR(info->pbl_table)) {
2170 rc = PTR_ERR(info->pbl_table);
Ram Amranie0290cc2016-10-10 13:15:35 +03002171 goto done;
2172 }
2173
2174 DP_DEBUG(dev, QEDR_MSG_MR, "pbl_table_pa = %pa\n",
2175 &info->pbl_table->pa);
2176
2177 /* in usual case we use 2 PBLs, so we add one to free
2178 * list and allocating another one
2179 */
2180 tmp = qedr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
Christophe Jaillet4cd33aa2017-02-18 12:28:15 +01002181 if (IS_ERR(tmp)) {
Ram Amranie0290cc2016-10-10 13:15:35 +03002182 DP_DEBUG(dev, QEDR_MSG_MR, "Extra PBL is not allocated\n");
2183 goto done;
2184 }
2185
2186 list_add_tail(&tmp->list_entry, &info->free_pbl_list);
2187
2188 DP_DEBUG(dev, QEDR_MSG_MR, "extra pbl_table_pa = %pa\n", &tmp->pa);
2189
2190done:
2191 if (rc)
2192 free_mr_info(dev, info);
2193
2194 return rc;
2195}
2196
2197struct ib_mr *qedr_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
2198 u64 usr_addr, int acc, struct ib_udata *udata)
2199{
2200 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2201 struct qedr_mr *mr;
2202 struct qedr_pd *pd;
2203 int rc = -ENOMEM;
2204
2205 pd = get_qedr_pd(ibpd);
2206 DP_DEBUG(dev, QEDR_MSG_MR,
2207 "qedr_register user mr pd = %d start = %lld, len = %lld, usr_addr = %lld, acc = %d\n",
2208 pd->pd_id, start, len, usr_addr, acc);
2209
2210 if (acc & IB_ACCESS_REMOTE_WRITE && !(acc & IB_ACCESS_LOCAL_WRITE))
2211 return ERR_PTR(-EINVAL);
2212
2213 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2214 if (!mr)
2215 return ERR_PTR(rc);
2216
2217 mr->type = QEDR_MR_USER;
2218
2219 mr->umem = ib_umem_get(ibpd->uobject->context, start, len, acc, 0);
2220 if (IS_ERR(mr->umem)) {
2221 rc = -EFAULT;
2222 goto err0;
2223 }
2224
2225 rc = init_mr_info(dev, &mr->info, ib_umem_page_count(mr->umem), 1);
2226 if (rc)
2227 goto err1;
2228
2229 qedr_populate_pbls(dev, mr->umem, mr->info.pbl_table,
2230 &mr->info.pbl_info);
2231
2232 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2233 if (rc) {
2234 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2235 goto err1;
2236 }
2237
2238 /* Index only, 18 bit long, lkey = itid << 8 | key */
2239 mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
2240 mr->hw_mr.key = 0;
2241 mr->hw_mr.pd = pd->pd_id;
2242 mr->hw_mr.local_read = 1;
2243 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
2244 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
2245 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
2246 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
2247 mr->hw_mr.mw_bind = false;
2248 mr->hw_mr.pbl_ptr = mr->info.pbl_table[0].pa;
2249 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
2250 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
Artemy Kovalyov3e7e1192017-04-05 09:23:50 +03002251 mr->hw_mr.page_size_log = mr->umem->page_shift;
Ram Amranie0290cc2016-10-10 13:15:35 +03002252 mr->hw_mr.fbo = ib_umem_offset(mr->umem);
2253 mr->hw_mr.length = len;
2254 mr->hw_mr.vaddr = usr_addr;
2255 mr->hw_mr.zbva = false;
2256 mr->hw_mr.phy_mr = false;
2257 mr->hw_mr.dma_mr = false;
2258
2259 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2260 if (rc) {
2261 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2262 goto err2;
2263 }
2264
2265 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2266 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
2267 mr->hw_mr.remote_atomic)
2268 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2269
2270 DP_DEBUG(dev, QEDR_MSG_MR, "register user mr lkey: %x\n",
2271 mr->ibmr.lkey);
2272 return &mr->ibmr;
2273
2274err2:
2275 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2276err1:
2277 qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
2278err0:
2279 kfree(mr);
2280 return ERR_PTR(rc);
2281}
2282
2283int qedr_dereg_mr(struct ib_mr *ib_mr)
2284{
2285 struct qedr_mr *mr = get_qedr_mr(ib_mr);
2286 struct qedr_dev *dev = get_qedr_dev(ib_mr->device);
2287 int rc = 0;
2288
2289 rc = dev->ops->rdma_deregister_tid(dev->rdma_ctx, mr->hw_mr.itid);
2290 if (rc)
2291 return rc;
2292
2293 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2294
2295 if ((mr->type != QEDR_MR_DMA) && (mr->type != QEDR_MR_FRMR))
2296 qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
2297
2298 /* it could be user registered memory. */
2299 if (mr->umem)
2300 ib_umem_release(mr->umem);
2301
2302 kfree(mr);
2303
2304 return rc;
2305}
2306
Ram Amrani27a4b1a2017-01-24 13:51:39 +02002307static struct qedr_mr *__qedr_alloc_mr(struct ib_pd *ibpd,
2308 int max_page_list_len)
Ram Amranie0290cc2016-10-10 13:15:35 +03002309{
2310 struct qedr_pd *pd = get_qedr_pd(ibpd);
2311 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2312 struct qedr_mr *mr;
2313 int rc = -ENOMEM;
2314
2315 DP_DEBUG(dev, QEDR_MSG_MR,
2316 "qedr_alloc_frmr pd = %d max_page_list_len= %d\n", pd->pd_id,
2317 max_page_list_len);
2318
2319 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2320 if (!mr)
2321 return ERR_PTR(rc);
2322
2323 mr->dev = dev;
2324 mr->type = QEDR_MR_FRMR;
2325
2326 rc = init_mr_info(dev, &mr->info, max_page_list_len, 1);
2327 if (rc)
2328 goto err0;
2329
2330 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2331 if (rc) {
2332 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2333 goto err0;
2334 }
2335
2336 /* Index only, 18 bit long, lkey = itid << 8 | key */
2337 mr->hw_mr.tid_type = QED_RDMA_TID_FMR;
2338 mr->hw_mr.key = 0;
2339 mr->hw_mr.pd = pd->pd_id;
2340 mr->hw_mr.local_read = 1;
2341 mr->hw_mr.local_write = 0;
2342 mr->hw_mr.remote_read = 0;
2343 mr->hw_mr.remote_write = 0;
2344 mr->hw_mr.remote_atomic = 0;
2345 mr->hw_mr.mw_bind = false;
2346 mr->hw_mr.pbl_ptr = 0;
2347 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
2348 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
2349 mr->hw_mr.fbo = 0;
2350 mr->hw_mr.length = 0;
2351 mr->hw_mr.vaddr = 0;
2352 mr->hw_mr.zbva = false;
2353 mr->hw_mr.phy_mr = true;
2354 mr->hw_mr.dma_mr = false;
2355
2356 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2357 if (rc) {
2358 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2359 goto err1;
2360 }
2361
2362 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2363 mr->ibmr.rkey = mr->ibmr.lkey;
2364
2365 DP_DEBUG(dev, QEDR_MSG_MR, "alloc frmr: %x\n", mr->ibmr.lkey);
2366 return mr;
2367
2368err1:
2369 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2370err0:
2371 kfree(mr);
2372 return ERR_PTR(rc);
2373}
2374
2375struct ib_mr *qedr_alloc_mr(struct ib_pd *ibpd,
2376 enum ib_mr_type mr_type, u32 max_num_sg)
2377{
2378 struct qedr_dev *dev;
2379 struct qedr_mr *mr;
2380
2381 if (mr_type != IB_MR_TYPE_MEM_REG)
2382 return ERR_PTR(-EINVAL);
2383
2384 mr = __qedr_alloc_mr(ibpd, max_num_sg);
2385
2386 if (IS_ERR(mr))
2387 return ERR_PTR(-EINVAL);
2388
2389 dev = mr->dev;
2390
2391 return &mr->ibmr;
2392}
2393
2394static int qedr_set_page(struct ib_mr *ibmr, u64 addr)
2395{
2396 struct qedr_mr *mr = get_qedr_mr(ibmr);
2397 struct qedr_pbl *pbl_table;
2398 struct regpair *pbe;
2399 u32 pbes_in_page;
2400
2401 if (unlikely(mr->npages == mr->info.pbl_info.num_pbes)) {
2402 DP_ERR(mr->dev, "qedr_set_page failes when %d\n", mr->npages);
2403 return -ENOMEM;
2404 }
2405
2406 DP_DEBUG(mr->dev, QEDR_MSG_MR, "qedr_set_page pages[%d] = 0x%llx\n",
2407 mr->npages, addr);
2408
2409 pbes_in_page = mr->info.pbl_info.pbl_size / sizeof(u64);
2410 pbl_table = mr->info.pbl_table + (mr->npages / pbes_in_page);
2411 pbe = (struct regpair *)pbl_table->va;
2412 pbe += mr->npages % pbes_in_page;
2413 pbe->lo = cpu_to_le32((u32)addr);
2414 pbe->hi = cpu_to_le32((u32)upper_32_bits(addr));
2415
2416 mr->npages++;
2417
2418 return 0;
2419}
2420
2421static void handle_completed_mrs(struct qedr_dev *dev, struct mr_info *info)
2422{
2423 int work = info->completed - info->completed_handled - 1;
2424
2425 DP_DEBUG(dev, QEDR_MSG_MR, "Special FMR work = %d\n", work);
2426 while (work-- > 0 && !list_empty(&info->inuse_pbl_list)) {
2427 struct qedr_pbl *pbl;
2428
2429 /* Free all the page list that are possible to be freed
2430 * (all the ones that were invalidated), under the assumption
2431 * that if an FMR was completed successfully that means that
2432 * if there was an invalidate operation before it also ended
2433 */
2434 pbl = list_first_entry(&info->inuse_pbl_list,
2435 struct qedr_pbl, list_entry);
Wei Yongjunaafec382016-10-29 16:19:53 +00002436 list_move_tail(&pbl->list_entry, &info->free_pbl_list);
Ram Amranie0290cc2016-10-10 13:15:35 +03002437 info->completed_handled++;
2438 }
2439}
2440
2441int qedr_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
2442 int sg_nents, unsigned int *sg_offset)
2443{
2444 struct qedr_mr *mr = get_qedr_mr(ibmr);
2445
2446 mr->npages = 0;
2447
2448 handle_completed_mrs(mr->dev, &mr->info);
2449 return ib_sg_to_pages(ibmr, sg, sg_nents, NULL, qedr_set_page);
2450}
2451
2452struct ib_mr *qedr_get_dma_mr(struct ib_pd *ibpd, int acc)
2453{
2454 struct qedr_dev *dev = get_qedr_dev(ibpd->device);
2455 struct qedr_pd *pd = get_qedr_pd(ibpd);
2456 struct qedr_mr *mr;
2457 int rc;
2458
2459 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
2460 if (!mr)
2461 return ERR_PTR(-ENOMEM);
2462
2463 mr->type = QEDR_MR_DMA;
2464
2465 rc = dev->ops->rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
2466 if (rc) {
2467 DP_ERR(dev, "roce alloc tid returned an error %d\n", rc);
2468 goto err1;
2469 }
2470
2471 /* index only, 18 bit long, lkey = itid << 8 | key */
2472 mr->hw_mr.tid_type = QED_RDMA_TID_REGISTERED_MR;
2473 mr->hw_mr.pd = pd->pd_id;
2474 mr->hw_mr.local_read = 1;
2475 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
2476 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
2477 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
2478 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
2479 mr->hw_mr.dma_mr = true;
2480
2481 rc = dev->ops->rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
2482 if (rc) {
2483 DP_ERR(dev, "roce register tid returned an error %d\n", rc);
2484 goto err2;
2485 }
2486
2487 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2488 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
2489 mr->hw_mr.remote_atomic)
2490 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
2491
2492 DP_DEBUG(dev, QEDR_MSG_MR, "get dma mr: lkey = %x\n", mr->ibmr.lkey);
2493 return &mr->ibmr;
2494
2495err2:
2496 dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
2497err1:
2498 kfree(mr);
2499 return ERR_PTR(rc);
2500}
Ram Amraniafa0e132016-10-10 13:15:36 +03002501
2502static inline int qedr_wq_is_full(struct qedr_qp_hwq_info *wq)
2503{
2504 return (((wq->prod + 1) % wq->max_wr) == wq->cons);
2505}
2506
2507static int sge_data_len(struct ib_sge *sg_list, int num_sge)
2508{
2509 int i, len = 0;
2510
2511 for (i = 0; i < num_sge; i++)
2512 len += sg_list[i].length;
2513
2514 return len;
2515}
2516
2517static void swap_wqe_data64(u64 *p)
2518{
2519 int i;
2520
2521 for (i = 0; i < QEDR_SQE_ELEMENT_SIZE / sizeof(u64); i++, p++)
2522 *p = cpu_to_be64(cpu_to_le64(*p));
2523}
2524
2525static u32 qedr_prepare_sq_inline_data(struct qedr_dev *dev,
2526 struct qedr_qp *qp, u8 *wqe_size,
2527 struct ib_send_wr *wr,
2528 struct ib_send_wr **bad_wr, u8 *bits,
2529 u8 bit)
2530{
2531 u32 data_size = sge_data_len(wr->sg_list, wr->num_sge);
2532 char *seg_prt, *wqe;
2533 int i, seg_siz;
2534
2535 if (data_size > ROCE_REQ_MAX_INLINE_DATA_SIZE) {
2536 DP_ERR(dev, "Too much inline data in WR: %d\n", data_size);
2537 *bad_wr = wr;
2538 return 0;
2539 }
2540
2541 if (!data_size)
2542 return data_size;
2543
2544 *bits |= bit;
2545
2546 seg_prt = NULL;
2547 wqe = NULL;
2548 seg_siz = 0;
2549
2550 /* Copy data inline */
2551 for (i = 0; i < wr->num_sge; i++) {
2552 u32 len = wr->sg_list[i].length;
2553 void *src = (void *)(uintptr_t)wr->sg_list[i].addr;
2554
2555 while (len > 0) {
2556 u32 cur;
2557
2558 /* New segment required */
2559 if (!seg_siz) {
2560 wqe = (char *)qed_chain_produce(&qp->sq.pbl);
2561 seg_prt = wqe;
2562 seg_siz = sizeof(struct rdma_sq_common_wqe);
2563 (*wqe_size)++;
2564 }
2565
2566 /* Calculate currently allowed length */
2567 cur = min_t(u32, len, seg_siz);
2568 memcpy(seg_prt, src, cur);
2569
2570 /* Update segment variables */
2571 seg_prt += cur;
2572 seg_siz -= cur;
2573
2574 /* Update sge variables */
2575 src += cur;
2576 len -= cur;
2577
2578 /* Swap fully-completed segments */
2579 if (!seg_siz)
2580 swap_wqe_data64((u64 *)wqe);
2581 }
2582 }
2583
2584 /* swap last not completed segment */
2585 if (seg_siz)
2586 swap_wqe_data64((u64 *)wqe);
2587
2588 return data_size;
2589}
2590
2591#define RQ_SGE_SET(sge, vaddr, vlength, vflags) \
2592 do { \
2593 DMA_REGPAIR_LE(sge->addr, vaddr); \
2594 (sge)->length = cpu_to_le32(vlength); \
2595 (sge)->flags = cpu_to_le32(vflags); \
2596 } while (0)
2597
2598#define SRQ_HDR_SET(hdr, vwr_id, num_sge) \
2599 do { \
2600 DMA_REGPAIR_LE(hdr->wr_id, vwr_id); \
2601 (hdr)->num_sges = num_sge; \
2602 } while (0)
2603
2604#define SRQ_SGE_SET(sge, vaddr, vlength, vlkey) \
2605 do { \
2606 DMA_REGPAIR_LE(sge->addr, vaddr); \
2607 (sge)->length = cpu_to_le32(vlength); \
2608 (sge)->l_key = cpu_to_le32(vlkey); \
2609 } while (0)
2610
2611static u32 qedr_prepare_sq_sges(struct qedr_qp *qp, u8 *wqe_size,
2612 struct ib_send_wr *wr)
2613{
2614 u32 data_size = 0;
2615 int i;
2616
2617 for (i = 0; i < wr->num_sge; i++) {
2618 struct rdma_sq_sge *sge = qed_chain_produce(&qp->sq.pbl);
2619
2620 DMA_REGPAIR_LE(sge->addr, wr->sg_list[i].addr);
2621 sge->l_key = cpu_to_le32(wr->sg_list[i].lkey);
2622 sge->length = cpu_to_le32(wr->sg_list[i].length);
2623 data_size += wr->sg_list[i].length;
2624 }
2625
2626 if (wqe_size)
2627 *wqe_size += wr->num_sge;
2628
2629 return data_size;
2630}
2631
2632static u32 qedr_prepare_sq_rdma_data(struct qedr_dev *dev,
2633 struct qedr_qp *qp,
2634 struct rdma_sq_rdma_wqe_1st *rwqe,
2635 struct rdma_sq_rdma_wqe_2nd *rwqe2,
2636 struct ib_send_wr *wr,
2637 struct ib_send_wr **bad_wr)
2638{
2639 rwqe2->r_key = cpu_to_le32(rdma_wr(wr)->rkey);
2640 DMA_REGPAIR_LE(rwqe2->remote_va, rdma_wr(wr)->remote_addr);
2641
Amrani, Ram8b0cabc2016-12-22 14:40:37 +02002642 if (wr->send_flags & IB_SEND_INLINE &&
2643 (wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM ||
2644 wr->opcode == IB_WR_RDMA_WRITE)) {
Ram Amraniafa0e132016-10-10 13:15:36 +03002645 u8 flags = 0;
2646
2647 SET_FIELD2(flags, RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG, 1);
2648 return qedr_prepare_sq_inline_data(dev, qp, &rwqe->wqe_size, wr,
2649 bad_wr, &rwqe->flags, flags);
2650 }
2651
2652 return qedr_prepare_sq_sges(qp, &rwqe->wqe_size, wr);
2653}
2654
2655static u32 qedr_prepare_sq_send_data(struct qedr_dev *dev,
2656 struct qedr_qp *qp,
2657 struct rdma_sq_send_wqe_1st *swqe,
2658 struct rdma_sq_send_wqe_2st *swqe2,
2659 struct ib_send_wr *wr,
2660 struct ib_send_wr **bad_wr)
2661{
2662 memset(swqe2, 0, sizeof(*swqe2));
2663 if (wr->send_flags & IB_SEND_INLINE) {
2664 u8 flags = 0;
2665
2666 SET_FIELD2(flags, RDMA_SQ_SEND_WQE_INLINE_FLG, 1);
2667 return qedr_prepare_sq_inline_data(dev, qp, &swqe->wqe_size, wr,
2668 bad_wr, &swqe->flags, flags);
2669 }
2670
2671 return qedr_prepare_sq_sges(qp, &swqe->wqe_size, wr);
2672}
2673
2674static int qedr_prepare_reg(struct qedr_qp *qp,
2675 struct rdma_sq_fmr_wqe_1st *fwqe1,
2676 struct ib_reg_wr *wr)
2677{
2678 struct qedr_mr *mr = get_qedr_mr(wr->mr);
2679 struct rdma_sq_fmr_wqe_2nd *fwqe2;
2680
2681 fwqe2 = (struct rdma_sq_fmr_wqe_2nd *)qed_chain_produce(&qp->sq.pbl);
2682 fwqe1->addr.hi = upper_32_bits(mr->ibmr.iova);
2683 fwqe1->addr.lo = lower_32_bits(mr->ibmr.iova);
2684 fwqe1->l_key = wr->key;
2685
Amrani, Ram08c4cf512017-04-27 13:35:31 +03002686 fwqe2->access_ctrl = 0;
2687
Ram Amraniafa0e132016-10-10 13:15:36 +03002688 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_READ,
2689 !!(wr->access & IB_ACCESS_REMOTE_READ));
2690 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE,
2691 !!(wr->access & IB_ACCESS_REMOTE_WRITE));
2692 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC,
2693 !!(wr->access & IB_ACCESS_REMOTE_ATOMIC));
2694 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_READ, 1);
2695 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE,
2696 !!(wr->access & IB_ACCESS_LOCAL_WRITE));
2697 fwqe2->fmr_ctrl = 0;
2698
2699 SET_FIELD2(fwqe2->fmr_ctrl, RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG,
2700 ilog2(mr->ibmr.page_size) - 12);
2701
2702 fwqe2->length_hi = 0;
2703 fwqe2->length_lo = mr->ibmr.length;
2704 fwqe2->pbl_addr.hi = upper_32_bits(mr->info.pbl_table->pa);
2705 fwqe2->pbl_addr.lo = lower_32_bits(mr->info.pbl_table->pa);
2706
2707 qp->wqe_wr_id[qp->sq.prod].mr = mr;
2708
2709 return 0;
2710}
2711
Ram Amrani27a4b1a2017-01-24 13:51:39 +02002712static enum ib_wc_opcode qedr_ib_to_wc_opcode(enum ib_wr_opcode opcode)
Ram Amraniafa0e132016-10-10 13:15:36 +03002713{
2714 switch (opcode) {
2715 case IB_WR_RDMA_WRITE:
2716 case IB_WR_RDMA_WRITE_WITH_IMM:
2717 return IB_WC_RDMA_WRITE;
2718 case IB_WR_SEND_WITH_IMM:
2719 case IB_WR_SEND:
2720 case IB_WR_SEND_WITH_INV:
2721 return IB_WC_SEND;
2722 case IB_WR_RDMA_READ:
2723 return IB_WC_RDMA_READ;
2724 case IB_WR_ATOMIC_CMP_AND_SWP:
2725 return IB_WC_COMP_SWAP;
2726 case IB_WR_ATOMIC_FETCH_AND_ADD:
2727 return IB_WC_FETCH_ADD;
2728 case IB_WR_REG_MR:
2729 return IB_WC_REG_MR;
2730 case IB_WR_LOCAL_INV:
2731 return IB_WC_LOCAL_INV;
2732 default:
2733 return IB_WC_SEND;
2734 }
2735}
2736
Ram Amrani27a4b1a2017-01-24 13:51:39 +02002737static inline bool qedr_can_post_send(struct qedr_qp *qp, struct ib_send_wr *wr)
Ram Amraniafa0e132016-10-10 13:15:36 +03002738{
2739 int wq_is_full, err_wr, pbl_is_full;
2740 struct qedr_dev *dev = qp->dev;
2741
2742 /* prevent SQ overflow and/or processing of a bad WR */
2743 err_wr = wr->num_sge > qp->sq.max_sges;
2744 wq_is_full = qedr_wq_is_full(&qp->sq);
2745 pbl_is_full = qed_chain_get_elem_left_u32(&qp->sq.pbl) <
2746 QEDR_MAX_SQE_ELEMENTS_PER_SQE;
2747 if (wq_is_full || err_wr || pbl_is_full) {
2748 if (wq_is_full && !(qp->err_bitmap & QEDR_QP_ERR_SQ_FULL)) {
2749 DP_ERR(dev,
2750 "error: WQ is full. Post send on QP %p failed (this error appears only once)\n",
2751 qp);
2752 qp->err_bitmap |= QEDR_QP_ERR_SQ_FULL;
2753 }
2754
2755 if (err_wr && !(qp->err_bitmap & QEDR_QP_ERR_BAD_SR)) {
2756 DP_ERR(dev,
2757 "error: WR is bad. Post send on QP %p failed (this error appears only once)\n",
2758 qp);
2759 qp->err_bitmap |= QEDR_QP_ERR_BAD_SR;
2760 }
2761
2762 if (pbl_is_full &&
2763 !(qp->err_bitmap & QEDR_QP_ERR_SQ_PBL_FULL)) {
2764 DP_ERR(dev,
2765 "error: WQ PBL is full. Post send on QP %p failed (this error appears only once)\n",
2766 qp);
2767 qp->err_bitmap |= QEDR_QP_ERR_SQ_PBL_FULL;
2768 }
2769 return false;
2770 }
2771 return true;
2772}
2773
Ram Amrani27a4b1a2017-01-24 13:51:39 +02002774static int __qedr_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
Ram Amraniafa0e132016-10-10 13:15:36 +03002775 struct ib_send_wr **bad_wr)
2776{
2777 struct qedr_dev *dev = get_qedr_dev(ibqp->device);
2778 struct qedr_qp *qp = get_qedr_qp(ibqp);
2779 struct rdma_sq_atomic_wqe_1st *awqe1;
2780 struct rdma_sq_atomic_wqe_2nd *awqe2;
2781 struct rdma_sq_atomic_wqe_3rd *awqe3;
2782 struct rdma_sq_send_wqe_2st *swqe2;
2783 struct rdma_sq_local_inv_wqe *iwqe;
2784 struct rdma_sq_rdma_wqe_2nd *rwqe2;
2785 struct rdma_sq_send_wqe_1st *swqe;
2786 struct rdma_sq_rdma_wqe_1st *rwqe;
2787 struct rdma_sq_fmr_wqe_1st *fwqe1;
2788 struct rdma_sq_common_wqe *wqe;
2789 u32 length;
2790 int rc = 0;
2791 bool comp;
2792
2793 if (!qedr_can_post_send(qp, wr)) {
2794 *bad_wr = wr;
2795 return -ENOMEM;
2796 }
2797
2798 wqe = qed_chain_produce(&qp->sq.pbl);
2799 qp->wqe_wr_id[qp->sq.prod].signaled =
2800 !!(wr->send_flags & IB_SEND_SIGNALED) || qp->signaled;
2801
2802 wqe->flags = 0;
2803 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_SE_FLG,
2804 !!(wr->send_flags & IB_SEND_SOLICITED));
2805 comp = (!!(wr->send_flags & IB_SEND_SIGNALED)) || qp->signaled;
2806 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_COMP_FLG, comp);
2807 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_RD_FENCE_FLG,
2808 !!(wr->send_flags & IB_SEND_FENCE));
2809 wqe->prev_wqe_size = qp->prev_wqe_size;
2810
2811 qp->wqe_wr_id[qp->sq.prod].opcode = qedr_ib_to_wc_opcode(wr->opcode);
2812
2813 switch (wr->opcode) {
2814 case IB_WR_SEND_WITH_IMM:
2815 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_IMM;
2816 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
2817 swqe->wqe_size = 2;
2818 swqe2 = qed_chain_produce(&qp->sq.pbl);
2819
2820 swqe->inv_key_or_imm_data = cpu_to_le32(wr->ex.imm_data);
2821 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
2822 wr, bad_wr);
2823 swqe->length = cpu_to_le32(length);
2824 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
2825 qp->prev_wqe_size = swqe->wqe_size;
2826 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
2827 break;
2828 case IB_WR_SEND:
2829 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND;
2830 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
2831
2832 swqe->wqe_size = 2;
2833 swqe2 = qed_chain_produce(&qp->sq.pbl);
2834 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
2835 wr, bad_wr);
2836 swqe->length = cpu_to_le32(length);
2837 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
2838 qp->prev_wqe_size = swqe->wqe_size;
2839 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
2840 break;
2841 case IB_WR_SEND_WITH_INV:
2842 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_INVALIDATE;
2843 swqe = (struct rdma_sq_send_wqe_1st *)wqe;
2844 swqe2 = qed_chain_produce(&qp->sq.pbl);
2845 swqe->wqe_size = 2;
2846 swqe->inv_key_or_imm_data = cpu_to_le32(wr->ex.invalidate_rkey);
2847 length = qedr_prepare_sq_send_data(dev, qp, swqe, swqe2,
2848 wr, bad_wr);
2849 swqe->length = cpu_to_le32(length);
2850 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
2851 qp->prev_wqe_size = swqe->wqe_size;
2852 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
2853 break;
2854
2855 case IB_WR_RDMA_WRITE_WITH_IMM:
2856 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR_WITH_IMM;
2857 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
2858
2859 rwqe->wqe_size = 2;
2860 rwqe->imm_data = htonl(cpu_to_le32(wr->ex.imm_data));
2861 rwqe2 = qed_chain_produce(&qp->sq.pbl);
2862 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
2863 wr, bad_wr);
2864 rwqe->length = cpu_to_le32(length);
2865 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
2866 qp->prev_wqe_size = rwqe->wqe_size;
2867 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
2868 break;
2869 case IB_WR_RDMA_WRITE:
2870 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR;
2871 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
2872
2873 rwqe->wqe_size = 2;
2874 rwqe2 = qed_chain_produce(&qp->sq.pbl);
2875 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
2876 wr, bad_wr);
2877 rwqe->length = cpu_to_le32(length);
2878 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
2879 qp->prev_wqe_size = rwqe->wqe_size;
2880 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
2881 break;
2882 case IB_WR_RDMA_READ_WITH_INV:
2883 DP_ERR(dev,
2884 "RDMA READ WITH INVALIDATE not supported\n");
2885 *bad_wr = wr;
2886 rc = -EINVAL;
2887 break;
2888
2889 case IB_WR_RDMA_READ:
2890 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_RD;
2891 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
2892
2893 rwqe->wqe_size = 2;
2894 rwqe2 = qed_chain_produce(&qp->sq.pbl);
2895 length = qedr_prepare_sq_rdma_data(dev, qp, rwqe, rwqe2,
2896 wr, bad_wr);
2897 rwqe->length = cpu_to_le32(length);
2898 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
2899 qp->prev_wqe_size = rwqe->wqe_size;
2900 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
2901 break;
2902
2903 case IB_WR_ATOMIC_CMP_AND_SWP:
2904 case IB_WR_ATOMIC_FETCH_AND_ADD:
2905 awqe1 = (struct rdma_sq_atomic_wqe_1st *)wqe;
2906 awqe1->wqe_size = 4;
2907
2908 awqe2 = qed_chain_produce(&qp->sq.pbl);
2909 DMA_REGPAIR_LE(awqe2->remote_va, atomic_wr(wr)->remote_addr);
2910 awqe2->r_key = cpu_to_le32(atomic_wr(wr)->rkey);
2911
2912 awqe3 = qed_chain_produce(&qp->sq.pbl);
2913
2914 if (wr->opcode == IB_WR_ATOMIC_FETCH_AND_ADD) {
2915 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_ADD;
2916 DMA_REGPAIR_LE(awqe3->swap_data,
2917 atomic_wr(wr)->compare_add);
2918 } else {
2919 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP;
2920 DMA_REGPAIR_LE(awqe3->swap_data,
2921 atomic_wr(wr)->swap);
2922 DMA_REGPAIR_LE(awqe3->cmp_data,
2923 atomic_wr(wr)->compare_add);
2924 }
2925
2926 qedr_prepare_sq_sges(qp, NULL, wr);
2927
2928 qp->wqe_wr_id[qp->sq.prod].wqe_size = awqe1->wqe_size;
2929 qp->prev_wqe_size = awqe1->wqe_size;
2930 break;
2931
2932 case IB_WR_LOCAL_INV:
2933 iwqe = (struct rdma_sq_local_inv_wqe *)wqe;
2934 iwqe->wqe_size = 1;
2935
2936 iwqe->req_type = RDMA_SQ_REQ_TYPE_LOCAL_INVALIDATE;
2937 iwqe->inv_l_key = wr->ex.invalidate_rkey;
2938 qp->wqe_wr_id[qp->sq.prod].wqe_size = iwqe->wqe_size;
2939 qp->prev_wqe_size = iwqe->wqe_size;
2940 break;
2941 case IB_WR_REG_MR:
2942 DP_DEBUG(dev, QEDR_MSG_CQ, "REG_MR\n");
2943 wqe->req_type = RDMA_SQ_REQ_TYPE_FAST_MR;
2944 fwqe1 = (struct rdma_sq_fmr_wqe_1st *)wqe;
2945 fwqe1->wqe_size = 2;
2946
2947 rc = qedr_prepare_reg(qp, fwqe1, reg_wr(wr));
2948 if (rc) {
2949 DP_ERR(dev, "IB_REG_MR failed rc=%d\n", rc);
2950 *bad_wr = wr;
2951 break;
2952 }
2953
2954 qp->wqe_wr_id[qp->sq.prod].wqe_size = fwqe1->wqe_size;
2955 qp->prev_wqe_size = fwqe1->wqe_size;
2956 break;
2957 default:
2958 DP_ERR(dev, "invalid opcode 0x%x!\n", wr->opcode);
2959 rc = -EINVAL;
2960 *bad_wr = wr;
2961 break;
2962 }
2963
2964 if (*bad_wr) {
2965 u16 value;
2966
2967 /* Restore prod to its position before
2968 * this WR was processed
2969 */
2970 value = le16_to_cpu(qp->sq.db_data.data.value);
2971 qed_chain_set_prod(&qp->sq.pbl, value, wqe);
2972
2973 /* Restore prev_wqe_size */
2974 qp->prev_wqe_size = wqe->prev_wqe_size;
2975 rc = -EINVAL;
2976 DP_ERR(dev, "POST SEND FAILED\n");
2977 }
2978
2979 return rc;
2980}
2981
2982int qedr_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
2983 struct ib_send_wr **bad_wr)
2984{
2985 struct qedr_dev *dev = get_qedr_dev(ibqp->device);
2986 struct qedr_qp *qp = get_qedr_qp(ibqp);
2987 unsigned long flags;
2988 int rc = 0;
2989
2990 *bad_wr = NULL;
2991
Ram Amrani04886772016-10-10 13:15:38 +03002992 if (qp->qp_type == IB_QPT_GSI)
2993 return qedr_gsi_post_send(ibqp, wr, bad_wr);
2994
Ram Amraniafa0e132016-10-10 13:15:36 +03002995 spin_lock_irqsave(&qp->q_lock, flags);
2996
Amrani, Ram922d9a42016-12-22 14:40:38 +02002997 if ((qp->state != QED_ROCE_QP_STATE_RTS) &&
2998 (qp->state != QED_ROCE_QP_STATE_ERR) &&
2999 (qp->state != QED_ROCE_QP_STATE_SQD)) {
Ram Amraniafa0e132016-10-10 13:15:36 +03003000 spin_unlock_irqrestore(&qp->q_lock, flags);
3001 *bad_wr = wr;
3002 DP_DEBUG(dev, QEDR_MSG_CQ,
3003 "QP in wrong state! QP icid=0x%x state %d\n",
3004 qp->icid, qp->state);
3005 return -EINVAL;
3006 }
3007
Ram Amraniafa0e132016-10-10 13:15:36 +03003008 while (wr) {
3009 rc = __qedr_post_send(ibqp, wr, bad_wr);
3010 if (rc)
3011 break;
3012
3013 qp->wqe_wr_id[qp->sq.prod].wr_id = wr->wr_id;
3014
3015 qedr_inc_sw_prod(&qp->sq);
3016
3017 qp->sq.db_data.data.value++;
3018
3019 wr = wr->next;
3020 }
3021
3022 /* Trigger doorbell
3023 * If there was a failure in the first WR then it will be triggered in
3024 * vane. However this is not harmful (as long as the producer value is
3025 * unchanged). For performance reasons we avoid checking for this
3026 * redundant doorbell.
3027 */
3028 wmb();
3029 writel(qp->sq.db_data.raw, qp->sq.db);
3030
3031 /* Make sure write sticks */
3032 mmiowb();
3033
3034 spin_unlock_irqrestore(&qp->q_lock, flags);
3035
3036 return rc;
3037}
3038
3039int qedr_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
3040 struct ib_recv_wr **bad_wr)
3041{
3042 struct qedr_qp *qp = get_qedr_qp(ibqp);
3043 struct qedr_dev *dev = qp->dev;
3044 unsigned long flags;
3045 int status = 0;
3046
Ram Amrani04886772016-10-10 13:15:38 +03003047 if (qp->qp_type == IB_QPT_GSI)
3048 return qedr_gsi_post_recv(ibqp, wr, bad_wr);
3049
Ram Amraniafa0e132016-10-10 13:15:36 +03003050 spin_lock_irqsave(&qp->q_lock, flags);
3051
Amrani, Ram922d9a42016-12-22 14:40:38 +02003052 if (qp->state == QED_ROCE_QP_STATE_RESET) {
Ram Amraniafa0e132016-10-10 13:15:36 +03003053 spin_unlock_irqrestore(&qp->q_lock, flags);
3054 *bad_wr = wr;
3055 return -EINVAL;
3056 }
3057
3058 while (wr) {
3059 int i;
3060
3061 if (qed_chain_get_elem_left_u32(&qp->rq.pbl) <
3062 QEDR_MAX_RQE_ELEMENTS_PER_RQE ||
3063 wr->num_sge > qp->rq.max_sges) {
3064 DP_ERR(dev, "Can't post WR (%d < %d) || (%d > %d)\n",
3065 qed_chain_get_elem_left_u32(&qp->rq.pbl),
3066 QEDR_MAX_RQE_ELEMENTS_PER_RQE, wr->num_sge,
3067 qp->rq.max_sges);
3068 status = -ENOMEM;
3069 *bad_wr = wr;
3070 break;
3071 }
3072 for (i = 0; i < wr->num_sge; i++) {
3073 u32 flags = 0;
3074 struct rdma_rq_sge *rqe =
3075 qed_chain_produce(&qp->rq.pbl);
3076
3077 /* First one must include the number
3078 * of SGE in the list
3079 */
3080 if (!i)
3081 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES,
3082 wr->num_sge);
3083
3084 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY,
3085 wr->sg_list[i].lkey);
3086
3087 RQ_SGE_SET(rqe, wr->sg_list[i].addr,
3088 wr->sg_list[i].length, flags);
3089 }
3090
3091 /* Special case of no sges. FW requires between 1-4 sges...
3092 * in this case we need to post 1 sge with length zero. this is
3093 * because rdma write with immediate consumes an RQ.
3094 */
3095 if (!wr->num_sge) {
3096 u32 flags = 0;
3097 struct rdma_rq_sge *rqe =
3098 qed_chain_produce(&qp->rq.pbl);
3099
3100 /* First one must include the number
3101 * of SGE in the list
3102 */
3103 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY, 0);
3104 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES, 1);
3105
3106 RQ_SGE_SET(rqe, 0, 0, flags);
3107 i = 1;
3108 }
3109
3110 qp->rqe_wr_id[qp->rq.prod].wr_id = wr->wr_id;
3111 qp->rqe_wr_id[qp->rq.prod].wqe_size = i;
3112
3113 qedr_inc_sw_prod(&qp->rq);
3114
3115 /* Flush all the writes before signalling doorbell */
3116 wmb();
3117
3118 qp->rq.db_data.data.value++;
3119
3120 writel(qp->rq.db_data.raw, qp->rq.db);
3121
3122 /* Make sure write sticks */
3123 mmiowb();
3124
3125 wr = wr->next;
3126 }
3127
3128 spin_unlock_irqrestore(&qp->q_lock, flags);
3129
3130 return status;
3131}
3132
3133static int is_valid_cqe(struct qedr_cq *cq, union rdma_cqe *cqe)
3134{
3135 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3136
3137 return (resp_cqe->flags & RDMA_CQE_REQUESTER_TOGGLE_BIT_MASK) ==
3138 cq->pbl_toggle;
3139}
3140
3141static struct qedr_qp *cqe_get_qp(union rdma_cqe *cqe)
3142{
3143 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3144 struct qedr_qp *qp;
3145
3146 qp = (struct qedr_qp *)(uintptr_t)HILO_GEN(resp_cqe->qp_handle.hi,
3147 resp_cqe->qp_handle.lo,
3148 u64);
3149 return qp;
3150}
3151
3152static enum rdma_cqe_type cqe_get_type(union rdma_cqe *cqe)
3153{
3154 struct rdma_cqe_requester *resp_cqe = &cqe->req;
3155
3156 return GET_FIELD(resp_cqe->flags, RDMA_CQE_REQUESTER_TYPE);
3157}
3158
3159/* Return latest CQE (needs processing) */
3160static union rdma_cqe *get_cqe(struct qedr_cq *cq)
3161{
3162 return cq->latest_cqe;
3163}
3164
3165/* In fmr we need to increase the number of fmr completed counter for the fmr
3166 * algorithm determining whether we can free a pbl or not.
3167 * we need to perform this whether the work request was signaled or not. for
3168 * this purpose we call this function from the condition that checks if a wr
3169 * should be skipped, to make sure we don't miss it ( possibly this fmr
3170 * operation was not signalted)
3171 */
3172static inline void qedr_chk_if_fmr(struct qedr_qp *qp)
3173{
3174 if (qp->wqe_wr_id[qp->sq.cons].opcode == IB_WC_REG_MR)
3175 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
3176}
3177
3178static int process_req(struct qedr_dev *dev, struct qedr_qp *qp,
3179 struct qedr_cq *cq, int num_entries,
3180 struct ib_wc *wc, u16 hw_cons, enum ib_wc_status status,
3181 int force)
3182{
3183 u16 cnt = 0;
3184
3185 while (num_entries && qp->sq.wqe_cons != hw_cons) {
3186 if (!qp->wqe_wr_id[qp->sq.cons].signaled && !force) {
3187 qedr_chk_if_fmr(qp);
3188 /* skip WC */
3189 goto next_cqe;
3190 }
3191
3192 /* fill WC */
3193 wc->status = status;
Amrani, Ram27035a12016-12-22 14:40:39 +02003194 wc->vendor_err = 0;
Ram Amraniafa0e132016-10-10 13:15:36 +03003195 wc->wc_flags = 0;
3196 wc->src_qp = qp->id;
3197 wc->qp = &qp->ibqp;
3198
3199 wc->wr_id = qp->wqe_wr_id[qp->sq.cons].wr_id;
3200 wc->opcode = qp->wqe_wr_id[qp->sq.cons].opcode;
3201
3202 switch (wc->opcode) {
3203 case IB_WC_RDMA_WRITE:
3204 wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
3205 break;
3206 case IB_WC_COMP_SWAP:
3207 case IB_WC_FETCH_ADD:
3208 wc->byte_len = 8;
3209 break;
3210 case IB_WC_REG_MR:
3211 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
3212 break;
3213 default:
3214 break;
3215 }
3216
3217 num_entries--;
3218 wc++;
3219 cnt++;
3220next_cqe:
3221 while (qp->wqe_wr_id[qp->sq.cons].wqe_size--)
3222 qed_chain_consume(&qp->sq.pbl);
3223 qedr_inc_sw_cons(&qp->sq);
3224 }
3225
3226 return cnt;
3227}
3228
3229static int qedr_poll_cq_req(struct qedr_dev *dev,
3230 struct qedr_qp *qp, struct qedr_cq *cq,
3231 int num_entries, struct ib_wc *wc,
3232 struct rdma_cqe_requester *req)
3233{
3234 int cnt = 0;
3235
3236 switch (req->status) {
3237 case RDMA_CQE_REQ_STS_OK:
3238 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
3239 IB_WC_SUCCESS, 0);
3240 break;
3241 case RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR:
Ram Amranic78c3142017-01-24 13:50:37 +02003242 if (qp->state != QED_ROCE_QP_STATE_ERR)
3243 DP_ERR(dev,
3244 "Error: POLL CQ with RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3245 cq->icid, qp->icid);
Ram Amraniafa0e132016-10-10 13:15:36 +03003246 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
Amrani, Ram74c38752016-12-22 14:40:40 +02003247 IB_WC_WR_FLUSH_ERR, 1);
Ram Amraniafa0e132016-10-10 13:15:36 +03003248 break;
3249 default:
3250 /* process all WQE before the cosumer */
3251 qp->state = QED_ROCE_QP_STATE_ERR;
3252 cnt = process_req(dev, qp, cq, num_entries, wc,
3253 req->sq_cons - 1, IB_WC_SUCCESS, 0);
3254 wc += cnt;
3255 /* if we have extra WC fill it with actual error info */
3256 if (cnt < num_entries) {
3257 enum ib_wc_status wc_status;
3258
3259 switch (req->status) {
3260 case RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR:
3261 DP_ERR(dev,
3262 "Error: POLL CQ with RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3263 cq->icid, qp->icid);
3264 wc_status = IB_WC_BAD_RESP_ERR;
3265 break;
3266 case RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR:
3267 DP_ERR(dev,
3268 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3269 cq->icid, qp->icid);
3270 wc_status = IB_WC_LOC_LEN_ERR;
3271 break;
3272 case RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR:
3273 DP_ERR(dev,
3274 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3275 cq->icid, qp->icid);
3276 wc_status = IB_WC_LOC_QP_OP_ERR;
3277 break;
3278 case RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR:
3279 DP_ERR(dev,
3280 "Error: POLL CQ with RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3281 cq->icid, qp->icid);
3282 wc_status = IB_WC_LOC_PROT_ERR;
3283 break;
3284 case RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR:
3285 DP_ERR(dev,
3286 "Error: POLL CQ with RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3287 cq->icid, qp->icid);
3288 wc_status = IB_WC_MW_BIND_ERR;
3289 break;
3290 case RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR:
3291 DP_ERR(dev,
3292 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3293 cq->icid, qp->icid);
3294 wc_status = IB_WC_REM_INV_REQ_ERR;
3295 break;
3296 case RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR:
3297 DP_ERR(dev,
3298 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3299 cq->icid, qp->icid);
3300 wc_status = IB_WC_REM_ACCESS_ERR;
3301 break;
3302 case RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR:
3303 DP_ERR(dev,
3304 "Error: POLL CQ with RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3305 cq->icid, qp->icid);
3306 wc_status = IB_WC_REM_OP_ERR;
3307 break;
3308 case RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR:
3309 DP_ERR(dev,
3310 "Error: POLL CQ with RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3311 cq->icid, qp->icid);
3312 wc_status = IB_WC_RNR_RETRY_EXC_ERR;
3313 break;
3314 case RDMA_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR:
3315 DP_ERR(dev,
3316 "Error: POLL CQ with ROCE_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3317 cq->icid, qp->icid);
3318 wc_status = IB_WC_RETRY_EXC_ERR;
3319 break;
3320 default:
3321 DP_ERR(dev,
3322 "Error: POLL CQ with IB_WC_GENERAL_ERR. CQ icid=0x%x, QP icid=0x%x\n",
3323 cq->icid, qp->icid);
3324 wc_status = IB_WC_GENERAL_ERR;
3325 }
3326 cnt += process_req(dev, qp, cq, 1, wc, req->sq_cons,
3327 wc_status, 1);
3328 }
3329 }
3330
3331 return cnt;
3332}
3333
Amrani, Ramb6acd712017-04-27 13:35:35 +03003334static inline int qedr_cqe_resp_status_to_ib(u8 status)
3335{
3336 switch (status) {
3337 case RDMA_CQE_RESP_STS_LOCAL_ACCESS_ERR:
3338 return IB_WC_LOC_ACCESS_ERR;
3339 case RDMA_CQE_RESP_STS_LOCAL_LENGTH_ERR:
3340 return IB_WC_LOC_LEN_ERR;
3341 case RDMA_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR:
3342 return IB_WC_LOC_QP_OP_ERR;
3343 case RDMA_CQE_RESP_STS_LOCAL_PROTECTION_ERR:
3344 return IB_WC_LOC_PROT_ERR;
3345 case RDMA_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR:
3346 return IB_WC_MW_BIND_ERR;
3347 case RDMA_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR:
3348 return IB_WC_REM_INV_RD_REQ_ERR;
3349 case RDMA_CQE_RESP_STS_OK:
3350 return IB_WC_SUCCESS;
3351 default:
3352 return IB_WC_GENERAL_ERR;
3353 }
3354}
3355
3356static inline int qedr_set_ok_cqe_resp_wc(struct rdma_cqe_responder *resp,
3357 struct ib_wc *wc)
3358{
3359 wc->status = IB_WC_SUCCESS;
3360 wc->byte_len = le32_to_cpu(resp->length);
3361
3362 if (resp->flags & QEDR_RESP_IMM) {
3363 wc->ex.imm_data = le32_to_cpu(resp->imm_data_or_inv_r_Key);
3364 wc->wc_flags |= IB_WC_WITH_IMM;
3365
3366 if (resp->flags & QEDR_RESP_RDMA)
3367 wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
3368
3369 if (resp->flags & QEDR_RESP_INV)
3370 return -EINVAL;
3371
3372 } else if (resp->flags & QEDR_RESP_INV) {
3373 wc->ex.imm_data = le32_to_cpu(resp->imm_data_or_inv_r_Key);
3374 wc->wc_flags |= IB_WC_WITH_INVALIDATE;
3375
3376 if (resp->flags & QEDR_RESP_RDMA)
3377 return -EINVAL;
3378
3379 } else if (resp->flags & QEDR_RESP_RDMA) {
3380 return -EINVAL;
3381 }
3382
3383 return 0;
3384}
3385
Ram Amraniafa0e132016-10-10 13:15:36 +03003386static void __process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
3387 struct qedr_cq *cq, struct ib_wc *wc,
3388 struct rdma_cqe_responder *resp, u64 wr_id)
3389{
Amrani, Ramb6acd712017-04-27 13:35:35 +03003390 /* Must fill fields before qedr_set_ok_cqe_resp_wc() */
Ram Amraniafa0e132016-10-10 13:15:36 +03003391 wc->opcode = IB_WC_RECV;
3392 wc->wc_flags = 0;
3393
Amrani, Ramb6acd712017-04-27 13:35:35 +03003394 if (likely(resp->status == RDMA_CQE_RESP_STS_OK)) {
3395 if (qedr_set_ok_cqe_resp_wc(resp, wc))
3396 DP_ERR(dev,
3397 "CQ %p (icid=%d) has invalid CQE responder flags=0x%x\n",
3398 cq, cq->icid, resp->flags);
Ram Amraniafa0e132016-10-10 13:15:36 +03003399
Amrani, Ramb6acd712017-04-27 13:35:35 +03003400 } else {
3401 wc->status = qedr_cqe_resp_status_to_ib(resp->status);
3402 if (wc->status == IB_WC_GENERAL_ERR)
3403 DP_ERR(dev,
3404 "CQ %p (icid=%d) contains an invalid CQE status %d\n",
3405 cq, cq->icid, resp->status);
Ram Amraniafa0e132016-10-10 13:15:36 +03003406 }
3407
Amrani, Ramb6acd712017-04-27 13:35:35 +03003408 /* Fill the rest of the WC */
Amrani, Ram27035a12016-12-22 14:40:39 +02003409 wc->vendor_err = 0;
Ram Amraniafa0e132016-10-10 13:15:36 +03003410 wc->src_qp = qp->id;
3411 wc->qp = &qp->ibqp;
3412 wc->wr_id = wr_id;
3413}
3414
3415static int process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
3416 struct qedr_cq *cq, struct ib_wc *wc,
3417 struct rdma_cqe_responder *resp)
3418{
3419 u64 wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
3420
3421 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
3422
3423 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
3424 qed_chain_consume(&qp->rq.pbl);
3425 qedr_inc_sw_cons(&qp->rq);
3426
3427 return 1;
3428}
3429
3430static int process_resp_flush(struct qedr_qp *qp, struct qedr_cq *cq,
3431 int num_entries, struct ib_wc *wc, u16 hw_cons)
3432{
3433 u16 cnt = 0;
3434
3435 while (num_entries && qp->rq.wqe_cons != hw_cons) {
3436 /* fill WC */
3437 wc->status = IB_WC_WR_FLUSH_ERR;
Amrani, Ram27035a12016-12-22 14:40:39 +02003438 wc->vendor_err = 0;
Ram Amraniafa0e132016-10-10 13:15:36 +03003439 wc->wc_flags = 0;
3440 wc->src_qp = qp->id;
3441 wc->byte_len = 0;
3442 wc->wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
3443 wc->qp = &qp->ibqp;
3444 num_entries--;
3445 wc++;
3446 cnt++;
3447 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
3448 qed_chain_consume(&qp->rq.pbl);
3449 qedr_inc_sw_cons(&qp->rq);
3450 }
3451
3452 return cnt;
3453}
3454
3455static void try_consume_resp_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
3456 struct rdma_cqe_responder *resp, int *update)
3457{
3458 if (le16_to_cpu(resp->rq_cons) == qp->rq.wqe_cons) {
3459 consume_cqe(cq);
3460 *update |= 1;
3461 }
3462}
3463
3464static int qedr_poll_cq_resp(struct qedr_dev *dev, struct qedr_qp *qp,
3465 struct qedr_cq *cq, int num_entries,
3466 struct ib_wc *wc, struct rdma_cqe_responder *resp,
3467 int *update)
3468{
3469 int cnt;
3470
3471 if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
3472 cnt = process_resp_flush(qp, cq, num_entries, wc,
3473 resp->rq_cons);
3474 try_consume_resp_cqe(cq, qp, resp, update);
3475 } else {
3476 cnt = process_resp_one(dev, qp, cq, wc, resp);
3477 consume_cqe(cq);
3478 *update |= 1;
3479 }
3480
3481 return cnt;
3482}
3483
3484static void try_consume_req_cqe(struct qedr_cq *cq, struct qedr_qp *qp,
3485 struct rdma_cqe_requester *req, int *update)
3486{
3487 if (le16_to_cpu(req->sq_cons) == qp->sq.wqe_cons) {
3488 consume_cqe(cq);
3489 *update |= 1;
3490 }
3491}
3492
3493int qedr_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)
3494{
3495 struct qedr_dev *dev = get_qedr_dev(ibcq->device);
3496 struct qedr_cq *cq = get_qedr_cq(ibcq);
3497 union rdma_cqe *cqe = cq->latest_cqe;
3498 u32 old_cons, new_cons;
3499 unsigned long flags;
3500 int update = 0;
3501 int done = 0;
3502
Amrani, Ram4dd72632017-04-27 13:35:34 +03003503 if (cq->destroyed) {
3504 DP_ERR(dev,
3505 "warning: poll was invoked after destroy for cq %p (icid=%d)\n",
3506 cq, cq->icid);
3507 return 0;
3508 }
3509
Ram Amrani04886772016-10-10 13:15:38 +03003510 if (cq->cq_type == QEDR_CQ_TYPE_GSI)
3511 return qedr_gsi_poll_cq(ibcq, num_entries, wc);
3512
Ram Amraniafa0e132016-10-10 13:15:36 +03003513 spin_lock_irqsave(&cq->cq_lock, flags);
3514 old_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
3515 while (num_entries && is_valid_cqe(cq, cqe)) {
3516 struct qedr_qp *qp;
3517 int cnt = 0;
3518
3519 /* prevent speculative reads of any field of CQE */
3520 rmb();
3521
3522 qp = cqe_get_qp(cqe);
3523 if (!qp) {
3524 WARN(1, "Error: CQE QP pointer is NULL. CQE=%p\n", cqe);
3525 break;
3526 }
3527
3528 wc->qp = &qp->ibqp;
3529
3530 switch (cqe_get_type(cqe)) {
3531 case RDMA_CQE_TYPE_REQUESTER:
3532 cnt = qedr_poll_cq_req(dev, qp, cq, num_entries, wc,
3533 &cqe->req);
3534 try_consume_req_cqe(cq, qp, &cqe->req, &update);
3535 break;
3536 case RDMA_CQE_TYPE_RESPONDER_RQ:
3537 cnt = qedr_poll_cq_resp(dev, qp, cq, num_entries, wc,
3538 &cqe->resp, &update);
3539 break;
3540 case RDMA_CQE_TYPE_INVALID:
3541 default:
3542 DP_ERR(dev, "Error: invalid CQE type = %d\n",
3543 cqe_get_type(cqe));
3544 }
3545 num_entries -= cnt;
3546 wc += cnt;
3547 done += cnt;
3548
3549 cqe = get_cqe(cq);
3550 }
3551 new_cons = qed_chain_get_cons_idx_u32(&cq->pbl);
3552
3553 cq->cq_cons += new_cons - old_cons;
3554
3555 if (update)
3556 /* doorbell notifies abount latest VALID entry,
3557 * but chain already point to the next INVALID one
3558 */
3559 doorbell_cq(cq, cq->cq_cons - 1, cq->arm_flags);
3560
3561 spin_unlock_irqrestore(&cq->cq_lock, flags);
3562 return done;
3563}
Ram Amrani993d1b52016-10-10 13:15:39 +03003564
3565int qedr_process_mad(struct ib_device *ibdev, int process_mad_flags,
3566 u8 port_num,
3567 const struct ib_wc *in_wc,
3568 const struct ib_grh *in_grh,
3569 const struct ib_mad_hdr *mad_hdr,
3570 size_t in_mad_size, struct ib_mad_hdr *out_mad,
3571 size_t *out_mad_size, u16 *out_mad_pkey_index)
3572{
3573 struct qedr_dev *dev = get_qedr_dev(ibdev);
3574
3575 DP_DEBUG(dev, QEDR_MSG_GSI,
3576 "QEDR_PROCESS_MAD in_mad %x %x %x %x %x %x %x %x\n",
3577 mad_hdr->attr_id, mad_hdr->base_version, mad_hdr->attr_mod,
3578 mad_hdr->class_specific, mad_hdr->class_version,
3579 mad_hdr->method, mad_hdr->mgmt_class, mad_hdr->status);
3580 return IB_MAD_RESULT_SUCCESS;
3581}
3582
3583int qedr_port_immutable(struct ib_device *ibdev, u8 port_num,
3584 struct ib_port_immutable *immutable)
3585{
3586 struct ib_port_attr attr;
3587 int err;
3588
Or Gerlitzc4550c62017-01-24 13:02:39 +02003589 immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE |
3590 RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP;
3591
3592 err = ib_query_port(ibdev, port_num, &attr);
Ram Amrani993d1b52016-10-10 13:15:39 +03003593 if (err)
3594 return err;
3595
3596 immutable->pkey_tbl_len = attr.pkey_tbl_len;
3597 immutable->gid_tbl_len = attr.gid_tbl_len;
Ram Amrani993d1b52016-10-10 13:15:39 +03003598 immutable->max_mad_size = IB_MGMT_MAD_SIZE;
3599
3600 return 0;
3601}