X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Fcommon%2Feal_common_dev.c;h=9e4f09d83e2e360e3ba0af622e040700cde85cdd;hb=f002ee9c8e26d2d7f0cda418d2565adc696584cf;hp=a08dc085fd8d4998cd38d10f3d2a81d1dda483f0;hpb=d27eed313929685fda8c7f223f897a7e7baa9f63;p=dpdk.git diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index a08dc085fd..9e4f09d83e 100644 --- a/lib/librte_eal/common/eal_common_dev.c +++ b/lib/librte_eal/common/eal_common_dev.c @@ -76,7 +76,7 @@ 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. */ @@ -166,12 +166,19 @@ 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 > 0) + ret = -ENOTSUP; + 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; @@ -315,7 +322,7 @@ local_dev_remove(struct rte_device *dev) if (ret) { RTE_LOG(ERR, EAL, "Driver cannot detach the device (%s)\n", dev->name); - return ret; + return (ret < 0) ? ret : -ENOENT; } return 0; @@ -418,7 +425,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) @@ -484,7 +491,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) @@ -529,7 +536,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) { @@ -555,7 +562,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) @@ -708,7 +714,6 @@ end: it->device = dev; return dev == NULL; } -__rte_experimental struct rte_device * rte_dev_iterator_next(struct rte_dev_iterator *it) { @@ -752,3 +757,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); +}