X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Fcommon%2Feal_common_dev.c;h=86f801da7ddb4b3651c2be536946896d25c60cd3;hb=cfe3aeb170b2f6277e6f96173599da51eab0654f;hp=0c873bfe0b0e834e6f3caab302571b753de92b22;hpb=e9d159c3d5346914934e5fc4f305c9c23aac74c2;p=dpdk.git diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index 0c873bfe0b..86f801da7d 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -76,66 +76,13 @@ static int cmp_dev_name(const struct rte_device *dev, const void *_name) return strcmp(dev->name, name); } -int __rte_experimental +int rte_dev_is_probed(const struct rte_device *dev) { /* The field driver should be set only when the probe is successful. */ return dev->driver != NULL; } -int rte_eal_dev_attach(const char *name, const char *devargs) -{ - struct rte_bus *bus; - - if (name == NULL || devargs == NULL) { - RTE_LOG(ERR, EAL, "Invalid device or arguments provided\n"); - return -EINVAL; - } - - bus = rte_bus_find_by_device_name(name); - if (bus == NULL) { - RTE_LOG(ERR, EAL, "Unable to find a bus for the device '%s'\n", - name); - return -EINVAL; - } - if (strcmp(bus->name, "pci") == 0 || strcmp(bus->name, "vdev") == 0) - return rte_eal_hotplug_add(bus->name, name, devargs); - - RTE_LOG(ERR, EAL, - "Device attach is only supported for PCI and vdev devices.\n"); - - return -ENOTSUP; -} - -int rte_eal_dev_detach(struct rte_device *dev) -{ - struct rte_bus *bus; - int ret; - - if (dev == NULL) { - RTE_LOG(ERR, EAL, "Invalid device provided.\n"); - return -EINVAL; - } - - bus = rte_bus_find_by_device(dev); - if (bus == NULL) { - RTE_LOG(ERR, EAL, "Cannot find bus for device (%s)\n", - dev->name); - return -EINVAL; - } - - if (bus->unplug == NULL) { - RTE_LOG(ERR, EAL, "Bus function not supported\n"); - return -ENOTSUP; - } - - ret = bus->unplug(dev); - if (ret) - RTE_LOG(ERR, EAL, "Driver cannot detach the device (%s)\n", - dev->name); - return ret; -} - /* helper function to build devargs, caller should free the memory */ static int build_devargs(const char *busname, const char *devname, @@ -203,10 +150,11 @@ local_dev_probe(const char *devargs, struct rte_device **new_dev) goto err_devarg; } - ret = rte_devargs_insert(da); + ret = rte_devargs_insert(&da); if (ret) goto err_devarg; + /* the rte_devargs will be referenced in the matching rte_device */ ret = da->bus->scan(); if (ret) goto err_devarg; @@ -218,18 +166,20 @@ local_dev_probe(const char *devargs, struct rte_device **new_dev) ret = -ENODEV; goto err_devarg; } + /* Since there is a matching device, it is now its responsibility + * to manage the devargs we've just inserted. From this point + * those devargs shouldn't be removed manually anymore. + */ ret = dev->bus->plug(dev); - if (ret) { - if (rte_dev_is_probed(dev)) /* if already succeeded earlier */ - return ret; /* no rollback */ + if (ret && !rte_dev_is_probed(dev)) { /* if hasn't ever succeeded */ RTE_LOG(ERR, EAL, "Driver cannot attach the device (%s)\n", dev->name); - goto err_devarg; + return ret; } *new_dev = dev; - return 0; + return ret; err_devarg: if (rte_devargs_remove(da) != 0) { @@ -239,7 +189,7 @@ err_devarg: return ret; } -int __rte_experimental +int rte_dev_probe(const char *devargs) { struct eal_dev_mp_req req; @@ -372,12 +322,10 @@ local_dev_remove(struct rte_device *dev) return ret; } - rte_devargs_remove(dev->devargs); - return 0; } -int __rte_experimental +int rte_dev_remove(struct rte_device *dev) { struct eal_dev_mp_req req; @@ -389,7 +337,7 @@ rte_dev_remove(struct rte_device *dev) return -ENOENT; } - ret = build_devargs(dev->devargs->bus->name, dev->name, "", &devargs); + ret = build_devargs(dev->bus->name, dev->name, "", &devargs); if (ret != 0) return ret; @@ -474,7 +422,7 @@ rollback: return ret; } -int __rte_experimental +int rte_dev_event_callback_register(const char *device_name, rte_dev_event_cb_fn cb_fn, void *cb_arg) @@ -540,7 +488,7 @@ error: return ret; } -int __rte_experimental +int rte_dev_event_callback_unregister(const char *device_name, rte_dev_event_cb_fn cb_fn, void *cb_arg) @@ -585,7 +533,7 @@ rte_dev_event_callback_unregister(const char *device_name, return ret; } -void __rte_experimental +void rte_dev_event_callback_process(const char *device_name, enum rte_dev_event_type event) { @@ -611,7 +559,6 @@ rte_dev_event_callback_process(const char *device_name, rte_spinlock_unlock(&dev_event_lock); } -__rte_experimental int rte_dev_iterator_init(struct rte_dev_iterator *it, const char *dev_str) @@ -764,7 +711,6 @@ end: it->device = dev; return dev == NULL; } -__rte_experimental struct rte_device * rte_dev_iterator_next(struct rte_dev_iterator *it) { @@ -808,3 +754,37 @@ out: free(cls_str); return it->device; } + +int +rte_dev_dma_map(struct rte_device *dev, void *addr, uint64_t iova, + size_t len) +{ + if (dev->bus->dma_map == NULL || len == 0) { + rte_errno = ENOTSUP; + return -1; + } + /* Memory must be registered through rte_extmem_* APIs */ + if (rte_mem_virt2memseg_list(addr) == NULL) { + rte_errno = EINVAL; + return -1; + } + + return dev->bus->dma_map(dev, addr, iova, len); +} + +int +rte_dev_dma_unmap(struct rte_device *dev, void *addr, uint64_t iova, + size_t len) +{ + if (dev->bus->dma_unmap == NULL || len == 0) { + rte_errno = ENOTSUP; + return -1; + } + /* Memory must be registered through rte_extmem_* APIs */ + if (rte_mem_virt2memseg_list(addr) == NULL) { + rte_errno = EINVAL; + return -1; + } + + return dev->bus->dma_unmap(dev, addr, iova, len); +}