xref: /openbmc/linux/drivers/hwtracing/coresight/coresight-tmc.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1ad0dfdfdSMathieu Poirier /* SPDX-License-Identifier: GPL-2.0 */
24c324b5fSMathieu Poirier /*
34c324b5fSMathieu Poirier  * Copyright(C) 2015 Linaro Limited. All rights reserved.
44c324b5fSMathieu Poirier  * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
54c324b5fSMathieu Poirier  */
64c324b5fSMathieu Poirier 
74c324b5fSMathieu Poirier #ifndef _CORESIGHT_TMC_H
84c324b5fSMathieu Poirier #define _CORESIGHT_TMC_H
94c324b5fSMathieu Poirier 
1099443ea1SSuzuki K Poulose #include <linux/dma-mapping.h>
11c5ff7344SMathieu Poirier #include <linux/idr.h>
126c6ed1e2SMathieu Poirier #include <linux/miscdevice.h>
13c5ff7344SMathieu Poirier #include <linux/mutex.h>
1457549999SMathieu Poirier #include <linux/refcount.h>
156c6ed1e2SMathieu Poirier 
164c324b5fSMathieu Poirier #define TMC_RSZ			0x004
174c324b5fSMathieu Poirier #define TMC_STS			0x00c
184c324b5fSMathieu Poirier #define TMC_RRD			0x010
194c324b5fSMathieu Poirier #define TMC_RRP			0x014
204c324b5fSMathieu Poirier #define TMC_RWP			0x018
214c324b5fSMathieu Poirier #define TMC_TRG			0x01c
224c324b5fSMathieu Poirier #define TMC_CTL			0x020
234c324b5fSMathieu Poirier #define TMC_RWD			0x024
244c324b5fSMathieu Poirier #define TMC_MODE		0x028
254c324b5fSMathieu Poirier #define TMC_LBUFLEVEL		0x02c
264c324b5fSMathieu Poirier #define TMC_CBUFLEVEL		0x030
274c324b5fSMathieu Poirier #define TMC_BUFWM		0x034
284c324b5fSMathieu Poirier #define TMC_RRPHI		0x038
294c324b5fSMathieu Poirier #define TMC_RWPHI		0x03c
304c324b5fSMathieu Poirier #define TMC_AXICTL		0x110
314c324b5fSMathieu Poirier #define TMC_DBALO		0x118
324c324b5fSMathieu Poirier #define TMC_DBAHI		0x11c
334c324b5fSMathieu Poirier #define TMC_FFSR		0x300
344c324b5fSMathieu Poirier #define TMC_FFCR		0x304
354c324b5fSMathieu Poirier #define TMC_PSCR		0x308
364c324b5fSMathieu Poirier #define TMC_ITMISCOP0		0xee0
374c324b5fSMathieu Poirier #define TMC_ITTRFLIN		0xee8
384c324b5fSMathieu Poirier #define TMC_ITATBDATA0		0xeec
394c324b5fSMathieu Poirier #define TMC_ITATBCTR2		0xef0
404c324b5fSMathieu Poirier #define TMC_ITATBCTR1		0xef4
414c324b5fSMathieu Poirier #define TMC_ITATBCTR0		0xef8
428a4bc4f1SSuzuki K Poulose #define TMC_AUTHSTATUS		0xfb8
434c324b5fSMathieu Poirier 
444c324b5fSMathieu Poirier /* register description */
454c324b5fSMathieu Poirier /* TMC_CTL - 0x020 */
464c324b5fSMathieu Poirier #define TMC_CTL_CAPT_EN		BIT(0)
474c324b5fSMathieu Poirier /* TMC_STS - 0x00C */
48a8ab4268SMathieu Poirier #define TMC_STS_TMCREADY_BIT	2
492e499bbcSMathieu Poirier #define TMC_STS_FULL		BIT(0)
504c324b5fSMathieu Poirier #define TMC_STS_TRIGGERED	BIT(1)
51f52ff9b7SSuzuki K Poulose #define TMC_STS_MEMERR		BIT(5)
52cd407abdSSuzuki K Poulose /*
53cd407abdSSuzuki K Poulose  * TMC_AXICTL - 0x110
54cd407abdSSuzuki K Poulose  *
55cd407abdSSuzuki K Poulose  * TMC AXICTL format for SoC-400
56cd407abdSSuzuki K Poulose  *	Bits [0-1]	: ProtCtrlBit0-1
57ebab6a7dSSuzuki K Poulose  *	Bits [2-5]	: CacheCtrlBits 0-3 (AXCACHE)
58cd407abdSSuzuki K Poulose  *	Bit  6		: Reserved
59cd407abdSSuzuki K Poulose  *	Bit  7		: ScatterGatherMode
60cd407abdSSuzuki K Poulose  *	Bits [8-11]	: WrBurstLen
61cd407abdSSuzuki K Poulose  *	Bits [12-31]	: Reserved.
62ebab6a7dSSuzuki K Poulose  * TMC AXICTL format for SoC-600, as above except:
63ebab6a7dSSuzuki K Poulose  *	Bits [2-5]	: AXI WCACHE
64ebab6a7dSSuzuki K Poulose  *	Bits [16-19]	: AXI RCACHE
65ebab6a7dSSuzuki K Poulose  *	Bits [20-31]	: Reserved
66cd407abdSSuzuki K Poulose  */
67cd407abdSSuzuki K Poulose #define TMC_AXICTL_CLEAR_MASK 0xfbf
68ebab6a7dSSuzuki K Poulose #define TMC_AXICTL_ARCACHE_MASK (0xf << 16)
69cd407abdSSuzuki K Poulose 
704c324b5fSMathieu Poirier #define TMC_AXICTL_PROT_CTL_B0	BIT(0)
714c324b5fSMathieu Poirier #define TMC_AXICTL_PROT_CTL_B1	BIT(1)
724c324b5fSMathieu Poirier #define TMC_AXICTL_SCT_GAT_MODE	BIT(7)
734d5d88baSTanmay Jagdale #define TMC_AXICTL_WR_BURST(v)	(((v) & 0xf) << 8)
744d5d88baSTanmay Jagdale #define TMC_AXICTL_WR_BURST_16	0xf
75cd407abdSSuzuki K Poulose /* Write-back Read and Write-allocate */
76cd407abdSSuzuki K Poulose #define TMC_AXICTL_AXCACHE_OS	(0xf << 2)
77ebab6a7dSSuzuki K Poulose #define TMC_AXICTL_ARCACHE_OS	(0xf << 16)
78cd407abdSSuzuki K Poulose 
794c324b5fSMathieu Poirier /* TMC_FFCR - 0x304 */
80a8ab4268SMathieu Poirier #define TMC_FFCR_FLUSHMAN_BIT	6
814c324b5fSMathieu Poirier #define TMC_FFCR_EN_FMT		BIT(0)
824c324b5fSMathieu Poirier #define TMC_FFCR_EN_TI		BIT(1)
834c324b5fSMathieu Poirier #define TMC_FFCR_FON_FLIN	BIT(4)
844c324b5fSMathieu Poirier #define TMC_FFCR_FON_TRIG_EVT	BIT(5)
854c324b5fSMathieu Poirier #define TMC_FFCR_TRIGON_TRIGIN	BIT(8)
864c324b5fSMathieu Poirier #define TMC_FFCR_STOP_ON_FLUSH	BIT(12)
874c324b5fSMathieu Poirier 
884c324b5fSMathieu Poirier 
892e219345SSuzuki K Poulose #define TMC_DEVID_NOSCAT	BIT(24)
902e219345SSuzuki K Poulose 
91ff11f5bcSSuzuki K Poulose #define TMC_DEVID_AXIAW_VALID	BIT(16)
92ff11f5bcSSuzuki K Poulose #define TMC_DEVID_AXIAW_SHIFT	17
93ff11f5bcSSuzuki K Poulose #define TMC_DEVID_AXIAW_MASK	0x7f
94ff11f5bcSSuzuki K Poulose 
958a4bc4f1SSuzuki K Poulose #define TMC_AUTH_NSID_MASK	GENMASK(1, 0)
968a4bc4f1SSuzuki K Poulose 
974c324b5fSMathieu Poirier enum tmc_config_type {
984c324b5fSMathieu Poirier 	TMC_CONFIG_TYPE_ETB,
994c324b5fSMathieu Poirier 	TMC_CONFIG_TYPE_ETR,
1004c324b5fSMathieu Poirier 	TMC_CONFIG_TYPE_ETF,
1014c324b5fSMathieu Poirier };
1024c324b5fSMathieu Poirier 
1034c324b5fSMathieu Poirier enum tmc_mode {
1044c324b5fSMathieu Poirier 	TMC_MODE_CIRCULAR_BUFFER,
1054c324b5fSMathieu Poirier 	TMC_MODE_SOFTWARE_FIFO,
1064c324b5fSMathieu Poirier 	TMC_MODE_HARDWARE_FIFO,
1074c324b5fSMathieu Poirier };
1084c324b5fSMathieu Poirier 
1094c324b5fSMathieu Poirier enum tmc_mem_intf_width {
1104f1ff3deSMathieu Poirier 	TMC_MEM_INTF_WIDTH_32BITS	= 1,
1114f1ff3deSMathieu Poirier 	TMC_MEM_INTF_WIDTH_64BITS	= 2,
1124f1ff3deSMathieu Poirier 	TMC_MEM_INTF_WIDTH_128BITS	= 4,
1134f1ff3deSMathieu Poirier 	TMC_MEM_INTF_WIDTH_256BITS	= 8,
1144c324b5fSMathieu Poirier };
1154c324b5fSMathieu Poirier 
1162e219345SSuzuki K Poulose /* TMC ETR Capability bit definitions */
1172e219345SSuzuki K Poulose #define TMC_ETR_SG			(0x1U << 0)
118ebab6a7dSSuzuki K Poulose /* ETR has separate read/write cache encodings */
119ebab6a7dSSuzuki K Poulose #define TMC_ETR_AXI_ARCACHE		(0x1U << 1)
120f2e931a2SSuzuki K Poulose /*
121f2e931a2SSuzuki K Poulose  * TMC_ETR_SAVE_RESTORE - Values of RRP/RWP/STS.Full are
122f2e931a2SSuzuki K Poulose  * retained when TMC leaves Disabled state, allowing us to continue
123f2e931a2SSuzuki K Poulose  * the tracing from a point where we stopped. This also implies that
124f2e931a2SSuzuki K Poulose  * the RRP/RWP/STS.Full should always be programmed to the correct
125f2e931a2SSuzuki K Poulose  * value. Unfortunately this is not advertised by the hardware,
126f2e931a2SSuzuki K Poulose  * so we have to rely on PID of the IP to detect the functionality.
127f2e931a2SSuzuki K Poulose  */
128f2e931a2SSuzuki K Poulose #define TMC_ETR_SAVE_RESTORE		(0x1U << 2)
1292e219345SSuzuki K Poulose 
1306495892cSSuzuki K Poulose /* Coresight SoC-600 TMC-ETR unadvertised capabilities */
1316495892cSSuzuki K Poulose #define CORESIGHT_SOC_600_ETR_CAPS	\
1326495892cSSuzuki K Poulose 	(TMC_ETR_SAVE_RESTORE | TMC_ETR_AXI_ARCACHE)
1336495892cSSuzuki K Poulose 
13475f4e361SSuzuki K Poulose enum etr_mode {
13575f4e361SSuzuki K Poulose 	ETR_MODE_FLAT,		/* Uses contiguous flat buffer */
136e8e3b771SSuzuki K Poulose 	ETR_MODE_ETR_SG,	/* Uses in-built TMC ETR SG mechanism */
137434d611cSSuzuki K Poulose 	ETR_MODE_CATU,		/* Use SG mechanism in CATU */
13875f4e361SSuzuki K Poulose };
13975f4e361SSuzuki K Poulose 
14075f4e361SSuzuki K Poulose struct etr_buf_operations;
14175f4e361SSuzuki K Poulose 
14275f4e361SSuzuki K Poulose /**
14375f4e361SSuzuki K Poulose  * struct etr_buf - Details of the buffer used by ETR
14457549999SMathieu Poirier  * refcount	; Number of sources currently using this etr_buf.
14575f4e361SSuzuki K Poulose  * @mode	: Mode of the ETR buffer, contiguous, Scatter Gather etc.
14675f4e361SSuzuki K Poulose  * @full	: Trace data overflow
14775f4e361SSuzuki K Poulose  * @size	: Size of the buffer.
14875f4e361SSuzuki K Poulose  * @hwaddr	: Address to be programmed in the TMC:DBA{LO,HI}
14975f4e361SSuzuki K Poulose  * @offset	: Offset of the trace data in the buffer for consumption.
15075f4e361SSuzuki K Poulose  * @len		: Available trace data @buf (may round up to the beginning).
15175f4e361SSuzuki K Poulose  * @ops		: ETR buffer operations for the mode.
15275f4e361SSuzuki K Poulose  * @private	: Backend specific information for the buf
15375f4e361SSuzuki K Poulose  */
15475f4e361SSuzuki K Poulose struct etr_buf {
15557549999SMathieu Poirier 	refcount_t			refcount;
15675f4e361SSuzuki K Poulose 	enum etr_mode			mode;
15775f4e361SSuzuki K Poulose 	bool				full;
15875f4e361SSuzuki K Poulose 	ssize_t				size;
15975f4e361SSuzuki K Poulose 	dma_addr_t			hwaddr;
16075f4e361SSuzuki K Poulose 	unsigned long			offset;
16175f4e361SSuzuki K Poulose 	s64				len;
16275f4e361SSuzuki K Poulose 	const struct etr_buf_operations	*ops;
16375f4e361SSuzuki K Poulose 	void				*private;
16475f4e361SSuzuki K Poulose };
16575f4e361SSuzuki K Poulose 
1664c324b5fSMathieu Poirier /**
1674c324b5fSMathieu Poirier  * struct tmc_drvdata - specifics associated to an TMC component
1684c324b5fSMathieu Poirier  * @base:	memory mapped base address for this component.
1694c324b5fSMathieu Poirier  * @csdev:	component vitals needed by the framework.
1704c324b5fSMathieu Poirier  * @miscdev:	specifics to handle "/dev/xyz.tmc" entry.
1714c324b5fSMathieu Poirier  * @spinlock:	only one at a time pls.
1728d03cfd1SMathieu Poirier  * @pid:	Process ID of the process being monitored by the session
1738d03cfd1SMathieu Poirier  *		that is using this component.
17475f4e361SSuzuki K Poulose  * @buf:	Snapshot of the trace data for ETF/ETB.
17575f4e361SSuzuki K Poulose  * @etr_buf:	details of buffer used in TMC-ETR
17675f4e361SSuzuki K Poulose  * @len:	size of the available trace for ETF/ETB.
17775f4e361SSuzuki K Poulose  * @size:	trace buffer size for this TMC (common for all modes).
1784d5d88baSTanmay Jagdale  * @max_burst_size: The maximum burst size that can be initiated by
1794d5d88baSTanmay Jagdale  *		TMC-ETR on AXI bus.
180f2facc33SMathieu Poirier  * @mode:	how this TMC is being used.
1814c324b5fSMathieu Poirier  * @config_type: TMC variant, must be of type @tmc_config_type.
1824f1ff3deSMathieu Poirier  * @memwidth:	width of the memory interface databus, in bytes.
1834c324b5fSMathieu Poirier  * @trigger_cntr: amount of words to store after a trigger.
1842884132aSSuzuki K Poulose  * @etr_caps:	Bitmask of capabilities of the TMC ETR, inferred from the
1852884132aSSuzuki K Poulose  *		device configuration register (DEVID)
186c5ff7344SMathieu Poirier  * @idr:	Holds etr_bufs allocated for this ETR.
187c5ff7344SMathieu Poirier  * @idr_mutex:	Access serialisation for idr.
188bbedcb91SYabin Cui  * @sysfs_buf:	SYSFS buffer for ETR.
189bbedcb91SYabin Cui  * @perf_buf:	PERF buffer for ETR.
1904c324b5fSMathieu Poirier  */
1914c324b5fSMathieu Poirier struct tmc_drvdata {
1924c324b5fSMathieu Poirier 	void __iomem		*base;
1934c324b5fSMathieu Poirier 	struct coresight_device	*csdev;
1944c324b5fSMathieu Poirier 	struct miscdevice	miscdev;
1954c324b5fSMathieu Poirier 	spinlock_t		spinlock;
1968d03cfd1SMathieu Poirier 	pid_t			pid;
1974c324b5fSMathieu Poirier 	bool			reading;
19875f4e361SSuzuki K Poulose 	union {
19975f4e361SSuzuki K Poulose 		char		*buf;		/* TMC ETB */
20075f4e361SSuzuki K Poulose 		struct etr_buf	*etr_buf;	/* TMC ETR */
20175f4e361SSuzuki K Poulose 	};
2028505feaeSSuzuki K Poulose 	u32			len;
20375f4e361SSuzuki K Poulose 	u32			size;
2044d5d88baSTanmay Jagdale 	u32			max_burst_size;
205297ab90fSSuzuki K. Poulose 	u32			mode;
2064c324b5fSMathieu Poirier 	enum tmc_config_type	config_type;
2074f1ff3deSMathieu Poirier 	enum tmc_mem_intf_width	memwidth;
2084c324b5fSMathieu Poirier 	u32			trigger_cntr;
2092884132aSSuzuki K Poulose 	u32			etr_caps;
210c5ff7344SMathieu Poirier 	struct idr		idr;
211c5ff7344SMathieu Poirier 	struct mutex		idr_mutex;
21296a7f644SSuzuki K Poulose 	struct etr_buf		*sysfs_buf;
213bbedcb91SYabin Cui 	struct etr_buf		*perf_buf;
2144c324b5fSMathieu Poirier };
2154c324b5fSMathieu Poirier 
21675f4e361SSuzuki K Poulose struct etr_buf_operations {
21775f4e361SSuzuki K Poulose 	int (*alloc)(struct tmc_drvdata *drvdata, struct etr_buf *etr_buf,
21875f4e361SSuzuki K Poulose 		     int node, void **pages);
21975f4e361SSuzuki K Poulose 	void (*sync)(struct etr_buf *etr_buf, u64 rrp, u64 rwp);
22075f4e361SSuzuki K Poulose 	ssize_t (*get_data)(struct etr_buf *etr_buf, u64 offset, size_t len,
22175f4e361SSuzuki K Poulose 			    char **bufpp);
22275f4e361SSuzuki K Poulose 	void (*free)(struct etr_buf *etr_buf);
22375f4e361SSuzuki K Poulose };
22475f4e361SSuzuki K Poulose 
22599443ea1SSuzuki K Poulose /**
22699443ea1SSuzuki K Poulose  * struct tmc_pages - Collection of pages used for SG.
22799443ea1SSuzuki K Poulose  * @nr_pages:		Number of pages in the list.
22899443ea1SSuzuki K Poulose  * @daddrs:		Array of DMA'able page address.
22999443ea1SSuzuki K Poulose  * @pages:		Array pages for the buffer.
23099443ea1SSuzuki K Poulose  */
23199443ea1SSuzuki K Poulose struct tmc_pages {
23299443ea1SSuzuki K Poulose 	int nr_pages;
23399443ea1SSuzuki K Poulose 	dma_addr_t	*daddrs;
23499443ea1SSuzuki K Poulose 	struct page	**pages;
23599443ea1SSuzuki K Poulose };
23699443ea1SSuzuki K Poulose 
23799443ea1SSuzuki K Poulose /*
23899443ea1SSuzuki K Poulose  * struct tmc_sg_table - Generic SG table for TMC
23999443ea1SSuzuki K Poulose  * @dev:		Device for DMA allocations
24099443ea1SSuzuki K Poulose  * @table_vaddr:	Contiguous Virtual address for PageTable
24199443ea1SSuzuki K Poulose  * @data_vaddr:		Contiguous Virtual address for Data Buffer
24299443ea1SSuzuki K Poulose  * @table_daddr:	DMA address of the PageTable base
24399443ea1SSuzuki K Poulose  * @node:		Node for Page allocations
24499443ea1SSuzuki K Poulose  * @table_pages:	List of pages & dma address for Table
24599443ea1SSuzuki K Poulose  * @data_pages:		List of pages & dma address for Data
24699443ea1SSuzuki K Poulose  */
24799443ea1SSuzuki K Poulose struct tmc_sg_table {
24899443ea1SSuzuki K Poulose 	struct device *dev;
24999443ea1SSuzuki K Poulose 	void *table_vaddr;
25099443ea1SSuzuki K Poulose 	void *data_vaddr;
25199443ea1SSuzuki K Poulose 	dma_addr_t table_daddr;
25299443ea1SSuzuki K Poulose 	int node;
25399443ea1SSuzuki K Poulose 	struct tmc_pages table_pages;
25499443ea1SSuzuki K Poulose 	struct tmc_pages data_pages;
25599443ea1SSuzuki K Poulose };
25699443ea1SSuzuki K Poulose 
2576c6ed1e2SMathieu Poirier /* Generic functions */
2586c6ed1e2SMathieu Poirier int tmc_wait_for_tmcready(struct tmc_drvdata *drvdata);
2596c6ed1e2SMathieu Poirier void tmc_flush_and_stop(struct tmc_drvdata *drvdata);
2606c6ed1e2SMathieu Poirier void tmc_enable_hw(struct tmc_drvdata *drvdata);
2616c6ed1e2SMathieu Poirier void tmc_disable_hw(struct tmc_drvdata *drvdata);
26200bb485cSMathieu Poirier u32 tmc_get_memwidth_mask(struct tmc_drvdata *drvdata);
2636c6ed1e2SMathieu Poirier 
2646c6ed1e2SMathieu Poirier /* ETB/ETF functions */
2654525412aSMathieu Poirier int tmc_read_prepare_etb(struct tmc_drvdata *drvdata);
2664525412aSMathieu Poirier int tmc_read_unprepare_etb(struct tmc_drvdata *drvdata);
2676c6ed1e2SMathieu Poirier extern const struct coresight_ops tmc_etb_cs_ops;
2686c6ed1e2SMathieu Poirier extern const struct coresight_ops tmc_etf_cs_ops;
2696c6ed1e2SMathieu Poirier 
2703495722aSSuzuki K Poulose ssize_t tmc_etb_get_sysfs_trace(struct tmc_drvdata *drvdata,
2713495722aSSuzuki K Poulose 				loff_t pos, size_t len, char **bufpp);
2726c6ed1e2SMathieu Poirier /* ETR functions */
2734525412aSMathieu Poirier int tmc_read_prepare_etr(struct tmc_drvdata *drvdata);
2744525412aSMathieu Poirier int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata);
275865d3079SSai Prakash Ranjan void tmc_etr_disable_hw(struct tmc_drvdata *drvdata);
2766c6ed1e2SMathieu Poirier extern const struct coresight_ops tmc_etr_cs_ops;
2773495722aSSuzuki K Poulose ssize_t tmc_etr_get_sysfs_trace(struct tmc_drvdata *drvdata,
2783495722aSSuzuki K Poulose 				loff_t pos, size_t len, char **bufpp);
2796f6ab4fcSSuzuki K Poulose 
2806f6ab4fcSSuzuki K Poulose 
2816f6ab4fcSSuzuki K Poulose #define TMC_REG_PAIR(name, lo_off, hi_off)				\
2826f6ab4fcSSuzuki K Poulose static inline u64							\
2836f6ab4fcSSuzuki K Poulose tmc_read_##name(struct tmc_drvdata *drvdata)				\
2846f6ab4fcSSuzuki K Poulose {									\
285*0a98181fSJames Clark 	return csdev_access_relaxed_read_pair(&drvdata->csdev->access, lo_off, hi_off); \
2866f6ab4fcSSuzuki K Poulose }									\
2876f6ab4fcSSuzuki K Poulose static inline void							\
2886f6ab4fcSSuzuki K Poulose tmc_write_##name(struct tmc_drvdata *drvdata, u64 val)			\
2896f6ab4fcSSuzuki K Poulose {									\
290*0a98181fSJames Clark 	csdev_access_relaxed_write_pair(&drvdata->csdev->access, val, lo_off, hi_off); \
2916f6ab4fcSSuzuki K Poulose }
2926f6ab4fcSSuzuki K Poulose 
TMC_REG_PAIR(rrp,TMC_RRP,TMC_RRPHI)2936f6ab4fcSSuzuki K Poulose TMC_REG_PAIR(rrp, TMC_RRP, TMC_RRPHI)
2946f6ab4fcSSuzuki K Poulose TMC_REG_PAIR(rwp, TMC_RWP, TMC_RWPHI)
2956f6ab4fcSSuzuki K Poulose TMC_REG_PAIR(dba, TMC_DBALO, TMC_DBAHI)
2966f6ab4fcSSuzuki K Poulose 
2972884132aSSuzuki K Poulose /* Initialise the caps from unadvertised static capabilities of the device */
2982884132aSSuzuki K Poulose static inline void tmc_etr_init_caps(struct tmc_drvdata *drvdata, u32 dev_caps)
2992884132aSSuzuki K Poulose {
3002884132aSSuzuki K Poulose 	WARN_ON(drvdata->etr_caps);
3012884132aSSuzuki K Poulose 	drvdata->etr_caps = dev_caps;
3022884132aSSuzuki K Poulose }
3032884132aSSuzuki K Poulose 
tmc_etr_set_cap(struct tmc_drvdata * drvdata,u32 cap)3042884132aSSuzuki K Poulose static inline void tmc_etr_set_cap(struct tmc_drvdata *drvdata, u32 cap)
3052884132aSSuzuki K Poulose {
3062884132aSSuzuki K Poulose 	drvdata->etr_caps |= cap;
3072884132aSSuzuki K Poulose }
3082884132aSSuzuki K Poulose 
tmc_etr_has_cap(struct tmc_drvdata * drvdata,u32 cap)3092884132aSSuzuki K Poulose static inline bool tmc_etr_has_cap(struct tmc_drvdata *drvdata, u32 cap)
3102884132aSSuzuki K Poulose {
3112884132aSSuzuki K Poulose 	return !!(drvdata->etr_caps & cap);
3122884132aSSuzuki K Poulose }
3132884132aSSuzuki K Poulose 
31499443ea1SSuzuki K Poulose struct tmc_sg_table *tmc_alloc_sg_table(struct device *dev,
31599443ea1SSuzuki K Poulose 					int node,
31699443ea1SSuzuki K Poulose 					int nr_tpages,
31799443ea1SSuzuki K Poulose 					int nr_dpages,
31899443ea1SSuzuki K Poulose 					void **pages);
31999443ea1SSuzuki K Poulose void tmc_free_sg_table(struct tmc_sg_table *sg_table);
32099443ea1SSuzuki K Poulose void tmc_sg_table_sync_table(struct tmc_sg_table *sg_table);
32199443ea1SSuzuki K Poulose void tmc_sg_table_sync_data_range(struct tmc_sg_table *table,
32299443ea1SSuzuki K Poulose 				  u64 offset, u64 size);
32399443ea1SSuzuki K Poulose ssize_t tmc_sg_table_get_data(struct tmc_sg_table *sg_table,
32499443ea1SSuzuki K Poulose 			      u64 offset, size_t len, char **bufpp);
32599443ea1SSuzuki K Poulose static inline unsigned long
tmc_sg_table_buf_size(struct tmc_sg_table * sg_table)32699443ea1SSuzuki K Poulose tmc_sg_table_buf_size(struct tmc_sg_table *sg_table)
32799443ea1SSuzuki K Poulose {
32899443ea1SSuzuki K Poulose 	return (unsigned long)sg_table->data_pages.nr_pages << PAGE_SHIFT;
32999443ea1SSuzuki K Poulose }
33099443ea1SSuzuki K Poulose 
331434d611cSSuzuki K Poulose struct coresight_device *tmc_etr_get_catu_device(struct tmc_drvdata *drvdata);
332434d611cSSuzuki K Poulose 
33366af416dSMian Yousaf Kaukab void tmc_etr_set_catu_ops(const struct etr_buf_operations *catu);
33466af416dSMian Yousaf Kaukab void tmc_etr_remove_catu_ops(void);
33566af416dSMian Yousaf Kaukab struct etr_buf *tmc_etr_get_buffer(struct coresight_device *csdev,
3364c324b5fSMathieu Poirier 				   enum cs_mode mode, void *data);
337 
338 #endif
339