misc: tegra-profiler: support raw hardware events
[linux-3.10.git] / include / linux / tegra_profiler.h
1 /*
2  * include/linux/tegra_profiler.h
3  *
4  * Copyright (c) 2013-2017, NVIDIA CORPORATION.  All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  */
16
17 #ifndef __TEGRA_PROFILER_H
18 #define __TEGRA_PROFILER_H
19
20 #include <linux/ioctl.h>
21
22 #define QUADD_SAMPLES_VERSION   38
23 #define QUADD_IO_VERSION        22
24
25 #define QUADD_IO_VERSION_DYNAMIC_RB             5
26 #define QUADD_IO_VERSION_RB_MAX_FILL_COUNT      6
27 #define QUADD_IO_VERSION_MOD_STATE_STATUS_FIELD 7
28 #define QUADD_IO_VERSION_BT_KERNEL_CTX          8
29 #define QUADD_IO_VERSION_GET_MMAP               9
30 #define QUADD_IO_VERSION_BT_UNWIND_TABLES       10
31 #define QUADD_IO_VERSION_UNWIND_MIXED           11
32 #define QUADD_IO_VERSION_EXTABLES_MMAP          12
33 #define QUADD_IO_VERSION_ARCH_TIMER_OPT         13
34 #define QUADD_IO_VERSION_DATA_MMAP              14
35 #define QUADD_IO_VERSION_BT_LOWER_BOUND         15
36 #define QUADD_IO_VERSION_STACK_OFFSET           16
37 #define QUADD_IO_VERSION_SECTIONS_INFO          17
38 #define QUADD_IO_VERSION_UNW_METHODS_OPT        18
39 #define QUADD_IO_VERSION_PER_CPU_SETUP          19
40 #define QUADD_IO_VERSION_TRACE_ALL_TASKS        20
41 #define QUADD_IO_VERSION_CB_POWER_OF_2          21
42 #define QUADD_IO_VERSION_RAW_EVENTS             22
43
44 #define QUADD_SAMPLE_VERSION_THUMB_MODE_FLAG    17
45 #define QUADD_SAMPLE_VERSION_GROUP_SAMPLES      18
46 #define QUADD_SAMPLE_VERSION_THREAD_STATE_FLD   19
47 #define QUADD_SAMPLE_VERSION_BT_UNWIND_TABLES   22
48 #define QUADD_SAMPLE_VERSION_SUPPORT_IP64       23
49 #define QUADD_SAMPLE_VERSION_SPECIAL_MMAP       24
50 #define QUADD_SAMPLE_VERSION_UNWIND_MIXED       25
51 #define QUADD_SAMPLE_VERSION_UNW_ENTRY_TYPE     26
52 #define QUADD_SAMPLE_VERSION_USE_ARCH_TIMER     27
53 #define QUADD_SAMPLE_VERSION_SCHED_SAMPLES      28
54 #define QUADD_SAMPLE_VERSION_HDR_UNW_METHOD     29
55 #define QUADD_SAMPLE_VERSION_HDR_ARCH_TIMER     30
56 #define QUADD_SAMPLE_VERSION_STACK_OFFSET       31
57 #define QUADD_SAMPLE_VERSION_SCHED_TASK_STATE   32
58 #define QUADD_SAMPLE_VERSION_URCS               33
59 #define QUADD_SAMPLE_VERSION_HOTPLUG            34
60 #define QUADD_SAMPLE_VERSION_PER_CPU_SETUP      35
61 #define QUADD_SAMPLE_VERSION_REPORT_TGID        36
62 #define QUADD_SAMPLE_VERSION_MMAP_TS            37
63 #define QUADD_SAMPLE_VERSION_RAW_EVENTS         38
64
65 #define QUADD_MMAP_HEADER_VERSION               1
66
67 #define QUADD_MAX_COUNTERS      32
68 #define QUADD_MAX_PROCESS       64
69
70 #define QUADD_DEVICE_NAME       "quadd"
71 #define QUADD_AUTH_DEVICE_NAME  "quadd_auth"
72
73 #define QUADD_MOD_DEVICE_NAME           "quadd_mod"
74 #define QUADD_MOD_AUTH_DEVICE_NAME      "quadd_mod_auth"
75
76 #define QUADD_IOCTL     100
77
78 /*
79  * Setup params (profiling frequency, etc.)
80  */
81 #define IOCTL_SETUP _IOW(QUADD_IOCTL, 0, struct quadd_parameters)
82
83 /*
84  * Start profiling.
85  */
86 #define IOCTL_START _IO(QUADD_IOCTL, 1)
87
88 /*
89  * Stop profiling.
90  */
91 #define IOCTL_STOP _IO(QUADD_IOCTL, 2)
92
93 /*
94  * Getting capabilities
95  */
96 #define IOCTL_GET_CAP _IOR(QUADD_IOCTL, 3, struct quadd_comm_cap)
97
98 /*
99  * Getting state of module
100  */
101 #define IOCTL_GET_STATE _IOR(QUADD_IOCTL, 4, struct quadd_module_state)
102
103 /*
104  * Getting version of module
105  */
106 #define IOCTL_GET_VERSION _IOR(QUADD_IOCTL, 5, struct quadd_module_version)
107
108 /*
109  * Send exception-handling tables info
110  * This ioctl is obsolete
111  */
112 /*#define IOCTL_SET_EXTAB _IOW(QUADD_IOCTL, 6, struct quadd_extables)*/
113
114 /*
115  * Send ring buffer mmap info
116  */
117 #define IOCTL_SET_MMAP_RB _IOW(QUADD_IOCTL, 7, struct quadd_mmap_rb_info)
118
119 /*
120  * Send sections info
121  */
122 #define IOCTL_SET_SECTIONS_INFO _IOW(QUADD_IOCTL, 8, struct quadd_sections)
123
124 /*
125  * Per CPU PMU setup
126  */
127 #define IOCTL_SETUP_PMU_FOR_CPU _IOW(QUADD_IOCTL, 9,\
128                                      struct quadd_pmu_setup_for_cpu)
129
130 /*
131  * Per CPU capabilities
132  */
133 #define IOCTL_GET_CAP_FOR_CPU _IOWR(QUADD_IOCTL, 10,\
134                                     struct quadd_comm_cap_for_cpu)
135
136
137
138 #define QUADD_CPUMODE_TEGRA_POWER_CLUSTER_LP    (1 << 29)       /* LP CPU */
139 #define QUADD_CPUMODE_THUMB                     (1 << 30)       /* thumb mode */
140
141 enum quadd_events_id {
142         QUADD_EVENT_HW_CPU_CYCLES = 0,
143
144         QUADD_EVENT_HW_INSTRUCTIONS,
145         QUADD_EVENT_HW_BRANCH_INSTRUCTIONS,
146         QUADD_EVENT_HW_BRANCH_MISSES,
147         QUADD_EVENT_HW_BUS_CYCLES,
148
149         QUADD_EVENT_HW_L1_DCACHE_READ_MISSES,
150         QUADD_EVENT_HW_L1_DCACHE_WRITE_MISSES,
151         QUADD_EVENT_HW_L1_ICACHE_MISSES,
152
153         QUADD_EVENT_HW_L2_DCACHE_READ_MISSES,
154         QUADD_EVENT_HW_L2_DCACHE_WRITE_MISSES,
155         QUADD_EVENT_HW_L2_ICACHE_MISSES,
156
157         QUADD_EVENT_HW_MAX,
158 };
159
160 enum quadd_record_type {
161         QUADD_RECORD_TYPE_SAMPLE = 1,
162         QUADD_RECORD_TYPE_MMAP,
163         QUADD_RECORD_TYPE_MA,
164         QUADD_RECORD_TYPE_COMM,
165         QUADD_RECORD_TYPE_DEBUG,
166         QUADD_RECORD_TYPE_HEADER,
167         QUADD_RECORD_TYPE_POWER_RATE,
168         QUADD_RECORD_TYPE_ADDITIONAL_SAMPLE,
169         QUADD_RECORD_TYPE_SCHED,
170         QUADD_RECORD_TYPE_HOTPLUG,
171 };
172
173 enum quadd_event_source {
174         QUADD_EVENT_SOURCE_PMU = 1,
175         QUADD_EVENT_SOURCE_PL310,
176 };
177
178 enum quadd_cpu_mode {
179         QUADD_CPU_MODE_KERNEL = 1,
180         QUADD_CPU_MODE_USER,
181         QUADD_CPU_MODE_NONE,
182 };
183
184 #pragma pack(push, 1)
185
186 #define QUADD_SAMPLE_RES_URCS_ENABLED   (1 << 0)
187
188 #define QUADD_SAMPLE_URC_MASK           0xff
189
190 #define QUADD_SAMPLE_URC_SHIFT_FP       0
191 #define QUADD_SAMPLE_URC_SHIFT_UT       (1 * 8)
192 #define QUADD_SAMPLE_URC_SHIFT_DWARF    (2 * 8)
193
194 enum {
195         QUADD_URC_SUCCESS = 0,
196         QUADD_URC_FAILURE,
197         QUADD_URC_IDX_NOT_FOUND,
198         QUADD_URC_TBL_NOT_EXIST,
199         QUADD_URC_EACCESS,
200         QUADD_URC_TBL_IS_CORRUPT,
201         QUADD_URC_CANTUNWIND,
202         QUADD_URC_UNHANDLED_INSTRUCTION,
203         QUADD_URC_REFUSE_TO_UNWIND,
204         QUADD_URC_SP_INCORRECT,
205         QUADD_URC_SPARE_ENCODING,
206         QUADD_URC_UNSUPPORTED_PR,
207         QUADD_URC_PC_INCORRECT,
208         QUADD_URC_LEVEL_TOO_DEEP,
209         QUADD_URC_FP_INCORRECT,
210         QUADD_URC_NONE,
211         QUADD_URC_UNWIND_MISMATCH,
212         QUADD_URC_TBL_LINK_INCORRECT,
213         QUADD_URC_MAX,
214 };
215
216 #define QUADD_SED_IP64                  (1 << 0)
217
218 #define QUADD_SED_STACK_OFFSET_SHIFT    1
219 #define QUADD_SED_STACK_OFFSET_MASK     (0xffff << QUADD_SED_STACK_OFFSET_SHIFT)
220
221 enum {
222         QUADD_UNW_TYPE_FP = 0,
223         QUADD_UNW_TYPE_UT,
224         QUADD_UNW_TYPE_LR_FP,
225         QUADD_UNW_TYPE_LR_UT,
226         QUADD_UNW_TYPE_KCTX,
227         QUADD_UNW_TYPE_DWARF_EH,
228         QUADD_UNW_TYPE_DWARF_DF,
229 };
230
231 struct quadd_sample_data {
232         u64 ip;
233         u32 pid;
234         u32 tgid;
235         u64 time;
236
237         u16     cpu:6,
238                 user_mode:1,
239                 lp_mode:1,
240                 thumb_mode:1,
241                 state:1,
242                 in_interrupt:1,
243                 reserved:5;
244
245         u8 callchain_nr;
246         u32 events_flags;
247 };
248
249 #define QUADD_MMAP_ED_IS_FILE_EXISTS    (1 << 0)
250
251 struct quadd_mmap_data {
252         u32 pid;
253         u64 time;
254
255         u64 addr;
256         u64 len;
257
258         u8 user_mode:1;
259         u16 filename_length;
260 };
261
262 struct quadd_ma_data {
263         u32 pid;
264         u64 time;
265
266         u32 vm_size;
267         u32 rss_size;
268 };
269
270 struct quadd_power_rate_data {
271         u64 time;
272
273         u8 nr_cpus;
274
275         u32 gpu;
276         u32 emc;
277 };
278
279 struct quadd_hotplug_data {
280         u64 time;
281         u32 cpu;
282
283         u32 is_online:1,
284             reserved:31;
285 };
286
287 struct quadd_additional_sample {
288         u8 type;
289
290         u32 values[6];
291         u16 extra_length;
292 };
293
294 enum {
295         QUADD_SCHED_IDX_TASK_STATE = 0,
296         QUADD_SCHED_IDX_RESERVED,
297 };
298
299 struct quadd_sched_data {
300         u32 pid;
301         u32 tgid;
302         u64 time;
303
304         u32     cpu:6,
305                 lp_mode:1,
306                 sched_in:1,
307                 reserved:24;
308
309         u32 data[2];
310 };
311
312 enum {
313         QM_DEBUG_SAMPLE_TYPE_SCHED_IN = 1,
314         QM_DEBUG_SAMPLE_TYPE_SCHED_OUT,
315
316         QM_DEBUG_SAMPLE_TYPE_TIMER_HANDLE,
317         QM_DEBUG_SAMPLE_TYPE_TIMER_START,
318         QM_DEBUG_SAMPLE_TYPE_TIMER_CANCEL,
319         QM_DEBUG_SAMPLE_TYPE_TIMER_FORWARD,
320
321         QM_DEBUG_SAMPLE_TYPE_READ_COUNTER,
322
323         QM_DEBUG_SAMPLE_TYPE_SOURCE_START,
324         QM_DEBUG_SAMPLE_TYPE_SOURCE_STOP,
325 };
326
327 struct quadd_debug_data {
328         u8 type;
329
330         u32 pid;
331         u64 time;
332
333         u16     cpu:6,
334                 user_mode:1,
335                 lp_mode:1,
336                 thumb_mode:1,
337                 reserved:7;
338
339         u32 extra_value[2];
340         u16 extra_length;
341 };
342
343 #define QUADD_HEADER_MAGIC      0x1122
344
345 #define QUADD_HDR_BT_FP                 (1 << 0)
346 #define QUADD_HDR_BT_UT                 (1 << 1)
347 #define QUADD_HDR_BT_UT_CE              (1 << 2)
348 #define QUADD_HDR_USE_ARCH_TIMER        (1 << 3)
349 #define QUADD_HDR_STACK_OFFSET          (1 << 4)
350 #define QUADD_HDR_BT_DWARF              (1 << 5)
351 #define QUADD_HDR_HAS_CPUID             (1 << 6)
352
353 struct quadd_header_data {
354         u16 magic;
355         u16 version;
356
357         u32     backtrace:1,
358                 use_freq:1,
359                 system_wide:1,
360                 power_rate:1,
361                 debug_samples:1,
362                 get_mmap:1,
363                 reserved:26;    /* reserved fields for future extensions */
364
365         u32 freq;
366         u16 ma_freq;
367         u16 power_rate_freq;
368
369         u8 nr_events;
370         u16 extra_length;
371 };
372
373 struct quadd_record_data {
374         u8 record_type;
375         u16 extra_size;
376
377         /* sample: it should be the biggest size */
378         union {
379                 struct quadd_sample_data        sample;
380                 struct quadd_mmap_data          mmap;
381                 struct quadd_ma_data            ma;
382                 struct quadd_debug_data         debug;
383                 struct quadd_header_data        hdr;
384                 struct quadd_power_rate_data    power_rate;
385                 struct quadd_hotplug_data       hotplug;
386                 struct quadd_sched_data         sched;
387                 struct quadd_additional_sample  additional_sample;
388         };
389 } __aligned(4);
390
391 #pragma pack(4)
392
393 #define QUADD_MAX_PACKAGE_NAME  320
394
395 enum {
396         QUADD_PARAM_IDX_SIZE_OF_RB      = 0,
397         QUADD_PARAM_IDX_EXTRA           = 1,
398         QUADD_PARAM_IDX_BT_LOWER_BOUND  = 2,
399 };
400
401 #define QUADD_PARAM_EXTRA_GET_MMAP              (1 << 0)
402 #define QUADD_PARAM_EXTRA_BT_FP                 (1 << 1)
403 #define QUADD_PARAM_EXTRA_BT_UT                 (1 << 2)
404 #define QUADD_PARAM_EXTRA_BT_MIXED              (1 << 3)
405 #define QUADD_PARAM_EXTRA_USE_ARCH_TIMER        (1 << 4)
406 #define QUADD_PARAM_EXTRA_STACK_OFFSET          (1 << 5)
407 #define QUADD_PARAM_EXTRA_BT_UT_CE              (1 << 6)
408 #define QUADD_PARAM_EXTRA_BT_DWARF              (1 << 7)
409 #define QUADD_PARAM_EXTRA_PER_PMU_SETUP         (1 << 8)
410
411 enum {
412         QUADD_EVENT_TYPE_RAW            = 0,
413         QUADD_EVENT_TYPE_HARDWARE       = 1,
414
415         QUADD_EVENT_TYPE_MAX,
416 };
417
418 struct quadd_event {
419         u32 type;
420         u32 id;
421 };
422
423 struct quadd_parameters {
424         u32 freq;
425         u32 ma_freq;
426         u32 power_rate_freq;
427
428         u64     backtrace:1,
429                 use_freq:1,
430                 system_wide:1,
431                 debug_samples:1,
432                 trace_all_tasks:1;
433
434         u32 pids[QUADD_MAX_PROCESS];
435         u32 nr_pids;
436
437         u8 package_name[QUADD_MAX_PACKAGE_NAME];
438
439         struct quadd_event events[QUADD_MAX_COUNTERS];
440         u32 nr_events;
441
442         u32 reserved[16];       /* reserved fields for future extensions */
443 };
444
445 struct quadd_pmu_setup_for_cpu {
446         u32 cpuid;
447
448         struct quadd_event events[QUADD_MAX_COUNTERS];
449         u32 nr_events;
450
451         u32 reserved[16];
452 };
453
454 struct quadd_events_cap {
455         u32     cpu_cycles:1,
456                 instructions:1,
457                 branch_instructions:1,
458                 branch_misses:1,
459                 bus_cycles:1,
460
461                 l1_dcache_read_misses:1,
462                 l1_dcache_write_misses:1,
463                 l1_icache_misses:1,
464
465                 l2_dcache_read_misses:1,
466                 l2_dcache_write_misses:1,
467                 l2_icache_misses:1;
468
469         u32 raw_event_mask;
470 };
471
472 enum {
473         QUADD_COMM_CAP_IDX_EXTRA = 0,
474         QUADD_COMM_CAP_IDX_CPU_MASK = 1,
475 };
476
477 #define QUADD_COMM_CAP_EXTRA_BT_KERNEL_CTX      (1 << 0)
478 #define QUADD_COMM_CAP_EXTRA_GET_MMAP           (1 << 1)
479 #define QUADD_COMM_CAP_EXTRA_GROUP_SAMPLES      (1 << 2)
480 #define QUADD_COMM_CAP_EXTRA_BT_UNWIND_TABLES   (1 << 3)
481 #define QUADD_COMM_CAP_EXTRA_SUPPORT_AARCH64    (1 << 4)
482 #define QUADD_COMM_CAP_EXTRA_SPECIAL_ARCH_MMAP  (1 << 5)
483 #define QUADD_COMM_CAP_EXTRA_UNWIND_MIXED       (1 << 6)
484 #define QUADD_COMM_CAP_EXTRA_UNW_ENTRY_TYPE     (1 << 7)
485 #define QUADD_COMM_CAP_EXTRA_ARCH_TIMER         (1 << 8)
486 #define QUADD_COMM_CAP_EXTRA_RB_MMAP_OP         (1 << 9)
487 #define QUADD_COMM_CAP_EXTRA_CPU_MASK           (1 << 10)
488
489 struct quadd_comm_cap {
490         u32     pmu:1,
491                 power_rate:1,
492                 l2_cache:1,
493                 l2_multiple_events:1,
494                 tegra_lp_cluster:1,
495                 blocked_read:1;
496
497         struct quadd_events_cap events_cap; /* Deprecated. */
498
499         u32 reserved[16];       /* reserved fields for future extensions */
500 };
501
502 struct quadd_comm_cap_for_cpu {
503         u32     l2_cache:1,
504                 l2_multiple_events:1;
505
506         u8 cpuid;
507         struct quadd_events_cap events_cap;
508 };
509
510 enum {
511         QUADD_MOD_STATE_IDX_RB_MAX_FILL_COUNT = 0,
512         QUADD_MOD_STATE_IDX_STATUS,
513 };
514
515 #define QUADD_MOD_STATE_STATUS_IS_ACTIVE        (1 << 0)
516 #define QUADD_MOD_STATE_STATUS_IS_AUTH_OPEN     (1 << 1)
517
518 struct quadd_module_state {
519         u64 nr_all_samples;
520         u64 nr_skipped_samples;
521
522         u32 buffer_size;
523         u32 buffer_fill_size;
524
525         u32 reserved[16];       /* reserved fields for future extensions */
526 };
527
528 struct quadd_module_version {
529         u8 branch[32];
530         u8 version[16];
531
532         u32 samples_version;
533         u32 io_version;
534
535         u32 reserved[4];        /* reserved fields for future extensions */
536 };
537
538 enum {
539         QUADD_SEC_TYPE_EXTAB = 0,
540         QUADD_SEC_TYPE_EXIDX,
541
542         QUADD_SEC_TYPE_EH_FRAME,
543         QUADD_SEC_TYPE_EH_FRAME_HDR,
544
545         QUADD_SEC_TYPE_DEBUG_FRAME,
546         QUADD_SEC_TYPE_DEBUG_FRAME_HDR,
547
548         QUADD_SEC_TYPE_MAX,
549 };
550
551 struct quadd_sec_info {
552         u64 addr;
553         u64 length;
554
555         u64 mmap_offset;
556 };
557
558 struct quadd_sections {
559         u64 vm_start;
560         u64 vm_end;
561
562         struct quadd_sec_info sec[QUADD_SEC_TYPE_MAX];
563
564         u64 user_mmap_start;
565
566         u64 reserved[4];        /* reserved fields for future extensions */
567 };
568
569 struct quadd_mmap_rb_info {
570         u32 cpu_id;
571
572         u64 vm_start;
573         u64 vm_end;
574
575         u32 reserved[4];        /* reserved fields for future extensions */
576 };
577
578 #define QUADD_MMAP_HEADER_MAGIC         0x33445566
579
580 struct quadd_mmap_header {
581         u32 magic;
582         u32 version;
583
584         u32 cpu_id;
585         u32 samples_version;
586
587         u32 reserved[4];        /* reserved fields for future extensions */
588 } __aligned(8);
589
590 enum {
591         QUADD_RB_STATE_NONE = 0,
592         QUADD_RB_STATE_ACTIVE,
593         QUADD_RB_STATE_STOPPED,
594 };
595
596 struct quadd_ring_buffer_hdr {
597         u32 state;
598         u32 size;
599
600         u32 pos_read;
601         u32 pos_write;
602
603         u32 max_fill_count;
604         u32 skipped_samples;
605
606         u32 reserved[4];        /* reserved fields for future extensions */
607 } __aligned(8);
608
609 #pragma pack(pop)
610
611 #ifdef __KERNEL__
612
613 struct task_struct;
614 struct vm_area_struct;
615
616 #ifdef CONFIG_TEGRA_PROFILER
617 extern void __quadd_task_sched_in(struct task_struct *prev,
618                                   struct task_struct *task);
619 extern void __quadd_task_sched_out(struct task_struct *prev,
620                                    struct task_struct *next);
621
622 extern void __quadd_event_mmap(struct vm_area_struct *vma);
623
624 static inline void quadd_task_sched_in(struct task_struct *prev,
625                                        struct task_struct *task)
626 {
627         __quadd_task_sched_in(prev, task);
628 }
629
630 static inline void quadd_task_sched_out(struct task_struct *prev,
631                                         struct task_struct *next)
632 {
633         __quadd_task_sched_out(prev, next);
634 }
635
636 static inline void quadd_event_mmap(struct vm_area_struct *vma)
637 {
638         __quadd_event_mmap(vma);
639 }
640
641 #else   /* CONFIG_TEGRA_PROFILER */
642
643 static inline void quadd_task_sched_in(struct task_struct *prev,
644                                        struct task_struct *task)
645 {
646 }
647
648 static inline void quadd_task_sched_out(struct task_struct *prev,
649                                         struct task_struct *next)
650 {
651 }
652
653 static inline void quadd_event_mmap(struct vm_area_struct *vma)
654 {
655 }
656
657 #endif  /* CONFIG_TEGRA_PROFILER */
658
659 #endif  /* __KERNEL__ */
660
661 #endif  /* __TEGRA_PROFILER_H */