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 @@
#ifndef __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>
/*
......@@ -67,7 +75,8 @@ void mmap_add(const mmap_region_t *mm);
void init_xlat_tables(void);
void enable_mmu_el1(void);
void enable_mmu_el3(void);
void enable_mmu_el1(uint32_t flags);
void enable_mmu_el3(uint32_t flags);
#endif /*__ASSEMBLY__*/
#endif /* __XLAT_TABLES_H__ */
......@@ -180,7 +180,7 @@ unsigned int plat_get_aff_state(unsigned int, unsigned long);
/*******************************************************************************
* 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)
......@@ -190,6 +190,6 @@ void bl32_platform_setup(void);
/*******************************************************************************
* Optional BL3-2 functions (may be overridden)
******************************************************************************/
void bl32_plat_enable_mmu(void);
void bl32_plat_enable_mmu(uint32_t flags);
#endif /* __PLATFORM_H__ */
......@@ -292,7 +292,7 @@ void init_xlat_tables(void)
* exception level
******************************************************************************/
#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; \
uint32_t sctlr; \
......@@ -330,7 +330,13 @@ void init_xlat_tables(void)
\
sctlr = read_sctlr_el##_el(); \
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); \
\
/* Ensure the MMU enable takes effect immediately */ \
......
......@@ -38,12 +38,12 @@
#pragma weak bl31_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) /
mmap_add(fvp_mmap); \
init_xlat_tables(); \
\
enable_mmu_el##_el(); \
enable_mmu_el##_el(0); \
}
/* 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)
/*
* 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
......
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