summaryrefslogtreecommitdiff
path: root/core/arch/arm/mm/mobj.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/arch/arm/mm/mobj.c')
-rw-r--r--core/arch/arm/mm/mobj.c19
1 files changed, 15 insertions, 4 deletions
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));