4 #include <linux/version.h>
5 #include <linux/device.h>
6 #include <linux/percpu.h>
7 #include <linux/hardirq.h>
11 #define MET_MODE_TRACE_CMD_OFFSET (1)
12 #define MET_MODE_TRACE_CMD (1<<MET_MODE_TRACE_CMD_OFFSET)
14 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
15 #define MET_PRINTK(FORMAT, args...) \
17 if (met_mode & MET_MODE_TRACE_CMD) \
18 trace_printk("%s: " FORMAT, __func__, ##args); \
20 trace_printk(FORMAT, ##args); \
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
);
30 #define TRACE_PUTS(p) \
32 trace_puts(pmet_strbuf); \
35 #define TRACE_PUTS(p) do {} while (0)
38 #define MET_PRINTK(FORMAT, args...) \
43 pmet_strbuf = per_cpu(met_strbuf_nmi, smp_processor_id()); \
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()); \
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); \
53 snprintf(pmet_strbuf, MET_STRBUF_SIZE, FORMAT, ##args); \
54 TRACE_PUTS(pmet_strbuf); \
55 preempt_enable_no_resched(); \
59 #define MET_FTRACE_PRINTK(TRACE_NAME, args...) \
61 trace_##TRACE_NAME(args); \
65 #define MET_TYPE_PMU 1
66 #define MET_TYPE_BUS 2
67 #define MET_TYPE_MISC 3
71 struct list_head list
;
77 int (*create_subfs
) (struct kobject
*parent
);
78 void (*delete_subfs
) (void);
82 int polling_count_reload
;
83 int __percpu
*polling_count
;
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
);
93 struct list_head exlist
; /* for linked list before register */
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);
110 /******************************************************************************
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)
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)
133 /* ====================== Tagging API ================================ */
135 #define MAX_EVENT_CLASS 31
136 #define MAX_TAGNAME_LEN 128
137 #define MET_CLASS_ALL 0x80000000
139 /* IOCTL commands of MET tagging */
140 typedef struct _mtag_cmd_t
{
141 unsigned int class_id
;
144 char tname
[MAX_TAGNAME_LEN
];
151 #define TYPE_ONESHOT 3
152 #define TYPE_ENABLE 4
153 #define TYPE_DISABLE 5
154 #define TYPE_REC_SET 6
156 #define TYPE_DUMP_SIZE 8
157 #define TYPE_DUMP_SAVE 9
158 #define TYPE_USRDATA 10
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)
175 #ifndef MET_USER_EVENT_SUPPORT
176 #define met_tag_init() (0)
178 #define met_tag_uninit() (0)
180 #define met_tag_start(id, name) (0)
182 #define met_tag_end(id, name) (0)
184 #define met_tag_oneshot(id, name, value) (0)
186 #define met_tag_userdata(pData) (0)
188 #define met_tag_dump(id, name, data, length) (0)
190 #define met_tag_disable(id) (0)
192 #define met_tag_enable(id) (0)
194 #define met_set_dump_buffer(size) (0)
196 #define met_save_dump_buffer(pathname) (0)
198 #define met_save_log(pathname) (0)
200 #define met_record_on() (0)
202 #define met_record_off() (0)
204 #define met_show_bw_limiter() (0)
205 #define met_reg_bw_limiter() (0)
208 #include <linux/kernel.h>
209 int __attribute__((weak
)) met_tag_init(void);
211 int __attribute__((weak
)) met_tag_uninit(void);
213 int __attribute__((weak
)) met_tag_start(unsigned int class_id
,
216 int __attribute__((weak
)) met_tag_end(unsigned int class_id
,
219 int __attribute__((weak
)) met_tag_oneshot(unsigned int class_id
,
223 int met_tag_userdata(char * pData
);
225 int __attribute__((weak
)) met_tag_dump(unsigned int class_id
,
228 unsigned int length
);
230 int __attribute__((weak
)) met_tag_disable(unsigned int class_id
);
232 int __attribute__((weak
)) met_tag_enable(unsigned int class_id
);
234 int __attribute__((weak
)) met_set_dump_buffer(int size
);
236 int __attribute__((weak
)) met_save_dump_buffer(const char *pathname
);
238 int __attribute__((weak
)) met_save_log(const char *pathname
);
240 int __attribute__((weak
)) met_show_bw_limiter(void);
241 int __attribute__((weak
)) met_reg_bw_limiter(void *fp
);
243 #define met_record_on() tracing_on()
245 #define met_record_off() tracing_off()
247 #endif /* MET_USER_EVENT_SUPPORT */