Merge "dma-heap: qcom: Introduce "qcom,unmapped" flag for pre assigned regions"
This commit is contained in:
commit
00569f07f9
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user