blob: 3a70e4ffefa9edc4f9ee942872704702ec3fbc89 [file] [log] [blame]
Dimitris Papastamose08005a2017-10-12 13:02:29 +01001/*
johpow01fa59c6f2020-10-02 13:41:11 -05002 * Copyright (c) 2017-2021, ARM Limited and Contributors. All rights reserved.
Dimitris Papastamose08005a2017-10-12 13:02:29 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Antonio Nino Diaz033b4bb2018-10-25 16:52:26 +01007#ifndef AMU_H
8#define AMU_H
Dimitris Papastamose08005a2017-10-12 13:02:29 +01009
Antonio Nino Diaz033b4bb2018-10-25 16:52:26 +010010#include <stdbool.h>
Dimitris Papastamos525c37a2017-11-13 09:49:45 +000011#include <stdint.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000012
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000013#include <lib/cassert.h>
14#include <lib/utils_def.h>
Dimitris Papastamos60346db2017-12-13 10:54:37 +000015
Alexei Fedorov7e6306b2020-07-14 08:17:56 +010016#include <platform_def.h>
17
Dimitris Papastamos60346db2017-12-13 10:54:37 +000018/* All group 0 counters */
Antonio Nino Diaz033b4bb2018-10-25 16:52:26 +010019#define AMU_GROUP0_COUNTERS_MASK U(0xf)
Alexei Fedorov7e6306b2020-07-14 08:17:56 +010020#define AMU_GROUP0_NR_COUNTERS U(4)
Dimitris Papastamose08005a2017-10-12 13:02:29 +010021
Dimitris Papastamos60346db2017-12-13 10:54:37 +000022#ifdef PLAT_AMU_GROUP1_COUNTERS_MASK
23#define AMU_GROUP1_COUNTERS_MASK PLAT_AMU_GROUP1_COUNTERS_MASK
24#else
Antonio Nino Diaz033b4bb2018-10-25 16:52:26 +010025#define AMU_GROUP1_COUNTERS_MASK U(0)
Dimitris Papastamos60346db2017-12-13 10:54:37 +000026#endif
27
Alexei Fedorov7e6306b2020-07-14 08:17:56 +010028/* 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
Dimitris Papastamos60346db2017-12-13 10:54:37 +000061#else
Alexei Fedorov7e6306b2020-07-14 08:17:56 +010062#define AMU_GROUP1_NR_COUNTERS 0U
Dimitris Papastamos60346db2017-12-13 10:54:37 +000063#endif
64
65CASSERT(AMU_GROUP1_COUNTERS_MASK <= 0xffff, invalid_amu_group1_counters_mask);
Alexei Fedorov7e6306b2020-07-14 08:17:56 +010066
67struct amu_ctx {
68 uint64_t group0_cnts[AMU_GROUP0_NR_COUNTERS];
johpow01fa59c6f2020-10-02 13:41:11 -050069#if __aarch64__
70 /* Architected event counter 1 does not have an offset register. */
71 uint64_t group0_voffsets[AMU_GROUP0_NR_COUNTERS-1];
72#endif
Alexei Fedorov7e6306b2020-07-14 08:17:56 +010073
74#if AMU_GROUP1_NR_COUNTERS
75 uint64_t group1_cnts[AMU_GROUP1_NR_COUNTERS];
johpow01fa59c6f2020-10-02 13:41:11 -050076#if __aarch64__
77 uint64_t group1_voffsets[AMU_GROUP1_NR_COUNTERS];
78#endif
Alexei Fedorov7e6306b2020-07-14 08:17:56 +010079#endif
80};
Dimitris Papastamos60346db2017-12-13 10:54:37 +000081
johpow01fa59c6f2020-10-02 13:41:11 -050082unsigned int amu_get_version(void);
Antonio Nino Diaz033b4bb2018-10-25 16:52:26 +010083void amu_enable(bool el2_unused);
Dimitris Papastamose08005a2017-10-12 13:02:29 +010084
Dimitris Papastamos525c37a2017-11-13 09:49:45 +000085/* Group 0 configuration helpers */
Alexei Fedorov7e6306b2020-07-14 08:17:56 +010086uint64_t amu_group0_cnt_read(unsigned int idx);
87void amu_group0_cnt_write(unsigned int idx, uint64_t val);
88
johpow01fa59c6f2020-10-02 13:41:11 -050089#if __aarch64__
90uint64_t amu_group0_voffset_read(unsigned int idx);
91void amu_group0_voffset_write(unsigned int idx, uint64_t val);
92#endif
93
Alexei Fedorov7e6306b2020-07-14 08:17:56 +010094#if AMU_GROUP1_NR_COUNTERS
95bool amu_group1_supported(void);
Dimitris Papastamos525c37a2017-11-13 09:49:45 +000096
97/* Group 1 configuration helpers */
Alexei Fedorov7e6306b2020-07-14 08:17:56 +010098uint64_t amu_group1_cnt_read(unsigned int idx);
99void amu_group1_cnt_write(unsigned int idx, uint64_t val);
100void amu_group1_set_evtype(unsigned int idx, unsigned int val);
johpow01fa59c6f2020-10-02 13:41:11 -0500101
102#if __aarch64__
103uint64_t amu_group1_voffset_read(unsigned int idx);
104void amu_group1_voffset_write(unsigned int idx, uint64_t val);
105#endif
106
Alexei Fedorov7e6306b2020-07-14 08:17:56 +0100107#endif
Dimitris Papastamos525c37a2017-11-13 09:49:45 +0000108
Antonio Nino Diaz033b4bb2018-10-25 16:52:26 +0100109#endif /* AMU_H */