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-stm.c (25150B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
      4 *
      5 * Description: CoreSight System Trace Macrocell driver
      6 *
      7 * Initial implementation by Pratik Patel
      8 * (C) 2014-2015 Pratik Patel <pratikp@codeaurora.org>
      9 *
     10 * Serious refactoring, code cleanup and upgrading to the Coresight upstream
     11 * framework by Mathieu Poirier
     12 * (C) 2015-2016 Mathieu Poirier <mathieu.poirier@linaro.org>
     13 *
     14 * Guaranteed timing and support for various packet type coming from the
     15 * generic STM API by Chunyan Zhang
     16 * (C) 2015-2016 Chunyan Zhang <zhang.chunyan@linaro.org>
     17 */
     18#include <asm/local.h>
     19#include <linux/acpi.h>
     20#include <linux/amba/bus.h>
     21#include <linux/bitmap.h>
     22#include <linux/clk.h>
     23#include <linux/coresight.h>
     24#include <linux/coresight-stm.h>
     25#include <linux/err.h>
     26#include <linux/kernel.h>
     27#include <linux/moduleparam.h>
     28#include <linux/of_address.h>
     29#include <linux/perf_event.h>
     30#include <linux/pm_runtime.h>
     31#include <linux/stm.h>
     32
     33#include "coresight-priv.h"
     34
     35#define STMDMASTARTR			0xc04
     36#define STMDMASTOPR			0xc08
     37#define STMDMASTATR			0xc0c
     38#define STMDMACTLR			0xc10
     39#define STMDMAIDR			0xcfc
     40#define STMHEER				0xd00
     41#define STMHETER			0xd20
     42#define STMHEBSR			0xd60
     43#define STMHEMCR			0xd64
     44#define STMHEMASTR			0xdf4
     45#define STMHEFEAT1R			0xdf8
     46#define STMHEIDR			0xdfc
     47#define STMSPER				0xe00
     48#define STMSPTER			0xe20
     49#define STMPRIVMASKR			0xe40
     50#define STMSPSCR			0xe60
     51#define STMSPMSCR			0xe64
     52#define STMSPOVERRIDER			0xe68
     53#define STMSPMOVERRIDER			0xe6c
     54#define STMSPTRIGCSR			0xe70
     55#define STMTCSR				0xe80
     56#define STMTSSTIMR			0xe84
     57#define STMTSFREQR			0xe8c
     58#define STMSYNCR			0xe90
     59#define STMAUXCR			0xe94
     60#define STMSPFEAT1R			0xea0
     61#define STMSPFEAT2R			0xea4
     62#define STMSPFEAT3R			0xea8
     63#define STMITTRIGGER			0xee8
     64#define STMITATBDATA0			0xeec
     65#define STMITATBCTR2			0xef0
     66#define STMITATBID			0xef4
     67#define STMITATBCTR0			0xef8
     68
     69#define STM_32_CHANNEL			32
     70#define BYTES_PER_CHANNEL		256
     71#define STM_TRACE_BUF_SIZE		4096
     72#define STM_SW_MASTER_END		127
     73
     74/* Register bit definition */
     75#define STMTCSR_BUSY_BIT		23
     76/* Reserve the first 10 channels for kernel usage */
     77#define STM_CHANNEL_OFFSET		0
     78
     79enum stm_pkt_type {
     80	STM_PKT_TYPE_DATA	= 0x98,
     81	STM_PKT_TYPE_FLAG	= 0xE8,
     82	STM_PKT_TYPE_TRIG	= 0xF8,
     83};
     84
     85#define stm_channel_addr(drvdata, ch)	(drvdata->chs.base +	\
     86					(ch * BYTES_PER_CHANNEL))
     87#define stm_channel_off(type, opts)	(type & ~opts)
     88
     89static int boot_nr_channel;
     90
     91/*
     92 * Not really modular but using module_param is the easiest way to
     93 * remain consistent with existing use cases for now.
     94 */
     95module_param_named(
     96	boot_nr_channel, boot_nr_channel, int, S_IRUGO
     97);
     98
     99/*
    100 * struct channel_space - central management entity for extended ports
    101 * @base:		memory mapped base address where channels start.
    102 * @phys:		physical base address of channel region.
    103 * @guaraneed:		is the channel delivery guaranteed.
    104 */
    105struct channel_space {
    106	void __iomem		*base;
    107	phys_addr_t		phys;
    108	unsigned long		*guaranteed;
    109};
    110
    111DEFINE_CORESIGHT_DEVLIST(stm_devs, "stm");
    112
    113/**
    114 * struct stm_drvdata - specifics associated to an STM component
    115 * @base:		memory mapped base address for this component.
    116 * @atclk:		optional clock for the core parts of the STM.
    117 * @csdev:		component vitals needed by the framework.
    118 * @spinlock:		only one at a time pls.
    119 * @chs:		the channels accociated to this STM.
    120 * @stm:		structure associated to the generic STM interface.
    121 * @mode:		this tracer's mode, i.e sysFS, or disabled.
    122 * @traceid:		value of the current ID for this component.
    123 * @write_bytes:	Maximus bytes this STM can write at a time.
    124 * @stmsper:		settings for register STMSPER.
    125 * @stmspscr:		settings for register STMSPSCR.
    126 * @numsp:		the total number of stimulus port support by this STM.
    127 * @stmheer:		settings for register STMHEER.
    128 * @stmheter:		settings for register STMHETER.
    129 * @stmhebsr:		settings for register STMHEBSR.
    130 */
    131struct stm_drvdata {
    132	void __iomem		*base;
    133	struct clk		*atclk;
    134	struct coresight_device	*csdev;
    135	spinlock_t		spinlock;
    136	struct channel_space	chs;
    137	struct stm_data		stm;
    138	local_t			mode;
    139	u8			traceid;
    140	u32			write_bytes;
    141	u32			stmsper;
    142	u32			stmspscr;
    143	u32			numsp;
    144	u32			stmheer;
    145	u32			stmheter;
    146	u32			stmhebsr;
    147};
    148
    149static void stm_hwevent_enable_hw(struct stm_drvdata *drvdata)
    150{
    151	CS_UNLOCK(drvdata->base);
    152
    153	writel_relaxed(drvdata->stmhebsr, drvdata->base + STMHEBSR);
    154	writel_relaxed(drvdata->stmheter, drvdata->base + STMHETER);
    155	writel_relaxed(drvdata->stmheer, drvdata->base + STMHEER);
    156	writel_relaxed(0x01 |	/* Enable HW event tracing */
    157		       0x04,	/* Error detection on event tracing */
    158		       drvdata->base + STMHEMCR);
    159
    160	CS_LOCK(drvdata->base);
    161}
    162
    163static void stm_port_enable_hw(struct stm_drvdata *drvdata)
    164{
    165	CS_UNLOCK(drvdata->base);
    166	/* ATB trigger enable on direct writes to TRIG locations */
    167	writel_relaxed(0x10,
    168		       drvdata->base + STMSPTRIGCSR);
    169	writel_relaxed(drvdata->stmspscr, drvdata->base + STMSPSCR);
    170	writel_relaxed(drvdata->stmsper, drvdata->base + STMSPER);
    171
    172	CS_LOCK(drvdata->base);
    173}
    174
    175static void stm_enable_hw(struct stm_drvdata *drvdata)
    176{
    177	if (drvdata->stmheer)
    178		stm_hwevent_enable_hw(drvdata);
    179
    180	stm_port_enable_hw(drvdata);
    181
    182	CS_UNLOCK(drvdata->base);
    183
    184	/* 4096 byte between synchronisation packets */
    185	writel_relaxed(0xFFF, drvdata->base + STMSYNCR);
    186	writel_relaxed((drvdata->traceid << 16 | /* trace id */
    187			0x02 |			 /* timestamp enable */
    188			0x01),			 /* global STM enable */
    189			drvdata->base + STMTCSR);
    190
    191	CS_LOCK(drvdata->base);
    192}
    193
    194static int stm_enable(struct coresight_device *csdev,
    195		      struct perf_event *event, u32 mode)
    196{
    197	u32 val;
    198	struct stm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
    199
    200	if (mode != CS_MODE_SYSFS)
    201		return -EINVAL;
    202
    203	val = local_cmpxchg(&drvdata->mode, CS_MODE_DISABLED, mode);
    204
    205	/* Someone is already using the tracer */
    206	if (val)
    207		return -EBUSY;
    208
    209	pm_runtime_get_sync(csdev->dev.parent);
    210
    211	spin_lock(&drvdata->spinlock);
    212	stm_enable_hw(drvdata);
    213	spin_unlock(&drvdata->spinlock);
    214
    215	dev_dbg(&csdev->dev, "STM tracing enabled\n");
    216	return 0;
    217}
    218
    219static void stm_hwevent_disable_hw(struct stm_drvdata *drvdata)
    220{
    221	CS_UNLOCK(drvdata->base);
    222
    223	writel_relaxed(0x0, drvdata->base + STMHEMCR);
    224	writel_relaxed(0x0, drvdata->base + STMHEER);
    225	writel_relaxed(0x0, drvdata->base + STMHETER);
    226
    227	CS_LOCK(drvdata->base);
    228}
    229
    230static void stm_port_disable_hw(struct stm_drvdata *drvdata)
    231{
    232	CS_UNLOCK(drvdata->base);
    233
    234	writel_relaxed(0x0, drvdata->base + STMSPER);
    235	writel_relaxed(0x0, drvdata->base + STMSPTRIGCSR);
    236
    237	CS_LOCK(drvdata->base);
    238}
    239
    240static void stm_disable_hw(struct stm_drvdata *drvdata)
    241{
    242	u32 val;
    243
    244	CS_UNLOCK(drvdata->base);
    245
    246	val = readl_relaxed(drvdata->base + STMTCSR);
    247	val &= ~0x1; /* clear global STM enable [0] */
    248	writel_relaxed(val, drvdata->base + STMTCSR);
    249
    250	CS_LOCK(drvdata->base);
    251
    252	stm_port_disable_hw(drvdata);
    253	if (drvdata->stmheer)
    254		stm_hwevent_disable_hw(drvdata);
    255}
    256
    257static void stm_disable(struct coresight_device *csdev,
    258			struct perf_event *event)
    259{
    260	struct stm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
    261	struct csdev_access *csa = &csdev->access;
    262
    263	/*
    264	 * For as long as the tracer isn't disabled another entity can't
    265	 * change its status.  As such we can read the status here without
    266	 * fearing it will change under us.
    267	 */
    268	if (local_read(&drvdata->mode) == CS_MODE_SYSFS) {
    269		spin_lock(&drvdata->spinlock);
    270		stm_disable_hw(drvdata);
    271		spin_unlock(&drvdata->spinlock);
    272
    273		/* Wait until the engine has completely stopped */
    274		coresight_timeout(csa, STMTCSR, STMTCSR_BUSY_BIT, 0);
    275
    276		pm_runtime_put(csdev->dev.parent);
    277
    278		local_set(&drvdata->mode, CS_MODE_DISABLED);
    279		dev_dbg(&csdev->dev, "STM tracing disabled\n");
    280	}
    281}
    282
    283static int stm_trace_id(struct coresight_device *csdev)
    284{
    285	struct stm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
    286
    287	return drvdata->traceid;
    288}
    289
    290static const struct coresight_ops_source stm_source_ops = {
    291	.trace_id	= stm_trace_id,
    292	.enable		= stm_enable,
    293	.disable	= stm_disable,
    294};
    295
    296static const struct coresight_ops stm_cs_ops = {
    297	.source_ops	= &stm_source_ops,
    298};
    299
    300static inline bool stm_addr_unaligned(const void *addr, u8 write_bytes)
    301{
    302	return ((unsigned long)addr & (write_bytes - 1));
    303}
    304
    305static void stm_send(void __iomem *addr, const void *data,
    306		     u32 size, u8 write_bytes)
    307{
    308	u8 paload[8];
    309
    310	if (stm_addr_unaligned(data, write_bytes)) {
    311		memcpy(paload, data, size);
    312		data = paload;
    313	}
    314
    315	/* now we are 64bit/32bit aligned */
    316	switch (size) {
    317#ifdef CONFIG_64BIT
    318	case 8:
    319		writeq_relaxed(*(u64 *)data, addr);
    320		break;
    321#endif
    322	case 4:
    323		writel_relaxed(*(u32 *)data, addr);
    324		break;
    325	case 2:
    326		writew_relaxed(*(u16 *)data, addr);
    327		break;
    328	case 1:
    329		writeb_relaxed(*(u8 *)data, addr);
    330		break;
    331	default:
    332		break;
    333	}
    334}
    335
    336static int stm_generic_link(struct stm_data *stm_data,
    337			    unsigned int master,  unsigned int channel)
    338{
    339	struct stm_drvdata *drvdata = container_of(stm_data,
    340						   struct stm_drvdata, stm);
    341	if (!drvdata || !drvdata->csdev)
    342		return -EINVAL;
    343
    344	return coresight_enable(drvdata->csdev);
    345}
    346
    347static void stm_generic_unlink(struct stm_data *stm_data,
    348			       unsigned int master,  unsigned int channel)
    349{
    350	struct stm_drvdata *drvdata = container_of(stm_data,
    351						   struct stm_drvdata, stm);
    352	if (!drvdata || !drvdata->csdev)
    353		return;
    354
    355	coresight_disable(drvdata->csdev);
    356}
    357
    358static phys_addr_t
    359stm_mmio_addr(struct stm_data *stm_data, unsigned int master,
    360	      unsigned int channel, unsigned int nr_chans)
    361{
    362	struct stm_drvdata *drvdata = container_of(stm_data,
    363						   struct stm_drvdata, stm);
    364	phys_addr_t addr;
    365
    366	addr = drvdata->chs.phys + channel * BYTES_PER_CHANNEL;
    367
    368	if (offset_in_page(addr) ||
    369	    offset_in_page(nr_chans * BYTES_PER_CHANNEL))
    370		return 0;
    371
    372	return addr;
    373}
    374
    375static long stm_generic_set_options(struct stm_data *stm_data,
    376				    unsigned int master,
    377				    unsigned int channel,
    378				    unsigned int nr_chans,
    379				    unsigned long options)
    380{
    381	struct stm_drvdata *drvdata = container_of(stm_data,
    382						   struct stm_drvdata, stm);
    383	if (!(drvdata && local_read(&drvdata->mode)))
    384		return -EINVAL;
    385
    386	if (channel >= drvdata->numsp)
    387		return -EINVAL;
    388
    389	switch (options) {
    390	case STM_OPTION_GUARANTEED:
    391		set_bit(channel, drvdata->chs.guaranteed);
    392		break;
    393
    394	case STM_OPTION_INVARIANT:
    395		clear_bit(channel, drvdata->chs.guaranteed);
    396		break;
    397
    398	default:
    399		return -EINVAL;
    400	}
    401
    402	return 0;
    403}
    404
    405static ssize_t notrace stm_generic_packet(struct stm_data *stm_data,
    406				  unsigned int master,
    407				  unsigned int channel,
    408				  unsigned int packet,
    409				  unsigned int flags,
    410				  unsigned int size,
    411				  const unsigned char *payload)
    412{
    413	void __iomem *ch_addr;
    414	struct stm_drvdata *drvdata = container_of(stm_data,
    415						   struct stm_drvdata, stm);
    416	unsigned int stm_flags;
    417
    418	if (!(drvdata && local_read(&drvdata->mode)))
    419		return -EACCES;
    420
    421	if (channel >= drvdata->numsp)
    422		return -EINVAL;
    423
    424	ch_addr = stm_channel_addr(drvdata, channel);
    425
    426	stm_flags = (flags & STP_PACKET_TIMESTAMPED) ?
    427			STM_FLAG_TIMESTAMPED : 0;
    428	stm_flags |= test_bit(channel, drvdata->chs.guaranteed) ?
    429			   STM_FLAG_GUARANTEED : 0;
    430
    431	if (size > drvdata->write_bytes)
    432		size = drvdata->write_bytes;
    433	else
    434		size = rounddown_pow_of_two(size);
    435
    436	switch (packet) {
    437	case STP_PACKET_FLAG:
    438		ch_addr += stm_channel_off(STM_PKT_TYPE_FLAG, stm_flags);
    439
    440		/*
    441		 * The generic STM core sets a size of '0' on flag packets.
    442		 * As such send a flag packet of size '1' and tell the
    443		 * core we did so.
    444		 */
    445		stm_send(ch_addr, payload, 1, drvdata->write_bytes);
    446		size = 1;
    447		break;
    448
    449	case STP_PACKET_DATA:
    450		stm_flags |= (flags & STP_PACKET_MARKED) ? STM_FLAG_MARKED : 0;
    451		ch_addr += stm_channel_off(STM_PKT_TYPE_DATA, stm_flags);
    452		stm_send(ch_addr, payload, size,
    453				drvdata->write_bytes);
    454		break;
    455
    456	default:
    457		return -ENOTSUPP;
    458	}
    459
    460	return size;
    461}
    462
    463static ssize_t hwevent_enable_show(struct device *dev,
    464				   struct device_attribute *attr, char *buf)
    465{
    466	struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    467	unsigned long val = drvdata->stmheer;
    468
    469	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    470}
    471
    472static ssize_t hwevent_enable_store(struct device *dev,
    473				    struct device_attribute *attr,
    474				    const char *buf, size_t size)
    475{
    476	struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    477	unsigned long val;
    478	int ret = 0;
    479
    480	ret = kstrtoul(buf, 16, &val);
    481	if (ret)
    482		return -EINVAL;
    483
    484	drvdata->stmheer = val;
    485	/* HW event enable and trigger go hand in hand */
    486	drvdata->stmheter = val;
    487
    488	return size;
    489}
    490static DEVICE_ATTR_RW(hwevent_enable);
    491
    492static ssize_t hwevent_select_show(struct device *dev,
    493				   struct device_attribute *attr, char *buf)
    494{
    495	struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    496	unsigned long val = drvdata->stmhebsr;
    497
    498	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    499}
    500
    501static ssize_t hwevent_select_store(struct device *dev,
    502				    struct device_attribute *attr,
    503				    const char *buf, size_t size)
    504{
    505	struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    506	unsigned long val;
    507	int ret = 0;
    508
    509	ret = kstrtoul(buf, 16, &val);
    510	if (ret)
    511		return -EINVAL;
    512
    513	drvdata->stmhebsr = val;
    514
    515	return size;
    516}
    517static DEVICE_ATTR_RW(hwevent_select);
    518
    519static ssize_t port_select_show(struct device *dev,
    520				struct device_attribute *attr, char *buf)
    521{
    522	struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    523	unsigned long val;
    524
    525	if (!local_read(&drvdata->mode)) {
    526		val = drvdata->stmspscr;
    527	} else {
    528		spin_lock(&drvdata->spinlock);
    529		val = readl_relaxed(drvdata->base + STMSPSCR);
    530		spin_unlock(&drvdata->spinlock);
    531	}
    532
    533	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    534}
    535
    536static ssize_t port_select_store(struct device *dev,
    537				 struct device_attribute *attr,
    538				 const char *buf, size_t size)
    539{
    540	struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    541	unsigned long val, stmsper;
    542	int ret = 0;
    543
    544	ret = kstrtoul(buf, 16, &val);
    545	if (ret)
    546		return ret;
    547
    548	spin_lock(&drvdata->spinlock);
    549	drvdata->stmspscr = val;
    550
    551	if (local_read(&drvdata->mode)) {
    552		CS_UNLOCK(drvdata->base);
    553		/* Process as per ARM's TRM recommendation */
    554		stmsper = readl_relaxed(drvdata->base + STMSPER);
    555		writel_relaxed(0x0, drvdata->base + STMSPER);
    556		writel_relaxed(drvdata->stmspscr, drvdata->base + STMSPSCR);
    557		writel_relaxed(stmsper, drvdata->base + STMSPER);
    558		CS_LOCK(drvdata->base);
    559	}
    560	spin_unlock(&drvdata->spinlock);
    561
    562	return size;
    563}
    564static DEVICE_ATTR_RW(port_select);
    565
    566static ssize_t port_enable_show(struct device *dev,
    567				struct device_attribute *attr, char *buf)
    568{
    569	struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    570	unsigned long val;
    571
    572	if (!local_read(&drvdata->mode)) {
    573		val = drvdata->stmsper;
    574	} else {
    575		spin_lock(&drvdata->spinlock);
    576		val = readl_relaxed(drvdata->base + STMSPER);
    577		spin_unlock(&drvdata->spinlock);
    578	}
    579
    580	return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
    581}
    582
    583static ssize_t port_enable_store(struct device *dev,
    584				 struct device_attribute *attr,
    585				 const char *buf, size_t size)
    586{
    587	struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    588	unsigned long val;
    589	int ret = 0;
    590
    591	ret = kstrtoul(buf, 16, &val);
    592	if (ret)
    593		return ret;
    594
    595	spin_lock(&drvdata->spinlock);
    596	drvdata->stmsper = val;
    597
    598	if (local_read(&drvdata->mode)) {
    599		CS_UNLOCK(drvdata->base);
    600		writel_relaxed(drvdata->stmsper, drvdata->base + STMSPER);
    601		CS_LOCK(drvdata->base);
    602	}
    603	spin_unlock(&drvdata->spinlock);
    604
    605	return size;
    606}
    607static DEVICE_ATTR_RW(port_enable);
    608
    609static ssize_t traceid_show(struct device *dev,
    610			    struct device_attribute *attr, char *buf)
    611{
    612	unsigned long val;
    613	struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    614
    615	val = drvdata->traceid;
    616	return sprintf(buf, "%#lx\n", val);
    617}
    618
    619static ssize_t traceid_store(struct device *dev,
    620			     struct device_attribute *attr,
    621			     const char *buf, size_t size)
    622{
    623	int ret;
    624	unsigned long val;
    625	struct stm_drvdata *drvdata = dev_get_drvdata(dev->parent);
    626
    627	ret = kstrtoul(buf, 16, &val);
    628	if (ret)
    629		return ret;
    630
    631	/* traceid field is 7bit wide on STM32 */
    632	drvdata->traceid = val & 0x7f;
    633	return size;
    634}
    635static DEVICE_ATTR_RW(traceid);
    636
    637#define coresight_stm_reg(name, offset)	\
    638	coresight_simple_reg32(struct stm_drvdata, name, offset)
    639
    640coresight_stm_reg(tcsr, STMTCSR);
    641coresight_stm_reg(tsfreqr, STMTSFREQR);
    642coresight_stm_reg(syncr, STMSYNCR);
    643coresight_stm_reg(sper, STMSPER);
    644coresight_stm_reg(spter, STMSPTER);
    645coresight_stm_reg(privmaskr, STMPRIVMASKR);
    646coresight_stm_reg(spscr, STMSPSCR);
    647coresight_stm_reg(spmscr, STMSPMSCR);
    648coresight_stm_reg(spfeat1r, STMSPFEAT1R);
    649coresight_stm_reg(spfeat2r, STMSPFEAT2R);
    650coresight_stm_reg(spfeat3r, STMSPFEAT3R);
    651coresight_stm_reg(devid, CORESIGHT_DEVID);
    652
    653static struct attribute *coresight_stm_attrs[] = {
    654	&dev_attr_hwevent_enable.attr,
    655	&dev_attr_hwevent_select.attr,
    656	&dev_attr_port_enable.attr,
    657	&dev_attr_port_select.attr,
    658	&dev_attr_traceid.attr,
    659	NULL,
    660};
    661
    662static struct attribute *coresight_stm_mgmt_attrs[] = {
    663	&dev_attr_tcsr.attr,
    664	&dev_attr_tsfreqr.attr,
    665	&dev_attr_syncr.attr,
    666	&dev_attr_sper.attr,
    667	&dev_attr_spter.attr,
    668	&dev_attr_privmaskr.attr,
    669	&dev_attr_spscr.attr,
    670	&dev_attr_spmscr.attr,
    671	&dev_attr_spfeat1r.attr,
    672	&dev_attr_spfeat2r.attr,
    673	&dev_attr_spfeat3r.attr,
    674	&dev_attr_devid.attr,
    675	NULL,
    676};
    677
    678static const struct attribute_group coresight_stm_group = {
    679	.attrs = coresight_stm_attrs,
    680};
    681
    682static const struct attribute_group coresight_stm_mgmt_group = {
    683	.attrs = coresight_stm_mgmt_attrs,
    684	.name = "mgmt",
    685};
    686
    687static const struct attribute_group *coresight_stm_groups[] = {
    688	&coresight_stm_group,
    689	&coresight_stm_mgmt_group,
    690	NULL,
    691};
    692
    693#ifdef CONFIG_OF
    694static int of_stm_get_stimulus_area(struct device *dev, struct resource *res)
    695{
    696	const char *name = NULL;
    697	int index = 0, found = 0;
    698	struct device_node *np = dev->of_node;
    699
    700	while (!of_property_read_string_index(np, "reg-names", index, &name)) {
    701		if (strcmp("stm-stimulus-base", name)) {
    702			index++;
    703			continue;
    704		}
    705
    706		/* We have a match and @index is where it's at */
    707		found = 1;
    708		break;
    709	}
    710
    711	if (!found)
    712		return -EINVAL;
    713
    714	return of_address_to_resource(np, index, res);
    715}
    716#else
    717static inline int of_stm_get_stimulus_area(struct device *dev,
    718					   struct resource *res)
    719{
    720	return -ENOENT;
    721}
    722#endif
    723
    724#ifdef CONFIG_ACPI
    725static int acpi_stm_get_stimulus_area(struct device *dev, struct resource *res)
    726{
    727	int rc;
    728	bool found_base = false;
    729	struct resource_entry *rent;
    730	LIST_HEAD(res_list);
    731
    732	struct acpi_device *adev = ACPI_COMPANION(dev);
    733
    734	rc = acpi_dev_get_resources(adev, &res_list, NULL, NULL);
    735	if (rc < 0)
    736		return rc;
    737
    738	/*
    739	 * The stimulus base for STM device must be listed as the second memory
    740	 * resource, followed by the programming base address as described in
    741	 * "Section 2.3 Resources" in ACPI for CoreSightTM 1.0 Platform Design
    742	 * document (DEN0067).
    743	 */
    744	rc = -ENOENT;
    745	list_for_each_entry(rent, &res_list, node) {
    746		if (resource_type(rent->res) != IORESOURCE_MEM)
    747			continue;
    748		if (found_base) {
    749			*res = *rent->res;
    750			rc = 0;
    751			break;
    752		}
    753
    754		found_base = true;
    755	}
    756
    757	acpi_dev_free_resource_list(&res_list);
    758	return rc;
    759}
    760#else
    761static inline int acpi_stm_get_stimulus_area(struct device *dev,
    762					     struct resource *res)
    763{
    764	return -ENOENT;
    765}
    766#endif
    767
    768static int stm_get_stimulus_area(struct device *dev, struct resource *res)
    769{
    770	struct fwnode_handle *fwnode = dev_fwnode(dev);
    771
    772	if (is_of_node(fwnode))
    773		return of_stm_get_stimulus_area(dev, res);
    774	else if (is_acpi_node(fwnode))
    775		return acpi_stm_get_stimulus_area(dev, res);
    776	return -ENOENT;
    777}
    778
    779static u32 stm_fundamental_data_size(struct stm_drvdata *drvdata)
    780{
    781	u32 stmspfeat2r;
    782
    783	if (!IS_ENABLED(CONFIG_64BIT))
    784		return 4;
    785
    786	stmspfeat2r = readl_relaxed(drvdata->base + STMSPFEAT2R);
    787
    788	/*
    789	 * bit[15:12] represents the fundamental data size
    790	 * 0 - 32-bit data
    791	 * 1 - 64-bit data
    792	 */
    793	return BMVAL(stmspfeat2r, 12, 15) ? 8 : 4;
    794}
    795
    796static u32 stm_num_stimulus_port(struct stm_drvdata *drvdata)
    797{
    798	u32 numsp;
    799
    800	numsp = readl_relaxed(drvdata->base + CORESIGHT_DEVID);
    801	/*
    802	 * NUMPS in STMDEVID is 17 bit long and if equal to 0x0,
    803	 * 32 stimulus ports are supported.
    804	 */
    805	numsp &= 0x1ffff;
    806	if (!numsp)
    807		numsp = STM_32_CHANNEL;
    808	return numsp;
    809}
    810
    811static void stm_init_default_data(struct stm_drvdata *drvdata)
    812{
    813	/* Don't use port selection */
    814	drvdata->stmspscr = 0x0;
    815	/*
    816	 * Enable all channel regardless of their number.  When port
    817	 * selection isn't used (see above) STMSPER applies to all
    818	 * 32 channel group available, hence setting all 32 bits to 1
    819	 */
    820	drvdata->stmsper = ~0x0;
    821
    822	/*
    823	 * The trace ID value for *ETM* tracers start at CPU_ID * 2 + 0x10 and
    824	 * anything equal to or higher than 0x70 is reserved.  Since 0x00 is
    825	 * also reserved the STM trace ID needs to be higher than 0x00 and
    826	 * lowner than 0x10.
    827	 */
    828	drvdata->traceid = 0x1;
    829
    830	/* Set invariant transaction timing on all channels */
    831	bitmap_clear(drvdata->chs.guaranteed, 0, drvdata->numsp);
    832}
    833
    834static void stm_init_generic_data(struct stm_drvdata *drvdata,
    835				  const char *name)
    836{
    837	drvdata->stm.name = name;
    838
    839	/*
    840	 * MasterIDs are assigned at HW design phase. As such the core is
    841	 * using a single master for interaction with this device.
    842	 */
    843	drvdata->stm.sw_start = 1;
    844	drvdata->stm.sw_end = 1;
    845	drvdata->stm.hw_override = true;
    846	drvdata->stm.sw_nchannels = drvdata->numsp;
    847	drvdata->stm.sw_mmiosz = BYTES_PER_CHANNEL;
    848	drvdata->stm.packet = stm_generic_packet;
    849	drvdata->stm.mmio_addr = stm_mmio_addr;
    850	drvdata->stm.link = stm_generic_link;
    851	drvdata->stm.unlink = stm_generic_unlink;
    852	drvdata->stm.set_options = stm_generic_set_options;
    853}
    854
    855static int stm_probe(struct amba_device *adev, const struct amba_id *id)
    856{
    857	int ret;
    858	void __iomem *base;
    859	struct device *dev = &adev->dev;
    860	struct coresight_platform_data *pdata = NULL;
    861	struct stm_drvdata *drvdata;
    862	struct resource *res = &adev->res;
    863	struct resource ch_res;
    864	struct coresight_desc desc = { 0 };
    865
    866	desc.name = coresight_alloc_device_name(&stm_devs, dev);
    867	if (!desc.name)
    868		return -ENOMEM;
    869
    870	drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
    871	if (!drvdata)
    872		return -ENOMEM;
    873
    874	drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */
    875	if (!IS_ERR(drvdata->atclk)) {
    876		ret = clk_prepare_enable(drvdata->atclk);
    877		if (ret)
    878			return ret;
    879	}
    880	dev_set_drvdata(dev, drvdata);
    881
    882	base = devm_ioremap_resource(dev, res);
    883	if (IS_ERR(base))
    884		return PTR_ERR(base);
    885	drvdata->base = base;
    886	desc.access = CSDEV_ACCESS_IOMEM(base);
    887
    888	ret = stm_get_stimulus_area(dev, &ch_res);
    889	if (ret)
    890		return ret;
    891	drvdata->chs.phys = ch_res.start;
    892
    893	base = devm_ioremap_resource(dev, &ch_res);
    894	if (IS_ERR(base))
    895		return PTR_ERR(base);
    896	drvdata->chs.base = base;
    897
    898	drvdata->write_bytes = stm_fundamental_data_size(drvdata);
    899
    900	if (boot_nr_channel)
    901		drvdata->numsp = boot_nr_channel;
    902	else
    903		drvdata->numsp = stm_num_stimulus_port(drvdata);
    904
    905	drvdata->chs.guaranteed = devm_bitmap_zalloc(dev, drvdata->numsp,
    906						     GFP_KERNEL);
    907	if (!drvdata->chs.guaranteed)
    908		return -ENOMEM;
    909
    910	spin_lock_init(&drvdata->spinlock);
    911
    912	stm_init_default_data(drvdata);
    913	stm_init_generic_data(drvdata, desc.name);
    914
    915	if (stm_register_device(dev, &drvdata->stm, THIS_MODULE)) {
    916		dev_info(dev,
    917			 "%s : stm_register_device failed, probing deferred\n",
    918			 desc.name);
    919		return -EPROBE_DEFER;
    920	}
    921
    922	pdata = coresight_get_platform_data(dev);
    923	if (IS_ERR(pdata)) {
    924		ret = PTR_ERR(pdata);
    925		goto stm_unregister;
    926	}
    927	adev->dev.platform_data = pdata;
    928
    929	desc.type = CORESIGHT_DEV_TYPE_SOURCE;
    930	desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE;
    931	desc.ops = &stm_cs_ops;
    932	desc.pdata = pdata;
    933	desc.dev = dev;
    934	desc.groups = coresight_stm_groups;
    935	drvdata->csdev = coresight_register(&desc);
    936	if (IS_ERR(drvdata->csdev)) {
    937		ret = PTR_ERR(drvdata->csdev);
    938		goto stm_unregister;
    939	}
    940
    941	pm_runtime_put(&adev->dev);
    942
    943	dev_info(&drvdata->csdev->dev, "%s initialized\n",
    944		 (char *)coresight_get_uci_data(id));
    945	return 0;
    946
    947stm_unregister:
    948	stm_unregister_device(&drvdata->stm);
    949	return ret;
    950}
    951
    952static void stm_remove(struct amba_device *adev)
    953{
    954	struct stm_drvdata *drvdata = dev_get_drvdata(&adev->dev);
    955
    956	coresight_unregister(drvdata->csdev);
    957
    958	stm_unregister_device(&drvdata->stm);
    959}
    960
    961#ifdef CONFIG_PM
    962static int stm_runtime_suspend(struct device *dev)
    963{
    964	struct stm_drvdata *drvdata = dev_get_drvdata(dev);
    965
    966	if (drvdata && !IS_ERR(drvdata->atclk))
    967		clk_disable_unprepare(drvdata->atclk);
    968
    969	return 0;
    970}
    971
    972static int stm_runtime_resume(struct device *dev)
    973{
    974	struct stm_drvdata *drvdata = dev_get_drvdata(dev);
    975
    976	if (drvdata && !IS_ERR(drvdata->atclk))
    977		clk_prepare_enable(drvdata->atclk);
    978
    979	return 0;
    980}
    981#endif
    982
    983static const struct dev_pm_ops stm_dev_pm_ops = {
    984	SET_RUNTIME_PM_OPS(stm_runtime_suspend, stm_runtime_resume, NULL)
    985};
    986
    987static const struct amba_id stm_ids[] = {
    988	CS_AMBA_ID_DATA(0x000bb962, "STM32"),
    989	CS_AMBA_ID_DATA(0x000bb963, "STM500"),
    990	{ 0, 0},
    991};
    992
    993MODULE_DEVICE_TABLE(amba, stm_ids);
    994
    995static struct amba_driver stm_driver = {
    996	.drv = {
    997		.name   = "coresight-stm",
    998		.owner	= THIS_MODULE,
    999		.pm	= &stm_dev_pm_ops,
   1000		.suppress_bind_attrs = true,
   1001	},
   1002	.probe          = stm_probe,
   1003	.remove         = stm_remove,
   1004	.id_table	= stm_ids,
   1005};
   1006
   1007module_amba_driver(stm_driver);
   1008
   1009MODULE_AUTHOR("Pratik Patel <pratikp@codeaurora.org>");
   1010MODULE_DESCRIPTION("Arm CoreSight System Trace Macrocell driver");
   1011MODULE_LICENSE("GPL v2");