mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-16 09:34:18 +00:00

At present, the function provided by the translation library to enable MMU constructs appropriate values for translation library, and programs them to the right registers. The construction of initial values, however, is only required once as both the primary and secondaries program the same values. Additionally, the MMU-enabling function is written in C, which means there's an active stack at the time of enabling MMU. On some systems, like Arm DynamIQ, having active stack while enabling MMU during warm boot might lead to coherency problems. This patch addresses both the above problems by: - Splitting the MMU-enabling function into two: one that sets up values to be programmed into the registers, and another one that takes the pre-computed values and writes to the appropriate registers. With this, the primary effectively calls both functions to have the MMU enabled, but secondaries only need to call the latter. - Rewriting the function that enables MMU in assembly so that it doesn't use stack. This patch fixes a bunch of MISRA issues on the way. Change-Id: I0faca97263a970ffe765f0e731a1417e43fbfc45 Signed-off-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
66 lines
1.3 KiB
ArmAsm
66 lines
1.3 KiB
ArmAsm
/*
|
|
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include <asm_macros.S>
|
|
#include <assert_macros.S>
|
|
#include <xlat_tables_v2.h>
|
|
|
|
.global enable_mmu_direct
|
|
|
|
func enable_mmu_direct
|
|
/* Assert that MMU is turned off */
|
|
#if ENABLE_ASSERTIONS
|
|
ldcopr r1, SCTLR
|
|
tst r1, #SCTLR_M_BIT
|
|
ASM_ASSERT(eq)
|
|
#endif
|
|
|
|
/* Invalidate TLB entries */
|
|
TLB_INVALIDATE(r0, TLBIALL)
|
|
|
|
mov r3, r0
|
|
ldr r0, =mmu_cfg_params
|
|
|
|
/* MAIR0 */
|
|
ldr r1, [r0, #(MMU_CFG_MAIR0 << 2)]
|
|
stcopr r1, MAIR0
|
|
|
|
/* TTBCR */
|
|
ldr r2, [r0, #(MMU_CFG_TCR << 2)]
|
|
stcopr r2, TTBCR
|
|
|
|
/* TTBR0 */
|
|
ldr r1, [r0, #(MMU_CFG_TTBR0_LO << 2)]
|
|
ldr r2, [r0, #(MMU_CFG_TTBR0_HI << 2)]
|
|
stcopr16 r1, r2, TTBR0_64
|
|
|
|
/* TTBR1 is unused right now; set it to 0. */
|
|
mov r1, #0
|
|
mov r2, #0
|
|
stcopr16 r1, r2, TTBR1_64
|
|
|
|
/*
|
|
* Ensure all translation table writes have drained into memory, the TLB
|
|
* invalidation is complete, and translation register writes are
|
|
* committed before enabling the MMU
|
|
*/
|
|
dsb ish
|
|
isb
|
|
|
|
/* Enable enable MMU by honoring flags */
|
|
ldcopr r1, SCTLR
|
|
ldr r2, =(SCTLR_WXN_BIT | SCTLR_C_BIT | SCTLR_M_BIT)
|
|
orr r1, r1, r2
|
|
|
|
/* Clear C bit if requested */
|
|
tst r3, #DISABLE_DCACHE
|
|
bicne r1, r1, #SCTLR_C_BIT
|
|
|
|
stcopr r1, SCTLR
|
|
isb
|
|
|
|
bx lr
|
|
endfunc enable_mmu_direct
|