log: introduce logtype register macro
[dpdk.git] / drivers / net / octeontx2 / otx2_ethdev.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2019 Marvell International Ltd.
3  */
4
5 #include <inttypes.h>
6
7 #include <rte_ethdev_pci.h>
8 #include <rte_io.h>
9 #include <rte_malloc.h>
10 #include <rte_mbuf.h>
11 #include <rte_mbuf_pool_ops.h>
12 #include <rte_mempool.h>
13
14 #include "otx2_ethdev.h"
15 #include "otx2_ethdev_sec.h"
16
17 static inline uint64_t
18 nix_get_rx_offload_capa(struct otx2_eth_dev *dev)
19 {
20         uint64_t capa = NIX_RX_OFFLOAD_CAPA;
21
22         if (otx2_dev_is_vf(dev) ||
23             dev->npc_flow.switch_header_type == OTX2_PRIV_FLAGS_HIGIG)
24                 capa &= ~DEV_RX_OFFLOAD_TIMESTAMP;
25
26         return capa;
27 }
28
29 static inline uint64_t
30 nix_get_tx_offload_capa(struct otx2_eth_dev *dev)
31 {
32         uint64_t capa = NIX_TX_OFFLOAD_CAPA;
33
34         /* TSO not supported for earlier chip revisions */
35         if (otx2_dev_is_96xx_A0(dev) || otx2_dev_is_95xx_Ax(dev))
36                 capa &= ~(DEV_TX_OFFLOAD_TCP_TSO |
37                           DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
38                           DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
39                           DEV_TX_OFFLOAD_GRE_TNL_TSO);
40         return capa;
41 }
42
43 static const struct otx2_dev_ops otx2_dev_ops = {
44         .link_status_update = otx2_eth_dev_link_status_update,
45         .ptp_info_update = otx2_eth_dev_ptp_info_update
46 };
47
48 static int
49 nix_lf_alloc(struct otx2_eth_dev *dev, uint32_t nb_rxq, uint32_t nb_txq)
50 {
51         struct otx2_mbox *mbox = dev->mbox;
52         struct nix_lf_alloc_req *req;
53         struct nix_lf_alloc_rsp *rsp;
54         int rc;
55
56         req = otx2_mbox_alloc_msg_nix_lf_alloc(mbox);
57         req->rq_cnt = nb_rxq;
58         req->sq_cnt = nb_txq;
59         req->cq_cnt = nb_rxq;
60         /* XQE_SZ should be in Sync with NIX_CQ_ENTRY_SZ */
61         RTE_BUILD_BUG_ON(NIX_CQ_ENTRY_SZ != 128);
62         req->xqe_sz = NIX_XQESZ_W16;
63         req->rss_sz = dev->rss_info.rss_size;
64         req->rss_grps = NIX_RSS_GRPS;
65         req->npa_func = otx2_npa_pf_func_get();
66         req->sso_func = otx2_sso_pf_func_get();
67         req->rx_cfg = BIT_ULL(35 /* DIS_APAD */);
68         if (dev->rx_offloads & (DEV_RX_OFFLOAD_TCP_CKSUM |
69                          DEV_RX_OFFLOAD_UDP_CKSUM)) {
70                 req->rx_cfg |= BIT_ULL(37 /* CSUM_OL4 */);
71                 req->rx_cfg |= BIT_ULL(36 /* CSUM_IL4 */);
72         }
73         req->rx_cfg |= (BIT_ULL(32 /* DROP_RE */)             |
74                         BIT_ULL(33 /* Outer L2 Length */)     |
75                         BIT_ULL(38 /* Inner L4 UDP Length */) |
76                         BIT_ULL(39 /* Inner L3 Length */)     |
77                         BIT_ULL(40 /* Outer L4 UDP Length */) |
78                         BIT_ULL(41 /* Outer L3 Length */));
79
80         if (dev->rss_tag_as_xor == 0)
81                 req->flags = NIX_LF_RSS_TAG_LSB_AS_ADDER;
82
83         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
84         if (rc)
85                 return rc;
86
87         dev->sqb_size = rsp->sqb_size;
88         dev->tx_chan_base = rsp->tx_chan_base;
89         dev->rx_chan_base = rsp->rx_chan_base;
90         dev->rx_chan_cnt = rsp->rx_chan_cnt;
91         dev->tx_chan_cnt = rsp->tx_chan_cnt;
92         dev->lso_tsov4_idx = rsp->lso_tsov4_idx;
93         dev->lso_tsov6_idx = rsp->lso_tsov6_idx;
94         dev->lf_tx_stats = rsp->lf_tx_stats;
95         dev->lf_rx_stats = rsp->lf_rx_stats;
96         dev->cints = rsp->cints;
97         dev->qints = rsp->qints;
98         dev->npc_flow.channel = dev->rx_chan_base;
99         dev->ptp_en = rsp->hw_rx_tstamp_en;
100
101         return 0;
102 }
103
104 static int
105 nix_lf_switch_header_type_enable(struct otx2_eth_dev *dev, bool enable)
106 {
107         struct otx2_mbox *mbox = dev->mbox;
108         struct npc_set_pkind *req;
109         struct msg_resp *rsp;
110         int rc;
111
112         if (dev->npc_flow.switch_header_type == 0)
113                 return 0;
114
115         if (dev->npc_flow.switch_header_type == OTX2_PRIV_FLAGS_LEN_90B &&
116             !otx2_dev_is_sdp(dev)) {
117                 otx2_err("chlen90b is not supported on non-SDP device");
118                 return -EINVAL;
119         }
120
121         /* Notify AF about higig2 config */
122         req = otx2_mbox_alloc_msg_npc_set_pkind(mbox);
123         req->mode = dev->npc_flow.switch_header_type;
124         if (enable == 0)
125                 req->mode = OTX2_PRIV_FLAGS_DEFAULT;
126         req->dir = PKIND_RX;
127         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
128         if (rc)
129                 return rc;
130         req = otx2_mbox_alloc_msg_npc_set_pkind(mbox);
131         req->mode = dev->npc_flow.switch_header_type;
132         if (enable == 0)
133                 req->mode = OTX2_PRIV_FLAGS_DEFAULT;
134         req->dir = PKIND_TX;
135         return otx2_mbox_process_msg(mbox, (void *)&rsp);
136 }
137
138 static int
139 nix_lf_free(struct otx2_eth_dev *dev)
140 {
141         struct otx2_mbox *mbox = dev->mbox;
142         struct nix_lf_free_req *req;
143         struct ndc_sync_op *ndc_req;
144         int rc;
145
146         /* Sync NDC-NIX for LF */
147         ndc_req = otx2_mbox_alloc_msg_ndc_sync_op(mbox);
148         ndc_req->nix_lf_tx_sync = 1;
149         ndc_req->nix_lf_rx_sync = 1;
150         rc = otx2_mbox_process(mbox);
151         if (rc)
152                 otx2_err("Error on NDC-NIX-[TX, RX] LF sync, rc %d", rc);
153
154         req = otx2_mbox_alloc_msg_nix_lf_free(mbox);
155         /* Let AF driver free all this nix lf's
156          * NPC entries allocated using NPC MBOX.
157          */
158         req->flags = 0;
159
160         return otx2_mbox_process(mbox);
161 }
162
163 int
164 otx2_cgx_rxtx_start(struct otx2_eth_dev *dev)
165 {
166         struct otx2_mbox *mbox = dev->mbox;
167
168         if (otx2_dev_is_vf_or_sdp(dev))
169                 return 0;
170
171         otx2_mbox_alloc_msg_cgx_start_rxtx(mbox);
172
173         return otx2_mbox_process(mbox);
174 }
175
176 int
177 otx2_cgx_rxtx_stop(struct otx2_eth_dev *dev)
178 {
179         struct otx2_mbox *mbox = dev->mbox;
180
181         if (otx2_dev_is_vf_or_sdp(dev))
182                 return 0;
183
184         otx2_mbox_alloc_msg_cgx_stop_rxtx(mbox);
185
186         return otx2_mbox_process(mbox);
187 }
188
189 static int
190 npc_rx_enable(struct otx2_eth_dev *dev)
191 {
192         struct otx2_mbox *mbox = dev->mbox;
193
194         otx2_mbox_alloc_msg_nix_lf_start_rx(mbox);
195
196         return otx2_mbox_process(mbox);
197 }
198
199 static int
200 npc_rx_disable(struct otx2_eth_dev *dev)
201 {
202         struct otx2_mbox *mbox = dev->mbox;
203
204         otx2_mbox_alloc_msg_nix_lf_stop_rx(mbox);
205
206         return otx2_mbox_process(mbox);
207 }
208
209 static int
210 nix_cgx_start_link_event(struct otx2_eth_dev *dev)
211 {
212         struct otx2_mbox *mbox = dev->mbox;
213
214         if (otx2_dev_is_vf_or_sdp(dev))
215                 return 0;
216
217         otx2_mbox_alloc_msg_cgx_start_linkevents(mbox);
218
219         return otx2_mbox_process(mbox);
220 }
221
222 static int
223 cgx_intlbk_enable(struct otx2_eth_dev *dev, bool en)
224 {
225         struct otx2_mbox *mbox = dev->mbox;
226
227         if (en && otx2_dev_is_vf_or_sdp(dev))
228                 return -ENOTSUP;
229
230         if (en)
231                 otx2_mbox_alloc_msg_cgx_intlbk_enable(mbox);
232         else
233                 otx2_mbox_alloc_msg_cgx_intlbk_disable(mbox);
234
235         return otx2_mbox_process(mbox);
236 }
237
238 static int
239 nix_cgx_stop_link_event(struct otx2_eth_dev *dev)
240 {
241         struct otx2_mbox *mbox = dev->mbox;
242
243         if (otx2_dev_is_vf_or_sdp(dev))
244                 return 0;
245
246         otx2_mbox_alloc_msg_cgx_stop_linkevents(mbox);
247
248         return otx2_mbox_process(mbox);
249 }
250
251 static inline void
252 nix_rx_queue_reset(struct otx2_eth_rxq *rxq)
253 {
254         rxq->head = 0;
255         rxq->available = 0;
256 }
257
258 static inline uint32_t
259 nix_qsize_to_val(enum nix_q_size_e qsize)
260 {
261         return (16UL << (qsize * 2));
262 }
263
264 static inline enum nix_q_size_e
265 nix_qsize_clampup_get(struct otx2_eth_dev *dev, uint32_t val)
266 {
267         int i;
268
269         if (otx2_ethdev_fixup_is_min_4k_q(dev))
270                 i = nix_q_size_4K;
271         else
272                 i = nix_q_size_16;
273
274         for (; i < nix_q_size_max; i++)
275                 if (val <= nix_qsize_to_val(i))
276                         break;
277
278         if (i >= nix_q_size_max)
279                 i = nix_q_size_max - 1;
280
281         return i;
282 }
283
284 static int
285 nix_cq_rq_init(struct rte_eth_dev *eth_dev, struct otx2_eth_dev *dev,
286                uint16_t qid, struct otx2_eth_rxq *rxq, struct rte_mempool *mp)
287 {
288         struct otx2_mbox *mbox = dev->mbox;
289         const struct rte_memzone *rz;
290         uint32_t ring_size, cq_size;
291         struct nix_aq_enq_req *aq;
292         uint16_t first_skip;
293         int rc;
294
295         cq_size = rxq->qlen;
296         ring_size = cq_size * NIX_CQ_ENTRY_SZ;
297         rz = rte_eth_dma_zone_reserve(eth_dev, "cq", qid, ring_size,
298                                       NIX_CQ_ALIGN, dev->node);
299         if (rz == NULL) {
300                 otx2_err("Failed to allocate mem for cq hw ring");
301                 rc = -ENOMEM;
302                 goto fail;
303         }
304         memset(rz->addr, 0, rz->len);
305         rxq->desc = (uintptr_t)rz->addr;
306         rxq->qmask = cq_size - 1;
307
308         aq = otx2_mbox_alloc_msg_nix_aq_enq(mbox);
309         aq->qidx = qid;
310         aq->ctype = NIX_AQ_CTYPE_CQ;
311         aq->op = NIX_AQ_INSTOP_INIT;
312
313         aq->cq.ena = 1;
314         aq->cq.caching = 1;
315         aq->cq.qsize = rxq->qsize;
316         aq->cq.base = rz->iova;
317         aq->cq.avg_level = 0xff;
318         aq->cq.cq_err_int_ena = BIT(NIX_CQERRINT_CQE_FAULT);
319         aq->cq.cq_err_int_ena |= BIT(NIX_CQERRINT_DOOR_ERR);
320
321         /* Many to one reduction */
322         aq->cq.qint_idx = qid % dev->qints;
323         /* Map CQ0 [RQ0] to CINT0 and so on till max 64 irqs */
324         aq->cq.cint_idx = qid;
325
326         if (otx2_ethdev_fixup_is_limit_cq_full(dev)) {
327                 const float rx_cq_skid = NIX_CQ_FULL_ERRATA_SKID;
328                 uint16_t min_rx_drop;
329
330                 min_rx_drop = ceil(rx_cq_skid / (float)cq_size);
331                 aq->cq.drop = min_rx_drop;
332                 aq->cq.drop_ena = 1;
333                 rxq->cq_drop = min_rx_drop;
334         } else {
335                 rxq->cq_drop = NIX_CQ_THRESH_LEVEL;
336                 aq->cq.drop = rxq->cq_drop;
337                 aq->cq.drop_ena = 1;
338         }
339
340         /* TX pause frames enable flowctrl on RX side */
341         if (dev->fc_info.tx_pause) {
342                 /* Single bpid is allocated for all rx channels for now */
343                 aq->cq.bpid = dev->fc_info.bpid[0];
344                 aq->cq.bp = rxq->cq_drop;
345                 aq->cq.bp_ena = 1;
346         }
347
348         rc = otx2_mbox_process(mbox);
349         if (rc) {
350                 otx2_err("Failed to init cq context");
351                 goto fail;
352         }
353
354         aq = otx2_mbox_alloc_msg_nix_aq_enq(mbox);
355         aq->qidx = qid;
356         aq->ctype = NIX_AQ_CTYPE_RQ;
357         aq->op = NIX_AQ_INSTOP_INIT;
358
359         aq->rq.sso_ena = 0;
360
361         if (rxq->offloads & DEV_RX_OFFLOAD_SECURITY)
362                 aq->rq.ipsech_ena = 1;
363
364         aq->rq.cq = qid; /* RQ to CQ 1:1 mapped */
365         aq->rq.spb_ena = 0;
366         aq->rq.lpb_aura = npa_lf_aura_handle_to_aura(mp->pool_id);
367         first_skip = (sizeof(struct rte_mbuf));
368         first_skip += RTE_PKTMBUF_HEADROOM;
369         first_skip += rte_pktmbuf_priv_size(mp);
370         rxq->data_off = first_skip;
371
372         first_skip /= 8; /* Expressed in number of dwords */
373         aq->rq.first_skip = first_skip;
374         aq->rq.later_skip = (sizeof(struct rte_mbuf) / 8);
375         aq->rq.flow_tagw = 32; /* 32-bits */
376         aq->rq.lpb_sizem1 = mp->elt_size / 8;
377         aq->rq.lpb_sizem1 -= 1; /* Expressed in size minus one */
378         aq->rq.ena = 1;
379         aq->rq.pb_caching = 0x2; /* First cache aligned block to LLC */
380         aq->rq.xqe_imm_size = 0; /* No pkt data copy to CQE */
381         aq->rq.rq_int_ena = 0;
382         /* Many to one reduction */
383         aq->rq.qint_idx = qid % dev->qints;
384
385         aq->rq.xqe_drop_ena = 1;
386
387         rc = otx2_mbox_process(mbox);
388         if (rc) {
389                 otx2_err("Failed to init rq context");
390                 goto fail;
391         }
392
393         return 0;
394 fail:
395         return rc;
396 }
397
398 static int
399 nix_rq_enb_dis(struct rte_eth_dev *eth_dev,
400                struct otx2_eth_rxq *rxq, const bool enb)
401 {
402         struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
403         struct otx2_mbox *mbox = dev->mbox;
404         struct nix_aq_enq_req *aq;
405
406         /* Pkts will be dropped silently if RQ is disabled */
407         aq = otx2_mbox_alloc_msg_nix_aq_enq(mbox);
408         aq->qidx = rxq->rq;
409         aq->ctype = NIX_AQ_CTYPE_RQ;
410         aq->op = NIX_AQ_INSTOP_WRITE;
411
412         aq->rq.ena = enb;
413         aq->rq_mask.ena = ~(aq->rq_mask.ena);
414
415         return otx2_mbox_process(mbox);
416 }
417
418 static int
419 nix_cq_rq_uninit(struct rte_eth_dev *eth_dev, struct otx2_eth_rxq *rxq)
420 {
421         struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
422         struct otx2_mbox *mbox = dev->mbox;
423         struct nix_aq_enq_req *aq;
424         int rc;
425
426         /* RQ is already disabled */
427         /* Disable CQ */
428         aq = otx2_mbox_alloc_msg_nix_aq_enq(mbox);
429         aq->qidx = rxq->rq;
430         aq->ctype = NIX_AQ_CTYPE_CQ;
431         aq->op = NIX_AQ_INSTOP_WRITE;
432
433         aq->cq.ena = 0;
434         aq->cq_mask.ena = ~(aq->cq_mask.ena);
435
436         rc = otx2_mbox_process(mbox);
437         if (rc < 0) {
438                 otx2_err("Failed to disable cq context");
439                 return rc;
440         }
441
442         return 0;
443 }
444
445 static inline int
446 nix_get_data_off(struct otx2_eth_dev *dev)
447 {
448         return otx2_ethdev_is_ptp_en(dev) ? NIX_TIMESYNC_RX_OFFSET : 0;
449 }
450
451 uint64_t
452 otx2_nix_rxq_mbuf_setup(struct otx2_eth_dev *dev, uint16_t port_id)
453 {
454         struct rte_mbuf mb_def;
455         uint64_t *tmp;
456
457         RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_off) % 8 != 0);
458         RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, refcnt) -
459                                 offsetof(struct rte_mbuf, data_off) != 2);
460         RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, nb_segs) -
461                                 offsetof(struct rte_mbuf, data_off) != 4);
462         RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, port) -
463                                 offsetof(struct rte_mbuf, data_off) != 6);
464         mb_def.nb_segs = 1;
465         mb_def.data_off = RTE_PKTMBUF_HEADROOM + nix_get_data_off(dev);
466         mb_def.port = port_id;
467         rte_mbuf_refcnt_set(&mb_def, 1);
468
469         /* Prevent compiler reordering: rearm_data covers previous fields */
470         rte_compiler_barrier();
471         tmp = (uint64_t *)&mb_def.rearm_data;
472
473         return *tmp;
474 }
475
476 static void
477 otx2_nix_rx_queue_release(void *rx_queue)
478 {
479         struct otx2_eth_rxq *rxq = rx_queue;
480
481         if (!rxq)
482                 return;
483
484         otx2_nix_dbg("Releasing rxq %u", rxq->rq);
485         nix_cq_rq_uninit(rxq->eth_dev, rxq);
486         rte_free(rx_queue);
487 }
488
489 static int
490 otx2_nix_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t rq,
491                         uint16_t nb_desc, unsigned int socket,
492                         const struct rte_eth_rxconf *rx_conf,
493                         struct rte_mempool *mp)
494 {
495         struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
496         struct rte_mempool_ops *ops;
497         struct otx2_eth_rxq *rxq;
498         const char *platform_ops;
499         enum nix_q_size_e qsize;
500         uint64_t offloads;
501         int rc;
502
503         rc = -EINVAL;
504
505         /* Compile time check to make sure all fast path elements in a CL */
506         RTE_BUILD_BUG_ON(offsetof(struct otx2_eth_rxq, slow_path_start) >= 128);
507
508         /* Sanity checks */
509         if (rx_conf->rx_deferred_start == 1) {
510                 otx2_err("Deferred Rx start is not supported");
511                 goto fail;
512         }
513
514         platform_ops = rte_mbuf_platform_mempool_ops();
515         /* This driver needs octeontx2_npa mempool ops to work */
516         ops = rte_mempool_get_ops(mp->ops_index);
517         if (strncmp(ops->name, platform_ops, RTE_MEMPOOL_OPS_NAMESIZE)) {
518                 otx2_err("mempool ops should be of octeontx2_npa type");
519                 goto fail;
520         }
521
522         if (mp->pool_id == 0) {
523                 otx2_err("Invalid pool_id");
524                 goto fail;
525         }
526
527         /* Free memory prior to re-allocation if needed */
528         if (eth_dev->data->rx_queues[rq] != NULL) {
529                 otx2_nix_dbg("Freeing memory prior to re-allocation %d", rq);
530                 otx2_nix_rx_queue_release(eth_dev->data->rx_queues[rq]);
531                 eth_dev->data->rx_queues[rq] = NULL;
532         }
533
534         offloads = rx_conf->offloads | eth_dev->data->dev_conf.rxmode.offloads;
535         dev->rx_offloads |= offloads;
536
537         /* Find the CQ queue size */
538         qsize = nix_qsize_clampup_get(dev, nb_desc);
539         /* Allocate rxq memory */
540         rxq = rte_zmalloc_socket("otx2 rxq", sizeof(*rxq), OTX2_ALIGN, socket);
541         if (rxq == NULL) {
542                 otx2_err("Failed to allocate rq=%d", rq);
543                 rc = -ENOMEM;
544                 goto fail;
545         }
546
547         rxq->eth_dev = eth_dev;
548         rxq->rq = rq;
549         rxq->cq_door = dev->base + NIX_LF_CQ_OP_DOOR;
550         rxq->cq_status = (int64_t *)(dev->base + NIX_LF_CQ_OP_STATUS);
551         rxq->wdata = (uint64_t)rq << 32;
552         rxq->aura = npa_lf_aura_handle_to_aura(mp->pool_id);
553         rxq->mbuf_initializer = otx2_nix_rxq_mbuf_setup(dev,
554                                                         eth_dev->data->port_id);
555         rxq->offloads = offloads;
556         rxq->pool = mp;
557         rxq->qlen = nix_qsize_to_val(qsize);
558         rxq->qsize = qsize;
559         rxq->lookup_mem = otx2_nix_fastpath_lookup_mem_get();
560         rxq->tstamp = &dev->tstamp;
561
562         /* Alloc completion queue */
563         rc = nix_cq_rq_init(eth_dev, dev, rq, rxq, mp);
564         if (rc) {
565                 otx2_err("Failed to allocate rxq=%u", rq);
566                 goto free_rxq;
567         }
568
569         rxq->qconf.socket_id = socket;
570         rxq->qconf.nb_desc = nb_desc;
571         rxq->qconf.mempool = mp;
572         memcpy(&rxq->qconf.conf.rx, rx_conf, sizeof(struct rte_eth_rxconf));
573
574         nix_rx_queue_reset(rxq);
575         otx2_nix_dbg("rq=%d pool=%s qsize=%d nb_desc=%d->%d",
576                      rq, mp->name, qsize, nb_desc, rxq->qlen);
577
578         eth_dev->data->rx_queues[rq] = rxq;
579         eth_dev->data->rx_queue_state[rq] = RTE_ETH_QUEUE_STATE_STOPPED;
580
581         /* Calculating delta and freq mult between PTP HI clock and tsc.
582          * These are needed in deriving raw clock value from tsc counter.
583          * read_clock eth op returns raw clock value.
584          */
585         if ((dev->rx_offloads & DEV_RX_OFFLOAD_TIMESTAMP) ||
586             otx2_ethdev_is_ptp_en(dev)) {
587                 rc = otx2_nix_raw_clock_tsc_conv(dev);
588                 if (rc) {
589                         otx2_err("Failed to calculate delta and freq mult");
590                         goto fail;
591                 }
592         }
593
594         return 0;
595
596 free_rxq:
597         otx2_nix_rx_queue_release(rxq);
598 fail:
599         return rc;
600 }
601
602 static inline uint8_t
603 nix_sq_max_sqe_sz(struct otx2_eth_txq *txq)
604 {
605         /*
606          * Maximum three segments can be supported with W8, Choose
607          * NIX_MAXSQESZ_W16 for multi segment offload.
608          */
609         if (txq->offloads & DEV_TX_OFFLOAD_MULTI_SEGS)
610                 return NIX_MAXSQESZ_W16;
611         else
612                 return NIX_MAXSQESZ_W8;
613 }
614
615 static uint16_t
616 nix_rx_offload_flags(struct rte_eth_dev *eth_dev)
617 {
618         struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
619         struct rte_eth_dev_data *data = eth_dev->data;
620         struct rte_eth_conf *conf = &data->dev_conf;
621         struct rte_eth_rxmode *rxmode = &conf->rxmode;
622         uint16_t flags = 0;
623
624         if (rxmode->mq_mode == ETH_MQ_RX_RSS &&
625                         (dev->rx_offloads & DEV_RX_OFFLOAD_RSS_HASH))
626                 flags |= NIX_RX_OFFLOAD_RSS_F;
627
628         if (dev->rx_offloads & (DEV_RX_OFFLOAD_TCP_CKSUM |
629                          DEV_RX_OFFLOAD_UDP_CKSUM))
630                 flags |= NIX_RX_OFFLOAD_CHECKSUM_F;
631
632         if (dev->rx_offloads & (DEV_RX_OFFLOAD_IPV4_CKSUM |
633                                 DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM))
634                 flags |= NIX_RX_OFFLOAD_CHECKSUM_F;
635
636         if (dev->rx_offloads & DEV_RX_OFFLOAD_SCATTER)
637                 flags |= NIX_RX_MULTI_SEG_F;
638
639         if (dev->rx_offloads & (DEV_RX_OFFLOAD_VLAN_STRIP |
640                                 DEV_RX_OFFLOAD_QINQ_STRIP))
641                 flags |= NIX_RX_OFFLOAD_VLAN_STRIP_F;
642
643         if ((dev->rx_offloads & DEV_RX_OFFLOAD_TIMESTAMP))
644                 flags |= NIX_RX_OFFLOAD_TSTAMP_F;
645
646         if (dev->rx_offloads & DEV_RX_OFFLOAD_SECURITY)
647                 flags |= NIX_RX_OFFLOAD_SECURITY_F;
648
649         if (!dev->ptype_disable)
650                 flags |= NIX_RX_OFFLOAD_PTYPE_F;
651
652         return flags;
653 }
654
655 static uint16_t
656 nix_tx_offload_flags(struct rte_eth_dev *eth_dev)
657 {
658         struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
659         uint64_t conf = dev->tx_offloads;
660         uint16_t flags = 0;
661
662         /* Fastpath is dependent on these enums */
663         RTE_BUILD_BUG_ON(PKT_TX_TCP_CKSUM != (1ULL << 52));
664         RTE_BUILD_BUG_ON(PKT_TX_SCTP_CKSUM != (2ULL << 52));
665         RTE_BUILD_BUG_ON(PKT_TX_UDP_CKSUM != (3ULL << 52));
666         RTE_BUILD_BUG_ON(PKT_TX_IP_CKSUM != (1ULL << 54));
667         RTE_BUILD_BUG_ON(PKT_TX_IPV4 != (1ULL << 55));
668         RTE_BUILD_BUG_ON(PKT_TX_OUTER_IP_CKSUM != (1ULL << 58));
669         RTE_BUILD_BUG_ON(PKT_TX_OUTER_IPV4 != (1ULL << 59));
670         RTE_BUILD_BUG_ON(PKT_TX_OUTER_IPV6 != (1ULL << 60));
671         RTE_BUILD_BUG_ON(PKT_TX_OUTER_UDP_CKSUM != (1ULL << 41));
672         RTE_BUILD_BUG_ON(RTE_MBUF_L2_LEN_BITS != 7);
673         RTE_BUILD_BUG_ON(RTE_MBUF_L3_LEN_BITS != 9);
674         RTE_BUILD_BUG_ON(RTE_MBUF_OUTL2_LEN_BITS != 7);
675         RTE_BUILD_BUG_ON(RTE_MBUF_OUTL3_LEN_BITS != 9);
676         RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_off) !=
677                          offsetof(struct rte_mbuf, buf_iova) + 8);
678         RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, ol_flags) !=
679                          offsetof(struct rte_mbuf, buf_iova) + 16);
680         RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pkt_len) !=
681                          offsetof(struct rte_mbuf, ol_flags) + 12);
682         RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, tx_offload) !=
683                          offsetof(struct rte_mbuf, pool) + 2 * sizeof(void *));
684
685         if (conf & DEV_TX_OFFLOAD_VLAN_INSERT ||
686             conf & DEV_TX_OFFLOAD_QINQ_INSERT)
687                 flags |= NIX_TX_OFFLOAD_VLAN_QINQ_F;
688
689         if (conf & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM ||
690             conf & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM)
691                 flags |= NIX_TX_OFFLOAD_OL3_OL4_CSUM_F;
692
693         if (conf & DEV_TX_OFFLOAD_IPV4_CKSUM ||
694             conf & DEV_TX_OFFLOAD_TCP_CKSUM ||
695             conf & DEV_TX_OFFLOAD_UDP_CKSUM ||
696             conf & DEV_TX_OFFLOAD_SCTP_CKSUM)
697                 flags |= NIX_TX_OFFLOAD_L3_L4_CSUM_F;
698
699         if (!(conf & DEV_TX_OFFLOAD_MBUF_FAST_FREE))
700                 flags |= NIX_TX_OFFLOAD_MBUF_NOFF_F;
701
702         if (conf & DEV_TX_OFFLOAD_MULTI_SEGS)
703                 flags |= NIX_TX_MULTI_SEG_F;
704
705         /* Enable Inner checksum for TSO */
706         if (conf & DEV_TX_OFFLOAD_TCP_TSO)
707                 flags |= (NIX_TX_OFFLOAD_TSO_F |
708                           NIX_TX_OFFLOAD_L3_L4_CSUM_F);
709
710         /* Enable Inner and Outer checksum for Tunnel TSO */
711         if (conf & (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
712                     DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
713                     DEV_TX_OFFLOAD_GRE_TNL_TSO))
714                 flags |= (NIX_TX_OFFLOAD_TSO_F |
715                           NIX_TX_OFFLOAD_OL3_OL4_CSUM_F |
716                           NIX_TX_OFFLOAD_L3_L4_CSUM_F);
717
718         if (conf & DEV_TX_OFFLOAD_SECURITY)
719                 flags |= NIX_TX_OFFLOAD_SECURITY_F;
720
721         if ((dev->rx_offloads & DEV_RX_OFFLOAD_TIMESTAMP))
722                 flags |= NIX_TX_OFFLOAD_TSTAMP_F;
723
724         return flags;
725 }
726
727 static int
728 nix_sq_init(struct otx2_eth_txq *txq)
729 {
730         struct otx2_eth_dev *dev = txq->dev;
731         struct otx2_mbox *mbox = dev->mbox;
732         struct nix_aq_enq_req *sq;
733         uint32_t rr_quantum;
734         uint16_t smq;
735         int rc;
736
737         if (txq->sqb_pool->pool_id == 0)
738                 return -EINVAL;
739
740         rc = otx2_nix_tm_get_leaf_data(dev, txq->sq, &rr_quantum, &smq);
741         if (rc) {
742                 otx2_err("Failed to get sq->smq(leaf node), rc=%d", rc);
743                 return rc;
744         }
745
746         sq = otx2_mbox_alloc_msg_nix_aq_enq(mbox);
747         sq->qidx = txq->sq;
748         sq->ctype = NIX_AQ_CTYPE_SQ;
749         sq->op = NIX_AQ_INSTOP_INIT;
750         sq->sq.max_sqe_size = nix_sq_max_sqe_sz(txq);
751
752         sq->sq.smq = smq;
753         sq->sq.smq_rr_quantum = rr_quantum;
754         sq->sq.default_chan = dev->tx_chan_base;
755         sq->sq.sqe_stype = NIX_STYPE_STF;
756         sq->sq.ena = 1;
757         if (sq->sq.max_sqe_size == NIX_MAXSQESZ_W8)
758                 sq->sq.sqe_stype = NIX_STYPE_STP;
759         sq->sq.sqb_aura =
760                 npa_lf_aura_handle_to_aura(txq->sqb_pool->pool_id);
761         sq->sq.sq_int_ena = BIT(NIX_SQINT_LMT_ERR);
762         sq->sq.sq_int_ena |= BIT(NIX_SQINT_SQB_ALLOC_FAIL);
763         sq->sq.sq_int_ena |= BIT(NIX_SQINT_SEND_ERR);
764         sq->sq.sq_int_ena |= BIT(NIX_SQINT_MNQ_ERR);
765
766         /* Many to one reduction */
767         sq->sq.qint_idx = txq->sq % dev->qints;
768
769         return otx2_mbox_process(mbox);
770 }
771
772 static int
773 nix_sq_uninit(struct otx2_eth_txq *txq)
774 {
775         struct otx2_eth_dev *dev = txq->dev;
776         struct otx2_mbox *mbox = dev->mbox;
777         struct ndc_sync_op *ndc_req;
778         struct nix_aq_enq_rsp *rsp;
779         struct nix_aq_enq_req *aq;
780         uint16_t sqes_per_sqb;
781         void *sqb_buf;
782         int rc, count;
783
784         otx2_nix_dbg("Cleaning up sq %u", txq->sq);
785
786         aq = otx2_mbox_alloc_msg_nix_aq_enq(mbox);
787         aq->qidx = txq->sq;
788         aq->ctype = NIX_AQ_CTYPE_SQ;
789         aq->op = NIX_AQ_INSTOP_READ;
790
791         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
792         if (rc)
793                 return rc;
794
795         /* Check if sq is already cleaned up */
796         if (!rsp->sq.ena)
797                 return 0;
798
799         /* Disable sq */
800         aq = otx2_mbox_alloc_msg_nix_aq_enq(mbox);
801         aq->qidx = txq->sq;
802         aq->ctype = NIX_AQ_CTYPE_SQ;
803         aq->op = NIX_AQ_INSTOP_WRITE;
804
805         aq->sq_mask.ena = ~aq->sq_mask.ena;
806         aq->sq.ena = 0;
807
808         rc = otx2_mbox_process(mbox);
809         if (rc)
810                 return rc;
811
812         /* Read SQ and free sqb's */
813         aq = otx2_mbox_alloc_msg_nix_aq_enq(mbox);
814         aq->qidx = txq->sq;
815         aq->ctype = NIX_AQ_CTYPE_SQ;
816         aq->op = NIX_AQ_INSTOP_READ;
817
818         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
819         if (rc)
820                 return rc;
821
822         if (aq->sq.smq_pend)
823                 otx2_err("SQ has pending sqe's");
824
825         count = aq->sq.sqb_count;
826         sqes_per_sqb = 1 << txq->sqes_per_sqb_log2;
827         /* Free SQB's that are used */
828         sqb_buf = (void *)rsp->sq.head_sqb;
829         while (count) {
830                 void *next_sqb;
831
832                 next_sqb = *(void **)((uintptr_t)sqb_buf + (uint32_t)
833                                       ((sqes_per_sqb - 1) *
834                                       nix_sq_max_sqe_sz(txq)));
835                 npa_lf_aura_op_free(txq->sqb_pool->pool_id, 1,
836                                     (uint64_t)sqb_buf);
837                 sqb_buf = next_sqb;
838                 count--;
839         }
840
841         /* Free next to use sqb */
842         if (rsp->sq.next_sqb)
843                 npa_lf_aura_op_free(txq->sqb_pool->pool_id, 1,
844                                     rsp->sq.next_sqb);
845
846         /* Sync NDC-NIX-TX for LF */
847         ndc_req = otx2_mbox_alloc_msg_ndc_sync_op(mbox);
848         ndc_req->nix_lf_tx_sync = 1;
849         rc = otx2_mbox_process(mbox);
850         if (rc)
851                 otx2_err("Error on NDC-NIX-TX LF sync, rc %d", rc);
852
853         return rc;
854 }
855
856 static int
857 nix_sqb_aura_limit_cfg(struct rte_mempool *mp, uint16_t nb_sqb_bufs)
858 {
859         struct otx2_npa_lf *npa_lf = otx2_intra_dev_get_cfg()->npa_lf;
860         struct npa_aq_enq_req *aura_req;
861
862         aura_req = otx2_mbox_alloc_msg_npa_aq_enq(npa_lf->mbox);
863         aura_req->aura_id = npa_lf_aura_handle_to_aura(mp->pool_id);
864         aura_req->ctype = NPA_AQ_CTYPE_AURA;
865         aura_req->op = NPA_AQ_INSTOP_WRITE;
866
867         aura_req->aura.limit = nb_sqb_bufs;
868         aura_req->aura_mask.limit = ~(aura_req->aura_mask.limit);
869
870         return otx2_mbox_process(npa_lf->mbox);
871 }
872
873 static int
874 nix_alloc_sqb_pool(int port, struct otx2_eth_txq *txq, uint16_t nb_desc)
875 {
876         struct otx2_eth_dev *dev = txq->dev;
877         uint16_t sqes_per_sqb, nb_sqb_bufs;
878         char name[RTE_MEMPOOL_NAMESIZE];
879         struct rte_mempool_objsz sz;
880         struct npa_aura_s *aura;
881         uint32_t tmp, blk_sz;
882
883         aura = (struct npa_aura_s *)((uintptr_t)txq->fc_mem + OTX2_ALIGN);
884         snprintf(name, sizeof(name), "otx2_sqb_pool_%d_%d", port, txq->sq);
885         blk_sz = dev->sqb_size;
886
887         if (nix_sq_max_sqe_sz(txq) == NIX_MAXSQESZ_W16)
888                 sqes_per_sqb = (dev->sqb_size / 8) / 16;
889         else
890                 sqes_per_sqb = (dev->sqb_size / 8) / 8;
891
892         nb_sqb_bufs = nb_desc / sqes_per_sqb;
893         /* Clamp up to devarg passed SQB count */
894         nb_sqb_bufs =  RTE_MIN(dev->max_sqb_count, RTE_MAX(NIX_DEF_SQB,
895                               nb_sqb_bufs + NIX_SQB_LIST_SPACE));
896
897         txq->sqb_pool = rte_mempool_create_empty(name, NIX_MAX_SQB, blk_sz,
898                                                  0, 0, dev->node,
899                                                  MEMPOOL_F_NO_SPREAD);
900         txq->nb_sqb_bufs = nb_sqb_bufs;
901         txq->sqes_per_sqb_log2 = (uint16_t)rte_log2_u32(sqes_per_sqb);
902         txq->nb_sqb_bufs_adj = nb_sqb_bufs -
903                 RTE_ALIGN_MUL_CEIL(nb_sqb_bufs, sqes_per_sqb) / sqes_per_sqb;
904         txq->nb_sqb_bufs_adj =
905                 (NIX_SQB_LOWER_THRESH * txq->nb_sqb_bufs_adj) / 100;
906
907         if (txq->sqb_pool == NULL) {
908                 otx2_err("Failed to allocate sqe mempool");
909                 goto fail;
910         }
911
912         memset(aura, 0, sizeof(*aura));
913         aura->fc_ena = 1;
914         aura->fc_addr = txq->fc_iova;
915         aura->fc_hyst_bits = 0; /* Store count on all updates */
916         if (rte_mempool_set_ops_byname(txq->sqb_pool, "octeontx2_npa", aura)) {
917                 otx2_err("Failed to set ops for sqe mempool");
918                 goto fail;
919         }
920         if (rte_mempool_populate_default(txq->sqb_pool) < 0) {
921                 otx2_err("Failed to populate sqe mempool");
922                 goto fail;
923         }
924
925         tmp = rte_mempool_calc_obj_size(blk_sz, MEMPOOL_F_NO_SPREAD, &sz);
926         if (dev->sqb_size != sz.elt_size) {
927                 otx2_err("sqe pool block size is not expected %d != %d",
928                          dev->sqb_size, tmp);
929                 goto fail;
930         }
931
932         nix_sqb_aura_limit_cfg(txq->sqb_pool, txq->nb_sqb_bufs);
933
934         return 0;
935 fail:
936         return -ENOMEM;
937 }
938
939 void
940 otx2_nix_form_default_desc(struct otx2_eth_txq *txq)
941 {
942         struct nix_send_ext_s *send_hdr_ext;
943         struct nix_send_hdr_s *send_hdr;
944         struct nix_send_mem_s *send_mem;
945         union nix_send_sg_s *sg;
946
947         /* Initialize the fields based on basic single segment packet */
948         memset(&txq->cmd, 0, sizeof(txq->cmd));
949
950         if (txq->dev->tx_offload_flags & NIX_TX_NEED_EXT_HDR) {
951                 send_hdr = (struct nix_send_hdr_s *)&txq->cmd[0];
952                 /* 2(HDR) + 2(EXT_HDR) + 1(SG) + 1(IOVA) = 6/2 - 1 = 2 */
953                 send_hdr->w0.sizem1 = 2;
954
955                 send_hdr_ext = (struct nix_send_ext_s *)&txq->cmd[2];
956                 send_hdr_ext->w0.subdc = NIX_SUBDC_EXT;
957                 if (txq->dev->tx_offload_flags & NIX_TX_OFFLOAD_TSTAMP_F) {
958                         /* Default: one seg packet would have:
959                          * 2(HDR) + 2(EXT) + 1(SG) + 1(IOVA) + 2(MEM)
960                          * => 8/2 - 1 = 3
961                          */
962                         send_hdr->w0.sizem1 = 3;
963                         send_hdr_ext->w0.tstmp = 1;
964
965                         /* To calculate the offset for send_mem,
966                          * send_hdr->w0.sizem1 * 2
967                          */
968                         send_mem = (struct nix_send_mem_s *)(txq->cmd +
969                                                 (send_hdr->w0.sizem1 << 1));
970                         send_mem->subdc = NIX_SUBDC_MEM;
971                         send_mem->alg = NIX_SENDMEMALG_SETTSTMP;
972                         send_mem->addr = txq->dev->tstamp.tx_tstamp_iova;
973                 }
974                 sg = (union nix_send_sg_s *)&txq->cmd[4];
975         } else {
976                 send_hdr = (struct nix_send_hdr_s *)&txq->cmd[0];
977                 /* 2(HDR) + 1(SG) + 1(IOVA) = 4/2 - 1 = 1 */
978                 send_hdr->w0.sizem1 = 1;
979                 sg = (union nix_send_sg_s *)&txq->cmd[2];
980         }
981
982         send_hdr->w0.sq = txq->sq;
983         sg->subdc = NIX_SUBDC_SG;
984         sg->segs = 1;
985         sg->ld_type = NIX_SENDLDTYPE_LDD;
986
987         rte_smp_wmb();
988 }
989
990 static void
991 otx2_nix_tx_queue_release(void *_txq)
992 {
993         struct otx2_eth_txq *txq = _txq;
994         struct rte_eth_dev *eth_dev;
995
996         if (!txq)
997                 return;
998
999         eth_dev = txq->dev->eth_dev;
1000
1001         otx2_nix_dbg("Releasing txq %u", txq->sq);
1002
1003         /* Flush and disable tm */
1004         otx2_nix_sq_flush_pre(txq, eth_dev->data->dev_started);
1005
1006         /* Free sqb's and disable sq */
1007         nix_sq_uninit(txq);
1008
1009         if (txq->sqb_pool) {
1010                 rte_mempool_free(txq->sqb_pool);
1011                 txq->sqb_pool = NULL;
1012         }
1013         otx2_nix_sq_flush_post(txq);
1014         rte_free(txq);
1015 }
1016
1017
1018 static int
1019 otx2_nix_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t sq,
1020                         uint16_t nb_desc, unsigned int socket_id,
1021                         const struct rte_eth_txconf *tx_conf)
1022 {
1023         struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
1024         const struct rte_memzone *fc;
1025         struct otx2_eth_txq *txq;
1026         uint64_t offloads;
1027         int rc;
1028
1029         rc = -EINVAL;
1030
1031         /* Compile time check to make sure all fast path elements in a CL */
1032         RTE_BUILD_BUG_ON(offsetof(struct otx2_eth_txq, slow_path_start) >= 128);
1033
1034         if (tx_conf->tx_deferred_start) {
1035                 otx2_err("Tx deferred start is not supported");
1036                 goto fail;
1037         }
1038
1039         /* Free memory prior to re-allocation if needed. */
1040         if (eth_dev->data->tx_queues[sq] != NULL) {
1041                 otx2_nix_dbg("Freeing memory prior to re-allocation %d", sq);
1042                 otx2_nix_tx_queue_release(eth_dev->data->tx_queues[sq]);
1043                 eth_dev->data->tx_queues[sq] = NULL;
1044         }
1045
1046         /* Find the expected offloads for this queue */
1047         offloads = tx_conf->offloads | eth_dev->data->dev_conf.txmode.offloads;
1048
1049         /* Allocating tx queue data structure */
1050         txq = rte_zmalloc_socket("otx2_ethdev TX queue", sizeof(*txq),
1051                                  OTX2_ALIGN, socket_id);
1052         if (txq == NULL) {
1053                 otx2_err("Failed to alloc txq=%d", sq);
1054                 rc = -ENOMEM;
1055                 goto fail;
1056         }
1057         txq->sq = sq;
1058         txq->dev = dev;
1059         txq->sqb_pool = NULL;
1060         txq->offloads = offloads;
1061         dev->tx_offloads |= offloads;
1062
1063         /*
1064          * Allocate memory for flow control updates from HW.
1065          * Alloc one cache line, so that fits all FC_STYPE modes.
1066          */
1067         fc = rte_eth_dma_zone_reserve(eth_dev, "fcmem", sq,
1068                                       OTX2_ALIGN + sizeof(struct npa_aura_s),
1069                                       OTX2_ALIGN, dev->node);
1070         if (fc == NULL) {
1071                 otx2_err("Failed to allocate mem for fcmem");
1072                 rc = -ENOMEM;
1073                 goto free_txq;
1074         }
1075         txq->fc_iova = fc->iova;
1076         txq->fc_mem = fc->addr;
1077
1078         /* Initialize the aura sqb pool */
1079         rc = nix_alloc_sqb_pool(eth_dev->data->port_id, txq, nb_desc);
1080         if (rc) {
1081                 otx2_err("Failed to alloc sqe pool rc=%d", rc);
1082                 goto free_txq;
1083         }
1084
1085         /* Initialize the SQ */
1086         rc = nix_sq_init(txq);
1087         if (rc) {
1088                 otx2_err("Failed to init sq=%d context", sq);
1089                 goto free_txq;
1090         }
1091
1092         txq->fc_cache_pkts = 0;
1093         txq->io_addr = dev->base + NIX_LF_OP_SENDX(0);
1094         /* Evenly distribute LMT slot for each sq */
1095         txq->lmt_addr = (void *)(dev->lmt_addr + ((sq & LMT_SLOT_MASK) << 12));
1096
1097         txq->qconf.socket_id = socket_id;
1098         txq->qconf.nb_desc = nb_desc;
1099         memcpy(&txq->qconf.conf.tx, tx_conf, sizeof(struct rte_eth_txconf));
1100
1101         otx2_nix_form_default_desc(txq);
1102
1103         otx2_nix_dbg("sq=%d fc=%p offload=0x%" PRIx64 " sqb=0x%" PRIx64 ""
1104                      " lmt_addr=%p nb_sqb_bufs=%d sqes_per_sqb_log2=%d", sq,
1105                      fc->addr, offloads, txq->sqb_pool->pool_id, txq->lmt_addr,
1106                      txq->nb_sqb_bufs, txq->sqes_per_sqb_log2);
1107         eth_dev->data->tx_queues[sq] = txq;
1108         eth_dev->data->tx_queue_state[sq] = RTE_ETH_QUEUE_STATE_STOPPED;
1109         return 0;
1110
1111 free_txq:
1112         otx2_nix_tx_queue_release(txq);
1113 fail:
1114         return rc;
1115 }
1116
1117 static int
1118 nix_store_queue_cfg_and_then_release(struct rte_eth_dev *eth_dev)
1119 {
1120         struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
1121         struct otx2_eth_qconf *tx_qconf = NULL;
1122         struct otx2_eth_qconf *rx_qconf = NULL;
1123         struct otx2_eth_txq **txq;
1124         struct otx2_eth_rxq **rxq;
1125         int i, nb_rxq, nb_txq;
1126
1127         nb_rxq = RTE_MIN(dev->configured_nb_rx_qs, eth_dev->data->nb_rx_queues);
1128         nb_txq = RTE_MIN(dev->configured_nb_tx_qs, eth_dev->data->nb_tx_queues);
1129
1130         tx_qconf = malloc(nb_txq * sizeof(*tx_qconf));
1131         if (tx_qconf == NULL) {
1132                 otx2_err("Failed to allocate memory for tx_qconf");
1133                 goto fail;
1134         }
1135
1136         rx_qconf = malloc(nb_rxq * sizeof(*rx_qconf));
1137         if (rx_qconf == NULL) {
1138                 otx2_err("Failed to allocate memory for rx_qconf");
1139                 goto fail;
1140         }
1141
1142         txq = (struct otx2_eth_txq **)eth_dev->data->tx_queues;
1143         for (i = 0; i < nb_txq; i++) {
1144                 if (txq[i] == NULL) {
1145                         tx_qconf[i].valid = false;
1146                         otx2_info("txq[%d] is already released", i);
1147                         continue;
1148                 }
1149                 memcpy(&tx_qconf[i], &txq[i]->qconf, sizeof(*tx_qconf));
1150                 tx_qconf[i].valid = true;
1151                 otx2_nix_tx_queue_release(txq[i]);
1152                 eth_dev->data->tx_queues[i] = NULL;
1153         }
1154
1155         rxq = (struct otx2_eth_rxq **)eth_dev->data->rx_queues;
1156         for (i = 0; i < nb_rxq; i++) {
1157                 if (rxq[i] == NULL) {
1158                         rx_qconf[i].valid = false;
1159                         otx2_info("rxq[%d] is already released", i);
1160                         continue;
1161                 }
1162                 memcpy(&rx_qconf[i], &rxq[i]->qconf, sizeof(*rx_qconf));
1163                 rx_qconf[i].valid = true;
1164                 otx2_nix_rx_queue_release(rxq[i]);
1165                 eth_dev->data->rx_queues[i] = NULL;
1166         }
1167
1168         dev->tx_qconf = tx_qconf;
1169         dev->rx_qconf = rx_qconf;
1170         return 0;
1171
1172 fail:
1173         if (tx_qconf)
1174                 free(tx_qconf);
1175         if (rx_qconf)
1176                 free(rx_qconf);
1177
1178         return -ENOMEM;
1179 }
1180
1181 static int
1182 nix_restore_queue_cfg(struct rte_eth_dev *eth_dev)
1183 {
1184         struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
1185         struct otx2_eth_qconf *tx_qconf = dev->tx_qconf;
1186         struct otx2_eth_qconf *rx_qconf = dev->rx_qconf;
1187         struct otx2_eth_txq **txq;
1188         struct otx2_eth_rxq **rxq;
1189         int rc, i, nb_rxq, nb_txq;
1190
1191         nb_rxq = RTE_MIN(dev->configured_nb_rx_qs, eth_dev->data->nb_rx_queues);
1192         nb_txq = RTE_MIN(dev->configured_nb_tx_qs, eth_dev->data->nb_tx_queues);
1193
1194         rc = -ENOMEM;
1195         /* Setup tx & rx queues with previous configuration so
1196          * that the queues can be functional in cases like ports
1197          * are started without re configuring queues.
1198          *
1199          * Usual re config sequence is like below:
1200          * port_configure() {
1201          *      if(reconfigure) {
1202          *              queue_release()
1203          *              queue_setup()
1204          *      }
1205          *      queue_configure() {
1206          *              queue_release()
1207          *              queue_setup()
1208          *      }
1209          * }
1210          * port_start()
1211          *
1212          * In some application's control path, queue_configure() would
1213          * NOT be invoked for TXQs/RXQs in port_configure().
1214          * In such cases, queues can be functional after start as the
1215          * queues are already setup in port_configure().
1216          */
1217         for (i = 0; i < nb_txq; i++) {
1218                 if (!tx_qconf[i].valid)
1219                         continue;
1220                 rc = otx2_nix_tx_queue_setup(eth_dev, i, tx_qconf[i].nb_desc,
1221                                              tx_qconf[i].socket_id,
1222                                              &tx_qconf[i].conf.tx);
1223                 if (rc) {
1224                         otx2_err("Failed to setup tx queue rc=%d", rc);
1225                         txq = (struct otx2_eth_txq **)eth_dev->data->tx_queues;
1226                         for (i -= 1; i >= 0; i--)
1227                                 otx2_nix_tx_queue_release(txq[i]);
1228                         goto fail;
1229                 }
1230         }
1231
1232         free(tx_qconf); tx_qconf = NULL;
1233
1234         for (i = 0; i < nb_rxq; i++) {
1235                 if (!rx_qconf[i].valid)
1236                         continue;
1237                 rc = otx2_nix_rx_queue_setup(eth_dev, i, rx_qconf[i].nb_desc,
1238                                              rx_qconf[i].socket_id,
1239                                              &rx_qconf[i].conf.rx,
1240                                              rx_qconf[i].mempool);
1241                 if (rc) {
1242                         otx2_err("Failed to setup rx queue rc=%d", rc);
1243                         rxq = (struct otx2_eth_rxq **)eth_dev->data->rx_queues;
1244                         for (i -= 1; i >= 0; i--)
1245                                 otx2_nix_rx_queue_release(rxq[i]);
1246                         goto release_tx_queues;
1247                 }
1248         }
1249
1250         free(rx_qconf); rx_qconf = NULL;
1251
1252         return 0;
1253
1254 release_tx_queues:
1255         txq = (struct otx2_eth_txq **)eth_dev->data->tx_queues;
1256         for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
1257                 otx2_nix_tx_queue_release(txq[i]);
1258 fail:
1259         if (tx_qconf)
1260                 free(tx_qconf);
1261         if (rx_qconf)
1262                 free(rx_qconf);
1263
1264         return rc;
1265 }
1266
1267 static uint16_t
1268 nix_eth_nop_burst(void *queue, struct rte_mbuf **mbufs, uint16_t pkts)
1269 {
1270         RTE_SET_USED(queue);
1271         RTE_SET_USED(mbufs);
1272         RTE_SET_USED(pkts);
1273
1274         return 0;
1275 }
1276
1277 static void
1278 nix_set_nop_rxtx_function(struct rte_eth_dev *eth_dev)
1279 {
1280         /* These dummy functions are required for supporting
1281          * some applications which reconfigure queues without
1282          * stopping tx burst and rx burst threads(eg kni app)
1283          * When the queues context is saved, txq/rxqs are released
1284          * which caused app crash since rx/tx burst is still
1285          * on different lcores
1286          */
1287         eth_dev->tx_pkt_burst = nix_eth_nop_burst;
1288         eth_dev->rx_pkt_burst = nix_eth_nop_burst;
1289         rte_mb();
1290 }
1291
1292 static void
1293 nix_lso_tcp(struct nix_lso_format_cfg *req, bool v4)
1294 {
1295         volatile struct nix_lso_format *field;
1296
1297         /* Format works only with TCP packet marked by OL3/OL4 */
1298         field = (volatile struct nix_lso_format *)&req->fields[0];
1299         req->field_mask = NIX_LSO_FIELD_MASK;
1300         /* Outer IPv4/IPv6 */
1301         field->layer = NIX_TXLAYER_OL3;
1302         field->offset = v4 ? 2 : 4;
1303         field->sizem1 = 1; /* 2B */
1304         field->alg = NIX_LSOALG_ADD_PAYLEN;
1305         field++;
1306         if (v4) {
1307                 /* IPID field */
1308                 field->layer = NIX_TXLAYER_OL3;
1309                 field->offset = 4;
1310                 field->sizem1 = 1;
1311                 /* Incremented linearly per segment */
1312                 field->alg = NIX_LSOALG_ADD_SEGNUM;
1313                 field++;
1314         }
1315
1316         /* TCP sequence number update */
1317         field->layer = NIX_TXLAYER_OL4;
1318         field->offset = 4;
1319         field->sizem1 = 3; /* 4 bytes */
1320         field->alg = NIX_LSOALG_ADD_OFFSET;
1321         field++;
1322         /* TCP flags field */
1323         field->layer = NIX_TXLAYER_OL4;
1324         field->offset = 12;
1325         field->sizem1 = 1;
1326         field->alg = NIX_LSOALG_TCP_FLAGS;
1327         field++;
1328 }
1329
1330 static void
1331 nix_lso_udp_tun_tcp(struct nix_lso_format_cfg *req,
1332                     bool outer_v4, bool inner_v4)
1333 {
1334         volatile struct nix_lso_format *field;
1335
1336         field = (volatile struct nix_lso_format *)&req->fields[0];
1337         req->field_mask = NIX_LSO_FIELD_MASK;
1338         /* Outer IPv4/IPv6 len */
1339         field->layer = NIX_TXLAYER_OL3;
1340         field->offset = outer_v4 ? 2 : 4;
1341         field->sizem1 = 1; /* 2B */
1342         field->alg = NIX_LSOALG_ADD_PAYLEN;
1343         field++;
1344         if (outer_v4) {
1345                 /* IPID */
1346                 field->layer = NIX_TXLAYER_OL3;
1347                 field->offset = 4;
1348                 field->sizem1 = 1;
1349                 /* Incremented linearly per segment */
1350                 field->alg = NIX_LSOALG_ADD_SEGNUM;
1351                 field++;
1352         }
1353
1354         /* Outer UDP length */
1355         field->layer = NIX_TXLAYER_OL4;
1356         field->offset = 4;
1357         field->sizem1 = 1;
1358         field->alg = NIX_LSOALG_ADD_PAYLEN;
1359         field++;
1360
1361         /* Inner IPv4/IPv6 */
1362         field->layer = NIX_TXLAYER_IL3;
1363         field->offset = inner_v4 ? 2 : 4;
1364         field->sizem1 = 1; /* 2B */
1365         field->alg = NIX_LSOALG_ADD_PAYLEN;
1366         field++;
1367         if (inner_v4) {
1368                 /* IPID field */
1369                 field->layer = NIX_TXLAYER_IL3;
1370                 field->offset = 4;
1371                 field->sizem1 = 1;
1372                 /* Incremented linearly per segment */
1373                 field->alg = NIX_LSOALG_ADD_SEGNUM;
1374                 field++;
1375         }
1376
1377         /* TCP sequence number update */
1378         field->layer = NIX_TXLAYER_IL4;
1379         field->offset = 4;
1380         field->sizem1 = 3; /* 4 bytes */
1381         field->alg = NIX_LSOALG_ADD_OFFSET;
1382         field++;
1383
1384         /* TCP flags field */
1385         field->layer = NIX_TXLAYER_IL4;
1386         field->offset = 12;
1387         field->sizem1 = 1;
1388         field->alg = NIX_LSOALG_TCP_FLAGS;
1389         field++;
1390 }
1391
1392 static void
1393 nix_lso_tun_tcp(struct nix_lso_format_cfg *req,
1394                 bool outer_v4, bool inner_v4)
1395 {
1396         volatile struct nix_lso_format *field;
1397
1398         field = (volatile struct nix_lso_format *)&req->fields[0];
1399         req->field_mask = NIX_LSO_FIELD_MASK;
1400         /* Outer IPv4/IPv6 len */
1401         field->layer = NIX_TXLAYER_OL3;
1402         field->offset = outer_v4 ? 2 : 4;
1403         field->sizem1 = 1; /* 2B */
1404         field->alg = NIX_LSOALG_ADD_PAYLEN;
1405         field++;
1406         if (outer_v4) {
1407                 /* IPID */
1408                 field->layer = NIX_TXLAYER_OL3;
1409                 field->offset = 4;
1410                 field->sizem1 = 1;
1411                 /* Incremented linearly per segment */
1412                 field->alg = NIX_LSOALG_ADD_SEGNUM;
1413                 field++;
1414         }
1415
1416         /* Inner IPv4/IPv6 */
1417         field->layer = NIX_TXLAYER_IL3;
1418         field->offset = inner_v4 ? 2 : 4;
1419         field->sizem1 = 1; /* 2B */
1420         field->alg = NIX_LSOALG_ADD_PAYLEN;
1421         field++;
1422         if (inner_v4) {
1423                 /* IPID field */
1424                 field->layer = NIX_TXLAYER_IL3;
1425                 field->offset = 4;
1426                 field->sizem1 = 1;
1427                 /* Incremented linearly per segment */
1428                 field->alg = NIX_LSOALG_ADD_SEGNUM;
1429                 field++;
1430         }
1431
1432         /* TCP sequence number update */
1433         field->layer = NIX_TXLAYER_IL4;
1434         field->offset = 4;
1435         field->sizem1 = 3; /* 4 bytes */
1436         field->alg = NIX_LSOALG_ADD_OFFSET;
1437         field++;
1438
1439         /* TCP flags field */
1440         field->layer = NIX_TXLAYER_IL4;
1441         field->offset = 12;
1442         field->sizem1 = 1;
1443         field->alg = NIX_LSOALG_TCP_FLAGS;
1444         field++;
1445 }
1446
1447 static int
1448 nix_setup_lso_formats(struct otx2_eth_dev *dev)
1449 {
1450         struct otx2_mbox *mbox = dev->mbox;
1451         struct nix_lso_format_cfg_rsp *rsp;
1452         struct nix_lso_format_cfg *req;
1453         uint8_t base;
1454         int rc;
1455
1456         /* Skip if TSO was not requested */
1457         if (!(dev->tx_offload_flags & NIX_TX_OFFLOAD_TSO_F))
1458                 return 0;
1459         /*
1460          * IPv4/TCP LSO
1461          */
1462         req = otx2_mbox_alloc_msg_nix_lso_format_cfg(mbox);
1463         nix_lso_tcp(req, true);
1464         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
1465         if (rc)
1466                 return rc;
1467
1468         base = rsp->lso_format_idx;
1469         if (base != NIX_LSO_FORMAT_IDX_TSOV4)
1470                 return -EFAULT;
1471         dev->lso_base_idx = base;
1472         otx2_nix_dbg("tcpv4 lso fmt=%u", base);
1473
1474
1475         /*
1476          * IPv6/TCP LSO
1477          */
1478         req = otx2_mbox_alloc_msg_nix_lso_format_cfg(mbox);
1479         nix_lso_tcp(req, false);
1480         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
1481         if (rc)
1482                 return rc;
1483
1484         if (rsp->lso_format_idx != base + 1)
1485                 return -EFAULT;
1486         otx2_nix_dbg("tcpv6 lso fmt=%u\n", base + 1);
1487
1488         /*
1489          * IPv4/UDP/TUN HDR/IPv4/TCP LSO
1490          */
1491         req = otx2_mbox_alloc_msg_nix_lso_format_cfg(mbox);
1492         nix_lso_udp_tun_tcp(req, true, true);
1493         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
1494         if (rc)
1495                 return rc;
1496
1497         if (rsp->lso_format_idx != base + 2)
1498                 return -EFAULT;
1499         otx2_nix_dbg("udp tun v4v4 fmt=%u\n", base + 2);
1500
1501         /*
1502          * IPv4/UDP/TUN HDR/IPv6/TCP LSO
1503          */
1504         req = otx2_mbox_alloc_msg_nix_lso_format_cfg(mbox);
1505         nix_lso_udp_tun_tcp(req, true, false);
1506         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
1507         if (rc)
1508                 return rc;
1509
1510         if (rsp->lso_format_idx != base + 3)
1511                 return -EFAULT;
1512         otx2_nix_dbg("udp tun v4v6 fmt=%u\n", base + 3);
1513
1514         /*
1515          * IPv6/UDP/TUN HDR/IPv4/TCP LSO
1516          */
1517         req = otx2_mbox_alloc_msg_nix_lso_format_cfg(mbox);
1518         nix_lso_udp_tun_tcp(req, false, true);
1519         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
1520         if (rc)
1521                 return rc;
1522
1523         if (rsp->lso_format_idx != base + 4)
1524                 return -EFAULT;
1525         otx2_nix_dbg("udp tun v6v4 fmt=%u\n", base + 4);
1526
1527         /*
1528          * IPv6/UDP/TUN HDR/IPv6/TCP LSO
1529          */
1530         req = otx2_mbox_alloc_msg_nix_lso_format_cfg(mbox);
1531         nix_lso_udp_tun_tcp(req, false, false);
1532         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
1533         if (rc)
1534                 return rc;
1535         if (rsp->lso_format_idx != base + 5)
1536                 return -EFAULT;
1537         otx2_nix_dbg("udp tun v6v6 fmt=%u\n", base + 5);
1538
1539         /*
1540          * IPv4/TUN HDR/IPv4/TCP LSO
1541          */
1542         req = otx2_mbox_alloc_msg_nix_lso_format_cfg(mbox);
1543         nix_lso_tun_tcp(req, true, true);
1544         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
1545         if (rc)
1546                 return rc;
1547
1548         if (rsp->lso_format_idx != base + 6)
1549                 return -EFAULT;
1550         otx2_nix_dbg("tun v4v4 fmt=%u\n", base + 6);
1551
1552         /*
1553          * IPv4/TUN HDR/IPv6/TCP LSO
1554          */
1555         req = otx2_mbox_alloc_msg_nix_lso_format_cfg(mbox);
1556         nix_lso_tun_tcp(req, true, false);
1557         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
1558         if (rc)
1559                 return rc;
1560
1561         if (rsp->lso_format_idx != base + 7)
1562                 return -EFAULT;
1563         otx2_nix_dbg("tun v4v6 fmt=%u\n", base + 7);
1564
1565         /*
1566          * IPv6/TUN HDR/IPv4/TCP LSO
1567          */
1568         req = otx2_mbox_alloc_msg_nix_lso_format_cfg(mbox);
1569         nix_lso_tun_tcp(req, false, true);
1570         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
1571         if (rc)
1572                 return rc;
1573
1574         if (rsp->lso_format_idx != base + 8)
1575                 return -EFAULT;
1576         otx2_nix_dbg("tun v6v4 fmt=%u\n", base + 8);
1577
1578         /*
1579          * IPv6/TUN HDR/IPv6/TCP LSO
1580          */
1581         req = otx2_mbox_alloc_msg_nix_lso_format_cfg(mbox);
1582         nix_lso_tun_tcp(req, false, false);
1583         rc = otx2_mbox_process_msg(mbox, (void *)&rsp);
1584         if (rc)
1585                 return rc;
1586         if (rsp->lso_format_idx != base + 9)
1587                 return -EFAULT;
1588         otx2_nix_dbg("tun v6v6 fmt=%u\n", base + 9);
1589         return 0;
1590 }
1591
1592 static int
1593 otx2_nix_configure(struct rte_eth_dev *eth_dev)
1594 {
1595         struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
1596         struct rte_eth_dev_data *data = eth_dev->data;
1597         struct rte_eth_conf *conf = &data->dev_conf;
1598         struct rte_eth_rxmode *rxmode = &conf->rxmode;
1599         struct rte_eth_txmode *txmode = &conf->txmode;
1600         char ea_fmt[RTE_ETHER_ADDR_FMT_SIZE];
1601         struct rte_ether_addr *ea;
1602         uint8_t nb_rxq, nb_txq;
1603         int rc;
1604
1605         rc = -EINVAL;
1606
1607         /* Sanity checks */
1608         if (rte_eal_has_hugepages() == 0) {
1609                 otx2_err("Huge page is not configured");
1610                 goto fail_configure;
1611         }
1612
1613         if (conf->dcb_capability_en == 1) {
1614                 otx2_err("dcb enable is not supported");
1615                 goto fail_configure;
1616         }
1617
1618         if (conf->fdir_conf.mode != RTE_FDIR_MODE_NONE) {
1619                 otx2_err("Flow director is not supported");
1620                 goto fail_configure;
1621         }
1622
1623         if (rxmode->mq_mode != ETH_MQ_RX_NONE &&
1624             rxmode->mq_mode != ETH_MQ_RX_RSS) {
1625                 otx2_err("Unsupported mq rx mode %d", rxmode->mq_mode);
1626                 goto fail_configure;
1627         }
1628
1629         if (txmode->mq_mode != ETH_MQ_TX_NONE) {
1630                 otx2_err("Unsupported mq tx mode %d", txmode->mq_mode);
1631                 goto fail_configure;
1632         }
1633
1634         if (otx2_dev_is_Ax(dev) &&
1635             (txmode->offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) &&
1636             ((txmode->offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ||
1637             (txmode->offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM))) {
1638                 otx2_err("Outer IP and SCTP checksum unsupported");
1639                 goto fail_configure;
1640         }
1641
1642         /* Free the resources allocated from the previous configure */
1643         if (dev->configured == 1) {
1644                 otx2_eth_sec_fini(eth_dev);
1645                 otx2_nix_rxchan_bpid_cfg(eth_dev, false);
1646                 otx2_nix_vlan_fini(eth_dev);
1647                 otx2_nix_mc_addr_list_uninstall(eth_dev);
1648                 otx2_flow_free_all_resources(dev);
1649                 oxt2_nix_unregister_queue_irqs(eth_dev);
1650                 if (eth_dev->data->dev_conf.intr_conf.rxq)
1651                         oxt2_nix_unregister_cq_irqs(eth_dev);
1652                 nix_set_nop_rxtx_function(eth_dev);
1653                 rc = nix_store_queue_cfg_and_then_release(eth_dev);
1654                 if (rc)
1655                         goto fail_configure;
1656                 otx2_nix_tm_fini(eth_dev);
1657                 nix_lf_free(dev);
1658         }
1659
1660         dev->rx_offloads = rxmode->offloads;
1661         dev->tx_offloads = txmode->offloads;
1662         dev->rx_offload_flags |= nix_rx_offload_flags(eth_dev);
1663         dev->tx_offload_flags |= nix_tx_offload_flags(eth_dev);
1664         dev->rss_info.rss_grps = NIX_RSS_GRPS;
1665
1666         nb_rxq = RTE_MAX(data->nb_rx_queues, 1);
1667         nb_txq = RTE_MAX(data->nb_tx_queues, 1);
1668
1669         /* Alloc a nix lf */
1670         rc = nix_lf_alloc(dev, nb_rxq, nb_txq);
1671         if (rc) {
1672                 otx2_err("Failed to init nix_lf rc=%d", rc);
1673                 goto fail_offloads;
1674         }
1675
1676         otx2_nix_err_intr_enb_dis(eth_dev, true);
1677         otx2_nix_ras_intr_enb_dis(eth_dev, true);
1678
1679         if (dev->ptp_en &&
1680             dev->npc_flow.switch_header_type == OTX2_PRIV_FLAGS_HIGIG) {
1681                 otx2_err("Both PTP and switch header enabled");
1682                 goto free_nix_lf;
1683         }
1684
1685         rc = nix_lf_switch_header_type_enable(dev, true);
1686         if (rc) {
1687                 otx2_err("Failed to enable switch type nix_lf rc=%d", rc);
1688                 goto free_nix_lf;
1689         }
1690
1691         rc = nix_setup_lso_formats(dev);
1692         if (rc) {
1693                 otx2_err("failed to setup nix lso format fields, rc=%d", rc);
1694                 goto free_nix_lf;
1695         }
1696
1697         /* Configure RSS */
1698         rc = otx2_nix_rss_config(eth_dev);
1699         if (rc) {
1700                 otx2_err("Failed to configure rss rc=%d", rc);
1701                 goto free_nix_lf;
1702         }
1703
1704         /* Init the default TM scheduler hierarchy */
1705         rc = otx2_nix_tm_init_default(eth_dev);
1706         if (rc) {
1707                 otx2_err("Failed to init traffic manager rc=%d", rc);
1708                 goto free_nix_lf;
1709         }
1710
1711         rc = otx2_nix_vlan_offload_init(eth_dev);
1712         if (rc) {
1713                 otx2_err("Failed to init vlan offload rc=%d", rc);
1714                 goto tm_fini;
1715         }
1716
1717         /* Register queue IRQs */
1718         rc = oxt2_nix_register_queue_irqs(eth_dev);
1719         if (rc) {
1720                 otx2_err("Failed to register queue interrupts rc=%d", rc);
1721                 goto vlan_fini;
1722         }
1723
1724         /* Register cq IRQs */
1725         if (eth_dev->data->dev_conf.intr_conf.rxq) {
1726                 if (eth_dev->data->nb_rx_queues > dev->cints) {
1727                         otx2_err("Rx interrupt cannot be enabled, rxq > %d",
1728                                  dev->cints);
1729                         goto q_irq_fini;
1730                 }
1731                 /* Rx interrupt feature cannot work with vector mode because,
1732                  * vector mode doesn't process packets unless min 4 pkts are
1733                  * received, while cq interrupts are generated even for 1 pkt
1734                  * in the CQ.
1735                  */
1736                 dev->scalar_ena = true;
1737
1738                 rc = oxt2_nix_register_cq_irqs(eth_dev);
1739                 if (rc) {
1740                         otx2_err("Failed to register CQ interrupts rc=%d", rc);
1741                         goto q_irq_fini;
1742                 }
1743         }
1744
1745         /* Configure loop back mode */
1746         rc = cgx_intlbk_enable(dev, eth_dev->data->dev_conf.lpbk_mode);
1747         if (rc) {
1748                 otx2_err("Failed to configure cgx loop back mode rc=%d", rc);
1749                 goto cq_fini;
1750         }
1751
1752         rc = otx2_nix_rxchan_bpid_cfg(eth_dev, true);
1753         if (rc) {
1754                 otx2_err("Failed to configure nix rx chan bpid cfg rc=%d", rc);
1755                 goto cq_fini;
1756         }
1757
1758         /* Enable security */
1759         rc = otx2_eth_sec_init(eth_dev);
1760         if (rc)
1761                 goto cq_fini;
1762
1763         rc = otx2_nix_flow_ctrl_init(eth_dev);
1764         if (rc) {
1765                 otx2_err("Failed to init flow ctrl mode %d", rc);
1766                 goto cq_fini;
1767         }
1768
1769         rc = otx2_nix_mc_addr_list_install(eth_dev);
1770         if (rc < 0) {
1771                 otx2_err("Failed to install mc address list rc=%d", rc);
1772                 goto sec_fini;
1773         }
1774
1775         /*
1776          * Restore queue config when reconfigure followed by
1777          * reconfigure and no queue configure invoked from application case.
1778          */
1779         if (dev->configured == 1) {
1780                 rc = nix_restore_queue_cfg(eth_dev);
1781                 if (rc)
1782                         goto uninstall_mc_list;
1783         }
1784
1785         /* Update the mac address */
1786         ea = eth_dev->data->mac_addrs;
1787         memcpy(ea, dev->mac_addr, RTE_ETHER_ADDR_LEN);
1788         if (rte_is_zero_ether_addr(ea))
1789                 rte_eth_random_addr((uint8_t *)ea);
1790
1791         rte_ether_format_addr(ea_fmt, RTE_ETHER_ADDR_FMT_SIZE, ea);
1792
1793         /* Apply new link configurations if changed */
1794         rc = otx2_apply_link_speed(eth_dev);
1795         if (rc) {
1796                 otx2_err("Failed to set link configuration");
1797                 goto uninstall_mc_list;
1798         }
1799
1800         otx2_nix_dbg("Configured port%d mac=%s nb_rxq=%d nb_txq=%d"
1801                 " rx_offloads=0x%" PRIx64 " tx_offloads=0x%" PRIx64 ""
1802                 " rx_flags=0x%x tx_flags=0x%x",
1803                 eth_dev->data->port_id, ea_fmt, nb_rxq,
1804                 nb_txq, dev->rx_offloads, dev->tx_offloads,
1805                 dev->rx_offload_flags, dev->tx_offload_flags);
1806
1807         /* All good */
1808         dev->configured = 1;
1809         dev->configured_nb_rx_qs = data->nb_rx_queues;
1810         dev->configured_nb_tx_qs = data->nb_tx_queues;
1811         return 0;
1812
1813 uninstall_mc_list:
1814         otx2_nix_mc_addr_list_uninstall(eth_dev);
1815 sec_fini:
1816         otx2_eth_sec_fini(eth_dev);
1817 cq_fini:
1818         oxt2_nix_unregister_cq_irqs(eth_dev);
1819 q_irq_fini:
1820         oxt2_nix_unregister_queue_irqs(eth_dev);
1821 vlan_fini:
1822         otx2_nix_vlan_fini(eth_dev);
1823 tm_fini:
1824         otx2_nix_tm_fini(eth_dev);
1825 free_nix_lf:
1826         nix_lf_free(dev);
1827 fail_offloads:
1828         dev->rx_offload_flags &= ~nix_rx_offload_flags(eth_dev);
1829         dev->tx_offload_flags &= ~nix_tx_offload_flags(eth_dev);
1830 fail_configure:
1831         dev->configured = 0;
1832         return rc;
1833 }
1834
1835 int
1836 otx2_nix_tx_queue_start(struct rte_eth_dev *eth_dev, uint16_t qidx)
1837 {
1838         struct rte_eth_dev_data *data = eth_dev->data;
1839         struct otx2_eth_txq *txq;
1840         int rc = -EINVAL;
1841
1842         txq = eth_dev->data->tx_queues[qidx];
1843
1844         if (data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED)
1845                 return 0;
1846
1847         rc = otx2_nix_sq_sqb_aura_fc(txq, true);
1848         if (rc) {
1849                 otx2_err("Failed to enable sqb aura fc, txq=%u, rc=%d",
1850                          qidx, rc);
1851                 goto done;
1852         }
1853
1854         data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
1855
1856 done:
1857         return rc;
1858 }
1859
1860 int
1861 otx2_nix_tx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t qidx)
1862 {
1863         struct rte_eth_dev_data *data = eth_dev->data;
1864         struct otx2_eth_txq *txq;
1865         int rc;
1866
1867         txq = eth_dev->data->tx_queues[qidx];
1868
1869         if (data->tx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED)
1870                 return 0;
1871
1872         txq->fc_cache_pkts = 0;
1873
1874         rc = otx2_nix_sq_sqb_aura_fc(txq, false);
1875         if (rc) {
1876                 otx2_err("Failed to disable sqb aura fc, txq=%u, rc=%d",
1877                          qidx, rc);
1878                 goto done;
1879         }
1880
1881         data->tx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
1882
1883 done:
1884         return rc;
1885 }
1886
1887 static int
1888 otx2_nix_rx_queue_start(struct rte_eth_dev *eth_dev, uint16_t qidx)
1889 {
1890         struct otx2_eth_rxq *rxq = eth_dev->data->rx_queues[qidx];
1891         struct rte_eth_dev_data *data = eth_dev->data;
1892         int rc;
1893
1894         if (data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STARTED)
1895                 return 0;
1896
1897         rc = nix_rq_enb_dis(rxq->eth_dev, rxq, true);
1898         if (rc) {
1899                 otx2_err("Failed to enable rxq=%u, rc=%d", qidx, rc);
1900                 goto done;
1901         }
1902
1903         data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STARTED;
1904
1905 done:
1906         return rc;
1907 }
1908
1909 static int
1910 otx2_nix_rx_queue_stop(struct rte_eth_dev *eth_dev, uint16_t qidx)
1911 {
1912         struct otx2_eth_rxq *rxq = eth_dev->data->rx_queues[qidx];
1913         struct rte_eth_dev_data *data = eth_dev->data;
1914         int rc;
1915
1916         if (data->rx_queue_state[qidx] == RTE_ETH_QUEUE_STATE_STOPPED)
1917                 return 0;
1918
1919         rc = nix_rq_enb_dis(rxq->eth_dev, rxq, false);
1920         if (rc) {
1921                 otx2_err("Failed to disable rxq=%u, rc=%d", qidx, rc);
1922                 goto done;
1923         }
1924
1925         data->rx_queue_state[qidx] = RTE_ETH_QUEUE_STATE_STOPPED;
1926
1927 done:
1928         return rc;
1929 }
1930
1931 static void
1932 otx2_nix_dev_stop(struct rte_eth_dev *eth_dev)
1933 {
1934         struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
1935         struct rte_mbuf *rx_pkts[32];
1936         struct otx2_eth_rxq *rxq;
1937         int count, i, j, rc;
1938
1939         nix_lf_switch_header_type_enable(dev, false);
1940         nix_cgx_stop_link_event(dev);
1941         npc_rx_disable(dev);
1942
1943         /* Stop rx queues and free up pkts pending */
1944         for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
1945                 rc = otx2_nix_rx_queue_stop(eth_dev, i);
1946                 if (rc)
1947                         continue;
1948
1949                 rxq = eth_dev->data->rx_queues[i];
1950                 count = dev->rx_pkt_burst_no_offload(rxq, rx_pkts, 32);
1951                 while (count) {
1952                         for (j = 0; j < count; j++)
1953                                 rte_pktmbuf_free(rx_pkts[j]);
1954                         count = dev->rx_pkt_burst_no_offload(rxq, rx_pkts, 32);
1955                 }
1956         }
1957
1958         /* Stop tx queues  */
1959         for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
1960                 otx2_nix_tx_queue_stop(eth_dev, i);
1961 }
1962
1963 static int
1964 otx2_nix_dev_start(struct rte_eth_dev *eth_dev)
1965 {
1966         struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
1967         int rc, i;
1968
1969         /* MTU recalculate should be avoided here if PTP is enabled by PF, as
1970          * otx2_nix_recalc_mtu would be invoked during otx2_nix_ptp_enable_vf
1971          * call below.
1972          */
1973         if (eth_dev->data->nb_rx_queues != 0 && !otx2_ethdev_is_ptp_en(dev)) {
1974                 rc = otx2_nix_recalc_mtu(eth_dev);
1975                 if (rc)
1976                         return rc;
1977         }
1978
1979         /* Start rx queues */
1980         for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
1981                 rc = otx2_nix_rx_queue_start(eth_dev, i);
1982                 if (rc)
1983                         return rc;
1984         }
1985
1986         /* Start tx queues  */
1987         for (i = 0; i < eth_dev->data->nb_tx_queues; i++) {
1988                 rc = otx2_nix_tx_queue_start(eth_dev, i);
1989                 if (rc)
1990                         return rc;
1991         }
1992
1993         rc = otx2_nix_update_flow_ctrl_mode(eth_dev);
1994         if (rc) {
1995                 otx2_err("Failed to update flow ctrl mode %d", rc);
1996                 return rc;
1997         }
1998
1999         /* Enable PTP if it was requested by the app or if it is already
2000          * enabled in PF owning this VF
2001          */
2002         memset(&dev->tstamp, 0, sizeof(struct otx2_timesync_info));
2003         if ((dev->rx_offloads & DEV_RX_OFFLOAD_TIMESTAMP) ||
2004             otx2_ethdev_is_ptp_en(dev))
2005                 otx2_nix_timesync_enable(eth_dev);
2006         else
2007                 otx2_nix_timesync_disable(eth_dev);
2008
2009         /* Update VF about data off shifted by 8 bytes if PTP already
2010          * enabled in PF owning this VF
2011          */
2012         if (otx2_ethdev_is_ptp_en(dev) && otx2_dev_is_vf(dev))
2013                 otx2_nix_ptp_enable_vf(eth_dev);
2014
2015         rc = npc_rx_enable(dev);
2016         if (rc) {
2017                 otx2_err("Failed to enable NPC rx %d", rc);
2018                 return rc;
2019         }
2020
2021         otx2_nix_toggle_flag_link_cfg(dev, true);
2022
2023         rc = nix_cgx_start_link_event(dev);
2024         if (rc) {
2025                 otx2_err("Failed to start cgx link event %d", rc);
2026                 goto rx_disable;
2027         }
2028
2029         otx2_nix_toggle_flag_link_cfg(dev, false);
2030         otx2_eth_set_tx_function(eth_dev);
2031         otx2_eth_set_rx_function(eth_dev);
2032
2033         return 0;
2034
2035 rx_disable:
2036         npc_rx_disable(dev);
2037         otx2_nix_toggle_flag_link_cfg(dev, false);
2038         return rc;
2039 }
2040
2041 static int otx2_nix_dev_reset(struct rte_eth_dev *eth_dev);
2042 static void otx2_nix_dev_close(struct rte_eth_dev *eth_dev);
2043
2044 /* Initialize and register driver with DPDK Application */
2045 static const struct eth_dev_ops otx2_eth_dev_ops = {
2046         .dev_infos_get            = otx2_nix_info_get,
2047         .dev_configure            = otx2_nix_configure,
2048         .link_update              = otx2_nix_link_update,
2049         .tx_queue_setup           = otx2_nix_tx_queue_setup,
2050         .tx_queue_release         = otx2_nix_tx_queue_release,
2051         .tm_ops_get               = otx2_nix_tm_ops_get,
2052         .rx_queue_setup           = otx2_nix_rx_queue_setup,
2053         .rx_queue_release         = otx2_nix_rx_queue_release,
2054         .dev_start                = otx2_nix_dev_start,
2055         .dev_stop                 = otx2_nix_dev_stop,
2056         .dev_close                = otx2_nix_dev_close,
2057         .tx_queue_start           = otx2_nix_tx_queue_start,
2058         .tx_queue_stop            = otx2_nix_tx_queue_stop,
2059         .rx_queue_start           = otx2_nix_rx_queue_start,
2060         .rx_queue_stop            = otx2_nix_rx_queue_stop,
2061         .dev_set_link_up          = otx2_nix_dev_set_link_up,
2062         .dev_set_link_down        = otx2_nix_dev_set_link_down,
2063         .dev_supported_ptypes_get = otx2_nix_supported_ptypes_get,
2064         .dev_ptypes_set           = otx2_nix_ptypes_set,
2065         .dev_reset                = otx2_nix_dev_reset,
2066         .stats_get                = otx2_nix_dev_stats_get,
2067         .stats_reset              = otx2_nix_dev_stats_reset,
2068         .get_reg                  = otx2_nix_dev_get_reg,
2069         .mtu_set                  = otx2_nix_mtu_set,
2070         .mac_addr_add             = otx2_nix_mac_addr_add,
2071         .mac_addr_remove          = otx2_nix_mac_addr_del,
2072         .mac_addr_set             = otx2_nix_mac_addr_set,
2073         .set_mc_addr_list         = otx2_nix_set_mc_addr_list,
2074         .promiscuous_enable       = otx2_nix_promisc_enable,
2075         .promiscuous_disable      = otx2_nix_promisc_disable,
2076         .allmulticast_enable      = otx2_nix_allmulticast_enable,
2077         .allmulticast_disable     = otx2_nix_allmulticast_disable,
2078         .queue_stats_mapping_set  = otx2_nix_queue_stats_mapping,
2079         .reta_update              = otx2_nix_dev_reta_update,
2080         .reta_query               = otx2_nix_dev_reta_query,
2081         .rss_hash_update          = otx2_nix_rss_hash_update,
2082         .rss_hash_conf_get        = otx2_nix_rss_hash_conf_get,
2083         .xstats_get               = otx2_nix_xstats_get,
2084         .xstats_get_names         = otx2_nix_xstats_get_names,
2085         .xstats_reset             = otx2_nix_xstats_reset,
2086         .xstats_get_by_id         = otx2_nix_xstats_get_by_id,
2087         .xstats_get_names_by_id   = otx2_nix_xstats_get_names_by_id,
2088         .rxq_info_get             = otx2_nix_rxq_info_get,
2089         .txq_info_get             = otx2_nix_txq_info_get,
2090         .rx_burst_mode_get        = otx2_rx_burst_mode_get,
2091         .tx_burst_mode_get        = otx2_tx_burst_mode_get,
2092         .rx_queue_count           = otx2_nix_rx_queue_count,
2093         .rx_descriptor_done       = otx2_nix_rx_descriptor_done,
2094         .rx_descriptor_status     = otx2_nix_rx_descriptor_status,
2095         .tx_descriptor_status     = otx2_nix_tx_descriptor_status,
2096         .tx_done_cleanup          = otx2_nix_tx_done_cleanup,
2097         .set_queue_rate_limit     = otx2_nix_tm_set_queue_rate_limit,
2098         .pool_ops_supported       = otx2_nix_pool_ops_supported,
2099         .filter_ctrl              = otx2_nix_dev_filter_ctrl,
2100         .get_module_info          = otx2_nix_get_module_info,
2101         .get_module_eeprom        = otx2_nix_get_module_eeprom,
2102         .fw_version_get           = otx2_nix_fw_version_get,
2103         .flow_ctrl_get            = otx2_nix_flow_ctrl_get,
2104         .flow_ctrl_set            = otx2_nix_flow_ctrl_set,
2105         .timesync_enable          = otx2_nix_timesync_enable,
2106         .timesync_disable         = otx2_nix_timesync_disable,
2107         .timesync_read_rx_timestamp = otx2_nix_timesync_read_rx_timestamp,
2108         .timesync_read_tx_timestamp = otx2_nix_timesync_read_tx_timestamp,
2109         .timesync_adjust_time     = otx2_nix_timesync_adjust_time,
2110         .timesync_read_time       = otx2_nix_timesync_read_time,
2111         .timesync_write_time      = otx2_nix_timesync_write_time,
2112         .vlan_offload_set         = otx2_nix_vlan_offload_set,
2113         .vlan_filter_set          = otx2_nix_vlan_filter_set,
2114         .vlan_strip_queue_set     = otx2_nix_vlan_strip_queue_set,
2115         .vlan_tpid_set            = otx2_nix_vlan_tpid_set,
2116         .vlan_pvid_set            = otx2_nix_vlan_pvid_set,
2117         .rx_queue_intr_enable     = otx2_nix_rx_queue_intr_enable,
2118         .rx_queue_intr_disable    = otx2_nix_rx_queue_intr_disable,
2119         .read_clock               = otx2_nix_read_clock,
2120 };
2121
2122 static inline int
2123 nix_lf_attach(struct otx2_eth_dev *dev)
2124 {
2125         struct otx2_mbox *mbox = dev->mbox;
2126         struct rsrc_attach_req *req;
2127
2128         /* Attach NIX(lf) */
2129         req = otx2_mbox_alloc_msg_attach_resources(mbox);
2130         req->modify = true;
2131         req->nixlf = true;
2132
2133         return otx2_mbox_process(mbox);
2134 }
2135
2136 static inline int
2137 nix_lf_get_msix_offset(struct otx2_eth_dev *dev)
2138 {
2139         struct otx2_mbox *mbox = dev->mbox;
2140         struct msix_offset_rsp *msix_rsp;
2141         int rc;
2142
2143         /* Get NPA and NIX MSIX vector offsets */
2144         otx2_mbox_alloc_msg_msix_offset(mbox);
2145
2146         rc = otx2_mbox_process_msg(mbox, (void *)&msix_rsp);
2147
2148         dev->nix_msixoff = msix_rsp->nix_msixoff;
2149
2150         return rc;
2151 }
2152
2153 static inline int
2154 otx2_eth_dev_lf_detach(struct otx2_mbox *mbox)
2155 {
2156         struct rsrc_detach_req *req;
2157
2158         req = otx2_mbox_alloc_msg_detach_resources(mbox);
2159
2160         /* Detach all except npa lf */
2161         req->partial = true;
2162         req->nixlf = true;
2163         req->sso = true;
2164         req->ssow = true;
2165         req->timlfs = true;
2166         req->cptlfs = true;
2167
2168         return otx2_mbox_process(mbox);
2169 }
2170
2171 static bool
2172 otx2_eth_dev_is_sdp(struct rte_pci_device *pci_dev)
2173 {
2174         if (pci_dev->id.device_id == PCI_DEVID_OCTEONTX2_RVU_SDP_PF ||
2175             pci_dev->id.device_id == PCI_DEVID_OCTEONTX2_RVU_SDP_VF)
2176                 return true;
2177         return false;
2178 }
2179
2180 static inline uint64_t
2181 nix_get_blkaddr(struct otx2_eth_dev *dev)
2182 {
2183         uint64_t reg;
2184
2185         /* Reading the discovery register to know which NIX is the LF
2186          * attached to.
2187          */
2188         reg = otx2_read64(dev->bar2 +
2189                           RVU_PF_BLOCK_ADDRX_DISC(RVU_BLOCK_ADDR_NIX0));
2190
2191         return reg & 0x1FFULL ? RVU_BLOCK_ADDR_NIX0 : RVU_BLOCK_ADDR_NIX1;
2192 }
2193
2194 static int
2195 otx2_eth_dev_init(struct rte_eth_dev *eth_dev)
2196 {
2197         struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
2198         struct rte_pci_device *pci_dev;
2199         int rc, max_entries;
2200
2201         eth_dev->dev_ops = &otx2_eth_dev_ops;
2202
2203         /* For secondary processes, the primary has done all the work */
2204         if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
2205                 /* Setup callbacks for secondary process */
2206                 otx2_eth_set_tx_function(eth_dev);
2207                 otx2_eth_set_rx_function(eth_dev);
2208                 return 0;
2209         }
2210
2211         pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
2212
2213         rte_eth_copy_pci_info(eth_dev, pci_dev);
2214         eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
2215
2216         /* Zero out everything after OTX2_DEV to allow proper dev_reset() */
2217         memset(&dev->otx2_eth_dev_data_start, 0, sizeof(*dev) -
2218                 offsetof(struct otx2_eth_dev, otx2_eth_dev_data_start));
2219
2220         /* Parse devargs string */
2221         rc = otx2_ethdev_parse_devargs(eth_dev->device->devargs, dev);
2222         if (rc) {
2223                 otx2_err("Failed to parse devargs rc=%d", rc);
2224                 goto error;
2225         }
2226
2227         if (!dev->mbox_active) {
2228                 /* Initialize the base otx2_dev object
2229                  * only if already present
2230                  */
2231                 rc = otx2_dev_init(pci_dev, dev);
2232                 if (rc) {
2233                         otx2_err("Failed to initialize otx2_dev rc=%d", rc);
2234                         goto error;
2235                 }
2236         }
2237         if (otx2_eth_dev_is_sdp(pci_dev))
2238                 dev->sdp_link = true;
2239         else
2240                 dev->sdp_link = false;
2241         /* Device generic callbacks */
2242         dev->ops = &otx2_dev_ops;
2243         dev->eth_dev = eth_dev;
2244
2245         /* Grab the NPA LF if required */
2246         rc = otx2_npa_lf_init(pci_dev, dev);
2247         if (rc)
2248                 goto otx2_dev_uninit;
2249
2250         dev->configured = 0;
2251         dev->drv_inited = true;
2252         dev->ptype_disable = 0;
2253         dev->lmt_addr = dev->bar2 + (RVU_BLOCK_ADDR_LMT << 20);
2254
2255         /* Attach NIX LF */
2256         rc = nix_lf_attach(dev);
2257         if (rc)
2258                 goto otx2_npa_uninit;
2259
2260         dev->base = dev->bar2 + (nix_get_blkaddr(dev) << 20);
2261
2262         /* Get NIX MSIX offset */
2263         rc = nix_lf_get_msix_offset(dev);
2264         if (rc)
2265                 goto otx2_npa_uninit;
2266
2267         /* Register LF irq handlers */
2268         rc = otx2_nix_register_irqs(eth_dev);
2269         if (rc)
2270                 goto mbox_detach;
2271
2272         /* Get maximum number of supported MAC entries */
2273         max_entries = otx2_cgx_mac_max_entries_get(dev);
2274         if (max_entries < 0) {
2275                 otx2_err("Failed to get max entries for mac addr");
2276                 rc = -ENOTSUP;
2277                 goto unregister_irq;
2278         }
2279
2280         /* For VFs, returned max_entries will be 0. But to keep default MAC
2281          * address, one entry must be allocated. So setting up to 1.
2282          */
2283         if (max_entries == 0)
2284                 max_entries = 1;
2285
2286         eth_dev->data->mac_addrs = rte_zmalloc("mac_addr", max_entries *
2287                                                RTE_ETHER_ADDR_LEN, 0);
2288         if (eth_dev->data->mac_addrs == NULL) {
2289                 otx2_err("Failed to allocate memory for mac addr");
2290                 rc = -ENOMEM;
2291                 goto unregister_irq;
2292         }
2293
2294         dev->max_mac_entries = max_entries;
2295
2296         rc = otx2_nix_mac_addr_get(eth_dev, dev->mac_addr);
2297         if (rc)
2298                 goto free_mac_addrs;
2299
2300         /* Update the mac address */
2301         memcpy(eth_dev->data->mac_addrs, dev->mac_addr, RTE_ETHER_ADDR_LEN);
2302
2303         /* Also sync same MAC address to CGX table */
2304         otx2_cgx_mac_addr_set(eth_dev, &eth_dev->data->mac_addrs[0]);
2305
2306         /* Initialize the tm data structures */
2307         otx2_nix_tm_conf_init(eth_dev);
2308
2309         dev->tx_offload_capa = nix_get_tx_offload_capa(dev);
2310         dev->rx_offload_capa = nix_get_rx_offload_capa(dev);
2311
2312         if (otx2_dev_is_96xx_A0(dev) ||
2313             otx2_dev_is_95xx_Ax(dev)) {
2314                 dev->hwcap |= OTX2_FIXUP_F_MIN_4K_Q;
2315                 dev->hwcap |= OTX2_FIXUP_F_LIMIT_CQ_FULL;
2316         }
2317
2318         /* Create security ctx */
2319         rc = otx2_eth_sec_ctx_create(eth_dev);
2320         if (rc)
2321                 goto free_mac_addrs;
2322         dev->tx_offload_capa |= DEV_TX_OFFLOAD_SECURITY;
2323         dev->rx_offload_capa |= DEV_RX_OFFLOAD_SECURITY;
2324
2325         /* Initialize rte-flow */
2326         rc = otx2_flow_init(dev);
2327         if (rc)
2328                 goto sec_ctx_destroy;
2329
2330         otx2_nix_mc_filter_init(dev);
2331
2332         otx2_nix_dbg("Port=%d pf=%d vf=%d ver=%s msix_off=%d hwcap=0x%" PRIx64
2333                      " rxoffload_capa=0x%" PRIx64 " txoffload_capa=0x%" PRIx64,
2334                      eth_dev->data->port_id, dev->pf, dev->vf,
2335                      OTX2_ETH_DEV_PMD_VERSION, dev->nix_msixoff, dev->hwcap,
2336                      dev->rx_offload_capa, dev->tx_offload_capa);
2337         return 0;
2338
2339 sec_ctx_destroy:
2340         otx2_eth_sec_ctx_destroy(eth_dev);
2341 free_mac_addrs:
2342         rte_free(eth_dev->data->mac_addrs);
2343 unregister_irq:
2344         otx2_nix_unregister_irqs(eth_dev);
2345 mbox_detach:
2346         otx2_eth_dev_lf_detach(dev->mbox);
2347 otx2_npa_uninit:
2348         otx2_npa_lf_fini();
2349 otx2_dev_uninit:
2350         otx2_dev_fini(pci_dev, dev);
2351 error:
2352         otx2_err("Failed to init nix eth_dev rc=%d", rc);
2353         return rc;
2354 }
2355
2356 static int
2357 otx2_eth_dev_uninit(struct rte_eth_dev *eth_dev, bool mbox_close)
2358 {
2359         struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
2360         struct rte_pci_device *pci_dev;
2361         int rc, i;
2362
2363         /* Nothing to be done for secondary processes */
2364         if (rte_eal_process_type() != RTE_PROC_PRIMARY)
2365                 return 0;
2366
2367         /* Clear the flag since we are closing down */
2368         dev->configured = 0;
2369
2370         /* Disable nix bpid config */
2371         otx2_nix_rxchan_bpid_cfg(eth_dev, false);
2372
2373         npc_rx_disable(dev);
2374
2375         /* Disable vlan offloads */
2376         otx2_nix_vlan_fini(eth_dev);
2377
2378         /* Disable other rte_flow entries */
2379         otx2_flow_fini(dev);
2380
2381         /* Free multicast filter list */
2382         otx2_nix_mc_filter_fini(dev);
2383
2384         /* Disable PTP if already enabled */
2385         if (otx2_ethdev_is_ptp_en(dev))
2386                 otx2_nix_timesync_disable(eth_dev);
2387
2388         nix_cgx_stop_link_event(dev);
2389
2390         /* Free up SQs */
2391         for (i = 0; i < eth_dev->data->nb_tx_queues; i++) {
2392                 otx2_nix_tx_queue_release(eth_dev->data->tx_queues[i]);
2393                 eth_dev->data->tx_queues[i] = NULL;
2394         }
2395         eth_dev->data->nb_tx_queues = 0;
2396
2397         /* Free up RQ's and CQ's */
2398         for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
2399                 otx2_nix_rx_queue_release(eth_dev->data->rx_queues[i]);
2400                 eth_dev->data->rx_queues[i] = NULL;
2401         }
2402         eth_dev->data->nb_rx_queues = 0;
2403
2404         /* Free tm resources */
2405         rc = otx2_nix_tm_fini(eth_dev);
2406         if (rc)
2407                 otx2_err("Failed to cleanup tm, rc=%d", rc);
2408
2409         /* Unregister queue irqs */
2410         oxt2_nix_unregister_queue_irqs(eth_dev);
2411
2412         /* Unregister cq irqs */
2413         if (eth_dev->data->dev_conf.intr_conf.rxq)
2414                 oxt2_nix_unregister_cq_irqs(eth_dev);
2415
2416         rc = nix_lf_free(dev);
2417         if (rc)
2418                 otx2_err("Failed to free nix lf, rc=%d", rc);
2419
2420         rc = otx2_npa_lf_fini();
2421         if (rc)
2422                 otx2_err("Failed to cleanup npa lf, rc=%d", rc);
2423
2424         /* Disable security */
2425         otx2_eth_sec_fini(eth_dev);
2426
2427         /* Destroy security ctx */
2428         otx2_eth_sec_ctx_destroy(eth_dev);
2429
2430         rte_free(eth_dev->data->mac_addrs);
2431         eth_dev->data->mac_addrs = NULL;
2432         dev->drv_inited = false;
2433
2434         pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
2435         otx2_nix_unregister_irqs(eth_dev);
2436
2437         rc = otx2_eth_dev_lf_detach(dev->mbox);
2438         if (rc)
2439                 otx2_err("Failed to detach resources, rc=%d", rc);
2440
2441         /* Check if mbox close is needed */
2442         if (!mbox_close)
2443                 return 0;
2444
2445         if (otx2_npa_lf_active(dev) || otx2_dev_active_vfs(dev)) {
2446                 /* Will be freed later by PMD */
2447                 eth_dev->data->dev_private = NULL;
2448                 return 0;
2449         }
2450
2451         otx2_dev_fini(pci_dev, dev);
2452         return 0;
2453 }
2454
2455 static void
2456 otx2_nix_dev_close(struct rte_eth_dev *eth_dev)
2457 {
2458         otx2_eth_dev_uninit(eth_dev, true);
2459 }
2460
2461 static int
2462 otx2_nix_dev_reset(struct rte_eth_dev *eth_dev)
2463 {
2464         int rc;
2465
2466         rc = otx2_eth_dev_uninit(eth_dev, false);
2467         if (rc)
2468                 return rc;
2469
2470         return otx2_eth_dev_init(eth_dev);
2471 }
2472
2473 static int
2474 nix_remove(struct rte_pci_device *pci_dev)
2475 {
2476         struct rte_eth_dev *eth_dev;
2477         struct otx2_idev_cfg *idev;
2478         struct otx2_dev *otx2_dev;
2479         int rc;
2480
2481         eth_dev = rte_eth_dev_allocated(pci_dev->device.name);
2482         if (eth_dev) {
2483                 /* Cleanup eth dev */
2484                 rc = otx2_eth_dev_uninit(eth_dev, true);
2485                 if (rc)
2486                         return rc;
2487
2488                 rte_eth_dev_pci_release(eth_dev);
2489         }
2490
2491         /* Nothing to be done for secondary processes */
2492         if (rte_eal_process_type() != RTE_PROC_PRIMARY)
2493                 return 0;
2494
2495         /* Check for common resources */
2496         idev = otx2_intra_dev_get_cfg();
2497         if (!idev || !idev->npa_lf || idev->npa_lf->pci_dev != pci_dev)
2498                 return 0;
2499
2500         otx2_dev = container_of(idev->npa_lf, struct otx2_dev, npalf);
2501
2502         if (otx2_npa_lf_active(otx2_dev) || otx2_dev_active_vfs(otx2_dev))
2503                 goto exit;
2504
2505         /* Safe to cleanup mbox as no more users */
2506         otx2_dev_fini(pci_dev, otx2_dev);
2507         rte_free(otx2_dev);
2508         return 0;
2509
2510 exit:
2511         otx2_info("%s: common resource in use by other devices", pci_dev->name);
2512         return -EAGAIN;
2513 }
2514
2515 static int
2516 nix_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
2517 {
2518         int rc;
2519
2520         RTE_SET_USED(pci_drv);
2521
2522         rc = rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct otx2_eth_dev),
2523                                            otx2_eth_dev_init);
2524
2525         /* On error on secondary, recheck if port exists in primary or
2526          * in mid of detach state.
2527          */
2528         if (rte_eal_process_type() != RTE_PROC_PRIMARY && rc)
2529                 if (!rte_eth_dev_allocated(pci_dev->device.name))
2530                         return 0;
2531         return rc;
2532 }
2533
2534 static const struct rte_pci_id pci_nix_map[] = {
2535         {
2536                 RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_OCTEONTX2_RVU_PF)
2537         },
2538         {
2539                 RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_OCTEONTX2_RVU_VF)
2540         },
2541         {
2542                 RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
2543                                PCI_DEVID_OCTEONTX2_RVU_AF_VF)
2544         },
2545         {
2546                 RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
2547                                PCI_DEVID_OCTEONTX2_RVU_SDP_PF)
2548         },
2549         {
2550                 RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
2551                                PCI_DEVID_OCTEONTX2_RVU_SDP_VF)
2552         },
2553         {
2554                 .vendor_id = 0,
2555         },
2556 };
2557
2558 static struct rte_pci_driver pci_nix = {
2559         .id_table = pci_nix_map,
2560         .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA |
2561                         RTE_PCI_DRV_INTR_LSC,
2562         .probe = nix_probe,
2563         .remove = nix_remove,
2564 };
2565
2566 RTE_PMD_REGISTER_PCI(net_octeontx2, pci_nix);
2567 RTE_PMD_REGISTER_PCI_TABLE(net_octeontx2, pci_nix_map);
2568 RTE_PMD_REGISTER_KMOD_DEP(net_octeontx2, "vfio-pci");