1
2
3
4
5
6
7#ifndef _CORESIGHT_TMC_H
8#define _CORESIGHT_TMC_H
9
10#include <linux/dma-mapping.h>
11#include <linux/idr.h>
12#include <linux/miscdevice.h>
13#include <linux/mutex.h>
14#include <linux/refcount.h>
15
16#define TMC_RSZ 0x004
17#define TMC_STS 0x00c
18#define TMC_RRD 0x010
19#define TMC_RRP 0x014
20#define TMC_RWP 0x018
21#define TMC_TRG 0x01c
22#define TMC_CTL 0x020
23#define TMC_RWD 0x024
24#define TMC_MODE 0x028
25#define TMC_LBUFLEVEL 0x02c
26#define TMC_CBUFLEVEL 0x030
27#define TMC_BUFWM 0x034
28#define TMC_RRPHI 0x038
29#define TMC_RWPHI 0x03c
30#define TMC_AXICTL 0x110
31#define TMC_DBALO 0x118
32#define TMC_DBAHI 0x11c
33#define TMC_FFSR 0x300
34#define TMC_FFCR 0x304
35#define TMC_PSCR 0x308
36#define TMC_ITMISCOP0 0xee0
37#define TMC_ITTRFLIN 0xee8
38#define TMC_ITATBDATA0 0xeec
39#define TMC_ITATBCTR2 0xef0
40#define TMC_ITATBCTR1 0xef4
41#define TMC_ITATBCTR0 0xef8
42
43
44
45#define TMC_CTL_CAPT_EN BIT(0)
46
47#define TMC_STS_TMCREADY_BIT 2
48#define TMC_STS_FULL BIT(0)
49#define TMC_STS_TRIGGERED BIT(1)
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65#define TMC_AXICTL_CLEAR_MASK 0xfbf
66#define TMC_AXICTL_ARCACHE_MASK (0xf << 16)
67
68#define TMC_AXICTL_PROT_CTL_B0 BIT(0)
69#define TMC_AXICTL_PROT_CTL_B1 BIT(1)
70#define TMC_AXICTL_SCT_GAT_MODE BIT(7)
71#define TMC_AXICTL_WR_BURST_16 0xF00
72
73#define TMC_AXICTL_AXCACHE_OS (0xf << 2)
74#define TMC_AXICTL_ARCACHE_OS (0xf << 16)
75
76
77#define TMC_FFCR_FLUSHMAN_BIT 6
78#define TMC_FFCR_EN_FMT BIT(0)
79#define TMC_FFCR_EN_TI BIT(1)
80#define TMC_FFCR_FON_FLIN BIT(4)
81#define TMC_FFCR_FON_TRIG_EVT BIT(5)
82#define TMC_FFCR_TRIGON_TRIGIN BIT(8)
83#define TMC_FFCR_STOP_ON_FLUSH BIT(12)
84
85
86#define TMC_DEVID_NOSCAT BIT(24)
87
88#define TMC_DEVID_AXIAW_VALID BIT(16)
89#define TMC_DEVID_AXIAW_SHIFT 17
90#define TMC_DEVID_AXIAW_MASK 0x7f
91
92enum tmc_config_type {
93 TMC_CONFIG_TYPE_ETB,
94 TMC_CONFIG_TYPE_ETR,
95 TMC_CONFIG_TYPE_ETF,
96};
97
98enum tmc_mode {
99 TMC_MODE_CIRCULAR_BUFFER,
100 TMC_MODE_SOFTWARE_FIFO,
101 TMC_MODE_HARDWARE_FIFO,
102};
103
104enum tmc_mem_intf_width {
105 TMC_MEM_INTF_WIDTH_32BITS = 1,
106 TMC_MEM_INTF_WIDTH_64BITS = 2,
107 TMC_MEM_INTF_WIDTH_128BITS = 4,
108 TMC_MEM_INTF_WIDTH_256BITS = 8,
109};
110
111
112#define TMC_ETR_SG (0x1U << 0)
113
114#define TMC_ETR_AXI_ARCACHE (0x1U << 1)
115
116
117
118
119
120
121
122
123#define TMC_ETR_SAVE_RESTORE (0x1U << 2)
124
125
126#define CORESIGHT_SOC_600_ETR_CAPS \
127 (TMC_ETR_SAVE_RESTORE | TMC_ETR_AXI_ARCACHE)
128
129enum etr_mode {
130 ETR_MODE_FLAT,
131 ETR_MODE_ETR_SG,
132 ETR_MODE_CATU,
133};
134
135struct etr_buf_operations;
136
137
138
139
140
141
142
143
144
145
146
147
148
149struct etr_buf {
150 refcount_t refcount;
151 enum etr_mode mode;
152 bool full;
153 ssize_t size;
154 dma_addr_t hwaddr;
155 unsigned long offset;
156 s64 len;
157 const struct etr_buf_operations *ops;
158 void *private;
159};
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185struct tmc_drvdata {
186 void __iomem *base;
187 struct device *dev;
188 struct coresight_device *csdev;
189 struct miscdevice miscdev;
190 spinlock_t spinlock;
191 pid_t pid;
192 bool reading;
193 union {
194 char *buf;
195 struct etr_buf *etr_buf;
196 };
197 u32 len;
198 u32 size;
199 u32 mode;
200 enum tmc_config_type config_type;
201 enum tmc_mem_intf_width memwidth;
202 u32 trigger_cntr;
203 u32 etr_caps;
204 struct idr idr;
205 struct mutex idr_mutex;
206 struct etr_buf *sysfs_buf;
207 void *perf_data;
208};
209
210struct etr_buf_operations {
211 int (*alloc)(struct tmc_drvdata *drvdata, struct etr_buf *etr_buf,
212 int node, void **pages);
213 void (*sync)(struct etr_buf *etr_buf, u64 rrp, u64 rwp);
214 ssize_t (*get_data)(struct etr_buf *etr_buf, u64 offset, size_t len,
215 char **bufpp);
216 void (*free)(struct etr_buf *etr_buf);
217};
218
219
220
221
222
223
224
225struct tmc_pages {
226 int nr_pages;
227 dma_addr_t *daddrs;
228 struct page **pages;
229};
230
231
232
233
234
235
236
237
238
239
240
241struct tmc_sg_table {
242 struct device *dev;
243 void *table_vaddr;
244 void *data_vaddr;
245 dma_addr_t table_daddr;
246 int node;
247 struct tmc_pages table_pages;
248 struct tmc_pages data_pages;
249};
250
251
252void tmc_wait_for_tmcready(struct tmc_drvdata *drvdata);
253void tmc_flush_and_stop(struct tmc_drvdata *drvdata);
254void tmc_enable_hw(struct tmc_drvdata *drvdata);
255void tmc_disable_hw(struct tmc_drvdata *drvdata);
256
257
258int tmc_read_prepare_etb(struct tmc_drvdata *drvdata);
259int tmc_read_unprepare_etb(struct tmc_drvdata *drvdata);
260extern const struct coresight_ops tmc_etb_cs_ops;
261extern const struct coresight_ops tmc_etf_cs_ops;
262
263ssize_t tmc_etb_get_sysfs_trace(struct tmc_drvdata *drvdata,
264 loff_t pos, size_t len, char **bufpp);
265
266int tmc_read_prepare_etr(struct tmc_drvdata *drvdata);
267int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata);
268extern const struct coresight_ops tmc_etr_cs_ops;
269ssize_t tmc_etr_get_sysfs_trace(struct tmc_drvdata *drvdata,
270 loff_t pos, size_t len, char **bufpp);
271
272
273#define TMC_REG_PAIR(name, lo_off, hi_off) \
274static inline u64 \
275tmc_read_##name(struct tmc_drvdata *drvdata) \
276{ \
277 return coresight_read_reg_pair(drvdata->base, lo_off, hi_off); \
278} \
279static inline void \
280tmc_write_##name(struct tmc_drvdata *drvdata, u64 val) \
281{ \
282 coresight_write_reg_pair(drvdata->base, val, lo_off, hi_off); \
283}
284
285TMC_REG_PAIR(rrp, TMC_RRP, TMC_RRPHI)
286TMC_REG_PAIR(rwp, TMC_RWP, TMC_RWPHI)
287TMC_REG_PAIR(dba, TMC_DBALO, TMC_DBAHI)
288
289
290static inline void tmc_etr_init_caps(struct tmc_drvdata *drvdata, u32 dev_caps)
291{
292 WARN_ON(drvdata->etr_caps);
293 drvdata->etr_caps = dev_caps;
294}
295
296static inline void tmc_etr_set_cap(struct tmc_drvdata *drvdata, u32 cap)
297{
298 drvdata->etr_caps |= cap;
299}
300
301static inline bool tmc_etr_has_cap(struct tmc_drvdata *drvdata, u32 cap)
302{
303 return !!(drvdata->etr_caps & cap);
304}
305
306struct tmc_sg_table *tmc_alloc_sg_table(struct device *dev,
307 int node,
308 int nr_tpages,
309 int nr_dpages,
310 void **pages);
311void tmc_free_sg_table(struct tmc_sg_table *sg_table);
312void tmc_sg_table_sync_table(struct tmc_sg_table *sg_table);
313void tmc_sg_table_sync_data_range(struct tmc_sg_table *table,
314 u64 offset, u64 size);
315ssize_t tmc_sg_table_get_data(struct tmc_sg_table *sg_table,
316 u64 offset, size_t len, char **bufpp);
317static inline unsigned long
318tmc_sg_table_buf_size(struct tmc_sg_table *sg_table)
319{
320 return sg_table->data_pages.nr_pages << PAGE_SHIFT;
321}
322
323struct coresight_device *tmc_etr_get_catu_device(struct tmc_drvdata *drvdata);
324
325#endif
326