platform: msm8996: Add support for LPAE
Update the MMU table to add support for LPAE mapping. Modify the
addresses used for lk, scratch, rpmb buffer to be aligned to 2mb
boundary.
Change-Id: Ieffd04d35102a8622da5509647ed80a4d61ff6ad
diff --git a/platform/msm8996/include/platform/iomap.h b/platform/msm8996/include/platform/iomap.h
index a4e7d54..2244632 100644
--- a/platform/msm8996/include/platform/iomap.h
+++ b/platform/msm8996/include/platform/iomap.h
@@ -191,8 +191,8 @@
* as device memory, define the start address
* and size in MB
*/
-#define RPMB_SND_RCV_BUF 0x90D00000
-#define RPMB_SND_RCV_BUF_SZ 0x1
+#define RPMB_SND_RCV_BUF 0x90F00000
+#define RPMB_SND_RCV_BUF_SZ 0x2
#define TCSR_BOOT_MISC_DETECT 0x007B3000
diff --git a/platform/msm8996/platform.c b/platform/msm8996/platform.c
index d0ab86d..6e04abf 100644
--- a/platform/msm8996/platform.c
+++ b/platform/msm8996/platform.c
@@ -32,8 +32,8 @@
#include <qgic.h>
#include <qtimer.h>
#include <platform/clock.h>
-#include <mmu.h>
#include <arch/arm/mmu.h>
+#include <mmu.h>
#include <smem.h>
#include <board.h>
@@ -46,20 +46,31 @@
/* Peripherals - non-shared device */
#define IOMAP_MEMORY (MMU_MEMORY_TYPE_DEVICE_SHARED | \
- MMU_MEMORY_AP_READ_WRITE | MMU_MEMORY_XN)
+ MMU_MEMORY_AP_READ_WRITE | MMU_MEMORY_XN | MMU_MEMORY_PXN)
/* SCRATCH memory - cacheable, write through */
#define SCRATCH_MEMORY (MMU_MEMORY_TYPE_NORMAL_WRITE_THROUGH | \
MMU_MEMORY_AP_READ_WRITE | MMU_MEMORY_XN)
-static mmu_section_t mmu_section_table[] = {
-/* Physical addr, Virtual addr, Size (in MB), Flags */
- { MEMBASE, MEMBASE, (MEMSIZE / MB), LK_MEMORY},
- { MSM_IOMAP_BASE, MSM_IOMAP_BASE, MSM_IOMAP_SIZE, IOMAP_MEMORY},
- { KERNEL_ADDR, KERNEL_ADDR, KERNEL_SIZE, SCRATCH_MEMORY},
- { SCRATCH_ADDR, SCRATCH_ADDR, SCRATCH_SIZE, SCRATCH_MEMORY},
- { MSM_SHARED_BASE, MSM_SHARED_BASE, MSM_SHARED_SIZE, SCRATCH_MEMORY},
- { RPMB_SND_RCV_BUF, RPMB_SND_RCV_BUF, RPMB_SND_RCV_BUF_SZ, IOMAP_MEMORY},
+/* COMMON memory - cacheable, write through */
+#define COMMON_MEMORY (MMU_MEMORY_TYPE_NORMAL_WRITE_THROUGH | \
+ MMU_MEMORY_AP_READ_WRITE | MMU_MEMORY_XN)
+
+
+static mmu_section_t default_mmu_section_table[] =
+{
+/* Physical addr, Virtual addr, Mapping type , Size (in MB), Flags */
+ { 0x00000000, 0x00000000, MMU_L1_NS_SECTION_MAPPING, 1024, IOMAP_MEMORY},
+ { KERNEL_ADDR, KERNEL_ADDR, MMU_L2_NS_SECTION_MAPPING, KERNEL_SIZE, COMMON_MEMORY},
+ { MEMBASE, MEMBASE, MMU_L2_NS_SECTION_MAPPING, (MEMSIZE / MB), LK_MEMORY},
+ { SCRATCH_ADDR, SCRATCH_ADDR, MMU_L2_NS_SECTION_MAPPING, SCRATCH_SIZE, SCRATCH_MEMORY},
+ { MSM_SHARED_BASE, MSM_SHARED_BASE, MMU_L2_NS_SECTION_MAPPING, MSM_SHARED_SIZE, COMMON_MEMORY},
+ { RPMB_SND_RCV_BUF, RPMB_SND_RCV_BUF, MMU_L2_NS_SECTION_MAPPING, RPMB_SND_RCV_BUF_SZ, IOMAP_MEMORY},
+};
+
+static mmu_section_t dload_mmu_section_table[] =
+{
+ { 0x85800000, 0x85800000, MMU_L2_NS_SECTION_MAPPING, 178, COMMON_MEMORY},
};
void platform_early_init(void)
@@ -94,37 +105,30 @@
/* Setup memory for this platform */
void platform_init_mmu_mappings(void)
{
- uint32_t i;
- uint32_t sections;
- uint32_t table_size = ARRAY_SIZE(mmu_section_table);
+ int i;
+ int table_sz = ARRAY_SIZE(default_mmu_section_table);
- /* Configure the MMU page entries for memory read from the
- mmu_section_table */
- for (i = 0; i < table_size; i++)
+ for (i = 0 ; i < table_sz; i++)
+ arm_mmu_map_entry(&default_mmu_section_table[i]);
+
+ if (scm_device_enter_dload())
{
- sections = mmu_section_table[i].num_of_sections;
+ /* TZ & Hyp memory can be mapped only while entering the download mode */
+ table_sz = ARRAY_SIZE(dload_mmu_section_table);
- while (sections--)
- {
- arm_mmu_map_section(mmu_section_table[i].paddress +
- sections * MB,
- mmu_section_table[i].vaddress +
- sections * MB,
- mmu_section_table[i].flags);
- }
+ for (i = 0 ; i < table_sz; i++)
+ arm_mmu_map_entry(&dload_mmu_section_table[i]);
}
}
addr_t platform_get_virt_to_phys_mapping(addr_t virt_addr)
{
- /* Using 1-1 mapping on this platform. */
- return virt_addr;
+ return virtual_to_physical_mapping(virt_addr);
}
addr_t platform_get_phys_to_virt_mapping(addr_t phys_addr)
{
- /* Using 1-1 mapping on this platform. */
- return phys_addr;
+ return physical_to_virtual_mapping(phys_addr);
}
uint32_t platform_get_sclk_count(void)