2 * include/linux/tegra_profiler.h
4 * Copyright (c) 2013-2016, NVIDIA CORPORATION. All rights reserved.
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.
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
17 #ifndef __TEGRA_PROFILER_H
18 #define __TEGRA_PROFILER_H
20 #include <linux/ioctl.h>
22 #define QUADD_SAMPLES_VERSION 36
23 #define QUADD_IO_VERSION 20
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
42 #define QUADD_SAMPLE_VERSION_THUMB_MODE_FLAG 17
43 #define QUADD_SAMPLE_VERSION_GROUP_SAMPLES 18
44 #define QUADD_SAMPLE_VERSION_THREAD_STATE_FLD 19
45 #define QUADD_SAMPLE_VERSION_BT_UNWIND_TABLES 22
46 #define QUADD_SAMPLE_VERSION_SUPPORT_IP64 23
47 #define QUADD_SAMPLE_VERSION_SPECIAL_MMAP 24
48 #define QUADD_SAMPLE_VERSION_UNWIND_MIXED 25
49 #define QUADD_SAMPLE_VERSION_UNW_ENTRY_TYPE 26
50 #define QUADD_SAMPLE_VERSION_USE_ARCH_TIMER 27
51 #define QUADD_SAMPLE_VERSION_SCHED_SAMPLES 28
52 #define QUADD_SAMPLE_VERSION_HDR_UNW_METHOD 29
53 #define QUADD_SAMPLE_VERSION_HDR_ARCH_TIMER 30
54 #define QUADD_SAMPLE_VERSION_STACK_OFFSET 31
55 #define QUADD_SAMPLE_VERSION_SCHED_TASK_STATE 32
56 #define QUADD_SAMPLE_VERSION_URCS 33
57 #define QUADD_SAMPLE_VERSION_HOTPLUG 34
58 #define QUADD_SAMPLE_VERSION_PER_CPU_SETUP 35
59 #define QUADD_SAMPLE_VERSION_REPORT_TGID 36
61 #define QUADD_MMAP_HEADER_VERSION 1
63 #define QUADD_MAX_COUNTERS 32
64 #define QUADD_MAX_PROCESS 64
66 #define QUADD_DEVICE_NAME "quadd"
67 #define QUADD_AUTH_DEVICE_NAME "quadd_auth"
69 #define QUADD_MOD_DEVICE_NAME "quadd_mod"
70 #define QUADD_MOD_AUTH_DEVICE_NAME "quadd_mod_auth"
72 #define QUADD_IOCTL 100
75 * Setup params (profiling frequency, etc.)
77 #define IOCTL_SETUP _IOW(QUADD_IOCTL, 0, struct quadd_parameters)
82 #define IOCTL_START _IO(QUADD_IOCTL, 1)
87 #define IOCTL_STOP _IO(QUADD_IOCTL, 2)
90 * Getting capabilities
92 #define IOCTL_GET_CAP _IOR(QUADD_IOCTL, 3, struct quadd_comm_cap)
95 * Getting state of module
97 #define IOCTL_GET_STATE _IOR(QUADD_IOCTL, 4, struct quadd_module_state)
100 * Getting version of module
102 #define IOCTL_GET_VERSION _IOR(QUADD_IOCTL, 5, struct quadd_module_version)
105 * Send exception-handling tables info
106 * This ioctl is obsolete
108 /*#define IOCTL_SET_EXTAB _IOW(QUADD_IOCTL, 6, struct quadd_extables)*/
111 * Send ring buffer mmap info
113 #define IOCTL_SET_MMAP_RB _IOW(QUADD_IOCTL, 7, struct quadd_mmap_rb_info)
118 #define IOCTL_SET_SECTIONS_INFO _IOW(QUADD_IOCTL, 8, struct quadd_sections)
123 #define IOCTL_SETUP_PMU_FOR_CPU _IOW(QUADD_IOCTL, 9,\
124 struct quadd_pmu_setup_for_cpu)
127 * Per CPU capabilities
129 #define IOCTL_GET_CAP_FOR_CPU _IOWR(QUADD_IOCTL, 10,\
130 struct quadd_comm_cap_for_cpu)
134 #define QUADD_CPUMODE_TEGRA_POWER_CLUSTER_LP (1 << 29) /* LP CPU */
135 #define QUADD_CPUMODE_THUMB (1 << 30) /* thumb mode */
137 enum quadd_events_id {
138 QUADD_EVENT_TYPE_CPU_CYCLES = 0,
140 QUADD_EVENT_TYPE_INSTRUCTIONS,
141 QUADD_EVENT_TYPE_BRANCH_INSTRUCTIONS,
142 QUADD_EVENT_TYPE_BRANCH_MISSES,
143 QUADD_EVENT_TYPE_BUS_CYCLES,
145 QUADD_EVENT_TYPE_L1_DCACHE_READ_MISSES,
146 QUADD_EVENT_TYPE_L1_DCACHE_WRITE_MISSES,
147 QUADD_EVENT_TYPE_L1_ICACHE_MISSES,
149 QUADD_EVENT_TYPE_L2_DCACHE_READ_MISSES,
150 QUADD_EVENT_TYPE_L2_DCACHE_WRITE_MISSES,
151 QUADD_EVENT_TYPE_L2_ICACHE_MISSES,
153 QUADD_EVENT_TYPE_MAX,
164 enum quadd_record_type {
165 QUADD_RECORD_TYPE_SAMPLE = 1,
166 QUADD_RECORD_TYPE_MMAP,
167 QUADD_RECORD_TYPE_MA,
168 QUADD_RECORD_TYPE_COMM,
169 QUADD_RECORD_TYPE_DEBUG,
170 QUADD_RECORD_TYPE_HEADER,
171 QUADD_RECORD_TYPE_POWER_RATE,
172 QUADD_RECORD_TYPE_ADDITIONAL_SAMPLE,
173 QUADD_RECORD_TYPE_SCHED,
174 QUADD_RECORD_TYPE_HOTPLUG,
177 enum quadd_event_source {
178 QUADD_EVENT_SOURCE_PMU = 1,
179 QUADD_EVENT_SOURCE_PL310,
182 enum quadd_cpu_mode {
183 QUADD_CPU_MODE_KERNEL = 1,
188 #pragma pack(push, 1)
190 #define QUADD_SAMPLE_RES_URCS_ENABLED (1 << 0)
192 #define QUADD_SAMPLE_URC_MASK 0xff
194 #define QUADD_SAMPLE_URC_SHIFT_FP 0
195 #define QUADD_SAMPLE_URC_SHIFT_UT (1 * 8)
196 #define QUADD_SAMPLE_URC_SHIFT_DWARF (2 * 8)
199 QUADD_URC_SUCCESS = 0,
201 QUADD_URC_IDX_NOT_FOUND,
202 QUADD_URC_TBL_NOT_EXIST,
204 QUADD_URC_TBL_IS_CORRUPT,
205 QUADD_URC_CANTUNWIND,
206 QUADD_URC_UNHANDLED_INSTRUCTION,
207 QUADD_URC_REFUSE_TO_UNWIND,
208 QUADD_URC_SP_INCORRECT,
209 QUADD_URC_SPARE_ENCODING,
210 QUADD_URC_UNSUPPORTED_PR,
211 QUADD_URC_PC_INCORRECT,
212 QUADD_URC_LEVEL_TOO_DEEP,
213 QUADD_URC_FP_INCORRECT,
215 QUADD_URC_UNWIND_MISMATCH,
216 QUADD_URC_TBL_LINK_INCORRECT,
220 #define QUADD_SED_IP64 (1 << 0)
222 #define QUADD_SED_STACK_OFFSET_SHIFT 1
223 #define QUADD_SED_STACK_OFFSET_MASK (0xffff << QUADD_SED_STACK_OFFSET_SHIFT)
226 QUADD_UNW_TYPE_FP = 0,
228 QUADD_UNW_TYPE_LR_FP,
229 QUADD_UNW_TYPE_LR_UT,
231 QUADD_UNW_TYPE_DWARF_EH,
232 QUADD_UNW_TYPE_DWARF_DF,
235 struct quadd_sample_data {
253 #define QUADD_MMAP_ED_IS_FILE_EXISTS (1 << 0)
255 struct quadd_mmap_data {
265 struct quadd_ma_data {
273 struct quadd_power_rate_data {
282 struct quadd_hotplug_data {
290 struct quadd_additional_sample {
298 QUADD_SCHED_IDX_TASK_STATE = 0,
299 QUADD_SCHED_IDX_RESERVED,
302 struct quadd_sched_data {
316 QM_DEBUG_SAMPLE_TYPE_SCHED_IN = 1,
317 QM_DEBUG_SAMPLE_TYPE_SCHED_OUT,
319 QM_DEBUG_SAMPLE_TYPE_TIMER_HANDLE,
320 QM_DEBUG_SAMPLE_TYPE_TIMER_START,
321 QM_DEBUG_SAMPLE_TYPE_TIMER_CANCEL,
322 QM_DEBUG_SAMPLE_TYPE_TIMER_FORWARD,
324 QM_DEBUG_SAMPLE_TYPE_READ_COUNTER,
326 QM_DEBUG_SAMPLE_TYPE_SOURCE_START,
327 QM_DEBUG_SAMPLE_TYPE_SOURCE_STOP,
330 struct quadd_debug_data {
346 #define QUADD_HEADER_MAGIC 0x1122
348 #define QUADD_HDR_BT_FP (1 << 0)
349 #define QUADD_HDR_BT_UT (1 << 1)
350 #define QUADD_HDR_BT_UT_CE (1 << 2)
351 #define QUADD_HDR_USE_ARCH_TIMER (1 << 3)
352 #define QUADD_HDR_STACK_OFFSET (1 << 4)
353 #define QUADD_HDR_BT_DWARF (1 << 5)
354 #define QUADD_HDR_HAS_CPUID (1 << 6)
356 struct quadd_header_data {
366 reserved:26; /* reserved fields for future extensions */
376 struct quadd_record_data {
379 /* sample: it should be the biggest size */
381 struct quadd_sample_data sample;
382 struct quadd_mmap_data mmap;
383 struct quadd_ma_data ma;
384 struct quadd_debug_data debug;
385 struct quadd_header_data hdr;
386 struct quadd_power_rate_data power_rate;
387 struct quadd_hotplug_data hotplug;
388 struct quadd_sched_data sched;
389 struct quadd_additional_sample additional_sample;
395 #define QUADD_MAX_PACKAGE_NAME 320
398 QUADD_PARAM_IDX_SIZE_OF_RB = 0,
399 QUADD_PARAM_IDX_EXTRA = 1,
400 QUADD_PARAM_IDX_BT_LOWER_BOUND = 2,
403 #define QUADD_PARAM_EXTRA_GET_MMAP (1 << 0)
404 #define QUADD_PARAM_EXTRA_BT_FP (1 << 1)
405 #define QUADD_PARAM_EXTRA_BT_UT (1 << 2)
406 #define QUADD_PARAM_EXTRA_BT_MIXED (1 << 3)
407 #define QUADD_PARAM_EXTRA_USE_ARCH_TIMER (1 << 4)
408 #define QUADD_PARAM_EXTRA_STACK_OFFSET (1 << 5)
409 #define QUADD_PARAM_EXTRA_BT_UT_CE (1 << 6)
410 #define QUADD_PARAM_EXTRA_BT_DWARF (1 << 7)
411 #define QUADD_PARAM_EXTRA_PER_PMU_SETUP (1 << 8)
413 struct quadd_parameters {
424 u32 pids[QUADD_MAX_PROCESS];
427 u8 package_name[QUADD_MAX_PACKAGE_NAME];
429 u32 events[QUADD_MAX_COUNTERS];
432 u32 reserved[16]; /* reserved fields for future extensions */
435 struct quadd_pmu_setup_for_cpu {
437 u32 events[QUADD_MAX_COUNTERS];
443 struct quadd_events_cap {
446 branch_instructions:1,
450 l1_dcache_read_misses:1,
451 l1_dcache_write_misses:1,
454 l2_dcache_read_misses:1,
455 l2_dcache_write_misses:1,
460 QUADD_COMM_CAP_IDX_EXTRA = 0,
461 QUADD_COMM_CAP_IDX_CPU_MASK = 1,
464 #define QUADD_COMM_CAP_EXTRA_BT_KERNEL_CTX (1 << 0)
465 #define QUADD_COMM_CAP_EXTRA_GET_MMAP (1 << 1)
466 #define QUADD_COMM_CAP_EXTRA_GROUP_SAMPLES (1 << 2)
467 #define QUADD_COMM_CAP_EXTRA_BT_UNWIND_TABLES (1 << 3)
468 #define QUADD_COMM_CAP_EXTRA_SUPPORT_AARCH64 (1 << 4)
469 #define QUADD_COMM_CAP_EXTRA_SPECIAL_ARCH_MMAP (1 << 5)
470 #define QUADD_COMM_CAP_EXTRA_UNWIND_MIXED (1 << 6)
471 #define QUADD_COMM_CAP_EXTRA_UNW_ENTRY_TYPE (1 << 7)
472 #define QUADD_COMM_CAP_EXTRA_ARCH_TIMER (1 << 8)
473 #define QUADD_COMM_CAP_EXTRA_RB_MMAP_OP (1 << 9)
474 #define QUADD_COMM_CAP_EXTRA_CPU_MASK (1 << 10)
476 struct quadd_comm_cap {
480 l2_multiple_events:1,
484 struct quadd_events_cap events_cap; /* Deprecated. */
486 u32 reserved[16]; /* reserved fields for future extensions */
489 struct quadd_comm_cap_for_cpu {
491 l2_multiple_events:1;
493 struct quadd_events_cap events_cap;
497 QUADD_MOD_STATE_IDX_RB_MAX_FILL_COUNT = 0,
498 QUADD_MOD_STATE_IDX_STATUS,
501 #define QUADD_MOD_STATE_STATUS_IS_ACTIVE (1 << 0)
502 #define QUADD_MOD_STATE_STATUS_IS_AUTH_OPEN (1 << 1)
504 struct quadd_module_state {
506 u64 nr_skipped_samples;
509 u32 buffer_fill_size;
511 u32 reserved[16]; /* reserved fields for future extensions */
514 struct quadd_module_version {
521 u32 reserved[4]; /* reserved fields for future extensions */
525 QUADD_SEC_TYPE_EXTAB = 0,
526 QUADD_SEC_TYPE_EXIDX,
528 QUADD_SEC_TYPE_EH_FRAME,
529 QUADD_SEC_TYPE_EH_FRAME_HDR,
531 QUADD_SEC_TYPE_DEBUG_FRAME,
532 QUADD_SEC_TYPE_DEBUG_FRAME_HDR,
537 struct quadd_sec_info {
544 struct quadd_sections {
548 struct quadd_sec_info sec[QUADD_SEC_TYPE_MAX];
552 u64 reserved[4]; /* reserved fields for future extensions */
555 struct quadd_mmap_rb_info {
561 u32 reserved[4]; /* reserved fields for future extensions */
564 #define QUADD_MMAP_HEADER_MAGIC 0x33445566
566 struct quadd_mmap_header {
573 u32 reserved[4]; /* reserved fields for future extensions */
577 QUADD_RB_STATE_NONE = 0,
578 QUADD_RB_STATE_ACTIVE,
579 QUADD_RB_STATE_STOPPED,
582 struct quadd_ring_buffer_hdr {
592 u32 reserved[4]; /* reserved fields for future extensions */
600 struct vm_area_struct;
602 #ifdef CONFIG_TEGRA_PROFILER
603 extern void __quadd_task_sched_in(struct task_struct *prev,
604 struct task_struct *task);
605 extern void __quadd_task_sched_out(struct task_struct *prev,
606 struct task_struct *next);
608 extern void __quadd_event_mmap(struct vm_area_struct *vma);
610 static inline void quadd_task_sched_in(struct task_struct *prev,
611 struct task_struct *task)
613 __quadd_task_sched_in(prev, task);
616 static inline void quadd_task_sched_out(struct task_struct *prev,
617 struct task_struct *next)
619 __quadd_task_sched_out(prev, next);
622 static inline void quadd_event_mmap(struct vm_area_struct *vma)
624 __quadd_event_mmap(vma);
627 #else /* CONFIG_TEGRA_PROFILER */
629 static inline void quadd_task_sched_in(struct task_struct *prev,
630 struct task_struct *task)
634 static inline void quadd_task_sched_out(struct task_struct *prev,
635 struct task_struct *next)
639 static inline void quadd_event_mmap(struct vm_area_struct *vma)
643 #endif /* CONFIG_TEGRA_PROFILER */
645 #endif /* __KERNEL__ */
647 #endif /* __TEGRA_PROFILER_H */