cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

coresight-etm4x-sysfs.c (69772B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright(C) 2015 Linaro Limited. All rights reserved.
      4 * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
      5 */
      6
      7#include <linux/pid_namespace.h>
      8#include <linux/pm_runtime.h>
      9#include <linux/sysfs.h>
     10#include "coresight-etm4x.h"
     11#include "coresight-priv.h"
     12#include "coresight-syscfg.h"
     13
     14static int etm4_set_mode_exclude(struct etmv4_drvdata *drvdata, bool exclude)
     15{
     16	u8 idx;
     17	struct etmv4_config *config = &drvdata->config;
     18
     19	idx = config->addr_idx;
     20
     21	/*
     22	 * TRCACATRn.TYPE bit[1:0]: type of comparison
     23	 * the trace unit performs
     24	 */
     25	if (FIELD_GET(TRCACATRn_TYPE_MASK, config->addr_acc[idx]) == TRCACATRn_TYPE_ADDR) {
     26		if (idx % 2 != 0)
     27			return -EINVAL;
     28
     29		/*
     30		 * We are performing instruction address comparison. Set the
     31		 * relevant bit of ViewInst Include/Exclude Control register
     32		 * for corresponding address comparator pair.
     33		 */
     34		if (config->addr_type[idx] != ETM_ADDR_TYPE_RANGE ||
     35		    config->addr_type[idx + 1] != ETM_ADDR_TYPE_RANGE)
     36			return -EINVAL;
     37
     38		if (exclude == true) {
     39			/*
     40			 * Set exclude bit and unset the include bit
     41			 * corresponding to comparator pair
     42			 */
     43			config->viiectlr |= BIT(idx / 2 + 16);
     44			config->viiectlr &= ~BIT(idx / 2);
     45		} else {
     46			/*
     47			 * Set include bit and unset exclude bit
     48			 * corresponding to comparator pair
     49			 */
     50			config->viiectlr |= BIT(idx / 2);
     51			config->viiectlr &= ~BIT(idx / 2 + 16);
     52		}
     53	}
     54	return 0;
     55}
     56
     57static ssize_t nr_pe_cmp_show(struct device *dev,
     58			      struct device_attribute *attr,
     59			      char *buf)
     60{
     61	unsigned long val;
     62	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
     63
     64	val = drvdata->nr_pe_cmp;
     65	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
     66}
     67static DEVICE_ATTR_RO(nr_pe_cmp);
     68
     69static ssize_t nr_addr_cmp_show(struct device *dev,
     70				struct device_attribute *attr,
     71				char *buf)
     72{
     73	unsigned long val;
     74	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
     75
     76	val = drvdata->nr_addr_cmp;
     77	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
     78}
     79static DEVICE_ATTR_RO(nr_addr_cmp);
     80
     81static ssize_t nr_cntr_show(struct device *dev,
     82			    struct device_attribute *attr,
     83			    char *buf)
     84{
     85	unsigned long val;
     86	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
     87
     88	val = drvdata->nr_cntr;
     89	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
     90}
     91static DEVICE_ATTR_RO(nr_cntr);
     92
     93static ssize_t nr_ext_inp_show(struct device *dev,
     94			       struct device_attribute *attr,
     95			       char *buf)
     96{
     97	unsigned long val;
     98	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
     99
    100	val = drvdata->nr_ext_inp;
    101	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    102}
    103static DEVICE_ATTR_RO(nr_ext_inp);
    104
    105static ssize_t numcidc_show(struct device *dev,
    106			    struct device_attribute *attr,
    107			    char *buf)
    108{
    109	unsigned long val;
    110	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    111
    112	val = drvdata->numcidc;
    113	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    114}
    115static DEVICE_ATTR_RO(numcidc);
    116
    117static ssize_t numvmidc_show(struct device *dev,
    118			     struct device_attribute *attr,
    119			     char *buf)
    120{
    121	unsigned long val;
    122	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    123
    124	val = drvdata->numvmidc;
    125	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    126}
    127static DEVICE_ATTR_RO(numvmidc);
    128
    129static ssize_t nrseqstate_show(struct device *dev,
    130			       struct device_attribute *attr,
    131			       char *buf)
    132{
    133	unsigned long val;
    134	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    135
    136	val = drvdata->nrseqstate;
    137	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    138}
    139static DEVICE_ATTR_RO(nrseqstate);
    140
    141static ssize_t nr_resource_show(struct device *dev,
    142				struct device_attribute *attr,
    143				char *buf)
    144{
    145	unsigned long val;
    146	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    147
    148	val = drvdata->nr_resource;
    149	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    150}
    151static DEVICE_ATTR_RO(nr_resource);
    152
    153static ssize_t nr_ss_cmp_show(struct device *dev,
    154			      struct device_attribute *attr,
    155			      char *buf)
    156{
    157	unsigned long val;
    158	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    159
    160	val = drvdata->nr_ss_cmp;
    161	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    162}
    163static DEVICE_ATTR_RO(nr_ss_cmp);
    164
    165static ssize_t reset_store(struct device *dev,
    166			   struct device_attribute *attr,
    167			   const char *buf, size_t size)
    168{
    169	int i;
    170	unsigned long val;
    171	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    172	struct etmv4_config *config = &drvdata->config;
    173
    174	if (kstrtoul(buf, 16, &val))
    175		return -EINVAL;
    176
    177	spin_lock(&drvdata->spinlock);
    178	if (val)
    179		config->mode = 0x0;
    180
    181	/* Disable data tracing: do not trace load and store data transfers */
    182	config->mode &= ~(ETM_MODE_LOAD | ETM_MODE_STORE);
    183	config->cfg &= ~(TRCCONFIGR_INSTP0_LOAD | TRCCONFIGR_INSTP0_STORE);
    184
    185	/* Disable data value and data address tracing */
    186	config->mode &= ~(ETM_MODE_DATA_TRACE_ADDR |
    187			   ETM_MODE_DATA_TRACE_VAL);
    188	config->cfg &= ~(TRCCONFIGR_DA | TRCCONFIGR_DV);
    189
    190	/* Disable all events tracing */
    191	config->eventctrl0 = 0x0;
    192	config->eventctrl1 = 0x0;
    193
    194	/* Disable timestamp event */
    195	config->ts_ctrl = 0x0;
    196
    197	/* Disable stalling */
    198	config->stall_ctrl = 0x0;
    199
    200	/* Reset trace synchronization period  to 2^8 = 256 bytes*/
    201	if (drvdata->syncpr == false)
    202		config->syncfreq = 0x8;
    203
    204	/*
    205	 * Enable ViewInst to trace everything with start-stop logic in
    206	 * started state. ARM recommends start-stop logic is set before
    207	 * each trace run.
    208	 */
    209	config->vinst_ctrl = FIELD_PREP(TRCVICTLR_EVENT_MASK, 0x01);
    210	if (drvdata->nr_addr_cmp > 0) {
    211		config->mode |= ETM_MODE_VIEWINST_STARTSTOP;
    212		/* SSSTATUS, bit[9] */
    213		config->vinst_ctrl |= TRCVICTLR_SSSTATUS;
    214	}
    215
    216	/* No address range filtering for ViewInst */
    217	config->viiectlr = 0x0;
    218
    219	/* No start-stop filtering for ViewInst */
    220	config->vissctlr = 0x0;
    221	config->vipcssctlr = 0x0;
    222
    223	/* Disable seq events */
    224	for (i = 0; i < drvdata->nrseqstate-1; i++)
    225		config->seq_ctrl[i] = 0x0;
    226	config->seq_rst = 0x0;
    227	config->seq_state = 0x0;
    228
    229	/* Disable external input events */
    230	config->ext_inp = 0x0;
    231
    232	config->cntr_idx = 0x0;
    233	for (i = 0; i < drvdata->nr_cntr; i++) {
    234		config->cntrldvr[i] = 0x0;
    235		config->cntr_ctrl[i] = 0x0;
    236		config->cntr_val[i] = 0x0;
    237	}
    238
    239	config->res_idx = 0x0;
    240	for (i = 2; i < 2 * drvdata->nr_resource; i++)
    241		config->res_ctrl[i] = 0x0;
    242
    243	config->ss_idx = 0x0;
    244	for (i = 0; i < drvdata->nr_ss_cmp; i++) {
    245		config->ss_ctrl[i] = 0x0;
    246		config->ss_pe_cmp[i] = 0x0;
    247	}
    248
    249	config->addr_idx = 0x0;
    250	for (i = 0; i < drvdata->nr_addr_cmp * 2; i++) {
    251		config->addr_val[i] = 0x0;
    252		config->addr_acc[i] = 0x0;
    253		config->addr_type[i] = ETM_ADDR_TYPE_NONE;
    254	}
    255
    256	config->ctxid_idx = 0x0;
    257	for (i = 0; i < drvdata->numcidc; i++)
    258		config->ctxid_pid[i] = 0x0;
    259
    260	config->ctxid_mask0 = 0x0;
    261	config->ctxid_mask1 = 0x0;
    262
    263	config->vmid_idx = 0x0;
    264	for (i = 0; i < drvdata->numvmidc; i++)
    265		config->vmid_val[i] = 0x0;
    266	config->vmid_mask0 = 0x0;
    267	config->vmid_mask1 = 0x0;
    268
    269	drvdata->trcid = drvdata->cpu + 1;
    270
    271	spin_unlock(&drvdata->spinlock);
    272
    273	cscfg_csdev_reset_feats(to_coresight_device(dev));
    274
    275	return size;
    276}
    277static DEVICE_ATTR_WO(reset);
    278
    279static ssize_t mode_show(struct device *dev,
    280			 struct device_attribute *attr,
    281			 char *buf)
    282{
    283	unsigned long val;
    284	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    285	struct etmv4_config *config = &drvdata->config;
    286
    287	val = config->mode;
    288	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    289}
    290
    291static ssize_t mode_store(struct device *dev,
    292			  struct device_attribute *attr,
    293			  const char *buf, size_t size)
    294{
    295	unsigned long val, mode;
    296	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    297	struct etmv4_config *config = &drvdata->config;
    298
    299	if (kstrtoul(buf, 16, &val))
    300		return -EINVAL;
    301
    302	spin_lock(&drvdata->spinlock);
    303	config->mode = val & ETMv4_MODE_ALL;
    304
    305	if (drvdata->instrp0 == true) {
    306		/* start by clearing instruction P0 field */
    307		config->cfg  &= ~TRCCONFIGR_INSTP0_LOAD_STORE;
    308		if (config->mode & ETM_MODE_LOAD)
    309			/* 0b01 Trace load instructions as P0 instructions */
    310			config->cfg  |= TRCCONFIGR_INSTP0_LOAD;
    311		if (config->mode & ETM_MODE_STORE)
    312			/* 0b10 Trace store instructions as P0 instructions */
    313			config->cfg  |= TRCCONFIGR_INSTP0_STORE;
    314		if (config->mode & ETM_MODE_LOAD_STORE)
    315			/*
    316			 * 0b11 Trace load and store instructions
    317			 * as P0 instructions
    318			 */
    319			config->cfg  |= TRCCONFIGR_INSTP0_LOAD_STORE;
    320	}
    321
    322	/* bit[3], Branch broadcast mode */
    323	if ((config->mode & ETM_MODE_BB) && (drvdata->trcbb == true))
    324		config->cfg |= TRCCONFIGR_BB;
    325	else
    326		config->cfg &= ~TRCCONFIGR_BB;
    327
    328	/* bit[4], Cycle counting instruction trace bit */
    329	if ((config->mode & ETMv4_MODE_CYCACC) &&
    330		(drvdata->trccci == true))
    331		config->cfg |= TRCCONFIGR_CCI;
    332	else
    333		config->cfg &= ~TRCCONFIGR_CCI;
    334
    335	/* bit[6], Context ID tracing bit */
    336	if ((config->mode & ETMv4_MODE_CTXID) && (drvdata->ctxid_size))
    337		config->cfg |= TRCCONFIGR_CID;
    338	else
    339		config->cfg &= ~TRCCONFIGR_CID;
    340
    341	if ((config->mode & ETM_MODE_VMID) && (drvdata->vmid_size))
    342		config->cfg |= TRCCONFIGR_VMID;
    343	else
    344		config->cfg &= ~TRCCONFIGR_VMID;
    345
    346	/* bits[10:8], Conditional instruction tracing bit */
    347	mode = ETM_MODE_COND(config->mode);
    348	if (drvdata->trccond == true) {
    349		config->cfg &= ~TRCCONFIGR_COND_MASK;
    350		config->cfg |= mode << __bf_shf(TRCCONFIGR_COND_MASK);
    351	}
    352
    353	/* bit[11], Global timestamp tracing bit */
    354	if ((config->mode & ETMv4_MODE_TIMESTAMP) && (drvdata->ts_size))
    355		config->cfg |= TRCCONFIGR_TS;
    356	else
    357		config->cfg &= ~TRCCONFIGR_TS;
    358
    359	/* bit[12], Return stack enable bit */
    360	if ((config->mode & ETM_MODE_RETURNSTACK) &&
    361					(drvdata->retstack == true))
    362		config->cfg |= TRCCONFIGR_RS;
    363	else
    364		config->cfg &= ~TRCCONFIGR_RS;
    365
    366	/* bits[14:13], Q element enable field */
    367	mode = ETM_MODE_QELEM(config->mode);
    368	/* start by clearing QE bits */
    369	config->cfg &= ~(TRCCONFIGR_QE_W_COUNTS | TRCCONFIGR_QE_WO_COUNTS);
    370	/*
    371	 * if supported, Q elements with instruction counts are enabled.
    372	 * Always set the low bit for any requested mode. Valid combos are
    373	 * 0b00, 0b01 and 0b11.
    374	 */
    375	if (mode && drvdata->q_support)
    376		config->cfg |= TRCCONFIGR_QE_W_COUNTS;
    377	/*
    378	 * if supported, Q elements with and without instruction
    379	 * counts are enabled
    380	 */
    381	if ((mode & BIT(1)) && (drvdata->q_support & BIT(1)))
    382		config->cfg |= TRCCONFIGR_QE_WO_COUNTS;
    383
    384	/* bit[11], AMBA Trace Bus (ATB) trigger enable bit */
    385	if ((config->mode & ETM_MODE_ATB_TRIGGER) &&
    386	    (drvdata->atbtrig == true))
    387		config->eventctrl1 |= TRCEVENTCTL1R_ATB;
    388	else
    389		config->eventctrl1 &= ~TRCEVENTCTL1R_ATB;
    390
    391	/* bit[12], Low-power state behavior override bit */
    392	if ((config->mode & ETM_MODE_LPOVERRIDE) &&
    393	    (drvdata->lpoverride == true))
    394		config->eventctrl1 |= TRCEVENTCTL1R_LPOVERRIDE;
    395	else
    396		config->eventctrl1 &= ~TRCEVENTCTL1R_LPOVERRIDE;
    397
    398	/* bit[8], Instruction stall bit */
    399	if ((config->mode & ETM_MODE_ISTALL_EN) && (drvdata->stallctl == true))
    400		config->stall_ctrl |= TRCSTALLCTLR_ISTALL;
    401	else
    402		config->stall_ctrl &= ~TRCSTALLCTLR_ISTALL;
    403
    404	/* bit[10], Prioritize instruction trace bit */
    405	if (config->mode & ETM_MODE_INSTPRIO)
    406		config->stall_ctrl |= TRCSTALLCTLR_INSTPRIORITY;
    407	else
    408		config->stall_ctrl &= ~TRCSTALLCTLR_INSTPRIORITY;
    409
    410	/* bit[13], Trace overflow prevention bit */
    411	if ((config->mode & ETM_MODE_NOOVERFLOW) &&
    412		(drvdata->nooverflow == true))
    413		config->stall_ctrl |= TRCSTALLCTLR_NOOVERFLOW;
    414	else
    415		config->stall_ctrl &= ~TRCSTALLCTLR_NOOVERFLOW;
    416
    417	/* bit[9] Start/stop logic control bit */
    418	if (config->mode & ETM_MODE_VIEWINST_STARTSTOP)
    419		config->vinst_ctrl |= TRCVICTLR_SSSTATUS;
    420	else
    421		config->vinst_ctrl &= ~TRCVICTLR_SSSTATUS;
    422
    423	/* bit[10], Whether a trace unit must trace a Reset exception */
    424	if (config->mode & ETM_MODE_TRACE_RESET)
    425		config->vinst_ctrl |= TRCVICTLR_TRCRESET;
    426	else
    427		config->vinst_ctrl &= ~TRCVICTLR_TRCRESET;
    428
    429	/* bit[11], Whether a trace unit must trace a system error exception */
    430	if ((config->mode & ETM_MODE_TRACE_ERR) &&
    431		(drvdata->trc_error == true))
    432		config->vinst_ctrl |= TRCVICTLR_TRCERR;
    433	else
    434		config->vinst_ctrl &= ~TRCVICTLR_TRCERR;
    435
    436	if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER))
    437		etm4_config_trace_mode(config);
    438
    439	spin_unlock(&drvdata->spinlock);
    440
    441	return size;
    442}
    443static DEVICE_ATTR_RW(mode);
    444
    445static ssize_t pe_show(struct device *dev,
    446		       struct device_attribute *attr,
    447		       char *buf)
    448{
    449	unsigned long val;
    450	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    451	struct etmv4_config *config = &drvdata->config;
    452
    453	val = config->pe_sel;
    454	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    455}
    456
    457static ssize_t pe_store(struct device *dev,
    458			struct device_attribute *attr,
    459			const char *buf, size_t size)
    460{
    461	unsigned long val;
    462	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    463	struct etmv4_config *config = &drvdata->config;
    464
    465	if (kstrtoul(buf, 16, &val))
    466		return -EINVAL;
    467
    468	spin_lock(&drvdata->spinlock);
    469	if (val > drvdata->nr_pe) {
    470		spin_unlock(&drvdata->spinlock);
    471		return -EINVAL;
    472	}
    473
    474	config->pe_sel = val;
    475	spin_unlock(&drvdata->spinlock);
    476	return size;
    477}
    478static DEVICE_ATTR_RW(pe);
    479
    480static ssize_t event_show(struct device *dev,
    481			  struct device_attribute *attr,
    482			  char *buf)
    483{
    484	unsigned long val;
    485	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    486	struct etmv4_config *config = &drvdata->config;
    487
    488	val = config->eventctrl0;
    489	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    490}
    491
    492static ssize_t event_store(struct device *dev,
    493			   struct device_attribute *attr,
    494			   const char *buf, size_t size)
    495{
    496	unsigned long val;
    497	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    498	struct etmv4_config *config = &drvdata->config;
    499
    500	if (kstrtoul(buf, 16, &val))
    501		return -EINVAL;
    502
    503	spin_lock(&drvdata->spinlock);
    504	switch (drvdata->nr_event) {
    505	case 0x0:
    506		/* EVENT0, bits[7:0] */
    507		config->eventctrl0 = val & 0xFF;
    508		break;
    509	case 0x1:
    510		 /* EVENT1, bits[15:8] */
    511		config->eventctrl0 = val & 0xFFFF;
    512		break;
    513	case 0x2:
    514		/* EVENT2, bits[23:16] */
    515		config->eventctrl0 = val & 0xFFFFFF;
    516		break;
    517	case 0x3:
    518		/* EVENT3, bits[31:24] */
    519		config->eventctrl0 = val;
    520		break;
    521	default:
    522		break;
    523	}
    524	spin_unlock(&drvdata->spinlock);
    525	return size;
    526}
    527static DEVICE_ATTR_RW(event);
    528
    529static ssize_t event_instren_show(struct device *dev,
    530				  struct device_attribute *attr,
    531				  char *buf)
    532{
    533	unsigned long val;
    534	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    535	struct etmv4_config *config = &drvdata->config;
    536
    537	val = FIELD_GET(TRCEVENTCTL1R_INSTEN_MASK, config->eventctrl1);
    538	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    539}
    540
    541static ssize_t event_instren_store(struct device *dev,
    542				   struct device_attribute *attr,
    543				   const char *buf, size_t size)
    544{
    545	unsigned long val;
    546	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    547	struct etmv4_config *config = &drvdata->config;
    548
    549	if (kstrtoul(buf, 16, &val))
    550		return -EINVAL;
    551
    552	spin_lock(&drvdata->spinlock);
    553	/* start by clearing all instruction event enable bits */
    554	config->eventctrl1 &= ~TRCEVENTCTL1R_INSTEN_MASK;
    555	switch (drvdata->nr_event) {
    556	case 0x0:
    557		/* generate Event element for event 1 */
    558		config->eventctrl1 |= val & TRCEVENTCTL1R_INSTEN_1;
    559		break;
    560	case 0x1:
    561		/* generate Event element for event 1 and 2 */
    562		config->eventctrl1 |= val & (TRCEVENTCTL1R_INSTEN_0 | TRCEVENTCTL1R_INSTEN_1);
    563		break;
    564	case 0x2:
    565		/* generate Event element for event 1, 2 and 3 */
    566		config->eventctrl1 |= val & (TRCEVENTCTL1R_INSTEN_0 |
    567					     TRCEVENTCTL1R_INSTEN_1 |
    568					     TRCEVENTCTL1R_INSTEN_2);
    569		break;
    570	case 0x3:
    571		/* generate Event element for all 4 events */
    572		config->eventctrl1 |= val & (TRCEVENTCTL1R_INSTEN_0 |
    573					     TRCEVENTCTL1R_INSTEN_1 |
    574					     TRCEVENTCTL1R_INSTEN_2 |
    575					     TRCEVENTCTL1R_INSTEN_3);
    576		break;
    577	default:
    578		break;
    579	}
    580	spin_unlock(&drvdata->spinlock);
    581	return size;
    582}
    583static DEVICE_ATTR_RW(event_instren);
    584
    585static ssize_t event_ts_show(struct device *dev,
    586			     struct device_attribute *attr,
    587			     char *buf)
    588{
    589	unsigned long val;
    590	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    591	struct etmv4_config *config = &drvdata->config;
    592
    593	val = config->ts_ctrl;
    594	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    595}
    596
    597static ssize_t event_ts_store(struct device *dev,
    598			      struct device_attribute *attr,
    599			      const char *buf, size_t size)
    600{
    601	unsigned long val;
    602	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    603	struct etmv4_config *config = &drvdata->config;
    604
    605	if (kstrtoul(buf, 16, &val))
    606		return -EINVAL;
    607	if (!drvdata->ts_size)
    608		return -EINVAL;
    609
    610	config->ts_ctrl = val & ETMv4_EVENT_MASK;
    611	return size;
    612}
    613static DEVICE_ATTR_RW(event_ts);
    614
    615static ssize_t syncfreq_show(struct device *dev,
    616			     struct device_attribute *attr,
    617			     char *buf)
    618{
    619	unsigned long val;
    620	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    621	struct etmv4_config *config = &drvdata->config;
    622
    623	val = config->syncfreq;
    624	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    625}
    626
    627static ssize_t syncfreq_store(struct device *dev,
    628			      struct device_attribute *attr,
    629			      const char *buf, size_t size)
    630{
    631	unsigned long val;
    632	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    633	struct etmv4_config *config = &drvdata->config;
    634
    635	if (kstrtoul(buf, 16, &val))
    636		return -EINVAL;
    637	if (drvdata->syncpr == true)
    638		return -EINVAL;
    639
    640	config->syncfreq = val & ETMv4_SYNC_MASK;
    641	return size;
    642}
    643static DEVICE_ATTR_RW(syncfreq);
    644
    645static ssize_t cyc_threshold_show(struct device *dev,
    646				  struct device_attribute *attr,
    647				  char *buf)
    648{
    649	unsigned long val;
    650	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    651	struct etmv4_config *config = &drvdata->config;
    652
    653	val = config->ccctlr;
    654	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    655}
    656
    657static ssize_t cyc_threshold_store(struct device *dev,
    658				   struct device_attribute *attr,
    659				   const char *buf, size_t size)
    660{
    661	unsigned long val;
    662	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    663	struct etmv4_config *config = &drvdata->config;
    664
    665	if (kstrtoul(buf, 16, &val))
    666		return -EINVAL;
    667
    668	/* mask off max threshold before checking min value */
    669	val &= ETM_CYC_THRESHOLD_MASK;
    670	if (val < drvdata->ccitmin)
    671		return -EINVAL;
    672
    673	config->ccctlr = val;
    674	return size;
    675}
    676static DEVICE_ATTR_RW(cyc_threshold);
    677
    678static ssize_t bb_ctrl_show(struct device *dev,
    679			    struct device_attribute *attr,
    680			    char *buf)
    681{
    682	unsigned long val;
    683	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    684	struct etmv4_config *config = &drvdata->config;
    685
    686	val = config->bb_ctrl;
    687	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    688}
    689
    690static ssize_t bb_ctrl_store(struct device *dev,
    691			     struct device_attribute *attr,
    692			     const char *buf, size_t size)
    693{
    694	unsigned long val;
    695	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    696	struct etmv4_config *config = &drvdata->config;
    697
    698	if (kstrtoul(buf, 16, &val))
    699		return -EINVAL;
    700	if (drvdata->trcbb == false)
    701		return -EINVAL;
    702	if (!drvdata->nr_addr_cmp)
    703		return -EINVAL;
    704
    705	/*
    706	 * Bit[8] controls include(1) / exclude(0), bits[0-7] select
    707	 * individual range comparators. If include then at least 1
    708	 * range must be selected.
    709	 */
    710	if ((val & TRCBBCTLR_MODE) && (FIELD_GET(TRCBBCTLR_RANGE_MASK, val) == 0))
    711		return -EINVAL;
    712
    713	config->bb_ctrl = val & (TRCBBCTLR_MODE | TRCBBCTLR_RANGE_MASK);
    714	return size;
    715}
    716static DEVICE_ATTR_RW(bb_ctrl);
    717
    718static ssize_t event_vinst_show(struct device *dev,
    719				struct device_attribute *attr,
    720				char *buf)
    721{
    722	unsigned long val;
    723	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    724	struct etmv4_config *config = &drvdata->config;
    725
    726	val = FIELD_GET(TRCVICTLR_EVENT_MASK, config->vinst_ctrl);
    727	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    728}
    729
    730static ssize_t event_vinst_store(struct device *dev,
    731				 struct device_attribute *attr,
    732				 const char *buf, size_t size)
    733{
    734	unsigned long val;
    735	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    736	struct etmv4_config *config = &drvdata->config;
    737
    738	if (kstrtoul(buf, 16, &val))
    739		return -EINVAL;
    740
    741	spin_lock(&drvdata->spinlock);
    742	val &= TRCVICTLR_EVENT_MASK >> __bf_shf(TRCVICTLR_EVENT_MASK);
    743	config->vinst_ctrl &= ~TRCVICTLR_EVENT_MASK;
    744	config->vinst_ctrl |= FIELD_PREP(TRCVICTLR_EVENT_MASK, val);
    745	spin_unlock(&drvdata->spinlock);
    746	return size;
    747}
    748static DEVICE_ATTR_RW(event_vinst);
    749
    750static ssize_t s_exlevel_vinst_show(struct device *dev,
    751				    struct device_attribute *attr,
    752				    char *buf)
    753{
    754	unsigned long val;
    755	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    756	struct etmv4_config *config = &drvdata->config;
    757
    758	val = FIELD_GET(TRCVICTLR_EXLEVEL_S_MASK, config->vinst_ctrl);
    759	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    760}
    761
    762static ssize_t s_exlevel_vinst_store(struct device *dev,
    763				     struct device_attribute *attr,
    764				     const char *buf, size_t size)
    765{
    766	unsigned long val;
    767	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    768	struct etmv4_config *config = &drvdata->config;
    769
    770	if (kstrtoul(buf, 16, &val))
    771		return -EINVAL;
    772
    773	spin_lock(&drvdata->spinlock);
    774	/* clear all EXLEVEL_S bits  */
    775	config->vinst_ctrl &= ~TRCVICTLR_EXLEVEL_S_MASK;
    776	/* enable instruction tracing for corresponding exception level */
    777	val &= drvdata->s_ex_level;
    778	config->vinst_ctrl |= val << __bf_shf(TRCVICTLR_EXLEVEL_S_MASK);
    779	spin_unlock(&drvdata->spinlock);
    780	return size;
    781}
    782static DEVICE_ATTR_RW(s_exlevel_vinst);
    783
    784static ssize_t ns_exlevel_vinst_show(struct device *dev,
    785				     struct device_attribute *attr,
    786				     char *buf)
    787{
    788	unsigned long val;
    789	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    790	struct etmv4_config *config = &drvdata->config;
    791
    792	/* EXLEVEL_NS, bits[23:20] */
    793	val = FIELD_GET(TRCVICTLR_EXLEVEL_NS_MASK, config->vinst_ctrl);
    794	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    795}
    796
    797static ssize_t ns_exlevel_vinst_store(struct device *dev,
    798				      struct device_attribute *attr,
    799				      const char *buf, size_t size)
    800{
    801	unsigned long val;
    802	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    803	struct etmv4_config *config = &drvdata->config;
    804
    805	if (kstrtoul(buf, 16, &val))
    806		return -EINVAL;
    807
    808	spin_lock(&drvdata->spinlock);
    809	/* clear EXLEVEL_NS bits  */
    810	config->vinst_ctrl &= ~TRCVICTLR_EXLEVEL_NS_MASK;
    811	/* enable instruction tracing for corresponding exception level */
    812	val &= drvdata->ns_ex_level;
    813	config->vinst_ctrl |= val << __bf_shf(TRCVICTLR_EXLEVEL_NS_MASK);
    814	spin_unlock(&drvdata->spinlock);
    815	return size;
    816}
    817static DEVICE_ATTR_RW(ns_exlevel_vinst);
    818
    819static ssize_t addr_idx_show(struct device *dev,
    820			     struct device_attribute *attr,
    821			     char *buf)
    822{
    823	unsigned long val;
    824	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    825	struct etmv4_config *config = &drvdata->config;
    826
    827	val = config->addr_idx;
    828	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    829}
    830
    831static ssize_t addr_idx_store(struct device *dev,
    832			      struct device_attribute *attr,
    833			      const char *buf, size_t size)
    834{
    835	unsigned long val;
    836	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    837	struct etmv4_config *config = &drvdata->config;
    838
    839	if (kstrtoul(buf, 16, &val))
    840		return -EINVAL;
    841	if (val >= drvdata->nr_addr_cmp * 2)
    842		return -EINVAL;
    843
    844	/*
    845	 * Use spinlock to ensure index doesn't change while it gets
    846	 * dereferenced multiple times within a spinlock block elsewhere.
    847	 */
    848	spin_lock(&drvdata->spinlock);
    849	config->addr_idx = val;
    850	spin_unlock(&drvdata->spinlock);
    851	return size;
    852}
    853static DEVICE_ATTR_RW(addr_idx);
    854
    855static ssize_t addr_instdatatype_show(struct device *dev,
    856				      struct device_attribute *attr,
    857				      char *buf)
    858{
    859	ssize_t len;
    860	u8 val, idx;
    861	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    862	struct etmv4_config *config = &drvdata->config;
    863
    864	spin_lock(&drvdata->spinlock);
    865	idx = config->addr_idx;
    866	val = FIELD_GET(TRCACATRn_TYPE_MASK, config->addr_acc[idx]);
    867	len = scnprintf(buf, PAGE_SIZE, "%s\n",
    868			val == TRCACATRn_TYPE_ADDR ? "instr" :
    869			(val == TRCACATRn_TYPE_DATA_LOAD_ADDR ? "data_load" :
    870			(val == TRCACATRn_TYPE_DATA_STORE_ADDR ? "data_store" :
    871			"data_load_store")));
    872	spin_unlock(&drvdata->spinlock);
    873	return len;
    874}
    875
    876static ssize_t addr_instdatatype_store(struct device *dev,
    877				       struct device_attribute *attr,
    878				       const char *buf, size_t size)
    879{
    880	u8 idx;
    881	char str[20] = "";
    882	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    883	struct etmv4_config *config = &drvdata->config;
    884
    885	if (strlen(buf) >= 20)
    886		return -EINVAL;
    887	if (sscanf(buf, "%s", str) != 1)
    888		return -EINVAL;
    889
    890	spin_lock(&drvdata->spinlock);
    891	idx = config->addr_idx;
    892	if (!strcmp(str, "instr"))
    893		/* TYPE, bits[1:0] */
    894		config->addr_acc[idx] &= ~TRCACATRn_TYPE_MASK;
    895
    896	spin_unlock(&drvdata->spinlock);
    897	return size;
    898}
    899static DEVICE_ATTR_RW(addr_instdatatype);
    900
    901static ssize_t addr_single_show(struct device *dev,
    902				struct device_attribute *attr,
    903				char *buf)
    904{
    905	u8 idx;
    906	unsigned long val;
    907	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    908	struct etmv4_config *config = &drvdata->config;
    909
    910	idx = config->addr_idx;
    911	spin_lock(&drvdata->spinlock);
    912	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
    913	      config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
    914		spin_unlock(&drvdata->spinlock);
    915		return -EPERM;
    916	}
    917	val = (unsigned long)config->addr_val[idx];
    918	spin_unlock(&drvdata->spinlock);
    919	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    920}
    921
    922static ssize_t addr_single_store(struct device *dev,
    923				 struct device_attribute *attr,
    924				 const char *buf, size_t size)
    925{
    926	u8 idx;
    927	unsigned long val;
    928	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    929	struct etmv4_config *config = &drvdata->config;
    930
    931	if (kstrtoul(buf, 16, &val))
    932		return -EINVAL;
    933
    934	spin_lock(&drvdata->spinlock);
    935	idx = config->addr_idx;
    936	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
    937	      config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
    938		spin_unlock(&drvdata->spinlock);
    939		return -EPERM;
    940	}
    941
    942	config->addr_val[idx] = (u64)val;
    943	config->addr_type[idx] = ETM_ADDR_TYPE_SINGLE;
    944	spin_unlock(&drvdata->spinlock);
    945	return size;
    946}
    947static DEVICE_ATTR_RW(addr_single);
    948
    949static ssize_t addr_range_show(struct device *dev,
    950			       struct device_attribute *attr,
    951			       char *buf)
    952{
    953	u8 idx;
    954	unsigned long val1, val2;
    955	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    956	struct etmv4_config *config = &drvdata->config;
    957
    958	spin_lock(&drvdata->spinlock);
    959	idx = config->addr_idx;
    960	if (idx % 2 != 0) {
    961		spin_unlock(&drvdata->spinlock);
    962		return -EPERM;
    963	}
    964	if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
    965	       config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
    966	      (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
    967	       config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
    968		spin_unlock(&drvdata->spinlock);
    969		return -EPERM;
    970	}
    971
    972	val1 = (unsigned long)config->addr_val[idx];
    973	val2 = (unsigned long)config->addr_val[idx + 1];
    974	spin_unlock(&drvdata->spinlock);
    975	return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
    976}
    977
    978static ssize_t addr_range_store(struct device *dev,
    979				struct device_attribute *attr,
    980				const char *buf, size_t size)
    981{
    982	u8 idx;
    983	unsigned long val1, val2;
    984	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
    985	struct etmv4_config *config = &drvdata->config;
    986	int elements, exclude;
    987
    988	elements = sscanf(buf, "%lx %lx %x", &val1, &val2, &exclude);
    989
    990	/*  exclude is optional, but need at least two parameter */
    991	if (elements < 2)
    992		return -EINVAL;
    993	/* lower address comparator cannot have a higher address value */
    994	if (val1 > val2)
    995		return -EINVAL;
    996
    997	spin_lock(&drvdata->spinlock);
    998	idx = config->addr_idx;
    999	if (idx % 2 != 0) {
   1000		spin_unlock(&drvdata->spinlock);
   1001		return -EPERM;
   1002	}
   1003
   1004	if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
   1005	       config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
   1006	      (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
   1007	       config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
   1008		spin_unlock(&drvdata->spinlock);
   1009		return -EPERM;
   1010	}
   1011
   1012	config->addr_val[idx] = (u64)val1;
   1013	config->addr_type[idx] = ETM_ADDR_TYPE_RANGE;
   1014	config->addr_val[idx + 1] = (u64)val2;
   1015	config->addr_type[idx + 1] = ETM_ADDR_TYPE_RANGE;
   1016	/*
   1017	 * Program include or exclude control bits for vinst or vdata
   1018	 * whenever we change addr comparators to ETM_ADDR_TYPE_RANGE
   1019	 * use supplied value, or default to bit set in 'mode'
   1020	 */
   1021	if (elements != 3)
   1022		exclude = config->mode & ETM_MODE_EXCLUDE;
   1023	etm4_set_mode_exclude(drvdata, exclude ? true : false);
   1024
   1025	spin_unlock(&drvdata->spinlock);
   1026	return size;
   1027}
   1028static DEVICE_ATTR_RW(addr_range);
   1029
   1030static ssize_t addr_start_show(struct device *dev,
   1031			       struct device_attribute *attr,
   1032			       char *buf)
   1033{
   1034	u8 idx;
   1035	unsigned long val;
   1036	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1037	struct etmv4_config *config = &drvdata->config;
   1038
   1039	spin_lock(&drvdata->spinlock);
   1040	idx = config->addr_idx;
   1041
   1042	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
   1043	      config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
   1044		spin_unlock(&drvdata->spinlock);
   1045		return -EPERM;
   1046	}
   1047
   1048	val = (unsigned long)config->addr_val[idx];
   1049	spin_unlock(&drvdata->spinlock);
   1050	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1051}
   1052
   1053static ssize_t addr_start_store(struct device *dev,
   1054				struct device_attribute *attr,
   1055				const char *buf, size_t size)
   1056{
   1057	u8 idx;
   1058	unsigned long val;
   1059	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1060	struct etmv4_config *config = &drvdata->config;
   1061
   1062	if (kstrtoul(buf, 16, &val))
   1063		return -EINVAL;
   1064
   1065	spin_lock(&drvdata->spinlock);
   1066	idx = config->addr_idx;
   1067	if (!drvdata->nr_addr_cmp) {
   1068		spin_unlock(&drvdata->spinlock);
   1069		return -EINVAL;
   1070	}
   1071	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
   1072	      config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
   1073		spin_unlock(&drvdata->spinlock);
   1074		return -EPERM;
   1075	}
   1076
   1077	config->addr_val[idx] = (u64)val;
   1078	config->addr_type[idx] = ETM_ADDR_TYPE_START;
   1079	config->vissctlr |= BIT(idx);
   1080	spin_unlock(&drvdata->spinlock);
   1081	return size;
   1082}
   1083static DEVICE_ATTR_RW(addr_start);
   1084
   1085static ssize_t addr_stop_show(struct device *dev,
   1086			      struct device_attribute *attr,
   1087			      char *buf)
   1088{
   1089	u8 idx;
   1090	unsigned long val;
   1091	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1092	struct etmv4_config *config = &drvdata->config;
   1093
   1094	spin_lock(&drvdata->spinlock);
   1095	idx = config->addr_idx;
   1096
   1097	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
   1098	      config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
   1099		spin_unlock(&drvdata->spinlock);
   1100		return -EPERM;
   1101	}
   1102
   1103	val = (unsigned long)config->addr_val[idx];
   1104	spin_unlock(&drvdata->spinlock);
   1105	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1106}
   1107
   1108static ssize_t addr_stop_store(struct device *dev,
   1109			       struct device_attribute *attr,
   1110			       const char *buf, size_t size)
   1111{
   1112	u8 idx;
   1113	unsigned long val;
   1114	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1115	struct etmv4_config *config = &drvdata->config;
   1116
   1117	if (kstrtoul(buf, 16, &val))
   1118		return -EINVAL;
   1119
   1120	spin_lock(&drvdata->spinlock);
   1121	idx = config->addr_idx;
   1122	if (!drvdata->nr_addr_cmp) {
   1123		spin_unlock(&drvdata->spinlock);
   1124		return -EINVAL;
   1125	}
   1126	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
   1127	       config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
   1128		spin_unlock(&drvdata->spinlock);
   1129		return -EPERM;
   1130	}
   1131
   1132	config->addr_val[idx] = (u64)val;
   1133	config->addr_type[idx] = ETM_ADDR_TYPE_STOP;
   1134	config->vissctlr |= BIT(idx + 16);
   1135	spin_unlock(&drvdata->spinlock);
   1136	return size;
   1137}
   1138static DEVICE_ATTR_RW(addr_stop);
   1139
   1140static ssize_t addr_ctxtype_show(struct device *dev,
   1141				 struct device_attribute *attr,
   1142				 char *buf)
   1143{
   1144	ssize_t len;
   1145	u8 idx, val;
   1146	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1147	struct etmv4_config *config = &drvdata->config;
   1148
   1149	spin_lock(&drvdata->spinlock);
   1150	idx = config->addr_idx;
   1151	/* CONTEXTTYPE, bits[3:2] */
   1152	val = FIELD_GET(TRCACATRn_CONTEXTTYPE_MASK, config->addr_acc[idx]);
   1153	len = scnprintf(buf, PAGE_SIZE, "%s\n", val == ETM_CTX_NONE ? "none" :
   1154			(val == ETM_CTX_CTXID ? "ctxid" :
   1155			(val == ETM_CTX_VMID ? "vmid" : "all")));
   1156	spin_unlock(&drvdata->spinlock);
   1157	return len;
   1158}
   1159
   1160static ssize_t addr_ctxtype_store(struct device *dev,
   1161				  struct device_attribute *attr,
   1162				  const char *buf, size_t size)
   1163{
   1164	u8 idx;
   1165	char str[10] = "";
   1166	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1167	struct etmv4_config *config = &drvdata->config;
   1168
   1169	if (strlen(buf) >= 10)
   1170		return -EINVAL;
   1171	if (sscanf(buf, "%s", str) != 1)
   1172		return -EINVAL;
   1173
   1174	spin_lock(&drvdata->spinlock);
   1175	idx = config->addr_idx;
   1176	if (!strcmp(str, "none"))
   1177		/* start by clearing context type bits */
   1178		config->addr_acc[idx] &= ~TRCACATRn_CONTEXTTYPE_MASK;
   1179	else if (!strcmp(str, "ctxid")) {
   1180		/* 0b01 The trace unit performs a Context ID */
   1181		if (drvdata->numcidc) {
   1182			config->addr_acc[idx] |= TRCACATRn_CONTEXTTYPE_CTXID;
   1183			config->addr_acc[idx] &= ~TRCACATRn_CONTEXTTYPE_VMID;
   1184		}
   1185	} else if (!strcmp(str, "vmid")) {
   1186		/* 0b10 The trace unit performs a VMID */
   1187		if (drvdata->numvmidc) {
   1188			config->addr_acc[idx] &= ~TRCACATRn_CONTEXTTYPE_CTXID;
   1189			config->addr_acc[idx] |= TRCACATRn_CONTEXTTYPE_VMID;
   1190		}
   1191	} else if (!strcmp(str, "all")) {
   1192		/*
   1193		 * 0b11 The trace unit performs a Context ID
   1194		 * comparison and a VMID
   1195		 */
   1196		if (drvdata->numcidc)
   1197			config->addr_acc[idx] |= TRCACATRn_CONTEXTTYPE_CTXID;
   1198		if (drvdata->numvmidc)
   1199			config->addr_acc[idx] |= TRCACATRn_CONTEXTTYPE_VMID;
   1200	}
   1201	spin_unlock(&drvdata->spinlock);
   1202	return size;
   1203}
   1204static DEVICE_ATTR_RW(addr_ctxtype);
   1205
   1206static ssize_t addr_context_show(struct device *dev,
   1207				 struct device_attribute *attr,
   1208				 char *buf)
   1209{
   1210	u8 idx;
   1211	unsigned long val;
   1212	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1213	struct etmv4_config *config = &drvdata->config;
   1214
   1215	spin_lock(&drvdata->spinlock);
   1216	idx = config->addr_idx;
   1217	/* context ID comparator bits[6:4] */
   1218	val = FIELD_GET(TRCACATRn_CONTEXT_MASK, config->addr_acc[idx]);
   1219	spin_unlock(&drvdata->spinlock);
   1220	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1221}
   1222
   1223static ssize_t addr_context_store(struct device *dev,
   1224				  struct device_attribute *attr,
   1225				  const char *buf, size_t size)
   1226{
   1227	u8 idx;
   1228	unsigned long val;
   1229	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1230	struct etmv4_config *config = &drvdata->config;
   1231
   1232	if (kstrtoul(buf, 16, &val))
   1233		return -EINVAL;
   1234	if ((drvdata->numcidc <= 1) && (drvdata->numvmidc <= 1))
   1235		return -EINVAL;
   1236	if (val >=  (drvdata->numcidc >= drvdata->numvmidc ?
   1237		     drvdata->numcidc : drvdata->numvmidc))
   1238		return -EINVAL;
   1239
   1240	spin_lock(&drvdata->spinlock);
   1241	idx = config->addr_idx;
   1242	/* clear context ID comparator bits[6:4] */
   1243	config->addr_acc[idx] &= ~TRCACATRn_CONTEXT_MASK;
   1244	config->addr_acc[idx] |= val << __bf_shf(TRCACATRn_CONTEXT_MASK);
   1245	spin_unlock(&drvdata->spinlock);
   1246	return size;
   1247}
   1248static DEVICE_ATTR_RW(addr_context);
   1249
   1250static ssize_t addr_exlevel_s_ns_show(struct device *dev,
   1251				      struct device_attribute *attr,
   1252				      char *buf)
   1253{
   1254	u8 idx;
   1255	unsigned long val;
   1256	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1257	struct etmv4_config *config = &drvdata->config;
   1258
   1259	spin_lock(&drvdata->spinlock);
   1260	idx = config->addr_idx;
   1261	val = FIELD_GET(TRCACATRn_EXLEVEL_MASK, config->addr_acc[idx]);
   1262	spin_unlock(&drvdata->spinlock);
   1263	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1264}
   1265
   1266static ssize_t addr_exlevel_s_ns_store(struct device *dev,
   1267				       struct device_attribute *attr,
   1268				       const char *buf, size_t size)
   1269{
   1270	u8 idx;
   1271	unsigned long val;
   1272	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1273	struct etmv4_config *config = &drvdata->config;
   1274
   1275	if (kstrtoul(buf, 0, &val))
   1276		return -EINVAL;
   1277
   1278	if (val & ~(TRCACATRn_EXLEVEL_MASK >> __bf_shf(TRCACATRn_EXLEVEL_MASK)))
   1279		return -EINVAL;
   1280
   1281	spin_lock(&drvdata->spinlock);
   1282	idx = config->addr_idx;
   1283	/* clear Exlevel_ns & Exlevel_s bits[14:12, 11:8], bit[15] is res0 */
   1284	config->addr_acc[idx] &= ~TRCACATRn_EXLEVEL_MASK;
   1285	config->addr_acc[idx] |= val << __bf_shf(TRCACATRn_EXLEVEL_MASK);
   1286	spin_unlock(&drvdata->spinlock);
   1287	return size;
   1288}
   1289static DEVICE_ATTR_RW(addr_exlevel_s_ns);
   1290
   1291static const char * const addr_type_names[] = {
   1292	"unused",
   1293	"single",
   1294	"range",
   1295	"start",
   1296	"stop"
   1297};
   1298
   1299static ssize_t addr_cmp_view_show(struct device *dev,
   1300				  struct device_attribute *attr, char *buf)
   1301{
   1302	u8 idx, addr_type;
   1303	unsigned long addr_v, addr_v2, addr_ctrl;
   1304	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1305	struct etmv4_config *config = &drvdata->config;
   1306	int size = 0;
   1307	bool exclude = false;
   1308
   1309	spin_lock(&drvdata->spinlock);
   1310	idx = config->addr_idx;
   1311	addr_v = config->addr_val[idx];
   1312	addr_ctrl = config->addr_acc[idx];
   1313	addr_type = config->addr_type[idx];
   1314	if (addr_type == ETM_ADDR_TYPE_RANGE) {
   1315		if (idx & 0x1) {
   1316			idx -= 1;
   1317			addr_v2 = addr_v;
   1318			addr_v = config->addr_val[idx];
   1319		} else {
   1320			addr_v2 = config->addr_val[idx + 1];
   1321		}
   1322		exclude = config->viiectlr & BIT(idx / 2 + 16);
   1323	}
   1324	spin_unlock(&drvdata->spinlock);
   1325	if (addr_type) {
   1326		size = scnprintf(buf, PAGE_SIZE, "addr_cmp[%i] %s %#lx", idx,
   1327				 addr_type_names[addr_type], addr_v);
   1328		if (addr_type == ETM_ADDR_TYPE_RANGE) {
   1329			size += scnprintf(buf + size, PAGE_SIZE - size,
   1330					  " %#lx %s", addr_v2,
   1331					  exclude ? "exclude" : "include");
   1332		}
   1333		size += scnprintf(buf + size, PAGE_SIZE - size,
   1334				  " ctrl(%#lx)\n", addr_ctrl);
   1335	} else {
   1336		size = scnprintf(buf, PAGE_SIZE, "addr_cmp[%i] unused\n", idx);
   1337	}
   1338	return size;
   1339}
   1340static DEVICE_ATTR_RO(addr_cmp_view);
   1341
   1342static ssize_t vinst_pe_cmp_start_stop_show(struct device *dev,
   1343					    struct device_attribute *attr,
   1344					    char *buf)
   1345{
   1346	unsigned long val;
   1347	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1348	struct etmv4_config *config = &drvdata->config;
   1349
   1350	if (!drvdata->nr_pe_cmp)
   1351		return -EINVAL;
   1352	val = config->vipcssctlr;
   1353	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1354}
   1355static ssize_t vinst_pe_cmp_start_stop_store(struct device *dev,
   1356					     struct device_attribute *attr,
   1357					     const char *buf, size_t size)
   1358{
   1359	unsigned long val;
   1360	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1361	struct etmv4_config *config = &drvdata->config;
   1362
   1363	if (kstrtoul(buf, 16, &val))
   1364		return -EINVAL;
   1365	if (!drvdata->nr_pe_cmp)
   1366		return -EINVAL;
   1367
   1368	spin_lock(&drvdata->spinlock);
   1369	config->vipcssctlr = val;
   1370	spin_unlock(&drvdata->spinlock);
   1371	return size;
   1372}
   1373static DEVICE_ATTR_RW(vinst_pe_cmp_start_stop);
   1374
   1375static ssize_t seq_idx_show(struct device *dev,
   1376			    struct device_attribute *attr,
   1377			    char *buf)
   1378{
   1379	unsigned long val;
   1380	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1381	struct etmv4_config *config = &drvdata->config;
   1382
   1383	val = config->seq_idx;
   1384	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1385}
   1386
   1387static ssize_t seq_idx_store(struct device *dev,
   1388			     struct device_attribute *attr,
   1389			     const char *buf, size_t size)
   1390{
   1391	unsigned long val;
   1392	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1393	struct etmv4_config *config = &drvdata->config;
   1394
   1395	if (kstrtoul(buf, 16, &val))
   1396		return -EINVAL;
   1397	if (val >= drvdata->nrseqstate - 1)
   1398		return -EINVAL;
   1399
   1400	/*
   1401	 * Use spinlock to ensure index doesn't change while it gets
   1402	 * dereferenced multiple times within a spinlock block elsewhere.
   1403	 */
   1404	spin_lock(&drvdata->spinlock);
   1405	config->seq_idx = val;
   1406	spin_unlock(&drvdata->spinlock);
   1407	return size;
   1408}
   1409static DEVICE_ATTR_RW(seq_idx);
   1410
   1411static ssize_t seq_state_show(struct device *dev,
   1412			      struct device_attribute *attr,
   1413			      char *buf)
   1414{
   1415	unsigned long val;
   1416	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1417	struct etmv4_config *config = &drvdata->config;
   1418
   1419	val = config->seq_state;
   1420	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1421}
   1422
   1423static ssize_t seq_state_store(struct device *dev,
   1424			       struct device_attribute *attr,
   1425			       const char *buf, size_t size)
   1426{
   1427	unsigned long val;
   1428	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1429	struct etmv4_config *config = &drvdata->config;
   1430
   1431	if (kstrtoul(buf, 16, &val))
   1432		return -EINVAL;
   1433	if (val >= drvdata->nrseqstate)
   1434		return -EINVAL;
   1435
   1436	config->seq_state = val;
   1437	return size;
   1438}
   1439static DEVICE_ATTR_RW(seq_state);
   1440
   1441static ssize_t seq_event_show(struct device *dev,
   1442			      struct device_attribute *attr,
   1443			      char *buf)
   1444{
   1445	u8 idx;
   1446	unsigned long val;
   1447	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1448	struct etmv4_config *config = &drvdata->config;
   1449
   1450	spin_lock(&drvdata->spinlock);
   1451	idx = config->seq_idx;
   1452	val = config->seq_ctrl[idx];
   1453	spin_unlock(&drvdata->spinlock);
   1454	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1455}
   1456
   1457static ssize_t seq_event_store(struct device *dev,
   1458			       struct device_attribute *attr,
   1459			       const char *buf, size_t size)
   1460{
   1461	u8 idx;
   1462	unsigned long val;
   1463	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1464	struct etmv4_config *config = &drvdata->config;
   1465
   1466	if (kstrtoul(buf, 16, &val))
   1467		return -EINVAL;
   1468
   1469	spin_lock(&drvdata->spinlock);
   1470	idx = config->seq_idx;
   1471	/* Seq control has two masks B[15:8] F[7:0] */
   1472	config->seq_ctrl[idx] = val & 0xFFFF;
   1473	spin_unlock(&drvdata->spinlock);
   1474	return size;
   1475}
   1476static DEVICE_ATTR_RW(seq_event);
   1477
   1478static ssize_t seq_reset_event_show(struct device *dev,
   1479				    struct device_attribute *attr,
   1480				    char *buf)
   1481{
   1482	unsigned long val;
   1483	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1484	struct etmv4_config *config = &drvdata->config;
   1485
   1486	val = config->seq_rst;
   1487	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1488}
   1489
   1490static ssize_t seq_reset_event_store(struct device *dev,
   1491				     struct device_attribute *attr,
   1492				     const char *buf, size_t size)
   1493{
   1494	unsigned long val;
   1495	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1496	struct etmv4_config *config = &drvdata->config;
   1497
   1498	if (kstrtoul(buf, 16, &val))
   1499		return -EINVAL;
   1500	if (!(drvdata->nrseqstate))
   1501		return -EINVAL;
   1502
   1503	config->seq_rst = val & ETMv4_EVENT_MASK;
   1504	return size;
   1505}
   1506static DEVICE_ATTR_RW(seq_reset_event);
   1507
   1508static ssize_t cntr_idx_show(struct device *dev,
   1509			     struct device_attribute *attr,
   1510			     char *buf)
   1511{
   1512	unsigned long val;
   1513	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1514	struct etmv4_config *config = &drvdata->config;
   1515
   1516	val = config->cntr_idx;
   1517	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1518}
   1519
   1520static ssize_t cntr_idx_store(struct device *dev,
   1521			      struct device_attribute *attr,
   1522			      const char *buf, size_t size)
   1523{
   1524	unsigned long val;
   1525	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1526	struct etmv4_config *config = &drvdata->config;
   1527
   1528	if (kstrtoul(buf, 16, &val))
   1529		return -EINVAL;
   1530	if (val >= drvdata->nr_cntr)
   1531		return -EINVAL;
   1532
   1533	/*
   1534	 * Use spinlock to ensure index doesn't change while it gets
   1535	 * dereferenced multiple times within a spinlock block elsewhere.
   1536	 */
   1537	spin_lock(&drvdata->spinlock);
   1538	config->cntr_idx = val;
   1539	spin_unlock(&drvdata->spinlock);
   1540	return size;
   1541}
   1542static DEVICE_ATTR_RW(cntr_idx);
   1543
   1544static ssize_t cntrldvr_show(struct device *dev,
   1545			     struct device_attribute *attr,
   1546			     char *buf)
   1547{
   1548	u8 idx;
   1549	unsigned long val;
   1550	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1551	struct etmv4_config *config = &drvdata->config;
   1552
   1553	spin_lock(&drvdata->spinlock);
   1554	idx = config->cntr_idx;
   1555	val = config->cntrldvr[idx];
   1556	spin_unlock(&drvdata->spinlock);
   1557	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1558}
   1559
   1560static ssize_t cntrldvr_store(struct device *dev,
   1561			      struct device_attribute *attr,
   1562			      const char *buf, size_t size)
   1563{
   1564	u8 idx;
   1565	unsigned long val;
   1566	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1567	struct etmv4_config *config = &drvdata->config;
   1568
   1569	if (kstrtoul(buf, 16, &val))
   1570		return -EINVAL;
   1571	if (val > ETM_CNTR_MAX_VAL)
   1572		return -EINVAL;
   1573
   1574	spin_lock(&drvdata->spinlock);
   1575	idx = config->cntr_idx;
   1576	config->cntrldvr[idx] = val;
   1577	spin_unlock(&drvdata->spinlock);
   1578	return size;
   1579}
   1580static DEVICE_ATTR_RW(cntrldvr);
   1581
   1582static ssize_t cntr_val_show(struct device *dev,
   1583			     struct device_attribute *attr,
   1584			     char *buf)
   1585{
   1586	u8 idx;
   1587	unsigned long val;
   1588	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1589	struct etmv4_config *config = &drvdata->config;
   1590
   1591	spin_lock(&drvdata->spinlock);
   1592	idx = config->cntr_idx;
   1593	val = config->cntr_val[idx];
   1594	spin_unlock(&drvdata->spinlock);
   1595	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1596}
   1597
   1598static ssize_t cntr_val_store(struct device *dev,
   1599			      struct device_attribute *attr,
   1600			      const char *buf, size_t size)
   1601{
   1602	u8 idx;
   1603	unsigned long val;
   1604	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1605	struct etmv4_config *config = &drvdata->config;
   1606
   1607	if (kstrtoul(buf, 16, &val))
   1608		return -EINVAL;
   1609	if (val > ETM_CNTR_MAX_VAL)
   1610		return -EINVAL;
   1611
   1612	spin_lock(&drvdata->spinlock);
   1613	idx = config->cntr_idx;
   1614	config->cntr_val[idx] = val;
   1615	spin_unlock(&drvdata->spinlock);
   1616	return size;
   1617}
   1618static DEVICE_ATTR_RW(cntr_val);
   1619
   1620static ssize_t cntr_ctrl_show(struct device *dev,
   1621			      struct device_attribute *attr,
   1622			      char *buf)
   1623{
   1624	u8 idx;
   1625	unsigned long val;
   1626	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1627	struct etmv4_config *config = &drvdata->config;
   1628
   1629	spin_lock(&drvdata->spinlock);
   1630	idx = config->cntr_idx;
   1631	val = config->cntr_ctrl[idx];
   1632	spin_unlock(&drvdata->spinlock);
   1633	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1634}
   1635
   1636static ssize_t cntr_ctrl_store(struct device *dev,
   1637			       struct device_attribute *attr,
   1638			       const char *buf, size_t size)
   1639{
   1640	u8 idx;
   1641	unsigned long val;
   1642	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1643	struct etmv4_config *config = &drvdata->config;
   1644
   1645	if (kstrtoul(buf, 16, &val))
   1646		return -EINVAL;
   1647
   1648	spin_lock(&drvdata->spinlock);
   1649	idx = config->cntr_idx;
   1650	config->cntr_ctrl[idx] = val;
   1651	spin_unlock(&drvdata->spinlock);
   1652	return size;
   1653}
   1654static DEVICE_ATTR_RW(cntr_ctrl);
   1655
   1656static ssize_t res_idx_show(struct device *dev,
   1657			    struct device_attribute *attr,
   1658			    char *buf)
   1659{
   1660	unsigned long val;
   1661	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1662	struct etmv4_config *config = &drvdata->config;
   1663
   1664	val = config->res_idx;
   1665	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1666}
   1667
   1668static ssize_t res_idx_store(struct device *dev,
   1669			     struct device_attribute *attr,
   1670			     const char *buf, size_t size)
   1671{
   1672	unsigned long val;
   1673	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1674	struct etmv4_config *config = &drvdata->config;
   1675
   1676	if (kstrtoul(buf, 16, &val))
   1677		return -EINVAL;
   1678	/*
   1679	 * Resource selector pair 0 is always implemented and reserved,
   1680	 * namely an idx with 0 and 1 is illegal.
   1681	 */
   1682	if ((val < 2) || (val >= 2 * drvdata->nr_resource))
   1683		return -EINVAL;
   1684
   1685	/*
   1686	 * Use spinlock to ensure index doesn't change while it gets
   1687	 * dereferenced multiple times within a spinlock block elsewhere.
   1688	 */
   1689	spin_lock(&drvdata->spinlock);
   1690	config->res_idx = val;
   1691	spin_unlock(&drvdata->spinlock);
   1692	return size;
   1693}
   1694static DEVICE_ATTR_RW(res_idx);
   1695
   1696static ssize_t res_ctrl_show(struct device *dev,
   1697			     struct device_attribute *attr,
   1698			     char *buf)
   1699{
   1700	u8 idx;
   1701	unsigned long val;
   1702	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1703	struct etmv4_config *config = &drvdata->config;
   1704
   1705	spin_lock(&drvdata->spinlock);
   1706	idx = config->res_idx;
   1707	val = config->res_ctrl[idx];
   1708	spin_unlock(&drvdata->spinlock);
   1709	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1710}
   1711
   1712static ssize_t res_ctrl_store(struct device *dev,
   1713			      struct device_attribute *attr,
   1714			      const char *buf, size_t size)
   1715{
   1716	u8 idx;
   1717	unsigned long val;
   1718	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1719	struct etmv4_config *config = &drvdata->config;
   1720
   1721	if (kstrtoul(buf, 16, &val))
   1722		return -EINVAL;
   1723
   1724	spin_lock(&drvdata->spinlock);
   1725	idx = config->res_idx;
   1726	/* For odd idx pair inversal bit is RES0 */
   1727	if (idx % 2 != 0)
   1728		/* PAIRINV, bit[21] */
   1729		val &= ~TRCRSCTLRn_PAIRINV;
   1730	config->res_ctrl[idx] = val & (TRCRSCTLRn_PAIRINV |
   1731				       TRCRSCTLRn_INV |
   1732				       TRCRSCTLRn_GROUP_MASK |
   1733				       TRCRSCTLRn_SELECT_MASK);
   1734	spin_unlock(&drvdata->spinlock);
   1735	return size;
   1736}
   1737static DEVICE_ATTR_RW(res_ctrl);
   1738
   1739static ssize_t sshot_idx_show(struct device *dev,
   1740			      struct device_attribute *attr, char *buf)
   1741{
   1742	unsigned long val;
   1743	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1744	struct etmv4_config *config = &drvdata->config;
   1745
   1746	val = config->ss_idx;
   1747	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1748}
   1749
   1750static ssize_t sshot_idx_store(struct device *dev,
   1751			       struct device_attribute *attr,
   1752			       const char *buf, size_t size)
   1753{
   1754	unsigned long val;
   1755	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1756	struct etmv4_config *config = &drvdata->config;
   1757
   1758	if (kstrtoul(buf, 16, &val))
   1759		return -EINVAL;
   1760	if (val >= drvdata->nr_ss_cmp)
   1761		return -EINVAL;
   1762
   1763	spin_lock(&drvdata->spinlock);
   1764	config->ss_idx = val;
   1765	spin_unlock(&drvdata->spinlock);
   1766	return size;
   1767}
   1768static DEVICE_ATTR_RW(sshot_idx);
   1769
   1770static ssize_t sshot_ctrl_show(struct device *dev,
   1771			       struct device_attribute *attr,
   1772			       char *buf)
   1773{
   1774	unsigned long val;
   1775	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1776	struct etmv4_config *config = &drvdata->config;
   1777
   1778	spin_lock(&drvdata->spinlock);
   1779	val = config->ss_ctrl[config->ss_idx];
   1780	spin_unlock(&drvdata->spinlock);
   1781	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1782}
   1783
   1784static ssize_t sshot_ctrl_store(struct device *dev,
   1785				struct device_attribute *attr,
   1786				const char *buf, size_t size)
   1787{
   1788	u8 idx;
   1789	unsigned long val;
   1790	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1791	struct etmv4_config *config = &drvdata->config;
   1792
   1793	if (kstrtoul(buf, 16, &val))
   1794		return -EINVAL;
   1795
   1796	spin_lock(&drvdata->spinlock);
   1797	idx = config->ss_idx;
   1798	config->ss_ctrl[idx] = FIELD_PREP(TRCSSCCRn_SAC_ARC_RST_MASK, val);
   1799	/* must clear bit 31 in related status register on programming */
   1800	config->ss_status[idx] &= ~TRCSSCSRn_STATUS;
   1801	spin_unlock(&drvdata->spinlock);
   1802	return size;
   1803}
   1804static DEVICE_ATTR_RW(sshot_ctrl);
   1805
   1806static ssize_t sshot_status_show(struct device *dev,
   1807				 struct device_attribute *attr, char *buf)
   1808{
   1809	unsigned long val;
   1810	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1811	struct etmv4_config *config = &drvdata->config;
   1812
   1813	spin_lock(&drvdata->spinlock);
   1814	val = config->ss_status[config->ss_idx];
   1815	spin_unlock(&drvdata->spinlock);
   1816	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1817}
   1818static DEVICE_ATTR_RO(sshot_status);
   1819
   1820static ssize_t sshot_pe_ctrl_show(struct device *dev,
   1821				  struct device_attribute *attr,
   1822				  char *buf)
   1823{
   1824	unsigned long val;
   1825	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1826	struct etmv4_config *config = &drvdata->config;
   1827
   1828	spin_lock(&drvdata->spinlock);
   1829	val = config->ss_pe_cmp[config->ss_idx];
   1830	spin_unlock(&drvdata->spinlock);
   1831	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1832}
   1833
   1834static ssize_t sshot_pe_ctrl_store(struct device *dev,
   1835				   struct device_attribute *attr,
   1836				   const char *buf, size_t size)
   1837{
   1838	u8 idx;
   1839	unsigned long val;
   1840	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1841	struct etmv4_config *config = &drvdata->config;
   1842
   1843	if (kstrtoul(buf, 16, &val))
   1844		return -EINVAL;
   1845
   1846	spin_lock(&drvdata->spinlock);
   1847	idx = config->ss_idx;
   1848	config->ss_pe_cmp[idx] = FIELD_PREP(TRCSSPCICRn_PC_MASK, val);
   1849	/* must clear bit 31 in related status register on programming */
   1850	config->ss_status[idx] &= ~TRCSSCSRn_STATUS;
   1851	spin_unlock(&drvdata->spinlock);
   1852	return size;
   1853}
   1854static DEVICE_ATTR_RW(sshot_pe_ctrl);
   1855
   1856static ssize_t ctxid_idx_show(struct device *dev,
   1857			      struct device_attribute *attr,
   1858			      char *buf)
   1859{
   1860	unsigned long val;
   1861	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1862	struct etmv4_config *config = &drvdata->config;
   1863
   1864	val = config->ctxid_idx;
   1865	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1866}
   1867
   1868static ssize_t ctxid_idx_store(struct device *dev,
   1869			       struct device_attribute *attr,
   1870			       const char *buf, size_t size)
   1871{
   1872	unsigned long val;
   1873	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1874	struct etmv4_config *config = &drvdata->config;
   1875
   1876	if (kstrtoul(buf, 16, &val))
   1877		return -EINVAL;
   1878	if (val >= drvdata->numcidc)
   1879		return -EINVAL;
   1880
   1881	/*
   1882	 * Use spinlock to ensure index doesn't change while it gets
   1883	 * dereferenced multiple times within a spinlock block elsewhere.
   1884	 */
   1885	spin_lock(&drvdata->spinlock);
   1886	config->ctxid_idx = val;
   1887	spin_unlock(&drvdata->spinlock);
   1888	return size;
   1889}
   1890static DEVICE_ATTR_RW(ctxid_idx);
   1891
   1892static ssize_t ctxid_pid_show(struct device *dev,
   1893			      struct device_attribute *attr,
   1894			      char *buf)
   1895{
   1896	u8 idx;
   1897	unsigned long val;
   1898	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1899	struct etmv4_config *config = &drvdata->config;
   1900
   1901	/*
   1902	 * Don't use contextID tracing if coming from a PID namespace.  See
   1903	 * comment in ctxid_pid_store().
   1904	 */
   1905	if (task_active_pid_ns(current) != &init_pid_ns)
   1906		return -EINVAL;
   1907
   1908	spin_lock(&drvdata->spinlock);
   1909	idx = config->ctxid_idx;
   1910	val = (unsigned long)config->ctxid_pid[idx];
   1911	spin_unlock(&drvdata->spinlock);
   1912	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   1913}
   1914
   1915static ssize_t ctxid_pid_store(struct device *dev,
   1916			       struct device_attribute *attr,
   1917			       const char *buf, size_t size)
   1918{
   1919	u8 idx;
   1920	unsigned long pid;
   1921	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1922	struct etmv4_config *config = &drvdata->config;
   1923
   1924	/*
   1925	 * When contextID tracing is enabled the tracers will insert the
   1926	 * value found in the contextID register in the trace stream.  But if
   1927	 * a process is in a namespace the PID of that process as seen from the
   1928	 * namespace won't be what the kernel sees, something that makes the
   1929	 * feature confusing and can potentially leak kernel only information.
   1930	 * As such refuse to use the feature if @current is not in the initial
   1931	 * PID namespace.
   1932	 */
   1933	if (task_active_pid_ns(current) != &init_pid_ns)
   1934		return -EINVAL;
   1935
   1936	/*
   1937	 * only implemented when ctxid tracing is enabled, i.e. at least one
   1938	 * ctxid comparator is implemented and ctxid is greater than 0 bits
   1939	 * in length
   1940	 */
   1941	if (!drvdata->ctxid_size || !drvdata->numcidc)
   1942		return -EINVAL;
   1943	if (kstrtoul(buf, 16, &pid))
   1944		return -EINVAL;
   1945
   1946	spin_lock(&drvdata->spinlock);
   1947	idx = config->ctxid_idx;
   1948	config->ctxid_pid[idx] = (u64)pid;
   1949	spin_unlock(&drvdata->spinlock);
   1950	return size;
   1951}
   1952static DEVICE_ATTR_RW(ctxid_pid);
   1953
   1954static ssize_t ctxid_masks_show(struct device *dev,
   1955				struct device_attribute *attr,
   1956				char *buf)
   1957{
   1958	unsigned long val1, val2;
   1959	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1960	struct etmv4_config *config = &drvdata->config;
   1961
   1962	/*
   1963	 * Don't use contextID tracing if coming from a PID namespace.  See
   1964	 * comment in ctxid_pid_store().
   1965	 */
   1966	if (task_active_pid_ns(current) != &init_pid_ns)
   1967		return -EINVAL;
   1968
   1969	spin_lock(&drvdata->spinlock);
   1970	val1 = config->ctxid_mask0;
   1971	val2 = config->ctxid_mask1;
   1972	spin_unlock(&drvdata->spinlock);
   1973	return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
   1974}
   1975
   1976static ssize_t ctxid_masks_store(struct device *dev,
   1977				struct device_attribute *attr,
   1978				const char *buf, size_t size)
   1979{
   1980	u8 i, j, maskbyte;
   1981	unsigned long val1, val2, mask;
   1982	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1983	struct etmv4_config *config = &drvdata->config;
   1984	int nr_inputs;
   1985
   1986	/*
   1987	 * Don't use contextID tracing if coming from a PID namespace.  See
   1988	 * comment in ctxid_pid_store().
   1989	 */
   1990	if (task_active_pid_ns(current) != &init_pid_ns)
   1991		return -EINVAL;
   1992
   1993	/*
   1994	 * only implemented when ctxid tracing is enabled, i.e. at least one
   1995	 * ctxid comparator is implemented and ctxid is greater than 0 bits
   1996	 * in length
   1997	 */
   1998	if (!drvdata->ctxid_size || !drvdata->numcidc)
   1999		return -EINVAL;
   2000	/* one mask if <= 4 comparators, two for up to 8 */
   2001	nr_inputs = sscanf(buf, "%lx %lx", &val1, &val2);
   2002	if ((drvdata->numcidc > 4) && (nr_inputs != 2))
   2003		return -EINVAL;
   2004
   2005	spin_lock(&drvdata->spinlock);
   2006	/*
   2007	 * each byte[0..3] controls mask value applied to ctxid
   2008	 * comparator[0..3]
   2009	 */
   2010	switch (drvdata->numcidc) {
   2011	case 0x1:
   2012		/* COMP0, bits[7:0] */
   2013		config->ctxid_mask0 = val1 & 0xFF;
   2014		break;
   2015	case 0x2:
   2016		/* COMP1, bits[15:8] */
   2017		config->ctxid_mask0 = val1 & 0xFFFF;
   2018		break;
   2019	case 0x3:
   2020		/* COMP2, bits[23:16] */
   2021		config->ctxid_mask0 = val1 & 0xFFFFFF;
   2022		break;
   2023	case 0x4:
   2024		 /* COMP3, bits[31:24] */
   2025		config->ctxid_mask0 = val1;
   2026		break;
   2027	case 0x5:
   2028		/* COMP4, bits[7:0] */
   2029		config->ctxid_mask0 = val1;
   2030		config->ctxid_mask1 = val2 & 0xFF;
   2031		break;
   2032	case 0x6:
   2033		/* COMP5, bits[15:8] */
   2034		config->ctxid_mask0 = val1;
   2035		config->ctxid_mask1 = val2 & 0xFFFF;
   2036		break;
   2037	case 0x7:
   2038		/* COMP6, bits[23:16] */
   2039		config->ctxid_mask0 = val1;
   2040		config->ctxid_mask1 = val2 & 0xFFFFFF;
   2041		break;
   2042	case 0x8:
   2043		/* COMP7, bits[31:24] */
   2044		config->ctxid_mask0 = val1;
   2045		config->ctxid_mask1 = val2;
   2046		break;
   2047	default:
   2048		break;
   2049	}
   2050	/*
   2051	 * If software sets a mask bit to 1, it must program relevant byte
   2052	 * of ctxid comparator value 0x0, otherwise behavior is unpredictable.
   2053	 * For example, if bit[3] of ctxid_mask0 is 1, we must clear bits[31:24]
   2054	 * of ctxid comparator0 value (corresponding to byte 0) register.
   2055	 */
   2056	mask = config->ctxid_mask0;
   2057	for (i = 0; i < drvdata->numcidc; i++) {
   2058		/* mask value of corresponding ctxid comparator */
   2059		maskbyte = mask & ETMv4_EVENT_MASK;
   2060		/*
   2061		 * each bit corresponds to a byte of respective ctxid comparator
   2062		 * value register
   2063		 */
   2064		for (j = 0; j < 8; j++) {
   2065			if (maskbyte & 1)
   2066				config->ctxid_pid[i] &= ~(0xFFUL << (j * 8));
   2067			maskbyte >>= 1;
   2068		}
   2069		/* Select the next ctxid comparator mask value */
   2070		if (i == 3)
   2071			/* ctxid comparators[4-7] */
   2072			mask = config->ctxid_mask1;
   2073		else
   2074			mask >>= 0x8;
   2075	}
   2076
   2077	spin_unlock(&drvdata->spinlock);
   2078	return size;
   2079}
   2080static DEVICE_ATTR_RW(ctxid_masks);
   2081
   2082static ssize_t vmid_idx_show(struct device *dev,
   2083			     struct device_attribute *attr,
   2084			     char *buf)
   2085{
   2086	unsigned long val;
   2087	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   2088	struct etmv4_config *config = &drvdata->config;
   2089
   2090	val = config->vmid_idx;
   2091	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   2092}
   2093
   2094static ssize_t vmid_idx_store(struct device *dev,
   2095			      struct device_attribute *attr,
   2096			      const char *buf, size_t size)
   2097{
   2098	unsigned long val;
   2099	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   2100	struct etmv4_config *config = &drvdata->config;
   2101
   2102	if (kstrtoul(buf, 16, &val))
   2103		return -EINVAL;
   2104	if (val >= drvdata->numvmidc)
   2105		return -EINVAL;
   2106
   2107	/*
   2108	 * Use spinlock to ensure index doesn't change while it gets
   2109	 * dereferenced multiple times within a spinlock block elsewhere.
   2110	 */
   2111	spin_lock(&drvdata->spinlock);
   2112	config->vmid_idx = val;
   2113	spin_unlock(&drvdata->spinlock);
   2114	return size;
   2115}
   2116static DEVICE_ATTR_RW(vmid_idx);
   2117
   2118static ssize_t vmid_val_show(struct device *dev,
   2119			     struct device_attribute *attr,
   2120			     char *buf)
   2121{
   2122	unsigned long val;
   2123	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   2124	struct etmv4_config *config = &drvdata->config;
   2125
   2126	/*
   2127	 * Don't use virtual contextID tracing if coming from a PID namespace.
   2128	 * See comment in ctxid_pid_store().
   2129	 */
   2130	if (!task_is_in_init_pid_ns(current))
   2131		return -EINVAL;
   2132
   2133	spin_lock(&drvdata->spinlock);
   2134	val = (unsigned long)config->vmid_val[config->vmid_idx];
   2135	spin_unlock(&drvdata->spinlock);
   2136	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
   2137}
   2138
   2139static ssize_t vmid_val_store(struct device *dev,
   2140			      struct device_attribute *attr,
   2141			      const char *buf, size_t size)
   2142{
   2143	unsigned long val;
   2144	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   2145	struct etmv4_config *config = &drvdata->config;
   2146
   2147	/*
   2148	 * Don't use virtual contextID tracing if coming from a PID namespace.
   2149	 * See comment in ctxid_pid_store().
   2150	 */
   2151	if (!task_is_in_init_pid_ns(current))
   2152		return -EINVAL;
   2153
   2154	/*
   2155	 * only implemented when vmid tracing is enabled, i.e. at least one
   2156	 * vmid comparator is implemented and at least 8 bit vmid size
   2157	 */
   2158	if (!drvdata->vmid_size || !drvdata->numvmidc)
   2159		return -EINVAL;
   2160	if (kstrtoul(buf, 16, &val))
   2161		return -EINVAL;
   2162
   2163	spin_lock(&drvdata->spinlock);
   2164	config->vmid_val[config->vmid_idx] = (u64)val;
   2165	spin_unlock(&drvdata->spinlock);
   2166	return size;
   2167}
   2168static DEVICE_ATTR_RW(vmid_val);
   2169
   2170static ssize_t vmid_masks_show(struct device *dev,
   2171			       struct device_attribute *attr, char *buf)
   2172{
   2173	unsigned long val1, val2;
   2174	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   2175	struct etmv4_config *config = &drvdata->config;
   2176
   2177	/*
   2178	 * Don't use virtual contextID tracing if coming from a PID namespace.
   2179	 * See comment in ctxid_pid_store().
   2180	 */
   2181	if (!task_is_in_init_pid_ns(current))
   2182		return -EINVAL;
   2183
   2184	spin_lock(&drvdata->spinlock);
   2185	val1 = config->vmid_mask0;
   2186	val2 = config->vmid_mask1;
   2187	spin_unlock(&drvdata->spinlock);
   2188	return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
   2189}
   2190
   2191static ssize_t vmid_masks_store(struct device *dev,
   2192				struct device_attribute *attr,
   2193				const char *buf, size_t size)
   2194{
   2195	u8 i, j, maskbyte;
   2196	unsigned long val1, val2, mask;
   2197	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   2198	struct etmv4_config *config = &drvdata->config;
   2199	int nr_inputs;
   2200
   2201	/*
   2202	 * Don't use virtual contextID tracing if coming from a PID namespace.
   2203	 * See comment in ctxid_pid_store().
   2204	 */
   2205	if (!task_is_in_init_pid_ns(current))
   2206		return -EINVAL;
   2207
   2208	/*
   2209	 * only implemented when vmid tracing is enabled, i.e. at least one
   2210	 * vmid comparator is implemented and at least 8 bit vmid size
   2211	 */
   2212	if (!drvdata->vmid_size || !drvdata->numvmidc)
   2213		return -EINVAL;
   2214	/* one mask if <= 4 comparators, two for up to 8 */
   2215	nr_inputs = sscanf(buf, "%lx %lx", &val1, &val2);
   2216	if ((drvdata->numvmidc > 4) && (nr_inputs != 2))
   2217		return -EINVAL;
   2218
   2219	spin_lock(&drvdata->spinlock);
   2220
   2221	/*
   2222	 * each byte[0..3] controls mask value applied to vmid
   2223	 * comparator[0..3]
   2224	 */
   2225	switch (drvdata->numvmidc) {
   2226	case 0x1:
   2227		/* COMP0, bits[7:0] */
   2228		config->vmid_mask0 = val1 & 0xFF;
   2229		break;
   2230	case 0x2:
   2231		/* COMP1, bits[15:8] */
   2232		config->vmid_mask0 = val1 & 0xFFFF;
   2233		break;
   2234	case 0x3:
   2235		/* COMP2, bits[23:16] */
   2236		config->vmid_mask0 = val1 & 0xFFFFFF;
   2237		break;
   2238	case 0x4:
   2239		/* COMP3, bits[31:24] */
   2240		config->vmid_mask0 = val1;
   2241		break;
   2242	case 0x5:
   2243		/* COMP4, bits[7:0] */
   2244		config->vmid_mask0 = val1;
   2245		config->vmid_mask1 = val2 & 0xFF;
   2246		break;
   2247	case 0x6:
   2248		/* COMP5, bits[15:8] */
   2249		config->vmid_mask0 = val1;
   2250		config->vmid_mask1 = val2 & 0xFFFF;
   2251		break;
   2252	case 0x7:
   2253		/* COMP6, bits[23:16] */
   2254		config->vmid_mask0 = val1;
   2255		config->vmid_mask1 = val2 & 0xFFFFFF;
   2256		break;
   2257	case 0x8:
   2258		/* COMP7, bits[31:24] */
   2259		config->vmid_mask0 = val1;
   2260		config->vmid_mask1 = val2;
   2261		break;
   2262	default:
   2263		break;
   2264	}
   2265
   2266	/*
   2267	 * If software sets a mask bit to 1, it must program relevant byte
   2268	 * of vmid comparator value 0x0, otherwise behavior is unpredictable.
   2269	 * For example, if bit[3] of vmid_mask0 is 1, we must clear bits[31:24]
   2270	 * of vmid comparator0 value (corresponding to byte 0) register.
   2271	 */
   2272	mask = config->vmid_mask0;
   2273	for (i = 0; i < drvdata->numvmidc; i++) {
   2274		/* mask value of corresponding vmid comparator */
   2275		maskbyte = mask & ETMv4_EVENT_MASK;
   2276		/*
   2277		 * each bit corresponds to a byte of respective vmid comparator
   2278		 * value register
   2279		 */
   2280		for (j = 0; j < 8; j++) {
   2281			if (maskbyte & 1)
   2282				config->vmid_val[i] &= ~(0xFFUL << (j * 8));
   2283			maskbyte >>= 1;
   2284		}
   2285		/* Select the next vmid comparator mask value */
   2286		if (i == 3)
   2287			/* vmid comparators[4-7] */
   2288			mask = config->vmid_mask1;
   2289		else
   2290			mask >>= 0x8;
   2291	}
   2292	spin_unlock(&drvdata->spinlock);
   2293	return size;
   2294}
   2295static DEVICE_ATTR_RW(vmid_masks);
   2296
   2297static ssize_t cpu_show(struct device *dev,
   2298			struct device_attribute *attr, char *buf)
   2299{
   2300	int val;
   2301	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   2302
   2303	val = drvdata->cpu;
   2304	return scnprintf(buf, PAGE_SIZE, "%d\n", val);
   2305
   2306}
   2307static DEVICE_ATTR_RO(cpu);
   2308
   2309static struct attribute *coresight_etmv4_attrs[] = {
   2310	&dev_attr_nr_pe_cmp.attr,
   2311	&dev_attr_nr_addr_cmp.attr,
   2312	&dev_attr_nr_cntr.attr,
   2313	&dev_attr_nr_ext_inp.attr,
   2314	&dev_attr_numcidc.attr,
   2315	&dev_attr_numvmidc.attr,
   2316	&dev_attr_nrseqstate.attr,
   2317	&dev_attr_nr_resource.attr,
   2318	&dev_attr_nr_ss_cmp.attr,
   2319	&dev_attr_reset.attr,
   2320	&dev_attr_mode.attr,
   2321	&dev_attr_pe.attr,
   2322	&dev_attr_event.attr,
   2323	&dev_attr_event_instren.attr,
   2324	&dev_attr_event_ts.attr,
   2325	&dev_attr_syncfreq.attr,
   2326	&dev_attr_cyc_threshold.attr,
   2327	&dev_attr_bb_ctrl.attr,
   2328	&dev_attr_event_vinst.attr,
   2329	&dev_attr_s_exlevel_vinst.attr,
   2330	&dev_attr_ns_exlevel_vinst.attr,
   2331	&dev_attr_addr_idx.attr,
   2332	&dev_attr_addr_instdatatype.attr,
   2333	&dev_attr_addr_single.attr,
   2334	&dev_attr_addr_range.attr,
   2335	&dev_attr_addr_start.attr,
   2336	&dev_attr_addr_stop.attr,
   2337	&dev_attr_addr_ctxtype.attr,
   2338	&dev_attr_addr_context.attr,
   2339	&dev_attr_addr_exlevel_s_ns.attr,
   2340	&dev_attr_addr_cmp_view.attr,
   2341	&dev_attr_vinst_pe_cmp_start_stop.attr,
   2342	&dev_attr_sshot_idx.attr,
   2343	&dev_attr_sshot_ctrl.attr,
   2344	&dev_attr_sshot_pe_ctrl.attr,
   2345	&dev_attr_sshot_status.attr,
   2346	&dev_attr_seq_idx.attr,
   2347	&dev_attr_seq_state.attr,
   2348	&dev_attr_seq_event.attr,
   2349	&dev_attr_seq_reset_event.attr,
   2350	&dev_attr_cntr_idx.attr,
   2351	&dev_attr_cntrldvr.attr,
   2352	&dev_attr_cntr_val.attr,
   2353	&dev_attr_cntr_ctrl.attr,
   2354	&dev_attr_res_idx.attr,
   2355	&dev_attr_res_ctrl.attr,
   2356	&dev_attr_ctxid_idx.attr,
   2357	&dev_attr_ctxid_pid.attr,
   2358	&dev_attr_ctxid_masks.attr,
   2359	&dev_attr_vmid_idx.attr,
   2360	&dev_attr_vmid_val.attr,
   2361	&dev_attr_vmid_masks.attr,
   2362	&dev_attr_cpu.attr,
   2363	NULL,
   2364};
   2365
   2366struct etmv4_reg {
   2367	struct coresight_device *csdev;
   2368	u32 offset;
   2369	u32 data;
   2370};
   2371
   2372static void do_smp_cross_read(void *data)
   2373{
   2374	struct etmv4_reg *reg = data;
   2375
   2376	reg->data = etm4x_relaxed_read32(&reg->csdev->access, reg->offset);
   2377}
   2378
   2379static u32 etmv4_cross_read(const struct etmv4_drvdata *drvdata, u32 offset)
   2380{
   2381	struct etmv4_reg reg;
   2382
   2383	reg.offset = offset;
   2384	reg.csdev = drvdata->csdev;
   2385
   2386	/*
   2387	 * smp cross call ensures the CPU will be powered up before
   2388	 * accessing the ETMv4 trace core registers
   2389	 */
   2390	smp_call_function_single(drvdata->cpu, do_smp_cross_read, &reg, 1);
   2391	return reg.data;
   2392}
   2393
   2394static inline u32 coresight_etm4x_attr_to_offset(struct device_attribute *attr)
   2395{
   2396	struct dev_ext_attribute *eattr;
   2397
   2398	eattr = container_of(attr, struct dev_ext_attribute, attr);
   2399	return (u32)(unsigned long)eattr->var;
   2400}
   2401
   2402static ssize_t coresight_etm4x_reg_show(struct device *dev,
   2403					struct device_attribute *d_attr,
   2404					char *buf)
   2405{
   2406	u32 val, offset;
   2407	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   2408
   2409	offset = coresight_etm4x_attr_to_offset(d_attr);
   2410
   2411	pm_runtime_get_sync(dev->parent);
   2412	val = etmv4_cross_read(drvdata, offset);
   2413	pm_runtime_put_sync(dev->parent);
   2414
   2415	return scnprintf(buf, PAGE_SIZE, "0x%x\n", val);
   2416}
   2417
   2418static inline bool
   2419etm4x_register_implemented(struct etmv4_drvdata *drvdata, u32 offset)
   2420{
   2421	switch (offset) {
   2422	ETM_COMMON_SYSREG_LIST_CASES
   2423		/*
   2424		 * Common registers to ETE & ETM4x accessible via system
   2425		 * instructions are always implemented.
   2426		 */
   2427		return true;
   2428
   2429	ETM4x_ONLY_SYSREG_LIST_CASES
   2430		/*
   2431		 * We only support etm4x and ete. So if the device is not
   2432		 * ETE, it must be ETMv4x.
   2433		 */
   2434		return !etm4x_is_ete(drvdata);
   2435
   2436	ETM4x_MMAP_LIST_CASES
   2437		/*
   2438		 * Registers accessible only via memory-mapped registers
   2439		 * must not be accessed via system instructions.
   2440		 * We cannot access the drvdata->csdev here, as this
   2441		 * function is called during the device creation, via
   2442		 * coresight_register() and the csdev is not initialized
   2443		 * until that is done. So rely on the drvdata->base to
   2444		 * detect if we have a memory mapped access.
   2445		 * Also ETE doesn't implement memory mapped access, thus
   2446		 * it is sufficient to check that we are using mmio.
   2447		 */
   2448		return !!drvdata->base;
   2449
   2450	ETE_ONLY_SYSREG_LIST_CASES
   2451		return etm4x_is_ete(drvdata);
   2452	}
   2453
   2454	return false;
   2455}
   2456
   2457/*
   2458 * Hide the ETM4x registers that may not be available on the
   2459 * hardware.
   2460 * There are certain management registers unavailable via system
   2461 * instructions. Make those sysfs attributes hidden on such
   2462 * systems.
   2463 */
   2464static umode_t
   2465coresight_etm4x_attr_reg_implemented(struct kobject *kobj,
   2466				     struct attribute *attr, int unused)
   2467{
   2468	struct device *dev = kobj_to_dev(kobj);
   2469	struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
   2470	struct device_attribute *d_attr;
   2471	u32 offset;
   2472
   2473	d_attr = container_of(attr, struct device_attribute, attr);
   2474	offset = coresight_etm4x_attr_to_offset(d_attr);
   2475
   2476	if (etm4x_register_implemented(drvdata, offset))
   2477		return attr->mode;
   2478	return 0;
   2479}
   2480
   2481#define coresight_etm4x_reg(name, offset)				\
   2482	&((struct dev_ext_attribute[]) {				\
   2483	   {								\
   2484		__ATTR(name, 0444, coresight_etm4x_reg_show, NULL),	\
   2485		(void *)(unsigned long)offset				\
   2486	   }								\
   2487	})[0].attr.attr
   2488
   2489static struct attribute *coresight_etmv4_mgmt_attrs[] = {
   2490	coresight_etm4x_reg(trcpdcr, TRCPDCR),
   2491	coresight_etm4x_reg(trcpdsr, TRCPDSR),
   2492	coresight_etm4x_reg(trclsr, TRCLSR),
   2493	coresight_etm4x_reg(trcauthstatus, TRCAUTHSTATUS),
   2494	coresight_etm4x_reg(trcdevid, TRCDEVID),
   2495	coresight_etm4x_reg(trcdevtype, TRCDEVTYPE),
   2496	coresight_etm4x_reg(trcpidr0, TRCPIDR0),
   2497	coresight_etm4x_reg(trcpidr1, TRCPIDR1),
   2498	coresight_etm4x_reg(trcpidr2, TRCPIDR2),
   2499	coresight_etm4x_reg(trcpidr3, TRCPIDR3),
   2500	coresight_etm4x_reg(trcoslsr, TRCOSLSR),
   2501	coresight_etm4x_reg(trcconfig, TRCCONFIGR),
   2502	coresight_etm4x_reg(trctraceid, TRCTRACEIDR),
   2503	coresight_etm4x_reg(trcdevarch, TRCDEVARCH),
   2504	NULL,
   2505};
   2506
   2507static struct attribute *coresight_etmv4_trcidr_attrs[] = {
   2508	coresight_etm4x_reg(trcidr0, TRCIDR0),
   2509	coresight_etm4x_reg(trcidr1, TRCIDR1),
   2510	coresight_etm4x_reg(trcidr2, TRCIDR2),
   2511	coresight_etm4x_reg(trcidr3, TRCIDR3),
   2512	coresight_etm4x_reg(trcidr4, TRCIDR4),
   2513	coresight_etm4x_reg(trcidr5, TRCIDR5),
   2514	/* trcidr[6,7] are reserved */
   2515	coresight_etm4x_reg(trcidr8, TRCIDR8),
   2516	coresight_etm4x_reg(trcidr9, TRCIDR9),
   2517	coresight_etm4x_reg(trcidr10, TRCIDR10),
   2518	coresight_etm4x_reg(trcidr11, TRCIDR11),
   2519	coresight_etm4x_reg(trcidr12, TRCIDR12),
   2520	coresight_etm4x_reg(trcidr13, TRCIDR13),
   2521	NULL,
   2522};
   2523
   2524static const struct attribute_group coresight_etmv4_group = {
   2525	.attrs = coresight_etmv4_attrs,
   2526};
   2527
   2528static const struct attribute_group coresight_etmv4_mgmt_group = {
   2529	.is_visible = coresight_etm4x_attr_reg_implemented,
   2530	.attrs = coresight_etmv4_mgmt_attrs,
   2531	.name = "mgmt",
   2532};
   2533
   2534static const struct attribute_group coresight_etmv4_trcidr_group = {
   2535	.attrs = coresight_etmv4_trcidr_attrs,
   2536	.name = "trcidr",
   2537};
   2538
   2539const struct attribute_group *coresight_etmv4_groups[] = {
   2540	&coresight_etmv4_group,
   2541	&coresight_etmv4_mgmt_group,
   2542	&coresight_etmv4_trcidr_group,
   2543	NULL,
   2544};