Merge "dma-heap: qcom: Introduce "qcom,unmapped" flag for pre assigned regions"

This commit is contained in:
qctecmdr 2024-06-19 19:37:45 -07:00 committed by Gerrit - the friendly Code Review server
commit 00569f07f9

View File

@ -58,6 +58,7 @@ struct carveout_heap {
struct secure_carveout_heap { struct secure_carveout_heap {
u32 token; u32 token;
bool is_unmapped;
struct carveout_heap carveout_heap; struct carveout_heap carveout_heap;
struct list_head list; struct list_head list;
atomic_long_t total_allocated; atomic_long_t total_allocated;
@ -255,14 +256,17 @@ static int carveout_pages_zero(struct page *page, size_t size)
} }
static int carveout_init_heap_memory(struct carveout_heap *co_heap, static int carveout_init_heap_memory(struct carveout_heap *co_heap,
phys_addr_t base, ssize_t size) phys_addr_t base, ssize_t size,
bool is_unmapped)
{ {
struct page *page = pfn_to_page(PFN_DOWN(base)); struct page *page = pfn_to_page(PFN_DOWN(base));
int ret = 0; int ret = 0;
ret = carveout_pages_zero(page, size); if (!is_unmapped) {
if (ret) ret = carveout_pages_zero(page, size);
return ret; if (ret)
return ret;
}
co_heap->pool = gen_pool_create(PAGE_SHIFT, -1); co_heap->pool = gen_pool_create(PAGE_SHIFT, -1);
if (!co_heap->pool) if (!co_heap->pool)
@ -276,7 +280,8 @@ static int carveout_init_heap_memory(struct carveout_heap *co_heap,
} }
static int __carveout_heap_init(struct platform_heap *heap_data, static int __carveout_heap_init(struct platform_heap *heap_data,
struct carveout_heap *carveout_heap) struct carveout_heap *carveout_heap,
bool is_unmapped)
{ {
struct device *dev = heap_data->dev; struct device *dev = heap_data->dev;
int ret = 0; int ret = 0;
@ -284,7 +289,7 @@ static int __carveout_heap_init(struct platform_heap *heap_data,
carveout_heap->dev = dev; carveout_heap->dev = dev;
ret = carveout_init_heap_memory(carveout_heap, ret = carveout_init_heap_memory(carveout_heap,
heap_data->base, heap_data->base,
heap_data->size); heap_data->size, is_unmapped);
init_rwsem(&carveout_heap->mem_sem); init_rwsem(&carveout_heap->mem_sem);
@ -312,7 +317,7 @@ int qcom_carveout_heap_create(struct platform_heap *heap_data)
if (!carveout_heap) if (!carveout_heap)
return -ENOMEM; return -ENOMEM;
ret = __carveout_heap_init(heap_data, carveout_heap); ret = __carveout_heap_init(heap_data, carveout_heap, false);
if (ret) if (ret)
goto err; goto err;
@ -423,6 +428,22 @@ static struct dma_heap_ops sc_heap_ops = {
.allocate = sc_heap_allocate, .allocate = sc_heap_allocate,
}; };
static bool qcom_secure_carveout_is_unmapped(struct device *dev)
{
struct device_node *mem_region;
bool val = false;
mem_region = of_parse_phandle(dev->of_node, "memory-region", 0);
if (!mem_region)
goto err;
val = of_property_read_bool(mem_region, "qcom,unmapped");
err:
of_node_put(mem_region);
return val;
}
int qcom_secure_carveout_heap_create(struct platform_heap *heap_data) int qcom_secure_carveout_heap_create(struct platform_heap *heap_data)
{ {
struct dma_heap_export_info exp_info; struct dma_heap_export_info exp_info;
@ -438,16 +459,20 @@ int qcom_secure_carveout_heap_create(struct platform_heap *heap_data)
if (!sc_heap) if (!sc_heap)
return -ENOMEM; return -ENOMEM;
ret = __carveout_heap_init(heap_data, &sc_heap->carveout_heap); sc_heap->is_unmapped = qcom_secure_carveout_is_unmapped(heap_data->dev);
ret = __carveout_heap_init(heap_data, &sc_heap->carveout_heap, sc_heap->is_unmapped);
if (ret) if (ret)
goto err; goto err;
ret = hyp_assign_from_flags(heap_data->base, heap_data->size, if (!sc_heap->is_unmapped) {
ret = hyp_assign_from_flags(heap_data->base, heap_data->size,
heap_data->token); heap_data->token);
if (ret) { if (ret) {
pr_err("secure_carveout_heap: Assign token 0x%x failed\n", pr_err("secure_carveout_heap: Assign token 0x%x failed\n",
heap_data->token); heap_data->token);
goto destroy_heap; goto destroy_heap;
}
} }
sc_heap->token = heap_data->token; sc_heap->token = heap_data->token;