summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/arch/arm/kernel/stmm_sp.c73
-rw-r--r--core/arch/arm/mm/core_mmu_lpae.c3
-rw-r--r--core/arch/arm/mm/mobj.c19
-rw-r--r--core/arch/arm/plat-vexpress/conf.mk1
4 files changed, 86 insertions, 10 deletions
diff --git a/core/arch/arm/kernel/stmm_sp.c b/core/arch/arm/kernel/stmm_sp.c
index f701c1a6..7fff3932 100644
--- a/core/arch/arm/kernel/stmm_sp.c
+++ b/core/arch/arm/kernel/stmm_sp.c
@@ -82,12 +82,14 @@ static TEE_Result alloc_SPD_io(struct stmm_ctx *spc, paddr_t pa,
struct mobj *mobj;
TEE_Result res = TEE_SUCCESS;
*va = 0x0;
-
sz = ROUNDUP(sz, SMALL_PAGE_SIZE);
- mobj = mobj_phys_alloc(pa, sz, 0, CORE_MEM_SDP_MEM);
+ mobj = mobj_phys_alloc(pa, sz, TEE_MATTR_CACHE_NONCACHE, CORE_MEM_SDP_MEM);
- if (!mobj)
+ if (!mobj) {
+ EMSG("out of memory when allocating mobj\n");
return TEE_ERROR_OUT_OF_MEMORY;
+ }
+
res = vm_map_pad(&spc->uctx, va, sz,
prot, 0, mobj,
@@ -105,7 +107,62 @@ static TEE_Result hack_map_StMM_devices(struct stmm_ctx *spc)
{
TEE_Result res;
vaddr_t uart_va = 0;
- res = alloc_SPD_io(spc, 0x09040000, 0x00001000,
+#if defined(CFG_MX8MM)
+EMSG("hack alloc device regions\n");
+ // imx8mm-evk UART
+ res = alloc_SPD_io(spc, 0x30890000, 0x00001000,
+ TEE_MATTR_URW | TEE_MATTR_PRW,
+ &uart_va, 0, 0);
+ if (res) {
+ EMSG("failed to alloc_and_map uart");
+ return res;
+ }
+ EMSG("------------------------------uart va=%#"PRIxVA, uart_va);
+
+/*
+ res = alloc_SPD_io(spc, 0xe05f000, 0x1000,
+ TEE_MATTR_URW | TEE_MATTR_PRW,
+ &uart_va, 0, 0);
+ if (res) {
+ EMSG("failed to alloc_and_map secure flash");
+ return res;
+ }
+ EMSG("------------------------------secure FWU page (SRAM) va=%#"PRIxVA, uart_va);
+*/
+
+ // imx8mm-evk QSPI controller
+ res = alloc_SPD_io(spc, 0x30bb0000, 0x1000,
+ TEE_MATTR_URW | TEE_MATTR_PRW,
+ &uart_va, 0, 0);
+ if (res) {
+ EMSG("failed to alloc_and_map secure flash");
+ return res;
+ }
+ EMSG("------------------------------FlexSPI controller va=%#"PRIxVA, uart_va);
+
+
+ // imx8mm-evk CCM_CCGR (MMIO region that controlls clocks)
+ res = alloc_SPD_io(spc, 0x30380000, 0xB000,
+ TEE_MATTR_URW | TEE_MATTR_PRW,
+ &uart_va, 0, 0);
+ if (res) {
+ EMSG("failed to alloc_and_map CCM_CCGR");
+ return res;
+ }
+ EMSG("------------------------------CCM_CCGR controller va=%#"PRIxVA, uart_va);
+
+ // imx8mm-evk IOMUX PAD
+ res = alloc_SPD_io(spc, 0x30330000, 0x1000,
+ TEE_MATTR_URW | TEE_MATTR_PRW,
+ &uart_va, 0, 0);
+ if (res) {
+ EMSG("failed to alloc_and_map IOMUX PAD");
+ return res;
+ }
+ EMSG("------------------------------IOMUX PAD va=%#"PRIxVA, uart_va);
+#elif defined(CFG_QEMUVIRT)
+ //res = alloc_SPD_io(spc, 0x09040000, 0x00001000,
+ res = alloc_SPD_io(spc, 0x09000000, 0x00001000,
TEE_MATTR_URW | TEE_MATTR_PRW,
&uart_va, 0, 0);
if (res) {
@@ -116,7 +173,8 @@ static TEE_Result hack_map_StMM_devices(struct stmm_ctx *spc)
// Secure variable storage
// base address at from [0x0, 0xA00000[
- res = alloc_SPD_io(spc, 0x000000, 0xA00000,
+ //res = alloc_SPD_io(spc, 0x000000, 0xA00000,
+ res = alloc_SPD_io(spc, 0x000000, 0x700000,
TEE_MATTR_URW | TEE_MATTR_PRW,
&uart_va, 0, 0);
if (res) {
@@ -134,6 +192,11 @@ static TEE_Result hack_map_StMM_devices(struct stmm_ctx *spc)
}
EMSG("------------------------------secure FWU page (SRAM) va=%#"PRIxVA, uart_va);
+
+#else
+#error "Unsupported platform"
+#endif
+
return res;
}
static struct stmm_ctx *stmm_alloc_ctx(const TEE_UUID *uuid)
diff --git a/core/arch/arm/mm/core_mmu_lpae.c b/core/arch/arm/mm/core_mmu_lpae.c
index ed753105..81749f32 100644
--- a/core/arch/arm/mm/core_mmu_lpae.c
+++ b/core/arch/arm/mm/core_mmu_lpae.c
@@ -771,7 +771,8 @@ void core_mmu_set_entry_primitive(void *table, size_t level, size_t idx,
{
uint64_t *tbl = table;
uint64_t desc = mattr_to_desc(level, attr);
-
+// if (pa<0xbe000000)
+// EMSG(" pa=%x ", pa);
tbl[idx] = desc | pa;
}
diff --git a/core/arch/arm/mm/mobj.c b/core/arch/arm/mm/mobj.c
index 7a129cf5..7d8e19d8 100644
--- a/core/arch/arm/mm/mobj.c
+++ b/core/arch/arm/mm/mobj.c
@@ -147,13 +147,21 @@ struct mobj *mobj_phys_alloc(paddr_t pa, size_t size, uint32_t cattr,
area_type = MEM_AREA_TEE_RAM_RW_DATA;
break;
case CORE_MEM_TA_RAM:
- area_type = MEM_AREA_TA_RAM;
+ if (cattr==TEE_MATTR_CACHE_NONCACHE)
+ area_type = MEM_AREA_IO_NSEC;
+ else
+ area_type = MEM_AREA_TA_RAM;
+
break;
case CORE_MEM_NSEC_SHM:
area_type = MEM_AREA_NSEC_SHM;
break;
case CORE_MEM_SDP_MEM:
- area_type = MEM_AREA_SDP_MEM;
+ if (cattr==TEE_MATTR_CACHE_NONCACHE)
+ area_type = MEM_AREA_IO_NSEC;
+ else
+ area_type = MEM_AREA_SDP_MEM;
+
break;
default:
DMSG("can't allocate with specified attribute");
@@ -161,8 +169,11 @@ struct mobj *mobj_phys_alloc(paddr_t pa, size_t size, uint32_t cattr,
}
/* Only SDP memory may not have a virtual address */
- va = phys_to_virt(pa, area_type);
- if (!va && battr != CORE_MEM_SDP_MEM)
+ if (area_type == MEM_AREA_IO_SEC || area_type == MEM_AREA_IO_NSEC)
+ va = phys_to_virt_io(pa);
+ else
+ va = phys_to_virt(pa, area_type);
+ if (!va && battr != CORE_MEM_SDP_MEM)
return NULL;
moph = calloc(1, sizeof(*moph));
diff --git a/core/arch/arm/plat-vexpress/conf.mk b/core/arch/arm/plat-vexpress/conf.mk
index 26b9f51e..02310f13 100644
--- a/core/arch/arm/plat-vexpress/conf.mk
+++ b/core/arch/arm/plat-vexpress/conf.mk
@@ -22,6 +22,7 @@ endif
endif #juno
ifeq ($(PLATFORM_FLAVOR),qemu_armv8a)
include core/arch/arm/cpu/cortex-armv8-0.mk
+$(call force,CFG_QEMUVIRT, y)
CFG_ARM64_core ?= y
endif