/* SPDX-License-Identifier: GPL-2.0 */ /* * Arm Statistical Profiling Extensions (SPE) support * Copyright (c) 2017-2018, Arm Ltd. */ #ifndef INCLUDE__ARM_SPE_PKT_DECODER_H__ #define INCLUDE__ARM_SPE_PKT_DECODER_H__ #include #include #define ARM_SPE_PKT_DESC_MAX 256 #define ARM_SPE_NEED_MORE_BYTES -1 #define ARM_SPE_BAD_PACKET -2 #define ARM_SPE_PKT_MAX_SZ 16 enum arm_spe_pkt_type { ARM_SPE_BAD, ARM_SPE_PAD, ARM_SPE_END, ARM_SPE_TIMESTAMP, ARM_SPE_ADDRESS, ARM_SPE_COUNTER, ARM_SPE_CONTEXT, ARM_SPE_OP_TYPE, ARM_SPE_EVENTS, ARM_SPE_DATA_SOURCE, }; struct arm_spe_pkt { enum arm_spe_pkt_type type; unsigned char index; uint64_t payload; }; #define SPE_ADDR_PKT_HDR_INDEX_INS (0x0) #define SPE_ADDR_PKT_HDR_INDEX_BRANCH (0x1) #define SPE_ADDR_PKT_HDR_INDEX_DATA_VIRT (0x2) #define SPE_ADDR_PKT_HDR_INDEX_DATA_PHYS (0x3) #define SPE_ADDR_PKT_NS BIT(7) #define SPE_ADDR_PKT_CH BIT(6) #define SPE_ADDR_PKT_EL_OFFSET (5) #define SPE_ADDR_PKT_EL_MASK (0x3 << SPE_ADDR_PKT_EL_OFFSET) #define SPE_ADDR_PKT_EL0 (0) #define SPE_ADDR_PKT_EL1 (1) #define SPE_ADDR_PKT_EL2 (2) #define SPE_ADDR_PKT_EL3 (3) const char *arm_spe_pkt_name(enum arm_spe_pkt_type); int arm_spe_get_packet(const unsigned char *buf, size_t len, struct arm_spe_pkt *packet); int arm_spe_pkt_desc(const struct arm_spe_pkt *packet, char *buf, size_t len); #endif