Merge "gpu: ion: Restrict access to CP heap"
diff --git a/arch/arm/mach-msm/board-8064.c b/arch/arm/mach-msm/board-8064.c
index 07e2623..c5bea4f 100644
--- a/arch/arm/mach-msm/board-8064.c
+++ b/arch/arm/mach-msm/board-8064.c
@@ -298,6 +298,7 @@
.mem_is_fmem = FMEM_ENABLED,
.fixed_position = FIXED_MIDDLE,
.is_cma = 1,
+ .no_nonsecure_alloc = 1,
};
static struct ion_cp_heap_pdata cp_mfc_apq8064_ion_pdata = {
@@ -306,6 +307,7 @@
.reusable = 0,
.mem_is_fmem = FMEM_ENABLED,
.fixed_position = FIXED_HIGH,
+ .no_nonsecure_alloc = 1,
};
static struct ion_co_heap_pdata co_apq8064_ion_pdata = {
diff --git a/arch/arm/mach-msm/board-8930.c b/arch/arm/mach-msm/board-8930.c
index 13b16f2..5d4f874 100644
--- a/arch/arm/mach-msm/board-8930.c
+++ b/arch/arm/mach-msm/board-8930.c
@@ -343,6 +343,7 @@
.mem_is_fmem = FMEM_ENABLED,
.fixed_position = FIXED_MIDDLE,
.is_cma = 1,
+ .no_nonsecure_alloc = 1,
};
static struct ion_cp_heap_pdata cp_mfc_msm8930_ion_pdata = {
@@ -351,6 +352,7 @@
.reusable = 0,
.mem_is_fmem = FMEM_ENABLED,
.fixed_position = FIXED_HIGH,
+ .no_nonsecure_alloc = 1,
};
static struct ion_co_heap_pdata co_msm8930_ion_pdata = {
diff --git a/arch/arm/mach-msm/board-8960.c b/arch/arm/mach-msm/board-8960.c
index 97639d6..72d926f 100644
--- a/arch/arm/mach-msm/board-8960.c
+++ b/arch/arm/mach-msm/board-8960.c
@@ -366,6 +366,7 @@
.iommu_map_all = 1,
.iommu_2x_map_domain = VIDEO_DOMAIN,
.is_cma = 1,
+ .no_nonsecure_alloc = 1,
};
static struct ion_cp_heap_pdata cp_mfc_msm8960_ion_pdata = {
@@ -374,6 +375,7 @@
.reusable = 0,
.mem_is_fmem = FMEM_ENABLED,
.fixed_position = FIXED_HIGH,
+ .no_nonsecure_alloc = 1,
};
static struct ion_co_heap_pdata co_msm8960_ion_pdata = {
@@ -749,6 +751,29 @@
#endif
}
+static void ion_adjust_secure_allocation(void)
+{
+ int i;
+
+ for (i = 0; i < msm8960_ion_pdata.nr; i++) {
+ struct ion_platform_heap *heap =
+ &(msm8960_ion_pdata.heaps[i]);
+
+
+ if (heap->extra_data) {
+ switch ((int) heap->type) {
+ case ION_HEAP_TYPE_CP:
+ if (cpu_is_msm8960()) {
+ ((struct ion_cp_heap_pdata *)
+ heap->extra_data)->no_nonsecure_alloc =
+ 0;
+ }
+
+ }
+ }
+ }
+}
+
static void __init reserve_mdp_memory(void)
{
msm8960_mdp_writeback(msm8960_reserve_table);
@@ -3476,6 +3501,7 @@
platform_device_register(&mdm_sglte_device);
}
msm_pm_set_tz_retention_flag(1);
+ ion_adjust_secure_allocation();
}
MACHINE_START(MSM8960_CDP, "QCT MSM8960 CDP")
diff --git a/drivers/gpu/ion/ion_cp_heap.c b/drivers/gpu/ion/ion_cp_heap.c
index 96a3cdc..d96b755 100644
--- a/drivers/gpu/ion/ion_cp_heap.c
+++ b/drivers/gpu/ion/ion_cp_heap.c
@@ -104,6 +104,7 @@
size_t heap_size;
dma_addr_t handle;
int cma;
+ int disallow_non_secure_allocation;
};
enum {
@@ -480,6 +481,13 @@
return ION_CP_ALLOCATE_FAIL;
}
+ if (!secure_allocation && cp_heap->disallow_non_secure_allocation) {
+ mutex_unlock(&cp_heap->lock);
+ pr_debug("%s: non-secure allocation disallowed from this heap\n",
+ __func__);
+ return ION_CP_ALLOCATE_FAIL;
+ }
+
/*
* The check above already checked for non-secure allocations when the
* heap is protected. HEAP_PROTECTED implies that this must be a secure
@@ -1286,6 +1294,8 @@
cp_heap->iommu_2x_map_domain =
extra_data->iommu_2x_map_domain;
cp_heap->cma = extra_data->is_cma;
+ cp_heap->disallow_non_secure_allocation =
+ extra_data->no_nonsecure_alloc;
}
diff --git a/include/linux/msm_ion.h b/include/linux/msm_ion.h
index 21648ad..d423b26 100644
--- a/include/linux/msm_ion.h
+++ b/include/linux/msm_ion.h
@@ -137,6 +137,7 @@
* goes from 1 -> 0
* @setup_region: function to be called upon ion registration
* @memory_type:Memory type used for the heap
+ * @no_nonsecure_alloc: don't allow non-secure allocations from this heap
*
*/
struct ion_cp_heap_pdata {
@@ -155,6 +156,7 @@
int (*release_region)(void *);
void *(*setup_region)(void);
enum ion_memory_types memory_type;
+ int no_nonsecure_alloc;
};
/**