1 #include <linux/kallsyms.h>
2 #include <linux/cache.h>
3 #include <linux/ftrace_event.h>
4 #include <linux/workqueue.h>
5 #include <linux/kthread.h>
6 #include "mtk_mali_trace.h"
8 static struct task_struct
*gTraceThread
[MTK_MALI_MAX_CORE_COUNT
]; // Trace task
9 static wait_queue_head_t gTraceQueue
[MTK_MALI_MAX_CORE_COUNT
]; // Trace queue
10 static mtk_mali_trace_work gTraceEvent
[MTK_MALI_MAX_CORE_COUNT
]; // Trace event
11 static spinlock_t gThreadLock
[MTK_MALI_MAX_CORE_COUNT
]; // Trace lock
14 static unsigned long __read_mostly gMarkWriteAddr
= 0;
17 static void inline mali_update_write_addr(void)
20 if(unlikely(0 == gMarkWriteAddr
))
22 gMarkWriteAddr
= kallsyms_lookup_name("tracing_mark_write");
28 static void mali_kernel_trace_begin(char *pName
)
31 mali_update_write_addr();
33 event_trace_printk(gMarkWriteAddr
,
35 current
->tgid
, pName
);
40 static void mali_kernel_trace_counter(char *pName
, int count
)
43 mali_update_write_addr();
45 event_trace_printk(gMarkWriteAddr
,
47 (in_interrupt()? -1: current
->tgid
),
54 static void mali_kernel_trace_end(void)
57 mali_update_write_addr();
59 event_trace_printk(gMarkWriteAddr
,
65 static inline int mali_core_index_to_event_id(MALI_CORE_ENUM coreType
,
75 case MALI_CORE_TYPE_GP
:
76 eventID
= ((1 == traceType
)? 0: 1);
78 case MALI_CORE_TYPE_PP
:
81 eventID
= ((1 == traceType
)? 2: 3);
85 eventID
= ((1 == traceType
)? 4: 5);
97 static inline int mali_core_index_to_core_id(MALI_CORE_ENUM coreType
,
106 case MALI_CORE_TYPE_GP
:
109 case MALI_CORE_TYPE_PP
:
110 coreID
= ((0 == index
)? 1: 2);
121 static inline int mali_core_id_to_core_name(int coreID
)
123 static const char *pName
[] =
135 return pName
[coreID
];
145 static int mtk_mali_trace_handler(struct mtk_mali_trace_work
*pWork
)
147 struct task_struct
*pTask
;
148 struct sched_param param
;;
156 //sched_getparam(0, ¶m);
157 memset(¶m
, 0, sizeof(param
));
158 param
.sched_priority
= 90;
159 sched_setscheduler(pTask
, SCHED_RR
, ¶m
);
161 coreID
= pWork
->coreID
;
165 wait_event_interruptible(gTraceQueue
[coreID
], ((pWork
->total
> 0) || (1 == pWork
->stop
)));
167 if(kthread_should_stop() || (1 == pWork
->stop
))
172 spin_lock_irqsave(&gThreadLock
[coreID
], flags
);
176 if (pWork
->total
<= 0)
178 spin_unlock_irqrestore(&gThreadLock
[coreID
], flags
);
182 eventID
= pWork
->event
[pWork
->read
].theID
;
183 pName
= pWork
->event
[pWork
->read
].name
;
185 if (pWork
->read
>= MTK_MALI_MAX_QUEUE_SIZE
)
191 spin_unlock_irqrestore(&gThreadLock
[coreID
], flags
);
196 mali_kernel_trace_begin(pName
);
199 mali_kernel_trace_end();
202 mali_kernel_trace_begin(pName
);
205 mali_kernel_trace_end();
208 mali_kernel_trace_begin(pName
);
211 mali_kernel_trace_end();
223 int mtk_mali_kernel_trace_init(void)
228 for (index
= 0; index
< MTK_MALI_MAX_CORE_COUNT
; index
++)
230 init_waitqueue_head(&gTraceQueue
[index
]);
232 memset(&gTraceEvent
[index
], 0x0, sizeof(mtk_mali_trace_work
));
234 // Record the core ID
235 gTraceEvent
[index
].coreID
= index
;
237 spin_lock_init(&gThreadLock
[index
]);
239 gTraceThread
[index
] = kthread_run(mtk_mali_trace_handler
,
242 mali_core_id_to_core_name(index
));
243 if(IS_ERR(gTraceThread
[index
]))
245 printk("Unable to start kernel thread for core%d\n", index
);
253 void mtk_mali_kernel_trace_begin(MALI_CORE_ENUM coreType
,
255 struct task_struct
*pTask
)
262 coreID
= mali_core_index_to_core_id(coreType
, index
);
263 eventID
= mali_core_index_to_event_id(coreType
, index
, 1);
265 if (eventID
< MTK_MALI_MAX_EVENT_COUNT
)
267 spin_lock_irqsave(&gThreadLock
[coreID
], flags
);
271 slotID
= gTraceEvent
[coreID
].write
;
272 gTraceEvent
[coreID
].write
++;
273 if (gTraceEvent
[coreID
].write
>= MTK_MALI_MAX_QUEUE_SIZE
)
275 gTraceEvent
[coreID
].write
= 0;
278 gTraceEvent
[coreID
].total
++;
279 spin_unlock_irqrestore(&gThreadLock
[coreID
], flags
);
281 gTraceEvent
[coreID
].event
[slotID
].theID
= eventID
;
282 memcpy(gTraceEvent
[coreID
].event
[slotID
].name
, pTask
->comm
, sizeof(current
->comm
));
284 wake_up_interruptible(&gTraceQueue
[coreID
]);
289 void mtk_mali_kernel_trace_end(MALI_CORE_ENUM coreType
,
297 coreID
= mali_core_index_to_core_id(coreType
, index
);
298 eventID
= mali_core_index_to_event_id(coreType
, index
, 0);
300 if (eventID
< MTK_MALI_MAX_EVENT_COUNT
)
302 spin_lock_irqsave(&gThreadLock
[coreID
], flags
);
306 slotID
= gTraceEvent
[coreID
].write
;
307 gTraceEvent
[coreID
].write
++;
308 if (gTraceEvent
[coreID
].write
>= MTK_MALI_MAX_QUEUE_SIZE
)
310 gTraceEvent
[coreID
].write
= 0;
313 gTraceEvent
[coreID
].total
++;
314 spin_unlock_irqrestore(&gThreadLock
[coreID
], flags
);
316 gTraceEvent
[coreID
].event
[slotID
].theID
= eventID
;
318 wake_up_interruptible(&gTraceQueue
[coreID
]);
323 int mtk_mali_kernel_trace_exit()
327 for (index
= 0; index
< MTK_MALI_MAX_CORE_COUNT
; index
++)
329 gTraceEvent
[index
].stop
= 1;
330 kthread_stop(gTraceThread
[index
]);