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-etm3x-sysfs.c (32818B)


      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-etm.h"
     11#include "coresight-priv.h"
     12
     13static ssize_t nr_addr_cmp_show(struct device *dev,
     14				struct device_attribute *attr, char *buf)
     15{
     16	unsigned long val;
     17	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
     18
     19	val = drvdata->nr_addr_cmp;
     20	return sprintf(buf, "%#lx\n", val);
     21}
     22static DEVICE_ATTR_RO(nr_addr_cmp);
     23
     24static ssize_t nr_cntr_show(struct device *dev,
     25			    struct device_attribute *attr, char *buf)
     26{	unsigned long val;
     27	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
     28
     29	val = drvdata->nr_cntr;
     30	return sprintf(buf, "%#lx\n", val);
     31}
     32static DEVICE_ATTR_RO(nr_cntr);
     33
     34static ssize_t nr_ctxid_cmp_show(struct device *dev,
     35				 struct device_attribute *attr, char *buf)
     36{
     37	unsigned long val;
     38	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
     39
     40	val = drvdata->nr_ctxid_cmp;
     41	return sprintf(buf, "%#lx\n", val);
     42}
     43static DEVICE_ATTR_RO(nr_ctxid_cmp);
     44
     45static ssize_t etmsr_show(struct device *dev,
     46			  struct device_attribute *attr, char *buf)
     47{
     48	unsigned long flags, val;
     49	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
     50
     51	pm_runtime_get_sync(dev->parent);
     52	spin_lock_irqsave(&drvdata->spinlock, flags);
     53	CS_UNLOCK(drvdata->base);
     54
     55	val = etm_readl(drvdata, ETMSR);
     56
     57	CS_LOCK(drvdata->base);
     58	spin_unlock_irqrestore(&drvdata->spinlock, flags);
     59	pm_runtime_put(dev->parent);
     60
     61	return sprintf(buf, "%#lx\n", val);
     62}
     63static DEVICE_ATTR_RO(etmsr);
     64
     65static ssize_t reset_store(struct device *dev,
     66			   struct device_attribute *attr,
     67			   const char *buf, size_t size)
     68{
     69	int i, ret;
     70	unsigned long val;
     71	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
     72	struct etm_config *config = &drvdata->config;
     73
     74	ret = kstrtoul(buf, 16, &val);
     75	if (ret)
     76		return ret;
     77
     78	if (val) {
     79		spin_lock(&drvdata->spinlock);
     80		memset(config, 0, sizeof(struct etm_config));
     81		config->mode = ETM_MODE_EXCLUDE;
     82		config->trigger_event = ETM_DEFAULT_EVENT_VAL;
     83		for (i = 0; i < drvdata->nr_addr_cmp; i++) {
     84			config->addr_type[i] = ETM_ADDR_TYPE_NONE;
     85		}
     86
     87		etm_set_default(config);
     88		spin_unlock(&drvdata->spinlock);
     89	}
     90
     91	return size;
     92}
     93static DEVICE_ATTR_WO(reset);
     94
     95static ssize_t mode_show(struct device *dev,
     96			 struct device_attribute *attr, char *buf)
     97{
     98	unsigned long val;
     99	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    100	struct etm_config *config = &drvdata->config;
    101
    102	val = config->mode;
    103	return sprintf(buf, "%#lx\n", val);
    104}
    105
    106static ssize_t mode_store(struct device *dev,
    107			  struct device_attribute *attr,
    108			  const char *buf, size_t size)
    109{
    110	int ret;
    111	unsigned long val;
    112	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    113	struct etm_config *config = &drvdata->config;
    114
    115	ret = kstrtoul(buf, 16, &val);
    116	if (ret)
    117		return ret;
    118
    119	spin_lock(&drvdata->spinlock);
    120	config->mode = val & ETM_MODE_ALL;
    121
    122	if (config->mode & ETM_MODE_EXCLUDE)
    123		config->enable_ctrl1 |= ETMTECR1_INC_EXC;
    124	else
    125		config->enable_ctrl1 &= ~ETMTECR1_INC_EXC;
    126
    127	if (config->mode & ETM_MODE_CYCACC)
    128		config->ctrl |= ETMCR_CYC_ACC;
    129	else
    130		config->ctrl &= ~ETMCR_CYC_ACC;
    131
    132	if (config->mode & ETM_MODE_STALL) {
    133		if (!(drvdata->etmccr & ETMCCR_FIFOFULL)) {
    134			dev_warn(dev, "stall mode not supported\n");
    135			ret = -EINVAL;
    136			goto err_unlock;
    137		}
    138		config->ctrl |= ETMCR_STALL_MODE;
    139	} else
    140		config->ctrl &= ~ETMCR_STALL_MODE;
    141
    142	if (config->mode & ETM_MODE_TIMESTAMP) {
    143		if (!(drvdata->etmccer & ETMCCER_TIMESTAMP)) {
    144			dev_warn(dev, "timestamp not supported\n");
    145			ret = -EINVAL;
    146			goto err_unlock;
    147		}
    148		config->ctrl |= ETMCR_TIMESTAMP_EN;
    149	} else
    150		config->ctrl &= ~ETMCR_TIMESTAMP_EN;
    151
    152	if (config->mode & ETM_MODE_CTXID)
    153		config->ctrl |= ETMCR_CTXID_SIZE;
    154	else
    155		config->ctrl &= ~ETMCR_CTXID_SIZE;
    156
    157	if (config->mode & ETM_MODE_BBROAD)
    158		config->ctrl |= ETMCR_BRANCH_BROADCAST;
    159	else
    160		config->ctrl &= ~ETMCR_BRANCH_BROADCAST;
    161
    162	if (config->mode & ETM_MODE_RET_STACK)
    163		config->ctrl |= ETMCR_RETURN_STACK;
    164	else
    165		config->ctrl &= ~ETMCR_RETURN_STACK;
    166
    167	if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER))
    168		etm_config_trace_mode(config);
    169
    170	spin_unlock(&drvdata->spinlock);
    171
    172	return size;
    173
    174err_unlock:
    175	spin_unlock(&drvdata->spinlock);
    176	return ret;
    177}
    178static DEVICE_ATTR_RW(mode);
    179
    180static ssize_t trigger_event_show(struct device *dev,
    181				  struct device_attribute *attr, char *buf)
    182{
    183	unsigned long val;
    184	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    185	struct etm_config *config = &drvdata->config;
    186
    187	val = config->trigger_event;
    188	return sprintf(buf, "%#lx\n", val);
    189}
    190
    191static ssize_t trigger_event_store(struct device *dev,
    192				   struct device_attribute *attr,
    193				   const char *buf, size_t size)
    194{
    195	int ret;
    196	unsigned long val;
    197	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    198	struct etm_config *config = &drvdata->config;
    199
    200	ret = kstrtoul(buf, 16, &val);
    201	if (ret)
    202		return ret;
    203
    204	config->trigger_event = val & ETM_EVENT_MASK;
    205
    206	return size;
    207}
    208static DEVICE_ATTR_RW(trigger_event);
    209
    210static ssize_t enable_event_show(struct device *dev,
    211				 struct device_attribute *attr, char *buf)
    212{
    213	unsigned long val;
    214	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    215	struct etm_config *config = &drvdata->config;
    216
    217	val = config->enable_event;
    218	return sprintf(buf, "%#lx\n", val);
    219}
    220
    221static ssize_t enable_event_store(struct device *dev,
    222				  struct device_attribute *attr,
    223				  const char *buf, size_t size)
    224{
    225	int ret;
    226	unsigned long val;
    227	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    228	struct etm_config *config = &drvdata->config;
    229
    230	ret = kstrtoul(buf, 16, &val);
    231	if (ret)
    232		return ret;
    233
    234	config->enable_event = val & ETM_EVENT_MASK;
    235
    236	return size;
    237}
    238static DEVICE_ATTR_RW(enable_event);
    239
    240static ssize_t fifofull_level_show(struct device *dev,
    241				   struct device_attribute *attr, char *buf)
    242{
    243	unsigned long val;
    244	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    245	struct etm_config *config = &drvdata->config;
    246
    247	val = config->fifofull_level;
    248	return sprintf(buf, "%#lx\n", val);
    249}
    250
    251static ssize_t fifofull_level_store(struct device *dev,
    252				    struct device_attribute *attr,
    253				    const char *buf, size_t size)
    254{
    255	int ret;
    256	unsigned long val;
    257	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    258	struct etm_config *config = &drvdata->config;
    259
    260	ret = kstrtoul(buf, 16, &val);
    261	if (ret)
    262		return ret;
    263
    264	config->fifofull_level = val;
    265
    266	return size;
    267}
    268static DEVICE_ATTR_RW(fifofull_level);
    269
    270static ssize_t addr_idx_show(struct device *dev,
    271			     struct device_attribute *attr, char *buf)
    272{
    273	unsigned long val;
    274	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    275	struct etm_config *config = &drvdata->config;
    276
    277	val = config->addr_idx;
    278	return sprintf(buf, "%#lx\n", val);
    279}
    280
    281static ssize_t addr_idx_store(struct device *dev,
    282			      struct device_attribute *attr,
    283			      const char *buf, size_t size)
    284{
    285	int ret;
    286	unsigned long val;
    287	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    288	struct etm_config *config = &drvdata->config;
    289
    290	ret = kstrtoul(buf, 16, &val);
    291	if (ret)
    292		return ret;
    293
    294	if (val >= drvdata->nr_addr_cmp)
    295		return -EINVAL;
    296
    297	/*
    298	 * Use spinlock to ensure index doesn't change while it gets
    299	 * dereferenced multiple times within a spinlock block elsewhere.
    300	 */
    301	spin_lock(&drvdata->spinlock);
    302	config->addr_idx = val;
    303	spin_unlock(&drvdata->spinlock);
    304
    305	return size;
    306}
    307static DEVICE_ATTR_RW(addr_idx);
    308
    309static ssize_t addr_single_show(struct device *dev,
    310				struct device_attribute *attr, char *buf)
    311{
    312	u8 idx;
    313	unsigned long val;
    314	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    315	struct etm_config *config = &drvdata->config;
    316
    317	spin_lock(&drvdata->spinlock);
    318	idx = config->addr_idx;
    319	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
    320	      config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
    321		spin_unlock(&drvdata->spinlock);
    322		return -EINVAL;
    323	}
    324
    325	val = config->addr_val[idx];
    326	spin_unlock(&drvdata->spinlock);
    327
    328	return sprintf(buf, "%#lx\n", val);
    329}
    330
    331static ssize_t addr_single_store(struct device *dev,
    332				 struct device_attribute *attr,
    333				 const char *buf, size_t size)
    334{
    335	u8 idx;
    336	int ret;
    337	unsigned long val;
    338	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    339	struct etm_config *config = &drvdata->config;
    340
    341	ret = kstrtoul(buf, 16, &val);
    342	if (ret)
    343		return ret;
    344
    345	spin_lock(&drvdata->spinlock);
    346	idx = config->addr_idx;
    347	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
    348	      config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
    349		spin_unlock(&drvdata->spinlock);
    350		return -EINVAL;
    351	}
    352
    353	config->addr_val[idx] = val;
    354	config->addr_type[idx] = ETM_ADDR_TYPE_SINGLE;
    355	spin_unlock(&drvdata->spinlock);
    356
    357	return size;
    358}
    359static DEVICE_ATTR_RW(addr_single);
    360
    361static ssize_t addr_range_show(struct device *dev,
    362			       struct device_attribute *attr, char *buf)
    363{
    364	u8 idx;
    365	unsigned long val1, val2;
    366	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    367	struct etm_config *config = &drvdata->config;
    368
    369	spin_lock(&drvdata->spinlock);
    370	idx = config->addr_idx;
    371	if (idx % 2 != 0) {
    372		spin_unlock(&drvdata->spinlock);
    373		return -EPERM;
    374	}
    375	if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
    376	       config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
    377	      (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
    378	       config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
    379		spin_unlock(&drvdata->spinlock);
    380		return -EPERM;
    381	}
    382
    383	val1 = config->addr_val[idx];
    384	val2 = config->addr_val[idx + 1];
    385	spin_unlock(&drvdata->spinlock);
    386
    387	return sprintf(buf, "%#lx %#lx\n", val1, val2);
    388}
    389
    390static ssize_t addr_range_store(struct device *dev,
    391			      struct device_attribute *attr,
    392			      const char *buf, size_t size)
    393{
    394	u8 idx;
    395	unsigned long val1, val2;
    396	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    397	struct etm_config *config = &drvdata->config;
    398
    399	if (sscanf(buf, "%lx %lx", &val1, &val2) != 2)
    400		return -EINVAL;
    401	/* Lower address comparator cannot have a higher address value */
    402	if (val1 > val2)
    403		return -EINVAL;
    404
    405	spin_lock(&drvdata->spinlock);
    406	idx = config->addr_idx;
    407	if (idx % 2 != 0) {
    408		spin_unlock(&drvdata->spinlock);
    409		return -EPERM;
    410	}
    411	if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
    412	       config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
    413	      (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
    414	       config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
    415		spin_unlock(&drvdata->spinlock);
    416		return -EPERM;
    417	}
    418
    419	config->addr_val[idx] = val1;
    420	config->addr_type[idx] = ETM_ADDR_TYPE_RANGE;
    421	config->addr_val[idx + 1] = val2;
    422	config->addr_type[idx + 1] = ETM_ADDR_TYPE_RANGE;
    423	config->enable_ctrl1 |= (1 << (idx/2));
    424	spin_unlock(&drvdata->spinlock);
    425
    426	return size;
    427}
    428static DEVICE_ATTR_RW(addr_range);
    429
    430static ssize_t addr_start_show(struct device *dev,
    431			       struct device_attribute *attr, char *buf)
    432{
    433	u8 idx;
    434	unsigned long val;
    435	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    436	struct etm_config *config = &drvdata->config;
    437
    438	spin_lock(&drvdata->spinlock);
    439	idx = config->addr_idx;
    440	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
    441	      config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
    442		spin_unlock(&drvdata->spinlock);
    443		return -EPERM;
    444	}
    445
    446	val = config->addr_val[idx];
    447	spin_unlock(&drvdata->spinlock);
    448
    449	return sprintf(buf, "%#lx\n", val);
    450}
    451
    452static ssize_t addr_start_store(struct device *dev,
    453				struct device_attribute *attr,
    454				const char *buf, size_t size)
    455{
    456	u8 idx;
    457	int ret;
    458	unsigned long val;
    459	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    460	struct etm_config *config = &drvdata->config;
    461
    462	ret = kstrtoul(buf, 16, &val);
    463	if (ret)
    464		return ret;
    465
    466	spin_lock(&drvdata->spinlock);
    467	idx = config->addr_idx;
    468	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
    469	      config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
    470		spin_unlock(&drvdata->spinlock);
    471		return -EPERM;
    472	}
    473
    474	config->addr_val[idx] = val;
    475	config->addr_type[idx] = ETM_ADDR_TYPE_START;
    476	config->startstop_ctrl |= (1 << idx);
    477	config->enable_ctrl1 |= ETMTECR1_START_STOP;
    478	spin_unlock(&drvdata->spinlock);
    479
    480	return size;
    481}
    482static DEVICE_ATTR_RW(addr_start);
    483
    484static ssize_t addr_stop_show(struct device *dev,
    485			      struct device_attribute *attr, char *buf)
    486{
    487	u8 idx;
    488	unsigned long val;
    489	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    490	struct etm_config *config = &drvdata->config;
    491
    492	spin_lock(&drvdata->spinlock);
    493	idx = config->addr_idx;
    494	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
    495	      config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
    496		spin_unlock(&drvdata->spinlock);
    497		return -EPERM;
    498	}
    499
    500	val = config->addr_val[idx];
    501	spin_unlock(&drvdata->spinlock);
    502
    503	return sprintf(buf, "%#lx\n", val);
    504}
    505
    506static ssize_t addr_stop_store(struct device *dev,
    507			       struct device_attribute *attr,
    508			       const char *buf, size_t size)
    509{
    510	u8 idx;
    511	int ret;
    512	unsigned long val;
    513	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    514	struct etm_config *config = &drvdata->config;
    515
    516	ret = kstrtoul(buf, 16, &val);
    517	if (ret)
    518		return ret;
    519
    520	spin_lock(&drvdata->spinlock);
    521	idx = config->addr_idx;
    522	if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
    523	      config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
    524		spin_unlock(&drvdata->spinlock);
    525		return -EPERM;
    526	}
    527
    528	config->addr_val[idx] = val;
    529	config->addr_type[idx] = ETM_ADDR_TYPE_STOP;
    530	config->startstop_ctrl |= (1 << (idx + 16));
    531	config->enable_ctrl1 |= ETMTECR1_START_STOP;
    532	spin_unlock(&drvdata->spinlock);
    533
    534	return size;
    535}
    536static DEVICE_ATTR_RW(addr_stop);
    537
    538static ssize_t addr_acctype_show(struct device *dev,
    539				 struct device_attribute *attr, char *buf)
    540{
    541	unsigned long val;
    542	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    543	struct etm_config *config = &drvdata->config;
    544
    545	spin_lock(&drvdata->spinlock);
    546	val = config->addr_acctype[config->addr_idx];
    547	spin_unlock(&drvdata->spinlock);
    548
    549	return sprintf(buf, "%#lx\n", val);
    550}
    551
    552static ssize_t addr_acctype_store(struct device *dev,
    553				  struct device_attribute *attr,
    554				  const char *buf, size_t size)
    555{
    556	int ret;
    557	unsigned long val;
    558	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    559	struct etm_config *config = &drvdata->config;
    560
    561	ret = kstrtoul(buf, 16, &val);
    562	if (ret)
    563		return ret;
    564
    565	spin_lock(&drvdata->spinlock);
    566	config->addr_acctype[config->addr_idx] = val;
    567	spin_unlock(&drvdata->spinlock);
    568
    569	return size;
    570}
    571static DEVICE_ATTR_RW(addr_acctype);
    572
    573static ssize_t cntr_idx_show(struct device *dev,
    574			     struct device_attribute *attr, char *buf)
    575{
    576	unsigned long val;
    577	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    578	struct etm_config *config = &drvdata->config;
    579
    580	val = config->cntr_idx;
    581	return sprintf(buf, "%#lx\n", val);
    582}
    583
    584static ssize_t cntr_idx_store(struct device *dev,
    585			      struct device_attribute *attr,
    586			      const char *buf, size_t size)
    587{
    588	int ret;
    589	unsigned long val;
    590	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    591	struct etm_config *config = &drvdata->config;
    592
    593	ret = kstrtoul(buf, 16, &val);
    594	if (ret)
    595		return ret;
    596
    597	if (val >= drvdata->nr_cntr)
    598		return -EINVAL;
    599	/*
    600	 * Use spinlock to ensure index doesn't change while it gets
    601	 * dereferenced multiple times within a spinlock block elsewhere.
    602	 */
    603	spin_lock(&drvdata->spinlock);
    604	config->cntr_idx = val;
    605	spin_unlock(&drvdata->spinlock);
    606
    607	return size;
    608}
    609static DEVICE_ATTR_RW(cntr_idx);
    610
    611static ssize_t cntr_rld_val_show(struct device *dev,
    612				 struct device_attribute *attr, char *buf)
    613{
    614	unsigned long val;
    615	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    616	struct etm_config *config = &drvdata->config;
    617
    618	spin_lock(&drvdata->spinlock);
    619	val = config->cntr_rld_val[config->cntr_idx];
    620	spin_unlock(&drvdata->spinlock);
    621
    622	return sprintf(buf, "%#lx\n", val);
    623}
    624
    625static ssize_t cntr_rld_val_store(struct device *dev,
    626				  struct device_attribute *attr,
    627				  const char *buf, size_t size)
    628{
    629	int ret;
    630	unsigned long val;
    631	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    632	struct etm_config *config = &drvdata->config;
    633
    634	ret = kstrtoul(buf, 16, &val);
    635	if (ret)
    636		return ret;
    637
    638	spin_lock(&drvdata->spinlock);
    639	config->cntr_rld_val[config->cntr_idx] = val;
    640	spin_unlock(&drvdata->spinlock);
    641
    642	return size;
    643}
    644static DEVICE_ATTR_RW(cntr_rld_val);
    645
    646static ssize_t cntr_event_show(struct device *dev,
    647			       struct device_attribute *attr, char *buf)
    648{
    649	unsigned long val;
    650	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    651	struct etm_config *config = &drvdata->config;
    652
    653	spin_lock(&drvdata->spinlock);
    654	val = config->cntr_event[config->cntr_idx];
    655	spin_unlock(&drvdata->spinlock);
    656
    657	return sprintf(buf, "%#lx\n", val);
    658}
    659
    660static ssize_t cntr_event_store(struct device *dev,
    661				struct device_attribute *attr,
    662				const char *buf, size_t size)
    663{
    664	int ret;
    665	unsigned long val;
    666	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    667	struct etm_config *config = &drvdata->config;
    668
    669	ret = kstrtoul(buf, 16, &val);
    670	if (ret)
    671		return ret;
    672
    673	spin_lock(&drvdata->spinlock);
    674	config->cntr_event[config->cntr_idx] = val & ETM_EVENT_MASK;
    675	spin_unlock(&drvdata->spinlock);
    676
    677	return size;
    678}
    679static DEVICE_ATTR_RW(cntr_event);
    680
    681static ssize_t cntr_rld_event_show(struct device *dev,
    682				   struct device_attribute *attr, char *buf)
    683{
    684	unsigned long val;
    685	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    686	struct etm_config *config = &drvdata->config;
    687
    688	spin_lock(&drvdata->spinlock);
    689	val = config->cntr_rld_event[config->cntr_idx];
    690	spin_unlock(&drvdata->spinlock);
    691
    692	return sprintf(buf, "%#lx\n", val);
    693}
    694
    695static ssize_t cntr_rld_event_store(struct device *dev,
    696				    struct device_attribute *attr,
    697				    const char *buf, size_t size)
    698{
    699	int ret;
    700	unsigned long val;
    701	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    702	struct etm_config *config = &drvdata->config;
    703
    704	ret = kstrtoul(buf, 16, &val);
    705	if (ret)
    706		return ret;
    707
    708	spin_lock(&drvdata->spinlock);
    709	config->cntr_rld_event[config->cntr_idx] = val & ETM_EVENT_MASK;
    710	spin_unlock(&drvdata->spinlock);
    711
    712	return size;
    713}
    714static DEVICE_ATTR_RW(cntr_rld_event);
    715
    716static ssize_t cntr_val_show(struct device *dev,
    717			     struct device_attribute *attr, char *buf)
    718{
    719	int i, ret = 0;
    720	u32 val;
    721	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    722	struct etm_config *config = &drvdata->config;
    723
    724	if (!local_read(&drvdata->mode)) {
    725		spin_lock(&drvdata->spinlock);
    726		for (i = 0; i < drvdata->nr_cntr; i++)
    727			ret += sprintf(buf, "counter %d: %x\n",
    728				       i, config->cntr_val[i]);
    729		spin_unlock(&drvdata->spinlock);
    730		return ret;
    731	}
    732
    733	for (i = 0; i < drvdata->nr_cntr; i++) {
    734		val = etm_readl(drvdata, ETMCNTVRn(i));
    735		ret += sprintf(buf, "counter %d: %x\n", i, val);
    736	}
    737
    738	return ret;
    739}
    740
    741static ssize_t cntr_val_store(struct device *dev,
    742			      struct device_attribute *attr,
    743			      const char *buf, size_t size)
    744{
    745	int ret;
    746	unsigned long val;
    747	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    748	struct etm_config *config = &drvdata->config;
    749
    750	ret = kstrtoul(buf, 16, &val);
    751	if (ret)
    752		return ret;
    753
    754	spin_lock(&drvdata->spinlock);
    755	config->cntr_val[config->cntr_idx] = val;
    756	spin_unlock(&drvdata->spinlock);
    757
    758	return size;
    759}
    760static DEVICE_ATTR_RW(cntr_val);
    761
    762static ssize_t seq_12_event_show(struct device *dev,
    763				 struct device_attribute *attr, char *buf)
    764{
    765	unsigned long val;
    766	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    767	struct etm_config *config = &drvdata->config;
    768
    769	val = config->seq_12_event;
    770	return sprintf(buf, "%#lx\n", val);
    771}
    772
    773static ssize_t seq_12_event_store(struct device *dev,
    774				  struct device_attribute *attr,
    775				  const char *buf, size_t size)
    776{
    777	int ret;
    778	unsigned long val;
    779	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    780	struct etm_config *config = &drvdata->config;
    781
    782	ret = kstrtoul(buf, 16, &val);
    783	if (ret)
    784		return ret;
    785
    786	config->seq_12_event = val & ETM_EVENT_MASK;
    787	return size;
    788}
    789static DEVICE_ATTR_RW(seq_12_event);
    790
    791static ssize_t seq_21_event_show(struct device *dev,
    792				 struct device_attribute *attr, char *buf)
    793{
    794	unsigned long val;
    795	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    796	struct etm_config *config = &drvdata->config;
    797
    798	val = config->seq_21_event;
    799	return sprintf(buf, "%#lx\n", val);
    800}
    801
    802static ssize_t seq_21_event_store(struct device *dev,
    803				  struct device_attribute *attr,
    804				  const char *buf, size_t size)
    805{
    806	int ret;
    807	unsigned long val;
    808	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    809	struct etm_config *config = &drvdata->config;
    810
    811	ret = kstrtoul(buf, 16, &val);
    812	if (ret)
    813		return ret;
    814
    815	config->seq_21_event = val & ETM_EVENT_MASK;
    816	return size;
    817}
    818static DEVICE_ATTR_RW(seq_21_event);
    819
    820static ssize_t seq_23_event_show(struct device *dev,
    821				 struct device_attribute *attr, char *buf)
    822{
    823	unsigned long val;
    824	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    825	struct etm_config *config = &drvdata->config;
    826
    827	val = config->seq_23_event;
    828	return sprintf(buf, "%#lx\n", val);
    829}
    830
    831static ssize_t seq_23_event_store(struct device *dev,
    832				  struct device_attribute *attr,
    833				  const char *buf, size_t size)
    834{
    835	int ret;
    836	unsigned long val;
    837	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    838	struct etm_config *config = &drvdata->config;
    839
    840	ret = kstrtoul(buf, 16, &val);
    841	if (ret)
    842		return ret;
    843
    844	config->seq_23_event = val & ETM_EVENT_MASK;
    845	return size;
    846}
    847static DEVICE_ATTR_RW(seq_23_event);
    848
    849static ssize_t seq_31_event_show(struct device *dev,
    850				 struct device_attribute *attr, char *buf)
    851{
    852	unsigned long val;
    853	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    854	struct etm_config *config = &drvdata->config;
    855
    856	val = config->seq_31_event;
    857	return sprintf(buf, "%#lx\n", val);
    858}
    859
    860static ssize_t seq_31_event_store(struct device *dev,
    861				  struct device_attribute *attr,
    862				  const char *buf, size_t size)
    863{
    864	int ret;
    865	unsigned long val;
    866	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    867	struct etm_config *config = &drvdata->config;
    868
    869	ret = kstrtoul(buf, 16, &val);
    870	if (ret)
    871		return ret;
    872
    873	config->seq_31_event = val & ETM_EVENT_MASK;
    874	return size;
    875}
    876static DEVICE_ATTR_RW(seq_31_event);
    877
    878static ssize_t seq_32_event_show(struct device *dev,
    879				 struct device_attribute *attr, char *buf)
    880{
    881	unsigned long val;
    882	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    883	struct etm_config *config = &drvdata->config;
    884
    885	val = config->seq_32_event;
    886	return sprintf(buf, "%#lx\n", val);
    887}
    888
    889static ssize_t seq_32_event_store(struct device *dev,
    890				  struct device_attribute *attr,
    891				  const char *buf, size_t size)
    892{
    893	int ret;
    894	unsigned long val;
    895	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    896	struct etm_config *config = &drvdata->config;
    897
    898	ret = kstrtoul(buf, 16, &val);
    899	if (ret)
    900		return ret;
    901
    902	config->seq_32_event = val & ETM_EVENT_MASK;
    903	return size;
    904}
    905static DEVICE_ATTR_RW(seq_32_event);
    906
    907static ssize_t seq_13_event_show(struct device *dev,
    908				 struct device_attribute *attr, char *buf)
    909{
    910	unsigned long val;
    911	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    912	struct etm_config *config = &drvdata->config;
    913
    914	val = config->seq_13_event;
    915	return sprintf(buf, "%#lx\n", val);
    916}
    917
    918static ssize_t seq_13_event_store(struct device *dev,
    919				  struct device_attribute *attr,
    920				  const char *buf, size_t size)
    921{
    922	int ret;
    923	unsigned long val;
    924	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    925	struct etm_config *config = &drvdata->config;
    926
    927	ret = kstrtoul(buf, 16, &val);
    928	if (ret)
    929		return ret;
    930
    931	config->seq_13_event = val & ETM_EVENT_MASK;
    932	return size;
    933}
    934static DEVICE_ATTR_RW(seq_13_event);
    935
    936static ssize_t seq_curr_state_show(struct device *dev,
    937				   struct device_attribute *attr, char *buf)
    938{
    939	unsigned long val, flags;
    940	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    941	struct etm_config *config = &drvdata->config;
    942
    943	if (!local_read(&drvdata->mode)) {
    944		val = config->seq_curr_state;
    945		goto out;
    946	}
    947
    948	pm_runtime_get_sync(dev->parent);
    949	spin_lock_irqsave(&drvdata->spinlock, flags);
    950
    951	CS_UNLOCK(drvdata->base);
    952	val = (etm_readl(drvdata, ETMSQR) & ETM_SQR_MASK);
    953	CS_LOCK(drvdata->base);
    954
    955	spin_unlock_irqrestore(&drvdata->spinlock, flags);
    956	pm_runtime_put(dev->parent);
    957out:
    958	return sprintf(buf, "%#lx\n", val);
    959}
    960
    961static ssize_t seq_curr_state_store(struct device *dev,
    962				    struct device_attribute *attr,
    963				    const char *buf, size_t size)
    964{
    965	int ret;
    966	unsigned long val;
    967	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    968	struct etm_config *config = &drvdata->config;
    969
    970	ret = kstrtoul(buf, 16, &val);
    971	if (ret)
    972		return ret;
    973
    974	if (val > ETM_SEQ_STATE_MAX_VAL)
    975		return -EINVAL;
    976
    977	config->seq_curr_state = val;
    978
    979	return size;
    980}
    981static DEVICE_ATTR_RW(seq_curr_state);
    982
    983static ssize_t ctxid_idx_show(struct device *dev,
    984			      struct device_attribute *attr, char *buf)
    985{
    986	unsigned long val;
    987	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    988	struct etm_config *config = &drvdata->config;
    989
    990	val = config->ctxid_idx;
    991	return sprintf(buf, "%#lx\n", val);
    992}
    993
    994static ssize_t ctxid_idx_store(struct device *dev,
    995				struct device_attribute *attr,
    996				const char *buf, size_t size)
    997{
    998	int ret;
    999	unsigned long val;
   1000	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1001	struct etm_config *config = &drvdata->config;
   1002
   1003	ret = kstrtoul(buf, 16, &val);
   1004	if (ret)
   1005		return ret;
   1006
   1007	if (val >= drvdata->nr_ctxid_cmp)
   1008		return -EINVAL;
   1009
   1010	/*
   1011	 * Use spinlock to ensure index doesn't change while it gets
   1012	 * dereferenced multiple times within a spinlock block elsewhere.
   1013	 */
   1014	spin_lock(&drvdata->spinlock);
   1015	config->ctxid_idx = val;
   1016	spin_unlock(&drvdata->spinlock);
   1017
   1018	return size;
   1019}
   1020static DEVICE_ATTR_RW(ctxid_idx);
   1021
   1022static ssize_t ctxid_pid_show(struct device *dev,
   1023			      struct device_attribute *attr, char *buf)
   1024{
   1025	unsigned long val;
   1026	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1027	struct etm_config *config = &drvdata->config;
   1028
   1029	/*
   1030	 * Don't use contextID tracing if coming from a PID namespace.  See
   1031	 * comment in ctxid_pid_store().
   1032	 */
   1033	if (task_active_pid_ns(current) != &init_pid_ns)
   1034		return -EINVAL;
   1035
   1036	spin_lock(&drvdata->spinlock);
   1037	val = config->ctxid_pid[config->ctxid_idx];
   1038	spin_unlock(&drvdata->spinlock);
   1039
   1040	return sprintf(buf, "%#lx\n", val);
   1041}
   1042
   1043static ssize_t ctxid_pid_store(struct device *dev,
   1044			       struct device_attribute *attr,
   1045			       const char *buf, size_t size)
   1046{
   1047	int ret;
   1048	unsigned long pid;
   1049	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1050	struct etm_config *config = &drvdata->config;
   1051
   1052	/*
   1053	 * When contextID tracing is enabled the tracers will insert the
   1054	 * value found in the contextID register in the trace stream.  But if
   1055	 * a process is in a namespace the PID of that process as seen from the
   1056	 * namespace won't be what the kernel sees, something that makes the
   1057	 * feature confusing and can potentially leak kernel only information.
   1058	 * As such refuse to use the feature if @current is not in the initial
   1059	 * PID namespace.
   1060	 */
   1061	if (task_active_pid_ns(current) != &init_pid_ns)
   1062		return -EINVAL;
   1063
   1064	ret = kstrtoul(buf, 16, &pid);
   1065	if (ret)
   1066		return ret;
   1067
   1068	spin_lock(&drvdata->spinlock);
   1069	config->ctxid_pid[config->ctxid_idx] = pid;
   1070	spin_unlock(&drvdata->spinlock);
   1071
   1072	return size;
   1073}
   1074static DEVICE_ATTR_RW(ctxid_pid);
   1075
   1076static ssize_t ctxid_mask_show(struct device *dev,
   1077			       struct device_attribute *attr, char *buf)
   1078{
   1079	unsigned long val;
   1080	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1081	struct etm_config *config = &drvdata->config;
   1082
   1083	/*
   1084	 * Don't use contextID tracing if coming from a PID namespace.  See
   1085	 * comment in ctxid_pid_store().
   1086	 */
   1087	if (task_active_pid_ns(current) != &init_pid_ns)
   1088		return -EINVAL;
   1089
   1090	val = config->ctxid_mask;
   1091	return sprintf(buf, "%#lx\n", val);
   1092}
   1093
   1094static ssize_t ctxid_mask_store(struct device *dev,
   1095				struct device_attribute *attr,
   1096				const char *buf, size_t size)
   1097{
   1098	int ret;
   1099	unsigned long val;
   1100	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1101	struct etm_config *config = &drvdata->config;
   1102
   1103	/*
   1104	 * Don't use contextID tracing if coming from a PID namespace.  See
   1105	 * comment in ctxid_pid_store().
   1106	 */
   1107	if (task_active_pid_ns(current) != &init_pid_ns)
   1108		return -EINVAL;
   1109
   1110	ret = kstrtoul(buf, 16, &val);
   1111	if (ret)
   1112		return ret;
   1113
   1114	config->ctxid_mask = val;
   1115	return size;
   1116}
   1117static DEVICE_ATTR_RW(ctxid_mask);
   1118
   1119static ssize_t sync_freq_show(struct device *dev,
   1120			      struct device_attribute *attr, char *buf)
   1121{
   1122	unsigned long val;
   1123	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1124	struct etm_config *config = &drvdata->config;
   1125
   1126	val = config->sync_freq;
   1127	return sprintf(buf, "%#lx\n", val);
   1128}
   1129
   1130static ssize_t sync_freq_store(struct device *dev,
   1131			       struct device_attribute *attr,
   1132			       const char *buf, size_t size)
   1133{
   1134	int ret;
   1135	unsigned long val;
   1136	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1137	struct etm_config *config = &drvdata->config;
   1138
   1139	ret = kstrtoul(buf, 16, &val);
   1140	if (ret)
   1141		return ret;
   1142
   1143	config->sync_freq = val & ETM_SYNC_MASK;
   1144	return size;
   1145}
   1146static DEVICE_ATTR_RW(sync_freq);
   1147
   1148static ssize_t timestamp_event_show(struct device *dev,
   1149				    struct device_attribute *attr, char *buf)
   1150{
   1151	unsigned long val;
   1152	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1153	struct etm_config *config = &drvdata->config;
   1154
   1155	val = config->timestamp_event;
   1156	return sprintf(buf, "%#lx\n", val);
   1157}
   1158
   1159static ssize_t timestamp_event_store(struct device *dev,
   1160				     struct device_attribute *attr,
   1161				     const char *buf, size_t size)
   1162{
   1163	int ret;
   1164	unsigned long val;
   1165	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1166	struct etm_config *config = &drvdata->config;
   1167
   1168	ret = kstrtoul(buf, 16, &val);
   1169	if (ret)
   1170		return ret;
   1171
   1172	config->timestamp_event = val & ETM_EVENT_MASK;
   1173	return size;
   1174}
   1175static DEVICE_ATTR_RW(timestamp_event);
   1176
   1177static ssize_t cpu_show(struct device *dev,
   1178			struct device_attribute *attr, char *buf)
   1179{
   1180	int val;
   1181	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1182
   1183	val = drvdata->cpu;
   1184	return scnprintf(buf, PAGE_SIZE, "%d\n", val);
   1185
   1186}
   1187static DEVICE_ATTR_RO(cpu);
   1188
   1189static ssize_t traceid_show(struct device *dev,
   1190			    struct device_attribute *attr, char *buf)
   1191{
   1192	unsigned long val;
   1193	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1194
   1195	val = etm_get_trace_id(drvdata);
   1196
   1197	return sprintf(buf, "%#lx\n", val);
   1198}
   1199
   1200static ssize_t traceid_store(struct device *dev,
   1201			     struct device_attribute *attr,
   1202			     const char *buf, size_t size)
   1203{
   1204	int ret;
   1205	unsigned long val;
   1206	struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
   1207
   1208	ret = kstrtoul(buf, 16, &val);
   1209	if (ret)
   1210		return ret;
   1211
   1212	drvdata->traceid = val & ETM_TRACEID_MASK;
   1213	return size;
   1214}
   1215static DEVICE_ATTR_RW(traceid);
   1216
   1217static struct attribute *coresight_etm_attrs[] = {
   1218	&dev_attr_nr_addr_cmp.attr,
   1219	&dev_attr_nr_cntr.attr,
   1220	&dev_attr_nr_ctxid_cmp.attr,
   1221	&dev_attr_etmsr.attr,
   1222	&dev_attr_reset.attr,
   1223	&dev_attr_mode.attr,
   1224	&dev_attr_trigger_event.attr,
   1225	&dev_attr_enable_event.attr,
   1226	&dev_attr_fifofull_level.attr,
   1227	&dev_attr_addr_idx.attr,
   1228	&dev_attr_addr_single.attr,
   1229	&dev_attr_addr_range.attr,
   1230	&dev_attr_addr_start.attr,
   1231	&dev_attr_addr_stop.attr,
   1232	&dev_attr_addr_acctype.attr,
   1233	&dev_attr_cntr_idx.attr,
   1234	&dev_attr_cntr_rld_val.attr,
   1235	&dev_attr_cntr_event.attr,
   1236	&dev_attr_cntr_rld_event.attr,
   1237	&dev_attr_cntr_val.attr,
   1238	&dev_attr_seq_12_event.attr,
   1239	&dev_attr_seq_21_event.attr,
   1240	&dev_attr_seq_23_event.attr,
   1241	&dev_attr_seq_31_event.attr,
   1242	&dev_attr_seq_32_event.attr,
   1243	&dev_attr_seq_13_event.attr,
   1244	&dev_attr_seq_curr_state.attr,
   1245	&dev_attr_ctxid_idx.attr,
   1246	&dev_attr_ctxid_pid.attr,
   1247	&dev_attr_ctxid_mask.attr,
   1248	&dev_attr_sync_freq.attr,
   1249	&dev_attr_timestamp_event.attr,
   1250	&dev_attr_traceid.attr,
   1251	&dev_attr_cpu.attr,
   1252	NULL,
   1253};
   1254
   1255#define coresight_etm3x_reg(name, offset)			\
   1256	coresight_simple_reg32(struct etm_drvdata, name, offset)
   1257
   1258coresight_etm3x_reg(etmccr, ETMCCR);
   1259coresight_etm3x_reg(etmccer, ETMCCER);
   1260coresight_etm3x_reg(etmscr, ETMSCR);
   1261coresight_etm3x_reg(etmidr, ETMIDR);
   1262coresight_etm3x_reg(etmcr, ETMCR);
   1263coresight_etm3x_reg(etmtraceidr, ETMTRACEIDR);
   1264coresight_etm3x_reg(etmteevr, ETMTEEVR);
   1265coresight_etm3x_reg(etmtssvr, ETMTSSCR);
   1266coresight_etm3x_reg(etmtecr1, ETMTECR1);
   1267coresight_etm3x_reg(etmtecr2, ETMTECR2);
   1268
   1269static struct attribute *coresight_etm_mgmt_attrs[] = {
   1270	&dev_attr_etmccr.attr,
   1271	&dev_attr_etmccer.attr,
   1272	&dev_attr_etmscr.attr,
   1273	&dev_attr_etmidr.attr,
   1274	&dev_attr_etmcr.attr,
   1275	&dev_attr_etmtraceidr.attr,
   1276	&dev_attr_etmteevr.attr,
   1277	&dev_attr_etmtssvr.attr,
   1278	&dev_attr_etmtecr1.attr,
   1279	&dev_attr_etmtecr2.attr,
   1280	NULL,
   1281};
   1282
   1283static const struct attribute_group coresight_etm_group = {
   1284	.attrs = coresight_etm_attrs,
   1285};
   1286
   1287static const struct attribute_group coresight_etm_mgmt_group = {
   1288	.attrs = coresight_etm_mgmt_attrs,
   1289	.name = "mgmt",
   1290};
   1291
   1292const struct attribute_group *coresight_etm_groups[] = {
   1293	&coresight_etm_group,
   1294	&coresight_etm_mgmt_group,
   1295	NULL,
   1296};