[dpdk-dev] [PATCH v3 01/17] net/txgbe: add ethdev probe and remove for VF device
From: Jiawen Wu <jiawenwu@trustnetic.com>
Date: 2021-02-25 08:08:39
Subsystem:
networking drivers, the rest · Maintainers:
Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Introduce virtual function driver in txgbe PMD, add simple init and uninit function to probe and remove the device. Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com> --- doc/guides/nics/features/txgbe_vf.ini | 11 +++ drivers/net/txgbe/meson.build | 1 + drivers/net/txgbe/txgbe_ethdev_vf.c | 132 ++++++++++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 doc/guides/nics/features/txgbe_vf.ini create mode 100644 drivers/net/txgbe/txgbe_ethdev_vf.c
diff --git a/doc/guides/nics/features/txgbe_vf.ini b/doc/guides/nics/features/txgbe_vf.ini
new file mode 100644
index 000000000..5035c5eea
--- /dev/null
+++ b/doc/guides/nics/features/txgbe_vf.ini@@ -0,0 +1,11 @@ +; +; Supported features of the 'txgbe_vf' network poll mode driver. +; +; Refer to default.ini for the full list of available PMD features. +; +[Features] +Multiprocess aware = Y +Linux = Y +ARMv8 = Y +x86-32 = Y +x86-64 = Y
diff --git a/drivers/net/txgbe/meson.build b/drivers/net/txgbe/meson.build
index 60505e211..3b9994aa9 100644
--- a/drivers/net/txgbe/meson.build
+++ b/drivers/net/txgbe/meson.build@@ -12,6 +12,7 @@ objs = [base_objs] sources = files( 'txgbe_ethdev.c', + 'txgbe_ethdev_vf.c', 'txgbe_fdir.c', 'txgbe_flow.c', 'txgbe_ipsec.c',
diff --git a/drivers/net/txgbe/txgbe_ethdev_vf.c b/drivers/net/txgbe/txgbe_ethdev_vf.c
new file mode 100644
index 000000000..1c3765e4e
--- /dev/null
+++ b/drivers/net/txgbe/txgbe_ethdev_vf.c@@ -0,0 +1,132 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2015-2020 + */ + +#include <sys/queue.h> +#include <stdio.h> +#include <errno.h> +#include <stdint.h> +#include <string.h> +#include <rte_log.h> +#include <ethdev_pci.h> + +#include "base/txgbe.h" +#include "txgbe_ethdev.h" +#include "txgbe_rxtx.h" + +static int txgbevf_dev_close(struct rte_eth_dev *dev); + +/* + * The set of PCI devices this driver supports (for VF) + */ +static const struct rte_pci_id pci_id_txgbevf_map[] = { + { RTE_PCI_DEVICE(PCI_VENDOR_ID_WANGXUN, TXGBE_DEV_ID_RAPTOR_VF) }, + { RTE_PCI_DEVICE(PCI_VENDOR_ID_WANGXUN, TXGBE_DEV_ID_RAPTOR_VF_HV) }, + { .vendor_id = 0, /* sentinel */ }, +}; + +static const struct eth_dev_ops txgbevf_eth_dev_ops; + +/* + * Virtual Function device init + */ +static int +eth_txgbevf_dev_init(struct rte_eth_dev *eth_dev) +{ + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); + struct txgbe_hw *hw = TXGBE_DEV_HW(eth_dev); + PMD_INIT_FUNC_TRACE(); + + eth_dev->dev_ops = &txgbevf_eth_dev_ops; + + /* for secondary processes, we don't initialise any further as primary + * has already done this work. Only check we don't need a different + * RX function + */ + if (rte_eal_process_type() != RTE_PROC_PRIMARY) { + struct txgbe_tx_queue *txq; + uint16_t nb_tx_queues = eth_dev->data->nb_tx_queues; + /* TX queue function in primary, set by last queue initialized + * Tx queue may not initialized by primary process + */ + if (eth_dev->data->tx_queues) { + txq = eth_dev->data->tx_queues[nb_tx_queues - 1]; + txgbe_set_tx_function(eth_dev, txq); + } else { + /* Use default TX function if we get here */ + PMD_INIT_LOG(NOTICE, + "No TX queues configured yet. Using default TX function."); + } + + txgbe_set_rx_function(eth_dev); + + return 0; + } + + rte_eth_copy_pci_info(eth_dev, pci_dev); + + hw->device_id = pci_dev->id.device_id; + hw->vendor_id = pci_dev->id.vendor_id; + hw->subsystem_device_id = pci_dev->id.subsystem_device_id; + hw->subsystem_vendor_id = pci_dev->id.subsystem_vendor_id; + hw->hw_addr = (void *)pci_dev->mem_resource[0].addr; + + return 0; +} + +/* Virtual Function device uninit */ +static int +eth_txgbevf_dev_uninit(struct rte_eth_dev *eth_dev) +{ + PMD_INIT_FUNC_TRACE(); + + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return 0; + + txgbevf_dev_close(eth_dev); + + return 0; +} + +static int eth_txgbevf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, + struct rte_pci_device *pci_dev) +{ + return rte_eth_dev_pci_generic_probe(pci_dev, + sizeof(struct txgbe_adapter), eth_txgbevf_dev_init); +} + +static int eth_txgbevf_pci_remove(struct rte_pci_device *pci_dev) +{ + return rte_eth_dev_pci_generic_remove(pci_dev, eth_txgbevf_dev_uninit); +} + +/* + * virtual function driver struct + */ +static struct rte_pci_driver rte_txgbevf_pmd = { + .id_table = pci_id_txgbevf_map, + .drv_flags = RTE_PCI_DRV_NEED_MAPPING, + .probe = eth_txgbevf_pci_probe, + .remove = eth_txgbevf_pci_remove, +}; + +static int +txgbevf_dev_close(struct rte_eth_dev *dev) +{ + PMD_INIT_FUNC_TRACE(); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return 0; + + return 0; +} + +/* + * dev_ops for virtual function, bare necessities for basic vf + * operation have been implemented + */ +static const struct eth_dev_ops txgbevf_eth_dev_ops = { +}; + +RTE_PMD_REGISTER_PCI(net_txgbe_vf, rte_txgbevf_pmd); +RTE_PMD_REGISTER_PCI_TABLE(net_txgbe_vf, pci_id_txgbevf_map); +RTE_PMD_REGISTER_KMOD_DEP(net_txgbe_vf, "* igb_uio | vfio-pci");
--
2.27.0