]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/blob - include/linux/tegra_profiler.h
misc: tegra-profiler: use cntvct as time source
[sojka/nv-tegra/linux-3.10.git] / include / linux / tegra_profiler.h
1 /*
2  * include/linux/tegra_profiler.h
3  *
4  * Copyright (c) 2014, 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   27
23 #define QUADD_IO_VERSION        12
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
34 #define QUADD_SAMPLE_VERSION_THUMB_MODE_FLAG    17
35 #define QUADD_SAMPLE_VERSION_GROUP_SAMPLES      18
36 #define QUADD_SAMPLE_VERSION_THREAD_STATE_FLD   19
37 #define QUADD_SAMPLE_VERSION_BT_UNWIND_TABLES   22
38 #define QUADD_SAMPLE_VERSION_SUPPORT_IP64       23
39 #define QUADD_SAMPLE_VERSION_SPECIAL_MMAP       24
40 #define QUADD_SAMPLE_VERSION_UNWIND_MIXED       25
41 #define QUADD_SAMPLE_VERSION_UNW_ENTRY_TYPE     26
42 #define QUADD_SAMPLE_VERSION_USE_ARCH_TIMER     27
43
44 #define QUADD_MAX_COUNTERS      32
45 #define QUADD_MAX_PROCESS       64
46
47 #define QUADD_DEVICE_NAME       "quadd"
48 #define QUADD_AUTH_DEVICE_NAME  "quadd_auth"
49
50 #define QUADD_MOD_DEVICE_NAME           "quadd_mod"
51 #define QUADD_MOD_AUTH_DEVICE_NAME      "quadd_mod_auth"
52
53 #define QUADD_IOCTL     100
54
55 /*
56  * Setup params (profiling frequency, etc.)
57  */
58 #define IOCTL_SETUP _IOW(QUADD_IOCTL, 0, struct quadd_parameters)
59
60 /*
61  * Start profiling.
62  */
63 #define IOCTL_START _IO(QUADD_IOCTL, 1)
64
65 /*
66  * Stop profiling.
67  */
68 #define IOCTL_STOP _IO(QUADD_IOCTL, 2)
69
70 /*
71  * Getting capabilities
72  */
73 #define IOCTL_GET_CAP _IOR(QUADD_IOCTL, 3, struct quadd_comm_cap)
74
75 /*
76  * Getting state of module
77  */
78 #define IOCTL_GET_STATE _IOR(QUADD_IOCTL, 4, struct quadd_module_state)
79
80 /*
81  * Getting version of module
82  */
83 #define IOCTL_GET_VERSION _IOR(QUADD_IOCTL, 5, struct quadd_module_version)
84
85 /*
86  * Send exception-handling tables info
87  */
88 #define IOCTL_SET_EXTAB _IOW(QUADD_IOCTL, 6, struct quadd_extables)
89
90 #define QUADD_CPUMODE_TEGRA_POWER_CLUSTER_LP    (1 << 29)       /* LP CPU */
91 #define QUADD_CPUMODE_THUMB                     (1 << 30)       /* thumb mode */
92
93 enum quadd_events_id {
94         QUADD_EVENT_TYPE_CPU_CYCLES = 0,
95
96         QUADD_EVENT_TYPE_INSTRUCTIONS,
97         QUADD_EVENT_TYPE_BRANCH_INSTRUCTIONS,
98         QUADD_EVENT_TYPE_BRANCH_MISSES,
99         QUADD_EVENT_TYPE_BUS_CYCLES,
100
101         QUADD_EVENT_TYPE_L1_DCACHE_READ_MISSES,
102         QUADD_EVENT_TYPE_L1_DCACHE_WRITE_MISSES,
103         QUADD_EVENT_TYPE_L1_ICACHE_MISSES,
104
105         QUADD_EVENT_TYPE_L2_DCACHE_READ_MISSES,
106         QUADD_EVENT_TYPE_L2_DCACHE_WRITE_MISSES,
107         QUADD_EVENT_TYPE_L2_ICACHE_MISSES,
108
109         QUADD_EVENT_TYPE_MAX,
110 };
111
112 struct event_data {
113         int event_source;
114         int event_id;
115
116         u32 val;
117         u32 prev_val;
118 };
119
120 enum quadd_record_type {
121         QUADD_RECORD_TYPE_SAMPLE = 1,
122         QUADD_RECORD_TYPE_MMAP,
123         QUADD_RECORD_TYPE_MA,
124         QUADD_RECORD_TYPE_COMM,
125         QUADD_RECORD_TYPE_DEBUG,
126         QUADD_RECORD_TYPE_HEADER,
127         QUADD_RECORD_TYPE_POWER_RATE,
128         QUADD_RECORD_TYPE_ADDITIONAL_SAMPLE,
129 };
130
131 enum quadd_event_source {
132         QUADD_EVENT_SOURCE_PMU = 1,
133         QUADD_EVENT_SOURCE_PL310,
134 };
135
136 enum quadd_cpu_mode {
137         QUADD_CPU_MODE_KERNEL = 1,
138         QUADD_CPU_MODE_USER,
139         QUADD_CPU_MODE_NONE,
140 };
141
142 #pragma pack(push, 1)
143
144 #define QUADD_SAMPLE_UNW_METHOD_SHIFT   0
145 #define QUADD_SAMPLE_UNW_METHOD_MASK    (1 << QUADD_SAMPLE_UNW_METHOD_SHIFT)
146
147 enum {
148         QUADD_UNW_METHOD_FP = 0,
149         QUADD_UNW_METHOD_EHT,
150         QUADD_UNW_METHOD_MIXED,
151 };
152
153 #define QUADD_SAMPLE_URC_SHIFT          1
154 #define QUADD_SAMPLE_URC_MASK           (0x0f << QUADD_SAMPLE_URC_SHIFT)
155
156 enum {
157         QUADD_URC_SUCCESS = 0,
158         QUADD_URC_FAILURE,
159         QUADD_URC_IDX_NOT_FOUND,
160         QUADD_URC_TBL_NOT_EXIST,
161         QUADD_URC_EACCESS,
162         QUADD_URC_TBL_IS_CORRUPT,
163         QUADD_URC_CANTUNWIND,
164         QUADD_URC_UNHANDLED_INSTRUCTION,
165         QUADD_URC_REFUSE_TO_UNWIND,
166         QUADD_URC_SP_INCORRECT,
167         QUADD_URC_SPARE_ENCODING,
168         QUADD_URC_UNSUPPORTED_PR,
169         QUADD_URC_PC_INCORRECT,
170         QUADD_URC_LEVEL_TOO_DEEP,
171         QUADD_URC_FP_INCORRECT,
172         QUADD_URC_MAX,
173 };
174
175 #define QUADD_SED_IP64                  (1 << 0)
176
177 #define QUADD_SED_UNW_METHOD_SHIFT      1
178 #define QUADD_SED_UNW_METHOD_MASK       (0x07 << QUADD_SED_UNW_METHOD_SHIFT)
179
180 enum {
181         QUADD_UNW_TYPE_FP = 0,
182         QUADD_UNW_TYPE_UT,
183         QUADD_UNW_TYPE_LR_FP,
184         QUADD_UNW_TYPE_LR_UT,
185         QUADD_UNW_TYPE_KCTX,
186 };
187
188 struct quadd_sample_data {
189         u64 ip;
190         u32 pid;
191         u64 time;
192
193         u16     cpu:6,
194                 user_mode:1,
195                 lp_mode:1,
196                 thumb_mode:1,
197                 state:1,
198                 in_interrupt:1,
199                 reserved:5;
200
201         u8 callchain_nr;
202         u32 events_flags;
203 };
204
205 #define QUADD_MMAP_ED_IS_FILE_EXISTS    (1 << 0)
206
207 struct quadd_mmap_data {
208         u32 pid;
209
210         u64 addr;
211         u64 len;
212
213         u8 user_mode:1;
214         u16 filename_length;
215 };
216
217 struct quadd_ma_data {
218         u32 pid;
219         u64 time;
220
221         u32 vm_size;
222         u32 rss_size;
223 };
224
225 struct quadd_power_rate_data {
226         u64 time;
227
228         u8 nr_cpus;
229
230         u32 gpu;
231         u32 emc;
232 };
233
234 struct quadd_additional_sample {
235         u8 type;
236
237         u32 values[6];
238         u16 extra_length;
239 };
240
241 enum {
242         QM_DEBUG_SAMPLE_TYPE_SCHED_IN = 1,
243         QM_DEBUG_SAMPLE_TYPE_SCHED_OUT,
244
245         QM_DEBUG_SAMPLE_TYPE_TIMER_HANDLE,
246         QM_DEBUG_SAMPLE_TYPE_TIMER_START,
247         QM_DEBUG_SAMPLE_TYPE_TIMER_CANCEL,
248         QM_DEBUG_SAMPLE_TYPE_TIMER_FORWARD,
249
250         QM_DEBUG_SAMPLE_TYPE_READ_COUNTER,
251
252         QM_DEBUG_SAMPLE_TYPE_SOURCE_START,
253         QM_DEBUG_SAMPLE_TYPE_SOURCE_STOP,
254 };
255
256 struct quadd_debug_data {
257         u8 type;
258
259         u32 pid;
260         u64 time;
261
262         u16     cpu:6,
263                 user_mode:1,
264                 lp_mode:1,
265                 thumb_mode:1,
266                 reserved:7;
267
268         u32 extra_value[2];
269         u16 extra_length;
270 };
271
272 #define QUADD_HEADER_MAGIC      0x1122
273
274 struct quadd_header_data {
275         u16 magic;
276         u16 version;
277
278         u32     backtrace:1,
279                 use_freq:1,
280                 system_wide:1,
281                 power_rate:1,
282                 debug_samples:1,
283                 get_mmap:1,
284                 reserved:26;    /* reserved fields for future extensions */
285
286         u32 freq;
287         u16 ma_freq;
288         u16 power_rate_freq;
289
290         u8 nr_events;
291         u16 extra_length;
292 };
293
294 struct quadd_record_data {
295         u8 record_type;
296
297         /* sample: it should be the biggest size */
298         union {
299                 struct quadd_sample_data        sample;
300                 struct quadd_mmap_data          mmap;
301                 struct quadd_ma_data            ma;
302                 struct quadd_debug_data         debug;
303                 struct quadd_header_data        hdr;
304                 struct quadd_power_rate_data    power_rate;
305                 struct quadd_additional_sample  additional_sample;
306         };
307 } __aligned(4);
308
309 #pragma pack(4)
310
311 #define QUADD_MAX_PACKAGE_NAME  320
312
313 enum {
314         QUADD_PARAM_IDX_SIZE_OF_RB      = 0,
315         QUADD_PARAM_IDX_EXTRA           = 1,
316 };
317
318 #define QUADD_PARAM_EXTRA_GET_MMAP              (1 << 0)
319 #define QUADD_PARAM_EXTRA_BT_FP                 (1 << 1)
320 #define QUADD_PARAM_EXTRA_BT_UNWIND_TABLES      (1 << 2)
321 #define QUADD_PARAM_EXTRA_BT_MIXED              (1 << 3)
322
323 struct quadd_parameters {
324         u32 freq;
325         u32 ma_freq;
326         u32 power_rate_freq;
327
328         u64     backtrace:1,
329                 use_freq:1,
330                 system_wide:1,
331                 debug_samples:1;
332
333         u32 pids[QUADD_MAX_PROCESS];
334         u32 nr_pids;
335
336         u8 package_name[QUADD_MAX_PACKAGE_NAME];
337
338         u32 events[QUADD_MAX_COUNTERS];
339         u32 nr_events;
340
341         u32 reserved[16];       /* reserved fields for future extensions */
342 };
343
344 struct quadd_events_cap {
345         u32     cpu_cycles:1,
346                 instructions:1,
347                 branch_instructions:1,
348                 branch_misses:1,
349                 bus_cycles:1,
350
351                 l1_dcache_read_misses:1,
352                 l1_dcache_write_misses:1,
353                 l1_icache_misses:1,
354
355                 l2_dcache_read_misses:1,
356                 l2_dcache_write_misses:1,
357                 l2_icache_misses:1;
358 };
359
360 enum {
361         QUADD_COMM_CAP_IDX_EXTRA = 0,
362 };
363
364 #define QUADD_COMM_CAP_EXTRA_BT_KERNEL_CTX      (1 << 0)
365 #define QUADD_COMM_CAP_EXTRA_GET_MMAP           (1 << 1)
366 #define QUADD_COMM_CAP_EXTRA_GROUP_SAMPLES      (1 << 2)
367 #define QUADD_COMM_CAP_EXTRA_BT_UNWIND_TABLES   (1 << 3)
368 #define QUADD_COMM_CAP_EXTRA_SUPPORT_AARCH64    (1 << 4)
369 #define QUADD_COMM_CAP_EXTRA_SPECIAL_ARCH_MMAP  (1 << 5)
370 #define QUADD_COMM_CAP_EXTRA_UNWIND_MIXED       (1 << 6)
371 #define QUADD_COMM_CAP_EXTRA_UNW_ENTRY_TYPE     (1 << 7)
372 #define QUADD_COMM_CAP_EXTRA_USE_ARCH_TIMER     (1 << 8)
373
374 struct quadd_comm_cap {
375         u32     pmu:1,
376                 power_rate:1,
377                 l2_cache:1,
378                 l2_multiple_events:1,
379                 tegra_lp_cluster:1,
380                 blocked_read:1;
381
382         struct quadd_events_cap events_cap;
383
384         u32 reserved[16];       /* reserved fields for future extensions */
385 };
386
387 enum {
388         QUADD_MOD_STATE_IDX_RB_MAX_FILL_COUNT = 0,
389         QUADD_MOD_STATE_IDX_STATUS,
390 };
391
392 #define QUADD_MOD_STATE_STATUS_IS_ACTIVE        (1 << 0)
393 #define QUADD_MOD_STATE_STATUS_IS_AUTH_OPEN     (1 << 1)
394
395 struct quadd_module_state {
396         u64 nr_all_samples;
397         u64 nr_skipped_samples;
398
399         u32 buffer_size;
400         u32 buffer_fill_size;
401
402         u32 reserved[16];       /* reserved fields for future extensions */
403 };
404
405 struct quadd_module_version {
406         u8 branch[32];
407         u8 version[16];
408
409         u32 samples_version;
410         u32 io_version;
411
412         u32 reserved[4];        /* reserved fields for future extensions */
413 };
414
415 struct quadd_sec_info {
416         u64 addr;
417         u64 length;
418 };
419
420 enum {
421         QUADD_EXT_IDX_EXTAB_OFFSET = 0,
422         QUADD_EXT_IDX_EXIDX_OFFSET = 1,
423         QUADD_EXT_IDX_MMAP_VM_START = 2,
424 };
425
426 struct quadd_extables {
427         u64 vm_start;
428         u64 vm_end;
429
430         struct quadd_sec_info extab;
431         struct quadd_sec_info exidx;
432
433         u32 reserved[4];        /* reserved fields for future extensions */
434 };
435
436 #pragma pack(pop)
437
438 #ifdef __KERNEL__
439
440 struct task_struct;
441 struct vm_area_struct;
442
443 #ifdef CONFIG_TEGRA_PROFILER
444 extern void __quadd_task_sched_in(struct task_struct *prev,
445                                   struct task_struct *task);
446 extern void __quadd_task_sched_out(struct task_struct *prev,
447                                    struct task_struct *next);
448
449 extern void __quadd_event_mmap(struct vm_area_struct *vma);
450
451 static inline void quadd_task_sched_in(struct task_struct *prev,
452                                        struct task_struct *task)
453 {
454         __quadd_task_sched_in(prev, task);
455 }
456
457 static inline void quadd_task_sched_out(struct task_struct *prev,
458                                         struct task_struct *next)
459 {
460         __quadd_task_sched_out(prev, next);
461 }
462
463 static inline void quadd_event_mmap(struct vm_area_struct *vma)
464 {
465         __quadd_event_mmap(vma);
466 }
467
468 #else   /* CONFIG_TEGRA_PROFILER */
469
470 static inline void quadd_task_sched_in(struct task_struct *prev,
471                                        struct task_struct *task)
472 {
473 }
474
475 static inline void quadd_task_sched_out(struct task_struct *prev,
476                                         struct task_struct *next)
477 {
478 }
479
480 static inline void quadd_event_mmap(struct vm_area_struct *vma)
481 {
482 }
483
484 #endif  /* CONFIG_TEGRA_PROFILER */
485
486 #endif  /* __KERNEL__ */
487
488 #endif  /* __TEGRA_PROFILER_H */