1
2
3
4
5
6#ifndef _LINUX_CORESIGHT_H
7#define _LINUX_CORESIGHT_H
8
9#include <linux/device.h>
10#include <linux/io.h>
11#include <linux/perf_event.h>
12#include <linux/sched.h>
13
14
15#define CORESIGHT_PERIPHIDR4 0xfd0
16#define CORESIGHT_PERIPHIDR5 0xfd4
17#define CORESIGHT_PERIPHIDR6 0xfd8
18#define CORESIGHT_PERIPHIDR7 0xfdC
19#define CORESIGHT_PERIPHIDR0 0xfe0
20#define CORESIGHT_PERIPHIDR1 0xfe4
21#define CORESIGHT_PERIPHIDR2 0xfe8
22#define CORESIGHT_PERIPHIDR3 0xfeC
23
24#define CORESIGHT_COMPIDR0 0xff0
25#define CORESIGHT_COMPIDR1 0xff4
26#define CORESIGHT_COMPIDR2 0xff8
27#define CORESIGHT_COMPIDR3 0xffC
28
29#define ETM_ARCH_V3_3 0x23
30#define ETM_ARCH_V3_5 0x25
31#define PFT_ARCH_V1_0 0x30
32#define PFT_ARCH_V1_1 0x31
33
34#define CORESIGHT_UNLOCK 0xc5acce55
35
36extern struct bus_type coresight_bustype;
37
38enum coresight_dev_type {
39 CORESIGHT_DEV_TYPE_NONE,
40 CORESIGHT_DEV_TYPE_SINK,
41 CORESIGHT_DEV_TYPE_LINK,
42 CORESIGHT_DEV_TYPE_LINKSINK,
43 CORESIGHT_DEV_TYPE_SOURCE,
44 CORESIGHT_DEV_TYPE_HELPER,
45 CORESIGHT_DEV_TYPE_ECT,
46};
47
48enum coresight_dev_subtype_sink {
49 CORESIGHT_DEV_SUBTYPE_SINK_NONE,
50 CORESIGHT_DEV_SUBTYPE_SINK_PORT,
51 CORESIGHT_DEV_SUBTYPE_SINK_BUFFER,
52 CORESIGHT_DEV_SUBTYPE_SINK_SYSMEM,
53 CORESIGHT_DEV_SUBTYPE_SINK_PERCPU_SYSMEM,
54};
55
56enum coresight_dev_subtype_link {
57 CORESIGHT_DEV_SUBTYPE_LINK_NONE,
58 CORESIGHT_DEV_SUBTYPE_LINK_MERG,
59 CORESIGHT_DEV_SUBTYPE_LINK_SPLIT,
60 CORESIGHT_DEV_SUBTYPE_LINK_FIFO,
61};
62
63enum coresight_dev_subtype_source {
64 CORESIGHT_DEV_SUBTYPE_SOURCE_NONE,
65 CORESIGHT_DEV_SUBTYPE_SOURCE_PROC,
66 CORESIGHT_DEV_SUBTYPE_SOURCE_BUS,
67 CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE,
68};
69
70enum coresight_dev_subtype_helper {
71 CORESIGHT_DEV_SUBTYPE_HELPER_NONE,
72 CORESIGHT_DEV_SUBTYPE_HELPER_CATU,
73};
74
75
76enum coresight_dev_subtype_ect {
77 CORESIGHT_DEV_SUBTYPE_ECT_NONE,
78 CORESIGHT_DEV_SUBTYPE_ECT_CTI,
79};
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94union coresight_dev_subtype {
95
96 struct {
97 enum coresight_dev_subtype_sink sink_subtype;
98 enum coresight_dev_subtype_link link_subtype;
99 };
100 enum coresight_dev_subtype_source source_subtype;
101 enum coresight_dev_subtype_helper helper_subtype;
102 enum coresight_dev_subtype_ect ect_subtype;
103};
104
105
106
107
108
109
110
111
112
113struct coresight_platform_data {
114 int nr_inport;
115 int nr_outport;
116 struct coresight_connection *conns;
117};
118
119
120
121
122
123
124
125
126
127struct csdev_access {
128 bool io_mem;
129 union {
130 void __iomem *base;
131 struct {
132 u64 (*read)(u32 offset, bool relaxed, bool _64bit);
133 void (*write)(u64 val, u32 offset, bool relaxed,
134 bool _64bit);
135 };
136 };
137};
138
139#define CSDEV_ACCESS_IOMEM(_addr) \
140 ((struct csdev_access) { \
141 .io_mem = true, \
142 .base = (_addr), \
143 })
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158struct coresight_desc {
159 enum coresight_dev_type type;
160 union coresight_dev_subtype subtype;
161 const struct coresight_ops *ops;
162 struct coresight_platform_data *pdata;
163 struct device *dev;
164 const struct attribute_group **groups;
165 const char *name;
166 struct csdev_access access;
167};
168
169
170
171
172
173
174
175
176
177
178struct coresight_connection {
179 int outport;
180 int child_port;
181 struct fwnode_handle *child_fwnode;
182 struct coresight_device *child_dev;
183 struct coresight_sysfs_link *link;
184};
185
186
187
188
189
190
191
192
193struct coresight_sysfs_link {
194 struct coresight_device *orig;
195 const char *orig_name;
196 struct coresight_device *target;
197 const char *target_name;
198};
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228struct coresight_device {
229 struct coresight_platform_data *pdata;
230 enum coresight_dev_type type;
231 union coresight_dev_subtype subtype;
232 const struct coresight_ops *ops;
233 struct csdev_access access;
234 struct device dev;
235 atomic_t *refcnt;
236 bool orphan;
237 bool enable;
238
239 bool activated;
240 struct dev_ext_attribute *ea;
241 struct coresight_device *def_sink;
242
243 struct coresight_device *ect_dev;
244
245 int nr_links;
246 bool has_conns_grp;
247 bool ect_enabled;
248
249 struct list_head feature_csdev_list;
250 struct list_head config_csdev_list;
251 spinlock_t cscfg_csdev_lock;
252 void *active_cscfg_ctxt;
253};
254
255
256
257
258
259
260
261
262
263
264struct coresight_dev_list {
265 int nr_idx;
266 const char *pfx;
267 struct fwnode_handle **fwnode_list;
268};
269
270#define DEFINE_CORESIGHT_DEVLIST(var, dev_pfx) \
271static struct coresight_dev_list (var) = { \
272 .pfx = dev_pfx, \
273 .nr_idx = 0, \
274 .fwnode_list = NULL, \
275}
276
277#define to_coresight_device(d) container_of(d, struct coresight_device, dev)
278
279#define source_ops(csdev) csdev->ops->source_ops
280#define sink_ops(csdev) csdev->ops->sink_ops
281#define link_ops(csdev) csdev->ops->link_ops
282#define helper_ops(csdev) csdev->ops->helper_ops
283#define ect_ops(csdev) csdev->ops->ect_ops
284
285
286
287
288
289
290
291
292
293
294struct coresight_ops_sink {
295 int (*enable)(struct coresight_device *csdev, u32 mode, void *data);
296 int (*disable)(struct coresight_device *csdev);
297 void *(*alloc_buffer)(struct coresight_device *csdev,
298 struct perf_event *event, void **pages,
299 int nr_pages, bool overwrite);
300 void (*free_buffer)(void *config);
301 unsigned long (*update_buffer)(struct coresight_device *csdev,
302 struct perf_output_handle *handle,
303 void *sink_config);
304};
305
306
307
308
309
310
311
312struct coresight_ops_link {
313 int (*enable)(struct coresight_device *csdev, int iport, int oport);
314 void (*disable)(struct coresight_device *csdev, int iport, int oport);
315};
316
317
318
319
320
321
322
323
324
325
326
327struct coresight_ops_source {
328 int (*cpu_id)(struct coresight_device *csdev);
329 int (*trace_id)(struct coresight_device *csdev);
330 int (*enable)(struct coresight_device *csdev,
331 struct perf_event *event, u32 mode);
332 void (*disable)(struct coresight_device *csdev,
333 struct perf_event *event);
334};
335
336
337
338
339
340
341
342
343
344
345struct coresight_ops_helper {
346 int (*enable)(struct coresight_device *csdev, void *data);
347 int (*disable)(struct coresight_device *csdev, void *data);
348};
349
350
351
352
353
354
355
356struct coresight_ops_ect {
357 int (*enable)(struct coresight_device *csdev);
358 int (*disable)(struct coresight_device *csdev);
359};
360
361struct coresight_ops {
362 const struct coresight_ops_sink *sink_ops;
363 const struct coresight_ops_link *link_ops;
364 const struct coresight_ops_source *source_ops;
365 const struct coresight_ops_helper *helper_ops;
366 const struct coresight_ops_ect *ect_ops;
367};
368
369#if IS_ENABLED(CONFIG_CORESIGHT)
370
371static inline u32 csdev_access_relaxed_read32(struct csdev_access *csa,
372 u32 offset)
373{
374 if (likely(csa->io_mem))
375 return readl_relaxed(csa->base + offset);
376
377 return csa->read(offset, true, false);
378}
379
380static inline u32 csdev_access_read32(struct csdev_access *csa, u32 offset)
381{
382 if (likely(csa->io_mem))
383 return readl(csa->base + offset);
384
385 return csa->read(offset, false, false);
386}
387
388static inline void csdev_access_relaxed_write32(struct csdev_access *csa,
389 u32 val, u32 offset)
390{
391 if (likely(csa->io_mem))
392 writel_relaxed(val, csa->base + offset);
393 else
394 csa->write(val, offset, true, false);
395}
396
397static inline void csdev_access_write32(struct csdev_access *csa, u32 val, u32 offset)
398{
399 if (likely(csa->io_mem))
400 writel(val, csa->base + offset);
401 else
402 csa->write(val, offset, false, false);
403}
404
405#ifdef CONFIG_64BIT
406
407static inline u64 csdev_access_relaxed_read64(struct csdev_access *csa,
408 u32 offset)
409{
410 if (likely(csa->io_mem))
411 return readq_relaxed(csa->base + offset);
412
413 return csa->read(offset, true, true);
414}
415
416static inline u64 csdev_access_read64(struct csdev_access *csa, u32 offset)
417{
418 if (likely(csa->io_mem))
419 return readq(csa->base + offset);
420
421 return csa->read(offset, false, true);
422}
423
424static inline void csdev_access_relaxed_write64(struct csdev_access *csa,
425 u64 val, u32 offset)
426{
427 if (likely(csa->io_mem))
428 writeq_relaxed(val, csa->base + offset);
429 else
430 csa->write(val, offset, true, true);
431}
432
433static inline void csdev_access_write64(struct csdev_access *csa, u64 val, u32 offset)
434{
435 if (likely(csa->io_mem))
436 writeq(val, csa->base + offset);
437 else
438 csa->write(val, offset, false, true);
439}
440
441#else
442
443static inline u64 csdev_access_relaxed_read64(struct csdev_access *csa,
444 u32 offset)
445{
446 WARN_ON(1);
447 return 0;
448}
449
450static inline u64 csdev_access_read64(struct csdev_access *csa, u32 offset)
451{
452 WARN_ON(1);
453 return 0;
454}
455
456static inline void csdev_access_relaxed_write64(struct csdev_access *csa,
457 u64 val, u32 offset)
458{
459 WARN_ON(1);
460}
461
462static inline void csdev_access_write64(struct csdev_access *csa, u64 val, u32 offset)
463{
464 WARN_ON(1);
465}
466#endif
467
468static inline bool coresight_is_percpu_source(struct coresight_device *csdev)
469{
470 return csdev && (csdev->type == CORESIGHT_DEV_TYPE_SOURCE) &&
471 (csdev->subtype.source_subtype == CORESIGHT_DEV_SUBTYPE_SOURCE_PROC);
472}
473
474static inline bool coresight_is_percpu_sink(struct coresight_device *csdev)
475{
476 return csdev && (csdev->type == CORESIGHT_DEV_TYPE_SINK) &&
477 (csdev->subtype.sink_subtype == CORESIGHT_DEV_SUBTYPE_SINK_PERCPU_SYSMEM);
478}
479
480extern struct coresight_device *
481coresight_register(struct coresight_desc *desc);
482extern void coresight_unregister(struct coresight_device *csdev);
483extern int coresight_enable(struct coresight_device *csdev);
484extern void coresight_disable(struct coresight_device *csdev);
485extern int coresight_timeout(struct csdev_access *csa, u32 offset,
486 int position, int value);
487
488extern int coresight_claim_device(struct coresight_device *csdev);
489extern int coresight_claim_device_unlocked(struct coresight_device *csdev);
490
491extern void coresight_disclaim_device(struct coresight_device *csdev);
492extern void coresight_disclaim_device_unlocked(struct coresight_device *csdev);
493extern char *coresight_alloc_device_name(struct coresight_dev_list *devs,
494 struct device *dev);
495
496extern bool coresight_loses_context_with_cpu(struct device *dev);
497
498u32 coresight_relaxed_read32(struct coresight_device *csdev, u32 offset);
499u32 coresight_read32(struct coresight_device *csdev, u32 offset);
500void coresight_write32(struct coresight_device *csdev, u32 val, u32 offset);
501void coresight_relaxed_write32(struct coresight_device *csdev,
502 u32 val, u32 offset);
503u64 coresight_relaxed_read64(struct coresight_device *csdev, u32 offset);
504u64 coresight_read64(struct coresight_device *csdev, u32 offset);
505void coresight_relaxed_write64(struct coresight_device *csdev,
506 u64 val, u32 offset);
507void coresight_write64(struct coresight_device *csdev, u64 val, u32 offset);
508
509#else
510static inline struct coresight_device *
511coresight_register(struct coresight_desc *desc) { return NULL; }
512static inline void coresight_unregister(struct coresight_device *csdev) {}
513static inline int
514coresight_enable(struct coresight_device *csdev) { return -ENOSYS; }
515static inline void coresight_disable(struct coresight_device *csdev) {}
516
517static inline int coresight_timeout(struct csdev_access *csa, u32 offset,
518 int position, int value)
519{
520 return 1;
521}
522
523static inline int coresight_claim_device_unlocked(struct coresight_device *csdev)
524{
525 return -EINVAL;
526}
527
528static inline int coresight_claim_device(struct coresight_device *csdev)
529{
530 return -EINVAL;
531}
532
533static inline void coresight_disclaim_device(struct coresight_device *csdev) {}
534static inline void coresight_disclaim_device_unlocked(struct coresight_device *csdev) {}
535
536static inline bool coresight_loses_context_with_cpu(struct device *dev)
537{
538 return false;
539}
540
541static inline u32 coresight_relaxed_read32(struct coresight_device *csdev, u32 offset)
542{
543 WARN_ON_ONCE(1);
544 return 0;
545}
546
547static inline u32 coresight_read32(struct coresight_device *csdev, u32 offset)
548{
549 WARN_ON_ONCE(1);
550 return 0;
551}
552
553static inline void coresight_write32(struct coresight_device *csdev, u32 val, u32 offset)
554{
555}
556
557static inline void coresight_relaxed_write32(struct coresight_device *csdev,
558 u32 val, u32 offset)
559{
560}
561
562static inline u64 coresight_relaxed_read64(struct coresight_device *csdev,
563 u32 offset)
564{
565 WARN_ON_ONCE(1);
566 return 0;
567}
568
569static inline u64 coresight_read64(struct coresight_device *csdev, u32 offset)
570{
571 WARN_ON_ONCE(1);
572 return 0;
573}
574
575static inline void coresight_relaxed_write64(struct coresight_device *csdev,
576 u64 val, u32 offset)
577{
578}
579
580static inline void coresight_write64(struct coresight_device *csdev, u64 val, u32 offset)
581{
582}
583
584#endif
585
586extern int coresight_get_cpu(struct device *dev);
587
588struct coresight_platform_data *coresight_get_platform_data(struct device *dev);
589
590#endif
591