Signed-off-by: Jan Blunck <jblu...@infradead.org> --- lib/librte_eal/bsdapp/eal/rte_eal_version.map | 2 + lib/librte_eal/common/eal_common_dev.c | 68 +++++++++++++++++++++++++ lib/librte_eal/common/include/rte_dev.h | 28 ++++++++++ lib/librte_eal/linuxapp/eal/rte_eal_version.map | 2 + 4 files changed, 100 insertions(+)
diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map index 21640d6..b7d26b2 100644 --- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map +++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map @@ -166,6 +166,8 @@ DPDK_17.05 { rte_bus_find_by_device; rte_bus_find_device; rte_cpu_is_supported; + rte_eal_hotplug_add; + rte_eal_hotplug_remove; rte_log_dump; rte_log_register; rte_log_get_global_level; diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index a400ddd..477b4cf 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -92,3 +92,71 @@ int rte_eal_dev_detach(const char *name) RTE_LOG(ERR, EAL, "Driver cannot detach the device (%s)\n", name); return -EINVAL; } + +int rte_eal_hotplug_add(const char *busname, const char *devname, + const char *devargs) +{ + struct rte_bus *bus; + struct rte_device *dev; + int ret; + + bus = rte_bus_find_by_name(busname); + if (!bus) { + RTE_LOG(ERR, EAL, "Cannot find bus (%s)\n", busname); + return -ENOENT; + } + + if (!bus->plug) { + RTE_LOG(ERR, EAL, "Function plug not supported by bus (%s)\n", + bus->name); + return -ENOTSUP; + } + + ret = bus->scan(); + if (ret) + return ret; + + dev = bus->find_device(NULL, cmp_detached_dev_name, devname); + if (!dev) { + RTE_LOG(ERR, EAL, "Cannot find unplugged device (%s)\n", + devname); + return -EINVAL; + } + + ret = bus->plug(dev, devargs); + if (ret) + RTE_LOG(ERR, EAL, "Driver cannot attach the device (%s)\n", + dev->name); + return ret; +} + +int rte_eal_hotplug_remove(const char *busname, const char *devname) +{ + struct rte_bus *bus; + struct rte_device *dev; + int ret; + + bus = rte_bus_find_by_name(busname); + if (!bus) { + RTE_LOG(ERR, EAL, "Cannot find bus (%s)\n", busname); + return -ENOENT; + } + + if (!bus->unplug) { + RTE_LOG(ERR, EAL, "Function unplug not supported by bus (%s)\n", + bus->name); + return -ENOTSUP; + } + + dev = bus->find_device(NULL, cmp_dev_name, devname); + if (!dev) { + RTE_LOG(ERR, EAL, "Cannot find plugged device (%s)\n", devname); + return -EINVAL; + } + + ret = bus->unplug(dev); + if (ret) + RTE_LOG(ERR, EAL, "Driver cannot detach the device (%s)\n", + dev->name); + return ret; +} diff --git a/lib/librte_eal/common/include/rte_dev.h b/lib/librte_eal/common/include/rte_dev.h index 04d9c28..95440eb 100644 --- a/lib/librte_eal/common/include/rte_dev.h +++ b/lib/librte_eal/common/include/rte_dev.h @@ -192,6 +192,34 @@ int rte_eal_dev_attach(const char *name, const char *devargs); int rte_eal_dev_detach(const char *name); /** + * Hotplug add a given device to a specific bus. + * + * @param busname + * The bus name the device is added to. + * @param devname + * The device name. Based on this device name, eal will identify a driver + * capable of handling it and pass it to the driver probing function. + * @param devargs + * Device arguments to be passed to the driver. + * @return + * 0 on success, negative on error. + */ +int rte_eal_hotplug_add(const char *busname, const char *devname, + const char *devargs); + +/** + * Hotplug remove a given device from a specific bus. + * + * @param busname + * The bus name the device is removed from. + * @param devname + * The device name being removed. + * @return + * 0 on success, negative on error. + */ +int rte_eal_hotplug_remove(const char *busname, const char *devname); + +/** * Device comparison function. * * This type of function is used to compare an rte_device with arbitrary diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map index e0a056d..a94cb7a 100644 --- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map +++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map @@ -170,6 +170,8 @@ DPDK_17.05 { rte_bus_find_by_device; rte_bus_find_device; rte_cpu_is_supported; + rte_eal_hotplug_add; + rte_eal_hotplug_remove; rte_intr_free_epoll_fd; rte_log_dump; rte_log_get_global_level; -- 2.9.4