xref: /rk3399_ARM-atf/lib/xlat_tables_v2/aarch32/enable_mmu.S (revision 72e8f2456af54b75a0a1d92aadfce0b4bcde6ba1)
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
111a92a0e0SAntonio Nino Diaz	.global	enable_mmu_direct_svc_mon
121a92a0e0SAntonio Nino Diaz	.global	enable_mmu_direct_hyp
130cc7aa89SJeenu Viswambharan
141a92a0e0SAntonio Nino Diaz	/* void enable_mmu_direct_svc_mon(unsigned int flags) */
151a92a0e0SAntonio Nino Diazfunc enable_mmu_direct_svc_mon
160cc7aa89SJeenu Viswambharan	/* Assert that MMU is turned off */
170cc7aa89SJeenu Viswambharan#if ENABLE_ASSERTIONS
180cc7aa89SJeenu Viswambharan	ldcopr  r1, SCTLR
190cc7aa89SJeenu Viswambharan	tst	r1, #SCTLR_M_BIT
200cc7aa89SJeenu Viswambharan	ASM_ASSERT(eq)
210cc7aa89SJeenu Viswambharan#endif
220cc7aa89SJeenu Viswambharan
230cc7aa89SJeenu Viswambharan	/* Invalidate TLB entries */
240cc7aa89SJeenu Viswambharan	TLB_INVALIDATE(r0, TLBIALL)
250cc7aa89SJeenu Viswambharan
260cc7aa89SJeenu Viswambharan	mov	r3, r0
270cc7aa89SJeenu Viswambharan	ldr	r0, =mmu_cfg_params
280cc7aa89SJeenu Viswambharan
296563c0beSAntonio Nino Diaz	/* MAIR0. Only the lower 32 bits are used. */
306563c0beSAntonio Nino Diaz	ldr	r1, [r0, #(MMU_CFG_MAIR << 3)]
310cc7aa89SJeenu Viswambharan	stcopr	r1, MAIR0
320cc7aa89SJeenu Viswambharan
336563c0beSAntonio Nino Diaz	/* TTBCR. Only the lower 32 bits are used. */
346563c0beSAntonio Nino Diaz	ldr	r2, [r0, #(MMU_CFG_TCR << 3)]
350cc7aa89SJeenu Viswambharan	stcopr	r2, TTBCR
360cc7aa89SJeenu Viswambharan
370cc7aa89SJeenu Viswambharan	/* TTBR0 */
386563c0beSAntonio Nino Diaz	ldr	r1, [r0, #(MMU_CFG_TTBR0 << 3)]
396563c0beSAntonio Nino Diaz	ldr	r2, [r0, #((MMU_CFG_TTBR0 << 3) + 4)]
400cc7aa89SJeenu Viswambharan	stcopr16	r1, r2, TTBR0_64
410cc7aa89SJeenu Viswambharan
420cc7aa89SJeenu Viswambharan	/* TTBR1 is unused right now; set it to 0. */
430cc7aa89SJeenu Viswambharan	mov	r1, #0
440cc7aa89SJeenu Viswambharan	mov	r2, #0
450cc7aa89SJeenu Viswambharan	stcopr16	r1, r2, TTBR1_64
460cc7aa89SJeenu Viswambharan
470cc7aa89SJeenu Viswambharan	/*
480cc7aa89SJeenu Viswambharan	 * Ensure all translation table writes have drained into memory, the TLB
490cc7aa89SJeenu Viswambharan	 * invalidation is complete, and translation register writes are
500cc7aa89SJeenu Viswambharan	 * committed before enabling the MMU
510cc7aa89SJeenu Viswambharan	 */
520cc7aa89SJeenu Viswambharan	dsb	ish
530cc7aa89SJeenu Viswambharan	isb
540cc7aa89SJeenu Viswambharan
550cc7aa89SJeenu Viswambharan	/* Enable enable MMU by honoring flags */
560cc7aa89SJeenu Viswambharan	ldcopr  r1, SCTLR
570cc7aa89SJeenu Viswambharan	ldr	r2, =(SCTLR_WXN_BIT | SCTLR_C_BIT | SCTLR_M_BIT)
580cc7aa89SJeenu Viswambharan	orr	r1, r1, r2
590cc7aa89SJeenu Viswambharan
600cc7aa89SJeenu Viswambharan	/* Clear C bit if requested */
610cc7aa89SJeenu Viswambharan	tst	r3, #DISABLE_DCACHE
620cc7aa89SJeenu Viswambharan	bicne	r1, r1, #SCTLR_C_BIT
630cc7aa89SJeenu Viswambharan
640cc7aa89SJeenu Viswambharan	stcopr	r1, SCTLR
650cc7aa89SJeenu Viswambharan	isb
660cc7aa89SJeenu Viswambharan
670cc7aa89SJeenu Viswambharan	bx	lr
681a92a0e0SAntonio Nino Diazendfunc enable_mmu_direct_svc_mon
691a92a0e0SAntonio Nino Diaz
701a92a0e0SAntonio Nino Diaz
711a92a0e0SAntonio Nino Diaz	/* void enable_mmu_direct_hyp(unsigned int flags) */
721a92a0e0SAntonio Nino Diazfunc enable_mmu_direct_hyp
731a92a0e0SAntonio Nino Diaz	/* Assert that MMU is turned off */
741a92a0e0SAntonio Nino Diaz#if ENABLE_ASSERTIONS
751a92a0e0SAntonio Nino Diaz	ldcopr  r1, HSCTLR
761a92a0e0SAntonio Nino Diaz	tst	r1, #HSCTLR_M_BIT
771a92a0e0SAntonio Nino Diaz	ASM_ASSERT(eq)
781a92a0e0SAntonio Nino Diaz#endif
791a92a0e0SAntonio Nino Diaz
801a92a0e0SAntonio Nino Diaz	/* Invalidate TLB entries */
811a92a0e0SAntonio Nino Diaz	TLB_INVALIDATE(r0, TLBIALL)
821a92a0e0SAntonio Nino Diaz
831a92a0e0SAntonio Nino Diaz	mov	r3, r0
841a92a0e0SAntonio Nino Diaz	ldr	r0, =mmu_cfg_params
851a92a0e0SAntonio Nino Diaz
861a92a0e0SAntonio Nino Diaz	/* HMAIR0 */
871a92a0e0SAntonio Nino Diaz	ldr	r1, [r0, #(MMU_CFG_MAIR << 3)]
881a92a0e0SAntonio Nino Diaz	stcopr	r1, HMAIR0
891a92a0e0SAntonio Nino Diaz
901a92a0e0SAntonio Nino Diaz	/* HTCR */
911a92a0e0SAntonio Nino Diaz	ldr	r2, [r0, #(MMU_CFG_TCR << 3)]
921a92a0e0SAntonio Nino Diaz	stcopr	r2, HTCR
931a92a0e0SAntonio Nino Diaz
941a92a0e0SAntonio Nino Diaz	/* HTTBR */
951a92a0e0SAntonio Nino Diaz	ldr	r1, [r0, #(MMU_CFG_TTBR0 << 3)]
961a92a0e0SAntonio Nino Diaz	ldr	r2, [r0, #((MMU_CFG_TTBR0 << 3) + 4)]
971a92a0e0SAntonio Nino Diaz	stcopr16	r1, r2, HTTBR_64
981a92a0e0SAntonio Nino Diaz
991a92a0e0SAntonio Nino Diaz	/*
1001a92a0e0SAntonio Nino Diaz	 * Ensure all translation table writes have drained into memory, the TLB
1011a92a0e0SAntonio Nino Diaz	 * invalidation is complete, and translation register writes are
1021a92a0e0SAntonio Nino Diaz	 * committed before enabling the MMU
1031a92a0e0SAntonio Nino Diaz	 */
1041a92a0e0SAntonio Nino Diaz	dsb	ish
1051a92a0e0SAntonio Nino Diaz	isb
1061a92a0e0SAntonio Nino Diaz
1071a92a0e0SAntonio Nino Diaz	/* Enable enable MMU by honoring flags */
1081a92a0e0SAntonio Nino Diaz	ldcopr  r1, HSCTLR
1091a92a0e0SAntonio Nino Diaz	ldr	r2, =(HSCTLR_WXN_BIT | HSCTLR_C_BIT | HSCTLR_M_BIT)
1101a92a0e0SAntonio Nino Diaz	orr	r1, r1, r2
1111a92a0e0SAntonio Nino Diaz
1121a92a0e0SAntonio Nino Diaz	/* Clear C bit if requested */
1131a92a0e0SAntonio Nino Diaz	tst	r3, #DISABLE_DCACHE
1141a92a0e0SAntonio Nino Diaz	bicne	r1, r1, #HSCTLR_C_BIT
1151a92a0e0SAntonio Nino Diaz
1161a92a0e0SAntonio Nino Diaz	stcopr	r1, HSCTLR
1171a92a0e0SAntonio Nino Diaz	isb
1181a92a0e0SAntonio Nino Diaz
1191a92a0e0SAntonio Nino Diaz	bx	lr
1201a92a0e0SAntonio Nino Diazendfunc enable_mmu_direct_hyp
121