From: Sumit Garg <sumit.garg@kernel.org>
To: Jens Wiklander <jens.wiklander@linaro.org>
Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org,
op-tee@lists.trustedfirmware.org,
linux-arm-kernel@lists.infradead.org,
"Olivier Masse" <olivier.masse@nxp.com>,
"Thierry Reding" <thierry.reding@gmail.com>,
"Yong Wu" <yong.wu@mediatek.com>,
"Sumit Semwal" <sumit.semwal@linaro.org>,
"Benjamin Gaignard" <benjamin.gaignard@collabora.com>,
"Brian Starkey" <Brian.Starkey@arm.com>,
"John Stultz" <jstultz@google.com>,
"T . J . Mercier" <tjmercier@google.com>,
"Christian König" <christian.koenig@amd.com>,
"Matthias Brugger" <matthias.bgg@gmail.com>,
"AngeloGioacchino Del Regno"
<angelogioacchino.delregno@collabora.com>,
azarrabi@qti.qualcomm.com,
"Simona Vetter" <simona.vetter@ffwll.ch>,
"Daniel Stone" <daniel@fooishbar.org>,
"Rouven Czerwinski" <rouven.czerwinski@linaro.org>,
robin.murphy@arm.com
Subject: Re: [PATCH v10 6/9] tee: add tee_shm_alloc_dma_mem()
Date: Tue, 17 Jun 2025 17:02:40 +0530 [thread overview]
Message-ID: <aFFSWDiVsxA1CbCX@sumit-X1> (raw)
In-Reply-To: <20250610131600.2972232-7-jens.wiklander@linaro.org>
On Tue, Jun 10, 2025 at 03:13:50PM +0200, Jens Wiklander wrote:
> Add tee_shm_alloc_dma_mem() to allocate DMA memory. The memory is
> represented by a tee_shm object using the new flag TEE_SHM_DMA_MEM to
> identify it as DMA memory. The allocated memory will later be lent to
> the TEE to be used as protected memory.
>
> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
> ---
> drivers/tee/tee_shm.c | 85 +++++++++++++++++++++++++++++++++++++++-
> include/linux/tee_core.h | 5 +++
> 2 files changed, 88 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
> index e63095e84644..60b0f3932cee 100644
> --- a/drivers/tee/tee_shm.c
> +++ b/drivers/tee/tee_shm.c
> @@ -5,6 +5,8 @@
> #include <linux/anon_inodes.h>
> #include <linux/device.h>
> #include <linux/dma-buf.h>
> +#include <linux/dma-mapping.h>
> +#include <linux/highmem.h>
> #include <linux/idr.h>
> #include <linux/io.h>
> #include <linux/mm.h>
> @@ -13,9 +15,14 @@
> #include <linux/tee_core.h>
> #include <linux/uaccess.h>
> #include <linux/uio.h>
> -#include <linux/highmem.h>
> #include "tee_private.h"
>
> +struct tee_shm_dma_mem {
> + struct tee_shm shm;
> + dma_addr_t dma_addr;
> + struct page *page;
> +};
> +
> static void shm_put_kernel_pages(struct page **pages, size_t page_count)
> {
> size_t n;
> @@ -48,7 +55,16 @@ static void tee_shm_release(struct tee_device *teedev, struct tee_shm *shm)
> {
> void *p = shm;
>
> - if (shm->flags & TEE_SHM_DMA_BUF) {
> + if (shm->flags & TEE_SHM_DMA_MEM) {
> +#if IS_ENABLED(CONFIG_TEE_DMABUF_HEAPS)
nit: this config check can be merged into the above if check.
> + struct tee_shm_dma_mem *dma_mem;
> +
> + dma_mem = container_of(shm, struct tee_shm_dma_mem, shm);
> + p = dma_mem;
> + dma_free_pages(&teedev->dev, shm->size, dma_mem->page,
> + dma_mem->dma_addr, DMA_BIDIRECTIONAL);
> +#endif
> + } else if (shm->flags & TEE_SHM_DMA_BUF) {
Do we need a similar config check for this flag too?
With these addressed, feel free to add:
Reviewed-by: Sumit Garg <sumit.garg@oss.qualcomm.com>
-Sumit
> struct tee_shm_dmabuf_ref *ref;
>
> ref = container_of(shm, struct tee_shm_dmabuf_ref, shm);
> @@ -303,6 +319,71 @@ struct tee_shm *tee_shm_alloc_priv_buf(struct tee_context *ctx, size_t size)
> }
> EXPORT_SYMBOL_GPL(tee_shm_alloc_priv_buf);
>
> +#if IS_ENABLED(CONFIG_TEE_DMABUF_HEAPS)
> +/**
> + * tee_shm_alloc_dma_mem() - Allocate DMA memory as shared memory object
> + * @ctx: Context that allocates the shared memory
> + * @page_count: Number of pages
> + *
> + * The allocated memory is expected to be lent (made inaccessible to the
> + * kernel) to the TEE while it's used and returned (accessible to the
> + * kernel again) before it's freed.
> + *
> + * This function should normally only be used internally in the TEE
> + * drivers.
> + *
> + * @returns a pointer to 'struct tee_shm'
> + */
> +struct tee_shm *tee_shm_alloc_dma_mem(struct tee_context *ctx,
> + size_t page_count)
> +{
> + struct tee_device *teedev = ctx->teedev;
> + struct tee_shm_dma_mem *dma_mem;
> + dma_addr_t dma_addr;
> + struct page *page;
> +
> + if (!tee_device_get(teedev))
> + return ERR_PTR(-EINVAL);
> +
> + page = dma_alloc_pages(&teedev->dev, page_count * PAGE_SIZE,
> + &dma_addr, DMA_BIDIRECTIONAL, GFP_KERNEL);
> + if (!page)
> + goto err_put_teedev;
> +
> + dma_mem = kzalloc(sizeof(*dma_mem), GFP_KERNEL);
> + if (!dma_mem)
> + goto err_free_pages;
> +
> + refcount_set(&dma_mem->shm.refcount, 1);
> + dma_mem->shm.ctx = ctx;
> + dma_mem->shm.paddr = page_to_phys(page);
> + dma_mem->dma_addr = dma_addr;
> + dma_mem->page = page;
> + dma_mem->shm.size = page_count * PAGE_SIZE;
> + dma_mem->shm.flags = TEE_SHM_DMA_MEM;
> +
> + teedev_ctx_get(ctx);
> +
> + return &dma_mem->shm;
> +
> +err_free_pages:
> + dma_free_pages(&teedev->dev, page_count * PAGE_SIZE, page, dma_addr,
> + DMA_BIDIRECTIONAL);
> +err_put_teedev:
> + tee_device_put(teedev);
> +
> + return ERR_PTR(-ENOMEM);
> +}
> +EXPORT_SYMBOL_GPL(tee_shm_alloc_dma_mem);
> +#else
> +struct tee_shm *tee_shm_alloc_dma_mem(struct tee_context *ctx,
> + size_t page_count)
> +{
> + return ERR_PTR(-EINVAL);
> +}
> +EXPORT_SYMBOL_GPL(tee_shm_alloc_dma_mem);
> +#endif
> +
> int tee_dyn_shm_alloc_helper(struct tee_shm *shm, size_t size, size_t align,
> int (*shm_register)(struct tee_context *ctx,
> struct tee_shm *shm,
> diff --git a/include/linux/tee_core.h b/include/linux/tee_core.h
> index f17710196c4c..e46a53e753af 100644
> --- a/include/linux/tee_core.h
> +++ b/include/linux/tee_core.h
> @@ -29,6 +29,8 @@
> #define TEE_SHM_POOL BIT(2) /* Memory allocated from pool */
> #define TEE_SHM_PRIV BIT(3) /* Memory private to TEE driver */
> #define TEE_SHM_DMA_BUF BIT(4) /* Memory with dma-buf handle */
> +#define TEE_SHM_DMA_MEM BIT(5) /* Memory allocated with */
> + /* dma_alloc_pages() */
>
> #define TEE_DEVICE_FLAG_REGISTERED 0x1
> #define TEE_MAX_DEV_NAME_LEN 32
> @@ -310,6 +312,9 @@ void *tee_get_drvdata(struct tee_device *teedev);
> */
> struct tee_shm *tee_shm_alloc_priv_buf(struct tee_context *ctx, size_t size);
>
> +struct tee_shm *tee_shm_alloc_dma_mem(struct tee_context *ctx,
> + size_t page_count);
> +
> int tee_dyn_shm_alloc_helper(struct tee_shm *shm, size_t size, size_t align,
> int (*shm_register)(struct tee_context *ctx,
> struct tee_shm *shm,
> --
> 2.43.0
>
WARNING: multiple messages have this Message-ID (diff)
From: Sumit Garg via OP-TEE <op-tee@lists.trustedfirmware.org>
To: Jens Wiklander <jens.wiklander@linaro.org>
Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org,
op-tee@lists.trustedfirmware.org,
linux-arm-kernel@lists.infradead.org,
"Olivier Masse" <olivier.masse@nxp.com>,
"Thierry Reding" <thierry.reding@gmail.com>,
"Yong Wu" <yong.wu@mediatek.com>,
"Sumit Semwal" <sumit.semwal@linaro.org>,
"Benjamin Gaignard" <benjamin.gaignard@collabora.com>,
"Brian Starkey" <Brian.Starkey@arm.com>,
"John Stultz" <jstultz@google.com>,
"T . J . Mercier" <tjmercier@google.com>,
"Christian König" <christian.koenig@amd.com>,
"Matthias Brugger" <matthias.bgg@gmail.com>,
"AngeloGioacchino Del Regno"
<angelogioacchino.delregno@collabora.com>,
azarrabi@qti.qualcomm.com,
"Simona Vetter" <simona.vetter@ffwll.ch>,
"Daniel Stone" <daniel@fooishbar.org>,
"Rouven Czerwinski" <rouven.czerwinski@linaro.org>,
robin.murphy@arm.com
Subject: Re: [PATCH v10 6/9] tee: add tee_shm_alloc_dma_mem()
Date: Tue, 17 Jun 2025 17:02:40 +0530 [thread overview]
Message-ID: <aFFSWDiVsxA1CbCX@sumit-X1> (raw)
In-Reply-To: <20250610131600.2972232-7-jens.wiklander@linaro.org>
On Tue, Jun 10, 2025 at 03:13:50PM +0200, Jens Wiklander wrote:
> Add tee_shm_alloc_dma_mem() to allocate DMA memory. The memory is
> represented by a tee_shm object using the new flag TEE_SHM_DMA_MEM to
> identify it as DMA memory. The allocated memory will later be lent to
> the TEE to be used as protected memory.
>
> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
> ---
> drivers/tee/tee_shm.c | 85 +++++++++++++++++++++++++++++++++++++++-
> include/linux/tee_core.h | 5 +++
> 2 files changed, 88 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
> index e63095e84644..60b0f3932cee 100644
> --- a/drivers/tee/tee_shm.c
> +++ b/drivers/tee/tee_shm.c
> @@ -5,6 +5,8 @@
> #include <linux/anon_inodes.h>
> #include <linux/device.h>
> #include <linux/dma-buf.h>
> +#include <linux/dma-mapping.h>
> +#include <linux/highmem.h>
> #include <linux/idr.h>
> #include <linux/io.h>
> #include <linux/mm.h>
> @@ -13,9 +15,14 @@
> #include <linux/tee_core.h>
> #include <linux/uaccess.h>
> #include <linux/uio.h>
> -#include <linux/highmem.h>
> #include "tee_private.h"
>
> +struct tee_shm_dma_mem {
> + struct tee_shm shm;
> + dma_addr_t dma_addr;
> + struct page *page;
> +};
> +
> static void shm_put_kernel_pages(struct page **pages, size_t page_count)
> {
> size_t n;
> @@ -48,7 +55,16 @@ static void tee_shm_release(struct tee_device *teedev, struct tee_shm *shm)
> {
> void *p = shm;
>
> - if (shm->flags & TEE_SHM_DMA_BUF) {
> + if (shm->flags & TEE_SHM_DMA_MEM) {
> +#if IS_ENABLED(CONFIG_TEE_DMABUF_HEAPS)
nit: this config check can be merged into the above if check.
> + struct tee_shm_dma_mem *dma_mem;
> +
> + dma_mem = container_of(shm, struct tee_shm_dma_mem, shm);
> + p = dma_mem;
> + dma_free_pages(&teedev->dev, shm->size, dma_mem->page,
> + dma_mem->dma_addr, DMA_BIDIRECTIONAL);
> +#endif
> + } else if (shm->flags & TEE_SHM_DMA_BUF) {
Do we need a similar config check for this flag too?
With these addressed, feel free to add:
Reviewed-by: Sumit Garg <sumit.garg@oss.qualcomm.com>
-Sumit
> struct tee_shm_dmabuf_ref *ref;
>
> ref = container_of(shm, struct tee_shm_dmabuf_ref, shm);
> @@ -303,6 +319,71 @@ struct tee_shm *tee_shm_alloc_priv_buf(struct tee_context *ctx, size_t size)
> }
> EXPORT_SYMBOL_GPL(tee_shm_alloc_priv_buf);
>
> +#if IS_ENABLED(CONFIG_TEE_DMABUF_HEAPS)
> +/**
> + * tee_shm_alloc_dma_mem() - Allocate DMA memory as shared memory object
> + * @ctx: Context that allocates the shared memory
> + * @page_count: Number of pages
> + *
> + * The allocated memory is expected to be lent (made inaccessible to the
> + * kernel) to the TEE while it's used and returned (accessible to the
> + * kernel again) before it's freed.
> + *
> + * This function should normally only be used internally in the TEE
> + * drivers.
> + *
> + * @returns a pointer to 'struct tee_shm'
> + */
> +struct tee_shm *tee_shm_alloc_dma_mem(struct tee_context *ctx,
> + size_t page_count)
> +{
> + struct tee_device *teedev = ctx->teedev;
> + struct tee_shm_dma_mem *dma_mem;
> + dma_addr_t dma_addr;
> + struct page *page;
> +
> + if (!tee_device_get(teedev))
> + return ERR_PTR(-EINVAL);
> +
> + page = dma_alloc_pages(&teedev->dev, page_count * PAGE_SIZE,
> + &dma_addr, DMA_BIDIRECTIONAL, GFP_KERNEL);
> + if (!page)
> + goto err_put_teedev;
> +
> + dma_mem = kzalloc(sizeof(*dma_mem), GFP_KERNEL);
> + if (!dma_mem)
> + goto err_free_pages;
> +
> + refcount_set(&dma_mem->shm.refcount, 1);
> + dma_mem->shm.ctx = ctx;
> + dma_mem->shm.paddr = page_to_phys(page);
> + dma_mem->dma_addr = dma_addr;
> + dma_mem->page = page;
> + dma_mem->shm.size = page_count * PAGE_SIZE;
> + dma_mem->shm.flags = TEE_SHM_DMA_MEM;
> +
> + teedev_ctx_get(ctx);
> +
> + return &dma_mem->shm;
> +
> +err_free_pages:
> + dma_free_pages(&teedev->dev, page_count * PAGE_SIZE, page, dma_addr,
> + DMA_BIDIRECTIONAL);
> +err_put_teedev:
> + tee_device_put(teedev);
> +
> + return ERR_PTR(-ENOMEM);
> +}
> +EXPORT_SYMBOL_GPL(tee_shm_alloc_dma_mem);
> +#else
> +struct tee_shm *tee_shm_alloc_dma_mem(struct tee_context *ctx,
> + size_t page_count)
> +{
> + return ERR_PTR(-EINVAL);
> +}
> +EXPORT_SYMBOL_GPL(tee_shm_alloc_dma_mem);
> +#endif
> +
> int tee_dyn_shm_alloc_helper(struct tee_shm *shm, size_t size, size_t align,
> int (*shm_register)(struct tee_context *ctx,
> struct tee_shm *shm,
> diff --git a/include/linux/tee_core.h b/include/linux/tee_core.h
> index f17710196c4c..e46a53e753af 100644
> --- a/include/linux/tee_core.h
> +++ b/include/linux/tee_core.h
> @@ -29,6 +29,8 @@
> #define TEE_SHM_POOL BIT(2) /* Memory allocated from pool */
> #define TEE_SHM_PRIV BIT(3) /* Memory private to TEE driver */
> #define TEE_SHM_DMA_BUF BIT(4) /* Memory with dma-buf handle */
> +#define TEE_SHM_DMA_MEM BIT(5) /* Memory allocated with */
> + /* dma_alloc_pages() */
>
> #define TEE_DEVICE_FLAG_REGISTERED 0x1
> #define TEE_MAX_DEV_NAME_LEN 32
> @@ -310,6 +312,9 @@ void *tee_get_drvdata(struct tee_device *teedev);
> */
> struct tee_shm *tee_shm_alloc_priv_buf(struct tee_context *ctx, size_t size);
>
> +struct tee_shm *tee_shm_alloc_dma_mem(struct tee_context *ctx,
> + size_t page_count);
> +
> int tee_dyn_shm_alloc_helper(struct tee_shm *shm, size_t size, size_t align,
> int (*shm_register)(struct tee_context *ctx,
> struct tee_shm *shm,
> --
> 2.43.0
>
next prev parent reply other threads:[~2025-06-17 11:35 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-10 13:13 [PATCH v10 0/9] TEE subsystem for protected dma-buf allocations Jens Wiklander
2025-06-10 13:13 ` Jens Wiklander
2025-06-10 13:13 ` [PATCH v10 1/9] optee: sync secure world ABI headers Jens Wiklander
2025-06-10 13:13 ` Jens Wiklander
2025-06-10 13:13 ` [PATCH v10 2/9] dma-buf: dma-heap: export declared functions Jens Wiklander
2025-06-10 13:13 ` Jens Wiklander
2025-06-17 10:14 ` Sumit Garg
2025-06-17 10:14 ` Sumit Garg via OP-TEE
2025-06-10 13:13 ` [PATCH v10 3/9] tee: implement protected DMA-heap Jens Wiklander
2025-06-10 13:13 ` Jens Wiklander
2025-06-17 10:33 ` Sumit Garg
2025-06-17 10:33 ` Sumit Garg via OP-TEE
2025-07-02 0:22 ` Amirreza Zarrabi via OP-TEE
2025-07-02 13:08 ` Jens Wiklander
2025-07-02 21:09 ` Amirreza Zarrabi via OP-TEE
2025-07-07 2:21 ` Amirreza Zarrabi via OP-TEE
2025-07-07 11:22 ` Jens Wiklander
2025-07-07 12:37 ` Sumit Garg via OP-TEE
2025-07-07 13:37 ` Jens Wiklander
2025-07-09 0:40 ` Amirreza Zarrabi via OP-TEE
2025-07-09 4:45 ` Amirreza Zarrabi via OP-TEE
2025-07-09 7:24 ` Jens Wiklander
2025-06-10 13:13 ` [PATCH v10 4/9] tee: refactor params_from_user() Jens Wiklander
2025-06-10 13:13 ` Jens Wiklander
2025-06-10 13:13 ` [PATCH v10 5/9] tee: new ioctl to a register tee_shm from a dmabuf file descriptor Jens Wiklander
2025-06-10 13:13 ` Jens Wiklander
2025-06-17 10:48 ` Sumit Garg
2025-06-17 10:48 ` Sumit Garg via OP-TEE
2025-06-18 6:47 ` Jens Wiklander
2025-07-03 7:22 ` Sumit Garg
2025-07-03 7:22 ` Sumit Garg via OP-TEE
2025-07-03 7:34 ` Jens Wiklander
2025-06-10 13:13 ` [PATCH v10 6/9] tee: add tee_shm_alloc_dma_mem() Jens Wiklander
2025-06-10 13:13 ` Jens Wiklander
2025-06-17 11:32 ` Sumit Garg [this message]
2025-06-17 11:32 ` Sumit Garg via OP-TEE
2025-06-18 7:03 ` Jens Wiklander
2025-07-03 6:28 ` Sumit Garg
2025-07-03 6:28 ` Sumit Garg via OP-TEE
2025-07-03 7:13 ` Jens Wiklander
2025-06-10 13:13 ` [PATCH v10 7/9] optee: support protected memory allocation Jens Wiklander
2025-06-10 13:13 ` Jens Wiklander
2025-06-17 11:34 ` Sumit Garg
2025-06-17 11:34 ` Sumit Garg via OP-TEE
2025-06-24 6:54 ` Amirreza Zarrabi
2025-06-24 6:54 ` Amirreza Zarrabi via OP-TEE
2025-06-24 7:38 ` Jens Wiklander
2025-06-10 13:13 ` [PATCH v10 8/9] optee: FF-A: dynamic " Jens Wiklander
2025-06-10 13:13 ` Jens Wiklander
2025-06-17 11:37 ` Sumit Garg
2025-06-17 11:37 ` Sumit Garg via OP-TEE
2025-06-10 13:13 ` [PATCH v10 9/9] optee: smc abi: " Jens Wiklander
2025-06-10 13:13 ` Jens Wiklander
2025-06-17 11:38 ` Sumit Garg
2025-06-17 11:38 ` Sumit Garg via OP-TEE
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=aFFSWDiVsxA1CbCX@sumit-X1 \
--to=sumit.garg@kernel.org \
--cc=Brian.Starkey@arm.com \
--cc=angelogioacchino.delregno@collabora.com \
--cc=azarrabi@qti.qualcomm.com \
--cc=benjamin.gaignard@collabora.com \
--cc=christian.koenig@amd.com \
--cc=daniel@fooishbar.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=jens.wiklander@linaro.org \
--cc=jstultz@google.com \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=matthias.bgg@gmail.com \
--cc=olivier.masse@nxp.com \
--cc=op-tee@lists.trustedfirmware.org \
--cc=robin.murphy@arm.com \
--cc=rouven.czerwinski@linaro.org \
--cc=simona.vetter@ffwll.ch \
--cc=sumit.semwal@linaro.org \
--cc=thierry.reding@gmail.com \
--cc=tjmercier@google.com \
--cc=yong.wu@mediatek.com \
/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: link
Be 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.