15f835918SJeenu Viswambharan /* 25f835918SJeenu Viswambharan * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 35f835918SJeenu Viswambharan * 45f835918SJeenu Viswambharan * SPDX-License-Identifier: BSD-3-Clause 55f835918SJeenu Viswambharan */ 65f835918SJeenu Viswambharan 709d40e0eSAntonio Nino Diaz #include <stdbool.h> 809d40e0eSAntonio Nino Diaz 95f835918SJeenu Viswambharan #include <arch.h> 105f835918SJeenu Viswambharan #include <arch_helpers.h> 1109d40e0eSAntonio Nino Diaz #include <lib/extensions/mpam.h> 125f835918SJeenu Viswambharan 135f835918SJeenu Viswambharan bool mpam_supported(void) 145f835918SJeenu Viswambharan { 155f835918SJeenu Viswambharan uint64_t features = read_id_aa64dfr0_el1() >> ID_AA64PFR0_MPAM_SHIFT; 165f835918SJeenu Viswambharan 175f835918SJeenu Viswambharan return ((features & ID_AA64PFR0_MPAM_MASK) != 0U); 185f835918SJeenu Viswambharan } 195f835918SJeenu Viswambharan 2040daecc1SAntonio Nino Diaz void mpam_enable(bool el2_unused) 215f835918SJeenu Viswambharan { 225f835918SJeenu Viswambharan if (!mpam_supported()) 235f835918SJeenu Viswambharan return; 245f835918SJeenu Viswambharan 255f835918SJeenu Viswambharan /* 265f835918SJeenu Viswambharan * Enable MPAM, and disable trapping to EL3 when lower ELs access their 275f835918SJeenu Viswambharan * own MPAM registers. 285f835918SJeenu Viswambharan */ 295f835918SJeenu Viswambharan write_mpam3_el3(MPAM3_EL3_MPAMEN_BIT); 305f835918SJeenu Viswambharan 315f835918SJeenu Viswambharan /* 325f835918SJeenu Viswambharan * If EL2 is implemented but unused, disable trapping to EL2 when lower 335f835918SJeenu Viswambharan * ELs access their own MPAM registers. 34*537fa859SLouis Mayencourt * If EL2 is implemented and used, enable trapping to EL2. 355f835918SJeenu Viswambharan */ 3640daecc1SAntonio Nino Diaz if (el2_unused) { 375f835918SJeenu Viswambharan write_mpam2_el2(0); 385f835918SJeenu Viswambharan 395f835918SJeenu Viswambharan if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) 405f835918SJeenu Viswambharan write_mpamhcr_el2(0); 41*537fa859SLouis Mayencourt } else { 42*537fa859SLouis Mayencourt write_mpam2_el2(MPAM2_EL2_TRAPMPAM0EL1 | 43*537fa859SLouis Mayencourt MPAM2_EL2_TRAPMPAM1EL1); 44*537fa859SLouis Mayencourt 45*537fa859SLouis Mayencourt if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) { 46*537fa859SLouis Mayencourt write_mpamhcr_el2(MPAMHCR_EL2_TRAP_MPAMIDR_EL1); 47*537fa859SLouis Mayencourt } 485f835918SJeenu Viswambharan } 495f835918SJeenu Viswambharan } 50