diff --git a/include/spdk/env.h b/include/spdk/env.h index 78ac29acb..795c51e59 100644 --- a/include/spdk/env.h +++ b/include/spdk/env.h @@ -733,6 +733,11 @@ struct spdk_pci_driver *spdk_pci_idxd_get_driver(void); */ struct spdk_pci_driver *spdk_pci_virtio_get_driver(void); +/** + * Get PCI driver by name (e.g. "nvme", "vmd", "ioat"). + */ +struct spdk_pci_driver *spdk_pci_get_driver(const char *name); + /** * Enumerate all PCI devices supported by the provided driver and try to * attach those that weren't attached yet. The provided callback will be diff --git a/lib/env_dpdk/pci.c b/lib/env_dpdk/pci.c index c2096fccc..011a620c2 100644 --- a/lib/env_dpdk/pci.c +++ b/lib/env_dpdk/pci.c @@ -177,6 +177,20 @@ pci_driver_register(struct spdk_pci_driver *driver) TAILQ_INSERT_TAIL(&g_pci_drivers, driver, tailq); } +struct spdk_pci_driver * +spdk_pci_get_driver(const char *name) +{ + struct spdk_pci_driver *driver; + + TAILQ_FOREACH(driver, &g_pci_drivers, tailq) { + if (strcmp(driver->name, name) == 0) { + return driver; + } + } + + return NULL; +} + static void pci_device_rte_hotremove(const char *device_name, enum rte_dev_event_type event, diff --git a/lib/env_dpdk/spdk_env_dpdk.map b/lib/env_dpdk/spdk_env_dpdk.map index e899ad326..2d57dfce7 100644 --- a/lib/env_dpdk/spdk_env_dpdk.map +++ b/lib/env_dpdk/spdk_env_dpdk.map @@ -52,6 +52,7 @@ spdk_ring_dequeue; spdk_iommu_is_enabled; spdk_vtophys; + spdk_pci_get_driver; spdk_pci_nvme_get_driver; spdk_pci_vmd_get_driver; spdk_pci_idxd_get_driver;