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