xref: /rk3399_ARM-atf/lib/extensions/amu/aarch32/amu.c (revision 0767d50e699d3d9cb827172dd7742618d37aabe0)
1ef69e1eaSDimitris Papastamos /*
2ef69e1eaSDimitris Papastamos  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3ef69e1eaSDimitris Papastamos  *
4ef69e1eaSDimitris Papastamos  * SPDX-License-Identifier: BSD-3-Clause
5ef69e1eaSDimitris Papastamos  */
6ef69e1eaSDimitris Papastamos 
7ef69e1eaSDimitris Papastamos #include <amu.h>
8ef69e1eaSDimitris Papastamos #include <arch.h>
9ef69e1eaSDimitris Papastamos #include <arch_helpers.h>
10*0767d50eSDimitris Papastamos #include <debug.h>
11ef69e1eaSDimitris Papastamos 
12ef69e1eaSDimitris Papastamos void amu_enable(int el2_unused)
13ef69e1eaSDimitris Papastamos {
14ef69e1eaSDimitris Papastamos 	uint64_t features;
15ef69e1eaSDimitris Papastamos 
16ef69e1eaSDimitris Papastamos 	features = read_id_pfr0() >> ID_PFR0_AMU_SHIFT;
17*0767d50eSDimitris Papastamos 	if ((features & ID_PFR0_AMU_MASK) != 1) {
18*0767d50eSDimitris Papastamos 		WARN("Cannot enable AMU - not supported\n");
19*0767d50eSDimitris Papastamos 		return;
20*0767d50eSDimitris Papastamos 	}
21*0767d50eSDimitris Papastamos 
22ef69e1eaSDimitris Papastamos 	if (el2_unused) {
23ef69e1eaSDimitris Papastamos 		uint64_t v;
24ef69e1eaSDimitris Papastamos 
25ef69e1eaSDimitris Papastamos 		/*
26ef69e1eaSDimitris Papastamos 		 * Non-secure access from EL0 or EL1 to the Activity Monitor
27ef69e1eaSDimitris Papastamos 		 * registers do not trap to EL2.
28ef69e1eaSDimitris Papastamos 		 */
29ef69e1eaSDimitris Papastamos 		v = read_hcptr();
30ef69e1eaSDimitris Papastamos 		v &= ~TAM_BIT;
31ef69e1eaSDimitris Papastamos 		write_hcptr(v);
32ef69e1eaSDimitris Papastamos 	}
33ef69e1eaSDimitris Papastamos 
34ef69e1eaSDimitris Papastamos 	/* Enable group 0 counters */
35ef69e1eaSDimitris Papastamos 	write_amcntenset0(AMU_GROUP0_COUNTERS_MASK);
36ef69e1eaSDimitris Papastamos }
37