mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 01:54:22 +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>
67 lines
2.3 KiB
C
67 lines
2.3 KiB
C
/*
|
|
* Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef __XLAT_MMU_HELPERS_H__
|
|
#define __XLAT_MMU_HELPERS_H__
|
|
|
|
/*
|
|
* The following flags are passed to enable_mmu_xxx() to override the default
|
|
* values used to program system registers while enabling the MMU.
|
|
*/
|
|
|
|
/*
|
|
* When this flag is used, all data access to Normal memory from this EL and all
|
|
* Normal memory accesses to the translation tables of this EL are non-cacheable
|
|
* for all levels of data and unified cache until the caches are enabled by
|
|
* setting the bit SCTLR_ELx.C.
|
|
*/
|
|
#define DISABLE_DCACHE (U(1) << 0)
|
|
|
|
/*
|
|
* Mark the translation tables as non-cacheable for the MMU table walker, which
|
|
* is a different observer from the PE/CPU. If the flag is not specified, the
|
|
* tables are cacheable for the MMU table walker.
|
|
*
|
|
* Note that, as far as the PE/CPU observer is concerned, the attributes used
|
|
* are the ones specified in the translation tables themselves. The MAIR
|
|
* register specifies the cacheability through the field AttrIndx of the lower
|
|
* attributes of the translation tables. The shareability is specified in the SH
|
|
* field of the lower attributes.
|
|
*
|
|
* The MMU table walker uses the attributes specified in the fields ORGNn, IRGNn
|
|
* and SHn of the TCR register to access the translation tables.
|
|
*
|
|
* The attributes specified in the TCR register and the tables can be different
|
|
* as there are no checks to prevent that. Special care must be taken to ensure
|
|
* that there aren't mismatches. The behaviour in that case is described in the
|
|
* sections 'Mismatched memory attributes' in the ARMv8 ARM.
|
|
*/
|
|
#define XLAT_TABLE_NC (U(1) << 1)
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#include <sys/types.h>
|
|
|
|
#ifdef AARCH32
|
|
/* AArch32 specific translation table API */
|
|
void enable_mmu_secure(unsigned int flags);
|
|
|
|
void enable_mmu_direct(unsigned int flags);
|
|
#else
|
|
/* AArch64 specific translation table APIs */
|
|
void enable_mmu_el1(unsigned int flags);
|
|
void enable_mmu_el3(unsigned int flags);
|
|
|
|
void enable_mmu_direct_el1(unsigned int flags);
|
|
void enable_mmu_direct_el3(unsigned int flags);
|
|
#endif /* AARCH32 */
|
|
|
|
int xlat_arch_is_granule_size_supported(size_t size);
|
|
size_t xlat_arch_get_max_supported_granule_size(void);
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* __XLAT_MMU_HELPERS_H__ */
|