xref: /rk3399_ARM-atf/lib/extensions/mpam/mpam.c (revision 537fa859176ff86a9fc5c261384a2d8d0d8c2846)
15f835918SJeenu Viswambharan /*
25f835918SJeenu Viswambharan  * Copyright (c) 2018, 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>
105f835918SJeenu Viswambharan #include <arch_helpers.h>
1109d40e0eSAntonio Nino Diaz #include <lib/extensions/mpam.h>
125f835918SJeenu Viswambharan 
135f835918SJeenu Viswambharan bool mpam_supported(void)
145f835918SJeenu Viswambharan {
155f835918SJeenu Viswambharan 	uint64_t features = read_id_aa64dfr0_el1() >> ID_AA64PFR0_MPAM_SHIFT;
165f835918SJeenu Viswambharan 
175f835918SJeenu Viswambharan 	return ((features & ID_AA64PFR0_MPAM_MASK) != 0U);
185f835918SJeenu Viswambharan }
195f835918SJeenu Viswambharan 
2040daecc1SAntonio Nino Diaz void mpam_enable(bool el2_unused)
215f835918SJeenu Viswambharan {
225f835918SJeenu Viswambharan 	if (!mpam_supported())
235f835918SJeenu Viswambharan 		return;
245f835918SJeenu Viswambharan 
255f835918SJeenu Viswambharan 	/*
265f835918SJeenu Viswambharan 	 * Enable MPAM, and disable trapping to EL3 when lower ELs access their
275f835918SJeenu Viswambharan 	 * own MPAM registers.
285f835918SJeenu Viswambharan 	 */
295f835918SJeenu Viswambharan 	write_mpam3_el3(MPAM3_EL3_MPAMEN_BIT);
305f835918SJeenu Viswambharan 
315f835918SJeenu Viswambharan 	/*
325f835918SJeenu Viswambharan 	 * If EL2 is implemented but unused, disable trapping to EL2 when lower
335f835918SJeenu Viswambharan 	 * ELs access their own MPAM registers.
34*537fa859SLouis Mayencourt 	 * If EL2 is implemented and used, enable trapping to EL2.
355f835918SJeenu Viswambharan 	 */
3640daecc1SAntonio Nino Diaz 	if (el2_unused) {
375f835918SJeenu Viswambharan 		write_mpam2_el2(0);
385f835918SJeenu Viswambharan 
395f835918SJeenu Viswambharan 		if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U)
405f835918SJeenu Viswambharan 			write_mpamhcr_el2(0);
41*537fa859SLouis Mayencourt 	} else {
42*537fa859SLouis Mayencourt 		write_mpam2_el2(MPAM2_EL2_TRAPMPAM0EL1 |
43*537fa859SLouis Mayencourt 				MPAM2_EL2_TRAPMPAM1EL1);
44*537fa859SLouis Mayencourt 
45*537fa859SLouis Mayencourt 		if ((read_mpamidr_el1() & MPAMIDR_HAS_HCR_BIT) != 0U) {
46*537fa859SLouis Mayencourt 			write_mpamhcr_el2(MPAMHCR_EL2_TRAP_MPAMIDR_EL1);
47*537fa859SLouis Mayencourt 		}
485f835918SJeenu Viswambharan 	}
495f835918SJeenu Viswambharan }
50