net/txgbe: support getting device info
authorJiawen Wu <jiawenwu@trustnetic.com>
Mon, 19 Oct 2020 08:53:29 +0000 (16:53 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 3 Nov 2020 22:24:26 +0000 (23:24 +0100)
Add device information get operation.

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
doc/guides/nics/features/txgbe.ini
drivers/net/txgbe/base/txgbe_hw.c
drivers/net/txgbe/base/txgbe_type.h
drivers/net/txgbe/meson.build
drivers/net/txgbe/txgbe_ethdev.c
drivers/net/txgbe/txgbe_ethdev.h
drivers/net/txgbe/txgbe_rxtx.c [new file with mode: 0644]
drivers/net/txgbe/txgbe_rxtx.h [new file with mode: 0644]

index 76c43c7..2fc202c 100644 (file)
@@ -4,6 +4,7 @@
 ; Refer to default.ini for the full list of available PMD features.
 ;
 [Features]
+Speed capabilities   = Y
 Linux UIO            = Y
 Linux VFIO           = Y
 ARMv8                = Y
index 598ef3e..31f8688 100644 (file)
@@ -8,6 +8,8 @@
 #include "txgbe_mng.h"
 #include "txgbe_hw.h"
 
+#define TXGBE_RAPTOR_MAX_TX_QUEUES 128
+#define TXGBE_RAPTOR_MAX_RX_QUEUES 128
 #define TXGBE_RAPTOR_RAR_ENTRIES   128
 
 /**
@@ -304,7 +306,6 @@ s32 txgbe_init_ops_pf(struct txgbe_hw *hw)
        /* MAC */
        mac->init_hw = txgbe_init_hw;
        mac->reset_hw = txgbe_reset_hw;
-       mac->num_rar_entries    = TXGBE_RAPTOR_RAR_ENTRIES;
 
        /* EEPROM */
        rom->init_params = txgbe_init_eeprom_params;
@@ -320,6 +321,10 @@ s32 txgbe_init_ops_pf(struct txgbe_hw *hw)
        rom->update_checksum = txgbe_update_eeprom_checksum;
        rom->calc_checksum = txgbe_calc_eeprom_checksum;
 
+       mac->num_rar_entries    = TXGBE_RAPTOR_RAR_ENTRIES;
+       mac->max_rx_queues      = TXGBE_RAPTOR_MAX_RX_QUEUES;
+       mac->max_tx_queues      = TXGBE_RAPTOR_MAX_TX_QUEUES;
+
        return 0;
 }
 
index 438734f..09089fc 100644 (file)
@@ -303,6 +303,8 @@ struct txgbe_mac_info {
        u16 wwpn_prefix;
 
        u32 num_rar_entries;
+       u32 max_tx_queues;
+       u32 max_rx_queues;
 
        u8  san_mac_rar_index;
        u64 orig_autoc;  /* cached value of AUTOC */
index 295f392..3c11d5e 100644 (file)
@@ -6,6 +6,7 @@ objs = [base_objs]
 
 sources = files(
        'txgbe_ethdev.c',
+       'txgbe_rxtx.c',
 )
 
 includes += include_directories('base')
index 7a4c723..844ed7d 100644 (file)
@@ -14,6 +14,7 @@
 #include "txgbe_logs.h"
 #include "base/txgbe.h"
 #include "txgbe_ethdev.h"
+#include "txgbe_rxtx.h"
 
 static int txgbe_dev_close(struct rte_eth_dev *dev);
 
@@ -26,6 +27,20 @@ static const struct rte_pci_id pci_id_txgbe_map[] = {
        { .vendor_id = 0, /* sentinel */ },
 };
 
+static const struct rte_eth_desc_lim rx_desc_lim = {
+       .nb_max = TXGBE_RING_DESC_MAX,
+       .nb_min = TXGBE_RING_DESC_MIN,
+       .nb_align = TXGBE_RXD_ALIGN,
+};
+
+static const struct rte_eth_desc_lim tx_desc_lim = {
+       .nb_max = TXGBE_RING_DESC_MAX,
+       .nb_min = TXGBE_RING_DESC_MIN,
+       .nb_align = TXGBE_TXD_ALIGN,
+       .nb_seg_max = TXGBE_TX_MAX_SEG,
+       .nb_mtu_seg_max = TXGBE_TX_MAX_SEG,
+};
+
 static const struct eth_dev_ops txgbe_eth_dev_ops;
 
 static inline int
@@ -260,7 +275,71 @@ txgbe_dev_close(struct rte_eth_dev *dev)
        return 0;
 }
 
