diff options
Diffstat (limited to 'plat/imx/imx8qm/imx8qm_bl31_setup.c')
-rw-r--r-- | plat/imx/imx8qm/imx8qm_bl31_setup.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/plat/imx/imx8qm/imx8qm_bl31_setup.c b/plat/imx/imx8qm/imx8qm_bl31_setup.c index b7732fb7..4940f351 100644 --- a/plat/imx/imx8qm/imx8qm_bl31_setup.c +++ b/plat/imx/imx8qm/imx8qm_bl31_setup.c @@ -160,8 +160,8 @@ static int lpuart32_serial_init(unsigned int base) void mx8_partition_resources(void) { sc_rm_pt_t secure_part, os_part; - sc_rm_mr_t mr, mr_record = 64; - sc_faddr_t start, end; + sc_rm_mr_t mr, mr_record = 64, mr_ocram = 64; + sc_faddr_t start, end, reg_end; bool owned, owned2; sc_err_t err; int i; @@ -197,7 +197,11 @@ void mx8_partition_resources(void) NOTICE("Memreg %u 0x%llx -- 0x%llx\n", mr, start, end); if (BL31_BASE >= start && (BL31_LIMIT - 1) <= end) { mr_record = mr; /* Record the mr for ATF running */ - } else { + } + else if (0 >= start && (OCRAM_BASE + OCRAM_ALIAS_SIZE - 1) <= end) { + mr_ocram = mr; + } + else { err = sc_rm_assign_memreg(ipc_handle, os_part, mr); if (err) ERROR("Memreg assign failed, 0x%llx -- 0x%llx, \ @@ -233,6 +237,25 @@ void mx8_partition_resources(void) } } + if (mr_ocram != 64) { + err = sc_rm_get_memreg_info(ipc_handle, mr_ocram, &start, &end); + reg_end = end; + if (err) { + ERROR("Memreg get info failed, %u\n", mr_ocram); + } else { + if ((OCRAM_BASE + OCRAM_ALIAS_SIZE - 1) < end) { + err = sc_rm_memreg_alloc(ipc_handle, &mr, OCRAM_BASE + OCRAM_ALIAS_SIZE, reg_end); + if (err) { + ERROR("sc_rm_memreg_alloc failed, 0x%llx -- 0x%llx\n", (sc_faddr_t)OCRAM_BASE + OCRAM_ALIAS_SIZE, reg_end); + } else { + err = sc_rm_assign_memreg(ipc_handle, os_part, mr); + if (err) + ERROR("Memreg assign failed, 0x%llx -- 0x%llx\n", (sc_faddr_t)OCRAM_BASE + OCRAM_ALIAS_SIZE, reg_end); + } + } + } + } + owned = sc_rm_is_resource_owned(ipc_handle, SC_R_M4_0_PID0); if (owned) { err = sc_rm_set_resource_movable(ipc_handle, SC_R_M4_0_PID0, |