mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-18 18:44:22 +00:00

With the introduction of MPMM, the auxiliary AMU counter logic requires refactoring to move away from a single platform-defined group 1 counter mask in order to support microarchitectural (per-core) group 1 counters. BREAKING CHANGE: The `PLAT_AMU_GROUP1_COUNTERS_MASK` platform definition has been removed. Platforms should specify per-core AMU counter masks via FCONF or a platform-specific mechanism going forward. Change-Id: I1e852797c7954f92409222b066a1ae57bc72bb05 Signed-off-by: Chris Kay <chris.kay@arm.com>
110 lines
3.1 KiB
C
110 lines
3.1 KiB
C
/*
|
|
* Copyright (c) 2017-2021, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef AMU_H
|
|
#define AMU_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#include <lib/cassert.h>
|
|
#include <lib/utils_def.h>
|
|
|
|
#include <context.h>
|
|
#include <platform_def.h>
|
|
|
|
/* All group 0 counters */
|
|
#define AMU_GROUP0_COUNTERS_MASK U(0xf)
|
|
#define AMU_GROUP0_NR_COUNTERS U(4)
|
|
|
|
#define AMU_GROUP1_COUNTERS_MASK U(0)
|
|
|
|
/* Calculate number of group 1 counters */
|
|
#if (AMU_GROUP1_COUNTERS_MASK & (1 << 15))
|
|
#define AMU_GROUP1_NR_COUNTERS 16U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 14))
|
|
#define AMU_GROUP1_NR_COUNTERS 15U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 13))
|
|
#define AMU_GROUP1_NR_COUNTERS 14U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 12))
|
|
#define AMU_GROUP1_NR_COUNTERS 13U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 11))
|
|
#define AMU_GROUP1_NR_COUNTERS 12U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 10))
|
|
#define AMU_GROUP1_NR_COUNTERS 11U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 9))
|
|
#define AMU_GROUP1_NR_COUNTERS 10U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 8))
|
|
#define AMU_GROUP1_NR_COUNTERS 9U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 7))
|
|
#define AMU_GROUP1_NR_COUNTERS 8U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 6))
|
|
#define AMU_GROUP1_NR_COUNTERS 7U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 5))
|
|
#define AMU_GROUP1_NR_COUNTERS 6U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 4))
|
|
#define AMU_GROUP1_NR_COUNTERS 5U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 3))
|
|
#define AMU_GROUP1_NR_COUNTERS 4U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 2))
|
|
#define AMU_GROUP1_NR_COUNTERS 3U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 1))
|
|
#define AMU_GROUP1_NR_COUNTERS 2U
|
|
#elif (AMU_GROUP1_COUNTERS_MASK & (1 << 0))
|
|
#define AMU_GROUP1_NR_COUNTERS 1U
|
|
#else
|
|
#define AMU_GROUP1_NR_COUNTERS 0U
|
|
#endif
|
|
|
|
CASSERT(AMU_GROUP1_COUNTERS_MASK <= 0xffff, invalid_amu_group1_counters_mask);
|
|
|
|
struct amu_ctx {
|
|
uint64_t group0_cnts[AMU_GROUP0_NR_COUNTERS];
|
|
#if __aarch64__
|
|
/* Architected event counter 1 does not have an offset register. */
|
|
uint64_t group0_voffsets[AMU_GROUP0_NR_COUNTERS-1];
|
|
#endif
|
|
|
|
#if AMU_GROUP1_NR_COUNTERS
|
|
uint64_t group1_cnts[AMU_GROUP1_NR_COUNTERS];
|
|
#if __aarch64__
|
|
uint64_t group1_voffsets[AMU_GROUP1_NR_COUNTERS];
|
|
#endif
|
|
#endif
|
|
};
|
|
|
|
unsigned int amu_get_version(void);
|
|
#if __aarch64__
|
|
void amu_enable(bool el2_unused, cpu_context_t *ctx);
|
|
#else
|
|
void amu_enable(bool el2_unused);
|
|
#endif
|
|
|
|
/* Group 0 configuration helpers */
|
|
uint64_t amu_group0_cnt_read(unsigned int idx);
|
|
void amu_group0_cnt_write(unsigned int idx, uint64_t val);
|
|
|
|
#if __aarch64__
|
|
uint64_t amu_group0_voffset_read(unsigned int idx);
|
|
void amu_group0_voffset_write(unsigned int idx, uint64_t val);
|
|
#endif
|
|
|
|
#if AMU_GROUP1_NR_COUNTERS
|
|
bool amu_group1_supported(void);
|
|
|
|
/* Group 1 configuration helpers */
|
|
uint64_t amu_group1_cnt_read(unsigned int idx);
|
|
void amu_group1_cnt_write(unsigned int idx, uint64_t val);
|
|
void amu_group1_set_evtype(unsigned int idx, unsigned int val);
|
|
|
|
#if __aarch64__
|
|
uint64_t amu_group1_voffset_read(unsigned int idx);
|
|
void amu_group1_voffset_write(unsigned int idx, uint64_t val);
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#endif /* AMU_H */
|