+static int
+txgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
+{
+       struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
+       struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
+
+       dev_info->max_rx_queues = (uint16_t)hw->mac.max_rx_queues;
+       dev_info->max_tx_queues = (uint16_t)hw->mac.max_tx_queues;
+       dev_info->min_rx_bufsize = 1024;
+       dev_info->max_rx_pktlen = 15872;
+       dev_info->max_mac_addrs = hw->mac.num_rar_entries;
+       dev_info->max_hash_mac_addrs = TXGBE_VMDQ_NUM_UC_MAC;
+       dev_info->max_vfs = pci_dev->max_vfs;
+       dev_info->max_vmdq_pools = ETH_64_POOLS;
+       dev_info->vmdq_queue_num = dev_info->max_rx_queues;
+       dev_info->rx_queue_offload_capa = txgbe_get_rx_queue_offloads(dev);
+       dev_info->rx_offload_capa = (txgbe_get_rx_port_offloads(dev) |
+                                    dev_info->rx_queue_offload_capa);
+       dev_info->tx_queue_offload_capa = txgbe_get_tx_queue_offloads(dev);
+       dev_info->tx_offload_capa = txgbe_get_tx_port_offloads(dev);
+
+       dev_info->default_rxconf = (struct rte_eth_rxconf) {
+               .rx_thresh = {
+                       .pthresh = TXGBE_DEFAULT_RX_PTHRESH,
+                       .hthresh = TXGBE_DEFAULT_RX_HTHRESH,
+                       .wthresh = TXGBE_DEFAULT_RX_WTHRESH,
+               },
+               .rx_free_thresh = TXGBE_DEFAULT_RX_FREE_THRESH,
+               .rx_drop_en = 0,
+               .offloads = 0,
+       };
+
+       dev_info->default_txconf = (struct rte_eth_txconf) {
+               .tx_thresh = {
+                       .pthresh = TXGBE_DEFAULT_TX_PTHRESH,
+                       .hthresh = TXGBE_DEFAULT_TX_HTHRESH,
+                       .wthresh = TXGBE_DEFAULT_TX_WTHRESH,
+               },
+               .tx_free_thresh = TXGBE_DEFAULT_TX_FREE_THRESH,
+               .offloads = 0,
+       };
+
+       dev_info->rx_desc_lim = rx_desc_lim;
+       dev_info->tx_desc_lim = tx_desc_lim;
+
+       dev_info->hash_key_size = TXGBE_HKEY_MAX_INDEX * sizeof(uint32_t);
+       dev_info->reta_size = ETH_RSS_RETA_SIZE_128;
+       dev_info->flow_type_rss_offloads = TXGBE_RSS_OFFLOAD_ALL;
+
+       dev_info->speed_capa = ETH_LINK_SPEED_1G | ETH_LINK_SPEED_10G;
+       dev_info->speed_capa |= ETH_LINK_SPEED_100M;
+
+       /* Driver-preferred Rx/Tx parameters */
+       dev_info->default_rxportconf.burst_size = 32;
+       dev_info->default_txportconf.burst_size = 32;
+       dev_info->default_rxportconf.nb_queues = 1;
+       dev_info->default_txportconf.nb_queues = 1;
+       dev_info->default_rxportconf.ring_size = 256;
+       dev_info->default_txportconf.ring_size = 256;
+
+       return 0;
+}
+
 static const struct eth_dev_ops txgbe_eth_dev_ops = {
+       .dev_infos_get              = txgbe_dev_info_get,
 };
 
 RTE_PMD_REGISTER_PCI(net_txgbe, rte_txgbe_pmd);
index 5db03ba..c815282 100644 (file)
@@ -7,6 +7,23 @@
 
 #include "base/txgbe.h"
 
+/*
+ * Defines that were not part of txgbe_type.h as they are not used by the
+ * FreeBSD driver.
+ */
+#define TXGBE_HKEY_MAX_INDEX 10
+
+#define TXGBE_RSS_OFFLOAD_ALL ( \
+       ETH_RSS_IPV4 | \
+       ETH_RSS_NONFRAG_IPV4_TCP | \
+       ETH_RSS_NONFRAG_IPV4_UDP | \
+       ETH_RSS_IPV6 | \
+       ETH_RSS_NONFRAG_IPV6_TCP | \
+       ETH_RSS_NONFRAG_IPV6_UDP | \
+       ETH_RSS_IPV6_EX | \
+       ETH_RSS_IPV6_TCP_EX | \
+       ETH_RSS_IPV6_UDP_EX)
+
 /*
  * Structure to store private data for each driver instance (for each port).
  */
