import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / include / linux / met_drv.h
CommitLineData
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
9extern 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
24DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf_nmi);
25DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf_irq);
26DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf_sirq);
27DECLARE_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
69struct 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
97int met_register(struct metdevice *met);
98int met_deregister(struct metdevice *met);
99int met_set_platform(const char *plf_name, int flag);
100int met_set_topology(const char *topology_name, int flag);
101int met_devlink_add(struct metdevice *met);
102int met_devlink_del(struct metdevice *met);
103int met_devlink_register_all(void);
104int met_devlink_deregister_all(void);
105
106int fs_reg(void);
107void 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 */
140typedef 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>
209int __attribute__((weak)) met_tag_init(void);
210
211int __attribute__((weak)) met_tag_uninit(void);
212
213int __attribute__((weak)) met_tag_start(unsigned int class_id,
214 const char *name);
215
216int __attribute__((weak)) met_tag_end(unsigned int class_id,
217 const char *name);
218
219int __attribute__((weak)) met_tag_oneshot(unsigned int class_id,
220 const char *name,
221 unsigned int value);
222
223int met_tag_userdata(char * pData);
224
225int __attribute__((weak)) met_tag_dump(unsigned int class_id,
226 const char *name,
227 void *data,
228 unsigned int length);
229
230int __attribute__((weak)) met_tag_disable(unsigned int class_id);
231
232int __attribute__((weak)) met_tag_enable(unsigned int class_id);
233
234int __attribute__((weak)) met_set_dump_buffer(int size);
235
236int __attribute__((weak)) met_save_dump_buffer(const char *pathname);
237
238int __attribute__((weak)) met_save_log(const char *pathname);
239
240int __attribute__((weak)) met_show_bw_limiter(void);
241int __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 */