xref: /arm-trusted-firmware/include/lib/extensions/amu.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2017-2023, Arm Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef AMU_H
8*91f16700Schasinglulu #define AMU_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <stdbool.h>
11*91f16700Schasinglulu #include <stdint.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu #include <context.h>
14*91f16700Schasinglulu 
15*91f16700Schasinglulu #include <platform_def.h>
16*91f16700Schasinglulu 
17*91f16700Schasinglulu #if ENABLE_FEAT_AMU
18*91f16700Schasinglulu #if __aarch64__
19*91f16700Schasinglulu void amu_enable(cpu_context_t *ctx);
20*91f16700Schasinglulu void amu_init_el3(void);
21*91f16700Schasinglulu void amu_init_el2_unused(void);
22*91f16700Schasinglulu void amu_enable_per_world(per_world_context_t *per_world_ctx);
23*91f16700Schasinglulu #else
24*91f16700Schasinglulu void amu_enable(bool el2_unused);
25*91f16700Schasinglulu #endif /* __aarch64__ */
26*91f16700Schasinglulu 
27*91f16700Schasinglulu #else
28*91f16700Schasinglulu #if __aarch64__
29*91f16700Schasinglulu void amu_enable(cpu_context_t *ctx)
30*91f16700Schasinglulu {
31*91f16700Schasinglulu }
32*91f16700Schasinglulu void amu_init_el3(void)
33*91f16700Schasinglulu {
34*91f16700Schasinglulu }
35*91f16700Schasinglulu void amu_init_el2_unused(void)
36*91f16700Schasinglulu {
37*91f16700Schasinglulu }
38*91f16700Schasinglulu void amu_enable_per_world(per_world_context_t *per_world_ctx)
39*91f16700Schasinglulu {
40*91f16700Schasinglulu }
41*91f16700Schasinglulu #else
42*91f16700Schasinglulu static inline void amu_enable(bool el2_unused)
43*91f16700Schasinglulu {
44*91f16700Schasinglulu }
45*91f16700Schasinglulu #endif /*__aarch64__ */
46*91f16700Schasinglulu #endif /* ENABLE_FEAT_AMU */
47*91f16700Schasinglulu 
48*91f16700Schasinglulu #if ENABLE_AMU_AUXILIARY_COUNTERS
49*91f16700Schasinglulu /*
50*91f16700Schasinglulu  * AMU data for a single core.
51*91f16700Schasinglulu  */
52*91f16700Schasinglulu struct amu_core {
53*91f16700Schasinglulu 	uint16_t enable; /* Mask of auxiliary counters to enable */
54*91f16700Schasinglulu };
55*91f16700Schasinglulu 
56*91f16700Schasinglulu /*
57*91f16700Schasinglulu  * Topological platform data specific to the AMU.
58*91f16700Schasinglulu  */
59*91f16700Schasinglulu struct amu_topology {
60*91f16700Schasinglulu 	struct amu_core cores[PLATFORM_CORE_COUNT]; /* Per-core data */
61*91f16700Schasinglulu };
62*91f16700Schasinglulu 
63*91f16700Schasinglulu #if !ENABLE_AMU_FCONF
64*91f16700Schasinglulu /*
65*91f16700Schasinglulu  * Retrieve the platform's AMU topology. A `NULL` return value is treated as a
66*91f16700Schasinglulu  * non-fatal error, in which case no auxiliary counters will be enabled.
67*91f16700Schasinglulu  */
68*91f16700Schasinglulu const struct amu_topology *plat_amu_topology(void);
69*91f16700Schasinglulu #endif /* ENABLE_AMU_FCONF */
70*91f16700Schasinglulu #endif /* ENABLE_AMU_AUXILIARY_COUNTERS */
71*91f16700Schasinglulu 
72*91f16700Schasinglulu #endif /* AMU_H */
73