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