diff --git a/include/arch/aarch64/arch.h b/include/arch/aarch64/arch.h index 1032d9ae9bad3115904b834075c45aed8764eb13..e36d66d134cbce00a4959951e8a33f1410a9d84a 100644 --- a/include/arch/aarch64/arch.h +++ b/include/arch/aarch64/arch.h @@ -783,6 +783,10 @@ /* MPAM register definitions */ #define MPAM3_EL3_MPAMEN_BIT (ULL(1) << 63) +#define MPAMHCR_EL2_TRAP_MPAMIDR_EL1 (ULL(1) << 31) + +#define MPAM2_EL2_TRAPMPAM0EL1 (ULL(1) << 49) +#define MPAM2_EL2_TRAPMPAM1EL1 (ULL(1) << 48) #define MPAMIDR_HAS_HCR_BIT (ULL(1) << 17) diff --git a/lib/extensions/mpam/mpam.c b/lib/extensions/mpam/mpam.c index 01667079019578d5edaf08a2d380df8fec942af5..e794f013b65394830a8969d0901313186bfb4c47 100644 --- a/lib/extensions/mpam/mpam.c +++ b/lib/extensions/mpam/mpam.c @@ -31,11 +31,19 @@ void mpam_enable(bool el2_unused) /* * If EL2 is implemented but unused, disable trapping to EL2 when lower * ELs access their own MPAM registers. + * If EL2 is implemented and used, enable trapping to EL2. */ if (el2_unused) { write_mpam2_el2(0); if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) write_mpamhcr_el2(0); + } else { + write_mpam2_el2(MPAM2_EL2_TRAPMPAM0EL1 | + MPAM2_EL2_TRAPMPAM1EL1); + + if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) { + write_mpamhcr_el2(MPAMHCR_EL2_TRAP_MPAMIDR_EL1); + } } }