15f835918SJeenu Viswambharan /* 2*c42aefd3SArvind Ram Prakash * Copyright (c) 2018-2025, 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> 10dbcc44a1SAlexei Fedorov #include <arch_features.h> 115f835918SJeenu Viswambharan #include <arch_helpers.h> 1209d40e0eSAntonio Nino Diaz #include <lib/extensions/mpam.h> 135f835918SJeenu Viswambharan 14ac4f6aafSArvind Ram Prakash void mpam_enable_per_world(per_world_context_t *per_world_ctx) 155f835918SJeenu Viswambharan { 16edebefbcSArvind Ram Prakash u_register_t mpam3_el3; 17edebefbcSArvind Ram Prakash 185f835918SJeenu Viswambharan /* 195f835918SJeenu Viswambharan * Enable MPAM, and disable trapping to EL3 when lower ELs access their 20edebefbcSArvind Ram Prakash * own MPAM registers 215f835918SJeenu Viswambharan */ 22ac4f6aafSArvind Ram Prakash mpam3_el3 = per_world_ctx->ctx_mpam3_el3; 23edebefbcSArvind Ram Prakash mpam3_el3 = (mpam3_el3 | MPAM3_EL3_MPAMEN_BIT) & 24edebefbcSArvind Ram Prakash ~(MPAM3_EL3_TRAPLOWER_BIT); 25ac4f6aafSArvind Ram Prakash 26ac4f6aafSArvind Ram Prakash per_world_ctx->ctx_mpam3_el3 = mpam3_el3; 2760d330dcSBoyan Karatotev } 2860d330dcSBoyan Karatotev 29*c42aefd3SArvind Ram Prakash void mpam_init_el3(void) 30*c42aefd3SArvind Ram Prakash { 31*c42aefd3SArvind Ram Prakash if (is_feat_mpam_pe_bw_ctrl_supported()) { 32*c42aefd3SArvind Ram Prakash u_register_t mpambw3_el3; 33*c42aefd3SArvind Ram Prakash 34*c42aefd3SArvind Ram Prakash /* 35*c42aefd3SArvind Ram Prakash * Disables EL3 trapping of MPAM PE-side bandwidth 36*c42aefd3SArvind Ram Prakash * control registers - MPAMBW2_EL2, MPAMBWCAP_EL2, 37*c42aefd3SArvind Ram Prakash * MPAMBW1_EL1, MPAMBW0_EL1, MPAMBWSM_EL1, 38*c42aefd3SArvind Ram Prakash * MPAMBWIDR_EL1. 39*c42aefd3SArvind Ram Prakash */ 40*c42aefd3SArvind Ram Prakash mpambw3_el3 = read_mpambw3_el3() | 41*c42aefd3SArvind Ram Prakash MPAMBW3_EL3_NTRAPLOWER_BIT; 42*c42aefd3SArvind Ram Prakash 43*c42aefd3SArvind Ram Prakash /* 44*c42aefd3SArvind Ram Prakash * Disable use of MPAM PE side bandwidth controls in EL3 45*c42aefd3SArvind Ram Prakash * since we don't use it in EL3. 46*c42aefd3SArvind Ram Prakash */ 47*c42aefd3SArvind Ram Prakash mpambw3_el3 &= ~(MPAMBW3_EL3_HW_SCALE_ENABLE_BIT | 48*c42aefd3SArvind Ram Prakash MPAMBW3_EL3_ENABLED_BIT | 49*c42aefd3SArvind Ram Prakash MPAMBW3_EL3_HARDLIM_BIT); 50*c42aefd3SArvind Ram Prakash 51*c42aefd3SArvind Ram Prakash write_mpambw3_el3(mpambw3_el3); 52*c42aefd3SArvind Ram Prakash } 53*c42aefd3SArvind Ram Prakash } 54*c42aefd3SArvind Ram Prakash 555f835918SJeenu Viswambharan /* 5660d330dcSBoyan Karatotev * If EL2 is implemented but unused, disable trapping to EL2 when lower ELs 5760d330dcSBoyan Karatotev * access their own MPAM registers. 585f835918SJeenu Viswambharan */ 5960d330dcSBoyan Karatotev void mpam_init_el2_unused(void) 6060d330dcSBoyan Karatotev { 61dbcc44a1SAlexei Fedorov write_mpam2_el2(0ULL); 625f835918SJeenu Viswambharan 63dbcc44a1SAlexei Fedorov if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) { 64dbcc44a1SAlexei Fedorov write_mpamhcr_el2(0ULL); 65dbcc44a1SAlexei Fedorov } 6660d330dcSBoyan Karatotev 67*c42aefd3SArvind Ram Prakash if (is_feat_mpam_pe_bw_ctrl_supported()) { 68*c42aefd3SArvind Ram Prakash u_register_t mpambw2_el2; 69*c42aefd3SArvind Ram Prakash 70*c42aefd3SArvind Ram Prakash /* 71*c42aefd3SArvind Ram Prakash * Configure MPAMBW2_EL2 to allow EL1 direct access to 72*c42aefd3SArvind Ram Prakash * specific MPAM bandwidth registers (MPAMBWIDR_EL1, 73*c42aefd3SArvind Ram Prakash * MPAMBW0_EL1, MPAMBW1_EL1, MPAMBWSM_EL1) 74*c42aefd3SArvind Ram Prakash * by disabling traps for these accesses. 75*c42aefd3SArvind Ram Prakash */ 76*c42aefd3SArvind Ram Prakash mpambw2_el2 = read_mpambw2_el2() | 77*c42aefd3SArvind Ram Prakash MPAMBW2_EL2_NTRAP_MPAMBWIDR_EL1_BIT | 78*c42aefd3SArvind Ram Prakash MPAMBW2_EL2_NTRAP_MPAMBW0_EL1_BIT | 79*c42aefd3SArvind Ram Prakash MPAMBW2_EL2_NTRAP_MPAMBW1_EL1_BIT | 80*c42aefd3SArvind Ram Prakash MPAMBW2_EL2_NTRAP_MPAMBWSM_EL1_BIT; 81*c42aefd3SArvind Ram Prakash /* 82*c42aefd3SArvind Ram Prakash * MPAM PE side bandwidth controls are disabled in EL2 83*c42aefd3SArvind Ram Prakash * since NS-EL2 is unused. 84*c42aefd3SArvind Ram Prakash */ 85*c42aefd3SArvind Ram Prakash mpambw2_el2 &= (MPAMBW2_EL2_HW_SCALE_ENABLE_BIT | 86*c42aefd3SArvind Ram Prakash MPAMBW2_EL2_ENABLED_BIT | 87*c42aefd3SArvind Ram Prakash MPAMBW2_EL2_HARDLIM_BIT); 88*c42aefd3SArvind Ram Prakash 89*c42aefd3SArvind Ram Prakash write_mpambw2_el2(mpambw2_el2); 90*c42aefd3SArvind Ram Prakash } 915f835918SJeenu Viswambharan } 92