Commit afff8cbd authored by Achin Gupta's avatar Achin Gupta
Browse files

Make enablement of the MMU more flexible

This patch adds a 'flags' parameter to each exception level specific function
responsible for enabling the MMU. At present only a single flag which indicates
whether the data cache should also be enabled is implemented. Subsequent patches
will use this flag when enabling the MMU in the warm boot paths.

Change-Id: I0eafae1e678c9ecc604e680851093f1680e9cefa
parent 754a2b7a
...@@ -31,6 +31,14 @@ ...@@ -31,6 +31,14 @@
#ifndef __XLAT_TABLES_H__ #ifndef __XLAT_TABLES_H__
#define __XLAT_TABLES_H__ #define __XLAT_TABLES_H__
/*
* Flags to override default values used to program system registers while
* enabling the MMU.
*/
#define DISABLE_DCACHE (1 << 0)
#ifndef __ASSEMBLY__
#include <stdint.h> #include <stdint.h>
/* /*
...@@ -67,7 +75,8 @@ void mmap_add(const mmap_region_t *mm); ...@@ -67,7 +75,8 @@ void mmap_add(const mmap_region_t *mm);
void init_xlat_tables(void); void init_xlat_tables(void);
void enable_mmu_el1(void); void enable_mmu_el1(uint32_t flags);
void enable_mmu_el3(void); void enable_mmu_el3(uint32_t flags);
#endif /*__ASSEMBLY__*/
#endif /* __XLAT_TABLES_H__ */ #endif /* __XLAT_TABLES_H__ */
...@@ -180,7 +180,7 @@ unsigned int plat_get_aff_state(unsigned int, unsigned long); ...@@ -180,7 +180,7 @@ unsigned int plat_get_aff_state(unsigned int, unsigned long);
/******************************************************************************* /*******************************************************************************
* Optional BL3-1 functions (may be overridden) * Optional BL3-1 functions (may be overridden)
******************************************************************************/ ******************************************************************************/
void bl31_plat_enable_mmu(void); void bl31_plat_enable_mmu(uint32_t flags);
/******************************************************************************* /*******************************************************************************
* Mandatory BL3-2 functions (only if platform contains a BL3-2) * Mandatory BL3-2 functions (only if platform contains a BL3-2)
...@@ -190,6 +190,6 @@ void bl32_platform_setup(void); ...@@ -190,6 +190,6 @@ void bl32_platform_setup(void);
/******************************************************************************* /*******************************************************************************
* Optional BL3-2 functions (may be overridden) * Optional BL3-2 functions (may be overridden)
******************************************************************************/ ******************************************************************************/
void bl32_plat_enable_mmu(void); void bl32_plat_enable_mmu(uint32_t flags);
#endif /* __PLATFORM_H__ */ #endif /* __PLATFORM_H__ */
...@@ -292,7 +292,7 @@ void init_xlat_tables(void) ...@@ -292,7 +292,7 @@ void init_xlat_tables(void)
* exception level * exception level
******************************************************************************/ ******************************************************************************/
#define DEFINE_ENABLE_MMU_EL(_el, _tcr_extra, _tlbi_fct) \ #define DEFINE_ENABLE_MMU_EL(_el, _tcr_extra, _tlbi_fct) \
void enable_mmu_el##_el(void) \ void enable_mmu_el##_el(uint32_t flags) \
{ \ { \
uint64_t mair, tcr, ttbr; \ uint64_t mair, tcr, ttbr; \
uint32_t sctlr; \ uint32_t sctlr; \
...@@ -330,7 +330,13 @@ void init_xlat_tables(void) ...@@ -330,7 +330,13 @@ void init_xlat_tables(void)
\ \
sctlr = read_sctlr_el##_el(); \ sctlr = read_sctlr_el##_el(); \
sctlr |= SCTLR_WXN_BIT | SCTLR_M_BIT | SCTLR_I_BIT; \ sctlr |= SCTLR_WXN_BIT | SCTLR_M_BIT | SCTLR_I_BIT; \
sctlr |= SCTLR_A_BIT | SCTLR_C_BIT; \ sctlr |= SCTLR_A_BIT; \
\
if (flags & DISABLE_DCACHE) \
sctlr &= ~SCTLR_C_BIT; \
else \
sctlr |= SCTLR_C_BIT; \
\
write_sctlr_el##_el(sctlr); \ write_sctlr_el##_el(sctlr); \
\ \
/* Ensure the MMU enable takes effect immediately */ \ /* Ensure the MMU enable takes effect immediately */ \
......
...@@ -38,12 +38,12 @@ ...@@ -38,12 +38,12 @@
#pragma weak bl31_plat_enable_mmu #pragma weak bl31_plat_enable_mmu
#pragma weak bl32_plat_enable_mmu #pragma weak bl32_plat_enable_mmu
void bl31_plat_enable_mmu(void) void bl31_plat_enable_mmu(uint32_t flags)
{ {
enable_mmu_el3(); enable_mmu_el3(flags);
} }
void bl32_plat_enable_mmu(void) void bl32_plat_enable_mmu(uint32_t flags)
{ {
enable_mmu_el1(); enable_mmu_el1(flags);
} }
...@@ -119,7 +119,7 @@ const unsigned int num_sec_irqs = sizeof(irq_sec_array) / ...@@ -119,7 +119,7 @@ const unsigned int num_sec_irqs = sizeof(irq_sec_array) /
mmap_add(fvp_mmap); \ mmap_add(fvp_mmap); \
init_xlat_tables(); \ init_xlat_tables(); \
\ \
enable_mmu_el##_el(); \ enable_mmu_el##_el(0); \
} }
/* Define EL1 and EL3 variants of the function initialising the MMU */ /* Define EL1 and EL3 variants of the function initialising the MMU */
......
...@@ -361,7 +361,7 @@ static unsigned int psci_afflvl0_on_finish(aff_map_node_t *cpu_node) ...@@ -361,7 +361,7 @@ static unsigned int psci_afflvl0_on_finish(aff_map_node_t *cpu_node)
/* /*
* Arch. management: Turn on mmu & restore architectural state * Arch. management: Turn on mmu & restore architectural state
*/ */
bl31_plat_enable_mmu(); bl31_plat_enable_mmu(0);
/* /*
* All the platform specific actions for turning this cpu * All the platform specific actions for turning this cpu
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment