X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Fcommon%2Feal_common_dev.c;h=8a3bd3100a3b56046535fba19483892622442227;hb=1cdb89c177269a0756f82ae3eb057fe34e205f41;hp=62e9ed477aaf0d2288a59a40e43b81097348c0ca;hpb=01e5b16c571c146a9731d38b116c75d5e476f657;p=dpdk.git diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c index 62e9ed477a..8a3bd3100a 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. */ @@ -150,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; @@ -165,18 +166,23 @@ 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 > 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; - return 0; + return ret; err_devarg: if (rte_devargs_remove(da) != 0) { @@ -186,7 +192,7 @@ err_devarg: return ret; } -int __rte_experimental +int rte_dev_probe(const char *devargs) { struct eal_dev_mp_req req; @@ -316,13 +322,13 @@ 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; } -int __rte_experimental +int rte_dev_remove(struct rte_device *dev) { struct eal_dev_mp_req req; @@ -419,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) @@ -474,7 +480,9 @@ rte_dev_event_callback_register(const char *device_name, RTE_LOG(ERR, EAL, "The callback is already exist, no need " "to register again.\n"); + event_cb = NULL; ret = -EEXIST; + goto error; } rte_spinlock_unlock(&dev_event_lock); @@ -485,7 +493,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) @@ -520,17 +528,24 @@ rte_dev_event_callback_unregister(const char *device_name, */ if (event_cb->active == 0) { TAILQ_REMOVE(&dev_event_cbs, event_cb, next); + free(event_cb->dev_name); free(event_cb); ret++; } else { - continue; + ret = -EAGAIN; + break; } } + + /* this callback is not be registered */ + if (ret == 0) + ret = -ENOENT; + rte_spinlock_unlock(&dev_event_lock); return ret; } -void __rte_experimental +void rte_dev_event_callback_process(const char *device_name, enum rte_dev_event_type event) { @@ -556,7 +571,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) @@ -709,7 +723,6 @@ end: it->device = dev; return dev == NULL; } -__rte_experimental struct rte_device * rte_dev_iterator_next(struct rte_dev_iterator *it) { @@ -753,3 +766,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); +}