1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (c) 2014-2018 Netronome Systems, Inc.
5 * Small portions derived from code Copyright(c) 2010-2015 Intel Corporation.
9 * vim:shiftwidth=8:noexpandtab
11 * @file dpdk/pmd/nfp_common.c
13 * Netronome vNIC DPDK Poll-Mode Driver: Common files
16 #include <rte_byteorder.h>
17 #include <rte_common.h>
19 #include <rte_debug.h>
20 #include <ethdev_driver.h>
21 #include <ethdev_pci.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>
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"
40 #include "nfp_common.h"
44 #include "nfp_cpp_bridge.h"
46 #include <sys/types.h>
47 #include <sys/socket.h>
51 #include <sys/ioctl.h>
55 __nfp_net_reconfig(struct nfp_net_hw *hw, uint32_t update)
61 PMD_DRV_LOG(DEBUG, "Writing to the configuration queue (%p)...",
64 if (hw->qcp_cfg == NULL)
65 rte_panic("Bad configuration queue pointer\n");
67 nfp_qcp_ptr_add(hw->qcp_cfg, NFP_QCP_WRITE_PTR, 1);
70 wait.tv_nsec = 1000000;
72 PMD_DRV_LOG(DEBUG, "Polling for update ack...");
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);
79 if (new & NFP_NET_CFG_UPDATE_ERR) {
80 PMD_INIT_LOG(ERR, "Reconfig error: 0x%08x", new);
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");
88 nanosleep(&wait, 0); /* waiting for a 1ms */
90 PMD_DRV_LOG(DEBUG, "Ack DONE");
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
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.
104 nfp_net_reconfig(struct nfp_net_hw *hw, uint32_t ctrl, uint32_t update)
108 PMD_DRV_LOG(DEBUG, "nfp_net_reconfig: ctrl=%08x update=%08x",
111 rte_spinlock_lock(&hw->reconfig_lock);
113 nn_cfg_writel(hw, NFP_NET_CFG_CTRL, ctrl);
114 nn_cfg_writel(hw, NFP_NET_CFG_UPDATE, update);
118 err = __nfp_net_reconfig(hw, update);
120 rte_spinlock_unlock(&hw->reconfig_lock);
126 * Reconfig errors imply situations where they can be handled.
127 * Otherwise, rte_panic is called inside __nfp_net_reconfig
129 PMD_INIT_LOG(ERR, "Error nfp_net reconfig for ctrl: %x update: %x",
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.
140 nfp_net_configure(struct rte_eth_dev *dev)
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;
147 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
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
157 PMD_INIT_LOG(DEBUG, "Configure");
159 dev_conf = &dev->data->dev_conf;
160 rxmode = &dev_conf->rxmode;
161 txmode = &dev_conf->txmode;
163 if (rxmode->mq_mode & ETH_MQ_RX_RSS_FLAG)
164 rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH;
166 /* Checking TX mode */
167 if (txmode->mq_mode) {
168 PMD_INIT_LOG(INFO, "TX mq_mode DCB and VMDq not supported");
172 /* Checking RX mode */
173 if (rxmode->mq_mode & ETH_MQ_RX_RSS &&
174 !(hw->cap & NFP_NET_CFG_CTRL_RSS)) {
175 PMD_INIT_LOG(INFO, "RSS not supported");
183 nfp_net_enable_queues(struct rte_eth_dev *dev)
185 struct nfp_net_hw *hw;
186 uint64_t enabled_queues = 0;
189 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
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);
195 nn_cfg_writeq(hw, NFP_NET_CFG_TXRS_ENABLE, enabled_queues);
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);
203 nn_cfg_writeq(hw, NFP_NET_CFG_RXRS_ENABLE, enabled_queues);
207 nfp_net_disable_queues(struct rte_eth_dev *dev)
209 struct nfp_net_hw *hw;
210 uint32_t new_ctrl, update = 0;
212 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
214 nn_cfg_writeq(hw, NFP_NET_CFG_TXRS_ENABLE, 0);
215 nn_cfg_writeq(hw, NFP_NET_CFG_RXRS_ENABLE, 0);
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;
221 if (hw->cap & NFP_NET_CFG_CTRL_RINGCFG)
222 new_ctrl &= ~NFP_NET_CFG_CTRL_RINGCFG;
224 /* If an error when reconfig we avoid to change hw state */
225 if (nfp_net_reconfig(hw, new_ctrl, update) < 0)
232 nfp_net_params_setup(struct nfp_net_hw *hw)
234 nn_cfg_writel(hw, NFP_NET_CFG_MTU, hw->mtu);
235 nn_cfg_writel(hw, NFP_NET_CFG_FLBUFSZ, hw->flbufsz);
239 nfp_net_cfg_queue_setup(struct nfp_net_hw *hw)
241 hw->qcp_cfg = hw->tx_bar + NFP_QCP_QUEUE_ADDR_SZ;
244 #define ETH_ADDR_LEN 6
247 nfp_eth_copy_mac(uint8_t *dst, const uint8_t *src)
251 for (i = 0; i < ETH_ADDR_LEN; i++)
256 nfp_net_write_mac(struct nfp_net_hw *hw, uint8_t *mac)
258 uint32_t mac0 = *(uint32_t *)mac;
261 nn_writel(rte_cpu_to_be_32(mac0), hw->ctrl_bar + NFP_NET_CFG_MACADDR);
264 mac1 = *(uint16_t *)mac;
265 nn_writew(rte_cpu_to_be_16(mac1),
266 hw->ctrl_bar + NFP_NET_CFG_MACADDR + 6);
270 nfp_set_mac_addr(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr)
272 struct nfp_net_hw *hw;
273 uint32_t update, ctrl;
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"
283 if ((hw->ctrl & NFP_NET_CFG_CTRL_ENABLE) &&
284 !(hw->cap & NFP_NET_CFG_CTRL_LIVE_ADDR))
287 /* Writing new MAC to the specific port BAR address */
288 nfp_net_write_mac(hw, (uint8_t *)mac_addr);
290 /* Signal the NIC about the change */
291 update = NFP_NET_CFG_UPDATE_MACADDR;
293 if ((hw->ctrl & NFP_NET_CFG_CTRL_ENABLE) &&
294 (hw->cap & NFP_NET_CFG_CTRL_LIVE_ADDR))
295 ctrl |= NFP_NET_CFG_CTRL_LIVE_ADDR;
296 if (nfp_net_reconfig(hw, ctrl, update) < 0) {
297 PMD_INIT_LOG(INFO, "MAC address update failed");
304 nfp_configure_rx_interrupt(struct rte_eth_dev *dev,
305 struct rte_intr_handle *intr_handle)
307 struct nfp_net_hw *hw;
310 if (!intr_handle->intr_vec) {
311 intr_handle->intr_vec =
312 rte_zmalloc("intr_vec",
313 dev->data->nb_rx_queues * sizeof(int), 0);
314 if (!intr_handle->intr_vec) {
315 PMD_INIT_LOG(ERR, "Failed to allocate %d rx_queues"
316 " intr_vec", dev->data->nb_rx_queues);
321 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
323 if (intr_handle->type == RTE_INTR_HANDLE_UIO) {
324 PMD_INIT_LOG(INFO, "VF: enabling RX interrupt with UIO");
325 /* UIO just supports one queue and no LSC*/
326 nn_cfg_writeb(hw, NFP_NET_CFG_RXR_VEC(0), 0);
327 intr_handle->intr_vec[0] = 0;
329 PMD_INIT_LOG(INFO, "VF: enabling RX interrupt with VFIO");
330 for (i = 0; i < dev->data->nb_rx_queues; i++) {
332 * The first msix vector is reserved for non
335 nn_cfg_writeb(hw, NFP_NET_CFG_RXR_VEC(i), i + 1);
336 intr_handle->intr_vec[i] = i + 1;
337 PMD_INIT_LOG(DEBUG, "intr_vec[%d]= %d", i,
338 intr_handle->intr_vec[i]);
342 /* Avoiding TX interrupts */
343 hw->ctrl |= NFP_NET_CFG_CTRL_MSIX_TX_OFF;
348 nfp_check_offloads(struct rte_eth_dev *dev)
350 struct nfp_net_hw *hw;
351 struct rte_eth_conf *dev_conf;
352 struct rte_eth_rxmode *rxmode;
353 struct rte_eth_txmode *txmode;
356 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
358 dev_conf = &dev->data->dev_conf;
359 rxmode = &dev_conf->rxmode;
360 txmode = &dev_conf->txmode;
362 if (rxmode->offloads & DEV_RX_OFFLOAD_IPV4_CKSUM) {
363 if (hw->cap & NFP_NET_CFG_CTRL_RXCSUM)
364 ctrl |= NFP_NET_CFG_CTRL_RXCSUM;
367 if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP) {
368 if (hw->cap & NFP_NET_CFG_CTRL_RXVLAN)
369 ctrl |= NFP_NET_CFG_CTRL_RXVLAN;
372 if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
373 hw->mtu = rxmode->max_rx_pkt_len;
375 if (txmode->offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
376 ctrl |= NFP_NET_CFG_CTRL_TXVLAN;
379 if (hw->cap & NFP_NET_CFG_CTRL_L2BC)
380 ctrl |= NFP_NET_CFG_CTRL_L2BC;
383 if (hw->cap & NFP_NET_CFG_CTRL_L2MC)
384 ctrl |= NFP_NET_CFG_CTRL_L2MC;
386 /* TX checksum offload */
387 if (txmode->offloads & DEV_TX_OFFLOAD_IPV4_CKSUM ||
388 txmode->offloads & DEV_TX_OFFLOAD_UDP_CKSUM ||
389 txmode->offloads & DEV_TX_OFFLOAD_TCP_CKSUM)
390 ctrl |= NFP_NET_CFG_CTRL_TXCSUM;
393 if (txmode->offloads & DEV_TX_OFFLOAD_TCP_TSO) {
394 if (hw->cap & NFP_NET_CFG_CTRL_LSO)
395 ctrl |= NFP_NET_CFG_CTRL_LSO;
397 ctrl |= NFP_NET_CFG_CTRL_LSO2;
401 if (txmode->offloads & DEV_TX_OFFLOAD_MULTI_SEGS)
402 ctrl |= NFP_NET_CFG_CTRL_GATHER;
408 nfp_net_promisc_enable(struct rte_eth_dev *dev)
410 uint32_t new_ctrl, update = 0;
411 struct nfp_net_hw *hw;
414 PMD_DRV_LOG(DEBUG, "Promiscuous mode enable");
416 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
418 if (!(hw->cap & NFP_NET_CFG_CTRL_PROMISC)) {
419 PMD_INIT_LOG(INFO, "Promiscuous mode not supported");
423 if (hw->ctrl & NFP_NET_CFG_CTRL_PROMISC) {
424 PMD_DRV_LOG(INFO, "Promiscuous mode already enabled");
428 new_ctrl = hw->ctrl | NFP_NET_CFG_CTRL_PROMISC;
429 update = NFP_NET_CFG_UPDATE_GEN;
432 * DPDK sets promiscuous mode on just after this call assuming
433 * it can not fail ...
435 ret = nfp_net_reconfig(hw, new_ctrl, update);
445 nfp_net_promisc_disable(struct rte_eth_dev *dev)
447 uint32_t new_ctrl, update = 0;
448 struct nfp_net_hw *hw;
451 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
453 if ((hw->ctrl & NFP_NET_CFG_CTRL_PROMISC) == 0) {
454 PMD_DRV_LOG(INFO, "Promiscuous mode already disabled");
458 new_ctrl = hw->ctrl & ~NFP_NET_CFG_CTRL_PROMISC;
459 update = NFP_NET_CFG_UPDATE_GEN;
462 * DPDK sets promiscuous mode off just before this call
463 * assuming it can not fail ...
465 ret = nfp_net_reconfig(hw, new_ctrl, update);
475 * return 0 means link status changed, -1 means not changed
477 * Wait to complete is needed as it can take up to 9 seconds to get the Link
481 nfp_net_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complete)
483 struct nfp_net_hw *hw;
484 struct rte_eth_link link;
485 uint32_t nn_link_status;
488 static const uint32_t ls_to_ethtool[] = {
489 [NFP_NET_CFG_STS_LINK_RATE_UNSUPPORTED] = ETH_SPEED_NUM_NONE,
490 [NFP_NET_CFG_STS_LINK_RATE_UNKNOWN] = ETH_SPEED_NUM_NONE,
491 [NFP_NET_CFG_STS_LINK_RATE_1G] = ETH_SPEED_NUM_1G,
492 [NFP_NET_CFG_STS_LINK_RATE_10G] = ETH_SPEED_NUM_10G,
493 [NFP_NET_CFG_STS_LINK_RATE_25G] = ETH_SPEED_NUM_25G,
494 [NFP_NET_CFG_STS_LINK_RATE_40G] = ETH_SPEED_NUM_40G,
495 [NFP_NET_CFG_STS_LINK_RATE_50G] = ETH_SPEED_NUM_50G,
496 [NFP_NET_CFG_STS_LINK_RATE_100G] = ETH_SPEED_NUM_100G,
499 PMD_DRV_LOG(DEBUG, "Link update");
501 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
503 nn_link_status = nn_cfg_readl(hw, NFP_NET_CFG_STS);
505 memset(&link, 0, sizeof(struct rte_eth_link));
507 if (nn_link_status & NFP_NET_CFG_STS_LINK)
508 link.link_status = ETH_LINK_UP;
510 link.link_duplex = ETH_LINK_FULL_DUPLEX;
512 nn_link_status = (nn_link_status >> NFP_NET_CFG_STS_LINK_RATE_SHIFT) &
513 NFP_NET_CFG_STS_LINK_RATE_MASK;
515 if (nn_link_status >= RTE_DIM(ls_to_ethtool))
516 link.link_speed = ETH_SPEED_NUM_NONE;
518 link.link_speed = ls_to_ethtool[nn_link_status];
520 ret = rte_eth_linkstatus_set(dev, &link);
522 if (link.link_status)
523 PMD_DRV_LOG(INFO, "NIC Link is Up");
525 PMD_DRV_LOG(INFO, "NIC Link is Down");
531 nfp_net_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
534 struct nfp_net_hw *hw;
535 struct rte_eth_stats nfp_dev_stats;
537 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
539 /* RTE_ETHDEV_QUEUE_STAT_CNTRS default value is 16 */
541 memset(&nfp_dev_stats, 0, sizeof(nfp_dev_stats));
543 /* reading per RX ring stats */
544 for (i = 0; i < dev->data->nb_rx_queues; i++) {
545 if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)
548 nfp_dev_stats.q_ipackets[i] =
549 nn_cfg_readq(hw, NFP_NET_CFG_RXR_STATS(i));
551 nfp_dev_stats.q_ipackets[i] -=
552 hw->eth_stats_base.q_ipackets[i];
554 nfp_dev_stats.q_ibytes[i] =
555 nn_cfg_readq(hw, NFP_NET_CFG_RXR_STATS(i) + 0x8);
557 nfp_dev_stats.q_ibytes[i] -=
558 hw->eth_stats_base.q_ibytes[i];
561 /* reading per TX ring stats */
562 for (i = 0; i < dev->data->nb_tx_queues; i++) {
563 if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)
566 nfp_dev_stats.q_opackets[i] =
567 nn_cfg_readq(hw, NFP_NET_CFG_TXR_STATS(i));
569 nfp_dev_stats.q_opackets[i] -=
570 hw->eth_stats_base.q_opackets[i];
572 nfp_dev_stats.q_obytes[i] =
573 nn_cfg_readq(hw, NFP_NET_CFG_TXR_STATS(i) + 0x8);
575 nfp_dev_stats.q_obytes[i] -=
576 hw->eth_stats_base.q_obytes[i];
579 nfp_dev_stats.ipackets =
580 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_FRAMES);
582 nfp_dev_stats.ipackets -= hw->eth_stats_base.ipackets;
584 nfp_dev_stats.ibytes =
585 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_OCTETS);
587 nfp_dev_stats.ibytes -= hw->eth_stats_base.ibytes;
589 nfp_dev_stats.opackets =
590 nn_cfg_readq(hw, NFP_NET_CFG_STATS_TX_FRAMES);
592 nfp_dev_stats.opackets -= hw->eth_stats_base.opackets;
594 nfp_dev_stats.obytes =
595 nn_cfg_readq(hw, NFP_NET_CFG_STATS_TX_OCTETS);
597 nfp_dev_stats.obytes -= hw->eth_stats_base.obytes;
599 /* reading general device stats */
600 nfp_dev_stats.ierrors =
601 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_ERRORS);
603 nfp_dev_stats.ierrors -= hw->eth_stats_base.ierrors;
605 nfp_dev_stats.oerrors =
606 nn_cfg_readq(hw, NFP_NET_CFG_STATS_TX_ERRORS);
608 nfp_dev_stats.oerrors -= hw->eth_stats_base.oerrors;
610 /* RX ring mbuf allocation failures */
611 nfp_dev_stats.rx_nombuf = dev->data->rx_mbuf_alloc_failed;
613 nfp_dev_stats.imissed =
614 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_DISCARDS);
616 nfp_dev_stats.imissed -= hw->eth_stats_base.imissed;
619 memcpy(stats, &nfp_dev_stats, sizeof(*stats));
626 nfp_net_stats_reset(struct rte_eth_dev *dev)
629 struct nfp_net_hw *hw;
631 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
634 * hw->eth_stats_base records the per counter starting point.
638 /* reading per RX ring stats */
639 for (i = 0; i < dev->data->nb_rx_queues; i++) {
640 if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)
643 hw->eth_stats_base.q_ipackets[i] =
644 nn_cfg_readq(hw, NFP_NET_CFG_RXR_STATS(i));
646 hw->eth_stats_base.q_ibytes[i] =
647 nn_cfg_readq(hw, NFP_NET_CFG_RXR_STATS(i) + 0x8);
650 /* reading per TX ring stats */
651 for (i = 0; i < dev->data->nb_tx_queues; i++) {
652 if (i == RTE_ETHDEV_QUEUE_STAT_CNTRS)
655 hw->eth_stats_base.q_opackets[i] =
656 nn_cfg_readq(hw, NFP_NET_CFG_TXR_STATS(i));
658 hw->eth_stats_base.q_obytes[i] =
659 nn_cfg_readq(hw, NFP_NET_CFG_TXR_STATS(i) + 0x8);
662 hw->eth_stats_base.ipackets =
663 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_FRAMES);
665 hw->eth_stats_base.ibytes =
666 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_OCTETS);
668 hw->eth_stats_base.opackets =
669 nn_cfg_readq(hw, NFP_NET_CFG_STATS_TX_FRAMES);
671 hw->eth_stats_base.obytes =
672 nn_cfg_readq(hw, NFP_NET_CFG_STATS_TX_OCTETS);
674 /* reading general device stats */
675 hw->eth_stats_base.ierrors =
676 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_ERRORS);
678 hw->eth_stats_base.oerrors =
679 nn_cfg_readq(hw, NFP_NET_CFG_STATS_TX_ERRORS);
681 /* RX ring mbuf allocation failures */
682 dev->data->rx_mbuf_alloc_failed = 0;
684 hw->eth_stats_base.imissed =
685 nn_cfg_readq(hw, NFP_NET_CFG_STATS_RX_DISCARDS);
691 nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
693 struct nfp_net_hw *hw;
695 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
697 dev_info->max_rx_queues = (uint16_t)hw->max_rx_queues;
698 dev_info->max_tx_queues = (uint16_t)hw->max_tx_queues;
699 dev_info->min_rx_bufsize = RTE_ETHER_MIN_MTU;
700 dev_info->max_rx_pktlen = hw->max_mtu;
701 /* Next should change when PF support is implemented */
702 dev_info->max_mac_addrs = 1;
704 if (hw->cap & NFP_NET_CFG_CTRL_RXVLAN)
705 dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP;
707 if (hw->cap & NFP_NET_CFG_CTRL_RXCSUM)
708 dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_IPV4_CKSUM |
709 DEV_RX_OFFLOAD_UDP_CKSUM |
710 DEV_RX_OFFLOAD_TCP_CKSUM;
712 if (hw->cap & NFP_NET_CFG_CTRL_TXVLAN)
713 dev_info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT;
715 if (hw->cap & NFP_NET_CFG_CTRL_TXCSUM)
716 dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_IPV4_CKSUM |
717 DEV_TX_OFFLOAD_UDP_CKSUM |
718 DEV_TX_OFFLOAD_TCP_CKSUM;
720 if (hw->cap & NFP_NET_CFG_CTRL_LSO_ANY)
721 dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO;
723 if (hw->cap & NFP_NET_CFG_CTRL_GATHER)
724 dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_MULTI_SEGS;
726 dev_info->default_rxconf = (struct rte_eth_rxconf) {
728 .pthresh = DEFAULT_RX_PTHRESH,
729 .hthresh = DEFAULT_RX_HTHRESH,
730 .wthresh = DEFAULT_RX_WTHRESH,
732 .rx_free_thresh = DEFAULT_RX_FREE_THRESH,
736 dev_info->default_txconf = (struct rte_eth_txconf) {
738 .pthresh = DEFAULT_TX_PTHRESH,
739 .hthresh = DEFAULT_TX_HTHRESH,
740 .wthresh = DEFAULT_TX_WTHRESH,
742 .tx_free_thresh = DEFAULT_TX_FREE_THRESH,
743 .tx_rs_thresh = DEFAULT_TX_RSBIT_THRESH,
746 dev_info->rx_desc_lim = (struct rte_eth_desc_lim) {
747 .nb_max = NFP_NET_MAX_RX_DESC,
748 .nb_min = NFP_NET_MIN_RX_DESC,
749 .nb_align = NFP_ALIGN_RING_DESC,
752 dev_info->tx_desc_lim = (struct rte_eth_desc_lim) {
753 .nb_max = NFP_NET_MAX_TX_DESC,
754 .nb_min = NFP_NET_MIN_TX_DESC,
755 .nb_align = NFP_ALIGN_RING_DESC,
756 .nb_seg_max = NFP_TX_MAX_SEG,
757 .nb_mtu_seg_max = NFP_TX_MAX_MTU_SEG,
760 /* All NFP devices support jumbo frames */
761 dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME;
763 if (hw->cap & NFP_NET_CFG_CTRL_RSS) {
764 dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_RSS_HASH;
766 dev_info->flow_type_rss_offloads = ETH_RSS_IPV4 |
767 ETH_RSS_NONFRAG_IPV4_TCP |
768 ETH_RSS_NONFRAG_IPV4_UDP |
770 ETH_RSS_NONFRAG_IPV6_TCP |
771 ETH_RSS_NONFRAG_IPV6_UDP;
773 dev_info->reta_size = NFP_NET_CFG_RSS_ITBL_SZ;
774 dev_info->hash_key_size = NFP_NET_CFG_RSS_KEY_SZ;
777 dev_info->speed_capa = ETH_LINK_SPEED_1G | ETH_LINK_SPEED_10G |
778 ETH_LINK_SPEED_25G | ETH_LINK_SPEED_40G |
779 ETH_LINK_SPEED_50G | ETH_LINK_SPEED_100G;
785 nfp_net_supported_ptypes_get(struct rte_eth_dev *dev)
787 static const uint32_t ptypes[] = {
788 /* refers to nfp_net_set_hash() */
789 RTE_PTYPE_INNER_L3_IPV4,
790 RTE_PTYPE_INNER_L3_IPV6,
791 RTE_PTYPE_INNER_L3_IPV6_EXT,
792 RTE_PTYPE_INNER_L4_MASK,
796 if (dev->rx_pkt_burst == nfp_net_recv_pkts)
802 nfp_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
804 struct rte_pci_device *pci_dev;
805 struct nfp_net_hw *hw;
808 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
809 pci_dev = RTE_ETH_DEV_TO_PCI(dev);
811 if (pci_dev->intr_handle.type != RTE_INTR_HANDLE_UIO)
814 /* Make sure all updates are written before un-masking */
816 nn_cfg_writeb(hw, NFP_NET_CFG_ICR(base + queue_id),
817 NFP_NET_CFG_ICR_UNMASKED);
822 nfp_rx_queue_intr_disable(struct rte_eth_dev *dev, uint16_t queue_id)
824 struct rte_pci_device *pci_dev;
825 struct nfp_net_hw *hw;
828 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
829 pci_dev = RTE_ETH_DEV_TO_PCI(dev);
831 if (pci_dev->intr_handle.type != RTE_INTR_HANDLE_UIO)
834 /* Make sure all updates are written before un-masking */
836 nn_cfg_writeb(hw, NFP_NET_CFG_ICR(base + queue_id), 0x1);
841 nfp_net_dev_link_status_print(struct rte_eth_dev *dev)
843 struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
844 struct rte_eth_link link;
846 rte_eth_linkstatus_get(dev, &link);
847 if (link.link_status)
848 PMD_DRV_LOG(INFO, "Port %d: Link Up - speed %u Mbps - %s",
849 dev->data->port_id, link.link_speed,
850 link.link_duplex == ETH_LINK_FULL_DUPLEX
851 ? "full-duplex" : "half-duplex");
853 PMD_DRV_LOG(INFO, " Port %d: Link Down",
856 PMD_DRV_LOG(INFO, "PCI Address: " PCI_PRI_FMT,
857 pci_dev->addr.domain, pci_dev->addr.bus,
858 pci_dev->addr.devid, pci_dev->addr.function);
861 /* Interrupt configuration and handling */
864 * nfp_net_irq_unmask - Unmask an interrupt
866 * If MSI-X auto-masking is enabled clear the mask bit, otherwise
867 * clear the ICR for the entry.
870 nfp_net_irq_unmask(struct rte_eth_dev *dev)
872 struct nfp_net_hw *hw;
873 struct rte_pci_device *pci_dev;
875 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
876 pci_dev = RTE_ETH_DEV_TO_PCI(dev);
878 if (hw->ctrl & NFP_NET_CFG_CTRL_MSIXAUTO) {
879 /* If MSI-X auto-masking is used, clear the entry */
881 rte_intr_ack(&pci_dev->intr_handle);
883 /* Make sure all updates are written before un-masking */
885 nn_cfg_writeb(hw, NFP_NET_CFG_ICR(NFP_NET_IRQ_LSC_IDX),
886 NFP_NET_CFG_ICR_UNMASKED);
891 * Interrupt handler which shall be registered for alarm callback for delayed
892 * handling specific interrupt to wait for the stable nic state. As the NIC
893 * interrupt state is not stable for nfp after link is just down, it needs
894 * to wait 4 seconds to get the stable status.
896 * @param handle Pointer to interrupt handle.
897 * @param param The address of parameter (struct rte_eth_dev *)
902 nfp_net_dev_interrupt_delayed_handler(void *param)
904 struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
906 nfp_net_link_update(dev, 0);
907 rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL);
909 nfp_net_dev_link_status_print(dev);
912 nfp_net_irq_unmask(dev);
916 nfp_net_dev_interrupt_handler(void *param)
919 struct rte_eth_link link;
920 struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
922 PMD_DRV_LOG(DEBUG, "We got a LSC interrupt!!!");
924 rte_eth_linkstatus_get(dev, &link);
926 nfp_net_link_update(dev, 0);
929 if (!link.link_status) {
930 /* handle it 1 sec later, wait it being stable */
931 timeout = NFP_NET_LINK_UP_CHECK_TIMEOUT;
934 /* handle it 4 sec later, wait it being stable */
935 timeout = NFP_NET_LINK_DOWN_CHECK_TIMEOUT;
938 if (rte_eal_alarm_set(timeout * 1000,
939 nfp_net_dev_interrupt_delayed_handler,
941 PMD_INIT_LOG(ERR, "Error setting alarm");
943 nfp_net_irq_unmask(dev);
948 nfp_net_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
950 struct nfp_net_hw *hw;
952 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
954 /* check that mtu is within the allowed range */
955 if (mtu < RTE_ETHER_MIN_MTU || (uint32_t)mtu > hw->max_mtu)
958 /* mtu setting is forbidden if port is started */
959 if (dev->data->dev_started) {
960 PMD_DRV_LOG(ERR, "port %d must be stopped before configuration",
965 /* switch to jumbo mode if needed */
966 if ((uint32_t)mtu > RTE_ETHER_MTU)
967 dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
969 dev->data->dev_conf.rxmode.offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
971 /* update max frame size */
972 dev->data->dev_conf.rxmode.max_rx_pkt_len = (uint32_t)mtu;
974 /* writing to configuration space */
975 nn_cfg_writel(hw, NFP_NET_CFG_MTU, (uint32_t)mtu);
983 nfp_net_vlan_offload_set(struct rte_eth_dev *dev, int mask)
985 uint32_t new_ctrl, update;
986 struct nfp_net_hw *hw;
989 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
992 /* Enable vlan strip if it is not configured yet */
993 if ((mask & ETH_VLAN_STRIP_OFFLOAD) &&
994 !(hw->ctrl & NFP_NET_CFG_CTRL_RXVLAN))
995 new_ctrl = hw->ctrl | NFP_NET_CFG_CTRL_RXVLAN;
997 /* Disable vlan strip just if it is configured */
998 if (!(mask & ETH_VLAN_STRIP_OFFLOAD) &&
999 (hw->ctrl & NFP_NET_CFG_CTRL_RXVLAN))
1000 new_ctrl = hw->ctrl & ~NFP_NET_CFG_CTRL_RXVLAN;
1005 update = NFP_NET_CFG_UPDATE_GEN;
1007 ret = nfp_net_reconfig(hw, new_ctrl, update);
1009 hw->ctrl = new_ctrl;
1015 nfp_net_rss_reta_write(struct rte_eth_dev *dev,
1016 struct rte_eth_rss_reta_entry64 *reta_conf,
1019 uint32_t reta, mask;
1022 struct nfp_net_hw *hw =
1023 NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1025 if (reta_size != NFP_NET_CFG_RSS_ITBL_SZ) {
1026 PMD_DRV_LOG(ERR, "The size of hash lookup table configured "
1027 "(%d) doesn't match the number hardware can supported "
1028 "(%d)", reta_size, NFP_NET_CFG_RSS_ITBL_SZ);
1033 * Update Redirection Table. There are 128 8bit-entries which can be
1034 * manage as 32 32bit-entries
1036 for (i = 0; i < reta_size; i += 4) {
1037 /* Handling 4 RSS entries per loop */
1038 idx = i / RTE_RETA_GROUP_SIZE;
1039 shift = i % RTE_RETA_GROUP_SIZE;
1040 mask = (uint8_t)((reta_conf[idx].mask >> shift) & 0xF);
1046 /* If all 4 entries were set, don't need read RETA register */
1048 reta = nn_cfg_readl(hw, NFP_NET_CFG_RSS_ITBL + i);
1050 for (j = 0; j < 4; j++) {
1051 if (!(mask & (0x1 << j)))
1054 /* Clearing the entry bits */
1055 reta &= ~(0xFF << (8 * j));
1056 reta |= reta_conf[idx].reta[shift + j] << (8 * j);
1058 nn_cfg_writel(hw, NFP_NET_CFG_RSS_ITBL + (idx * 64) + shift,
1064 /* Update Redirection Table(RETA) of Receive Side Scaling of Ethernet device */
1066 nfp_net_reta_update(struct rte_eth_dev *dev,
1067 struct rte_eth_rss_reta_entry64 *reta_conf,
1070 struct nfp_net_hw *hw =
1071 NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1075 if (!(hw->ctrl & NFP_NET_CFG_CTRL_RSS))
1078 ret = nfp_net_rss_reta_write(dev, reta_conf, reta_size);
1082 update = NFP_NET_CFG_UPDATE_RSS;
1084 if (nfp_net_reconfig(hw, hw->ctrl, update) < 0)
1090 /* Query Redirection Table(RETA) of Receive Side Scaling of Ethernet device. */
1092 nfp_net_reta_query(struct rte_eth_dev *dev,
1093 struct rte_eth_rss_reta_entry64 *reta_conf,
1099 struct nfp_net_hw *hw;
1101 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1103 if (!(hw->ctrl & NFP_NET_CFG_CTRL_RSS))
1106 if (reta_size != NFP_NET_CFG_RSS_ITBL_SZ) {
1107 PMD_DRV_LOG(ERR, "The size of hash lookup table configured "
1108 "(%d) doesn't match the number hardware can supported "
1109 "(%d)", reta_size, NFP_NET_CFG_RSS_ITBL_SZ);
1114 * Reading Redirection Table. There are 128 8bit-entries which can be
1115 * manage as 32 32bit-entries
1117 for (i = 0; i < reta_size; i += 4) {
1118 /* Handling 4 RSS entries per loop */
1119 idx = i / RTE_RETA_GROUP_SIZE;
1120 shift = i % RTE_RETA_GROUP_SIZE;
1121 mask = (uint8_t)((reta_conf[idx].mask >> shift) & 0xF);
1126 reta = nn_cfg_readl(hw, NFP_NET_CFG_RSS_ITBL + (idx * 64) +
1128 for (j = 0; j < 4; j++) {
1129 if (!(mask & (0x1 << j)))
1131 reta_conf[idx].reta[shift + j] =
1132 (uint8_t)((reta >> (8 * j)) & 0xF);
1139 nfp_net_rss_hash_write(struct rte_eth_dev *dev,
1140 struct rte_eth_rss_conf *rss_conf)
1142 struct nfp_net_hw *hw;
1144 uint32_t cfg_rss_ctrl = 0;
1148 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1150 /* Writing the key byte a byte */
1151 for (i = 0; i < rss_conf->rss_key_len; i++) {
1152 memcpy(&key, &rss_conf->rss_key[i], 1);
1153 nn_cfg_writeb(hw, NFP_NET_CFG_RSS_KEY + i, key);
1156 rss_hf = rss_conf->rss_hf;
1158 if (rss_hf & ETH_RSS_IPV4)
1159 cfg_rss_ctrl |= NFP_NET_CFG_RSS_IPV4;
1161 if (rss_hf & ETH_RSS_NONFRAG_IPV4_TCP)
1162 cfg_rss_ctrl |= NFP_NET_CFG_RSS_IPV4_TCP;
1164 if (rss_hf & ETH_RSS_NONFRAG_IPV4_UDP)
1165 cfg_rss_ctrl |= NFP_NET_CFG_RSS_IPV4_UDP;
1167 if (rss_hf & ETH_RSS_IPV6)
1168 cfg_rss_ctrl |= NFP_NET_CFG_RSS_IPV6;
1170 if (rss_hf & ETH_RSS_NONFRAG_IPV6_TCP)
1171 cfg_rss_ctrl |= NFP_NET_CFG_RSS_IPV6_TCP;
1173 if (rss_hf & ETH_RSS_NONFRAG_IPV6_UDP)
1174 cfg_rss_ctrl |= NFP_NET_CFG_RSS_IPV6_UDP;
1176 cfg_rss_ctrl |= NFP_NET_CFG_RSS_MASK;
1177 cfg_rss_ctrl |= NFP_NET_CFG_RSS_TOEPLITZ;
1179 /* configuring where to apply the RSS hash */
1180 nn_cfg_writel(hw, NFP_NET_CFG_RSS_CTRL, cfg_rss_ctrl);
1182 /* Writing the key size */
1183 nn_cfg_writeb(hw, NFP_NET_CFG_RSS_KEY_SZ, rss_conf->rss_key_len);
1189 nfp_net_rss_hash_update(struct rte_eth_dev *dev,
1190 struct rte_eth_rss_conf *rss_conf)
1194 struct nfp_net_hw *hw;
1196 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1198 rss_hf = rss_conf->rss_hf;
1200 /* Checking if RSS is enabled */
1201 if (!(hw->ctrl & NFP_NET_CFG_CTRL_RSS)) {
1202 if (rss_hf != 0) { /* Enable RSS? */
1203 PMD_DRV_LOG(ERR, "RSS unsupported");
1206 return 0; /* Nothing to do */
1209 if (rss_conf->rss_key_len > NFP_NET_CFG_RSS_KEY_SZ) {
1210 PMD_DRV_LOG(ERR, "hash key too long");
1214 nfp_net_rss_hash_write(dev, rss_conf);
1216 update = NFP_NET_CFG_UPDATE_RSS;
1218 if (nfp_net_reconfig(hw, hw->ctrl, update) < 0)
1225 nfp_net_rss_hash_conf_get(struct rte_eth_dev *dev,
1226 struct rte_eth_rss_conf *rss_conf)
1229 uint32_t cfg_rss_ctrl;
1232 struct nfp_net_hw *hw;
1234 hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1236 if (!(hw->ctrl & NFP_NET_CFG_CTRL_RSS))
1239 rss_hf = rss_conf->rss_hf;
1240 cfg_rss_ctrl = nn_cfg_readl(hw, NFP_NET_CFG_RSS_CTRL);
1242 if (cfg_rss_ctrl & NFP_NET_CFG_RSS_IPV4)
1243 rss_hf |= ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV4_UDP;
1245 if (cfg_rss_ctrl & NFP_NET_CFG_RSS_IPV4_TCP)
1246 rss_hf |= ETH_RSS_NONFRAG_IPV4_TCP;
1248 if (cfg_rss_ctrl & NFP_NET_CFG_RSS_IPV6_TCP)
1249 rss_hf |= ETH_RSS_NONFRAG_IPV6_TCP;
1251 if (cfg_rss_ctrl & NFP_NET_CFG_RSS_IPV4_UDP)
1252 rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP;
1254 if (cfg_rss_ctrl & NFP_NET_CFG_RSS_IPV6_UDP)
1255 rss_hf |= ETH_RSS_NONFRAG_IPV6_UDP;
1257 if (cfg_rss_ctrl & NFP_NET_CFG_RSS_IPV6)
1258 rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP;
1260 /* Propagate current RSS hash functions to caller */
1261 rss_conf->rss_hf = rss_hf;
1263 /* Reading the key size */
1264 rss_conf->rss_key_len = nn_cfg_readl(hw, NFP_NET_CFG_RSS_KEY_SZ);
1266 /* Reading the key byte a byte */
1267 for (i = 0; i < rss_conf->rss_key_len; i++) {
1268 key = nn_cfg_readb(hw, NFP_NET_CFG_RSS_KEY + i);
1269 memcpy(&rss_conf->rss_key[i], &key, 1);
1276 nfp_net_rss_config_default(struct rte_eth_dev *dev)
1278 struct rte_eth_conf *dev_conf;
1279 struct rte_eth_rss_conf rss_conf;
1280 struct rte_eth_rss_reta_entry64 nfp_reta_conf[2];
1281 uint16_t rx_queues = dev->data->nb_rx_queues;
1285 PMD_DRV_LOG(INFO, "setting default RSS conf for %u queues",
1288 nfp_reta_conf[0].mask = ~0x0;
1289 nfp_reta_conf[1].mask = ~0x0;
1292 for (i = 0; i < 0x40; i += 8) {
1293 for (j = i; j < (i + 8); j++) {
1294 nfp_reta_conf[0].reta[j] = queue;
1295 nfp_reta_conf[1].reta[j] = queue++;
1299 ret = nfp_net_rss_reta_write(dev, nfp_reta_conf, 0x80);
1303 dev_conf = &dev->data->dev_conf;
1305 PMD_DRV_LOG(INFO, "wrong rss conf");
1308 rss_conf = dev_conf->rx_adv_conf.rss_conf;
1310 ret = nfp_net_rss_hash_write(dev, &rss_conf);
1315 RTE_LOG_REGISTER_SUFFIX(nfp_logtype_init, init, NOTICE);
1316 RTE_LOG_REGISTER_SUFFIX(nfp_logtype_driver, driver, NOTICE);
1319 * c-file-style: "Linux"
1320 * indent-tabs-mode: t