aboutsummaryrefslogtreecommitdiff
path: root/plat
diff options
context:
space:
mode:
authorLin Ma <lin.ma@caviumnetworks.com>2014-06-02 11:45:36 -0700
committerLin Ma <lin.ma@caviumnetworks.com>2014-06-02 11:45:36 -0700
commitf984ce84bab84c821cc7be76c8362808c375c1c8 (patch)
tree16736ab8230bcaf0b6a144a7823909cf282d5ca1 /plat
parente10af77b2873396c9aca6e53326db3ca294f6de4 (diff)
downloadtrusted-firmware-a-f984ce84bab84c821cc7be76c8362808c375c1c8.tar.gz
Enable mapping higher physical address
Current ATF uses a direct physical-to-virtual mapping, that is, a physical address is mapped to the same address in the virtual space. For example, physical address 0x8000_0000 is mapped to 0x8000_0000 virtual. This approach works fine for FVP as all its physical addresses fall into 0 to 4GB range. But for other platform where all I/O addresses are 48-bit long, If we follow the same direct mapping, we would need virtual address range from 0 to 0x8fff_ffff_ffff, which is about 144TB. This requires a significant amount of memory for MMU tables and it is not necessary to use that much virtual space in ATF. The patch is to enable mapping a physical address range to an arbitrary virtual address range (instead of flat mapping) Changed "base" to "base_va" and added "base_pa" in mmap_region_t and modified functions such as mmap_add_region and init_xlation_table etc. Fixes ARM-software/tf-issues#158
Diffstat (limited to 'plat')
-rw-r--r--plat/fvp/aarch64/fvp_common.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/plat/fvp/aarch64/fvp_common.c b/plat/fvp/aarch64/fvp_common.c
index 3a078448c6..41234cba6f 100644
--- a/plat/fvp/aarch64/fvp_common.c
+++ b/plat/fvp/aarch64/fvp_common.c
@@ -54,17 +54,27 @@ static unsigned long fvp_config[CONFIG_LIMIT];
* configure_mmu_elx() will give the available subset of that,
*/
const mmap_region_t fvp_mmap[] = {
- { TZROM_BASE, TZROM_SIZE, MT_MEMORY | MT_RO | MT_SECURE },
- { TZDRAM_BASE, TZDRAM_SIZE, MT_MEMORY | MT_RW | MT_SECURE },
- { FLASH0_BASE, FLASH0_SIZE, MT_MEMORY | MT_RO | MT_SECURE },
- { FLASH1_BASE, FLASH1_SIZE, MT_MEMORY | MT_RO | MT_SECURE },
- { VRAM_BASE, VRAM_SIZE, MT_MEMORY | MT_RW | MT_SECURE },
- { DEVICE0_BASE, DEVICE0_SIZE, MT_DEVICE | MT_RW | MT_SECURE },
- { NSRAM_BASE, NSRAM_SIZE, MT_MEMORY | MT_RW | MT_NS },
- { DEVICE1_BASE, DEVICE1_SIZE, MT_DEVICE | MT_RW | MT_SECURE },
+ { TZROM_BASE, TZROM_BASE, TZROM_SIZE,
+ MT_MEMORY | MT_RO | MT_SECURE },
+ { TZDRAM_BASE, TZDRAM_BASE, TZDRAM_SIZE,
+ MT_MEMORY | MT_RW | MT_SECURE },
+ { FLASH0_BASE, FLASH0_BASE, FLASH0_SIZE,
+ MT_MEMORY | MT_RO | MT_SECURE },
+ { FLASH1_BASE, FLASH1_BASE, FLASH1_SIZE,
+ MT_MEMORY | MT_RO | MT_SECURE },
+ { VRAM_BASE, VRAM_BASE, VRAM_SIZE,
+ MT_MEMORY | MT_RW | MT_SECURE },
+ { DEVICE0_BASE, DEVICE0_BASE, DEVICE0_SIZE,
+ MT_DEVICE | MT_RW | MT_SECURE },
+ { NSRAM_BASE, NSRAM_BASE, NSRAM_SIZE,
+ MT_MEMORY | MT_RW | MT_NS },
+ { DEVICE1_BASE, DEVICE1_BASE, DEVICE1_SIZE,
+ MT_DEVICE | MT_RW | MT_SECURE },
/* 2nd GB as device for now...*/
- { 0x40000000, 0x40000000, MT_DEVICE | MT_RW | MT_SECURE },
- { DRAM1_BASE, DRAM1_SIZE, MT_MEMORY | MT_RW | MT_NS },
+ { 0x40000000, 0x40000000, 0x40000000,
+ MT_DEVICE | MT_RW | MT_SECURE },
+ { DRAM1_BASE, DRAM1_BASE, DRAM1_SIZE,
+ MT_MEMORY | MT_RW | MT_NS },
{0}
};
@@ -73,19 +83,21 @@ const mmap_region_t fvp_mmap[] = {
* the platform memory map & initialize the mmu, for the given exception level
******************************************************************************/
#define DEFINE_CONFIGURE_MMU_EL(_el) \
- void fvp_configure_mmu_el##_el(unsigned long total_base, \
+ void fvp_configure_mmu_el##_el(unsigned long total_base, \
unsigned long total_size, \
unsigned long ro_start, \
unsigned long ro_limit, \
unsigned long coh_start, \
unsigned long coh_limit) \
{ \
- mmap_add_region(total_base, \
+ mmap_add_region(total_base, total_base, \
total_size, \
MT_MEMORY | MT_RW | MT_SECURE); \
- mmap_add_region(ro_start, ro_limit - ro_start, \
+ mmap_add_region(ro_start, ro_start, \
+ ro_limit - ro_start, \
MT_MEMORY | MT_RO | MT_SECURE); \
- mmap_add_region(coh_start, coh_limit - coh_start, \
+ mmap_add_region(coh_start, coh_start, \
+ coh_limit - coh_start, \
MT_DEVICE | MT_RW | MT_SECURE); \
mmap_add(fvp_mmap); \
init_xlat_tables(); \