1 /*
2  * Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef AMU_H
8 #define AMU_H
9 
10 #include <stdbool.h>
11 #include <stdint.h>
12 
13 #include <lib/cassert.h>
14 #include <lib/utils_def.h>
15 
16 #include <platform_def.h>
17 
18 /* All group 0 counters */
19 #define AMU_GROUP0_COUNTERS_MASK	U(0xf)
20 #define AMU_GROUP0_NR_COUNTERS		U(4)
21 
22 #ifdef PLAT_AMU_GROUP1_COUNTERS_MASK
23 #define AMU_GROUP1_COUNTERS_MASK	PLAT_AMU_GROUP1_COUNTERS_MASK
24 #else
25 #define AMU_GROUP1_COUNTERS_MASK	U(0)
26 #endif
27 
28 /* Calculate number of group 1 counters */
29 #if (AMU_GROUP1_COUNTERS_MASK	& (1 << 15))
30 #define	AMU_GROUP1_NR_COUNTERS		16U
31 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 14))
32 #define	AMU_GROUP1_NR_COUNTERS		15U
33 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 13))
34 #define	AMU_GROUP1_NR_COUNTERS		14U
35 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 12))
36 #define	AMU_GROUP1_NR_COUNTERS		13U
37 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 11))
38 #define	AMU_GROUP1_NR_COUNTERS		12U
39 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 10))
40 #define	AMU_GROUP1_NR_COUNTERS		11U
41 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 9))
42 #define	AMU_GROUP1_NR_COUNTERS		10U
43 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 8))
44 #define	AMU_GROUP1_NR_COUNTERS		9U
45 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 7))
46 #define	AMU_GROUP1_NR_COUNTERS		8U
47 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 6))
48 #define	AMU_GROUP1_NR_COUNTERS		7U
49 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 5))
50 #define	AMU_GROUP1_NR_COUNTERS		6U
51 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 4))
52 #define	AMU_GROUP1_NR_COUNTERS		5U
53 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 3))
54 #define	AMU_GROUP1_NR_COUNTERS		4U
55 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 2))
56 #define	AMU_GROUP1_NR_COUNTERS		3U
57 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 1))
58 #define	AMU_GROUP1_NR_COUNTERS		2U
59 #elif (AMU_GROUP1_COUNTERS_MASK	& (1 << 0))
60 #define	AMU_GROUP1_NR_COUNTERS		1U
61 #else
62 #define	AMU_GROUP1_NR_COUNTERS		0U
63 #endif
64 
65 CASSERT(AMU_GROUP1_COUNTERS_MASK <= 0xffff, invalid_amu_group1_counters_mask);
66 
67 struct amu_ctx {
68 	uint64_t group0_cnts[AMU_GROUP0_NR_COUNTERS];
69 
70 #if AMU_GROUP1_NR_COUNTERS
71 	uint64_t group1_cnts[AMU_GROUP1_NR_COUNTERS];
72 #endif
73 };
74 
75 bool amu_supported(void);
76 void amu_enable(bool el2_unused);
77 
78 /* Group 0 configuration helpers */
79 uint64_t amu_group0_cnt_read(unsigned int idx);
80 void amu_group0_cnt_write(unsigned int idx, uint64_t val);
81 
82 #if AMU_GROUP1_NR_COUNTERS
83 bool amu_group1_supported(void);
84 
85 /* Group 1 configuration helpers */
86 uint64_t amu_group1_cnt_read(unsigned int idx);
87 void amu_group1_cnt_write(unsigned int idx, uint64_t val);
88 void amu_group1_set_evtype(unsigned int idx, unsigned int val);
89 #endif
90 
91 #endif /* AMU_H */
92