net/mlx5: add C++ include guard to public header
[dpdk.git] / drivers / net / nfp / nfp_common.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2014-2018 Netronome Systems, Inc.
3  * All rights reserved.
4  *
5  * Small portions derived from code Copyright(c) 2010-2015 Intel Corporation.
6  */
7
8 /*
9  * vim:shiftwidth=8:noexpandtab
10  *
11  * @file dpdk/pmd/nfp_common.c
12  *
13  * Netronome vNIC DPDK Poll-Mode Driver: Common files
14  */
15
16 #include <rte_byteorder.h>
17 #include <rte_common.h>
18 #include <rte_log.h>
19 #include <rte_debug.h>
20 #include <ethdev_driver.h>
21 #include <ethdev_pci.h>
22 #include <rte_dev.h>
23 #include <rte_ether.h>
24 #include <rte_malloc.h>
25 #include <rte_memzone.h>
26 #include <rte_mempool.h>
27 #include <rte_version.h>
28 #include <rte_string_fns.h>
29 #include <rte_alarm.h>
30 #include <rte_spinlock.h>
31 #include <rte_service_component.h>
32
33 #include "nfpcore/nfp_cpp.h"
34 #include "nfpcore/nfp_nffw.h"
35 #include "nfpcore/nfp_hwinfo.h"
36 #include "nfpcore/nfp_mip.h"
37 #include "nfpcore/nfp_rtsym.h"
38 #include "nfpcore/nfp_nsp.h"
39
40 #include "nfp_common.h"
41 #include "nfp_rxtx.h"
42 #include "nfp_logs.h"
43 #include "nfp_ctrl.h"
44 #include "nfp_cpp_bridge.h"
45
46 #include <sys/types.h>
47 #include <sys/socket.h>
48 #include <sys/un.h>
49 #include <unistd.h>
50 #include <stdio.h>
51 #include <sys/ioctl.h>
52 #include <errno.h>
53
54 static int
55 __nfp_net_reconfig(struct nfp_net_hw *hw, uint32_t update)
56 {
57         int cnt;
58         uint32_t new;
59         struct timespec wait;
60
61         PMD_DRV_LOG(DEBUG, "Writing to the configuration queue (%p)...",
62                     hw->qcp_cfg);
63
64         if (hw->qcp_cfg == NULL)
65                 rte_panic("Bad configuration queue pointer\n");
66
67         nfp_qcp_ptr_add(hw->qcp_cfg, NFP_QCP_WRITE_PTR, 1);
68
69         wait.tv_sec = 0;
70         wait.tv_nsec = 1000000;
71
72         PMD_DRV_LOG(DEBUG, "Polling for update ack...");
73
74         /* Poll update field, waiting for NFP to ack the config */
75         for (cnt = 0; ; cnt++) {
76                 new = nn_cfg_readl(hw, NFP_NET_CFG_UPDATE);
77                 if (new == 0)
78                         break;
79                 if (new & NFP_NET_CFG_UPDATE_ERR) {
80                         PMD_INIT_LOG(ERR, "Reconfig error: 0x%08x", new);
81                         return -1;
82                 }
83                 if (cnt >= NFP_NET_POLL_TIMEOUT) {
84                         PMD_INIT_LOG(ERR, "Reconfig timeout for 0x%08x after"
85                                           " %dms", update, cnt);
86                         rte_panic("Exiting\n");
87                 }
88                 nanosleep(&wait, 0); /* waiting for a 1ms */
89         }
90         PMD_DRV_LOG(DEBUG, "Ack DONE");
91         return 0;
92 }
93
94 /*
95  * Reconfigure the NIC
96  * @nn:    device to reconfigure
97  * @ctrl:    The value for the ctrl field in the BAR config
98  * @update:  The value for the update field in the BAR config
99  *
100  * Write the update word to the BAR and ping the reconfig queue. Then poll
101  * until the firmware has acknowledged the update by zeroing the update word.
102  */
103 int
104 nfp_net_reconfig(struct nfp_net_hw *hw, uint32_t ctrl, uint32_t update)
105 {
106         uint32_t err;
107
108         PMD_DRV_LOG(DEBUG, "nfp_net_reconfig: ctrl=%08x update=%08x",
109                     ctrl, update);
110
111         rte_spinlock_lock(&hw->reconfig_lock);
112
113         nn_cfg_writel(hw, NFP_NET_CFG_CTRL, ctrl);
114         nn_cfg_writel(hw, NFP_NET_CFG_UPDATE, update);
115
116         rte_wmb();
117
118         err = __nfp_net_reconfig(hw, update);
119
120         rte_spinlock_unlock(&hw->reconfig_lock);
121
122         if (!err)
123                 return 0;
124
125         /*
126          * Reconfig errors imply situations where they can be handled.
127          * Otherwise, rte_panic is called inside __nfp_net_reconfig
128          */
129         PMD_INIT_LOG(ERR, "Error nfp_net reconfig for ctrl: %x update: %x",
130                      ctrl, update);
131         return -EIO;
132 }
133
134 /*
135  * Configure an Ethernet device. This function must be invoked first
136  * before any other function in the Ethernet API. This function can
137  * also be re-invoked when a device is in the stopped state.
138  */
139 int
140 nfp_net_configure(struct rte_eth_dev *dev)
141 {
142         struct rte_eth_conf *dev_conf;
143         struct rte_eth_rxmode *rxmode;
144         struct rte_eth_txmode *txmode;
145         struct nfp_net_hw *hw;
146
147         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
148
149         /*
150          * A DPDK app sends info about how many queues to use and how
151          * those queues need to be configured. This is used by the
152          * DPDK core and it makes sure no more queues than those
153          * advertised by the driver are requested. This function is
154          * called after that internal process
155          */
156
157         PMD_INIT_LOG(DEBUG, "Configure");
158
159         dev_conf = &dev->data->dev_conf;
160         rxmode = &dev_conf->rxmode;
161         txmode = &dev_conf->txmode;
162
163         if (rxmode->mq_mode & RTE_ETH_MQ_RX_RSS_FLAG)
164                 rxmode->offloads |= RTE_ETH_RX_OFFLOAD_RSS_HASH;
165
166         /* Checking TX mode */
167         if (txmode->mq_mode) {
168                 PMD_INIT_LOG(INFO, "TX mq_mode DCB and VMDq not supported");
169                 return -EINVAL;
170         }
171
172         /* Checking RX mode */
173         if (rxmode->mq_mode & RTE_ETH_MQ_RX_RSS &&
174             !(hw->cap & NFP_NET_CFG_CTRL_RSS)) {
175                 PMD_INIT_LOG(INFO, "RSS not supported");
176                 return -EINVAL;
177         }
178
179         return 0;
180 }
181
182 void
183 nfp_net_enable_queues(struct rte_eth_dev *dev)
184 {
185         struct nfp_net_hw *hw;
186         uint64_t enabled_queues = 0;
187         int i;
188
189         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
190
191         /* Enabling the required TX queues in the device */
192         for (i = 0; i < dev->data->nb_tx_queues; i++)
193                 enabled_queues |= (1 << i);
194
195         nn_cfg_writeq(hw, NFP_NET_CFG_TXRS_ENABLE, enabled_queues);
196
197         enabled_queues = 0;
198
199         /* Enabling the required RX queues in the device */
200         for (i = 0; i < dev->data->nb_rx_queues; i++)
201                 enabled_queues |= (1 << i);
202
203         nn_cfg_writeq(hw, NFP_NET_CFG_RXRS_ENABLE, enabled_queues);
204 }
205
206 void
207 nfp_net_disable_queues(struct rte_eth_dev *dev)
208 {
209         struct nfp_net_hw *hw;
210         uint32_t new_ctrl, update = 0;
211
212         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
213
214         nn_cfg_writeq(hw, NFP_NET_CFG_TXRS_ENABLE, 0);
215         nn_cfg_writeq(hw, NFP_NET_CFG_RXRS_ENABLE, 0);
216
217         new_ctrl = hw->ctrl & ~NFP_NET_CFG_CTRL_ENABLE;
218         update = NFP_NET_CFG_UPDATE_GEN | NFP_NET_CFG_UPDATE_RING |
219                  NFP_NET_CFG_UPDATE_MSIX;
220
221         if (hw->cap & NFP_NET_CFG_CTRL_RINGCFG)
222                 new_ctrl &= ~NFP_NET_CFG_CTRL_RINGCFG;
223
224         /* If an error when reconfig we avoid to change hw state */
225         if (nfp_net_reconfig(hw, new_ctrl, update) < 0)
226                 return;
227
228         hw->ctrl = new_ctrl;
229 }
230
231 void
232 nfp_net_params_setup(struct nfp_net_hw *hw)
233 {
234         nn_cfg_writel(hw, NFP_NET_CFG_MTU, hw->mtu);
235         nn_cfg_writel(hw, NFP_NET_CFG_FLBUFSZ, hw->flbufsz);
236 }
237
238 void
239 nfp_net_cfg_queue_setup(struct nfp_net_hw *hw)
240 {
241         hw->qcp_cfg = hw->tx_bar + NFP_QCP_QUEUE_ADDR_SZ;
242 }
243
244 #define ETH_ADDR_LEN    6
245
246 void
247 nfp_eth_copy_mac(uint8_t *dst, const uint8_t *src)
248 {
249         int i;
250
251         for (i = 0; i < ETH_ADDR_LEN; i++)
252                 dst[i] = src[i];
253 }
254
255 void
256 nfp_net_write_mac(struct nfp_net_hw *hw, uint8_t *mac)
257 {
258         uint32_t mac0 = *(uint32_t *)mac;
259         uint16_t mac1;
260
261         nn_writel(rte_cpu_to_be_32(mac0), hw->ctrl_bar + NFP_NET_CFG_MACADDR);
262
263         mac += 4;
264         mac1 = *(uint16_t *)mac;
265         nn_writew(rte_cpu_to_be_16(mac1),
266                   hw->ctrl_bar + NFP_NET_CFG_MACADDR + 6);
267 }
268
269 int
270 nfp_set_mac_addr(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr)
271 {
272         struct nfp_net_hw *hw;
273         uint32_t update, ctrl;
274
275         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
276         if ((hw->ctrl & NFP_NET_CFG_CTRL_ENABLE) &&
277             !(hw->cap & NFP_NET_CFG_CTRL_LIVE_ADDR)) {
278                 PMD_INIT_LOG(INFO, "MAC address unable to change when"
279                                   " port enabled");
280                 return -EBUSY;
281         }
282
283         /* Writing new MAC to the specific port BAR address */
284         nfp_net_write_mac(hw, (uint8_t *)mac_addr);
285
286         /* Signal the NIC about the change */
287         update = NFP_NET_CFG_UPDATE_MACADDR;
288         ctrl = hw->ctrl;
289         if ((hw->ctrl & NFP_NET_CFG_CTRL_ENABLE) &&
290             (hw->cap & NFP_NET_CFG_CTRL_LIVE_ADDR))
291                 ctrl |= NFP_NET_CFG_CTRL_LIVE_ADDR;
292         if (nfp_net_reconfig(hw, ctrl, update) < 0) {
293                 PMD_INIT_LOG(INFO, "MAC address update failed");
294                 return -EIO;
295         }
296         return 0;
297 }
298
299 int
300 nfp_configure_rx_interrupt(struct rte_eth_dev *dev,
301                            struct rte_intr_handle *intr_handle)
302 {
303         struct nfp_net_hw *hw;
304         int i;
305
306         if (rte_intr_vec_list_alloc(intr_handle, "intr_vec",
307                                     dev->data->nb_rx_queues)) {
308                 PMD_INIT_LOG(ERR, "Failed to allocate %d rx_queues"
309                              " intr_vec", dev->data->nb_rx_queues);
310                 return -ENOMEM;
311         }
312
313         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
314
315         if (rte_intr_type_get(intr_handle) == RTE_INTR_HANDLE_UIO) {
316                 PMD_INIT_LOG(INFO, "VF: enabling RX interrupt with UIO");
317                 /* UIO just supports one queue and no LSC*/
318                 nn_cfg_writeb(hw, NFP_NET_CFG_RXR_VEC(0), 0);
319                 if (rte_intr_vec_list_index_set(intr_handle, 0, 0))
320                         return -1;
321         } else {
322                 PMD_INIT_LOG(INFO, "VF: enabling RX interrupt with VFIO");
323                 for (i = 0; i < dev->data->nb_rx_queues; i++) {
324                         /*
325                          * The first msix vector is reserved for non
326                          * efd interrupts
327                         */
328                         nn_cfg_writeb(hw, NFP_NET_CFG_RXR_VEC(i), i + 1);
329                         if (rte_intr_vec_list_index_set(intr_handle, i,
330                                                                i + 1))
331                                 return -1;
332                         PMD_INIT_LOG(DEBUG, "intr_vec[%d]= %d", i,
333                                 rte_intr_vec_list_index_get(intr_handle,
334                                                                    i));
335                 }
336         }
337
338         /* Avoiding TX interrupts */
339         hw->ctrl |= NFP_NET_CFG_CTRL_MSIX_TX_OFF;
340         return 0;
341 }
342
343 uint32_t
344 nfp_check_offloads(struct rte_eth_dev *dev)
345 {
346         struct nfp_net_hw *hw;
347         struct rte_eth_conf *dev_conf;
348         struct rte_eth_rxmode *rxmode;
349         struct rte_eth_txmode *txmode;
350         uint32_t ctrl = 0;
351
352         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
353
354         dev_conf = &dev->data->dev_conf;
355         rxmode = &dev_conf->rxmode;
356         txmode = &dev_conf->txmode;
357
358         if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_IPV4_CKSUM) {
359                 if (hw->cap & NFP_NET_CFG_CTRL_RXCSUM)
360                         ctrl |= NFP_NET_CFG_CTRL_RXCSUM;
361         }
362
363         if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) {
364                 if (hw->cap & NFP_NET_CFG_CTRL_RXVLAN)
365                         ctrl |= NFP_NET_CFG_CTRL_RXVLAN;
366         }
367
368         hw->mtu = dev->data->mtu;
369
370         if (txmode->offloads & RTE_ETH_TX_OFFLOAD_VLAN_INSERT)
371                 ctrl |= NFP_NET_CFG_CTRL_TXVLAN;
372
373         /* L2 broadcast */
374         if (hw->cap & NFP_NET_CFG_CTRL_L2BC)
375                 ctrl |= NFP_NET_CFG_CTRL_L2BC;
376
377         /* L2 multicast */
378         if (hw->cap & NFP_NET_CFG_CTRL_L2MC)
379                 ctrl |= NFP_NET_CFG_CTRL_L2MC;
380
381         /* TX checksum offload */
382         if (txmode->offloads & RTE_ETH_TX_OFFLOAD_IPV4_CKSUM ||
383             txmode->offloads & RTE_ETH_TX_OFFLOAD_UDP_CKSUM ||
384             txmode->offloads & RTE_ETH_TX_OFFLOAD_TCP_CKSUM)
385                 ctrl |= NFP_NET_CFG_CTRL_TXCSUM;
386
387         /* LSO offload */
388         if (txmode->offloads & RTE_ETH_TX_OFFLOAD_TCP_TSO) {
389                 if (hw->cap & NFP_NET_CFG_CTRL_LSO)
390                         ctrl |= NFP_NET_CFG_CTRL_LSO;
391                 else
392                         ctrl |= NFP_NET_CFG_CTRL_LSO2;
393         }
394
395         /* RX gather */
396         if (txmode->offloads & RTE_ETH_TX_OFFLOAD_MULTI_SEGS)
397                 ctrl |= NFP_NET_CFG_CTRL_GATHER;
398
399         return ctrl;
400 }
401
402 int
403 nfp_net_promisc_enable(struct rte_eth_dev *dev)
404 {
405         uint32_t new_ctrl, update = 0;
406         struct nfp_net_hw *hw;
407         int ret;
408
409         PMD_DRV_LOG(DEBUG, "Promiscuous mode enable");
410
411         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
412
413         if (!(hw->cap & NFP_NET_CFG_CTRL_PROMISC)) {
414                 PMD_INIT_LOG(INFO, "Promiscuous mode not supported");
415                 return -ENOTSUP;
416         }
417
418         if (hw->ctrl & NFP_NET_CFG_CTRL_PROMISC) {
419                 PMD_DRV_LOG(INFO, "Promiscuous mode already enabled");
420                 return 0;
421         }
422
423         new_ctrl = hw->ctrl | NFP_NET_CFG_CTRL_PROMISC;
424         update = NFP_NET_CFG_UPDATE_GEN;
425
426         /*
427          * DPDK sets promiscuous mode on just after this call assuming
428          * it can not fail ...
429          */
430         ret = nfp_net_reconfig(hw, new_ctrl, update);
431         if (ret < 0)
432                 return ret;
433
434         hw->ctrl = new_ctrl;
435
436         return 0;
437 }
438
439 int
440 nfp_net_promisc_disable(struct rte_eth_dev *dev)
441 {
442         uint32_t new_ctrl, update = 0;
443         struct nfp_net_hw *hw;
444         int ret;
445
446         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
447
448         if ((hw->ctrl & NFP_NET_CFG_CTRL_PROMISC) == 0) {
449                 PMD_DRV_LOG(INFO, "Promiscuous mode already disabled");
450                 return 0;
451         }
452
453         new_ctrl = hw->ctrl & ~NFP_NET_CFG_CTRL_PROMISC;
454         update = NFP_NET_CFG_UPDATE_GEN;
455
456         /*
457          * DPDK sets promiscuous mode off just before this call
458          * assuming it can not fail ...
459          */
460         ret = nfp_net_reconfig(hw, new_ctrl, update);
461         if (ret < 0)
462                 return ret;
463
464         hw->ctrl = new_ctrl;
465
466         return 0;
467 }
468
469 /*
470  * return 0 means link status changed, -1 means not changed
471  *
472  * Wait to complete is needed as it can take up to 9 seconds to get the Link
473  * status.
474  */
475 int
476 nfp_net_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complete)
477 {
478         struct nfp_net_hw *hw;
479         struct rte_eth_link link;
480         uint32_t nn_link_status;
481         int ret;
482
483         static const uint32_t ls_to_ethtool[] = {
484                 [NFP_NET_CFG_STS_LINK_RATE_UNSUPPORTED] = RTE_ETH_SPEED_NUM_NONE,
485                 [NFP_NET_CFG_STS_LINK_RATE_UNKNOWN]     = RTE_ETH_SPEED_NUM_NONE,
486                 [NFP_NET_CFG_STS_LINK_RATE_1G]          = RTE_ETH_SPEED_NUM_1G,
487                 [NFP_NET_CFG_STS_LINK_RATE_10G]         = RTE_ETH_SPEED_NUM_10G,
488                 [NFP_NET_CFG_STS_LINK_RATE_25G]         = RTE_ETH_SPEED_NUM_25G,
489                 [NFP_NET_CFG_STS_LINK_RATE_40G]         = RTE_ETH_SPEED_NUM_40G,
490                 [NFP_NET_CFG_STS_LINK_RATE_50G]         = RTE_ETH_SPEED_NUM_50G,
491                 [NFP_NET_CFG_STS_LINK_RATE_100G]        = RTE_ETH_SPEED_NUM_100G,
492         };
493
494         PMD_DRV_LOG(DEBUG, "Link update");
495
496         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
497
498         nn_link_status = nn_cfg_readl(hw, NFP_NET_CFG_STS);
499
500         memset(&link, 0, sizeof(struct rte_eth_link));
501
502         if (nn_link_status & NFP_NET_CFG_STS_LINK)
503                 link.link_status = RTE_ETH_LINK_UP;
504
505         link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
506
507         nn_link_status = (nn_link_status >> NFP_NET_CFG_STS_LINK_RATE_SHIFT) &
508                          NFP_NET_CFG_STS_LINK_RATE_MASK;
509
510         if (nn_link_status >= RTE_DIM(ls_to_ethtool))
511                 link.link_speed = RTE_ETH_SPEED_NUM_NONE;
512         else
513                 link.link_speed = ls_to_ethtool[nn_link_status];
514
515         ret = rte_eth_linkstatus_set(dev, &link);
516         if (ret == 0) {
517                 if (link.link_status)
518                         PMD_DRV_LOG(INFO, "NIC Link is Up");
519                 else
520                         PMD_DRV_LOG(INFO, "NIC Link is Down");
521         }
522         return ret;
523 }
524
525 int
526 nfp_net_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
527 {
528         int i;
529         struct nfp_net_hw *hw;
530         struct rte_eth_stats nfp_dev_stats;
531
532         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
533
534         /* RTE_ETHDEV_QUEUE_STAT_CNTRS default value is 16 */
535
536         memset(&nfp_dev_stats, 0, sizeof(nfp_dev_stats));
537
538         /* reading per RX ring stats */
539         for (i = 0; i < dev->data->nb_rx_queues; i++) {
540                 if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)
541                         break;
542
543                 nfp_dev_stats.q_ipackets[i] =
544                         nn_cfg_readq(hw, NFP_NET_CFG_RXR_STATS(i));
545
546                 nfp_dev_stats.q_ipackets[i] -=
547                         hw->eth_stats_base.q_ipackets[i];
548
549                 nfp_dev_stats.q_ibytes[i] =
550                         nn_cfg_readq(hw, NFP_NET_CFG_RXR_STATS(i) + 0x8);
551
552                 nfp_dev_stats.q_ibytes[i] -=
553                         hw->eth_stats_base.q_ibytes[i];
554         }
555
556         /* reading per TX ring stats */
557         for (i = 0; i < dev->data->nb_tx_queues; i++) {
558                 if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)
559                         break;
560
561                 nfp_dev_stats.q_opackets[i] =
562                         nn_cfg_readq(hw, NFP_NET_CFG_TXR_STATS(i));
563
564                 nfp_dev_stats.q_opackets[i] -=
565                         hw->eth_stats_base.q_opackets[i];
566
567                 nfp_dev_stats.q_obytes[i] =
568                         nn_cfg_readq(hw, NFP_NET_CFG_TXR_STATS(i) + 0x8);
569
570                 nfp_dev_stats.q_obytes[i] -=
571                         hw->eth_stats_base.q_obytes[i];
572         }
573
574         nfp_dev_stats.ipackets =
575                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_FRAMES);
576
577         nfp_dev_stats.ipackets -= hw->eth_stats_base.ipackets;
578
579         nfp_dev_stats.ibytes =
580                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_OCTETS);
581
582         nfp_dev_stats.ibytes -= hw->eth_stats_base.ibytes;
583
584         nfp_dev_stats.opackets =
585                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_TX_FRAMES);
586
587         nfp_dev_stats.opackets -= hw->eth_stats_base.opackets;
588
589         nfp_dev_stats.obytes =
590                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_TX_OCTETS);
591
592         nfp_dev_stats.obytes -= hw->eth_stats_base.obytes;
593
594         /* reading general device stats */
595         nfp_dev_stats.ierrors =
596                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_ERRORS);
597
598         nfp_dev_stats.ierrors -= hw->eth_stats_base.ierrors;
599
600         nfp_dev_stats.oerrors =
601                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_TX_ERRORS);
602
603         nfp_dev_stats.oerrors -= hw->eth_stats_base.oerrors;
604
605         /* RX ring mbuf allocation failures */
606         nfp_dev_stats.rx_nombuf = dev->data->rx_mbuf_alloc_failed;
607
608         nfp_dev_stats.imissed =
609                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_DISCARDS);
610
611         nfp_dev_stats.imissed -= hw->eth_stats_base.imissed;
612
613         if (stats) {
614                 memcpy(stats, &nfp_dev_stats, sizeof(*stats));
615                 return 0;
616         }
617         return -EINVAL;
618 }
619
620 int
621 nfp_net_stats_reset(struct rte_eth_dev *dev)
622 {
623         int i;
624         struct nfp_net_hw *hw;
625
626         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
627
628         /*
629          * hw->eth_stats_base records the per counter starting point.
630          * Lets update it now
631          */
632
633         /* reading per RX ring stats */
634         for (i = 0; i < dev->data->nb_rx_queues; i++) {
635                 if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)
636                         break;
637
638                 hw->eth_stats_base.q_ipackets[i] =
639                         nn_cfg_readq(hw, NFP_NET_CFG_RXR_STATS(i));
640
641                 hw->eth_stats_base.q_ibytes[i] =
642                         nn_cfg_readq(hw, NFP_NET_CFG_RXR_STATS(i) + 0x8);
643         }
644
645         /* reading per TX ring stats */
646         for (i = 0; i < dev->data->nb_tx_queues; i++) {
647                 if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)
648                         break;
649
650                 hw->eth_stats_base.q_opackets[i] =
651                         nn_cfg_readq(hw, NFP_NET_CFG_TXR_STATS(i));
652
653                 hw->eth_stats_base.q_obytes[i] =
654                         nn_cfg_readq(hw, NFP_NET_CFG_TXR_STATS(i) + 0x8);
655         }
656
657         hw->eth_stats_base.ipackets =
658                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_FRAMES);
659
660         hw->eth_stats_base.ibytes =
661                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_OCTETS);
662
663         hw->eth_stats_base.opackets =
664                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_TX_FRAMES);
665
666         hw->eth_stats_base.obytes =
667                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_TX_OCTETS);
668
669         /* reading general device stats */
670         hw->eth_stats_base.ierrors =
671                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_ERRORS);
672
673         hw->eth_stats_base.oerrors =
674                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_TX_ERRORS);
675
676         /* RX ring mbuf allocation failures */
677         dev->data->rx_mbuf_alloc_failed = 0;
678
679         hw->eth_stats_base.imissed =
680                 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_DISCARDS);
681
682         return 0;
683 }
684
685 int
686 nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
687 {
688         struct nfp_net_hw *hw;
689
690         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
691
692         dev_info->max_rx_queues = (uint16_t)hw->max_rx_queues;
693         dev_info->max_tx_queues = (uint16_t)hw->max_tx_queues;
694         dev_info->min_rx_bufsize = RTE_ETHER_MIN_MTU;
695         dev_info->max_rx_pktlen = hw->max_mtu;
696         /* Next should change when PF support is implemented */
697         dev_info->max_mac_addrs = 1;
698
699         if (hw->cap & NFP_NET_CFG_CTRL_RXVLAN)
700                 dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
701
702         if (hw->cap & NFP_NET_CFG_CTRL_RXCSUM)
703                 dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_IPV4_CKSUM |
704                                              RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
705                                              RTE_ETH_RX_OFFLOAD_TCP_CKSUM;
706
707         if (hw->cap & NFP_NET_CFG_CTRL_TXVLAN)
708                 dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_VLAN_INSERT;
709
710         if (hw->cap & NFP_NET_CFG_CTRL_TXCSUM)
711                 dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_IPV4_CKSUM |
712                                              RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
713                                              RTE_ETH_TX_OFFLOAD_TCP_CKSUM;
714
715         if (hw->cap & NFP_NET_CFG_CTRL_LSO_ANY)
716                 dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_TCP_TSO;
717
718         if (hw->cap & NFP_NET_CFG_CTRL_GATHER)
719                 dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
720
721         dev_info->default_rxconf = (struct rte_eth_rxconf) {
722                 .rx_thresh = {
723                         .pthresh = DEFAULT_RX_PTHRESH,
724                         .hthresh = DEFAULT_RX_HTHRESH,
725                         .wthresh = DEFAULT_RX_WTHRESH,
726                 },
727                 .rx_free_thresh = DEFAULT_RX_FREE_THRESH,
728                 .rx_drop_en = 0,
729         };
730
731         dev_info->default_txconf = (struct rte_eth_txconf) {
732                 .tx_thresh = {
733                         .pthresh = DEFAULT_TX_PTHRESH,
734                         .hthresh = DEFAULT_TX_HTHRESH,
735                         .wthresh = DEFAULT_TX_WTHRESH,
736                 },
737                 .tx_free_thresh = DEFAULT_TX_FREE_THRESH,
738                 .tx_rs_thresh = DEFAULT_TX_RSBIT_THRESH,
739         };
740
741         dev_info->rx_desc_lim = (struct rte_eth_desc_lim) {
742                 .nb_max = NFP_NET_MAX_RX_DESC,
743                 .nb_min = NFP_NET_MIN_RX_DESC,
744                 .nb_align = NFP_ALIGN_RING_DESC,
745         };
746
747         dev_info->tx_desc_lim = (struct rte_eth_desc_lim) {
748                 .nb_max = NFP_NET_MAX_TX_DESC,
749                 .nb_min = NFP_NET_MIN_TX_DESC,
750                 .nb_align = NFP_ALIGN_RING_DESC,
751                 .nb_seg_max = NFP_TX_MAX_SEG,
752                 .nb_mtu_seg_max = NFP_TX_MAX_MTU_SEG,
753         };
754
755         if (hw->cap & NFP_NET_CFG_CTRL_RSS) {
756                 dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_RSS_HASH;
757
758                 dev_info->flow_type_rss_offloads = RTE_ETH_RSS_IPV4 |
759                                                    RTE_ETH_RSS_NONFRAG_IPV4_TCP |
760                                                    RTE_ETH_RSS_NONFRAG_IPV4_UDP |
761                                                    RTE_ETH_RSS_IPV6 |
762                                                    RTE_ETH_RSS_NONFRAG_IPV6_TCP |
763                                                    RTE_ETH_RSS_NONFRAG_IPV6_UDP;
764
765                 dev_info->reta_size = NFP_NET_CFG_RSS_ITBL_SZ;
766                 dev_info->hash_key_size = NFP_NET_CFG_RSS_KEY_SZ;
767         }
768
769         dev_info->speed_capa = RTE_ETH_LINK_SPEED_1G | RTE_ETH_LINK_SPEED_10G |
770                                RTE_ETH_LINK_SPEED_25G | RTE_ETH_LINK_SPEED_40G |
771                                RTE_ETH_LINK_SPEED_50G | RTE_ETH_LINK_SPEED_100G;
772
773         return 0;
774 }
775
776 const uint32_t *
777 nfp_net_supported_ptypes_get(struct rte_eth_dev *dev)
778 {
779         static const uint32_t ptypes[] = {
780                 /* refers to nfp_net_set_hash() */
781                 RTE_PTYPE_INNER_L3_IPV4,
782                 RTE_PTYPE_INNER_L3_IPV6,
783                 RTE_PTYPE_INNER_L3_IPV6_EXT,
784                 RTE_PTYPE_INNER_L4_MASK,
785                 RTE_PTYPE_UNKNOWN
786         };
787
788         if (dev->rx_pkt_burst == nfp_net_recv_pkts)
789                 return ptypes;
790         return NULL;
791 }
792
793 int
794 nfp_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
795 {
796         struct rte_pci_device *pci_dev;
797         struct nfp_net_hw *hw;
798         int base = 0;
799
800         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
801         pci_dev = RTE_ETH_DEV_TO_PCI(dev);
802
803         if (rte_intr_type_get(pci_dev->intr_handle) !=
804                                                         RTE_INTR_HANDLE_UIO)
805                 base = 1;
806
807         /* Make sure all updates are written before un-masking */
808         rte_wmb();
809         nn_cfg_writeb(hw, NFP_NET_CFG_ICR(base + queue_id),
810                       NFP_NET_CFG_ICR_UNMASKED);
811         return 0;
812 }
813
814 int
815 nfp_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
816 {
817         struct rte_pci_device *pci_dev;
818         struct nfp_net_hw *hw;
819         int base = 0;
820
821         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
822         pci_dev = RTE_ETH_DEV_TO_PCI(dev);
823
824         if (rte_intr_type_get(pci_dev->intr_handle) !=
825                                                         RTE_INTR_HANDLE_UIO)
826                 base = 1;
827
828         /* Make sure all updates are written before un-masking */
829         rte_wmb();
830         nn_cfg_writeb(hw, NFP_NET_CFG_ICR(base + queue_id), 0x1);
831         return 0;
832 }
833
834 static void
835 nfp_net_dev_link_status_print(struct rte_eth_dev *dev)
836 {
837         struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
838         struct rte_eth_link link;
839
840         rte_eth_linkstatus_get(dev, &link);
841         if (link.link_status)
842                 PMD_DRV_LOG(INFO, "Port %d: Link Up - speed %u Mbps - %s",
843                             dev->data->port_id, link.link_speed,
844                             link.link_duplex == RTE_ETH_LINK_FULL_DUPLEX
845                             ? "full-duplex" : "half-duplex");
846         else
847                 PMD_DRV_LOG(INFO, " Port %d: Link Down",
848                             dev->data->port_id);
849
850         PMD_DRV_LOG(INFO, "PCI Address: " PCI_PRI_FMT,
851                     pci_dev->addr.domain, pci_dev->addr.bus,
852                     pci_dev->addr.devid, pci_dev->addr.function);
853 }
854
855 /* Interrupt configuration and handling */
856
857 /*
858  * nfp_net_irq_unmask - Unmask an interrupt
859  *
860  * If MSI-X auto-masking is enabled clear the mask bit, otherwise
861  * clear the ICR for the entry.
862  */
863 static void
864 nfp_net_irq_unmask(struct rte_eth_dev *dev)
865 {
866         struct nfp_net_hw *hw;
867         struct rte_pci_device *pci_dev;
868
869         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
870         pci_dev = RTE_ETH_DEV_TO_PCI(dev);
871
872         if (hw->ctrl & NFP_NET_CFG_CTRL_MSIXAUTO) {
873                 /* If MSI-X auto-masking is used, clear the entry */
874                 rte_wmb();
875                 rte_intr_ack(pci_dev->intr_handle);
876         } else {
877                 /* Make sure all updates are written before un-masking */
878                 rte_wmb();
879                 nn_cfg_writeb(hw, NFP_NET_CFG_ICR(NFP_NET_IRQ_LSC_IDX),
880                               NFP_NET_CFG_ICR_UNMASKED);
881         }
882 }
883
884 /*
885  * Interrupt handler which shall be registered for alarm callback for delayed
886  * handling specific interrupt to wait for the stable nic state. As the NIC
887  * interrupt state is not stable for nfp after link is just down, it needs
888  * to wait 4 seconds to get the stable status.
889  *
890  * @param handle   Pointer to interrupt handle.
891  * @param param    The address of parameter (struct rte_eth_dev *)
892  *
893  * @return  void
894  */
895 void
896 nfp_net_dev_interrupt_delayed_handler(void *param)
897 {
898         struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
899
900         nfp_net_link_update(dev, 0);
901         rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL);
902
903         nfp_net_dev_link_status_print(dev);
904
905         /* Unmasking */
906         nfp_net_irq_unmask(dev);
907 }
908
909 void
910 nfp_net_dev_interrupt_handler(void *param)
911 {
912         int64_t timeout;
913         struct rte_eth_link link;
914         struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
915
916         PMD_DRV_LOG(DEBUG, "We got a LSC interrupt!!!");
917
918         rte_eth_linkstatus_get(dev, &link);
919
920         nfp_net_link_update(dev, 0);
921
922         /* likely to up */
923         if (!link.link_status) {
924                 /* handle it 1 sec later, wait it being stable */
925                 timeout = NFP_NET_LINK_UP_CHECK_TIMEOUT;
926                 /* likely to down */
927         } else {
928                 /* handle it 4 sec later, wait it being stable */
929                 timeout = NFP_NET_LINK_DOWN_CHECK_TIMEOUT;
930         }
931
932         if (rte_eal_alarm_set(timeout * 1000,
933                               nfp_net_dev_interrupt_delayed_handler,
934                               (void *)dev) < 0) {
935                 PMD_INIT_LOG(ERR, "Error setting alarm");
936                 /* Unmasking */
937                 nfp_net_irq_unmask(dev);
938         }
939 }
940
941 int
942 nfp_net_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
943 {
944         struct nfp_net_hw *hw;
945
946         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
947
948         /* mtu setting is forbidden if port is started */
949         if (dev->data->dev_started) {
950                 PMD_DRV_LOG(ERR, "port %d must be stopped before configuration",
951                             dev->data->port_id);
952                 return -EBUSY;
953         }
954
955         /* writing to configuration space */
956         nn_cfg_writel(hw, NFP_NET_CFG_MTU, mtu);
957
958         hw->mtu = mtu;
959
960         return 0;
961 }
962
963 int
964 nfp_net_vlan_offload_set(struct rte_eth_dev *dev, int mask)
965 {
966         uint32_t new_ctrl, update;
967         struct nfp_net_hw *hw;
968         int ret;
969
970         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
971         new_ctrl = 0;
972
973         /* Enable vlan strip if it is not configured yet */
974         if ((mask & RTE_ETH_VLAN_STRIP_OFFLOAD) &&
975             !(hw->ctrl & NFP_NET_CFG_CTRL_RXVLAN))
976                 new_ctrl = hw->ctrl | NFP_NET_CFG_CTRL_RXVLAN;
977
978         /* Disable vlan strip just if it is configured */
979         if (!(mask & RTE_ETH_VLAN_STRIP_OFFLOAD) &&
980             (hw->ctrl & NFP_NET_CFG_CTRL_RXVLAN))
981                 new_ctrl = hw->ctrl & ~NFP_NET_CFG_CTRL_RXVLAN;
982
983         if (new_ctrl == 0)
984                 return 0;
985
986         update = NFP_NET_CFG_UPDATE_GEN;
987
988         ret = nfp_net_reconfig(hw, new_ctrl, update);
989         if (!ret)
990                 hw->ctrl = new_ctrl;
991
992         return ret;
993 }
994
995 static int
996 nfp_net_rss_reta_write(struct rte_eth_dev *dev,
997                     struct rte_eth_rss_reta_entry64 *reta_conf,
998                     uint16_t reta_size)
999 {
1000         uint32_t reta, mask;
1001         int i, j;
1002         int idx, shift;
1003         struct nfp_net_hw *hw =
1004                 NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1005
1006         if (reta_size != NFP_NET_CFG_RSS_ITBL_SZ) {
1007                 PMD_DRV_LOG(ERR, "The size of hash lookup table configured "
1008                         "(%d) doesn't match the number hardware can supported "
1009                         "(%d)", reta_size, NFP_NET_CFG_RSS_ITBL_SZ);
1010                 return -EINVAL;
1011         }
1012
1013         /*
1014          * Update Redirection Table. There are 128 8bit-entries which can be
1015          * manage as 32 32bit-entries
1016          */
1017         for (i = 0; i < reta_size; i += 4) {
1018                 /* Handling 4 RSS entries per loop */
1019                 idx = i / RTE_ETH_RETA_GROUP_SIZE;
1020                 shift = i % RTE_ETH_RETA_GROUP_SIZE;
1021                 mask = (uint8_t)((reta_conf[idx].mask >> shift) & 0xF);
1022
1023                 if (!mask)
1024                         continue;
1025
1026                 reta = 0;
1027                 /* If all 4 entries were set, don't need read RETA register */
1028                 if (mask != 0xF)
1029                         reta = nn_cfg_readl(hw, NFP_NET_CFG_RSS_ITBL + i);
1030
1031                 for (j = 0; j < 4; j++) {
1032                         if (!(mask & (0x1 << j)))
1033                                 continue;
1034                         if (mask != 0xF)
1035                                 /* Clearing the entry bits */
1036                                 reta &= ~(0xFF << (8 * j));
1037                         reta |= reta_conf[idx].reta[shift + j] << (8 * j);
1038                 }
1039                 nn_cfg_writel(hw, NFP_NET_CFG_RSS_ITBL + (idx * 64) + shift,
1040                               reta);
1041         }
1042         return 0;
1043 }
1044
1045 /* Update Redirection Table(RETA) of Receive Side Scaling of Ethernet device */
1046 int
1047 nfp_net_reta_update(struct rte_eth_dev *dev,
1048                     struct rte_eth_rss_reta_entry64 *reta_conf,
1049                     uint16_t reta_size)
1050 {
1051         struct nfp_net_hw *hw =
1052                 NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1053         uint32_t update;
1054         int ret;
1055
1056         if (!(hw->ctrl & NFP_NET_CFG_CTRL_RSS))
1057                 return -EINVAL;
1058
1059         ret = nfp_net_rss_reta_write(dev, reta_conf, reta_size);
1060         if (ret != 0)
1061                 return ret;
1062
1063         update = NFP_NET_CFG_UPDATE_RSS;
1064
1065         if (nfp_net_reconfig(hw, hw->ctrl, update) < 0)
1066                 return -EIO;
1067
1068         return 0;
1069 }
1070
1071  /* Query Redirection Table(RETA) of Receive Side Scaling of Ethernet device. */
1072 int
1073 nfp_net_reta_query(struct rte_eth_dev *dev,
1074                    struct rte_eth_rss_reta_entry64 *reta_conf,
1075                    uint16_t reta_size)
1076 {
1077         uint8_t i, j, mask;
1078         int idx, shift;
1079         uint32_t reta;
1080         struct nfp_net_hw *hw;
1081
1082         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1083
1084         if (!(hw->ctrl & NFP_NET_CFG_CTRL_RSS))
1085                 return -EINVAL;
1086
1087         if (reta_size != NFP_NET_CFG_RSS_ITBL_SZ) {
1088                 PMD_DRV_LOG(ERR, "The size of hash lookup table configured "
1089                         "(%d) doesn't match the number hardware can supported "
1090                         "(%d)", reta_size, NFP_NET_CFG_RSS_ITBL_SZ);
1091                 return -EINVAL;
1092         }
1093
1094         /*
1095          * Reading Redirection Table. There are 128 8bit-entries which can be
1096          * manage as 32 32bit-entries
1097          */
1098         for (i = 0; i < reta_size; i += 4) {
1099                 /* Handling 4 RSS entries per loop */
1100                 idx = i / RTE_ETH_RETA_GROUP_SIZE;
1101                 shift = i % RTE_ETH_RETA_GROUP_SIZE;
1102                 mask = (uint8_t)((reta_conf[idx].mask >> shift) & 0xF);
1103
1104                 if (!mask)
1105                         continue;
1106
1107                 reta = nn_cfg_readl(hw, NFP_NET_CFG_RSS_ITBL + (idx * 64) +
1108                                     shift);
1109                 for (j = 0; j < 4; j++) {
1110                         if (!(mask & (0x1 << j)))
1111                                 continue;
1112                         reta_conf[idx].reta[shift + j] =
1113                                 (uint8_t)((reta >> (8 * j)) & 0xF);
1114                 }
1115         }
1116         return 0;
1117 }
1118
1119 static int
1120 nfp_net_rss_hash_write(struct rte_eth_dev *dev,
1121                         struct rte_eth_rss_conf *rss_conf)
1122 {
1123         struct nfp_net_hw *hw;
1124         uint64_t rss_hf;
1125         uint32_t cfg_rss_ctrl = 0;
1126         uint8_t key;
1127         int i;
1128
1129         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1130
1131         /* Writing the key byte a byte */
1132         for (i = 0; i < rss_conf->rss_key_len; i++) {
1133                 memcpy(&key, &rss_conf->rss_key[i], 1);
1134                 nn_cfg_writeb(hw, NFP_NET_CFG_RSS_KEY + i, key);
1135         }
1136
1137         rss_hf = rss_conf->rss_hf;
1138
1139         if (rss_hf & RTE_ETH_RSS_IPV4)
1140                 cfg_rss_ctrl |= NFP_NET_CFG_RSS_IPV4;
1141
1142         if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_TCP)
1143                 cfg_rss_ctrl |= NFP_NET_CFG_RSS_IPV4_TCP;
1144
1145         if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_UDP)
1146                 cfg_rss_ctrl |= NFP_NET_CFG_RSS_IPV4_UDP;
1147
1148         if (rss_hf & RTE_ETH_RSS_IPV6)
1149                 cfg_rss_ctrl |= NFP_NET_CFG_RSS_IPV6;
1150
1151         if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_TCP)
1152                 cfg_rss_ctrl |= NFP_NET_CFG_RSS_IPV6_TCP;
1153
1154         if (rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_UDP)
1155                 cfg_rss_ctrl |= NFP_NET_CFG_RSS_IPV6_UDP;
1156
1157         cfg_rss_ctrl |= NFP_NET_CFG_RSS_MASK;
1158         cfg_rss_ctrl |= NFP_NET_CFG_RSS_TOEPLITZ;
1159
1160         /* configuring where to apply the RSS hash */
1161         nn_cfg_writel(hw, NFP_NET_CFG_RSS_CTRL, cfg_rss_ctrl);
1162
1163         /* Writing the key size */
1164         nn_cfg_writeb(hw, NFP_NET_CFG_RSS_KEY_SZ, rss_conf->rss_key_len);
1165
1166         return 0;
1167 }
1168
1169 int
1170 nfp_net_rss_hash_update(struct rte_eth_dev *dev,
1171                         struct rte_eth_rss_conf *rss_conf)
1172 {
1173         uint32_t update;
1174         uint64_t rss_hf;
1175         struct nfp_net_hw *hw;
1176
1177         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1178
1179         rss_hf = rss_conf->rss_hf;
1180
1181         /* Checking if RSS is enabled */
1182         if (!(hw->ctrl & NFP_NET_CFG_CTRL_RSS)) {
1183                 if (rss_hf != 0) { /* Enable RSS? */
1184                         PMD_DRV_LOG(ERR, "RSS unsupported");
1185                         return -EINVAL;
1186                 }
1187                 return 0; /* Nothing to do */
1188         }
1189
1190         if (rss_conf->rss_key_len > NFP_NET_CFG_RSS_KEY_SZ) {
1191                 PMD_DRV_LOG(ERR, "hash key too long");
1192                 return -EINVAL;
1193         }
1194
1195         nfp_net_rss_hash_write(dev, rss_conf);
1196
1197         update = NFP_NET_CFG_UPDATE_RSS;
1198
1199         if (nfp_net_reconfig(hw, hw->ctrl, update) < 0)
1200                 return -EIO;
1201
1202         return 0;
1203 }
1204
1205 int
1206 nfp_net_rss_hash_conf_get(struct rte_eth_dev *dev,
1207                           struct rte_eth_rss_conf *rss_conf)
1208 {
1209         uint64_t rss_hf;
1210         uint32_t cfg_rss_ctrl;
1211         uint8_t key;
1212         int i;
1213         struct nfp_net_hw *hw;
1214
1215         hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1216
1217         if (!(hw->ctrl & NFP_NET_CFG_CTRL_RSS))
1218                 return -EINVAL;
1219
1220         rss_hf = rss_conf->rss_hf;
1221         cfg_rss_ctrl = nn_cfg_readl(hw, NFP_NET_CFG_RSS_CTRL);
1222
1223         if (cfg_rss_ctrl & NFP_NET_CFG_RSS_IPV4)
1224                 rss_hf |= RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_NONFRAG_IPV4_UDP;
1225
1226         if (cfg_rss_ctrl & NFP_NET_CFG_RSS_IPV4_TCP)
1227                 rss_hf |= RTE_ETH_RSS_NONFRAG_IPV4_TCP;
1228
1229         if (cfg_rss_ctrl & NFP_NET_CFG_RSS_IPV6_TCP)
1230                 rss_hf |= RTE_ETH_RSS_NONFRAG_IPV6_TCP;
1231
1232         if (cfg_rss_ctrl & NFP_NET_CFG_RSS_IPV4_UDP)
1233                 rss_hf |= RTE_ETH_RSS_NONFRAG_IPV4_UDP;
1234
1235         if (cfg_rss_ctrl & NFP_NET_CFG_RSS_IPV6_UDP)
1236                 rss_hf |= RTE_ETH_RSS_NONFRAG_IPV6_UDP;
1237
1238         if (cfg_rss_ctrl & NFP_NET_CFG_RSS_IPV6)
1239                 rss_hf |= RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_NONFRAG_IPV6_UDP;
1240
1241         /* Propagate current RSS hash functions to caller */
1242         rss_conf->rss_hf = rss_hf;
1243
1244         /* Reading the key size */
1245         rss_conf->rss_key_len = nn_cfg_readl(hw, NFP_NET_CFG_RSS_KEY_SZ);
1246
1247         /* Reading the key byte a byte */
1248         for (i = 0; i < rss_conf->rss_key_len; i++) {
1249                 key = nn_cfg_readb(hw, NFP_NET_CFG_RSS_KEY + i);
1250                 memcpy(&rss_conf->rss_key[i], &key, 1);
1251         }
1252
1253         return 0;
1254 }
1255
1256 int
1257 nfp_net_rss_config_default(struct rte_eth_dev *dev)
1258 {
1259         struct rte_eth_conf *dev_conf;
1260         struct rte_eth_rss_conf rss_conf;
1261         struct rte_eth_rss_reta_entry64 nfp_reta_conf[2];
1262         uint16_t rx_queues = dev->data->nb_rx_queues;
1263         uint16_t queue;
1264         int i, j, ret;
1265
1266         PMD_DRV_LOG(INFO, "setting default RSS conf for %u queues",
1267                 rx_queues);
1268
1269         nfp_reta_conf[0].mask = ~0x0;
1270         nfp_reta_conf[1].mask = ~0x0;
1271
1272         queue = 0;
1273         for (i = 0; i < 0x40; i += 8) {
1274                 for (j = i; j < (i + 8); j++) {
1275                         nfp_reta_conf[0].reta[j] = queue;
1276                         nfp_reta_conf[1].reta[j] = queue++;
1277                         queue %= rx_queues;
1278                 }
1279         }
1280         ret = nfp_net_rss_reta_write(dev, nfp_reta_conf, 0x80);
1281         if (ret != 0)
1282                 return ret;
1283
1284         dev_conf = &dev->data->dev_conf;
1285         if (!dev_conf) {
1286                 PMD_DRV_LOG(INFO, "wrong rss conf");
1287                 return -EINVAL;
1288         }
1289         rss_conf = dev_conf->rx_adv_conf.rss_conf;
1290
1291         ret = nfp_net_rss_hash_write(dev, &rss_conf);
1292
1293         return ret;
1294 }
1295
1296 RTE_LOG_REGISTER_SUFFIX(nfp_logtype_init, init, NOTICE);
1297 RTE_LOG_REGISTER_SUFFIX(nfp_logtype_driver, driver, NOTICE);
1298 /*
1299  * Local variables:
1300  * c-file-style: "Linux"
1301  * indent-tabs-mode: t
1302  * End:
1303  */