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