ARM: tegra: Add Tegra Profiler
[linux-2.6.git] / drivers / misc / tegra-profiler / hrt.h
1 /*
2  * drivers/misc/tegra-profiler/hrt.h
3  *
4  * Copyright (c) 2013, 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 __QUADD_HRT_H
18 #define __QUADD_HRT_H
19
20 #define QUADD_MAX_STACK_DEPTH           64
21
22 #ifdef __KERNEL__
23
24 #include <linux/hrtimer.h>
25 #include <linux/limits.h>
26 #include <linux/kprobes.h>
27
28 #include "backtrace.h"
29
30 #define QUADD_USE_CORRECT_SAMPLE_TS     1
31
32 struct quadd_thread_data {
33         pid_t pid;
34         pid_t tgid;
35 };
36
37 struct quadd_cpu_context {
38         struct hrtimer hrtimer;
39
40         struct quadd_callchain callchain_data;
41         char mmap_filename[PATH_MAX];
42
43         struct quadd_thread_data active_thread;
44         atomic_t nr_active;
45
46 #ifdef QUADD_USE_CORRECT_SAMPLE_TS
47         u64 prev_time;
48         u64 current_time;
49 #endif
50 };
51
52 struct quadd_hrt_ctx {
53         struct quadd_cpu_context * __percpu cpu_ctx;
54         u64 sample_period;
55
56         struct kprobe kp_in;
57         /* struct kinstr ki_out; */
58
59         struct quadd_ctx *quadd_ctx;
60
61         int active;
62         atomic64_t counter_samples;
63         atomic_t nr_active_all_core;
64
65         struct timer_list ma_timer;
66         unsigned int ma_period;
67
68         unsigned long vm_size_prev;
69         unsigned long rss_size_prev;
70 };
71
72 #define QUADD_HRT_MIN_FREQ      110
73
74 #define QUADD_U32_MAX (~(__u32)0)
75
76 struct quadd_hrt_ctx;
77 struct quadd_record_data;
78 struct quadd_module_state;
79
80 struct quadd_hrt_ctx *quadd_hrt_init(struct quadd_ctx *ctx);
81 void quadd_hrt_deinit(void);
82
83 int quadd_hrt_start(void);
84 void quadd_hrt_stop(void);
85
86 void quadd_put_sample(struct quadd_record_data *data,
87                       char *extra_data, unsigned int extra_length);
88
89 void quadd_hrt_get_state(struct quadd_module_state *state);
90 u64 quadd_get_time(void);
91
92 #endif  /* __KERNEL__ */
93
94 #endif  /* __QUADD_HRT_H */