18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Arm Statistical Profiling Extensions (SPE) support 48c2ecf20Sopenharmony_ci * Copyright (c) 2017-2018, Arm Ltd. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef INCLUDE__ARM_SPE_PKT_DECODER_H__ 88c2ecf20Sopenharmony_ci#define INCLUDE__ARM_SPE_PKT_DECODER_H__ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <stddef.h> 118c2ecf20Sopenharmony_ci#include <stdint.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#define ARM_SPE_PKT_DESC_MAX 256 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#define ARM_SPE_NEED_MORE_BYTES -1 168c2ecf20Sopenharmony_ci#define ARM_SPE_BAD_PACKET -2 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#define ARM_SPE_PKT_MAX_SZ 16 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cienum arm_spe_pkt_type { 218c2ecf20Sopenharmony_ci ARM_SPE_BAD, 228c2ecf20Sopenharmony_ci ARM_SPE_PAD, 238c2ecf20Sopenharmony_ci ARM_SPE_END, 248c2ecf20Sopenharmony_ci ARM_SPE_TIMESTAMP, 258c2ecf20Sopenharmony_ci ARM_SPE_ADDRESS, 268c2ecf20Sopenharmony_ci ARM_SPE_COUNTER, 278c2ecf20Sopenharmony_ci ARM_SPE_CONTEXT, 288c2ecf20Sopenharmony_ci ARM_SPE_OP_TYPE, 298c2ecf20Sopenharmony_ci ARM_SPE_EVENTS, 308c2ecf20Sopenharmony_ci ARM_SPE_DATA_SOURCE, 318c2ecf20Sopenharmony_ci}; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_cistruct arm_spe_pkt { 348c2ecf20Sopenharmony_ci enum arm_spe_pkt_type type; 358c2ecf20Sopenharmony_ci unsigned char index; 368c2ecf20Sopenharmony_ci uint64_t payload; 378c2ecf20Sopenharmony_ci}; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#define SPE_ADDR_PKT_HDR_INDEX_INS (0x0) 408c2ecf20Sopenharmony_ci#define SPE_ADDR_PKT_HDR_INDEX_BRANCH (0x1) 418c2ecf20Sopenharmony_ci#define SPE_ADDR_PKT_HDR_INDEX_DATA_VIRT (0x2) 428c2ecf20Sopenharmony_ci#define SPE_ADDR_PKT_HDR_INDEX_DATA_PHYS (0x3) 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci#define SPE_ADDR_PKT_NS BIT(7) 458c2ecf20Sopenharmony_ci#define SPE_ADDR_PKT_CH BIT(6) 468c2ecf20Sopenharmony_ci#define SPE_ADDR_PKT_EL_OFFSET (5) 478c2ecf20Sopenharmony_ci#define SPE_ADDR_PKT_EL_MASK (0x3 << SPE_ADDR_PKT_EL_OFFSET) 488c2ecf20Sopenharmony_ci#define SPE_ADDR_PKT_EL0 (0) 498c2ecf20Sopenharmony_ci#define SPE_ADDR_PKT_EL1 (1) 508c2ecf20Sopenharmony_ci#define SPE_ADDR_PKT_EL2 (2) 518c2ecf20Sopenharmony_ci#define SPE_ADDR_PKT_EL3 (3) 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ciconst char *arm_spe_pkt_name(enum arm_spe_pkt_type); 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ciint arm_spe_get_packet(const unsigned char *buf, size_t len, 568c2ecf20Sopenharmony_ci struct arm_spe_pkt *packet); 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ciint arm_spe_pkt_desc(const struct arm_spe_pkt *packet, char *buf, size_t len); 598c2ecf20Sopenharmony_ci#endif 60