1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2016 Intel Corporation
11 #include <ethdev_driver.h>
12 #include <ethdev_pci.h>
14 #include <rte_bus_pci.h>
15 #include <rte_errno.h>
17 #include <rte_memory.h>
20 #include <rte_kvargs.h>
22 #include "virtio_ethdev.h"
23 #include "virtio_pci.h"
24 #include "virtio_logs.h"
27 * The set of PCI devices this driver supports
29 static const struct rte_pci_id pci_id_virtio_map[] = {
30 { RTE_PCI_DEVICE(VIRTIO_PCI_VENDORID, VIRTIO_PCI_LEGACY_DEVICEID_NET) },
31 { RTE_PCI_DEVICE(VIRTIO_PCI_VENDORID, VIRTIO_PCI_MODERN_DEVICEID_NET) },
32 { .vendor_id = 0, /* sentinel */ },
36 eth_virtio_pci_init(struct rte_eth_dev *eth_dev)
38 return eth_virtio_dev_init(eth_dev);
42 eth_virtio_pci_uninit(struct rte_eth_dev *eth_dev)
45 PMD_INIT_FUNC_TRACE();
47 if (rte_eal_process_type() == RTE_PROC_SECONDARY)
50 ret = virtio_dev_stop(eth_dev);
51 virtio_dev_close(eth_dev);
53 PMD_INIT_LOG(DEBUG, "dev_uninit completed");
58 static int vdpa_check_handler(__rte_unused const char *key,
59 const char *value, void *ret_val)
61 if (strcmp(value, "1") == 0)
69 #define VIRTIO_ARG_VDPA "vdpa"
72 virtio_pci_devargs_parse(struct rte_devargs *devargs, int *vdpa)
74 struct rte_kvargs *kvlist;
80 kvlist = rte_kvargs_parse(devargs->args, NULL);
82 PMD_INIT_LOG(ERR, "error when parsing param");
86 if (rte_kvargs_count(kvlist, VIRTIO_ARG_VDPA) == 1) {
87 /* vdpa mode selected when there's a key-value pair:
90 ret = rte_kvargs_process(kvlist, VIRTIO_ARG_VDPA,
91 vdpa_check_handler, vdpa);
93 PMD_INIT_LOG(ERR, "Failed to parse %s", VIRTIO_ARG_VDPA);
96 rte_kvargs_free(kvlist);
101 static int eth_virtio_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
102 struct rte_pci_device *pci_dev)
107 ret = virtio_pci_devargs_parse(pci_dev->device.devargs, &vdpa);
109 PMD_INIT_LOG(ERR, "devargs parsing is failed");
112 /* virtio pmd skips probe if device needs to work in vdpa mode */
116 return rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct virtio_pci_dev),
117 eth_virtio_pci_init);
120 static int eth_virtio_pci_remove(struct rte_pci_device *pci_dev)
124 ret = rte_eth_dev_pci_generic_remove(pci_dev, eth_virtio_pci_uninit);
125 /* Port has already been released by close. */
131 static struct rte_pci_driver rte_virtio_net_pci_pmd = {
133 .name = "net_virtio",
135 .id_table = pci_id_virtio_map,
137 .probe = eth_virtio_pci_probe,
138 .remove = eth_virtio_pci_remove,
141 RTE_INIT(rte_virtio_net_pci_pmd_init)
144 rte_pci_register(&rte_virtio_net_pci_pmd);
147 RTE_PMD_REGISTER_PCI_TABLE(net_virtio, pci_id_virtio_map);
148 RTE_PMD_REGISTER_KMOD_DEP(net_virtio, "* igb_uio | uio_pci_generic | vfio-pci");
149 RTE_PMD_EXPORT_NAME(net_virtio, __COUNTER__);