diff --git a/include/spdk/env.h b/include/spdk/env.h index 5d656de61..540e56c16 100644 --- a/include/spdk/env.h +++ b/include/spdk/env.h @@ -186,6 +186,8 @@ typedef int (*spdk_pci_enum_cb)(void *enum_ctx, struct spdk_pci_device *pci_dev) int spdk_pci_nvme_enumerate(spdk_pci_enum_cb enum_cb, void *enum_ctx); int spdk_pci_ioat_enumerate(spdk_pci_enum_cb enum_cb, void *enum_ctx); +struct spdk_pci_device *spdk_pci_get_device(struct spdk_pci_addr *pci_addr); + int spdk_pci_device_map_bar(struct spdk_pci_device *dev, uint32_t bar, void **mapped_addr, uint64_t *phys_addr, uint64_t *size); int spdk_pci_device_unmap_bar(struct spdk_pci_device *dev, uint32_t bar, void *addr); diff --git a/lib/env_dpdk/pci.c b/lib/env_dpdk/pci.c index b9c56b825..77b9da6ed 100644 --- a/lib/env_dpdk/pci.c +++ b/lib/env_dpdk/pci.c @@ -141,6 +141,34 @@ spdk_pci_enumerate(struct spdk_pci_enum_ctx *ctx, return 0; } +struct spdk_pci_device * +spdk_pci_get_device(struct spdk_pci_addr *pci_addr) +{ + struct rte_pci_device *dev; + struct rte_pci_addr addr; + int rc; + + addr.domain = pci_addr->domain; + addr.bus = pci_addr->bus; + addr.devid = pci_addr->dev; + addr.function = pci_addr->func; + + TAILQ_FOREACH(dev, &pci_device_list, next) { + rc = rte_eal_compare_pci_addr(&dev->addr, &addr); + if (rc < 0) { + continue; + } + + if (rc == 0) { + return (struct spdk_pci_device *)dev; + } else { + break; + } + } + + return NULL; +} + int spdk_pci_device_map_bar(struct spdk_pci_device *device, uint32_t bar, void **mapped_addr, uint64_t *phys_addr, uint64_t *size)