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