Commit 64ee263e authored by Jeenu Viswambharan's avatar Jeenu Viswambharan
Browse files

DynamIQ: Enable MMU without using stack



Having an active stack while enabling MMU has shown coherency problems.
This patch builds on top of translation library changes that introduces
MMU-enabling without using stacks.

Previously, with HW_ASSISTED_COHERENCY, data caches were disabled while
enabling MMU only because of active stack. Now that we can enable MMU
without using stack, we can enable both MMU and data caches at the same
time.

NOTE: Since this feature depends on using translation table library v2,
disallow using translation table library v1 with HW_ASSISTED_COHERENCY.

Fixes ARM-software/tf-issues#566

Change-Id: Ie55aba0c23ee9c5109eb3454cb8fa45d74f8bbb2
Signed-off-by: default avatarJeenu Viswambharan <jeenu.viswambharan@arm.com>
parent 92bec97f
...@@ -170,15 +170,12 @@ func bl31_warm_entrypoint ...@@ -170,15 +170,12 @@ func bl31_warm_entrypoint
* enter coherency (as CPUs already are); and there's no reason to have * enter coherency (as CPUs already are); and there's no reason to have
* caches disabled either. * caches disabled either.
*/ */
mov x0, #DISABLE_DCACHE
bl bl31_plat_enable_mmu
#if HW_ASSISTED_COHERENCY || WARMBOOT_ENABLE_DCACHE_EARLY #if HW_ASSISTED_COHERENCY || WARMBOOT_ENABLE_DCACHE_EARLY
mrs x0, sctlr_el3 mov x0, xzr
orr x0, x0, #SCTLR_C_BIT #else
msr sctlr_el3, x0 mov x0, #DISABLE_DCACHE
isb
#endif #endif
bl bl31_plat_enable_mmu
bl psci_warmboot_entrypoint bl psci_warmboot_entrypoint
......
...@@ -298,20 +298,17 @@ func sp_min_warm_entrypoint ...@@ -298,20 +298,17 @@ func sp_min_warm_entrypoint
* enter coherency (as CPUs already are); and there's no reason to have * enter coherency (as CPUs already are); and there's no reason to have
* caches disabled either. * caches disabled either.
*/ */
#if HW_ASSISTED_COHERENCY || WARMBOOT_ENABLE_DCACHE_EARLY
mov r0, #0
#else
mov r0, #DISABLE_DCACHE mov r0, #DISABLE_DCACHE
#endif
bl bl32_plat_enable_mmu bl bl32_plat_enable_mmu
#if SP_MIN_WITH_SECURE_FIQ #if SP_MIN_WITH_SECURE_FIQ
route_fiq_to_sp_min r0 route_fiq_to_sp_min r0
#endif #endif
#if HW_ASSISTED_COHERENCY || WARMBOOT_ENABLE_DCACHE_EARLY
ldcopr r0, SCTLR
orr r0, r0, #SCTLR_C_BIT
stcopr r0, SCTLR
isb
#endif
bl sp_min_warm_boot bl sp_min_warm_boot
bl smc_get_next_ctx bl smc_get_next_ctx
/* r0 points to `smc_ctx_t` */ /* r0 points to `smc_ctx_t` */
......
...@@ -1997,6 +1997,25 @@ state. This function must return a pointer to the ``entry_point_info`` structure ...@@ -1997,6 +1997,25 @@ state. This function must return a pointer to the ``entry_point_info`` structure
(that was copied during ``bl31_early_platform_setup()``) if the image exists. It (that was copied during ``bl31_early_platform_setup()``) if the image exists. It
should return NULL otherwise. should return NULL otherwise.
Function : bl31_plat_enable_mmu [optional]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
::
Argument : uint32_t
Return : void
This function enables the MMU. The boot code calls this function with MMU and
caches disabled. This function should program necessary registers to enable
translation, and upon return, the MMU on the calling PE must be enabled.
The function must honor flags passed in the first argument. These flags are
defined by the translation library, and can be found in the file
``include/lib/xlat_tables/xlat_mmu_helpers.h``.
On DynamIQ systems, this function must not use stack while enabling MMU, which
is how the function in xlat table library version 2 is implementated.
Function : plat\_get\_syscnt\_freq2() [mandatory] Function : plat\_get\_syscnt\_freq2() [mandatory]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
......
...@@ -454,6 +454,10 @@ Common build options ...@@ -454,6 +454,10 @@ Common build options
management operations. This option defaults to 0 and if it is enabled, management operations. This option defaults to 0 and if it is enabled,
then it implies ``WARMBOOT_ENABLE_DCACHE_EARLY`` is also enabled. then it implies ``WARMBOOT_ENABLE_DCACHE_EARLY`` is also enabled.
Note that, when ``HW_ASSISTED_COHERENCY`` is enabled, version 2 of
translation library (xlat tables v2) must be used; version 1 of translation
library is not supported.
- ``JUNO_AARCH32_EL3_RUNTIME``: This build flag enables you to execute EL3 - ``JUNO_AARCH32_EL3_RUNTIME``: This build flag enables you to execute EL3
runtime software in AArch32 mode, which is required to run AArch32 on Juno. runtime software in AArch32 mode, which is required to run AArch32 on Juno.
By default this flag is set to '0'. Enabling this flag builds BL1 and BL2 in By default this flag is set to '0'. Enabling this flag builds BL1 and BL2 in
......
...@@ -11,6 +11,10 @@ ...@@ -11,6 +11,10 @@
#include <platform_def.h> #include <platform_def.h>
#include <xlat_tables_arch.h> #include <xlat_tables_arch.h>
#if HW_ASSISTED_COHERENCY
#error xlat tables v2 must be used with HW_ASSISTED_COHERENCY
#endif
/* /*
* If the platform hasn't defined a physical and a virtual address space size * If the platform hasn't defined a physical and a virtual address space size
* default to ADDR_SPACE_SIZE. * default to ADDR_SPACE_SIZE.
......
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
* provide typical implementations that may be re-used by multiple * provide typical implementations that may be re-used by multiple
* platforms but may also be overridden by a platform if required. * platforms but may also be overridden by a platform if required.
*/ */
#pragma weak bl31_plat_enable_mmu
#pragma weak bl32_plat_enable_mmu
#pragma weak bl31_plat_runtime_setup #pragma weak bl31_plat_runtime_setup
#if !ERROR_DEPRECATED #if !ERROR_DEPRECATED
#pragma weak plat_get_syscnt_freq2 #pragma weak plat_get_syscnt_freq2
...@@ -33,16 +31,6 @@ ...@@ -33,16 +31,6 @@
#pragma weak plat_ea_handler #pragma weak plat_ea_handler
void bl31_plat_enable_mmu(uint32_t flags)
{
enable_mmu_el3(flags);
}
void bl32_plat_enable_mmu(uint32_t flags)
{
enable_mmu_el1(flags);
}
void bl31_plat_runtime_setup(void) void bl31_plat_runtime_setup(void)
{ {
#if MULTI_CONSOLE_API #if MULTI_CONSOLE_API
......
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
.weak plat_disable_acp .weak plat_disable_acp
.weak bl1_plat_prepare_exit .weak bl1_plat_prepare_exit
.weak plat_panic_handler .weak plat_panic_handler
.weak bl31_plat_enable_mmu
.weak bl32_plat_enable_mmu
#if !ENABLE_PLAT_COMPAT #if !ENABLE_PLAT_COMPAT
.globl platform_get_core_pos .globl platform_get_core_pos
...@@ -164,3 +166,23 @@ func plat_panic_handler ...@@ -164,3 +166,23 @@ func plat_panic_handler
wfi wfi
b plat_panic_handler b plat_panic_handler
endfunc plat_panic_handler endfunc plat_panic_handler
/* -----------------------------------------------------
* void bl31_plat_enable_mmu(uint32_t flags);
*
* Enable MMU in BL31.
* -----------------------------------------------------
*/
func bl31_plat_enable_mmu
b enable_mmu_direct_el3
endfunc bl31_plat_enable_mmu
/* -----------------------------------------------------
* void bl32_plat_enable_mmu(uint32_t flags);
*
* Enable MMU in BL32.
* -----------------------------------------------------
*/
func bl32_plat_enable_mmu
b enable_mmu_direct_el1
endfunc bl32_plat_enable_mmu
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