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 7*09d40e0eSAntonio Nino Diaz #include <stdbool.h> 8*09d40e0eSAntonio Nino Diaz 95f835918SJeenu Viswambharan #include <arch.h> 105f835918SJeenu Viswambharan #include <arch_helpers.h> 11*09d40e0eSAntonio 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. 345f835918SJeenu Viswambharan */ 3540daecc1SAntonio Nino Diaz if (el2_unused) { 365f835918SJeenu Viswambharan write_mpam2_el2(0); 375f835918SJeenu Viswambharan 385f835918SJeenu Viswambharan if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) 395f835918SJeenu Viswambharan write_mpamhcr_el2(0); 405f835918SJeenu Viswambharan } 415f835918SJeenu Viswambharan } 42