diff options
author | Kristofer Jonsson <kristofer.jonsson@arm.com> | 2023-01-20 13:38:13 +0100 |
---|---|---|
committer | Kristofer Jonsson <kristofer.jonsson@arm.com> | 2023-02-02 16:30:39 +0100 |
commit | ec47704ab3fd50a9ef8339f33139ddae4caa00b6 (patch) | |
tree | 87698ce04f75b460580dfbc637d453dbfc141c37 /kernel/ethosu_buffer.c | |
parent | d779a08a0f7ca3cdde16941720ddc7af96e74520 (diff) | |
download | ethos-u-linux-driver-stack-ec47704ab3fd50a9ef8339f33139ddae4caa00b6.tar.gz |
Break circulare dependency on struct ethosu_device
The 'struct ethosu_device' has been passed as argument to classes.
This creates a circular dependency dependency and it gives all
classes full visibility to all resources in the device struct. This
patch removes the circular dependency.
Using device_lock() and device_unlock() to for synchronization.
Change-Id: I8322e6530c72d7bd67f48f411b4f14b612be2706
Diffstat (limited to 'kernel/ethosu_buffer.c')
-rw-r--r-- | kernel/ethosu_buffer.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/kernel/ethosu_buffer.c b/kernel/ethosu_buffer.c index a83a95a..0fcbf3b 100644 --- a/kernel/ethosu_buffer.c +++ b/kernel/ethosu_buffer.c @@ -89,21 +89,24 @@ static void ethosu_buffer_destroy(struct kref *kref) { struct ethosu_buffer *buf = container_of(kref, struct ethosu_buffer, kref); + struct device *dev = buf->dev; + struct rproc *rproc = rproc_get_by_child(dev); - dev_info(buf->edev->dev, "Buffer destroy. buf=0x%pK\n", buf); + dev_info(dev, "Buffer destroy. buf=0x%pK\n", buf); - dma_free_coherent(buf->dev, buf->capacity, buf->cpu_addr, + dma_free_coherent(rproc->dev.parent, buf->capacity, buf->cpu_addr, buf->dma_addr); - devm_kfree(buf->edev->dev, buf); + devm_kfree(dev, buf); } static int ethosu_buffer_release(struct inode *inode, struct file *file) { struct ethosu_buffer *buf = file->private_data; + struct device *dev = buf->dev; - dev_info(buf->edev->dev, "Buffer release. file=0x%pK, buf=0x%pK\n", + dev_info(dev, "Buffer release. file=0x%pK, buf=0x%pK\n", file, buf); ethosu_buffer_put(buf); @@ -115,12 +118,13 @@ static int ethosu_buffer_mmap(struct file *file, struct vm_area_struct *vma) { struct ethosu_buffer *buf = file->private_data; + struct device *dev = buf->dev; int ret; - dev_info(buf->edev->dev, "Buffer mmap. file=0x%pK, buf=0x%pK\n", + dev_info(dev, "Buffer mmap. file=0x%pK, buf=0x%pK\n", file, buf); - ret = dma_mmap_coherent(buf->edev->dev, vma, buf->cpu_addr, + ret = dma_mmap_coherent(dev, vma, buf->cpu_addr, buf->dma_addr, buf->capacity); return ret; @@ -131,14 +135,15 @@ static long ethosu_buffer_ioctl(struct file *file, unsigned long arg) { struct ethosu_buffer *buf = file->private_data; + struct device *dev = buf->dev; void __user *udata = (void __user *)arg; int ret = -EINVAL; - ret = mutex_lock_interruptible(&buf->edev->mutex); + ret = device_lock_interruptible(dev); if (ret) return ret; - dev_info(buf->edev->dev, + dev_info(dev, "Buffer ioctl. file=0x%pK, buf=0x%pK, cmd=0x%x, arg=%lu\n", file, buf, cmd, arg); @@ -149,7 +154,7 @@ static long ethosu_buffer_ioctl(struct file *file, if (copy_from_user(&uapi, udata, sizeof(uapi))) break; - dev_info(buf->edev->dev, + dev_info(dev, "Buffer ioctl: Buffer set. size=%u, offset=%u\n", uapi.size, uapi.offset); @@ -162,7 +167,7 @@ static long ethosu_buffer_ioctl(struct file *file, uapi.size = buf->size; uapi.offset = buf->offset; - dev_info(buf->edev->dev, + dev_info(dev, "Buffer ioctl: Buffer get. size=%u, offset=%u\n", uapi.size, uapi.offset); @@ -173,40 +178,38 @@ static long ethosu_buffer_ioctl(struct file *file, break; } default: { - dev_err(buf->edev->dev, "Invalid ioctl. cmd=%u, arg=%lu", + dev_err(dev, "Invalid ioctl. cmd=%u, arg=%lu", cmd, arg); break; } } - mutex_unlock(&buf->edev->mutex); + device_unlock(dev); return ret; } -int ethosu_buffer_create(struct ethosu_device *edev, +int ethosu_buffer_create(struct device *dev, size_t capacity) { - struct rproc *rproc = rproc_get_by_child(edev->dev); - struct device *dev = rproc->dev.parent; + struct rproc *rproc = rproc_get_by_child(dev); struct ethosu_buffer *buf; int ret = -ENOMEM; if (!capacity) return -EINVAL; - buf = devm_kzalloc(edev->dev, sizeof(*buf), GFP_KERNEL); + buf = devm_kzalloc(dev, sizeof(*buf), GFP_KERNEL); if (!buf) return -ENOMEM; - buf->edev = edev; buf->dev = dev; buf->capacity = capacity; buf->offset = 0; buf->size = 0; kref_init(&buf->kref); - buf->cpu_addr = dma_alloc_coherent(dev, capacity, + buf->cpu_addr = dma_alloc_coherent(rproc->dev.parent, capacity, &buf->dma_addr, GFP_KERNEL); if (!buf->cpu_addr) goto free_buf; @@ -219,7 +222,7 @@ int ethosu_buffer_create(struct ethosu_device *edev, buf->file = fget(ret); fput(buf->file); - dev_info(buf->edev->dev, + dev_info(dev, "Buffer create. file=0x%pK, fd=%d, buf=0x%pK, capacity=%zu, cpu_addr=0x%pK, dma_addr=0x%llx, phys_addr=0x%llx\n", buf->file, ret, buf, capacity, buf->cpu_addr, buf->dma_addr, virt_to_phys(buf->cpu_addr)); @@ -227,11 +230,11 @@ int ethosu_buffer_create(struct ethosu_device *edev, return ret; free_dma: - dma_free_coherent(buf->edev->dev, buf->capacity, buf->cpu_addr, + dma_free_coherent(rproc->dev.parent, buf->capacity, buf->cpu_addr, buf->dma_addr); free_buf: - devm_kfree(buf->edev->dev, buf); + devm_kfree(dev, buf); return ret; } |