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 75f835918SJeenu Viswambharan #include <arch.h> 85f835918SJeenu Viswambharan #include <arch_helpers.h> 95f835918SJeenu Viswambharan #include <mpam.h> 105f835918SJeenu Viswambharan #include <stdbool.h> 115f835918SJeenu Viswambharan 125f835918SJeenu Viswambharan bool mpam_supported(void) 135f835918SJeenu Viswambharan { 145f835918SJeenu Viswambharan uint64_t features = read_id_aa64dfr0_el1() >> ID_AA64PFR0_MPAM_SHIFT; 155f835918SJeenu Viswambharan 165f835918SJeenu Viswambharan return ((features & ID_AA64PFR0_MPAM_MASK) != 0U); 175f835918SJeenu Viswambharan } 185f835918SJeenu Viswambharan 19*40daecc1SAntonio Nino Diaz void mpam_enable(bool el2_unused) 205f835918SJeenu Viswambharan { 215f835918SJeenu Viswambharan if (!mpam_supported()) 225f835918SJeenu Viswambharan return; 235f835918SJeenu Viswambharan 245f835918SJeenu Viswambharan /* 255f835918SJeenu Viswambharan * Enable MPAM, and disable trapping to EL3 when lower ELs access their 265f835918SJeenu Viswambharan * own MPAM registers. 275f835918SJeenu Viswambharan */ 285f835918SJeenu Viswambharan write_mpam3_el3(MPAM3_EL3_MPAMEN_BIT); 295f835918SJeenu Viswambharan 305f835918SJeenu Viswambharan /* 315f835918SJeenu Viswambharan * If EL2 is implemented but unused, disable trapping to EL2 when lower 325f835918SJeenu Viswambharan * ELs access their own MPAM registers. 335f835918SJeenu Viswambharan */ 34*40daecc1SAntonio Nino Diaz if (el2_unused) { 355f835918SJeenu Viswambharan write_mpam2_el2(0); 365f835918SJeenu Viswambharan 375f835918SJeenu Viswambharan if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) 385f835918SJeenu Viswambharan write_mpamhcr_el2(0); 395f835918SJeenu Viswambharan } 405f835918SJeenu Viswambharan } 41