arch: arm: Add support to conditionally include identity mmu mappings.
Change-Id: Ic1bbea9908c3ddab0160ee9db5aa98a1ac61f248
diff --git a/arch/arm/mmu.c b/arch/arm/mmu.c
index bbc5451..3fc61bf 100644
--- a/arch/arm/mmu.c
+++ b/arch/arm/mmu.c
@@ -68,14 +68,16 @@
*/
arm_write_cr1(arm_read_cr1() & ~((1<<29)|(1<<28)|(1<<0)));
- /* set up an identity-mapped translation table with
- * strongly ordered memory type and read/write access.
- */
- for (i=0; i < 4096; i++) {
- arm_mmu_map_section(i * MB,
- i * MB,
- MMU_MEMORY_TYPE_STRONGLY_ORDERED |
- MMU_MEMORY_AP_READ_WRITE);
+ if (platform_use_identity_mmu_mappings())
+ {
+ /* set up an identity-mapped translation table with
+ * strongly ordered memory type and read/write access.
+ */
+ for (i=0; i < 4096; i++) {
+ arm_mmu_map_section(i * MB,
+ i * MB,
+ MMU_MEMORY_TYPE_STRONGLY_ORDERED | MMU_MEMORY_AP_READ_WRITE);
+ }
}
platform_init_mmu_mappings();
diff --git a/include/platform.h b/include/platform.h
old mode 100644
new mode 100755
index 309bfef..e052851
--- a/include/platform.h
+++ b/include/platform.h
@@ -23,6 +23,9 @@
#ifndef __PLATFORM_H
#define __PLATFORM_H
+#define PA(x) platform_get_virt_to_phys_mapping(x)
+#define VA(x) platform_get_phys_to_virt_mapping(x)
+
time_t current_time(void);
bigtime_t current_time_hires(void);
@@ -33,7 +36,10 @@
void platform_init(void);
/* called by the arch init code to get the platform to set up any mmu mappings it may need */
+inline __ALWAYS_INLINE int platform_use_identity_mmu_mappings(void);
void platform_init_mmu_mappings(void);
+addr_t platform_get_virt_to_phys_mapping(addr_t virt_addr);
+addr_t platform_get_phys_to_virt_mapping(addr_t phys_addr);
void display_init(void);
void display_shutdown(void);
diff --git a/platform/init.c b/platform/init.c
index 4188f27..30f3e51 100644
--- a/platform/init.c
+++ b/platform/init.c
@@ -28,11 +28,29 @@
* default implementations of these routines, if the platform code
* chooses not to implement.
*/
+__WEAK int platform_use_identity_mmu_mappings(void)
+{
+ return 1;
+}
__WEAK void platform_init_mmu_mappings(void)
{
}
+__WEAK addr_t platform_get_virt_to_phys_mapping(addr_t virt_addr)
+{
+ ASSERT(platform_use_identity_mmu_mappings());
+
+ return virt_addr;
+}
+
+__WEAK addr_t platform_get_phys_to_virt_mapping(addr_t phys_addr)
+{
+ ASSERT(platform_use_identity_mmu_mappings());
+
+ return phys_addr;
+}
+
__WEAK void platform_early_init(void)
{
}