xref: /rk3399_ARM-atf/lib/xlat_tables_v2/aarch64/enable_mmu.S (revision 4c700c1563aff7b51df95f17e952e050b9b4e37f)
10cc7aa89SJeenu Viswambharan/*
2*4c700c15SGovindraj Raja * Copyright (c) 2018, Arm Limited and Contributors. All rights reserved.
30cc7aa89SJeenu Viswambharan *
40cc7aa89SJeenu Viswambharan * SPDX-License-Identifier: BSD-3-Clause
50cc7aa89SJeenu Viswambharan */
60cc7aa89SJeenu Viswambharan
70cc7aa89SJeenu Viswambharan#include <asm_macros.S>
80cc7aa89SJeenu Viswambharan#include <assert_macros.S>
909d40e0eSAntonio Nino Diaz#include <lib/xlat_tables/xlat_tables_v2.h>
100cc7aa89SJeenu Viswambharan
110cc7aa89SJeenu Viswambharan	.global	enable_mmu_direct_el1
121a92a0e0SAntonio Nino Diaz	.global	enable_mmu_direct_el2
130cc7aa89SJeenu Viswambharan	.global	enable_mmu_direct_el3
140cc7aa89SJeenu Viswambharan
150cc7aa89SJeenu Viswambharan	/* Macros to read and write to system register for a given EL. */
160cc7aa89SJeenu Viswambharan	.macro _msr reg_name, el, gp_reg
170cc7aa89SJeenu Viswambharan	msr	\reg_name\()_el\()\el, \gp_reg
180cc7aa89SJeenu Viswambharan	.endm
190cc7aa89SJeenu Viswambharan
200cc7aa89SJeenu Viswambharan	.macro _mrs gp_reg, reg_name, el
210cc7aa89SJeenu Viswambharan	mrs	\gp_reg, \reg_name\()_el\()\el
220cc7aa89SJeenu Viswambharan	.endm
230cc7aa89SJeenu Viswambharan
241a92a0e0SAntonio Nino Diaz	.macro tlbi_invalidate_all el
251a92a0e0SAntonio Nino Diaz	.if \el == 1
261a92a0e0SAntonio Nino Diaz		TLB_INVALIDATE(vmalle1)
271a92a0e0SAntonio Nino Diaz	.elseif \el == 2
281a92a0e0SAntonio Nino Diaz		TLB_INVALIDATE(alle2)
291a92a0e0SAntonio Nino Diaz	.elseif \el == 3
301a92a0e0SAntonio Nino Diaz		TLB_INVALIDATE(alle3)
311a92a0e0SAntonio Nino Diaz	.else
321a92a0e0SAntonio Nino Diaz		.error "EL must be 1, 2 or 3"
331a92a0e0SAntonio Nino Diaz	.endif
341a92a0e0SAntonio Nino Diaz	.endm
351a92a0e0SAntonio Nino Diaz
361a92a0e0SAntonio Nino Diaz	/* void enable_mmu_direct_el<x>(unsigned int flags) */
370cc7aa89SJeenu Viswambharan	.macro define_mmu_enable_func el
380cc7aa89SJeenu Viswambharan	func enable_mmu_direct_\()el\el
390cc7aa89SJeenu Viswambharan#if ENABLE_ASSERTIONS
400cc7aa89SJeenu Viswambharan		_mrs	x1, sctlr, \el
410cc7aa89SJeenu Viswambharan		tst	x1, #SCTLR_M_BIT
420cc7aa89SJeenu Viswambharan		ASM_ASSERT(eq)
430cc7aa89SJeenu Viswambharan#endif
441a92a0e0SAntonio Nino Diaz		/* Invalidate all TLB entries */
451a92a0e0SAntonio Nino Diaz		tlbi_invalidate_all \el
460cc7aa89SJeenu Viswambharan
470cc7aa89SJeenu Viswambharan		mov	x7, x0
48f1722b69SSoby Mathew		adrp	x0, mmu_cfg_params
49f1722b69SSoby Mathew		add	x0, x0, :lo12:mmu_cfg_params
500cc7aa89SJeenu Viswambharan
510cc7aa89SJeenu Viswambharan		/* MAIR */
526563c0beSAntonio Nino Diaz		ldr	x1, [x0, #(MMU_CFG_MAIR << 3)]
530cc7aa89SJeenu Viswambharan		_msr	mair, \el, x1
540cc7aa89SJeenu Viswambharan
550cc7aa89SJeenu Viswambharan		/* TCR */
566563c0beSAntonio Nino Diaz		ldr	x2, [x0, #(MMU_CFG_TCR << 3)]
570cc7aa89SJeenu Viswambharan		_msr	tcr, \el, x2
580cc7aa89SJeenu Viswambharan
590cc7aa89SJeenu Viswambharan		/* TTBR */
606563c0beSAntonio Nino Diaz		ldr	x3, [x0, #(MMU_CFG_TTBR0 << 3)]
610cc7aa89SJeenu Viswambharan		_msr	ttbr0, \el, x3
620cc7aa89SJeenu Viswambharan
630cc7aa89SJeenu Viswambharan		/*
640cc7aa89SJeenu Viswambharan		 * Ensure all translation table writes have drained into memory, the TLB
650cc7aa89SJeenu Viswambharan		 * invalidation is complete, and translation register writes are
660cc7aa89SJeenu Viswambharan		 * committed before enabling the MMU
670cc7aa89SJeenu Viswambharan		 */
680cc7aa89SJeenu Viswambharan		dsb	ish
690cc7aa89SJeenu Viswambharan		isb
700cc7aa89SJeenu Viswambharan
710cc7aa89SJeenu Viswambharan		/* Set and clear required fields of SCTLR */
720cc7aa89SJeenu Viswambharan		_mrs	x4, sctlr, \el
730cc7aa89SJeenu Viswambharan		mov_imm	x5, SCTLR_WXN_BIT | SCTLR_C_BIT | SCTLR_M_BIT
740cc7aa89SJeenu Viswambharan		orr	x4, x4, x5
750cc7aa89SJeenu Viswambharan
760cc7aa89SJeenu Viswambharan		/* Additionally, amend SCTLR fields based on flags */
770cc7aa89SJeenu Viswambharan		bic	x5, x4, #SCTLR_C_BIT
780cc7aa89SJeenu Viswambharan		tst	x7, #DISABLE_DCACHE
790cc7aa89SJeenu Viswambharan		csel	x4, x5, x4, ne
800cc7aa89SJeenu Viswambharan
810cc7aa89SJeenu Viswambharan		_msr	sctlr, \el, x4
820cc7aa89SJeenu Viswambharan		isb
830cc7aa89SJeenu Viswambharan
840cc7aa89SJeenu Viswambharan		ret
850cc7aa89SJeenu Viswambharan	endfunc enable_mmu_direct_\()el\el
860cc7aa89SJeenu Viswambharan	.endm
870cc7aa89SJeenu Viswambharan
880cc7aa89SJeenu Viswambharan	/*
89702b600fSAntonio Nino Diaz	 * Define MMU-enabling functions for EL1, EL2 and EL3:
900cc7aa89SJeenu Viswambharan	 *
910cc7aa89SJeenu Viswambharan	 *  enable_mmu_direct_el1
92702b600fSAntonio Nino Diaz	 *  enable_mmu_direct_el2
930cc7aa89SJeenu Viswambharan	 *  enable_mmu_direct_el3
940cc7aa89SJeenu Viswambharan	 */
950cc7aa89SJeenu Viswambharan	define_mmu_enable_func 1
961a92a0e0SAntonio Nino Diaz	define_mmu_enable_func 2
970cc7aa89SJeenu Viswambharan	define_mmu_enable_func 3
98