xref: /aosp_15_r20/external/arm-trusted-firmware/lib/extensions/mpam/mpam.c (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park  * Copyright (c) 2018-2020, ARM Limited and Contributors. All rights reserved.
3*54fd6939SJiyong Park  *
4*54fd6939SJiyong Park  * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park  */
6*54fd6939SJiyong Park 
7*54fd6939SJiyong Park #include <stdbool.h>
8*54fd6939SJiyong Park 
9*54fd6939SJiyong Park #include <arch.h>
10*54fd6939SJiyong Park #include <arch_features.h>
11*54fd6939SJiyong Park #include <arch_helpers.h>
12*54fd6939SJiyong Park #include <lib/extensions/mpam.h>
13*54fd6939SJiyong Park 
mpam_enable(bool el2_unused)14*54fd6939SJiyong Park void mpam_enable(bool el2_unused)
15*54fd6939SJiyong Park {
16*54fd6939SJiyong Park 	/* Check if MPAM is implemented */
17*54fd6939SJiyong Park 	if (get_mpam_version() == 0U) {
18*54fd6939SJiyong Park 		return;
19*54fd6939SJiyong Park 	}
20*54fd6939SJiyong Park 
21*54fd6939SJiyong Park 	/*
22*54fd6939SJiyong Park 	 * Enable MPAM, and disable trapping to EL3 when lower ELs access their
23*54fd6939SJiyong Park 	 * own MPAM registers.
24*54fd6939SJiyong Park 	 */
25*54fd6939SJiyong Park 	write_mpam3_el3(MPAM3_EL3_MPAMEN_BIT);
26*54fd6939SJiyong Park 
27*54fd6939SJiyong Park 	/*
28*54fd6939SJiyong Park 	 * If EL2 is implemented but unused, disable trapping to EL2 when lower
29*54fd6939SJiyong Park 	 * ELs access their own MPAM registers.
30*54fd6939SJiyong Park 	 * If EL2 is implemented and used, enable trapping to EL2.
31*54fd6939SJiyong Park 	 */
32*54fd6939SJiyong Park 	if (el2_unused) {
33*54fd6939SJiyong Park 		write_mpam2_el2(0ULL);
34*54fd6939SJiyong Park 
35*54fd6939SJiyong Park 		if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) {
36*54fd6939SJiyong Park 			write_mpamhcr_el2(0ULL);
37*54fd6939SJiyong Park 		}
38*54fd6939SJiyong Park 	} else {
39*54fd6939SJiyong Park 		write_mpam2_el2(MPAM2_EL2_TRAPMPAM0EL1 |
40*54fd6939SJiyong Park 				MPAM2_EL2_TRAPMPAM1EL1);
41*54fd6939SJiyong Park 
42*54fd6939SJiyong Park 		if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) {
43*54fd6939SJiyong Park 			write_mpamhcr_el2(MPAMHCR_EL2_TRAP_MPAMIDR_EL1);
44*54fd6939SJiyong Park 		}
45*54fd6939SJiyong Park 	}
46*54fd6939SJiyong Park }
47