@@ -18,4 +35,18 @@ struct txgbe_adapter {
        (&((struct txgbe_adapter *)(dev)->data->dev_private)->hw)
 
 #define TXGBE_VMDQ_NUM_UC_MAC         4096 /* Maximum nb. of UC MAC addr. */
+
+/*
+ *  Default values for RX/TX configuration
+ */
+#define TXGBE_DEFAULT_RX_FREE_THRESH  32
+#define TXGBE_DEFAULT_RX_PTHRESH      8
+#define TXGBE_DEFAULT_RX_HTHRESH      8
+#define TXGBE_DEFAULT_RX_WTHRESH      0
+
+#define TXGBE_DEFAULT_TX_FREE_THRESH  32
+#define TXGBE_DEFAULT_TX_PTHRESH      32
+#define TXGBE_DEFAULT_TX_HTHRESH      0
+#define TXGBE_DEFAULT_TX_WTHRESH      0
+
 #endif /* _TXGBE_ETHDEV_H_ */
diff --git a/drivers/net/txgbe/txgbe_rxtx.c b/drivers/net/txgbe/txgbe_rxtx.c
new file mode 100644 (file)
index 0000000..8a72823
--- /dev/null
@@ -0,0 +1,112 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2015-2020
+ */
+
+#include <sys/queue.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <rte_common.h>
+#include <rte_ethdev.h>
+
+#include "txgbe_logs.h"
+#include "base/txgbe.h"
+#include "txgbe_ethdev.h"
+#include "txgbe_rxtx.h"
+
+static int
+txgbe_is_vf(struct rte_eth_dev *dev)
+{
+       struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
+
+       switch (hw->mac.type) {
+       case txgbe_mac_raptor_vf:
+               return 1;
+       default:
+               return 0;
+       }
+}
+
+uint64_t
+txgbe_get_rx_queue_offloads(struct rte_eth_dev *dev __rte_unused)
+{
+       return DEV_RX_OFFLOAD_VLAN_STRIP;
+}
+
+uint64_t
+txgbe_get_rx_port_offloads(struct rte_eth_dev *dev)
+{
+       uint64_t offloads;
+       struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
+       struct rte_eth_dev_sriov *sriov = &RTE_ETH_DEV_SRIOV(dev);
+
+       offloads = DEV_RX_OFFLOAD_IPV4_CKSUM  |
+                  DEV_RX_OFFLOAD_UDP_CKSUM   |
+                  DEV_RX_OFFLOAD_TCP_CKSUM   |
+                  DEV_RX_OFFLOAD_KEEP_CRC    |
+                  DEV_RX_OFFLOAD_JUMBO_FRAME |
+                  DEV_RX_OFFLOAD_VLAN_FILTER |
+                  DEV_RX_OFFLOAD_RSS_HASH |
+                  DEV_RX_OFFLOAD_SCATTER;
+
+       if (!txgbe_is_vf(dev))
+               offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
+                            DEV_RX_OFFLOAD_QINQ_STRIP |
+                            DEV_RX_OFFLOAD_VLAN_EXTEND);
+
+       /*
+        * RSC is only supported by PF devices in a non-SR-IOV
+        * mode.
+        */
+       if (hw->mac.type == txgbe_mac_raptor && !sriov->active)
+               offloads |= DEV_RX_OFFLOAD_TCP_LRO;
+
+       if (hw->mac.type == txgbe_mac_raptor)
+               offloads |= DEV_RX_OFFLOAD_MACSEC_STRIP;
+
+       offloads |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
+
+       return offloads;
+}
+
+uint64_t
+txgbe_get_tx_queue_offloads(struct rte_eth_dev *dev)
+{
+       RTE_SET_USED(dev);
+
+       return 0;
+}
+
+uint64_t
+txgbe_get_tx_port_offloads(struct rte_eth_dev *dev)
+{
+       uint64_t tx_offload_capa;
+
+       tx_offload_capa =
+               DEV_TX_OFFLOAD_VLAN_INSERT |
+               DEV_TX_OFFLOAD_IPV4_CKSUM  |
+               DEV_TX_OFFLOAD_UDP_CKSUM   |
+               DEV_TX_OFFLOAD_TCP_CKSUM   |
+               DEV_TX_OFFLOAD_SCTP_CKSUM  |
+               DEV_TX_OFFLOAD_TCP_TSO     |
+               DEV_TX_OFFLOAD_UDP_TSO     |
+               DEV_TX_OFFLOAD_UDP_TNL_TSO      |
+               DEV_TX_OFFLOAD_IP_TNL_TSO       |
+               DEV_TX_OFFLOAD_VXLAN_TNL_TSO    |
+               DEV_TX_OFFLOAD_GRE_TNL_TSO      |
+               DEV_TX_OFFLOAD_IPIP_TNL_TSO     |
+               DEV_TX_OFFLOAD_GENEVE_TNL_TSO   |
+               DEV_TX_OFFLOAD_MULTI_SEGS;
+
+       if (!txgbe_is_vf(dev))
+               tx_offload_capa |= DEV_TX_OFFLOAD_QINQ_INSERT;
+
+       tx_offload_capa |= DEV_TX_OFFLOAD_MACSEC_INSERT;
+
+       tx_offload_capa |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
+
+       return tx_offload_capa;
+}
+
diff --git a/drivers/net/txgbe/txgbe_rxtx.h b/drivers/net/txgbe/txgbe_rxtx.h
new file mode 100644 (file)
index 0000000..9488c2b
--- /dev/null
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2015-2020
+ */
+
+#ifndef _TXGBE_RXTX_H_
+#define _TXGBE_RXTX_H_
+
+#define TXGBE_TX_MAX_SEG                    40
+
+uint64_t txgbe_get_tx_port_offloads(struct rte_eth_dev *dev);
+uint64_t txgbe_get_rx_queue_offloads(struct rte_eth_dev *dev);
+uint64_t txgbe_get_rx_port_offloads(struct rte_eth_dev *dev);
+uint64_t txgbe_get_tx_queue_offloads(struct rte_eth_dev *dev);
+
+#endif /* _TXGBE_RXTX_H_ */