From: Alexandre Bailon <abailon@baylibre.com> To: linux-remoteproc@vger.kernel.org Cc: ohad@wizery.com, bjorn.andersson@linaro.org, sumit.semwal@linaro.org, christian.koenig@amd.com, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, jstephan@baylibre.com, stephane.leprovost@mediatek.com, gpain@baylibre.com, mturquette@baylibre.com, Alexandre Bailon <abailon@baylibre.com> Subject: [RFC PATCH 4/4] rpmsg: apu_rpmsg: Add an IOCTL to request IOMMU mapping Date: Wed, 30 Sep 2020 13:53:50 +0200 [thread overview] Message-ID: <20200930115350.5272-5-abailon@baylibre.com> (raw) In-Reply-To: <20200930115350.5272-1-abailon@baylibre.com> Currently, the kernel is automatically doing an IOMMU memory mapping. But we want to do it automatically for two reasons: - to reduce the overhead of each APU operation - to get the device address and use it as input for an operation This adds 2 IOCTL to manually IOMMU map and unmap memory. Signed-off-by: Alexandre Bailon <abailon@baylibre.com> --- drivers/rpmsg/apu_rpmsg.c | 52 ++++++++++++++++++++++++++++++---- include/uapi/linux/apu_rpmsg.h | 7 +++++ 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/drivers/rpmsg/apu_rpmsg.c b/drivers/rpmsg/apu_rpmsg.c index 343bd08a859a..4c064feddf5a 100644 --- a/drivers/rpmsg/apu_rpmsg.c +++ b/drivers/rpmsg/apu_rpmsg.c @@ -114,7 +114,7 @@ static int apu_rpmsg_callback(struct rpmsg_device *rpdev, void *data, int count, } static struct apu_buffer *apu_device_memory_map(struct rpmsg_apu *apu, - uint32_t fd, struct rpmsg_request *rpmsg_req) + uint32_t fd) { struct rpmsg_device *rpdev = apu->rpdev; struct apu_buffer *buffer; @@ -129,10 +129,6 @@ static struct apu_buffer *apu_device_memory_map(struct rpmsg_apu *apu, list_for_each_entry(buffer, &apu->buffers, node) { if (buffer->fd == fd) { kref_get(&buffer->refcount); - if (rpmsg_req) - list_add(&buffer->req_node, - &rpmsg_req->buffers); - return buffer; } } @@ -230,6 +226,44 @@ static void apu_device_memory_unmap(struct kref *ref) kfree(buffer); } +static int apu_iommu_mmap_ioctl(struct rpmsg_apu *apu, void __user *argp) +{ + struct apu_iommu_mmap apu_iommu_mmap; + struct apu_buffer *buffer; + int ret; + + if (copy_from_user(&apu_iommu_mmap, argp, sizeof(apu_iommu_mmap))) + return -EFAULT; + + buffer = apu_device_memory_map(apu, apu_iommu_mmap.fd); + if (!buffer) + return -ENOMEM; + + apu_iommu_mmap.da = buffer->iova; + if (copy_to_user(argp, &apu_iommu_mmap, sizeof(apu_iommu_mmap))) + ret = -EFAULT; + + return 0; +} + +static int apu_iommu_munmap_ioctl(struct rpmsg_apu *apu, void __user *argp) +{ + u32 fd; + struct apu_buffer *buffer, *tmp; + + if (copy_from_user(&fd, argp, sizeof(fd))) + return -EFAULT; + + list_for_each_entry_safe(buffer, tmp, &apu->buffers, node) { + if (buffer->fd == fd) { + kref_put(&buffer->refcount, apu_device_memory_unmap); + return 0; + } + } + + return -EINVAL; +} + static int apu_send_request(struct rpmsg_apu *apu, struct apu_request *req) { @@ -266,7 +300,7 @@ static int apu_send_request(struct rpmsg_apu *apu, INIT_LIST_HEAD(&rpmsg_req->buffers); for (i = 0; i < req->count; i++) { - buffer = apu_device_memory_map(apu, fd[i], rpmsg_req); + buffer = apu_device_memory_map(apu, fd[i]); if (IS_ERR(buffer)) { ret = PTR_ERR(buffer); goto err_free_memory; @@ -417,6 +451,12 @@ static long rpmsg_eptdev_ioctl(struct file *fp, unsigned int cmd, } spin_unlock_irqrestore(&apu->ctx_lock, flags); + break; + case APU_IOMMU_MMAP: + ret = apu_iommu_mmap_ioctl(apu, argp); + break; + case APU_IOMMU_MUNMAP: + ret = apu_iommu_munmap_ioctl(apu, argp); break; default: ret = -EINVAL; diff --git a/include/uapi/linux/apu_rpmsg.h b/include/uapi/linux/apu_rpmsg.h index f61207520254..e9b841dcbcb4 100644 --- a/include/uapi/linux/apu_rpmsg.h +++ b/include/uapi/linux/apu_rpmsg.h @@ -31,10 +31,17 @@ struct apu_request { __u8 data[0]; }; +struct apu_iommu_mmap { + __u32 fd; + __u32 da; +}; + /* Send synchronous request to an APU */ #define APU_SEND_REQ_IOCTL _IOW(0xb7, 0x2, struct apu_request) #define APU_GET_NEXT_AVAILABLE_IOCTL _IOR(0xb7, 0x3, __u16) #define APU_GET_RESP _IOWR(0xb7, 0x4, struct apu_request) +#define APU_IOMMU_MMAP _IOWR(0xb7, 0x5, struct apu_iommu_mmap) +#define APU_IOMMU_MUNMAP _IOWR(0xb7, 0x6, __u32) #endif -- 2.26.2
WARNING: multiple messages have this Message-ID (diff)
From: Alexandre Bailon <abailon@baylibre.com> To: linux-remoteproc@vger.kernel.org Cc: ohad@wizery.com, gpain@baylibre.com, stephane.leprovost@mediatek.com, jstephan@baylibre.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, mturquette@baylibre.com, Alexandre Bailon <abailon@baylibre.com>, bjorn.andersson@linaro.org, christian.koenig@amd.com, linux-media@vger.kernel.org Subject: [RFC PATCH 4/4] rpmsg: apu_rpmsg: Add an IOCTL to request IOMMU mapping Date: Wed, 30 Sep 2020 13:53:50 +0200 [thread overview] Message-ID: <20200930115350.5272-5-abailon@baylibre.com> (raw) In-Reply-To: <20200930115350.5272-1-abailon@baylibre.com> Currently, the kernel is automatically doing an IOMMU memory mapping. But we want to do it automatically for two reasons: - to reduce the overhead of each APU operation - to get the device address and use it as input for an operation This adds 2 IOCTL to manually IOMMU map and unmap memory. Signed-off-by: Alexandre Bailon <abailon@baylibre.com> --- drivers/rpmsg/apu_rpmsg.c | 52 ++++++++++++++++++++++++++++++---- include/uapi/linux/apu_rpmsg.h | 7 +++++ 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/drivers/rpmsg/apu_rpmsg.c b/drivers/rpmsg/apu_rpmsg.c index 343bd08a859a..4c064feddf5a 100644 --- a/drivers/rpmsg/apu_rpmsg.c +++ b/drivers/rpmsg/apu_rpmsg.c @@ -114,7 +114,7 @@ static int apu_rpmsg_callback(struct rpmsg_device *rpdev, void *data, int count, } static struct apu_buffer *apu_device_memory_map(struct rpmsg_apu *apu, - uint32_t fd, struct rpmsg_request *rpmsg_req) + uint32_t fd) { struct rpmsg_device *rpdev = apu->rpdev; struct apu_buffer *buffer; @@ -129,10 +129,6 @@ static struct apu_buffer *apu_device_memory_map(struct rpmsg_apu *apu, list_for_each_entry(buffer, &apu->buffers, node) { if (buffer->fd == fd) { kref_get(&buffer->refcount); - if (rpmsg_req) - list_add(&buffer->req_node, - &rpmsg_req->buffers); - return buffer; } } @@ -230,6 +226,44 @@ static void apu_device_memory_unmap(struct kref *ref) kfree(buffer); } +static int apu_iommu_mmap_ioctl(struct rpmsg_apu *apu, void __user *argp) +{ + struct apu_iommu_mmap apu_iommu_mmap; + struct apu_buffer *buffer; + int ret; + + if (copy_from_user(&apu_iommu_mmap, argp, sizeof(apu_iommu_mmap))) + return -EFAULT; + + buffer = apu_device_memory_map(apu, apu_iommu_mmap.fd); + if (!buffer) + return -ENOMEM; + + apu_iommu_mmap.da = buffer->iova; + if (copy_to_user(argp, &apu_iommu_mmap, sizeof(apu_iommu_mmap))) + ret = -EFAULT; + + return 0; +} + +static int apu_iommu_munmap_ioctl(struct rpmsg_apu *apu, void __user *argp) +{ + u32 fd; + struct apu_buffer *buffer, *tmp; + + if (copy_from_user(&fd, argp, sizeof(fd))) + return -EFAULT; + + list_for_each_entry_safe(buffer, tmp, &apu->buffers, node) { + if (buffer->fd == fd) { + kref_put(&buffer->refcount, apu_device_memory_unmap); + return 0; + } + } + + return -EINVAL; +} + static int apu_send_request(struct rpmsg_apu *apu, struct apu_request *req) { @@ -266,7 +300,7 @@ static int apu_send_request(struct rpmsg_apu *apu, INIT_LIST_HEAD(&rpmsg_req->buffers); for (i = 0; i < req->count; i++) { - buffer = apu_device_memory_map(apu, fd[i], rpmsg_req); + buffer = apu_device_memory_map(apu, fd[i]); if (IS_ERR(buffer)) { ret = PTR_ERR(buffer); goto err_free_memory; @@ -417,6 +451,12 @@ static long rpmsg_eptdev_ioctl(struct file *fp, unsigned int cmd, } spin_unlock_irqrestore(&apu->ctx_lock, flags); + break; + case APU_IOMMU_MMAP: + ret = apu_iommu_mmap_ioctl(apu, argp); + break; + case APU_IOMMU_MUNMAP: + ret = apu_iommu_munmap_ioctl(apu, argp); break; default: ret = -EINVAL; diff --git a/include/uapi/linux/apu_rpmsg.h b/include/uapi/linux/apu_rpmsg.h index f61207520254..e9b841dcbcb4 100644 --- a/include/uapi/linux/apu_rpmsg.h +++ b/include/uapi/linux/apu_rpmsg.h @@ -31,10 +31,17 @@ struct apu_request { __u8 data[0]; }; +struct apu_iommu_mmap { + __u32 fd; + __u32 da; +}; + /* Send synchronous request to an APU */ #define APU_SEND_REQ_IOCTL _IOW(0xb7, 0x2, struct apu_request) #define APU_GET_NEXT_AVAILABLE_IOCTL _IOR(0xb7, 0x3, __u16) #define APU_GET_RESP _IOWR(0xb7, 0x4, struct apu_request) +#define APU_IOMMU_MMAP _IOWR(0xb7, 0x5, struct apu_iommu_mmap) +#define APU_IOMMU_MUNMAP _IOWR(0xb7, 0x6, __u32) #endif -- 2.26.2 _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2020-09-30 11:53 UTC|newest] Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-09-30 11:53 [RFC PATCH 0/4] Add a RPMsg driver to support AI Processing Unit (APU) Alexandre Bailon 2020-09-30 11:53 ` Alexandre Bailon 2020-09-30 11:53 ` [RFC PATCH 1/4] Add a RPMSG driver for the APU in the mt8183 Alexandre Bailon 2020-09-30 11:53 ` Alexandre Bailon 2020-10-14 22:55 ` Mathieu Poirier 2020-10-14 22:55 ` Mathieu Poirier 2020-10-15 16:33 ` Mathieu Poirier 2020-10-15 16:33 ` Mathieu Poirier 2021-07-20 8:24 ` Alexandre Bailon 2021-07-20 8:24 ` Alexandre Bailon 2020-09-30 11:53 ` [RFC PATCH 2/4] rpmsg: apu_rpmsg: Add support for async apu request Alexandre Bailon 2020-09-30 11:53 ` Alexandre Bailon 2020-09-30 11:53 ` [RFC PATCH 3/4] rpmsg: apu_rpmsg: update the way to store IOMMU mapping Alexandre Bailon 2020-09-30 11:53 ` Alexandre Bailon 2020-09-30 11:53 ` Alexandre Bailon [this message] 2020-09-30 11:53 ` [RFC PATCH 4/4] rpmsg: apu_rpmsg: Add an IOCTL to request " Alexandre Bailon 2020-10-01 8:48 ` [RFC PATCH 0/4] Add a RPMsg driver to support AI Processing Unit (APU) Daniel Vetter 2020-10-01 8:48 ` Daniel Vetter 2020-10-01 17:28 ` Alexandre Bailon 2020-10-01 17:28 ` Alexandre Bailon 2020-10-02 9:35 ` Daniel Vetter 2020-10-02 9:35 ` Daniel Vetter
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200930115350.5272-5-abailon@baylibre.com \ --to=abailon@baylibre.com \ --cc=bjorn.andersson@linaro.org \ --cc=christian.koenig@amd.com \ --cc=dri-devel@lists.freedesktop.org \ --cc=gpain@baylibre.com \ --cc=jstephan@baylibre.com \ --cc=linaro-mm-sig@lists.linaro.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-media@vger.kernel.org \ --cc=linux-remoteproc@vger.kernel.org \ --cc=mturquette@baylibre.com \ --cc=ohad@wizery.com \ --cc=stephane.leprovost@mediatek.com \ --cc=sumit.semwal@linaro.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.