15f835918SJeenu Viswambharan /* 2*dbcc44a1SAlexei Fedorov * Copyright (c) 2018-2020, 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> 10*dbcc44a1SAlexei Fedorov #include <arch_features.h> 115f835918SJeenu Viswambharan #include <arch_helpers.h> 1209d40e0eSAntonio Nino Diaz #include <lib/extensions/mpam.h> 135f835918SJeenu Viswambharan 1440daecc1SAntonio Nino Diaz void mpam_enable(bool el2_unused) 155f835918SJeenu Viswambharan { 16*dbcc44a1SAlexei Fedorov /* Check if MPAM is implemented */ 17*dbcc44a1SAlexei Fedorov if (get_mpam_version() == 0U) { 185f835918SJeenu Viswambharan return; 19*dbcc44a1SAlexei Fedorov } 205f835918SJeenu Viswambharan 215f835918SJeenu Viswambharan /* 225f835918SJeenu Viswambharan * Enable MPAM, and disable trapping to EL3 when lower ELs access their 235f835918SJeenu Viswambharan * own MPAM registers. 245f835918SJeenu Viswambharan */ 255f835918SJeenu Viswambharan write_mpam3_el3(MPAM3_EL3_MPAMEN_BIT); 265f835918SJeenu Viswambharan 275f835918SJeenu Viswambharan /* 285f835918SJeenu Viswambharan * If EL2 is implemented but unused, disable trapping to EL2 when lower 295f835918SJeenu Viswambharan * ELs access their own MPAM registers. 30537fa859SLouis Mayencourt * If EL2 is implemented and used, enable trapping to EL2. 315f835918SJeenu Viswambharan */ 3240daecc1SAntonio Nino Diaz if (el2_unused) { 33*dbcc44a1SAlexei Fedorov write_mpam2_el2(0ULL); 345f835918SJeenu Viswambharan 35*dbcc44a1SAlexei Fedorov if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) { 36*dbcc44a1SAlexei Fedorov write_mpamhcr_el2(0ULL); 37*dbcc44a1SAlexei Fedorov } 38537fa859SLouis Mayencourt } else { 39537fa859SLouis Mayencourt write_mpam2_el2(MPAM2_EL2_TRAPMPAM0EL1 | 40537fa859SLouis Mayencourt MPAM2_EL2_TRAPMPAM1EL1); 41537fa859SLouis Mayencourt 42537fa859SLouis Mayencourt if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) { 43537fa859SLouis Mayencourt write_mpamhcr_el2(MPAMHCR_EL2_TRAP_MPAMIDR_EL1); 44537fa859SLouis Mayencourt } 455f835918SJeenu Viswambharan } 465f835918SJeenu Viswambharan } 47