From: Robin Murphy <robin.murphy@arm.com>
To: Jens Wiklander <jens.wiklander@linaro.org>,
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
Cc: "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>,
"Sumit Garg" <sumit.garg@kernel.org>,
"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>
Subject: Re: [PATCH v8 11/14] tee: add tee_shm_alloc_cma_phys_mem()
Date: Fri, 2 May 2025 16:11:26 +0100 [thread overview]
Message-ID: <4b2f7c31-c61b-45d8-b32e-16bb91c4289b@arm.com> (raw)
In-Reply-To: <20250502100049.1746335-12-jens.wiklander@linaro.org>
On 02/05/2025 10:59 am, Jens Wiklander wrote:
> Add tee_shm_alloc_cma_phys_mem() to allocate a physical memory using
> from the default CMA pool. The memory is represented by a tee_shm object
> using the new flag TEE_SHM_CMA_BUF to identify it as physical memory
> from CMA.
If and when it's possible to dynamically delegate any old kernel memory
to the TEE, it's far from clear why that should involve poking around in
CMA internals...
> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
> ---
> drivers/tee/tee_shm.c | 55 ++++++++++++++++++++++++++++++++++++++--
> include/linux/tee_core.h | 4 +++
> 2 files changed, 57 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
> index e1ed52ee0a16..faaa0a87bb18 100644
> --- a/drivers/tee/tee_shm.c
> +++ b/drivers/tee/tee_shm.c
> @@ -3,8 +3,11 @@
> * Copyright (c) 2015-2017, 2019-2021 Linaro Limited
> */
> #include <linux/anon_inodes.h>
> +#include <linux/cma.h>
> #include <linux/device.h>
> #include <linux/dma-buf.h>
> +#include <linux/dma-map-ops.h>
> +#include <linux/highmem.h>
> #include <linux/idr.h>
> #include <linux/io.h>
> #include <linux/mm.h>
> @@ -13,7 +16,6 @@
> #include <linux/tee_core.h>
> #include <linux/uaccess.h>
> #include <linux/uio.h>
> -#include <linux/highmem.h>
> #include "tee_private.h"
>
> static void shm_put_kernel_pages(struct page **pages, size_t page_count)
> @@ -49,7 +51,14 @@ static void tee_shm_release(struct tee_device *teedev, struct tee_shm *shm)
> struct tee_shm *parent_shm = NULL;
> void *p = shm;
>
> - if (shm->flags & TEE_SHM_DMA_BUF) {
> + if (shm->flags & TEE_SHM_CMA_BUF) {
> +#if IS_ENABLED(CONFIG_CMA)
> + struct page *page = phys_to_page(shm->paddr);
> + struct cma *cma = dev_get_cma_area(&shm->ctx->teedev->dev);
If you want dma_contiguous_default_area as the commit message implies,
use dma_contiguous_default_area. Appearing to support per-device CMA
pools but relying on the device not having one is pretty yucky.
But again, why? If you want page-backed DMA-able memory, with all the
other assumptions being made here, you may as well just rely on
dma_alloc_pages(DMA_ATTR_SKIP_CPU_SYNC) doing what you want, while also
being potentially more flexible for !CMA and non-invasive. Or at the
very least, could the TEE delegation not be composed on top of the
existing CMA heap allocator?
Thanks,
Robin.
> +
> + cma_release(cma, page, shm->size / PAGE_SIZE);
> +#endif
> + } else if (shm->flags & TEE_SHM_DMA_BUF) {
> struct tee_shm_dmabuf_ref *ref;
>
> ref = container_of(shm, struct tee_shm_dmabuf_ref, shm);
> @@ -306,6 +315,48 @@ struct tee_shm *tee_shm_alloc_priv_buf(struct tee_context *ctx, size_t size)
> }
> EXPORT_SYMBOL_GPL(tee_shm_alloc_priv_buf);
>
> +struct tee_shm *tee_shm_alloc_cma_phys_mem(struct tee_context *ctx,
> + size_t page_count, size_t align)
> +{
> +#if IS_ENABLED(CONFIG_CMA)
> + struct tee_device *teedev = ctx->teedev;
> + struct cma *cma = dev_get_cma_area(&teedev->dev);
> + struct tee_shm *shm;
> + struct page *page;
> +
> + if (!tee_device_get(teedev))
> + return ERR_PTR(-EINVAL);
> +
> + page = cma_alloc(cma, page_count, align, true/*no_warn*/);
> + if (!page)
> + goto err_put_teedev;
> +
> + shm = kzalloc(sizeof(*shm), GFP_KERNEL);
> + if (!shm)
> + goto err_cma_crelease;
> +
> + refcount_set(&shm->refcount, 1);
> + shm->ctx = ctx;
> + shm->paddr = page_to_phys(page);
> + shm->size = page_count * PAGE_SIZE;
> + shm->flags = TEE_SHM_CMA_BUF;
> +
> + teedev_ctx_get(ctx);
> +
> + return shm;
> +
> +err_cma_crelease:
> + cma_release(cma, page, page_count);
> +err_put_teedev:
> + tee_device_put(teedev);
> +
> + return ERR_PTR(-ENOMEM);
> +#else
> + return ERR_PTR(-EINVAL);
> +#endif
> +}
> +EXPORT_SYMBOL_GPL(tee_shm_alloc_cma_phys_mem);
> +
> 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 02c07f661349..3a4e1b00fcc7 100644
> --- a/include/linux/tee_core.h
> +++ b/include/linux/tee_core.h
> @@ -29,6 +29,7 @@
> #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_CMA_BUF BIT(5) /* CMA allocated memory */
>
> #define TEE_DEVICE_FLAG_REGISTERED 0x1
> #define TEE_MAX_DEV_NAME_LEN 32
> @@ -310,6 +311,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_cma_phys_mem(struct tee_context *ctx,
> + size_t page_count, size_t align);
> +
> 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,
WARNING: multiple messages have this Message-ID (diff)
From: Robin Murphy <robin.murphy@arm.com>
To: op-tee@lists.trustedfirmware.org
Subject: Re: [PATCH v8 11/14] tee: add tee_shm_alloc_cma_phys_mem()
Date: Fri, 02 May 2025 16:11:26 +0100 [thread overview]
Message-ID: <4b2f7c31-c61b-45d8-b32e-16bb91c4289b@arm.com> (raw)
In-Reply-To: <20250502100049.1746335-12-jens.wiklander@linaro.org>
[-- Attachment #1: Type: text/plain, Size: 5158 bytes --]
On 02/05/2025 10:59 am, Jens Wiklander wrote:
> Add tee_shm_alloc_cma_phys_mem() to allocate a physical memory using
> from the default CMA pool. The memory is represented by a tee_shm object
> using the new flag TEE_SHM_CMA_BUF to identify it as physical memory
> from CMA.
If and when it's possible to dynamically delegate any old kernel memory
to the TEE, it's far from clear why that should involve poking around in
CMA internals...
> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
> ---
> drivers/tee/tee_shm.c | 55 ++++++++++++++++++++++++++++++++++++++--
> include/linux/tee_core.h | 4 +++
> 2 files changed, 57 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
> index e1ed52ee0a16..faaa0a87bb18 100644
> --- a/drivers/tee/tee_shm.c
> +++ b/drivers/tee/tee_shm.c
> @@ -3,8 +3,11 @@
> * Copyright (c) 2015-2017, 2019-2021 Linaro Limited
> */
> #include <linux/anon_inodes.h>
> +#include <linux/cma.h>
> #include <linux/device.h>
> #include <linux/dma-buf.h>
> +#include <linux/dma-map-ops.h>
> +#include <linux/highmem.h>
> #include <linux/idr.h>
> #include <linux/io.h>
> #include <linux/mm.h>
> @@ -13,7 +16,6 @@
> #include <linux/tee_core.h>
> #include <linux/uaccess.h>
> #include <linux/uio.h>
> -#include <linux/highmem.h>
> #include "tee_private.h"
>
> static void shm_put_kernel_pages(struct page **pages, size_t page_count)
> @@ -49,7 +51,14 @@ static void tee_shm_release(struct tee_device *teedev, struct tee_shm *shm)
> struct tee_shm *parent_shm = NULL;
> void *p = shm;
>
> - if (shm->flags & TEE_SHM_DMA_BUF) {
> + if (shm->flags & TEE_SHM_CMA_BUF) {
> +#if IS_ENABLED(CONFIG_CMA)
> + struct page *page = phys_to_page(shm->paddr);
> + struct cma *cma = dev_get_cma_area(&shm->ctx->teedev->dev);
If you want dma_contiguous_default_area as the commit message implies,
use dma_contiguous_default_area. Appearing to support per-device CMA
pools but relying on the device not having one is pretty yucky.
But again, why? If you want page-backed DMA-able memory, with all the
other assumptions being made here, you may as well just rely on
dma_alloc_pages(DMA_ATTR_SKIP_CPU_SYNC) doing what you want, while also
being potentially more flexible for !CMA and non-invasive. Or at the
very least, could the TEE delegation not be composed on top of the
existing CMA heap allocator?
Thanks,
Robin.
> +
> + cma_release(cma, page, shm->size / PAGE_SIZE);
> +#endif
> + } else if (shm->flags & TEE_SHM_DMA_BUF) {
> struct tee_shm_dmabuf_ref *ref;
>
> ref = container_of(shm, struct tee_shm_dmabuf_ref, shm);
> @@ -306,6 +315,48 @@ struct tee_shm *tee_shm_alloc_priv_buf(struct tee_context *ctx, size_t size)
> }
> EXPORT_SYMBOL_GPL(tee_shm_alloc_priv_buf);
>
> +struct tee_shm *tee_shm_alloc_cma_phys_mem(struct tee_context *ctx,
> + size_t page_count, size_t align)
> +{
> +#if IS_ENABLED(CONFIG_CMA)
> + struct tee_device *teedev = ctx->teedev;
> + struct cma *cma = dev_get_cma_area(&teedev->dev);
> + struct tee_shm *shm;
> + struct page *page;
> +
> + if (!tee_device_get(teedev))
> + return ERR_PTR(-EINVAL);
> +
> + page = cma_alloc(cma, page_count, align, true/*no_warn*/);
> + if (!page)
> + goto err_put_teedev;
> +
> + shm = kzalloc(sizeof(*shm), GFP_KERNEL);
> + if (!shm)
> + goto err_cma_crelease;
> +
> + refcount_set(&shm->refcount, 1);
> + shm->ctx = ctx;
> + shm->paddr = page_to_phys(page);
> + shm->size = page_count * PAGE_SIZE;
> + shm->flags = TEE_SHM_CMA_BUF;
> +
> + teedev_ctx_get(ctx);
> +
> + return shm;
> +
> +err_cma_crelease:
> + cma_release(cma, page, page_count);
> +err_put_teedev:
> + tee_device_put(teedev);
> +
> + return ERR_PTR(-ENOMEM);
> +#else
> + return ERR_PTR(-EINVAL);
> +#endif
> +}
> +EXPORT_SYMBOL_GPL(tee_shm_alloc_cma_phys_mem);
> +
> 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 02c07f661349..3a4e1b00fcc7 100644
> --- a/include/linux/tee_core.h
> +++ b/include/linux/tee_core.h
> @@ -29,6 +29,7 @@
> #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_CMA_BUF BIT(5) /* CMA allocated memory */
>
> #define TEE_DEVICE_FLAG_REGISTERED 0x1
> #define TEE_MAX_DEV_NAME_LEN 32
> @@ -310,6 +311,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_cma_phys_mem(struct tee_context *ctx,
> + size_t page_count, size_t align);
> +
> 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,
next prev parent reply other threads:[~2025-05-02 15:31 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-02 9:59 [PATCH v8 00/14] TEE subsystem for protected dma-buf allocations Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-02 9:59 ` [PATCH v8 01/14] tee: tee_device_alloc(): copy dma_mask from parent device Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-02 13:36 ` Robin Murphy
2025-05-02 13:36 ` Robin Murphy
2025-05-05 12:10 ` Jens Wiklander
2025-05-05 12:10 ` Jens Wiklander
2025-05-02 9:59 ` [PATCH v8 02/14] optee: pass parent device to tee_device_alloc() Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-02 9:59 ` [PATCH v8 03/14] optee: account for direction while converting parameters Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-07 12:42 ` Sumit Garg
2025-05-07 12:42 ` Sumit Garg
2025-05-07 13:07 ` Jens Wiklander
2025-05-07 13:07 ` Jens Wiklander
2025-05-02 9:59 ` [PATCH v8 04/14] optee: sync secure world ABI headers Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-02 9:59 ` [PATCH v8 05/14] dma-buf: dma-heap: export declared functions Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-02 9:59 ` [PATCH v8 06/14] tee: implement protected DMA-heap Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-02 13:59 ` Robin Murphy
2025-05-02 13:59 ` Robin Murphy
2025-05-06 6:50 ` Jens Wiklander
2025-05-06 6:50 ` Jens Wiklander
2025-05-02 9:59 ` [PATCH v8 07/14] tee: refactor params_from_user() Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-07 12:53 ` Sumit Garg
2025-05-07 12:53 ` Sumit Garg
2025-05-02 9:59 ` [PATCH v8 08/14] tee: new ioctl to a register tee_shm from a dmabuf file descriptor Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-02 9:59 ` [PATCH v8 09/14] cma: export cma_alloc() and cma_release() Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-02 15:49 ` Matthew Wilcox
2025-05-02 15:49 ` Matthew Wilcox
2025-05-05 11:38 ` Jens Wiklander
2025-05-05 11:38 ` Jens Wiklander
2025-05-02 9:59 ` [PATCH v8 10/14] dma-contiguous: export dma_contiguous_default_area Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-02 13:11 ` Robin Murphy
2025-05-02 13:11 ` Robin Murphy
2025-05-05 10:00 ` Jens Wiklander
2025-05-05 10:00 ` Jens Wiklander
2025-05-02 9:59 ` [PATCH v8 11/14] tee: add tee_shm_alloc_cma_phys_mem() Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-02 15:11 ` Robin Murphy [this message]
2025-05-02 15:11 ` Robin Murphy
2025-05-07 16:32 ` Jens Wiklander
2025-05-07 16:32 ` Jens Wiklander
2025-05-02 9:59 ` [PATCH v8 12/14] optee: support protected memory allocation Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-02 9:59 ` [PATCH v8 13/14] optee: FF-A: dynamic " Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
2025-05-02 9:59 ` [PATCH v8 14/14] optee: smc abi: " Jens Wiklander
2025-05-02 9:59 ` Jens Wiklander
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=4b2f7c31-c61b-45d8-b32e-16bb91c4289b@arm.com \
--to=robin.murphy@arm.com \
--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=rouven.czerwinski@linaro.org \
--cc=simona.vetter@ffwll.ch \
--cc=sumit.garg@kernel.org \
--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.