[PATCH RFC 1/1] remoteproc: mediatek: Support reserved CMA regions
From: "shun-yi.wang" In order to reserve specific Contiguous Memory Allocator (CMA) regions for hardware use. When the name of the reserved region contains "cma", then a corresponding CMA heap is added. Signed-off-by: shun-yi.wang --- drivers/remoteproc/mtk_scp.c | 38 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c index e744c07507ee..ca0a4a52ece9 100644 --- a/drivers/remoteproc/mtk_scp.c +++ b/drivers/remoteproc/mtk_scp.c @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -1006,22 +1007,43 @@ EXPORT_SYMBOL_GPL(scp_mapping_dm_addr); static int scp_map_memory_region(struct mtk_scp *scp) { - int ret; + int ret, i, err; const struct mtk_scp_sizes_data *scp_sizes; + struct device_node *node = scp->dev->of_node; + struct of_phandle_iterator it; + + i = 0; + of_for_each_phandle(, err, node, "memory-region", NULL, 0) { + ret = of_reserved_mem_device_init_by_idx(scp->dev, node, i); + + if (ret) { + dev_err(scp->dev, "failed to assign memory-region: %s\n", + it.node->name); + of_node_put(it.node); + return -ENOMEM; + } + +#ifdef CONFIG_DMABUF_HEAPS_CMA + if (strstr(it.node->name, "cma")) { + /* Reserved cma memory region */ + ret = dma_heap_add_cma(scp->dev); + if (ret) { + dev_err(scp->dev, "Failed to add reserved cma"); + of_node_put(it.node); + return ret; + } + } +#endif /* CONFIG_DMABUF_HEAPS_CMA */ - ret = of_reserved_mem_device_init(scp->dev); + i++; + } /* reserved memory is optional. */ - if (ret == -ENODEV) { + if (!i) { dev_info(scp->dev, "skipping reserved memory initialization."); return 0; } - if (ret) { - dev_err(scp->dev, "failed to assign memory-region: %d\n", ret); - return -ENOMEM; - } - /* Reserved SCP code size */ scp_sizes = scp->data->scp_sizes; scp->cpu_addr = dma_alloc_coherent(scp->dev, scp_sizes->max_dram_size, -- 2.18.0
[PATCH RFC 0/1] Support CMA regions
From: "shun-yi.wang" In order to reserve specific Contiguous Memory Allocator (CMA) regions for hardware use. When the name of the reserved region contains "cma", then a corresponding CMA heap is added. In the DTS (Device Tree Source), we may have several memory regions with different names, e.g., { ... memory-region = <_reserved_1>, <_reserved_2>; }; mem_reserved_1: xxx-xxx-region { ... }; mem_reserved_2: xxx-xxx-cma-region { ... }; When the name of the region contains "cma", a corresponding heap allocator is added by cma_heap_add(). However, we are unsure if using the name "cma" as an identifier is a good practice. I sincerely hope that you can provide me some suggestions, thanks. Especially within the segment of '#ifdef CONFIG_DMA_BUF_HEAPS_CMA' Note: The cma_heap_add() is introduced from this patch: dma-buf: heaps: Introduce cma_heap_add() for non-default CMA heap shun-yi.wang (1): remoteproc: mediatek: Support reserved CMA regions drivers/remoteproc/mtk_scp.c | 38 1 file changed, 30 insertions(+), 8 deletions(-) -- 2.18.0
[PATCH 0/1] Support multiple reserved memory regions
From: "shun-yi.wang" Besides the reserved memory region for SCP, there are additional reserved memory regions for specific hardware use. Currently, only a single memory region is supported. Modifications are made to support multiple memory regions. shun-yi.wang (1): remoteproc: mediatek: support multiple reserved memory drivers/remoteproc/mtk_scp.c | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) -- 2.18.0
[PATCH 1/1] remoteproc: mediatek: Support multiple reserved memory regions
From: "shun-yi.wang" SCP supports multiple reserved memory regions, intended for specific hardwards. Signed-off-by: shun-yi.wang --- drivers/remoteproc/mtk_scp.c | 25 + 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c index 9ecd5ea04b5f3..1902826cea0af 100644 --- a/drivers/remoteproc/mtk_scp.c +++ b/drivers/remoteproc/mtk_scp.c @@ -1006,22 +1006,31 @@ EXPORT_SYMBOL_GPL(scp_mapping_dm_addr); static int scp_map_memory_region(struct mtk_scp *scp) { - int ret; + int ret, i, err; const struct mtk_scp_sizes_data *scp_sizes; + struct device_node *node = scp->dev->of_node; + struct of_phandle_iterator it; + + i = 0; + of_for_each_phandle(, err, node, "memory-region", NULL, 0) { + ret = of_reserved_mem_device_init_by_idx(scp->dev, node, i); + + if (ret) { + dev_err(scp->dev, "failed to assign memory-region: %s\n", + it.node->name); + of_node_put(it.node); + return -ENOMEM; + } - ret = of_reserved_mem_device_init(scp->dev); + i++; + } /* reserved memory is optional. */ - if (ret == -ENODEV) { + if (!i) { dev_info(scp->dev, "skipping reserved memory initialization."); return 0; } - if (ret) { - dev_err(scp->dev, "failed to assign memory-region: %d\n", ret); - return -ENOMEM; - } - /* Reserved SCP code size */ scp_sizes = scp->data->scp_sizes; scp->cpu_addr = dma_alloc_coherent(scp->dev, scp_sizes->max_dram_size, -- 2.18.0