summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYe Li <ye.li@nxp.com>2017-07-21 04:12:54 -0500
committerAbel Vesa <abel.vesa@nxp.com>2018-06-11 10:08:39 +0300
commit3836b4c44aa8bf0f8697506a3771c6e907d881a4 (patch)
tree90680a57471b09e60b9a1b4cc496d507b632696a
parente9b49a36e26a06cb1b9df9716f60a38407444398 (diff)
imx8qm/qxp: Reserve memory region for ATF
Reserve the memory region that is only can access by ATF. ATF is running in this memory region, while masters in other partitions can't access it. Signed-off-by: Ye Li <ye.li@nxp.com>
-rw-r--r--plat/imx/imx8qm/imx8qm_bl31_setup.c41
-rw-r--r--plat/imx/imx8qxp/imx8qxp_bl31_setup.c41
2 files changed, 74 insertions, 8 deletions
diff --git a/plat/imx/imx8qm/imx8qm_bl31_setup.c b/plat/imx/imx8qm/imx8qm_bl31_setup.c
index baae3802..f47ccfbb 100644
--- a/plat/imx/imx8qm/imx8qm_bl31_setup.c
+++ b/plat/imx/imx8qm/imx8qm_bl31_setup.c
@@ -191,7 +191,7 @@ void mx8_partition_resources(void)
{
sc_err_t err;
sc_rm_pt_t secure_part, os_part;
- sc_rm_mr_t mr;
+ sc_rm_mr_t mr, mr_record = 64;
bool owned;
sc_faddr_t start, end;
int i;
@@ -236,9 +236,42 @@ void mx8_partition_resources(void)
} else {
NOTICE("Memreg %u 0x%lx -- 0x%lx\n", mr, start, end);
- err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
- if (err)
- ERROR("Memreg assign failed, 0x%lx -- 0x%lx\n", start, end);
+ if (BL31_BASE >= start && (BL31_LIMIT - 1) <= end) {
+ mr_record = mr; /* Record the mr for ATF running */
+ } else {
+ err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
+ if (err)
+ ERROR("Memreg assign failed, 0x%lx -- 0x%lx, err %d\n", start, end, err);
+ }
+ }
+ }
+ }
+
+ if (mr_record != 64) {
+ err = sc_rm_get_memreg_info(ipc_handle, mr_record, &start, &end);
+ if (err) {
+ ERROR("Memreg get info failed, %u\n", mr_record);
+ } else {
+ if ((BL31_LIMIT - 1) < end) {
+ err = sc_rm_memreg_alloc(ipc_handle, &mr, BL31_LIMIT, end);
+ if (err) {
+ ERROR("sc_rm_memreg_alloc failed, 0x%lx -- 0x%lx\n", (sc_faddr_t)BL31_LIMIT, end);
+ } else {
+ err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
+ if (err)
+ ERROR("Memreg assign failed, 0x%lx -- 0x%lx\n", (sc_faddr_t)BL31_LIMIT, end);
+ }
+ }
+
+ if (start < (BL31_BASE - 1)) {
+ err = sc_rm_memreg_alloc(ipc_handle, &mr, start, BL31_BASE - 1);
+ if (err) {
+ ERROR("sc_rm_memreg_alloc failed, 0x%lx -- 0x%lx\n", start, (sc_faddr_t)BL31_BASE - 1);
+ } else {
+ err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
+ if (err)
+ ERROR("Memreg assign failed, 0x%lx -- 0x%lx\n", start, (sc_faddr_t)BL31_BASE - 1);
+ }
}
}
}
diff --git a/plat/imx/imx8qxp/imx8qxp_bl31_setup.c b/plat/imx/imx8qxp/imx8qxp_bl31_setup.c
index bb443d2a..0044d113 100644
--- a/plat/imx/imx8qxp/imx8qxp_bl31_setup.c
+++ b/plat/imx/imx8qxp/imx8qxp_bl31_setup.c
@@ -182,7 +182,7 @@ void imx8_partition_resources(void)
{
sc_err_t err;
sc_rm_pt_t secure_part, os_part;
- sc_rm_mr_t mr;
+ sc_rm_mr_t mr, mr_record = 64;
bool owned;
sc_faddr_t start, end;
int i;
@@ -227,9 +227,42 @@ void imx8_partition_resources(void)
} else {
NOTICE("Memreg %u 0x%lx -- 0x%lx\n", mr, start, end);
- err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
- if (err)
- ERROR("Memreg assign failed, 0x%lx -- 0x%lx\n", start, end);
+ if (BL31_BASE >= start && (BL31_LIMIT - 1) <= end) {
+ mr_record = mr; /* Record the mr for ATF running */
+ } else {
+ err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
+ if (err)
+ ERROR("Memreg assign failed, 0x%lx -- 0x%lx, err %d\n", start, end, err);
+ }
+ }
+ }
+ }
+
+ if (mr_record != 64) {
+ err = sc_rm_get_memreg_info(ipc_handle, mr_record, &start, &end);
+ if (err) {
+ ERROR("Memreg get info failed, %u\n", mr_record);
+ } else {
+ if ((BL31_LIMIT - 1) < end) {
+ err = sc_rm_memreg_alloc(ipc_handle, &mr, BL31_LIMIT, end);
+ if (err) {
+ ERROR("sc_rm_memreg_alloc failed, 0x%lx -- 0x%lx\n", (sc_faddr_t)BL31_LIMIT, end);
+ } else {
+ err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
+ if (err)
+ ERROR("Memreg assign failed, 0x%lx -- 0x%lx\n", (sc_faddr_t)BL31_LIMIT, end);
+ }
+ }
+
+ if (start < (BL31_BASE - 1)) {
+ err = sc_rm_memreg_alloc(ipc_handle, &mr, start, BL31_BASE - 1);
+ if (err) {
+ ERROR("sc_rm_memreg_alloc failed, 0x%lx -- 0x%lx\n", start, (sc_faddr_t)BL31_BASE - 1);
+ } else {
+ err = sc_rm_assign_memreg(ipc_handle, os_part, mr);
+ if (err)
+ ERROR("Memreg assign failed, 0x%lx -- 0x%lx\n", start, (sc_faddr_t)BL31_BASE - 1);
+ }
}
}
}