blob: 768e72c257c776f8d33b1c28f889a97045ea55b0 [file] [log] [blame]
Dimitris Papastamos380559c2017-10-12 13:02:29 +01001/*
johpow01873d4242020-10-02 13:41:11 -05002 * Copyright (c) 2017-2021, ARM Limited and Contributors. All rights reserved.
Dimitris Papastamos380559c2017-10-12 13:02:29 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Antonio Nino Diaz40daecc2018-10-25 16:52:26 +01007#ifndef AMU_H
8#define AMU_H
Dimitris Papastamos380559c2017-10-12 13:02:29 +01009
Antonio Nino Diaz40daecc2018-10-25 16:52:26 +010010#include <stdbool.h>
Dimitris Papastamos0767d502017-11-13 09:49:45 +000011#include <stdint.h>
Antonio Nino Diaz09d40e02018-12-14 00:18:21 +000012
Antonio Nino Diaz09d40e02018-12-14 00:18:21 +000013#include <lib/cassert.h>
14#include <lib/utils_def.h>
Dimitris Papastamos59902b72017-12-13 10:54:37 +000015
Arunachalam Ganapathy68ac5ed2021-07-08 09:35:57 +010016#include <context.h>
Alexei Fedorovf3ccf032020-07-14 08:17:56 +010017#include <platform_def.h>
18
Dimitris Papastamos59902b72017-12-13 10:54:37 +000019/* All group 0 counters */
Antonio Nino Diaz40daecc2018-10-25 16:52:26 +010020#define AMU_GROUP0_COUNTERS_MASK U(0xf)
Alexei Fedorovf3ccf032020-07-14 08:17:56 +010021#define AMU_GROUP0_NR_COUNTERS U(4)
Dimitris Papastamos380559c2017-10-12 13:02:29 +010022
Antonio Nino Diaz40daecc2018-10-25 16:52:26 +010023#define AMU_GROUP1_COUNTERS_MASK U(0)
Dimitris Papastamos59902b72017-12-13 10:54:37 +000024
Alexei Fedorovf3ccf032020-07-14 08:17:56 +010025/* Calculate number of group 1 counters */
26#if (AMU_GROUP1_COUNTERS_MASK & (1 << 15))
27#define AMU_GROUP1_NR_COUNTERS 16U
28#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 14))
29#define AMU_GROUP1_NR_COUNTERS 15U
30#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 13))
31#define AMU_GROUP1_NR_COUNTERS 14U
32#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 12))
33#define AMU_GROUP1_NR_COUNTERS 13U
34#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 11))
35#define AMU_GROUP1_NR_COUNTERS 12U
36#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 10))
37#define AMU_GROUP1_NR_COUNTERS 11U
38#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 9))
39#define AMU_GROUP1_NR_COUNTERS 10U
40#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 8))
41#define AMU_GROUP1_NR_COUNTERS 9U
42#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 7))
43#define AMU_GROUP1_NR_COUNTERS 8U
44#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 6))
45#define AMU_GROUP1_NR_COUNTERS 7U
46#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 5))
47#define AMU_GROUP1_NR_COUNTERS 6U
48#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 4))
49#define AMU_GROUP1_NR_COUNTERS 5U
50#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 3))
51#define AMU_GROUP1_NR_COUNTERS 4U
52#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 2))
53#define AMU_GROUP1_NR_COUNTERS 3U
54#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 1))
55#define AMU_GROUP1_NR_COUNTERS 2U
56#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 0))
57#define AMU_GROUP1_NR_COUNTERS 1U
Dimitris Papastamos59902b72017-12-13 10:54:37 +000058#else
Alexei Fedorovf3ccf032020-07-14 08:17:56 +010059#define AMU_GROUP1_NR_COUNTERS 0U
Dimitris Papastamos59902b72017-12-13 10:54:37 +000060#endif
61
62CASSERT(AMU_GROUP1_COUNTERS_MASK <= 0xffff, invalid_amu_group1_counters_mask);
Alexei Fedorovf3ccf032020-07-14 08:17:56 +010063
64struct amu_ctx {
65 uint64_t group0_cnts[AMU_GROUP0_NR_COUNTERS];
johpow01873d4242020-10-02 13:41:11 -050066#if __aarch64__
67 /* Architected event counter 1 does not have an offset register. */
68 uint64_t group0_voffsets[AMU_GROUP0_NR_COUNTERS-1];
69#endif
Alexei Fedorovf3ccf032020-07-14 08:17:56 +010070
71#if AMU_GROUP1_NR_COUNTERS
72 uint64_t group1_cnts[AMU_GROUP1_NR_COUNTERS];
johpow01873d4242020-10-02 13:41:11 -050073#if __aarch64__
74 uint64_t group1_voffsets[AMU_GROUP1_NR_COUNTERS];
75#endif
Alexei Fedorovf3ccf032020-07-14 08:17:56 +010076#endif
77};
Dimitris Papastamos59902b72017-12-13 10:54:37 +000078
johpow01873d4242020-10-02 13:41:11 -050079unsigned int amu_get_version(void);
Arunachalam Ganapathy68ac5ed2021-07-08 09:35:57 +010080#if __aarch64__
81void amu_enable(bool el2_unused, cpu_context_t *ctx);
82#else
Antonio Nino Diaz40daecc2018-10-25 16:52:26 +010083void amu_enable(bool el2_unused);
Arunachalam Ganapathy68ac5ed2021-07-08 09:35:57 +010084#endif
Dimitris Papastamos380559c2017-10-12 13:02:29 +010085
Dimitris Papastamos0767d502017-11-13 09:49:45 +000086/* Group 0 configuration helpers */
Alexei Fedorovf3ccf032020-07-14 08:17:56 +010087uint64_t amu_group0_cnt_read(unsigned int idx);
88void amu_group0_cnt_write(unsigned int idx, uint64_t val);
89
johpow01873d4242020-10-02 13:41:11 -050090#if __aarch64__
91uint64_t amu_group0_voffset_read(unsigned int idx);
92void amu_group0_voffset_write(unsigned int idx, uint64_t val);
93#endif
94
Alexei Fedorovf3ccf032020-07-14 08:17:56 +010095#if AMU_GROUP1_NR_COUNTERS
96bool amu_group1_supported(void);
Dimitris Papastamos0767d502017-11-13 09:49:45 +000097
98/* Group 1 configuration helpers */
Alexei Fedorovf3ccf032020-07-14 08:17:56 +010099uint64_t amu_group1_cnt_read(unsigned int idx);
100void amu_group1_cnt_write(unsigned int idx, uint64_t val);
101void amu_group1_set_evtype(unsigned int idx, unsigned int val);
johpow01873d4242020-10-02 13:41:11 -0500102
103#if __aarch64__
104uint64_t amu_group1_voffset_read(unsigned int idx);
105void amu_group1_voffset_write(unsigned int idx, uint64_t val);
106#endif
107
Alexei Fedorovf3ccf032020-07-14 08:17:56 +0100108#endif
Dimitris Papastamos0767d502017-11-13 09:49:45 +0000109
Antonio Nino Diaz40daecc2018-10-25 16:52:26 +0100110#endif /* AMU_H */