MPAM: enable MPAM EL2 traps
authorLouis Mayencourt <louis.mayencourt@arm.com>
Mon, 11 Feb 2019 11:25:50 +0000 (11:25 +0000)
committerLouis Mayencourt <louis.mayencourt@arm.com>
Thu, 28 Feb 2019 10:28:25 +0000 (10:28 +0000)
Complete the MPAM enablement in TF-A for lower ELs by enabling the EL2
traps in MPAMHCR_EL2 and MPAM2_EL2.This prevents an
MPAM-unaware-hypervisor to be restricted by an MPAM-aware-guest.

Change-Id: I47bf3f833fa22baa590f83d49cc0e3f2974e698d
Signed-off-by: Louis Mayencourt <louis.mayencourt@arm.com>
include/arch/aarch64/arch.h
lib/extensions/mpam/mpam.c

index b9d1f9faeee44ba4b4e7c014cf4eb40d140532d6..88a2855483298e3493e9f0800980ecc5e92e3456 100644 (file)
 
 /* 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)
 
index 01667079019578d5edaf08a2d380df8fec942af5..e794f013b65394830a8969d0901313186bfb4c47 100644 (file)
@@ -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);
+               }
        }
 }