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)
 {
 }