coresight-etm.h (9058B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. 4 */ 5 6#ifndef _CORESIGHT_CORESIGHT_ETM_H 7#define _CORESIGHT_CORESIGHT_ETM_H 8 9#include <asm/local.h> 10#include <linux/spinlock.h> 11#include "coresight-priv.h" 12 13/* 14 * Device registers: 15 * 0x000 - 0x2FC: Trace registers 16 * 0x300 - 0x314: Management registers 17 * 0x318 - 0xEFC: Trace registers 18 * 19 * Coresight registers 20 * 0xF00 - 0xF9C: Management registers 21 * 0xFA0 - 0xFA4: Management registers in PFTv1.0 22 * Trace registers in PFTv1.1 23 * 0xFA8 - 0xFFC: Management registers 24 */ 25 26/* Trace registers (0x000-0x2FC) */ 27#define ETMCR 0x000 28#define ETMCCR 0x004 29#define ETMTRIGGER 0x008 30#define ETMSR 0x010 31#define ETMSCR 0x014 32#define ETMTSSCR 0x018 33#define ETMTECR2 0x01c 34#define ETMTEEVR 0x020 35#define ETMTECR1 0x024 36#define ETMFFLR 0x02c 37#define ETMACVRn(n) (0x040 + (n * 4)) 38#define ETMACTRn(n) (0x080 + (n * 4)) 39#define ETMCNTRLDVRn(n) (0x140 + (n * 4)) 40#define ETMCNTENRn(n) (0x150 + (n * 4)) 41#define ETMCNTRLDEVRn(n) (0x160 + (n * 4)) 42#define ETMCNTVRn(n) (0x170 + (n * 4)) 43#define ETMSQ12EVR 0x180 44#define ETMSQ21EVR 0x184 45#define ETMSQ23EVR 0x188 46#define ETMSQ31EVR 0x18c 47#define ETMSQ32EVR 0x190 48#define ETMSQ13EVR 0x194 49#define ETMSQR 0x19c 50#define ETMEXTOUTEVRn(n) (0x1a0 + (n * 4)) 51#define ETMCIDCVRn(n) (0x1b0 + (n * 4)) 52#define ETMCIDCMR 0x1bc 53#define ETMIMPSPEC0 0x1c0 54#define ETMIMPSPEC1 0x1c4 55#define ETMIMPSPEC2 0x1c8 56#define ETMIMPSPEC3 0x1cc 57#define ETMIMPSPEC4 0x1d0 58#define ETMIMPSPEC5 0x1d4 59#define ETMIMPSPEC6 0x1d8 60#define ETMIMPSPEC7 0x1dc 61#define ETMSYNCFR 0x1e0 62#define ETMIDR 0x1e4 63#define ETMCCER 0x1e8 64#define ETMEXTINSELR 0x1ec 65#define ETMTESSEICR 0x1f0 66#define ETMEIBCR 0x1f4 67#define ETMTSEVR 0x1f8 68#define ETMAUXCR 0x1fc 69#define ETMTRACEIDR 0x200 70#define ETMVMIDCVR 0x240 71/* Management registers (0x300-0x314) */ 72#define ETMOSLAR 0x300 73#define ETMOSLSR 0x304 74#define ETMOSSRR 0x308 75#define ETMPDCR 0x310 76#define ETMPDSR 0x314 77#define ETM_MAX_ADDR_CMP 16 78#define ETM_MAX_CNTR 4 79#define ETM_MAX_CTXID_CMP 3 80 81/* Register definition */ 82/* ETMCR - 0x00 */ 83#define ETMCR_PWD_DWN BIT(0) 84#define ETMCR_STALL_MODE BIT(7) 85#define ETMCR_BRANCH_BROADCAST BIT(8) 86#define ETMCR_ETM_PRG BIT(10) 87#define ETMCR_ETM_EN BIT(11) 88#define ETMCR_CYC_ACC BIT(12) 89#define ETMCR_CTXID_SIZE (BIT(14)|BIT(15)) 90#define ETMCR_TIMESTAMP_EN BIT(28) 91#define ETMCR_RETURN_STACK BIT(29) 92/* ETMCCR - 0x04 */ 93#define ETMCCR_FIFOFULL BIT(23) 94/* ETMPDCR - 0x310 */ 95#define ETMPDCR_PWD_UP BIT(3) 96/* ETMTECR1 - 0x024 */ 97#define ETMTECR1_ADDR_COMP_1 BIT(0) 98#define ETMTECR1_INC_EXC BIT(24) 99#define ETMTECR1_START_STOP BIT(25) 100/* ETMCCER - 0x1E8 */ 101#define ETMCCER_TIMESTAMP BIT(22) 102#define ETMCCER_RETSTACK BIT(23) 103 104#define ETM_MODE_EXCLUDE BIT(0) 105#define ETM_MODE_CYCACC BIT(1) 106#define ETM_MODE_STALL BIT(2) 107#define ETM_MODE_TIMESTAMP BIT(3) 108#define ETM_MODE_CTXID BIT(4) 109#define ETM_MODE_BBROAD BIT(5) 110#define ETM_MODE_RET_STACK BIT(6) 111#define ETM_MODE_ALL (ETM_MODE_EXCLUDE | ETM_MODE_CYCACC | \ 112 ETM_MODE_STALL | ETM_MODE_TIMESTAMP | \ 113 ETM_MODE_BBROAD | ETM_MODE_RET_STACK | \ 114 ETM_MODE_CTXID | ETM_MODE_EXCL_KERN | \ 115 ETM_MODE_EXCL_USER) 116 117#define ETM_SQR_MASK 0x3 118#define ETM_TRACEID_MASK 0x3f 119#define ETM_EVENT_MASK 0x1ffff 120#define ETM_SYNC_MASK 0xfff 121#define ETM_ALL_MASK 0xffffffff 122 123#define ETMSR_PROG_BIT 1 124#define ETM_SEQ_STATE_MAX_VAL (0x2) 125#define PORT_SIZE_MASK (GENMASK(21, 21) | GENMASK(6, 4)) 126 127#define ETM_HARD_WIRE_RES_A /* Hard wired, always true */ \ 128 ((0x0f << 0) | \ 129 /* Resource index A */ \ 130 (0x06 << 4)) 131 132#define ETM_ADD_COMP_0 /* Single addr comparator 1 */ \ 133 ((0x00 << 7) | \ 134 /* Resource index B */ \ 135 (0x00 << 11)) 136 137#define ETM_EVENT_NOT_A BIT(14) /* NOT(A) */ 138 139#define ETM_DEFAULT_EVENT_VAL (ETM_HARD_WIRE_RES_A | \ 140 ETM_ADD_COMP_0 | \ 141 ETM_EVENT_NOT_A) 142 143/** 144 * struct etm_config - configuration information related to an ETM 145 * @mode: controls various modes supported by this ETM/PTM. 146 * @ctrl: used in conjunction with @mode. 147 * @trigger_event: setting for register ETMTRIGGER. 148 * @startstop_ctrl: setting for register ETMTSSCR. 149 * @enable_event: setting for register ETMTEEVR. 150 * @enable_ctrl1: setting for register ETMTECR1. 151 * @enable_ctrl2: setting for register ETMTECR2. 152 * @fifofull_level: setting for register ETMFFLR. 153 * @addr_idx: index for the address comparator selection. 154 * @addr_val: value for address comparator register. 155 * @addr_acctype: access type for address comparator register. 156 * @addr_type: current status of the comparator register. 157 * @cntr_idx: index for the counter register selection. 158 * @cntr_rld_val: reload value of a counter register. 159 * @cntr_event: control for counter enable register. 160 * @cntr_rld_event: value for counter reload event register. 161 * @cntr_val: counter value register. 162 * @seq_12_event: event causing the transition from 1 to 2. 163 * @seq_21_event: event causing the transition from 2 to 1. 164 * @seq_23_event: event causing the transition from 2 to 3. 165 * @seq_31_event: event causing the transition from 3 to 1. 166 * @seq_32_event: event causing the transition from 3 to 2. 167 * @seq_13_event: event causing the transition from 1 to 3. 168 * @seq_curr_state: current value of the sequencer register. 169 * @ctxid_idx: index for the context ID registers. 170 * @ctxid_pid: value for the context ID to trigger on. 171 * @ctxid_mask: mask applicable to all the context IDs. 172 * @sync_freq: Synchronisation frequency. 173 * @timestamp_event: Defines an event that requests the insertion 174 * of a timestamp into the trace stream. 175 */ 176struct etm_config { 177 u32 mode; 178 u32 ctrl; 179 u32 trigger_event; 180 u32 startstop_ctrl; 181 u32 enable_event; 182 u32 enable_ctrl1; 183 u32 enable_ctrl2; 184 u32 fifofull_level; 185 u8 addr_idx; 186 u32 addr_val[ETM_MAX_ADDR_CMP]; 187 u32 addr_acctype[ETM_MAX_ADDR_CMP]; 188 u32 addr_type[ETM_MAX_ADDR_CMP]; 189 u8 cntr_idx; 190 u32 cntr_rld_val[ETM_MAX_CNTR]; 191 u32 cntr_event[ETM_MAX_CNTR]; 192 u32 cntr_rld_event[ETM_MAX_CNTR]; 193 u32 cntr_val[ETM_MAX_CNTR]; 194 u32 seq_12_event; 195 u32 seq_21_event; 196 u32 seq_23_event; 197 u32 seq_31_event; 198 u32 seq_32_event; 199 u32 seq_13_event; 200 u32 seq_curr_state; 201 u8 ctxid_idx; 202 u32 ctxid_pid[ETM_MAX_CTXID_CMP]; 203 u32 ctxid_mask; 204 u32 sync_freq; 205 u32 timestamp_event; 206}; 207 208/** 209 * struct etm_drvdata - specifics associated to an ETM component 210 * @base: memory mapped base address for this component. 211 * @atclk: optional clock for the core parts of the ETM. 212 * @csdev: component vitals needed by the framework. 213 * @spinlock: only one at a time pls. 214 * @cpu: the cpu this component is affined to. 215 * @port_size: port size as reported by ETMCR bit 4-6 and 21. 216 * @arch: ETM/PTM version number. 217 * @use_cpu14: true if management registers need to be accessed via CP14. 218 * @mode: this tracer's mode, i.e sysFS, Perf or disabled. 219 * @sticky_enable: true if ETM base configuration has been done. 220 * @boot_enable:true if we should start tracing at boot time. 221 * @os_unlock: true if access to management registers is allowed. 222 * @nr_addr_cmp:Number of pairs of address comparators as found in ETMCCR. 223 * @nr_cntr: Number of counters as found in ETMCCR bit 13-15. 224 * @nr_ext_inp: Number of external input as found in ETMCCR bit 17-19. 225 * @nr_ext_out: Number of external output as found in ETMCCR bit 20-22. 226 * @nr_ctxid_cmp: Number of contextID comparators as found in ETMCCR bit 24-25. 227 * @etmccr: value of register ETMCCR. 228 * @etmccer: value of register ETMCCER. 229 * @traceid: value of the current ID for this component. 230 * @config: structure holding configuration parameters. 231 */ 232struct etm_drvdata { 233 void __iomem *base; 234 struct clk *atclk; 235 struct coresight_device *csdev; 236 spinlock_t spinlock; 237 int cpu; 238 int port_size; 239 u8 arch; 240 bool use_cp14; 241 local_t mode; 242 bool sticky_enable; 243 bool boot_enable; 244 bool os_unlock; 245 u8 nr_addr_cmp; 246 u8 nr_cntr; 247 u8 nr_ext_inp; 248 u8 nr_ext_out; 249 u8 nr_ctxid_cmp; 250 u32 etmccr; 251 u32 etmccer; 252 u32 traceid; 253 struct etm_config config; 254}; 255 256static inline void etm_writel(struct etm_drvdata *drvdata, 257 u32 val, u32 off) 258{ 259 if (drvdata->use_cp14) { 260 if (etm_writel_cp14(off, val)) { 261 dev_err(&drvdata->csdev->dev, 262 "invalid CP14 access to ETM reg: %#x", off); 263 } 264 } else { 265 writel_relaxed(val, drvdata->base + off); 266 } 267} 268 269static inline unsigned int etm_readl(struct etm_drvdata *drvdata, u32 off) 270{ 271 u32 val; 272 273 if (drvdata->use_cp14) { 274 if (etm_readl_cp14(off, &val)) { 275 dev_err(&drvdata->csdev->dev, 276 "invalid CP14 access to ETM reg: %#x", off); 277 } 278 } else { 279 val = readl_relaxed(drvdata->base + off); 280 } 281 282 return val; 283} 284 285extern const struct attribute_group *coresight_etm_groups[]; 286int etm_get_trace_id(struct etm_drvdata *drvdata); 287void etm_set_default(struct etm_config *config); 288void etm_config_trace_mode(struct etm_config *config); 289struct etm_config *get_etm_config(struct etm_drvdata *drvdata); 290#endif