xref: /rk3399_ARM-atf/lib/extensions/mpam/mpam.c (revision c42aefd3eb1b5888ee6f3d1f8645b62ec850cdcc)
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