1// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2/* QLogic qed NIC Driver
3 * Copyright (c) 2015-2017  QLogic Corporation
4 * Copyright (c) 2019-2020 Marvell International Ltd.
5 */
6
7#include <linux/types.h>
8#include <asm/byteorder.h>
9#include <linux/bitops.h>
10#include <linux/delay.h>
11#include <linux/dma-mapping.h>
12#include <linux/errno.h>
13#include <linux/io.h>
14#include <linux/kernel.h>
15#include <linux/list.h>
16#include <linux/module.h>
17#include <linux/mutex.h>
18#include <linux/pci.h>
19#include <linux/slab.h>
20#include <linux/spinlock.h>
21#include <linux/string.h>
22#include <net/addrconf.h>
23#include "qed.h"
24#include "qed_cxt.h"
25#include "qed_hsi.h"
26#include "qed_iro_hsi.h"
27#include "qed_hw.h"
28#include "qed_init_ops.h"
29#include "qed_int.h"
30#include "qed_ll2.h"
31#include "qed_mcp.h"
32#include "qed_reg_addr.h"
33#include <linux/qed/qed_rdma_if.h>
34#include "qed_rdma.h"
35#include "qed_roce.h"
36#include "qed_sp.h"
37
38int qed_rdma_bmap_alloc(struct qed_hwfn *p_hwfn,
39			struct qed_bmap *bmap, u32 max_count, char *name)
40{
41	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "max_count = %08x\n", max_count);
42
43	bmap->max_count = max_count;
44
45	bmap->bitmap = bitmap_zalloc(max_count, GFP_KERNEL);
46	if (!bmap->bitmap)
47		return -ENOMEM;
48
49	snprintf(bmap->name, QED_RDMA_MAX_BMAP_NAME, "%s", name);
50
51	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "0\n");
52	return 0;
53}
54
55int qed_rdma_bmap_alloc_id(struct qed_hwfn *p_hwfn,
56			   struct qed_bmap *bmap, u32 *id_num)
57{
58	*id_num = find_first_zero_bit(bmap->bitmap, bmap->max_count);
59	if (*id_num >= bmap->max_count)
60		return -EINVAL;
61
62	__set_bit(*id_num, bmap->bitmap);
63
64	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "%s bitmap: allocated id %d\n",
65		   bmap->name, *id_num);
66
67	return 0;
68}
69
70void qed_bmap_set_id(struct qed_hwfn *p_hwfn,
71		     struct qed_bmap *bmap, u32 id_num)
72{
73	if (id_num >= bmap->max_count)
74		return;
75
76	__set_bit(id_num, bmap->bitmap);
77}
78
79void qed_bmap_release_id(struct qed_hwfn *p_hwfn,
80			 struct qed_bmap *bmap, u32 id_num)
81{
82	bool b_acquired;
83
84	if (id_num >= bmap->max_count)
85		return;
86
87	b_acquired = test_and_clear_bit(id_num, bmap->bitmap);
88	if (!b_acquired) {
89		DP_NOTICE(p_hwfn, "%s bitmap: id %d already released\n",
90			  bmap->name, id_num);
91		return;
92	}
93
94	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "%s bitmap: released id %d\n",
95		   bmap->name, id_num);
96}
97
98int qed_bmap_test_id(struct qed_hwfn *p_hwfn,
99		     struct qed_bmap *bmap, u32 id_num)
100{
101	if (id_num >= bmap->max_count)
102		return -1;
103
104	return test_bit(id_num, bmap->bitmap);
105}
106
107static bool qed_bmap_is_empty(struct qed_bmap *bmap)
108{
109	return bitmap_empty(bmap->bitmap, bmap->max_count);
110}
111
112static u32 qed_rdma_get_sb_id(void *p_hwfn, u32 rel_sb_id)
113{
114	/* First sb id for RoCE is after all the l2 sb */
115	return FEAT_NUM((struct qed_hwfn *)p_hwfn, QED_PF_L2_QUE) + rel_sb_id;
116}
117
118int qed_rdma_info_alloc(struct qed_hwfn *p_hwfn)
119{
120	struct qed_rdma_info *p_rdma_info;
121
122	p_rdma_info = kzalloc(sizeof(*p_rdma_info), GFP_KERNEL);
123	if (!p_rdma_info)
124		return -ENOMEM;
125
126	spin_lock_init(&p_rdma_info->lock);
127
128	p_hwfn->p_rdma_info = p_rdma_info;
129	return 0;
130}
131
132void qed_rdma_info_free(struct qed_hwfn *p_hwfn)
133{
134	kfree(p_hwfn->p_rdma_info);
135	p_hwfn->p_rdma_info = NULL;
136}
137
138static int qed_rdma_alloc(struct qed_hwfn *p_hwfn)
139{
140	struct qed_rdma_info *p_rdma_info = p_hwfn->p_rdma_info;
141	u32 num_cons, num_tasks;
142	int rc = -ENOMEM;
143
144	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Allocating RDMA\n");
145
146	if (QED_IS_IWARP_PERSONALITY(p_hwfn))
147		p_rdma_info->proto = PROTOCOLID_IWARP;
148	else
149		p_rdma_info->proto = PROTOCOLID_ROCE;
150
151	num_cons = qed_cxt_get_proto_cid_count(p_hwfn, p_rdma_info->proto,
152					       NULL);
153
154	if (QED_IS_IWARP_PERSONALITY(p_hwfn))
155		p_rdma_info->num_qps = num_cons;
156	else
157		p_rdma_info->num_qps = num_cons / 2; /* 2 cids per qp */
158
159	num_tasks = qed_cxt_get_proto_tid_count(p_hwfn, PROTOCOLID_ROCE);
160
161	/* Each MR uses a single task */
162	p_rdma_info->num_mrs = num_tasks;
163
164	/* Queue zone lines are shared between RoCE and L2 in such a way that
165	 * they can be used by each without obstructing the other.
166	 */
167	p_rdma_info->queue_zone_base = (u16)RESC_START(p_hwfn, QED_L2_QUEUE);
168	p_rdma_info->max_queue_zones = (u16)RESC_NUM(p_hwfn, QED_L2_QUEUE);
169
170	/* Allocate a struct with device params and fill it */
171	p_rdma_info->dev = kzalloc(sizeof(*p_rdma_info->dev), GFP_KERNEL);
172	if (!p_rdma_info->dev)
173		return rc;
174
175	/* Allocate a struct with port params and fill it */
176	p_rdma_info->port = kzalloc(sizeof(*p_rdma_info->port), GFP_KERNEL);
177	if (!p_rdma_info->port)
178		goto free_rdma_dev;
179
180	/* Allocate bit map for pd's */
181	rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->pd_map, RDMA_MAX_PDS,
182				 "PD");
183	if (rc) {
184		DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
185			   "Failed to allocate pd_map, rc = %d\n",
186			   rc);
187		goto free_rdma_port;
188	}
189
190	/* Allocate bit map for XRC Domains */
191	rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->xrcd_map,
192				 QED_RDMA_MAX_XRCDS, "XRCD");
193	if (rc) {
194		DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
195			   "Failed to allocate xrcd_map,rc = %d\n", rc);
196		goto free_pd_map;
197	}
198
199	/* Allocate DPI bitmap */
200	rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->dpi_map,
201				 p_hwfn->dpi_count, "DPI");
202	if (rc) {
203		DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
204			   "Failed to allocate DPI bitmap, rc = %d\n", rc);
205		goto free_xrcd_map;
206	}
207
208	/* Allocate bitmap for cq's. The maximum number of CQs is bound to
209	 * the number of connections we support. (num_qps in iWARP or
210	 * num_qps/2 in RoCE).
211	 */
212	rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->cq_map, num_cons, "CQ");
213	if (rc) {
214		DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
215			   "Failed to allocate cq bitmap, rc = %d\n", rc);
216		goto free_dpi_map;
217	}
218
219	/* Allocate bitmap for toggle bit for cq icids
220	 * We toggle the bit every time we create or resize cq for a given icid.
221	 * Size needs to equal the size of the cq bmap.
222	 */
223	rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->toggle_bits,
224				 num_cons, "Toggle");
225	if (rc) {
226		DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
227			   "Failed to allocate toggle bits, rc = %d\n", rc);
228		goto free_cq_map;
229	}
230
231	/* Allocate bitmap for itids */
232	rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->tid_map,
233				 p_rdma_info->num_mrs, "MR");
234	if (rc) {
235		DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
236			   "Failed to allocate itids bitmaps, rc = %d\n", rc);
237		goto free_toggle_map;
238	}
239
240	/* Allocate bitmap for cids used for qps. */
241	rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->cid_map, num_cons,
242				 "CID");
243	if (rc) {
244		DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
245			   "Failed to allocate cid bitmap, rc = %d\n", rc);
246		goto free_tid_map;
247	}
248
249	/* Allocate bitmap for cids used for responders/requesters. */
250	rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->real_cid_map, num_cons,
251				 "REAL_CID");
252	if (rc) {
253		DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
254			   "Failed to allocate real cid bitmap, rc = %d\n", rc);
255		goto free_cid_map;
256	}
257
258	/* The first SRQ follows the last XRC SRQ. This means that the
259	 * SRQ IDs start from an offset equals to max_xrc_srqs.
260	 */
261	p_rdma_info->srq_id_offset = p_hwfn->p_cxt_mngr->xrc_srq_count;
262	rc = qed_rdma_bmap_alloc(p_hwfn,
263				 &p_rdma_info->xrc_srq_map,
264				 p_hwfn->p_cxt_mngr->xrc_srq_count, "XRC SRQ");
265	if (rc) {
266		DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
267			   "Failed to allocate xrc srq bitmap, rc = %d\n", rc);
268		goto free_real_cid_map;
269	}
270
271	/* Allocate bitmap for srqs */
272	p_rdma_info->num_srqs = p_hwfn->p_cxt_mngr->srq_count;
273	rc = qed_rdma_bmap_alloc(p_hwfn, &p_rdma_info->srq_map,
274				 p_rdma_info->num_srqs, "SRQ");
275	if (rc) {
276		DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
277			   "Failed to allocate srq bitmap, rc = %d\n", rc);
278		goto free_xrc_srq_map;
279	}
280
281	if (QED_IS_IWARP_PERSONALITY(p_hwfn))
282		rc = qed_iwarp_alloc(p_hwfn);
283
284	if (rc)
285		goto free_srq_map;
286
287	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Allocation successful\n");
288	return 0;
289
290free_srq_map:
291	kfree(p_rdma_info->srq_map.bitmap);
292free_xrc_srq_map:
293	kfree(p_rdma_info->xrc_srq_map.bitmap);
294free_real_cid_map:
295	kfree(p_rdma_info->real_cid_map.bitmap);
296free_cid_map:
297	kfree(p_rdma_info->cid_map.bitmap);
298free_tid_map:
299	kfree(p_rdma_info->tid_map.bitmap);
300free_toggle_map:
301	kfree(p_rdma_info->toggle_bits.bitmap);
302free_cq_map:
303	kfree(p_rdma_info->cq_map.bitmap);
304free_dpi_map:
305	kfree(p_rdma_info->dpi_map.bitmap);
306free_xrcd_map:
307	kfree(p_rdma_info->xrcd_map.bitmap);
308free_pd_map:
309	kfree(p_rdma_info->pd_map.bitmap);
310free_rdma_port:
311	kfree(p_rdma_info->port);
312free_rdma_dev:
313	kfree(p_rdma_info->dev);
314
315	return rc;
316}
317
318void qed_rdma_bmap_free(struct qed_hwfn *p_hwfn,
319			struct qed_bmap *bmap, bool check)
320{
321	unsigned int bit, weight, nbits;
322	unsigned long *b;
323
324	if (!check)
325		goto end;
326
327	weight = bitmap_weight(bmap->bitmap, bmap->max_count);
328	if (!weight)
329		goto end;
330
331	DP_NOTICE(p_hwfn,
332		  "%s bitmap not free - size=%d, weight=%d, 512 bits per line\n",
333		  bmap->name, bmap->max_count, weight);
334
335	for (bit = 0; bit < bmap->max_count; bit += 512) {
336		b =  bmap->bitmap + BITS_TO_LONGS(bit);
337		nbits = min(bmap->max_count - bit, 512U);
338
339		if (!bitmap_empty(b, nbits))
340			DP_NOTICE(p_hwfn,
341				  "line 0x%04x: %*pb\n", bit / 512, nbits, b);
342	}
343
344end:
345	bitmap_free(bmap->bitmap);
346	bmap->bitmap = NULL;
347}
348
349static void qed_rdma_resc_free(struct qed_hwfn *p_hwfn)
350{
351	struct qed_rdma_info *p_rdma_info = p_hwfn->p_rdma_info;
352
353	if (QED_IS_IWARP_PERSONALITY(p_hwfn))
354		qed_iwarp_resc_free(p_hwfn);
355
356	qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->cid_map, 1);
357	qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->pd_map, 1);
358	qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->dpi_map, 1);
359	qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->cq_map, 1);
360	qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->toggle_bits, 0);
361	qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->tid_map, 1);
362	qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->srq_map, 1);
363	qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->real_cid_map, 1);
364	qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->xrc_srq_map, 1);
365	qed_rdma_bmap_free(p_hwfn, &p_hwfn->p_rdma_info->xrcd_map, 1);
366
367	kfree(p_rdma_info->port);
368	kfree(p_rdma_info->dev);
369}
370
371static void qed_rdma_free_tid(void *rdma_cxt, u32 itid)
372{
373	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
374
375	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "itid = %08x\n", itid);
376
377	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
378	qed_bmap_release_id(p_hwfn, &p_hwfn->p_rdma_info->tid_map, itid);
379	spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
380}
381
382static void qed_rdma_free_reserved_lkey(struct qed_hwfn *p_hwfn)
383{
384	qed_rdma_free_tid(p_hwfn, p_hwfn->p_rdma_info->dev->reserved_lkey);
385}
386
387static void qed_rdma_free(struct qed_hwfn *p_hwfn)
388{
389	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Freeing RDMA\n");
390
391	qed_rdma_free_reserved_lkey(p_hwfn);
392	qed_cxt_free_proto_ilt(p_hwfn, p_hwfn->p_rdma_info->proto);
393	qed_rdma_resc_free(p_hwfn);
394}
395
396static void qed_rdma_init_events(struct qed_hwfn *p_hwfn,
397				 struct qed_rdma_start_in_params *params)
398{
399	struct qed_rdma_events *events;
400
401	events = &p_hwfn->p_rdma_info->events;
402
403	events->unaffiliated_event = params->events->unaffiliated_event;
404	events->affiliated_event = params->events->affiliated_event;
405	events->context = params->events->context;
406}
407
408static void qed_rdma_init_devinfo(struct qed_hwfn *p_hwfn,
409				  struct qed_rdma_start_in_params *params)
410{
411	struct qed_rdma_device *dev = p_hwfn->p_rdma_info->dev;
412	struct qed_dev *cdev = p_hwfn->cdev;
413	u32 pci_status_control;
414	u32 num_qps;
415
416	/* Vendor specific information */
417	dev->vendor_id = cdev->vendor_id;
418	dev->vendor_part_id = cdev->device_id;
419	dev->hw_ver = cdev->chip_rev;
420	dev->fw_ver = (FW_MAJOR_VERSION << 24) | (FW_MINOR_VERSION << 16) |
421		      (FW_REVISION_VERSION << 8) | (FW_ENGINEERING_VERSION);
422
423	addrconf_addr_eui48((u8 *)&dev->sys_image_guid,
424			    p_hwfn->hw_info.hw_mac_addr);
425
426	dev->node_guid = dev->sys_image_guid;
427
428	dev->max_sge = min_t(u32, RDMA_MAX_SGE_PER_SQ_WQE,
429			     RDMA_MAX_SGE_PER_RQ_WQE);
430
431	if (cdev->rdma_max_sge)
432		dev->max_sge = min_t(u32, cdev->rdma_max_sge, dev->max_sge);
433
434	dev->max_srq_sge = QED_RDMA_MAX_SGE_PER_SRQ_WQE;
435	if (p_hwfn->cdev->rdma_max_srq_sge) {
436		dev->max_srq_sge = min_t(u32,
437					 p_hwfn->cdev->rdma_max_srq_sge,
438					 dev->max_srq_sge);
439	}
440	dev->max_inline = ROCE_REQ_MAX_INLINE_DATA_SIZE;
441
442	dev->max_inline = (cdev->rdma_max_inline) ?
443			  min_t(u32, cdev->rdma_max_inline, dev->max_inline) :
444			  dev->max_inline;
445
446	dev->max_wqe = QED_RDMA_MAX_WQE;
447	dev->max_cnq = (u8)FEAT_NUM(p_hwfn, QED_RDMA_CNQ);
448
449	/* The number of QPs may be higher than QED_ROCE_MAX_QPS, because
450	 * it is up-aligned to 16 and then to ILT page size within qed cxt.
451	 * This is OK in terms of ILT but we don't want to configure the FW
452	 * above its abilities
453	 */
454	num_qps = ROCE_MAX_QPS;
455	num_qps = min_t(u64, num_qps, p_hwfn->p_rdma_info->num_qps);
456	dev->max_qp = num_qps;
457
458	/* CQs uses the same icids that QPs use hence they are limited by the
459	 * number of icids. There are two icids per QP.
460	 */
461	dev->max_cq = num_qps * 2;
462
463	/* The number of mrs is smaller by 1 since the first is reserved */
464	dev->max_mr = p_hwfn->p_rdma_info->num_mrs - 1;
465	dev->max_mr_size = QED_RDMA_MAX_MR_SIZE;
466
467	/* The maximum CQE capacity per CQ supported.
468	 * max number of cqes will be in two layer pbl,
469	 * 8 is the pointer size in bytes
470	 * 32 is the size of cq element in bytes
471	 */
472	if (params->cq_mode == QED_RDMA_CQ_MODE_32_BITS)
473		dev->max_cqe = QED_RDMA_MAX_CQE_32_BIT;
474	else
475		dev->max_cqe = QED_RDMA_MAX_CQE_16_BIT;
476
477	dev->max_mw = 0;
478	dev->max_mr_mw_fmr_pbl = (PAGE_SIZE / 8) * (PAGE_SIZE / 8);
479	dev->max_mr_mw_fmr_size = dev->max_mr_mw_fmr_pbl * PAGE_SIZE;
480	if (QED_IS_ROCE_PERSONALITY(p_hwfn))
481		dev->max_pkey = QED_RDMA_MAX_P_KEY;
482
483	dev->max_srq = p_hwfn->p_rdma_info->num_srqs;
484	dev->max_srq_wr = QED_RDMA_MAX_SRQ_WQE_ELEM;
485	dev->max_qp_resp_rd_atomic_resc = RDMA_RING_PAGE_SIZE /
486					  (RDMA_RESP_RD_ATOMIC_ELM_SIZE * 2);
487	dev->max_qp_req_rd_atomic_resc = RDMA_RING_PAGE_SIZE /
488					 RDMA_REQ_RD_ATOMIC_ELM_SIZE;
489	dev->max_dev_resp_rd_atomic_resc = dev->max_qp_resp_rd_atomic_resc *
490					   p_hwfn->p_rdma_info->num_qps;
491	dev->page_size_caps = QED_RDMA_PAGE_SIZE_CAPS;
492	dev->dev_ack_delay = QED_RDMA_ACK_DELAY;
493	dev->max_pd = RDMA_MAX_PDS;
494	dev->max_ah = p_hwfn->p_rdma_info->num_qps;
495	dev->max_stats_queues = (u8)RESC_NUM(p_hwfn, QED_RDMA_STATS_QUEUE);
496
497	/* Set capablities */
498	dev->dev_caps = 0;
499	SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_RNR_NAK, 1);
500	SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_PORT_ACTIVE_EVENT, 1);
501	SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_PORT_CHANGE_EVENT, 1);
502	SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_RESIZE_CQ, 1);
503	SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_BASE_MEMORY_EXT, 1);
504	SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_BASE_QUEUE_EXT, 1);
505	SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_ZBVA, 1);
506	SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_LOCAL_INV_FENCE, 1);
507
508	/* Check atomic operations support in PCI configuration space. */
509	pcie_capability_read_dword(cdev->pdev, PCI_EXP_DEVCTL2,
510				   &pci_status_control);
511
512	if (pci_status_control & PCI_EXP_DEVCTL2_LTR_EN)
513		SET_FIELD(dev->dev_caps, QED_RDMA_DEV_CAP_ATOMIC_OP, 1);
514
515	if (QED_IS_IWARP_PERSONALITY(p_hwfn))
516		qed_iwarp_init_devinfo(p_hwfn);
517}
518
519static void qed_rdma_init_port(struct qed_hwfn *p_hwfn)
520{
521	struct qed_rdma_port *port = p_hwfn->p_rdma_info->port;
522	struct qed_rdma_device *dev = p_hwfn->p_rdma_info->dev;
523
524	port->port_state = p_hwfn->mcp_info->link_output.link_up ?
525			   QED_RDMA_PORT_UP : QED_RDMA_PORT_DOWN;
526
527	port->max_msg_size = min_t(u64,
528				   (dev->max_mr_mw_fmr_size *
529				    p_hwfn->cdev->rdma_max_sge),
530				   BIT(31));
531
532	port->pkey_bad_counter = 0;
533}
534
535static int qed_rdma_init_hw(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
536{
537	int rc = 0;
538
539	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Initializing HW\n");
540	p_hwfn->b_rdma_enabled_in_prs = false;
541
542	if (QED_IS_IWARP_PERSONALITY(p_hwfn))
543		qed_iwarp_init_hw(p_hwfn, p_ptt);
544	else
545		rc = qed_roce_init_hw(p_hwfn, p_ptt);
546
547	return rc;
548}
549
550static int qed_rdma_start_fw(struct qed_hwfn *p_hwfn,
551			     struct qed_rdma_start_in_params *params,
552			     struct qed_ptt *p_ptt)
553{
554	struct rdma_init_func_ramrod_data *p_ramrod;
555	struct qed_rdma_cnq_params *p_cnq_pbl_list;
556	struct rdma_init_func_hdr *p_params_header;
557	struct rdma_cnq_params *p_cnq_params;
558	struct qed_sp_init_data init_data;
559	struct qed_spq_entry *p_ent;
560	u32 cnq_id, sb_id;
561	u16 igu_sb_id;
562	int rc;
563
564	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Starting FW\n");
565
566	/* Save the number of cnqs for the function close ramrod */
567	p_hwfn->p_rdma_info->num_cnqs = params->desired_cnq;
568
569	/* Get SPQ entry */
570	memset(&init_data, 0, sizeof(init_data));
571	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
572	init_data.comp_mode = QED_SPQ_MODE_EBLOCK;
573
574	rc = qed_sp_init_request(p_hwfn, &p_ent, RDMA_RAMROD_FUNC_INIT,
575				 p_hwfn->p_rdma_info->proto, &init_data);
576	if (rc)
577		return rc;
578
579	if (QED_IS_IWARP_PERSONALITY(p_hwfn)) {
580		qed_iwarp_init_fw_ramrod(p_hwfn,
581					 &p_ent->ramrod.iwarp_init_func);
582		p_ramrod = &p_ent->ramrod.iwarp_init_func.rdma;
583	} else {
584		p_ramrod = &p_ent->ramrod.roce_init_func.rdma;
585	}
586
587	p_params_header = &p_ramrod->params_header;
588	p_params_header->cnq_start_offset = (u8)RESC_START(p_hwfn,
589							   QED_RDMA_CNQ_RAM);
590	p_params_header->num_cnqs = params->desired_cnq;
591	p_params_header->first_reg_srq_id =
592	    cpu_to_le16(p_hwfn->p_rdma_info->srq_id_offset);
593	p_params_header->reg_srq_base_addr =
594	    cpu_to_le32(qed_cxt_get_ilt_page_size(p_hwfn, ILT_CLI_TSDM));
595	if (params->cq_mode == QED_RDMA_CQ_MODE_16_BITS)
596		p_params_header->cq_ring_mode = 1;
597	else
598		p_params_header->cq_ring_mode = 0;
599
600	for (cnq_id = 0; cnq_id < params->desired_cnq; cnq_id++) {
601		sb_id = qed_rdma_get_sb_id(p_hwfn, cnq_id);
602		igu_sb_id = qed_get_igu_sb_id(p_hwfn, sb_id);
603		p_ramrod->cnq_params[cnq_id].sb_num = cpu_to_le16(igu_sb_id);
604		p_cnq_params = &p_ramrod->cnq_params[cnq_id];
605		p_cnq_pbl_list = &params->cnq_pbl_list[cnq_id];
606
607		p_cnq_params->sb_index = p_hwfn->pf_params.rdma_pf_params.gl_pi;
608		p_cnq_params->num_pbl_pages = p_cnq_pbl_list->num_pbl_pages;
609
610		DMA_REGPAIR_LE(p_cnq_params->pbl_base_addr,
611			       p_cnq_pbl_list->pbl_ptr);
612
613		/* we assume here that cnq_id and qz_offset are the same */
614		p_cnq_params->queue_zone_num =
615			cpu_to_le16(p_hwfn->p_rdma_info->queue_zone_base +
616				    cnq_id);
617	}
618
619	return qed_spq_post(p_hwfn, p_ent, NULL);
620}
621
622static int qed_rdma_alloc_tid(void *rdma_cxt, u32 *itid)
623{
624	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
625	int rc;
626
627	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Allocate TID\n");
628
629	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
630	rc = qed_rdma_bmap_alloc_id(p_hwfn,
631				    &p_hwfn->p_rdma_info->tid_map, itid);
632	spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
633	if (rc)
634		goto out;
635
636	rc = qed_cxt_dynamic_ilt_alloc(p_hwfn, QED_ELEM_TASK, *itid);
637out:
638	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Allocate TID - done, rc = %d\n", rc);
639	return rc;
640}
641
642static int qed_rdma_reserve_lkey(struct qed_hwfn *p_hwfn)
643{
644	struct qed_rdma_device *dev = p_hwfn->p_rdma_info->dev;
645
646	/* Tid 0 will be used as the key for "reserved MR".
647	 * The driver should allocate memory for it so it can be loaded but no
648	 * ramrod should be passed on it.
649	 */
650	qed_rdma_alloc_tid(p_hwfn, &dev->reserved_lkey);
651	if (dev->reserved_lkey != RDMA_RESERVED_LKEY) {
652		DP_NOTICE(p_hwfn,
653			  "Reserved lkey should be equal to RDMA_RESERVED_LKEY\n");
654		return -EINVAL;
655	}
656
657	return 0;
658}
659
660static int qed_rdma_setup(struct qed_hwfn *p_hwfn,
661			  struct qed_ptt *p_ptt,
662			  struct qed_rdma_start_in_params *params)
663{
664	int rc;
665
666	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "RDMA setup\n");
667
668	qed_rdma_init_devinfo(p_hwfn, params);
669	qed_rdma_init_port(p_hwfn);
670	qed_rdma_init_events(p_hwfn, params);
671
672	rc = qed_rdma_reserve_lkey(p_hwfn);
673	if (rc)
674		return rc;
675
676	rc = qed_rdma_init_hw(p_hwfn, p_ptt);
677	if (rc)
678		return rc;
679
680	if (QED_IS_IWARP_PERSONALITY(p_hwfn)) {
681		rc = qed_iwarp_setup(p_hwfn, params);
682		if (rc)
683			return rc;
684	} else {
685		rc = qed_roce_setup(p_hwfn);
686		if (rc)
687			return rc;
688	}
689
690	return qed_rdma_start_fw(p_hwfn, params, p_ptt);
691}
692
693static int qed_rdma_stop(void *rdma_cxt)
694{
695	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
696	struct rdma_close_func_ramrod_data *p_ramrod;
697	struct qed_sp_init_data init_data;
698	struct qed_spq_entry *p_ent;
699	struct qed_ptt *p_ptt;
700	u32 ll2_ethertype_en;
701	int rc = -EBUSY;
702
703	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "RDMA stop\n");
704
705	p_ptt = qed_ptt_acquire(p_hwfn);
706	if (!p_ptt) {
707		DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Failed to acquire PTT\n");
708		return rc;
709	}
710
711	/* Disable RoCE search */
712	qed_wr(p_hwfn, p_ptt, p_hwfn->rdma_prs_search_reg, 0);
713	p_hwfn->b_rdma_enabled_in_prs = false;
714	p_hwfn->p_rdma_info->active = 0;
715	qed_wr(p_hwfn, p_ptt, PRS_REG_ROCE_DEST_QP_MAX_PF, 0);
716
717	ll2_ethertype_en = qed_rd(p_hwfn, p_ptt, PRS_REG_LIGHT_L2_ETHERTYPE_EN);
718
719	qed_wr(p_hwfn, p_ptt, PRS_REG_LIGHT_L2_ETHERTYPE_EN,
720	       (ll2_ethertype_en & 0xFFFE));
721
722	if (QED_IS_IWARP_PERSONALITY(p_hwfn)) {
723		rc = qed_iwarp_stop(p_hwfn);
724		if (rc) {
725			qed_ptt_release(p_hwfn, p_ptt);
726			return rc;
727		}
728	} else {
729		qed_roce_stop(p_hwfn);
730	}
731
732	qed_ptt_release(p_hwfn, p_ptt);
733
734	/* Get SPQ entry */
735	memset(&init_data, 0, sizeof(init_data));
736	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
737	init_data.comp_mode = QED_SPQ_MODE_EBLOCK;
738
739	/* Stop RoCE */
740	rc = qed_sp_init_request(p_hwfn, &p_ent, RDMA_RAMROD_FUNC_CLOSE,
741				 p_hwfn->p_rdma_info->proto, &init_data);
742	if (rc)
743		goto out;
744
745	p_ramrod = &p_ent->ramrod.rdma_close_func;
746
747	p_ramrod->num_cnqs = p_hwfn->p_rdma_info->num_cnqs;
748	p_ramrod->cnq_start_offset = (u8)RESC_START(p_hwfn, QED_RDMA_CNQ_RAM);
749
750	rc = qed_spq_post(p_hwfn, p_ent, NULL);
751
752out:
753	qed_rdma_free(p_hwfn);
754
755	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "RDMA stop done, rc = %d\n", rc);
756	return rc;
757}
758
759static int qed_rdma_add_user(void *rdma_cxt,
760			     struct qed_rdma_add_user_out_params *out_params)
761{
762	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
763	u32 dpi_start_offset;
764	u32 returned_id = 0;
765	int rc;
766
767	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Adding User\n");
768
769	/* Allocate DPI */
770	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
771	rc = qed_rdma_bmap_alloc_id(p_hwfn, &p_hwfn->p_rdma_info->dpi_map,
772				    &returned_id);
773	spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
774
775	out_params->dpi = (u16)returned_id;
776
777	/* Calculate the corresponding DPI address */
778	dpi_start_offset = p_hwfn->dpi_start_offset;
779
780	out_params->dpi_addr = p_hwfn->doorbells + dpi_start_offset +
781			       out_params->dpi * p_hwfn->dpi_size;
782
783	out_params->dpi_phys_addr = p_hwfn->db_phys_addr +
784				    dpi_start_offset +
785				    ((out_params->dpi) * p_hwfn->dpi_size);
786
787	out_params->dpi_size = p_hwfn->dpi_size;
788	out_params->wid_count = p_hwfn->wid_count;
789
790	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Adding user - done, rc = %d\n", rc);
791	return rc;
792}
793
794static struct qed_rdma_port *qed_rdma_query_port(void *rdma_cxt)
795{
796	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
797	struct qed_rdma_port *p_port = p_hwfn->p_rdma_info->port;
798	struct qed_mcp_link_state *p_link_output;
799
800	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "RDMA Query port\n");
801
802	/* The link state is saved only for the leading hwfn */
803	p_link_output = &QED_LEADING_HWFN(p_hwfn->cdev)->mcp_info->link_output;
804
805	p_port->port_state = p_link_output->link_up ? QED_RDMA_PORT_UP
806	    : QED_RDMA_PORT_DOWN;
807
808	p_port->link_speed = p_link_output->speed;
809
810	p_port->max_msg_size = RDMA_MAX_DATA_SIZE_IN_WQE;
811
812	return p_port;
813}
814
815static struct qed_rdma_device *qed_rdma_query_device(void *rdma_cxt)
816{
817	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
818
819	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Query device\n");
820
821	/* Return struct with device parameters */
822	return p_hwfn->p_rdma_info->dev;
823}
824
825static void qed_rdma_cnq_prod_update(void *rdma_cxt, u8 qz_offset, u16 prod)
826{
827	struct qed_hwfn *p_hwfn;
828	u16 qz_num;
829	u32 addr;
830
831	p_hwfn = (struct qed_hwfn *)rdma_cxt;
832
833	if (qz_offset > p_hwfn->p_rdma_info->max_queue_zones) {
834		DP_NOTICE(p_hwfn,
835			  "queue zone offset %d is too large (max is %d)\n",
836			  qz_offset, p_hwfn->p_rdma_info->max_queue_zones);
837		return;
838	}
839
840	qz_num = p_hwfn->p_rdma_info->queue_zone_base + qz_offset;
841	addr = GET_GTT_REG_ADDR(GTT_BAR0_MAP_REG_USDM_RAM,
842				USTORM_COMMON_QUEUE_CONS, qz_num);
843
844	REG_WR16(p_hwfn, addr, prod);
845
846	/* keep prod updates ordered */
847	wmb();
848}
849
850static int qed_fill_rdma_dev_info(struct qed_dev *cdev,
851				  struct qed_dev_rdma_info *info)
852{
853	struct qed_hwfn *p_hwfn = QED_AFFIN_HWFN(cdev);
854
855	memset(info, 0, sizeof(*info));
856
857	info->rdma_type = QED_IS_ROCE_PERSONALITY(p_hwfn) ?
858	    QED_RDMA_TYPE_ROCE : QED_RDMA_TYPE_IWARP;
859
860	info->user_dpm_enabled = (p_hwfn->db_bar_no_edpm == 0);
861
862	qed_fill_dev_info(cdev, &info->common);
863
864	return 0;
865}
866
867static int qed_rdma_get_sb_start(struct qed_dev *cdev)
868{
869	int feat_num;
870
871	if (cdev->num_hwfns > 1)
872		feat_num = FEAT_NUM(QED_AFFIN_HWFN(cdev), QED_PF_L2_QUE);
873	else
874		feat_num = FEAT_NUM(QED_AFFIN_HWFN(cdev), QED_PF_L2_QUE) *
875			   cdev->num_hwfns;
876
877	return feat_num;
878}
879
880static int qed_rdma_get_min_cnq_msix(struct qed_dev *cdev)
881{
882	int n_cnq = FEAT_NUM(QED_AFFIN_HWFN(cdev), QED_RDMA_CNQ);
883	int n_msix = cdev->int_params.rdma_msix_cnt;
884
885	return min_t(int, n_cnq, n_msix);
886}
887
888static int qed_rdma_set_int(struct qed_dev *cdev, u16 cnt)
889{
890	int limit = 0;
891
892	/* Mark the fastpath as free/used */
893	cdev->int_params.fp_initialized = cnt ? true : false;
894
895	if (cdev->int_params.out.int_mode != QED_INT_MODE_MSIX) {
896		DP_ERR(cdev,
897		       "qed roce supports only MSI-X interrupts (detected %d).\n",
898		       cdev->int_params.out.int_mode);
899		return -EINVAL;
900	} else if (cdev->int_params.fp_msix_cnt) {
901		limit = cdev->int_params.rdma_msix_cnt;
902	}
903
904	if (!limit)
905		return -ENOMEM;
906
907	return min_t(int, cnt, limit);
908}
909
910static int qed_rdma_get_int(struct qed_dev *cdev, struct qed_int_info *info)
911{
912	memset(info, 0, sizeof(*info));
913
914	if (!cdev->int_params.fp_initialized) {
915		DP_INFO(cdev,
916			"Protocol driver requested interrupt information, but its support is not yet configured\n");
917		return -EINVAL;
918	}
919
920	if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) {
921		int msix_base = cdev->int_params.rdma_msix_base;
922
923		info->msix_cnt = cdev->int_params.rdma_msix_cnt;
924		info->msix = &cdev->int_params.msix_table[msix_base];
925
926		DP_VERBOSE(cdev, QED_MSG_RDMA, "msix_cnt = %d msix_base=%d\n",
927			   info->msix_cnt, msix_base);
928	}
929
930	return 0;
931}
932
933static int qed_rdma_alloc_pd(void *rdma_cxt, u16 *pd)
934{
935	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
936	u32 returned_id;
937	int rc;
938
939	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Alloc PD\n");
940
941	/* Allocates an unused protection domain */
942	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
943	rc = qed_rdma_bmap_alloc_id(p_hwfn,
944				    &p_hwfn->p_rdma_info->pd_map, &returned_id);
945	spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
946
947	*pd = (u16)returned_id;
948
949	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Alloc PD - done, rc = %d\n", rc);
950	return rc;
951}
952
953static void qed_rdma_free_pd(void *rdma_cxt, u16 pd)
954{
955	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
956
957	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "pd = %08x\n", pd);
958
959	/* Returns a previously allocated protection domain for reuse */
960	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
961	qed_bmap_release_id(p_hwfn, &p_hwfn->p_rdma_info->pd_map, pd);
962	spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
963}
964
965static int qed_rdma_alloc_xrcd(void *rdma_cxt, u16 *xrcd_id)
966{
967	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
968	u32 returned_id;
969	int rc;
970
971	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Alloc XRCD\n");
972
973	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
974	rc = qed_rdma_bmap_alloc_id(p_hwfn,
975				    &p_hwfn->p_rdma_info->xrcd_map,
976				    &returned_id);
977	spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
978	if (rc) {
979		DP_NOTICE(p_hwfn, "Failed in allocating xrcd id\n");
980		return rc;
981	}
982
983	*xrcd_id = (u16)returned_id;
984
985	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Alloc XRCD - done, rc = %d\n", rc);
986	return rc;
987}
988
989static void qed_rdma_free_xrcd(void *rdma_cxt, u16 xrcd_id)
990{
991	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
992
993	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "xrcd_id = %08x\n", xrcd_id);
994
995	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
996	qed_bmap_release_id(p_hwfn, &p_hwfn->p_rdma_info->xrcd_map, xrcd_id);
997	spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
998}
999
1000static enum qed_rdma_toggle_bit
1001qed_rdma_toggle_bit_create_resize_cq(struct qed_hwfn *p_hwfn, u16 icid)
1002{
1003	struct qed_rdma_info *p_info = p_hwfn->p_rdma_info;
1004	enum qed_rdma_toggle_bit toggle_bit;
1005	u32 bmap_id;
1006
1007	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "icid = %08x\n", icid);
1008
1009	/* the function toggle the bit that is related to a given icid
1010	 * and returns the new toggle bit's value
1011	 */
1012	bmap_id = icid - qed_cxt_get_proto_cid_start(p_hwfn, p_info->proto);
1013
1014	spin_lock_bh(&p_info->lock);
1015	toggle_bit = !test_and_change_bit(bmap_id,
1016					  p_info->toggle_bits.bitmap);
1017	spin_unlock_bh(&p_info->lock);
1018
1019	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "QED_RDMA_TOGGLE_BIT_= %d\n",
1020		   toggle_bit);
1021
1022	return toggle_bit;
1023}
1024
1025static int qed_rdma_create_cq(void *rdma_cxt,
1026			      struct qed_rdma_create_cq_in_params *params,
1027			      u16 *icid)
1028{
1029	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
1030	struct qed_rdma_info *p_info = p_hwfn->p_rdma_info;
1031	struct rdma_create_cq_ramrod_data *p_ramrod;
1032	enum qed_rdma_toggle_bit toggle_bit;
1033	struct qed_sp_init_data init_data;
1034	struct qed_spq_entry *p_ent;
1035	u32 returned_id, start_cid;
1036	int rc;
1037
1038	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "cq_handle = %08x%08x\n",
1039		   params->cq_handle_hi, params->cq_handle_lo);
1040
1041	/* Allocate icid */
1042	spin_lock_bh(&p_info->lock);
1043	rc = qed_rdma_bmap_alloc_id(p_hwfn, &p_info->cq_map, &returned_id);
1044	spin_unlock_bh(&p_info->lock);
1045
1046	if (rc) {
1047		DP_NOTICE(p_hwfn, "Can't create CQ, rc = %d\n", rc);
1048		return rc;
1049	}
1050
1051	start_cid = qed_cxt_get_proto_cid_start(p_hwfn,
1052						p_info->proto);
1053	*icid = returned_id + start_cid;
1054
1055	/* Check if icid requires a page allocation */
1056	rc = qed_cxt_dynamic_ilt_alloc(p_hwfn, QED_ELEM_CXT, *icid);
1057	if (rc)
1058		goto err;
1059
1060	/* Get SPQ entry */
1061	memset(&init_data, 0, sizeof(init_data));
1062	init_data.cid = *icid;
1063	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
1064	init_data.comp_mode = QED_SPQ_MODE_EBLOCK;
1065
1066	/* Send create CQ ramrod */
1067	rc = qed_sp_init_request(p_hwfn, &p_ent,
1068				 RDMA_RAMROD_CREATE_CQ,
1069				 p_info->proto, &init_data);
1070	if (rc)
1071		goto err;
1072
1073	p_ramrod = &p_ent->ramrod.rdma_create_cq;
1074
1075	p_ramrod->cq_handle.hi = cpu_to_le32(params->cq_handle_hi);
1076	p_ramrod->cq_handle.lo = cpu_to_le32(params->cq_handle_lo);
1077	p_ramrod->dpi = cpu_to_le16(params->dpi);
1078	p_ramrod->is_two_level_pbl = params->pbl_two_level;
1079	p_ramrod->max_cqes = cpu_to_le32(params->cq_size);
1080	DMA_REGPAIR_LE(p_ramrod->pbl_addr, params->pbl_ptr);
1081	p_ramrod->pbl_num_pages = cpu_to_le16(params->pbl_num_pages);
1082	p_ramrod->cnq_id = (u8)RESC_START(p_hwfn, QED_RDMA_CNQ_RAM) +
1083			   params->cnq_id;
1084	p_ramrod->int_timeout = cpu_to_le16(params->int_timeout);
1085
1086	/* toggle the bit for every resize or create cq for a given icid */
1087	toggle_bit = qed_rdma_toggle_bit_create_resize_cq(p_hwfn, *icid);
1088
1089	p_ramrod->toggle_bit = toggle_bit;
1090
1091	rc = qed_spq_post(p_hwfn, p_ent, NULL);
1092	if (rc) {
1093		/* restore toggle bit */
1094		qed_rdma_toggle_bit_create_resize_cq(p_hwfn, *icid);
1095		goto err;
1096	}
1097
1098	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Created CQ, rc = %d\n", rc);
1099	return rc;
1100
1101err:
1102	/* release allocated icid */
1103	spin_lock_bh(&p_info->lock);
1104	qed_bmap_release_id(p_hwfn, &p_info->cq_map, returned_id);
1105	spin_unlock_bh(&p_info->lock);
1106	DP_NOTICE(p_hwfn, "Create CQ failed, rc = %d\n", rc);
1107
1108	return rc;
1109}
1110
1111static int
1112qed_rdma_destroy_cq(void *rdma_cxt,
1113		    struct qed_rdma_destroy_cq_in_params *in_params,
1114		    struct qed_rdma_destroy_cq_out_params *out_params)
1115{
1116	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
1117	struct rdma_destroy_cq_output_params *p_ramrod_res;
1118	struct rdma_destroy_cq_ramrod_data *p_ramrod;
1119	struct qed_sp_init_data init_data;
1120	struct qed_spq_entry *p_ent;
1121	dma_addr_t ramrod_res_phys;
1122	enum protocol_type proto;
1123	int rc = -ENOMEM;
1124
1125	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "icid = %08x\n", in_params->icid);
1126
1127	p_ramrod_res =
1128	    dma_alloc_coherent(&p_hwfn->cdev->pdev->dev,
1129			       sizeof(struct rdma_destroy_cq_output_params),
1130			       &ramrod_res_phys, GFP_KERNEL);
1131	if (!p_ramrod_res) {
1132		DP_NOTICE(p_hwfn,
1133			  "qed destroy cq failed: cannot allocate memory (ramrod)\n");
1134		return rc;
1135	}
1136
1137	/* Get SPQ entry */
1138	memset(&init_data, 0, sizeof(init_data));
1139	init_data.cid = in_params->icid;
1140	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
1141	init_data.comp_mode = QED_SPQ_MODE_EBLOCK;
1142	proto = p_hwfn->p_rdma_info->proto;
1143	/* Send destroy CQ ramrod */
1144	rc = qed_sp_init_request(p_hwfn, &p_ent,
1145				 RDMA_RAMROD_DESTROY_CQ,
1146				 proto, &init_data);
1147	if (rc)
1148		goto err;
1149
1150	p_ramrod = &p_ent->ramrod.rdma_destroy_cq;
1151	DMA_REGPAIR_LE(p_ramrod->output_params_addr, ramrod_res_phys);
1152
1153	rc = qed_spq_post(p_hwfn, p_ent, NULL);
1154	if (rc)
1155		goto err;
1156
1157	out_params->num_cq_notif = le16_to_cpu(p_ramrod_res->cnq_num);
1158
1159	dma_free_coherent(&p_hwfn->cdev->pdev->dev,
1160			  sizeof(struct rdma_destroy_cq_output_params),
1161			  p_ramrod_res, ramrod_res_phys);
1162
1163	/* Free icid */
1164	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
1165
1166	qed_bmap_release_id(p_hwfn,
1167			    &p_hwfn->p_rdma_info->cq_map,
1168			    (in_params->icid -
1169			     qed_cxt_get_proto_cid_start(p_hwfn, proto)));
1170
1171	spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
1172
1173	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Destroyed CQ, rc = %d\n", rc);
1174	return rc;
1175
1176err:	dma_free_coherent(&p_hwfn->cdev->pdev->dev,
1177			  sizeof(struct rdma_destroy_cq_output_params),
1178			  p_ramrod_res, ramrod_res_phys);
1179
1180	return rc;
1181}
1182
1183void qed_rdma_set_fw_mac(__le16 *p_fw_mac, const u8 *p_qed_mac)
1184{
1185	p_fw_mac[0] = cpu_to_le16((p_qed_mac[0] << 8) + p_qed_mac[1]);
1186	p_fw_mac[1] = cpu_to_le16((p_qed_mac[2] << 8) + p_qed_mac[3]);
1187	p_fw_mac[2] = cpu_to_le16((p_qed_mac[4] << 8) + p_qed_mac[5]);
1188}
1189
1190static int qed_rdma_query_qp(void *rdma_cxt,
1191			     struct qed_rdma_qp *qp,
1192			     struct qed_rdma_query_qp_out_params *out_params)
1193{
1194	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
1195	int rc = 0;
1196
1197	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "icid = %08x\n", qp->icid);
1198
1199	/* The following fields are filled in from qp and not FW as they can't
1200	 * be modified by FW
1201	 */
1202	out_params->mtu = qp->mtu;
1203	out_params->dest_qp = qp->dest_qp;
1204	out_params->incoming_atomic_en = qp->incoming_atomic_en;
1205	out_params->e2e_flow_control_en = qp->e2e_flow_control_en;
1206	out_params->incoming_rdma_read_en = qp->incoming_rdma_read_en;
1207	out_params->incoming_rdma_write_en = qp->incoming_rdma_write_en;
1208	out_params->dgid = qp->dgid;
1209	out_params->flow_label = qp->flow_label;
1210	out_params->hop_limit_ttl = qp->hop_limit_ttl;
1211	out_params->traffic_class_tos = qp->traffic_class_tos;
1212	out_params->timeout = qp->ack_timeout;
1213	out_params->rnr_retry = qp->rnr_retry_cnt;
1214	out_params->retry_cnt = qp->retry_cnt;
1215	out_params->min_rnr_nak_timer = qp->min_rnr_nak_timer;
1216	out_params->pkey_index = 0;
1217	out_params->max_rd_atomic = qp->max_rd_atomic_req;
1218	out_params->max_dest_rd_atomic = qp->max_rd_atomic_resp;
1219	out_params->sqd_async = qp->sqd_async;
1220
1221	if (QED_IS_IWARP_PERSONALITY(p_hwfn))
1222		qed_iwarp_query_qp(qp, out_params);
1223	else
1224		rc = qed_roce_query_qp(p_hwfn, qp, out_params);
1225
1226	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Query QP, rc = %d\n", rc);
1227	return rc;
1228}
1229
1230static int qed_rdma_destroy_qp(void *rdma_cxt, struct qed_rdma_qp *qp)
1231{
1232	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
1233	int rc = 0;
1234
1235	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "icid = %08x\n", qp->icid);
1236
1237	if (QED_IS_IWARP_PERSONALITY(p_hwfn))
1238		rc = qed_iwarp_destroy_qp(p_hwfn, qp);
1239	else
1240		rc = qed_roce_destroy_qp(p_hwfn, qp);
1241
1242	/* free qp params struct */
1243	kfree(qp);
1244
1245	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "QP destroyed\n");
1246	return rc;
1247}
1248
1249static struct qed_rdma_qp *
1250qed_rdma_create_qp(void *rdma_cxt,
1251		   struct qed_rdma_create_qp_in_params *in_params,
1252		   struct qed_rdma_create_qp_out_params *out_params)
1253{
1254	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
1255	struct qed_rdma_qp *qp;
1256	u8 max_stats_queues;
1257	int rc;
1258
1259	if (!rdma_cxt || !in_params || !out_params ||
1260	    !p_hwfn->p_rdma_info->active) {
1261		pr_err("qed roce create qp failed due to NULL entry (rdma_cxt=%p, in=%p, out=%p, roce_info=?\n",
1262		       rdma_cxt, in_params, out_params);
1263		return NULL;
1264	}
1265
1266	DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
1267		   "qed rdma create qp called with qp_handle = %08x%08x\n",
1268		   in_params->qp_handle_hi, in_params->qp_handle_lo);
1269
1270	/* Some sanity checks... */
1271	max_stats_queues = p_hwfn->p_rdma_info->dev->max_stats_queues;
1272	if (in_params->stats_queue >= max_stats_queues) {
1273		DP_ERR(p_hwfn->cdev,
1274		       "qed rdma create qp failed due to invalid statistics queue %d. maximum is %d\n",
1275		       in_params->stats_queue, max_stats_queues);
1276		return NULL;
1277	}
1278
1279	if (QED_IS_IWARP_PERSONALITY(p_hwfn)) {
1280		if (in_params->sq_num_pages * sizeof(struct regpair) >
1281		    IWARP_SHARED_QUEUE_PAGE_SQ_PBL_MAX_SIZE) {
1282			DP_NOTICE(p_hwfn->cdev,
1283				  "Sq num pages: %d exceeds maximum\n",
1284				  in_params->sq_num_pages);
1285			return NULL;
1286		}
1287		if (in_params->rq_num_pages * sizeof(struct regpair) >
1288		    IWARP_SHARED_QUEUE_PAGE_RQ_PBL_MAX_SIZE) {
1289			DP_NOTICE(p_hwfn->cdev,
1290				  "Rq num pages: %d exceeds maximum\n",
1291				  in_params->rq_num_pages);
1292			return NULL;
1293		}
1294	}
1295
1296	qp = kzalloc(sizeof(*qp), GFP_KERNEL);
1297	if (!qp)
1298		return NULL;
1299
1300	qp->cur_state = QED_ROCE_QP_STATE_RESET;
1301	qp->qp_handle.hi = cpu_to_le32(in_params->qp_handle_hi);
1302	qp->qp_handle.lo = cpu_to_le32(in_params->qp_handle_lo);
1303	qp->qp_handle_async.hi = cpu_to_le32(in_params->qp_handle_async_hi);
1304	qp->qp_handle_async.lo = cpu_to_le32(in_params->qp_handle_async_lo);
1305	qp->use_srq = in_params->use_srq;
1306	qp->signal_all = in_params->signal_all;
1307	qp->fmr_and_reserved_lkey = in_params->fmr_and_reserved_lkey;
1308	qp->pd = in_params->pd;
1309	qp->dpi = in_params->dpi;
1310	qp->sq_cq_id = in_params->sq_cq_id;
1311	qp->sq_num_pages = in_params->sq_num_pages;
1312	qp->sq_pbl_ptr = in_params->sq_pbl_ptr;
1313	qp->rq_cq_id = in_params->rq_cq_id;
1314	qp->rq_num_pages = in_params->rq_num_pages;
1315	qp->rq_pbl_ptr = in_params->rq_pbl_ptr;
1316	qp->srq_id = in_params->srq_id;
1317	qp->req_offloaded = false;
1318	qp->resp_offloaded = false;
1319	qp->e2e_flow_control_en = qp->use_srq ? false : true;
1320	qp->stats_queue = in_params->stats_queue;
1321	qp->qp_type = in_params->qp_type;
1322	qp->xrcd_id = in_params->xrcd_id;
1323
1324	if (QED_IS_IWARP_PERSONALITY(p_hwfn)) {
1325		rc = qed_iwarp_create_qp(p_hwfn, qp, out_params);
1326		qp->qpid = qp->icid;
1327	} else {
1328		qp->edpm_mode = GET_FIELD(in_params->flags, QED_ROCE_EDPM_MODE);
1329		rc = qed_roce_alloc_cid(p_hwfn, &qp->icid);
1330		qp->qpid = ((0xFF << 16) | qp->icid);
1331	}
1332
1333	if (rc) {
1334		kfree(qp);
1335		return NULL;
1336	}
1337
1338	out_params->icid = qp->icid;
1339	out_params->qp_id = qp->qpid;
1340
1341	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Create QP, rc = %d\n", rc);
1342	return qp;
1343}
1344
1345static int qed_rdma_modify_qp(void *rdma_cxt,
1346			      struct qed_rdma_qp *qp,
1347			      struct qed_rdma_modify_qp_in_params *params)
1348{
1349	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
1350	enum qed_roce_qp_state prev_state;
1351	int rc = 0;
1352
1353	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "icid = %08x params->new_state=%d\n",
1354		   qp->icid, params->new_state);
1355
1356	if (rc) {
1357		DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "rc = %d\n", rc);
1358		return rc;
1359	}
1360
1361	if (GET_FIELD(params->modify_flags,
1362		      QED_RDMA_MODIFY_QP_VALID_RDMA_OPS_EN)) {
1363		qp->incoming_rdma_read_en = params->incoming_rdma_read_en;
1364		qp->incoming_rdma_write_en = params->incoming_rdma_write_en;
1365		qp->incoming_atomic_en = params->incoming_atomic_en;
1366	}
1367
1368	/* Update QP structure with the updated values */
1369	if (GET_FIELD(params->modify_flags, QED_ROCE_MODIFY_QP_VALID_ROCE_MODE))
1370		qp->roce_mode = params->roce_mode;
1371	if (GET_FIELD(params->modify_flags, QED_ROCE_MODIFY_QP_VALID_PKEY))
1372		qp->pkey = params->pkey;
1373	if (GET_FIELD(params->modify_flags,
1374		      QED_ROCE_MODIFY_QP_VALID_E2E_FLOW_CONTROL_EN))
1375		qp->e2e_flow_control_en = params->e2e_flow_control_en;
1376	if (GET_FIELD(params->modify_flags, QED_ROCE_MODIFY_QP_VALID_DEST_QP))
1377		qp->dest_qp = params->dest_qp;
1378	if (GET_FIELD(params->modify_flags,
1379		      QED_ROCE_MODIFY_QP_VALID_ADDRESS_VECTOR)) {
1380		/* Indicates that the following parameters have changed:
1381		 * Traffic class, flow label, hop limit, source GID,
1382		 * destination GID, loopback indicator
1383		 */
1384		qp->traffic_class_tos = params->traffic_class_tos;
1385		qp->flow_label = params->flow_label;
1386		qp->hop_limit_ttl = params->hop_limit_ttl;
1387
1388		qp->sgid = params->sgid;
1389		qp->dgid = params->dgid;
1390		qp->udp_src_port = 0;
1391		qp->vlan_id = params->vlan_id;
1392		qp->mtu = params->mtu;
1393		qp->lb_indication = params->lb_indication;
1394		memcpy((u8 *)&qp->remote_mac_addr[0],
1395		       (u8 *)&params->remote_mac_addr[0], ETH_ALEN);
1396		if (params->use_local_mac) {
1397			memcpy((u8 *)&qp->local_mac_addr[0],
1398			       (u8 *)&params->local_mac_addr[0], ETH_ALEN);
1399		} else {
1400			memcpy((u8 *)&qp->local_mac_addr[0],
1401			       (u8 *)&p_hwfn->hw_info.hw_mac_addr, ETH_ALEN);
1402		}
1403	}
1404	if (GET_FIELD(params->modify_flags, QED_ROCE_MODIFY_QP_VALID_RQ_PSN))
1405		qp->rq_psn = params->rq_psn;
1406	if (GET_FIELD(params->modify_flags, QED_ROCE_MODIFY_QP_VALID_SQ_PSN))
1407		qp->sq_psn = params->sq_psn;
1408	if (GET_FIELD(params->modify_flags,
1409		      QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_REQ))
1410		qp->max_rd_atomic_req = params->max_rd_atomic_req;
1411	if (GET_FIELD(params->modify_flags,
1412		      QED_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_RESP))
1413		qp->max_rd_atomic_resp = params->max_rd_atomic_resp;
1414	if (GET_FIELD(params->modify_flags,
1415		      QED_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT))
1416		qp->ack_timeout = params->ack_timeout;
1417	if (GET_FIELD(params->modify_flags, QED_ROCE_MODIFY_QP_VALID_RETRY_CNT))
1418		qp->retry_cnt = params->retry_cnt;
1419	if (GET_FIELD(params->modify_flags,
1420		      QED_ROCE_MODIFY_QP_VALID_RNR_RETRY_CNT))
1421		qp->rnr_retry_cnt = params->rnr_retry_cnt;
1422	if (GET_FIELD(params->modify_flags,
1423		      QED_ROCE_MODIFY_QP_VALID_MIN_RNR_NAK_TIMER))
1424		qp->min_rnr_nak_timer = params->min_rnr_nak_timer;
1425
1426	qp->sqd_async = params->sqd_async;
1427
1428	prev_state = qp->cur_state;
1429	if (GET_FIELD(params->modify_flags,
1430		      QED_RDMA_MODIFY_QP_VALID_NEW_STATE)) {
1431		qp->cur_state = params->new_state;
1432		DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "qp->cur_state=%d\n",
1433			   qp->cur_state);
1434	}
1435
1436	switch (qp->qp_type) {
1437	case QED_RDMA_QP_TYPE_XRC_INI:
1438		qp->has_req = true;
1439		break;
1440	case QED_RDMA_QP_TYPE_XRC_TGT:
1441		qp->has_resp = true;
1442		break;
1443	default:
1444		qp->has_req  = true;
1445		qp->has_resp = true;
1446	}
1447
1448	if (QED_IS_IWARP_PERSONALITY(p_hwfn)) {
1449		enum qed_iwarp_qp_state new_state =
1450		    qed_roce2iwarp_state(qp->cur_state);
1451
1452		rc = qed_iwarp_modify_qp(p_hwfn, qp, new_state, 0);
1453	} else {
1454		rc = qed_roce_modify_qp(p_hwfn, qp, prev_state, params);
1455	}
1456
1457	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Modify QP, rc = %d\n", rc);
1458	return rc;
1459}
1460
1461static int
1462qed_rdma_register_tid(void *rdma_cxt,
1463		      struct qed_rdma_register_tid_in_params *params)
1464{
1465	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
1466	struct rdma_register_tid_ramrod_data *p_ramrod;
1467	struct qed_sp_init_data init_data;
1468	struct qed_spq_entry *p_ent;
1469	enum rdma_tid_type tid_type;
1470	u8 fw_return_code;
1471	u16 flags = 0;
1472	int rc;
1473
1474	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "itid = %08x\n", params->itid);
1475
1476	/* Get SPQ entry */
1477	memset(&init_data, 0, sizeof(init_data));
1478	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
1479	init_data.comp_mode = QED_SPQ_MODE_EBLOCK;
1480
1481	rc = qed_sp_init_request(p_hwfn, &p_ent, RDMA_RAMROD_REGISTER_MR,
1482				 p_hwfn->p_rdma_info->proto, &init_data);
1483	if (rc) {
1484		DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "rc = %d\n", rc);
1485		return rc;
1486	}
1487
1488	if (p_hwfn->p_rdma_info->last_tid < params->itid)
1489		p_hwfn->p_rdma_info->last_tid = params->itid;
1490
1491	SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_TWO_LEVEL_PBL,
1492		  params->pbl_two_level);
1493
1494	SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_ZERO_BASED,
1495		  false);
1496
1497	SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_PHY_MR, params->phy_mr);
1498
1499	/* Don't initialize D/C field, as it may override other bits. */
1500	if (!(params->tid_type == QED_RDMA_TID_FMR) && !(params->dma_mr))
1501		SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_PAGE_SIZE_LOG,
1502			  params->page_size_log - 12);
1503
1504	SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_READ,
1505		  params->remote_read);
1506
1507	SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_WRITE,
1508		  params->remote_write);
1509
1510	SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_REMOTE_ATOMIC,
1511		  params->remote_atomic);
1512
1513	SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_LOCAL_WRITE,
1514		  params->local_write);
1515
1516	SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_LOCAL_READ,
1517		  params->local_read);
1518
1519	SET_FIELD(flags, RDMA_REGISTER_TID_RAMROD_DATA_ENABLE_MW_BIND,
1520		  params->mw_bind);
1521
1522	p_ramrod = &p_ent->ramrod.rdma_register_tid;
1523	p_ramrod->flags = cpu_to_le16(flags);
1524
1525	SET_FIELD(p_ramrod->flags1,
1526		  RDMA_REGISTER_TID_RAMROD_DATA_PBL_PAGE_SIZE_LOG,
1527		  params->pbl_page_size_log - 12);
1528
1529	SET_FIELD(p_ramrod->flags2, RDMA_REGISTER_TID_RAMROD_DATA_DMA_MR,
1530		  params->dma_mr);
1531
1532	switch (params->tid_type) {
1533	case QED_RDMA_TID_REGISTERED_MR:
1534		tid_type = RDMA_TID_REGISTERED_MR;
1535		break;
1536	case QED_RDMA_TID_FMR:
1537		tid_type = RDMA_TID_FMR;
1538		break;
1539	case QED_RDMA_TID_MW:
1540		tid_type = RDMA_TID_MW;
1541		break;
1542	default:
1543		rc = -EINVAL;
1544		DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "rc = %d\n", rc);
1545		qed_sp_destroy_request(p_hwfn, p_ent);
1546		return rc;
1547	}
1548
1549	SET_FIELD(p_ramrod->flags1, RDMA_REGISTER_TID_RAMROD_DATA_TID_TYPE,
1550		  tid_type);
1551
1552	p_ramrod->itid = cpu_to_le32(params->itid);
1553	p_ramrod->key = params->key;
1554	p_ramrod->pd = cpu_to_le16(params->pd);
1555	p_ramrod->length_hi = (u8)(params->length >> 32);
1556	p_ramrod->length_lo = DMA_LO_LE(params->length);
1557	DMA_REGPAIR_LE(p_ramrod->va, params->vaddr);
1558	DMA_REGPAIR_LE(p_ramrod->pbl_base, params->pbl_ptr);
1559
1560	/* DIF */
1561	if (params->dif_enabled) {
1562		SET_FIELD(p_ramrod->flags2,
1563			  RDMA_REGISTER_TID_RAMROD_DATA_DIF_ON_HOST_FLG, 1);
1564		DMA_REGPAIR_LE(p_ramrod->dif_error_addr,
1565			       params->dif_error_addr);
1566	}
1567
1568	rc = qed_spq_post(p_hwfn, p_ent, &fw_return_code);
1569	if (rc)
1570		return rc;
1571
1572	if (fw_return_code != RDMA_RETURN_OK) {
1573		DP_NOTICE(p_hwfn, "fw_return_code = %d\n", fw_return_code);
1574		return -EINVAL;
1575	}
1576
1577	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "Register TID, rc = %d\n", rc);
1578	return rc;
1579}
1580
1581static int qed_rdma_deregister_tid(void *rdma_cxt, u32 itid)
1582{
1583	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
1584	struct rdma_deregister_tid_ramrod_data *p_ramrod;
1585	struct qed_sp_init_data init_data;
1586	struct qed_spq_entry *p_ent;
1587	struct qed_ptt *p_ptt;
1588	u8 fw_return_code;
1589	int rc;
1590
1591	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "itid = %08x\n", itid);
1592
1593	/* Get SPQ entry */
1594	memset(&init_data, 0, sizeof(init_data));
1595	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
1596	init_data.comp_mode = QED_SPQ_MODE_EBLOCK;
1597
1598	rc = qed_sp_init_request(p_hwfn, &p_ent, RDMA_RAMROD_DEREGISTER_MR,
1599				 p_hwfn->p_rdma_info->proto, &init_data);
1600	if (rc) {
1601		DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "rc = %d\n", rc);
1602		return rc;
1603	}
1604
1605	p_ramrod = &p_ent->ramrod.rdma_deregister_tid;
1606	p_ramrod->itid = cpu_to_le32(itid);
1607
1608	rc = qed_spq_post(p_hwfn, p_ent, &fw_return_code);
1609	if (rc) {
1610		DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "rc = %d\n", rc);
1611		return rc;
1612	}
1613
1614	if (fw_return_code == RDMA_RETURN_DEREGISTER_MR_BAD_STATE_ERR) {
1615		DP_NOTICE(p_hwfn, "fw_return_code = %d\n", fw_return_code);
1616		return -EINVAL;
1617	} else if (fw_return_code == RDMA_RETURN_NIG_DRAIN_REQ) {
1618		/* Bit indicating that the TID is in use and a nig drain is
1619		 * required before sending the ramrod again
1620		 */
1621		p_ptt = qed_ptt_acquire(p_hwfn);
1622		if (!p_ptt) {
1623			rc = -EBUSY;
1624			DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
1625				   "Failed to acquire PTT\n");
1626			return rc;
1627		}
1628
1629		rc = qed_mcp_drain(p_hwfn, p_ptt);
1630		if (rc) {
1631			qed_ptt_release(p_hwfn, p_ptt);
1632			DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
1633				   "Drain failed\n");
1634			return rc;
1635		}
1636
1637		qed_ptt_release(p_hwfn, p_ptt);
1638
1639		/* Resend the ramrod */
1640		rc = qed_sp_init_request(p_hwfn, &p_ent,
1641					 RDMA_RAMROD_DEREGISTER_MR,
1642					 p_hwfn->p_rdma_info->proto,
1643					 &init_data);
1644		if (rc) {
1645			DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
1646				   "Failed to init sp-element\n");
1647			return rc;
1648		}
1649
1650		rc = qed_spq_post(p_hwfn, p_ent, &fw_return_code);
1651		if (rc) {
1652			DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
1653				   "Ramrod failed\n");
1654			return rc;
1655		}
1656
1657		if (fw_return_code != RDMA_RETURN_OK) {
1658			DP_NOTICE(p_hwfn, "fw_return_code = %d\n",
1659				  fw_return_code);
1660			return rc;
1661		}
1662	}
1663
1664	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "De-registered TID, rc = %d\n", rc);
1665	return rc;
1666}
1667
1668static void *qed_rdma_get_rdma_ctx(struct qed_dev *cdev)
1669{
1670	return QED_AFFIN_HWFN(cdev);
1671}
1672
1673static struct qed_bmap *qed_rdma_get_srq_bmap(struct qed_hwfn *p_hwfn,
1674					      bool is_xrc)
1675{
1676	if (is_xrc)
1677		return &p_hwfn->p_rdma_info->xrc_srq_map;
1678
1679	return &p_hwfn->p_rdma_info->srq_map;
1680}
1681
1682static int qed_rdma_modify_srq(void *rdma_cxt,
1683			       struct qed_rdma_modify_srq_in_params *in_params)
1684{
1685	struct rdma_srq_modify_ramrod_data *p_ramrod;
1686	struct qed_sp_init_data init_data = {};
1687	struct qed_hwfn *p_hwfn = rdma_cxt;
1688	struct qed_spq_entry *p_ent;
1689	u16 opaque_fid;
1690	int rc;
1691
1692	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
1693	init_data.comp_mode = QED_SPQ_MODE_EBLOCK;
1694
1695	rc = qed_sp_init_request(p_hwfn, &p_ent,
1696				 RDMA_RAMROD_MODIFY_SRQ,
1697				 p_hwfn->p_rdma_info->proto, &init_data);
1698	if (rc)
1699		return rc;
1700
1701	p_ramrod = &p_ent->ramrod.rdma_modify_srq;
1702	p_ramrod->srq_id.srq_idx = cpu_to_le16(in_params->srq_id);
1703	opaque_fid = p_hwfn->hw_info.opaque_fid;
1704	p_ramrod->srq_id.opaque_fid = cpu_to_le16(opaque_fid);
1705	p_ramrod->wqe_limit = cpu_to_le32(in_params->wqe_limit);
1706
1707	rc = qed_spq_post(p_hwfn, p_ent, NULL);
1708	if (rc)
1709		return rc;
1710
1711	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "modified SRQ id = %x, is_xrc=%u\n",
1712		   in_params->srq_id, in_params->is_xrc);
1713
1714	return rc;
1715}
1716
1717static int
1718qed_rdma_destroy_srq(void *rdma_cxt,
1719		     struct qed_rdma_destroy_srq_in_params *in_params)
1720{
1721	struct rdma_srq_destroy_ramrod_data *p_ramrod;
1722	struct qed_sp_init_data init_data = {};
1723	struct qed_hwfn *p_hwfn = rdma_cxt;
1724	struct qed_spq_entry *p_ent;
1725	struct qed_bmap *bmap;
1726	u16 opaque_fid;
1727	u16 offset;
1728	int rc;
1729
1730	opaque_fid = p_hwfn->hw_info.opaque_fid;
1731
1732	init_data.opaque_fid = opaque_fid;
1733	init_data.comp_mode = QED_SPQ_MODE_EBLOCK;
1734
1735	rc = qed_sp_init_request(p_hwfn, &p_ent,
1736				 RDMA_RAMROD_DESTROY_SRQ,
1737				 p_hwfn->p_rdma_info->proto, &init_data);
1738	if (rc)
1739		return rc;
1740
1741	p_ramrod = &p_ent->ramrod.rdma_destroy_srq;
1742	p_ramrod->srq_id.srq_idx = cpu_to_le16(in_params->srq_id);
1743	p_ramrod->srq_id.opaque_fid = cpu_to_le16(opaque_fid);
1744
1745	rc = qed_spq_post(p_hwfn, p_ent, NULL);
1746	if (rc)
1747		return rc;
1748
1749	bmap = qed_rdma_get_srq_bmap(p_hwfn, in_params->is_xrc);
1750	offset = (in_params->is_xrc) ? 0 : p_hwfn->p_rdma_info->srq_id_offset;
1751
1752	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
1753	qed_bmap_release_id(p_hwfn, bmap, in_params->srq_id - offset);
1754	spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
1755
1756	DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
1757		   "XRC/SRQ destroyed Id = %x, is_xrc=%u\n",
1758		   in_params->srq_id, in_params->is_xrc);
1759
1760	return rc;
1761}
1762
1763static int
1764qed_rdma_create_srq(void *rdma_cxt,
1765		    struct qed_rdma_create_srq_in_params *in_params,
1766		    struct qed_rdma_create_srq_out_params *out_params)
1767{
1768	struct rdma_srq_create_ramrod_data *p_ramrod;
1769	struct qed_sp_init_data init_data = {};
1770	struct qed_hwfn *p_hwfn = rdma_cxt;
1771	enum qed_cxt_elem_type elem_type;
1772	struct qed_spq_entry *p_ent;
1773	u16 opaque_fid, srq_id;
1774	struct qed_bmap *bmap;
1775	u32 returned_id;
1776	u16 offset;
1777	int rc;
1778
1779	bmap = qed_rdma_get_srq_bmap(p_hwfn, in_params->is_xrc);
1780	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
1781	rc = qed_rdma_bmap_alloc_id(p_hwfn, bmap, &returned_id);
1782	spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
1783
1784	if (rc) {
1785		DP_NOTICE(p_hwfn,
1786			  "failed to allocate xrc/srq id (is_xrc=%u)\n",
1787			  in_params->is_xrc);
1788		return rc;
1789	}
1790
1791	elem_type = (in_params->is_xrc) ? (QED_ELEM_XRC_SRQ) : (QED_ELEM_SRQ);
1792	rc = qed_cxt_dynamic_ilt_alloc(p_hwfn, elem_type, returned_id);
1793	if (rc)
1794		goto err;
1795
1796	opaque_fid = p_hwfn->hw_info.opaque_fid;
1797	init_data.opaque_fid = opaque_fid;
1798	init_data.comp_mode = QED_SPQ_MODE_EBLOCK;
1799
1800	rc = qed_sp_init_request(p_hwfn, &p_ent,
1801				 RDMA_RAMROD_CREATE_SRQ,
1802				 p_hwfn->p_rdma_info->proto, &init_data);
1803	if (rc)
1804		goto err;
1805
1806	p_ramrod = &p_ent->ramrod.rdma_create_srq;
1807	DMA_REGPAIR_LE(p_ramrod->pbl_base_addr, in_params->pbl_base_addr);
1808	p_ramrod->pages_in_srq_pbl = cpu_to_le16(in_params->num_pages);
1809	p_ramrod->pd_id = cpu_to_le16(in_params->pd_id);
1810	p_ramrod->srq_id.opaque_fid = cpu_to_le16(opaque_fid);
1811	p_ramrod->page_size = cpu_to_le16(in_params->page_size);
1812	DMA_REGPAIR_LE(p_ramrod->producers_addr, in_params->prod_pair_addr);
1813	offset = (in_params->is_xrc) ? 0 : p_hwfn->p_rdma_info->srq_id_offset;
1814	srq_id = (u16)returned_id + offset;
1815	p_ramrod->srq_id.srq_idx = cpu_to_le16(srq_id);
1816
1817	if (in_params->is_xrc) {
1818		SET_FIELD(p_ramrod->flags,
1819			  RDMA_SRQ_CREATE_RAMROD_DATA_XRC_FLAG, 1);
1820		SET_FIELD(p_ramrod->flags,
1821			  RDMA_SRQ_CREATE_RAMROD_DATA_RESERVED_KEY_EN,
1822			  in_params->reserved_key_en);
1823		p_ramrod->xrc_srq_cq_cid =
1824			cpu_to_le32((p_hwfn->hw_info.opaque_fid << 16) |
1825				     in_params->cq_cid);
1826		p_ramrod->xrc_domain = cpu_to_le16(in_params->xrcd_id);
1827	}
1828	rc = qed_spq_post(p_hwfn, p_ent, NULL);
1829	if (rc)
1830		goto err;
1831
1832	out_params->srq_id = srq_id;
1833
1834	DP_VERBOSE(p_hwfn,
1835		   QED_MSG_RDMA,
1836		   "XRC/SRQ created Id = %x (is_xrc=%u)\n",
1837		   out_params->srq_id, in_params->is_xrc);
1838	return rc;
1839
1840err:
1841	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
1842	qed_bmap_release_id(p_hwfn, bmap, returned_id);
1843	spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
1844
1845	return rc;
1846}
1847
1848bool qed_rdma_allocated_qps(struct qed_hwfn *p_hwfn)
1849{
1850	bool result;
1851
1852	/* if rdma wasn't activated yet, naturally there are no qps */
1853	if (!p_hwfn->p_rdma_info->active)
1854		return false;
1855
1856	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
1857	if (!p_hwfn->p_rdma_info->cid_map.bitmap)
1858		result = false;
1859	else
1860		result = !qed_bmap_is_empty(&p_hwfn->p_rdma_info->cid_map);
1861	spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
1862	return result;
1863}
1864
1865void qed_rdma_dpm_conf(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
1866{
1867	u32 val;
1868
1869	val = (p_hwfn->dcbx_no_edpm || p_hwfn->db_bar_no_edpm) ? 0 : 1;
1870
1871	qed_wr(p_hwfn, p_ptt, DORQ_REG_PF_DPM_ENABLE, val);
1872	DP_VERBOSE(p_hwfn, (QED_MSG_DCB | QED_MSG_RDMA),
1873		   "Changing DPM_EN state to %d (DCBX=%d, DB_BAR=%d)\n",
1874		   val, p_hwfn->dcbx_no_edpm, p_hwfn->db_bar_no_edpm);
1875}
1876
1877void qed_rdma_dpm_bar(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
1878{
1879	p_hwfn->db_bar_no_edpm = true;
1880
1881	qed_rdma_dpm_conf(p_hwfn, p_ptt);
1882}
1883
1884static int qed_rdma_start(void *rdma_cxt,
1885			  struct qed_rdma_start_in_params *params)
1886{
1887	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
1888	struct qed_ptt *p_ptt;
1889	int rc = -EBUSY;
1890
1891	DP_VERBOSE(p_hwfn, QED_MSG_RDMA,
1892		   "desired_cnq = %08x\n", params->desired_cnq);
1893
1894	p_ptt = qed_ptt_acquire(p_hwfn);
1895	if (!p_ptt)
1896		goto err;
1897
1898	rc = qed_rdma_alloc(p_hwfn);
1899	if (rc)
1900		goto err1;
1901
1902	rc = qed_rdma_setup(p_hwfn, p_ptt, params);
1903	if (rc)
1904		goto err2;
1905
1906	qed_ptt_release(p_hwfn, p_ptt);
1907	p_hwfn->p_rdma_info->active = 1;
1908
1909	return rc;
1910
1911err2:
1912	qed_rdma_free(p_hwfn);
1913err1:
1914	qed_ptt_release(p_hwfn, p_ptt);
1915err:
1916	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "RDMA start - error, rc = %d\n", rc);
1917	return rc;
1918}
1919
1920static int qed_rdma_init(struct qed_dev *cdev,
1921			 struct qed_rdma_start_in_params *params)
1922{
1923	return qed_rdma_start(QED_AFFIN_HWFN(cdev), params);
1924}
1925
1926static void qed_rdma_remove_user(void *rdma_cxt, u16 dpi)
1927{
1928	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
1929
1930	DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "dpi = %08x\n", dpi);
1931
1932	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
1933	qed_bmap_release_id(p_hwfn, &p_hwfn->p_rdma_info->dpi_map, dpi);
1934	spin_unlock_bh(&p_hwfn->p_rdma_info->lock);
1935}
1936
1937static int qed_roce_ll2_set_mac_filter(struct qed_dev *cdev,
1938				       u8 *old_mac_address,
1939				       const u8 *new_mac_address)
1940{
1941	int rc = 0;
1942
1943	if (old_mac_address)
1944		qed_llh_remove_mac_filter(cdev, 0, old_mac_address);
1945	if (new_mac_address)
1946		rc = qed_llh_add_mac_filter(cdev, 0, new_mac_address);
1947
1948	if (rc)
1949		DP_ERR(cdev,
1950		       "qed roce ll2 mac filter set: failed to add MAC filter\n");
1951
1952	return rc;
1953}
1954
1955static int qed_iwarp_set_engine_affin(struct qed_dev *cdev, bool b_reset)
1956{
1957	enum qed_eng eng;
1958	u8 ppfid = 0;
1959	int rc;
1960
1961	/* Make sure iwarp cmt mode is enabled before setting affinity */
1962	if (!cdev->iwarp_cmt)
1963		return -EINVAL;
1964
1965	if (b_reset)
1966		eng = QED_BOTH_ENG;
1967	else
1968		eng = cdev->l2_affin_hint ? QED_ENG1 : QED_ENG0;
1969
1970	rc = qed_llh_set_ppfid_affinity(cdev, ppfid, eng);
1971	if (rc) {
1972		DP_NOTICE(cdev,
1973			  "Failed to set the engine affinity of ppfid %d\n",
1974			  ppfid);
1975		return rc;
1976	}
1977
1978	DP_VERBOSE(cdev, (QED_MSG_RDMA | QED_MSG_SP),
1979		   "LLH: Set the engine affinity of non-RoCE packets as %d\n",
1980		   eng);
1981
1982	return 0;
1983}
1984
1985static const struct qed_rdma_ops qed_rdma_ops_pass = {
1986	.common = &qed_common_ops_pass,
1987	.fill_dev_info = &qed_fill_rdma_dev_info,
1988	.rdma_get_rdma_ctx = &qed_rdma_get_rdma_ctx,
1989	.rdma_init = &qed_rdma_init,
1990	.rdma_add_user = &qed_rdma_add_user,
1991	.rdma_remove_user = &qed_rdma_remove_user,
1992	.rdma_stop = &qed_rdma_stop,
1993	.rdma_query_port = &qed_rdma_query_port,
1994	.rdma_query_device = &qed_rdma_query_device,
1995	.rdma_get_start_sb = &qed_rdma_get_sb_start,
1996	.rdma_get_rdma_int = &qed_rdma_get_int,
1997	.rdma_set_rdma_int = &qed_rdma_set_int,
1998	.rdma_get_min_cnq_msix = &qed_rdma_get_min_cnq_msix,
1999	.rdma_cnq_prod_update = &qed_rdma_cnq_prod_update,
2000	.rdma_alloc_pd = &qed_rdma_alloc_pd,
2001	.rdma_dealloc_pd = &qed_rdma_free_pd,
2002	.rdma_alloc_xrcd = &qed_rdma_alloc_xrcd,
2003	.rdma_dealloc_xrcd = &qed_rdma_free_xrcd,
2004	.rdma_create_cq = &qed_rdma_create_cq,
2005	.rdma_destroy_cq = &qed_rdma_destroy_cq,
2006	.rdma_create_qp = &qed_rdma_create_qp,
2007	.rdma_modify_qp = &qed_rdma_modify_qp,
2008	.rdma_query_qp = &qed_rdma_query_qp,
2009	.rdma_destroy_qp = &qed_rdma_destroy_qp,
2010	.rdma_alloc_tid = &qed_rdma_alloc_tid,
2011	.rdma_free_tid = &qed_rdma_free_tid,
2012	.rdma_register_tid = &qed_rdma_register_tid,
2013	.rdma_deregister_tid = &qed_rdma_deregister_tid,
2014	.rdma_create_srq = &qed_rdma_create_srq,
2015	.rdma_modify_srq = &qed_rdma_modify_srq,
2016	.rdma_destroy_srq = &qed_rdma_destroy_srq,
2017	.ll2_acquire_connection = &qed_ll2_acquire_connection,
2018	.ll2_establish_connection = &qed_ll2_establish_connection,
2019	.ll2_terminate_connection = &qed_ll2_terminate_connection,
2020	.ll2_release_connection = &qed_ll2_release_connection,
2021	.ll2_post_rx_buffer = &qed_ll2_post_rx_buffer,
2022	.ll2_prepare_tx_packet = &qed_ll2_prepare_tx_packet,
2023	.ll2_set_fragment_of_tx_packet = &qed_ll2_set_fragment_of_tx_packet,
2024	.ll2_set_mac_filter = &qed_roce_ll2_set_mac_filter,
2025	.ll2_get_stats = &qed_ll2_get_stats,
2026	.iwarp_set_engine_affin = &qed_iwarp_set_engine_affin,
2027	.iwarp_connect = &qed_iwarp_connect,
2028	.iwarp_create_listen = &qed_iwarp_create_listen,
2029	.iwarp_destroy_listen = &qed_iwarp_destroy_listen,
2030	.iwarp_accept = &qed_iwarp_accept,
2031	.iwarp_reject = &qed_iwarp_reject,
2032	.iwarp_send_rtr = &qed_iwarp_send_rtr,
2033};
2034
2035const struct qed_rdma_ops *qed_get_rdma_ops(void)
2036{
2037	return &qed_rdma_ops_pass;
2038}
2039EXPORT_SYMBOL(qed_get_rdma_ops);
2040