summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYe Li <ye.li@nxp.com>2017-06-07 03:41:22 -0500
committerAbel Vesa <abel.vesa@nxp.com>2018-06-08 17:34:09 +0300
commit6e04f50929ed302cda2a38910268a310d26e992b (patch)
tree8a0b07f70b75fc8852bff5376e8f773832c68120
parent58a3f2e6155f5372dcc8b17e72e34779b460d548 (diff)
iMX8QM/QXP: Allocate memory regions to NS partition
Not only the resources, but also the memory regions need to assign to non-secure partition. Otherwise, when the boot partition is secured, the OS non-secure partition can't access any memory. This patch currently assign all memory to NS partition, since it is not isolated, the current secure partition also can access them. In future, may need to change the regions for reserving some memory in secure partition for ATF and BL32. Signed-off-by: Ye Li <ye.li@nxp.com>
-rw-r--r--plat/imx/imx8qm/imx8qm_bl31_setup.c73
-rw-r--r--plat/imx/imx8qm/include/sec_rsrc.h16
-rw-r--r--plat/imx/imx8qxp/imx8qxp_bl31_setup.c18
-rw-r--r--plat/imx/imx8qxp/include/sec_rsrc.h14
4 files changed, 87 insertions, 34 deletions
diff --git a/plat/imx/imx8qm/imx8qm_bl31_setup.c b/plat/imx/imx8qm/imx8qm_bl31_setup.c
index ddb3ab19..668a71b8 100644
--- a/plat/imx/imx8qm/imx8qm_bl31_setup.c
+++ b/plat/imx/imx8qm/imx8qm_bl31_setup.c
@@ -189,46 +189,57 @@ static int lpuart32_serial_init(unsigned int base)
void mx8_partition_resources(void)
{
- sc_err_t err;
- sc_rm_pt_t secure_part, os_part;
- int i;
+ sc_err_t err;
+ sc_rm_pt_t secure_part, os_part;
+ sc_rm_mr_t mr;
+ int i;
- err = sc_rm_get_partition(ipc_handle, &secure_part);
+ err = sc_rm_get_partition(ipc_handle, &secure_part);
- err = sc_rm_partition_alloc(ipc_handle, &os_part, false, false,
- false, false, false);
+ err = sc_rm_partition_alloc(ipc_handle, &os_part, false, false,
+ false, false, false);
- err = sc_rm_set_parent(ipc_handle, os_part, secure_part);
+ err = sc_rm_set_parent(ipc_handle, os_part, secure_part);
- /* set secure resources to NOT-movable */
- for(i = 0; i<(sizeof(secure_rsrcs)/sizeof(sc_rsrc_t)); i++){
- err = sc_rm_set_resource_movable(ipc_handle, secure_rsrcs[i],
- secure_rsrcs[i], false);
+ /* set secure resources to NOT-movable */
+ for (i = 0; i < (sizeof(secure_rsrcs) / sizeof(sc_rsrc_t)); i++) {
+ err = sc_rm_set_resource_movable(ipc_handle, secure_rsrcs[i],
+ secure_rsrcs[i], false);
+ }
- }
+ /* move all movable resources and pins to non-secure partition */
+ err = sc_rm_move_all(ipc_handle, secure_part, os_part, true, true);
- /* move all movable resources and pins to non-secure partition */
- err = sc_rm_move_all(ipc_handle, secure_part, os_part, true, true);
+ /* iterate through peripherals to give NS OS part access */
+ for (i = 0; i < (sizeof(ns_access_allowed) / sizeof(sc_rsrc_t)); i++) {
+ err = sc_rm_set_peripheral_permissions(ipc_handle, ns_access_allowed[i],
+ os_part, SC_RM_PERM_FULL);
+ }
- /* iterate through peripherals to give NS OS part access */
- for(i = 0; i<(sizeof(ns_access_allowed)/sizeof(sc_rsrc_t)); i++){
- err = sc_rm_set_peripheral_permissions(ipc_handle, ns_access_allowed[i],
- os_part, SC_RM_PERM_FULL);
- }
+ /*
+ * sc_rm_set_peripheral_permissions
+ *
+ * sc_rm_set_memreg_permissions
+ *
+ * sc_rm_set_pin_movable
+ *
+ */
- /*
- * sc_rm_set_peripheral_permissions
- *
- * sc_rm_set_memreg_permissions
- *
- * sc_rm_set_pin_movable
- *
- */
+ for (i = 0; i < (sizeof(ns_mem_region) / sizeof(struct mem_region)); i++) {
+ err = sc_rm_memreg_alloc(ipc_handle, &mr, ns_mem_region[i].start, ns_mem_region[i].end);
+ if (err) {
+ ERROR("Memreg alloc failed, 0x%lx -- 0x%lx\n", ns_mem_region[i].start, ns_mem_region[i].end);
+ } else {
+ err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
+ if (err)
+ ERROR("Memreg assign failed, 0x%lx -- 0x%lx\n", ns_mem_region[i].start, ns_mem_region[i].end);
+ }
+ }
- if(err)
- NOTICE("Partitioning Failed\n");
- else
- NOTICE("Non-secure Partitioning Succeeded\n");
+ if (err)
+ NOTICE("Partitioning Failed\n");
+ else
+ NOTICE("Non-secure Partitioning Succeeded\n");
}
diff --git a/plat/imx/imx8qm/include/sec_rsrc.h b/plat/imx/imx8qm/include/sec_rsrc.h
index b05f0aa0..fa72c4cf 100644
--- a/plat/imx/imx8qm/include/sec_rsrc.h
+++ b/plat/imx/imx8qm/include/sec_rsrc.h
@@ -23,3 +23,19 @@ sc_rsrc_t ns_access_allowed[] = {
SC_R_GIC_SMMU,
SC_R_CCI
};
+
+struct mem_region {
+ unsigned long start;
+ unsigned long end;
+};
+
+struct mem_region ns_mem_region[] = {
+ {0x000000000, 0x01BFFFFFF},
+ {0x034000000, 0x037FFFFFF},
+ {0x038000000, 0x03BFFFFFF},
+ {0x060000000, 0x06FFFFFFF},
+ {0x070000000, 0x07FFFFFFF},
+ {0x080000000, 0x0FFFFFFFF},
+ {0x400000000, 0x43FFFFFFF},
+ {0x880000000, 0xFFFFFFFFF},
+};
diff --git a/plat/imx/imx8qxp/imx8qxp_bl31_setup.c b/plat/imx/imx8qxp/imx8qxp_bl31_setup.c
index f655a8ce..2811caaa 100644
--- a/plat/imx/imx8qxp/imx8qxp_bl31_setup.c
+++ b/plat/imx/imx8qxp/imx8qxp_bl31_setup.c
@@ -182,6 +182,7 @@ void imx8_partition_resources(void)
{
sc_err_t err;
sc_rm_pt_t secure_part, os_part;
+ sc_rm_mr_t mr;
int i;
err = sc_rm_get_partition(ipc_handle, &secure_part);
@@ -192,7 +193,7 @@ void imx8_partition_resources(void)
err = sc_rm_set_parent(ipc_handle, os_part, secure_part);
/* set secure resources to NOT-movable */
- for(i = 0; i<(sizeof(secure_rsrcs)/sizeof(sc_rsrc_t)); i++){
+ for (i = 0; i < (sizeof(secure_rsrcs) / sizeof(sc_rsrc_t)); i++) {
err = sc_rm_set_resource_movable(ipc_handle,
secure_rsrcs[i], secure_rsrcs[i], false);
}
@@ -201,7 +202,7 @@ void imx8_partition_resources(void)
err = sc_rm_move_all(ipc_handle, secure_part, os_part, true, true);
/* iterate through peripherals to give NS OS part access */
- for(i = 0; i<(sizeof(ns_access_allowed)/sizeof(sc_rsrc_t)); i++){
+ for (i = 0; i< (sizeof(ns_access_allowed) / sizeof(sc_rsrc_t)); i++) {
err = sc_rm_set_peripheral_permissions(ipc_handle,
ns_access_allowed[i], os_part, SC_RM_PERM_FULL);
}
@@ -215,6 +216,17 @@ void imx8_partition_resources(void)
*
*/
+ for (i = 0; i < (sizeof(ns_mem_region) / sizeof(struct mem_region)); i++) {
+ err = sc_rm_memreg_alloc(ipc_handle, &mr, ns_mem_region[i].start, ns_mem_region[i].end);
+ if (err) {
+ ERROR("Memreg alloc failed, 0x%lx -- 0x%lx\n", ns_mem_region[i].start, ns_mem_region[i].end);
+ } else {
+ err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
+ if (err)
+ ERROR("Memreg assign failed, 0x%lx -- 0x%lx\n", ns_mem_region[i].start, ns_mem_region[i].end);
+ }
+ }
+
if (err)
NOTICE("Partitioning Failed\n");
else
@@ -276,7 +288,7 @@ void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
void bl31_plat_arch_setup(void)
{
/*
- * add the mmap
+ * add the mmap
* Change to 128KB?
* Fix Me
*/
diff --git a/plat/imx/imx8qxp/include/sec_rsrc.h b/plat/imx/imx8qxp/include/sec_rsrc.h
index 46585881..34d234dc 100644
--- a/plat/imx/imx8qxp/include/sec_rsrc.h
+++ b/plat/imx/imx8qxp/include/sec_rsrc.h
@@ -16,3 +16,17 @@ sc_rsrc_t secure_rsrcs[] = {
sc_rsrc_t ns_access_allowed[] = {
SC_R_GIC,
};
+
+struct mem_region {
+ unsigned long start;
+ unsigned long end;
+};
+
+struct mem_region ns_mem_region[] = {
+ {0x000000000, 0x01BFFFFFF},
+ {0x034000000, 0x037FFFFFF},
+ {0x070000000, 0x07FFFFFFF},
+ {0x080000000, 0x0FFFFFFFF},
+ {0x400000000, 0x43FFFFFFF},
+ {0x880000000, 0xFFFFFFFFF},
+};