blob: f6c63ac4c66741d1d6d26b29cadb1d86997e5065 [file] [log] [blame]
xjb04a4022021-11-25 15:01:52 +08001/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (c) 2019 MediaTek Inc.
4 */
5
6#ifndef MET_DRV
7#define MET_DRV
8
9#include <linux/version.h>
10#include <linux/preempt.h>
11#include <linux/device.h>
12#include <linux/percpu.h>
13#include <linux/hardirq.h>
14#include <linux/clk.h>
15
16extern int met_mode;
17extern int core_plf_init(void);
18extern void core_plf_exit(void);
19
20#define MET_MODE_TRACE_CMD_OFFSET (1)
21#define MET_MODE_TRACE_CMD (1<<MET_MODE_TRACE_CMD_OFFSET)
22
23#ifdef CONFIG_MET_MODULE
24#define my_preempt_enable() preempt_enable()
25#else
26#define my_preempt_enable() preempt_enable_no_resched()
27#endif
28
29#define MET_STRBUF_SIZE 1024
30DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf_nmi);
31DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf_irq);
32DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf_sirq);
33DECLARE_PER_CPU(char[MET_STRBUF_SIZE], met_strbuf);
34
35#if IS_ENABLED(CONFIG_TRACING)
36#define TRACE_PUTS(p) \
37 do { \
38 trace_puts(p);; \
39 } while (0)
40#else
41#define TRACE_PUTS(p) do {} while (0)
42#endif
43
44#define GET_MET_TRACE_BUFFER_ENTER_CRITICAL() \
45 ({ \
46 char *pmet_strbuf; \
47 preempt_disable(); \
48 if (in_nmi()) \
49 pmet_strbuf = per_cpu(met_strbuf_nmi, smp_processor_id()); \
50 else if (in_irq()) \
51 pmet_strbuf = per_cpu(met_strbuf_irq, smp_processor_id()); \
52 else if (in_softirq()) \
53 pmet_strbuf = per_cpu(met_strbuf_sirq, smp_processor_id()); \
54 else \
55 pmet_strbuf = per_cpu(met_strbuf, smp_processor_id()); \
56 pmet_strbuf;\
57 })
58
59#define PUT_MET_TRACE_BUFFER_EXIT_CRITICAL(pmet_strbuf) \
60 do {\
61 if (pmet_strbuf)\
62 TRACE_PUTS(pmet_strbuf); \
63 my_preempt_enable(); \
64 } while (0)
65
66#define MET_TRACE(FORMAT, args...) \
67 do { \
68 char *pmet_strbuf; \
69 preempt_disable(); \
70 if (in_nmi()) \
71 pmet_strbuf = per_cpu(met_strbuf_nmi, smp_processor_id()); \
72 else if (in_irq()) \
73 pmet_strbuf = per_cpu(met_strbuf_irq, smp_processor_id()); \
74 else if (in_softirq()) \
75 pmet_strbuf = per_cpu(met_strbuf_sirq, smp_processor_id()); \
76 else \
77 pmet_strbuf = per_cpu(met_strbuf, smp_processor_id()); \
78 if (met_mode & MET_MODE_TRACE_CMD) \
79 snprintf(pmet_strbuf, MET_STRBUF_SIZE, "%s: " FORMAT, __func__, ##args); \
80 else \
81 snprintf(pmet_strbuf, MET_STRBUF_SIZE, FORMAT, ##args); \
82 TRACE_PUTS(pmet_strbuf); \
83 my_preempt_enable(); \
84 } while (0)
85
86/*
87 * SOB: start of buf
88 * EOB: end of buf
89 */
90#define MET_TRACE_GETBUF(pSOB, pEOB) \
91 ({ \
92 preempt_disable(); \
93 if (in_nmi()) \
94 *pSOB = per_cpu(met_strbuf_nmi, smp_processor_id()); \
95 else if (in_irq()) \
96 *pSOB = per_cpu(met_strbuf_irq, smp_processor_id()); \
97 else if (in_softirq()) \
98 *pSOB = per_cpu(met_strbuf_sirq, smp_processor_id()); \
99 else \
100 *pSOB = per_cpu(met_strbuf, smp_processor_id()); \
101 *pEOB = *pSOB; \
102 if (met_mode & MET_MODE_TRACE_CMD) \
103 *pEOB += snprintf(*pEOB, MET_STRBUF_SIZE, "%s: ", __func__); \
104 })
105
106extern int __trace_puts(unsigned long ip, const char *str, int size);
107#define MET_TRACE_PUTBUF(SOB, EOB) \
108 ({ \
109 __trace_puts(_THIS_IP_, (SOB), (uintptr_t)((EOB)-(SOB))); \
110 my_preempt_enable(); \
111 })
112
113#define MET_FTRACE_DUMP(TRACE_NAME, args...) \
114 do { \
115 trace_##TRACE_NAME(args);; \
116 } while (0)
117
118
119#define MET_TYPE_PMU 1
120#define MET_TYPE_BUS 2
121#define MET_TYPE_MISC 3
122
123enum met_action {
124 MET_CPU_ONLINE,
125 MET_CPU_OFFLINE,
126
127 NR_MET_ACTION,
128};
129
130struct metdevice {
131 struct list_head list;
132 int type;
133 const char *name;
134 struct module *owner;
135 struct kobject *kobj;
136
137 int (*create_subfs)(struct kobject *parent);
138 void (*delete_subfs)(void);
139 int mode;
140 int ondiemet_mode; /* new for ondiemet; 1: call ondiemet functions */
141 int cpu_related;
142 int polling_interval;
143 int polling_count_reload;
144 int __percpu *polling_count;
145 int header_read_again; /*for header size > 1 page */
146 void (*start)(void);
147 void (*uniq_start)(void);
148 void (*stop)(void);
149 void (*uniq_stop)(void);
150 int (*reset)(void);
151 void (*timed_polling)(unsigned long long stamp, int cpu);
152 void (*tagged_polling)(unsigned long long stamp, int cpu);
153 int (*print_help)(char *buf, int len);
154 int (*print_header)(char *buf, int len);
155 int (*process_argument)(const char *arg, int len);
156 void (*cpu_state_notify)(long cpu, unsigned long action);
157
158 void (*ondiemet_start)(void);
159 void (*uniq_ondiemet_start)(void);
160 void (*ondiemet_stop)(void);
161 void (*uniq_ondiemet_stop)(void);
162 int (*ondiemet_reset)(void);
163 int (*ondiemet_print_help)(char *buf, int len);
164 int (*ondiemet_print_header)(char *buf, int len);
165 int (*ondiemet_process_argument)(const char *arg, int len);
166 void (*ondiemet_timed_polling)(unsigned long long stamp, int cpu);
167 void (*ondiemet_tagged_polling)(unsigned long long stamp, int cpu);
168
169 struct list_head exlist; /* for linked list before register */
170 void (*suspend)(void);
171 void (*resume)(void);
172
173 unsigned long long prev_stamp;
174 spinlock_t my_lock;
175 void *reversed1;
176};
177
178int met_register(struct metdevice *met);
179int met_deregister(struct metdevice *met);
180int met_set_platform(const char *plf_name, int flag);
181int met_set_chip_id(const unsigned int chip_id);
182int met_set_topology(const char *topology_name, int flag);
183int met_devlink_add(struct metdevice *met);
184int met_devlink_del(struct metdevice *met);
185int met_devlink_register_all(void);
186int met_devlink_deregister_all(void);
187
188int fs_reg(int met_minor);
189void fs_unreg(void);
190
191/******************************************************************************
192 * Tracepoints
193 ******************************************************************************/
194#define MET_DEFINE_PROBE(probe_name, proto) \
195 static void probe_##probe_name(void *data, PARAMS(proto))
196#define MET_REGISTER_TRACE(probe_name) \
197 register_trace_##probe_name(probe_##probe_name, NULL)
198#define MET_UNREGISTER_TRACE(probe_name) \
199 unregister_trace_##probe_name(probe_##probe_name, NULL)
200
201
202/* ====================== Tagging API ================================ */
203
204#define MAX_EVENT_CLASS 31
205#define MAX_TAGNAME_LEN 128
206#define MET_CLASS_ALL 0x80000000
207
208/* IOCTL commands of MET tagging */
209struct mtag_cmd_t {
210 unsigned int class_id;
211 unsigned int value;
212 unsigned int slen;
213 char tname[MAX_TAGNAME_LEN];
214 void *data;
215 unsigned int size;
216};
217
218#define TYPE_START 1
219#define TYPE_END 2
220#define TYPE_ONESHOT 3
221#define TYPE_ENABLE 4
222#define TYPE_DISABLE 5
223#define TYPE_REC_SET 6
224#define TYPE_DUMP 7
225#define TYPE_DUMP_SIZE 8
226#define TYPE_DUMP_SAVE 9
227#define TYPE_USRDATA 10
228#define TYPE_DUMP_AGAIN 11
229#define TYPE_ASYNC_START 12
230#define TYPE_ASYNC_END 13
231#define TYPE_MET_SUSPEND 15
232#define TYPE_MET_RESUME 16
233
234/* Use 'm' as magic number */
235#define MTAG_IOC_MAGIC 'm'
236/* Please use a different 8-bit number in your code */
237#define MTAG_CMD_START _IOW(MTAG_IOC_MAGIC, TYPE_START, struct mtag_cmd_t)
238#define MTAG_CMD_END _IOW(MTAG_IOC_MAGIC, TYPE_END, struct mtag_cmd_t)
239#define MTAG_CMD_ONESHOT _IOW(MTAG_IOC_MAGIC, TYPE_ONESHOT, struct mtag_cmd_t)
240#define MTAG_CMD_ENABLE _IOW(MTAG_IOC_MAGIC, TYPE_ENABLE, int)
241#define MTAG_CMD_DISABLE _IOW(MTAG_IOC_MAGIC, TYPE_DISABLE, int)
242#define MTAG_CMD_REC_SET _IOW(MTAG_IOC_MAGIC, TYPE_REC_SET, int)
243#define MTAG_CMD_DUMP _IOW(MTAG_IOC_MAGIC, TYPE_DUMP, struct mtag_cmd_t)
244#define MTAG_CMD_DUMP_SIZE _IOWR(MTAG_IOC_MAGIC, TYPE_DUMP_SIZE, int)
245#define MTAG_CMD_DUMP_SAVE _IOW(MTAG_IOC_MAGIC, TYPE_DUMP_SAVE, struct mtag_cmd_t)
246#define MTAG_CMD_USRDATA _IOW(MTAG_IOC_MAGIC, TYPE_USRDATA, struct mtag_cmd_t)
247#define MTAG_CMD_DUMP_AGAIN _IOW(MTAG_IOC_MAGIC, TYPE_DUMP_AGAIN, void *)
248#define MTAG_CMD_ASYNC_START _IOW(MTAG_IOC_MAGIC, TYPE_ASYNC_START, struct mtag_cmd_t)
249#define MTAG_CMD_ASYNC_END _IOW(MTAG_IOC_MAGIC, TYPE_ASYNC_END, struct mtag_cmd_t)
250
251/* include file */
252extern int met_tag_start_real(unsigned int class_id, const char *name);
253extern int met_tag_end_real(unsigned int class_id, const char *name);
254extern int met_tag_async_start_real(unsigned int class_id, const char *name, unsigned int cookie);
255extern int met_tag_async_end_real(unsigned int class_id, const char *name, unsigned int cookie);
256extern int met_tag_oneshot_real(unsigned int class_id, const char *name, unsigned int value);
257extern int met_tag_userdata_real(char *pData);
258extern int met_tag_dump_real(unsigned int class_id, const char *name, void *data, unsigned int length);
259extern int met_tag_disable_real(unsigned int class_id);
260extern int met_tag_enable_real(unsigned int class_id);
261extern int met_set_dump_buffer_real(int size);
262extern int met_save_dump_buffer_real(const char *pathname);
263extern int met_save_log_real(const char *pathname);
264extern int met_show_bw_limiter_real(void);
265extern int met_reg_bw_limiter_real(void *fp);
266extern int met_show_clk_tree_real(const char *name, unsigned int addr, unsigned int status);
267extern int met_reg_clk_tree_real(void *fp);
268extern int enable_met_backlight_tag_real(void);
269extern int output_met_backlight_tag_real(int level);
270
271#endif /* MET_DRV */