blob: 9fe16441e2d8fc190f511abcc1aabd755cec32f3 [file] [log] [blame]
Dimitris Papastamos525c37a2017-11-13 09:49:45 +00001/*
johpow01fa59c6f2020-10-02 13:41:11 -05002 * Copyright (c) 2017-2021, ARM Limited and Contributors. All rights reserved.
Dimitris Papastamos525c37a2017-11-13 09:49:45 +00003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Antonio Nino Diaz033b4bb2018-10-25 16:52:26 +01007#ifndef AMU_PRIVATE_H
8#define AMU_PRIVATE_H
Dimitris Papastamos525c37a2017-11-13 09:49:45 +00009
10#include <stdint.h>
11
Chris Kayf13c6b52021-05-24 21:00:07 +010012#include <lib/cassert.h>
13#include <lib/extensions/amu.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#define AMU_GROUP1_COUNTERS_MASK U(0)
23
24/* Calculate number of group 1 counters */
25#if (AMU_GROUP1_COUNTERS_MASK & (1 << 15))
26#define AMU_GROUP1_NR_COUNTERS 16U
27#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 14))
28#define AMU_GROUP1_NR_COUNTERS 15U
29#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 13))
30#define AMU_GROUP1_NR_COUNTERS 14U
31#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 12))
32#define AMU_GROUP1_NR_COUNTERS 13U
33#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 11))
34#define AMU_GROUP1_NR_COUNTERS 12U
35#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 10))
36#define AMU_GROUP1_NR_COUNTERS 11U
37#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 9))
38#define AMU_GROUP1_NR_COUNTERS 10U
39#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 8))
40#define AMU_GROUP1_NR_COUNTERS 9U
41#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 7))
42#define AMU_GROUP1_NR_COUNTERS 8U
43#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 6))
44#define AMU_GROUP1_NR_COUNTERS 7U
45#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 5))
46#define AMU_GROUP1_NR_COUNTERS 6U
47#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 4))
48#define AMU_GROUP1_NR_COUNTERS 5U
49#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 3))
50#define AMU_GROUP1_NR_COUNTERS 4U
51#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 2))
52#define AMU_GROUP1_NR_COUNTERS 3U
53#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 1))
54#define AMU_GROUP1_NR_COUNTERS 2U
55#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 0))
56#define AMU_GROUP1_NR_COUNTERS 1U
57#else
58#define AMU_GROUP1_NR_COUNTERS 0U
59#endif
60
61CASSERT(AMU_GROUP1_COUNTERS_MASK <= 0xffff, invalid_amu_group1_counters_mask);
62
63struct amu_ctx {
64 uint64_t group0_cnts[AMU_GROUP0_NR_COUNTERS];
65#if __aarch64__
66 /* Architected event counter 1 does not have an offset register. */
67 uint64_t group0_voffsets[AMU_GROUP0_NR_COUNTERS-1];
68#endif
69
70#if AMU_GROUP1_NR_COUNTERS
71 uint64_t group1_cnts[AMU_GROUP1_NR_COUNTERS];
72#if __aarch64__
73 uint64_t group1_voffsets[AMU_GROUP1_NR_COUNTERS];
74#endif
75#endif
76};
77
Alexei Fedorov7e6306b2020-07-14 08:17:56 +010078uint64_t amu_group0_cnt_read_internal(unsigned int idx);
79void amu_group0_cnt_write_internal(unsigned int idx, uint64_t val);
Dimitris Papastamos525c37a2017-11-13 09:49:45 +000080
Alexei Fedorov7e6306b2020-07-14 08:17:56 +010081uint64_t amu_group1_cnt_read_internal(unsigned int idx);
82void amu_group1_cnt_write_internal(unsigned int idx, uint64_t val);
83void amu_group1_set_evtype_internal(unsigned int idx, unsigned int val);
Dimitris Papastamos525c37a2017-11-13 09:49:45 +000084
johpow01fa59c6f2020-10-02 13:41:11 -050085#if __aarch64__
86uint64_t amu_group0_voffset_read_internal(unsigned int idx);
87void amu_group0_voffset_write_internal(unsigned int idx, uint64_t val);
88
89uint64_t amu_group1_voffset_read_internal(unsigned int idx);
90void amu_group1_voffset_write_internal(unsigned int idx, uint64_t val);
91#endif
92
Antonio Nino Diaz033b4bb2018-10-25 16:52:26 +010093#endif /* AMU_PRIVATE_H */