1 /* 2 * Copyright (c) 2018-2020, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <stdbool.h> 8 9 #include <arch.h> 10 #include <arch_features.h> 11 #include <arch_helpers.h> 12 #include <lib/extensions/mpam.h> 13 mpam_enable(bool el2_unused)14void mpam_enable(bool el2_unused) 15 { 16 /* Check if MPAM is implemented */ 17 if (get_mpam_version() == 0U) { 18 return; 19 } 20 21 /* 22 * Enable MPAM, and disable trapping to EL3 when lower ELs access their 23 * own MPAM registers. 24 */ 25 write_mpam3_el3(MPAM3_EL3_MPAMEN_BIT); 26 27 /* 28 * If EL2 is implemented but unused, disable trapping to EL2 when lower 29 * ELs access their own MPAM registers. 30 * If EL2 is implemented and used, enable trapping to EL2. 31 */ 32 if (el2_unused) { 33 write_mpam2_el2(0ULL); 34 35 if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) { 36 write_mpamhcr_el2(0ULL); 37 } 38 } else { 39 write_mpam2_el2(MPAM2_EL2_TRAPMPAM0EL1 | 40 MPAM2_EL2_TRAPMPAM1EL1); 41 42 if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) { 43 write_mpamhcr_el2(MPAMHCR_EL2_TRAP_MPAMIDR_EL1); 44 } 45 } 46 } 47