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@xxxxxxxxxxxx> > --- > 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");