Commit | Line | Data |
---|---|---|
6fa3eb70 S |
1 | #ifndef MET_DRV |
2 | #define MET_DRV | |
3 | ||
4 | #include <linux/version.h> | |
5 | #include <linux/device.h> | |
6 | #include <linux/percpu.h> | |
7 | #include <linux/hardirq.h> | |
8 | ||
9 | extern int met_mode; | |
10 | ||
11 | #define MET_MODE_TRACE_CMD_OFFSET (1) | |
12 | #define MET_MODE_TRACE_CMD (1<<MET_MODE_TRACE_CMD_OFFSET) | |
13 | ||
14 | #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0) | |
15 | #define MET_PRINTK(FORMAT, args...) \ | |
16 | do { \ | |
17 | if (met_mode & MET_MODE_TRACE_CMD) \ | |
18 | trace_printk("%s: " FORMAT, __func__, ##args); \ | |
19 | else \ | |
20 | trace_printk(FORMAT, ##args); \ | |
21 | } while (0) | |
22 | #else | |
23 | #define MET_STRBUF_SIZE 1024 | |
24 | DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf_nmi); | |
25 | DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf_irq); | |
26 | DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf_sirq); | |
27 | DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf); | |
28 | ||
29 | #ifdef CONFIG_FTRACE | |
30 | #define TRACE_PUTS(p) \ | |
31 | do { \ | |
32 | trace_puts(pmet_strbuf); \ | |
33 | } while (0) | |
34 | #else | |
35 | #define TRACE_PUTS(p) do {} while (0) | |
36 | #endif | |
37 | ||
38 | #define MET_PRINTK(FORMAT, args...) \ | |
39 | do { \ | |
40 | char *pmet_strbuf; \ | |
41 | preempt_disable(); \ | |
42 | if (in_nmi()) \ | |
43 | pmet_strbuf = per_cpu(met_strbuf_nmi, smp_processor_id()); \ | |
44 | else if (in_irq()) \ | |
45 | pmet_strbuf = per_cpu(met_strbuf_irq, smp_processor_id()); \ | |
46 | else if (in_softirq()) \ | |
47 | pmet_strbuf = per_cpu(met_strbuf_sirq, smp_processor_id()); \ | |
48 | else \ | |
49 | pmet_strbuf = per_cpu(met_strbuf, smp_processor_id()); \ | |
50 | if (met_mode & MET_MODE_TRACE_CMD) \ | |
51 | snprintf(pmet_strbuf, MET_STRBUF_SIZE, "%s: " FORMAT, __func__, ##args); \ | |
52 | else \ | |
53 | snprintf(pmet_strbuf, MET_STRBUF_SIZE, FORMAT, ##args); \ | |
54 | TRACE_PUTS(pmet_strbuf); \ | |
55 | preempt_enable_no_resched(); \ | |
56 | } while (0) | |
57 | #endif | |
58 | ||
59 | #define MET_FTRACE_PRINTK(TRACE_NAME, args...) \ | |
60 | do { \ | |
61 | trace_##TRACE_NAME(args); \ | |
62 | } while (0) | |
63 | ||
64 | ||
65 | #define MET_TYPE_PMU 1 | |
66 | #define MET_TYPE_BUS 2 | |
67 | #define MET_TYPE_MISC 3 | |
68 | ||
69 | struct metdevice { | |
70 | ||
71 | struct list_head list; | |
72 | int type; | |
73 | const char *name; | |
74 | struct module *owner; | |
75 | struct kobject *kobj; | |
76 | ||
77 | int (*create_subfs) (struct kobject *parent); | |
78 | void (*delete_subfs) (void); | |
79 | int mode; | |
80 | int cpu_related; | |
81 | int polling_interval; | |
82 | int polling_count_reload; | |
83 | int __percpu *polling_count; | |
84 | void (*start) (void); | |
85 | void (*stop) (void); | |
86 | int (*reset) (void); | |
87 | void (*timed_polling) (unsigned long long stamp, int cpu); | |
88 | void (*tagged_polling) (unsigned long long stamp, int cpu); | |
89 | int (*print_help) (char *buf, int len); | |
90 | int (*print_header) (char *buf, int len); | |
91 | int (*process_argument) (const char *arg, int len); | |
92 | ||
93 | struct list_head exlist; /* for linked list before register */ | |
94 | void *reversed1; | |
95 | }; | |
96 | ||
97 | int met_register(struct metdevice *met); | |
98 | int met_deregister(struct metdevice *met); | |
99 | int met_set_platform(const char *plf_name, int flag); | |
100 | int met_set_topology(const char *topology_name, int flag); | |
101 | int met_devlink_add(struct metdevice *met); | |
102 | int met_devlink_del(struct metdevice *met); | |
103 | int met_devlink_register_all(void); | |
104 | int met_devlink_deregister_all(void); | |
105 | ||
106 | int fs_reg(void); | |
107 | void fs_unreg(void); | |
108 | ||
109 | ||
110 | /****************************************************************************** | |
111 | * Tracepoints | |
112 | ******************************************************************************/ | |
113 | #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 32) | |
114 | # error Kernels prior to 2.6.32 not supported | |
115 | #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 35) | |
116 | # define MET_DEFINE_PROBE(probe_name, proto) \ | |
117 | static void probe_##probe_name(PARAMS(proto)) | |
118 | # define MET_REGISTER_TRACE(probe_name) \ | |
119 | register_trace_##probe_name(probe_##probe_name) | |
120 | # define MET_UNREGISTER_TRACE(probe_name) \ | |
121 | unregister_trace_##probe_name(probe_##probe_name) | |
122 | #else | |
123 | # define MET_DEFINE_PROBE(probe_name, proto) \ | |
124 | static void probe_##probe_name(void *data, PARAMS(proto)) | |
125 | # define MET_REGISTER_TRACE(probe_name) \ | |
126 | register_trace_##probe_name(probe_##probe_name, NULL) | |
127 | # define MET_UNREGISTER_TRACE(probe_name) \ | |
128 | unregister_trace_##probe_name(probe_##probe_name, NULL) | |
129 | #endif | |
130 | ||
131 | ||
132 | ||
133 | /* ====================== Tagging API ================================ */ | |
134 | ||
135 | #define MAX_EVENT_CLASS 31 | |
136 | #define MAX_TAGNAME_LEN 128 | |
137 | #define MET_CLASS_ALL 0x80000000 | |
138 | ||
139 | /* IOCTL commands of MET tagging */ | |
140 | typedef struct _mtag_cmd_t { | |
141 | unsigned int class_id; | |
142 | unsigned int value; | |
143 | unsigned int slen; | |
144 | char tname[MAX_TAGNAME_LEN]; | |
145 | void *data; | |
146 | unsigned int size; | |
147 | } mtag_cmd_t; | |
148 | ||
149 | #define TYPE_START 1 | |
150 | #define TYPE_END 2 | |
151 | #define TYPE_ONESHOT 3 | |
152 | #define TYPE_ENABLE 4 | |
153 | #define TYPE_DISABLE 5 | |
154 | #define TYPE_REC_SET 6 | |
155 | #define TYPE_DUMP 7 | |
156 | #define TYPE_DUMP_SIZE 8 | |
157 | #define TYPE_DUMP_SAVE 9 | |
158 | #define TYPE_USRDATA 10 | |
159 | ||
160 | /* Use 'm' as magic number */ | |
161 | #define MTAG_IOC_MAGIC 'm' | |
162 | /* Please use a different 8-bit number in your code */ | |
163 | #define MTAG_CMD_START _IOW(MTAG_IOC_MAGIC, TYPE_START, mtag_cmd_t) | |
164 | #define MTAG_CMD_END _IOW(MTAG_IOC_MAGIC, TYPE_END, mtag_cmd_t) | |
165 | #define MTAG_CMD_ONESHOT _IOW(MTAG_IOC_MAGIC, TYPE_ONESHOT, mtag_cmd_t) | |
166 | #define MTAG_CMD_ENABLE _IOW(MTAG_IOC_MAGIC, TYPE_ENABLE, int) | |
167 | #define MTAG_CMD_DISABLE _IOW(MTAG_IOC_MAGIC, TYPE_DISABLE, int) | |
168 | #define MTAG_CMD_REC_SET _IOW(MTAG_IOC_MAGIC, TYPE_REC_SET, int) | |
169 | #define MTAG_CMD_DUMP _IOW(MTAG_IOC_MAGIC, TYPE_DUMP, mtag_cmd_t) | |
170 | #define MTAG_CMD_DUMP_SIZE _IOWR(MTAG_IOC_MAGIC, TYPE_DUMP_SIZE, int) | |
171 | #define MTAG_CMD_DUMP_SAVE _IOW(MTAG_IOC_MAGIC, TYPE_DUMP_SAVE, mtag_cmd_t) | |
172 | #define MTAG_CMD_USRDATA _IOW(MTAG_IOC_MAGIC, TYPE_USRDATA, mtag_cmd_t) | |
173 | ||
174 | /* include file */ | |
175 | #ifndef MET_USER_EVENT_SUPPORT | |
176 | #define met_tag_init() (0) | |
177 | ||
178 | #define met_tag_uninit() (0) | |
179 | ||
180 | #define met_tag_start(id, name) (0) | |
181 | ||
182 | #define met_tag_end(id, name) (0) | |
183 | ||
184 | #define met_tag_oneshot(id, name, value) (0) | |
185 | ||
186 | #define met_tag_userdata(pData) (0) | |
187 | ||
188 | #define met_tag_dump(id, name, data, length) (0) | |
189 | ||
190 | #define met_tag_disable(id) (0) | |
191 | ||
192 | #define met_tag_enable(id) (0) | |
193 | ||
194 | #define met_set_dump_buffer(size) (0) | |
195 | ||
196 | #define met_save_dump_buffer(pathname) (0) | |
197 | ||
198 | #define met_save_log(pathname) (0) | |
199 | ||
200 | #define met_record_on() (0) | |
201 | ||
202 | #define met_record_off() (0) | |
203 | ||
204 | #define met_show_bw_limiter() (0) | |
205 | #define met_reg_bw_limiter() (0) | |
206 | ||
207 | #else | |
208 | #include <linux/kernel.h> | |
209 | int __attribute__((weak)) met_tag_init(void); | |
210 | ||
211 | int __attribute__((weak)) met_tag_uninit(void); | |
212 | ||
213 | int __attribute__((weak)) met_tag_start(unsigned int class_id, | |
214 | const char *name); | |
215 | ||
216 | int __attribute__((weak)) met_tag_end(unsigned int class_id, | |
217 | const char *name); | |
218 | ||
219 | int __attribute__((weak)) met_tag_oneshot(unsigned int class_id, | |
220 | const char *name, | |
221 | unsigned int value); | |
222 | ||
223 | int met_tag_userdata(char * pData); | |
224 | ||
225 | int __attribute__((weak)) met_tag_dump(unsigned int class_id, | |
226 | const char *name, | |
227 | void *data, | |
228 | unsigned int length); | |
229 | ||
230 | int __attribute__((weak)) met_tag_disable(unsigned int class_id); | |
231 | ||
232 | int __attribute__((weak)) met_tag_enable(unsigned int class_id); | |
233 | ||
234 | int __attribute__((weak)) met_set_dump_buffer(int size); | |
235 | ||
236 | int __attribute__((weak)) met_save_dump_buffer(const char *pathname); | |
237 | ||
238 | int __attribute__((weak)) met_save_log(const char *pathname); | |
239 | ||
240 | int __attribute__((weak)) met_show_bw_limiter(void); | |
241 | int __attribute__((weak)) met_reg_bw_limiter(void *fp); | |
242 | ||
243 | #define met_record_on() tracing_on() | |
244 | ||
245 | #define met_record_off() tracing_off() | |
246 | ||
247 | #endif /* MET_USER_EVENT_SUPPORT */ | |
248 | ||
249 | #endif /* MET_DRV */ |