diff options
Diffstat (limited to 'kernel/ethosu_network.c')
-rw-r--r-- | kernel/ethosu_network.c | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/kernel/ethosu_network.c b/kernel/ethosu_network.c index f7871de..58d5c77 100644 --- a/kernel/ethosu_network.c +++ b/kernel/ethosu_network.c @@ -23,8 +23,8 @@ #include "ethosu_network.h" -#include "ethosu_buffer.h" #include "ethosu_device.h" +#include "ethosu_dma_mem.h" #include "ethosu_inference.h" #include "ethosu_network_info.h" #include "uapi/ethosu.h" @@ -70,8 +70,8 @@ static void ethosu_network_destroy(struct kref *kref) dev_dbg(dev, "Network destroy. net=0x%pK\n", net); - if (net->buf != NULL) - ethosu_buffer_put(net->buf); + if (net->dma_mem != NULL) + ethosu_dma_mem_free(&net->dma_mem); memset(net, 0, sizeof(*net)); devm_kfree(dev, net); @@ -151,7 +151,8 @@ int ethosu_network_create(struct device *dev, struct ethosu_uapi_network_create *uapi) { struct ethosu_network *net; - int ret = -ENOMEM; + const void __user *data; + int ret; net = devm_kzalloc(dev, sizeof(*net), GFP_KERNEL); if (!net) @@ -159,17 +160,34 @@ int ethosu_network_create(struct device *dev, net->dev = dev; net->mailbox = mailbox; - net->buf = NULL; kref_init(&net->kref); switch (uapi->type) { - case ETHOSU_UAPI_NETWORK_BUFFER: - net->buf = ethosu_buffer_get_from_fd(uapi->fd); - if (IS_ERR(net->buf)) { - ret = PTR_ERR(net->buf); + case ETHOSU_UAPI_NETWORK_USER_BUFFER: + if (!uapi->network.data_ptr) { + dev_err(dev, "Invalid network data ptr\n"); + ret = -EINVAL; goto free_net; } + if (!uapi->network.size) { + dev_err(dev, "Invalid network data size\n"); + ret = -EINVAL; + goto free_net; + } + + net->dma_mem = ethosu_dma_mem_alloc(dev, uapi->network.size); + if (IS_ERR(net->dma_mem)) { + ret = PTR_ERR(net->dma_mem); + goto free_net; + } + + data = u64_to_user_ptr(uapi->network.data_ptr); + ret = copy_from_user(net->dma_mem->cpu_addr, data, + uapi->network.size); + if (ret) + goto free_dma_mem; + break; case ETHOSU_UAPI_NETWORK_INDEX: net->index = uapi->index; @@ -182,20 +200,20 @@ int ethosu_network_create(struct device *dev, ret = anon_inode_getfd("ethosu-network", ðosu_network_fops, net, O_RDWR | O_CLOEXEC); if (ret < 0) - goto put_buf; + goto free_dma_mem; net->file = fget(ret); fput(net->file); dev_dbg(dev, "Network create. file=0x%pK, fd=%d, net=0x%pK, buf=0x%pK, index=%u", - net->file, ret, net, net->buf, net->index); + net->file, ret, net, net->dma_mem, net->index); return ret; -put_buf: - if (net->buf != NULL) - ethosu_buffer_put(net->buf); +free_dma_mem: + if (net->dma_mem != NULL) + ethosu_dma_mem_free(&net->dma_mem); free_net: memset(net, 0, sizeof(*net)); |