env_dpdk: NVMe and IOAT drivers are always registered.

Change-Id: I46ea311e9d8972641c4c4c6d764955847b1f9786
Signed-off-by: Cunyin Chang <cunyin.chang@intel.com>
This commit is contained in:
Cunyin Chang 2016-11-15 08:37:12 +08:00 committed by Ben Walker
parent 56306a468f
commit 1c6cd96ee4

View File

@ -44,9 +44,14 @@
#include <stdbool.h>
#include <rte_config.h>
#include <rte_eal.h>
#include <rte_pci.h>
#include <rte_version.h>
#if RTE_VERSION < RTE_VERSION_NUM(16, 11, 0, 0)
#include <rte_dev.h>
#endif
#define spdk_pci_device rte_pci_device
#ifdef __FreeBSD__
@ -63,8 +68,9 @@
struct spdk_pci_enum_ctx {
struct rte_pci_driver driver;
spdk_pci_enum_cb enum_cb;
void *enum_ctx;
spdk_pci_enum_cb cb_fn;
void *cb_arg;
pthread_mutex_t mtx;
};
static struct rte_pci_id nvme_pci_driver_id[] = {
@ -139,6 +145,16 @@ spdk_pci_device_init(struct rte_pci_driver *driver,
{
struct spdk_pci_enum_ctx *ctx = (struct spdk_pci_enum_ctx *)driver;
if (!ctx->cb_fn) {
#if RTE_VERSION >= RTE_VERSION_NUM(16, 11, 0, 0)
rte_eal_pci_unmap_device(device);
#endif
/* Return a positive value to indicate that this device does not belong to this driver, but
* this isn't an error. */
return 1;
}
if (device->kdrv == RTE_KDRV_VFIO) {
/*
* TODO: This is a workaround for an issue where the device is not ready after VFIO reset.
@ -147,7 +163,7 @@ spdk_pci_device_init(struct rte_pci_driver *driver,
usleep(500 * 1000);
}
return ctx->enum_cb(ctx->enum_ctx, (struct spdk_pci_device *)device);
return ctx->cb_fn(ctx->cb_arg, (struct spdk_pci_device *)device);
}
static int
@ -156,44 +172,124 @@ spdk_pci_device_fini(struct rte_pci_device *device)
return 0;
}
static struct spdk_pci_enum_ctx g_nvme_pci_drv = {
.driver = {
.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
.id_table = nvme_pci_driver_id,
#if RTE_VERSION >= RTE_VERSION_NUM(16, 11, 0, 0)
.probe = spdk_pci_device_init,
.remove = spdk_pci_device_fini,
#else
.devinit = spdk_pci_device_init,
.devuninit = spdk_pci_device_fini,
#endif
},
.cb_fn = NULL,
.cb_arg = NULL,
.mtx = PTHREAD_MUTEX_INITIALIZER,
};
#if RTE_VERSION >= RTE_VERSION_NUM(16, 11, 0, 0)
RTE_PMD_REGISTER_PCI(spdk_nvme, g_nvme_pci_drv.driver);
#else
static int
spdk_nvme_drv_register(const char *name __rte_unused, const char *params __rte_unused)
{
rte_eal_pci_register(&g_nvme_pci_drv.driver);
return 0;
}
static struct rte_driver g_nvme_drv = {
.type = PMD_PDEV,
.init = spdk_nvme_drv_register,
};
PMD_REGISTER_DRIVER(g_nvme_drv, spdk_nvme);
#endif
static struct spdk_pci_enum_ctx g_ioat_pci_drv = {
.driver = {
.drv_flags = RTE_PCI_DRV_NEED_MAPPING,
.id_table = ioat_driver_id,
#if RTE_VERSION >= RTE_VERSION_NUM(16, 11, 0, 0)
.probe = spdk_pci_device_init,
.remove = spdk_pci_device_fini,
#else
.devinit = spdk_pci_device_init,
.devuninit = spdk_pci_device_fini,
#endif
},
.cb_fn = NULL,
.cb_arg = NULL,
.mtx = PTHREAD_MUTEX_INITIALIZER,
};
#if RTE_VERSION >= RTE_VERSION_NUM(16, 11, 0, 0)
RTE_PMD_REGISTER_PCI(spdk_ioat, g_ioat_pci_drv.driver);
#else
static int
spdk_ioat_drv_register(const char *name __rte_unused, const char *params __rte_unused)
{
rte_eal_pci_register(&g_ioat_pci_drv.driver);
return 0;
}
static struct rte_driver g_ioat_drv = {
.type = PMD_PDEV,
.init = spdk_ioat_drv_register,
};
PMD_REGISTER_DRIVER(g_ioat_drv, spdk_ioat);
#endif
/* Note: You can call spdk_pci_enumerate from more than one thread
* simultaneously safely, but you cannot call spdk_pci_enumerate
* and rte_eal_pci_probe simultaneously.
*/
int
spdk_pci_enumerate(enum spdk_pci_device_type type,
spdk_pci_enum_cb enum_cb,
void *enum_ctx)
{
struct spdk_pci_enum_ctx ctx = {};
int rc;
const char *name;
struct spdk_pci_enum_ctx *ctx;
if (type == SPDK_PCI_DEVICE_NVME) {
name = "SPDK NVMe";
ctx.driver.id_table = nvme_pci_driver_id;
ctx = &g_nvme_pci_drv;
} else if (type == SPDK_PCI_DEVICE_IOAT) {
name = "SPDK IOAT";
ctx.driver.id_table = ioat_driver_id;
ctx = &g_ioat_pci_drv;
} else {
return -1;
}
ctx.enum_cb = enum_cb;
ctx.enum_ctx = enum_ctx;
ctx.driver.drv_flags = RTE_PCI_DRV_NEED_MAPPING;
#if RTE_VERSION >= RTE_VERSION_NUM(16, 11, 0, 0)
ctx.driver.probe = spdk_pci_device_init;
ctx.driver.remove = spdk_pci_device_fini;
ctx.driver.driver.name = name;
#else
ctx.driver.devinit = spdk_pci_device_init;
ctx.driver.devuninit = spdk_pci_device_fini;
ctx.driver.name = name;
#endif
pthread_mutex_lock(&ctx->mtx);
rte_eal_pci_register(&ctx.driver);
rc = rte_eal_pci_probe();
rte_eal_pci_unregister(&ctx.driver);
ctx->cb_fn = enum_cb;
ctx->cb_arg = enum_ctx;
return rc;
if (rte_eal_pci_scan() != 0) {
ctx->cb_arg = NULL;
ctx->cb_fn = NULL;
pthread_mutex_unlock(&ctx->mtx);
return -1;
}
if (rte_eal_pci_probe() != 0) {
ctx->cb_arg = NULL;
ctx->cb_fn = NULL;
pthread_mutex_unlock(&ctx->mtx);
return -1;
}
ctx->cb_arg = NULL;
ctx->cb_fn = NULL;
pthread_mutex_unlock(&ctx->mtx);
return 0;
}
int