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