On 9/11/2023 8:00 AM, Yong Wu wrote:
Initialise a mtk_svp heap. Currently just add a null heap, Prepare for the later patches.
Signed-off-by: Yong Wu yong.wu@mediatek.com
drivers/dma-buf/heaps/Kconfig | 8 ++ drivers/dma-buf/heaps/Makefile | 1 + drivers/dma-buf/heaps/mtk_secure_heap.c | 99 +++++++++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 drivers/dma-buf/heaps/mtk_secure_heap.c
diff --git a/drivers/dma-buf/heaps/Kconfig b/drivers/dma-buf/heaps/Kconfig index a5eef06c4226..729c0cf3eb7c 100644 --- a/drivers/dma-buf/heaps/Kconfig +++ b/drivers/dma-buf/heaps/Kconfig @@ -12,3 +12,11 @@ config DMABUF_HEAPS_CMA Choose this option to enable dma-buf CMA heap. This heap is backed by the Contiguous Memory Allocator (CMA). If your system has these regions, you should say Y here.
+config DMABUF_HEAPS_MTK_SECURE
- bool "DMA-BUF MediaTek Secure Heap"
- depends on DMABUF_HEAPS && TEE
- help
Choose this option to enable dma-buf MediaTek secure heap for Secure
Video Path. This heap is backed by TEE client interfaces. If in
doubt, say N.
diff --git a/drivers/dma-buf/heaps/Makefile b/drivers/dma-buf/heaps/Makefile index 974467791032..df559dbe33fe 100644 --- a/drivers/dma-buf/heaps/Makefile +++ b/drivers/dma-buf/heaps/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_DMABUF_HEAPS_SYSTEM) += system_heap.o obj-$(CONFIG_DMABUF_HEAPS_CMA) += cma_heap.o +obj-$(CONFIG_DMABUF_HEAPS_MTK_SECURE) += mtk_secure_heap.o diff --git a/drivers/dma-buf/heaps/mtk_secure_heap.c b/drivers/dma-buf/heaps/mtk_secure_heap.c new file mode 100644 index 000000000000..bbf1c8dce23e --- /dev/null +++ b/drivers/dma-buf/heaps/mtk_secure_heap.c @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: GPL-2.0 +/*
- DMABUF mtk_secure_heap exporter
- Copyright (C) 2023 MediaTek Inc.
- */
+#include <linux/dma-buf.h> +#include <linux/dma-heap.h> +#include <linux/err.h> +#include <linux/module.h> +#include <linux/slab.h>
+/*
- MediaTek secure (chunk) memory type
- @KREE_MEM_SEC_CM_TZ: static chunk memory carved out for trustzone.
- */
+enum kree_mem_type {
- KREE_MEM_SEC_CM_TZ = 1,
+};
+struct mtk_secure_heap_buffer {
- struct dma_heap *heap;
- size_t size;
+};
+struct mtk_secure_heap {
- const char *name;
- const enum kree_mem_type mem_type;
+};
+static struct dma_buf * +mtk_sec_heap_allocate(struct dma_heap *heap, size_t size,
unsigned long fd_flags, unsigned long heap_flags)
+{
- struct mtk_secure_heap_buffer *sec_buf;
- DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
- struct dma_buf *dmabuf;
- int ret;
- sec_buf = kzalloc(sizeof(*sec_buf), GFP_KERNEL);
As we know, kzalloc can only allocate 4MB at max. So, secure heap has this limitation. can we have a way to allocate more memory in secure heap ? maybe similar to how system heap does?
Thanks, Vijay
- if (!sec_buf)
return ERR_PTR(-ENOMEM);
- sec_buf->size = size;
- sec_buf->heap = heap;
- exp_info.exp_name = dma_heap_get_name(heap);
- exp_info.size = sec_buf->size;
- exp_info.flags = fd_flags;
- exp_info.priv = sec_buf;
- dmabuf = dma_buf_export(&exp_info);
- if (IS_ERR(dmabuf)) {
ret = PTR_ERR(dmabuf);
goto err_free_buf;
- }
- return dmabuf;
+err_free_buf:
- kfree(sec_buf);
- return ERR_PTR(ret);
+}
+static const struct dma_heap_ops mtk_sec_heap_ops = {
- .allocate = mtk_sec_heap_allocate,
+};
+static struct mtk_secure_heap mtk_sec_heap[] = {
- {
.name = "mtk_svp",
.mem_type = KREE_MEM_SEC_CM_TZ,
- },
+};
+static int mtk_sec_heap_init(void) +{
- struct mtk_secure_heap *sec_heap = mtk_sec_heap;
- struct dma_heap_export_info exp_info;
- struct dma_heap *heap;
- unsigned int i;
- for (i = 0; i < ARRAY_SIZE(mtk_sec_heap); i++, sec_heap++) {
exp_info.name = sec_heap->name;
exp_info.ops = &mtk_sec_heap_ops;
exp_info.priv = (void *)sec_heap;
heap = dma_heap_add(&exp_info);
if (IS_ERR(heap))
return PTR_ERR(heap);
- }
- return 0;
+}
+module_init(mtk_sec_heap_init); +MODULE_DESCRIPTION("MediaTek Secure Heap Driver"); +MODULE_LICENSE("GPL");