3 * (C) COPYRIGHT 2012-2016 ARM Limited. All rights reserved.
5 * This program is free software and is provided to you under the terms of the
6 * GNU General Public License version 2 as published by the Free Software
7 * Foundation, and any use by you of this program is subject to the terms
10 * A copy of the licence is included with the program, and can also be obtained
11 * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
12 * Boston, MA 02110-1301, USA.
20 #if !defined(_KBASE_TRACE_TIMELINE_H)
21 #define _KBASE_TRACE_TIMELINE_H
23 #ifdef CONFIG_MALI_TRACE_TIMELINE
25 enum kbase_trace_timeline_code {
26 #define KBASE_TIMELINE_TRACE_CODE(enum_val, desc, format, format_desc) enum_val
27 #include "mali_kbase_trace_timeline_defs.h"
28 #undef KBASE_TIMELINE_TRACE_CODE
31 /** Initialize Timeline DebugFS entries */
32 void kbasep_trace_timeline_debugfs_init(struct kbase_device *kbdev);
34 /* mali_timeline.h defines kernel tracepoints used by the KBASE_TIMELINE
36 * Output is timestamped by either sched_clock() (default), local_clock(), or
37 * cpu_clock(), depending on /sys/kernel/debug/tracing/trace_clock */
38 #include "mali_timeline.h"
40 /* Trace number of atoms in flight for kctx (atoms either not completed, or in
41 process of being returned to user */
42 #define KBASE_TIMELINE_ATOMS_IN_FLIGHT(kctx, count) \
45 getrawmonotonic(&ts); \
46 trace_mali_timeline_atoms_in_flight(ts.tv_sec, ts.tv_nsec, \
47 (int)kctx->timeline.owner_tgid, \
51 /* Trace atom_id being Ready to Run */
52 #define KBASE_TIMELINE_ATOM_READY(kctx, atom_id) \
55 getrawmonotonic(&ts); \
56 trace_mali_timeline_atom(ts.tv_sec, ts.tv_nsec, \
57 CTX_FLOW_ATOM_READY, \
58 (int)kctx->timeline.owner_tgid, \
62 /* Trace number of atoms submitted to job slot js
64 * NOTE: This uses a different tracepoint to the head/next/soft-stop actions,
65 * so that those actions can be filtered out separately from this
67 * This is because this is more useful, as we can use it to calculate general
68 * utilization easily and accurately */
69 #define KBASE_TIMELINE_ATOMS_SUBMITTED(kctx, js, count) \
72 getrawmonotonic(&ts); \
73 trace_mali_timeline_gpu_slot_active(ts.tv_sec, ts.tv_nsec, \
74 SW_SET_GPU_SLOT_ACTIVE, \
75 (int)kctx->timeline.owner_tgid, \
80 /* Trace atoms present in JS_NEXT */
81 #define KBASE_TIMELINE_JOB_START_NEXT(kctx, js, count) \
84 getrawmonotonic(&ts); \
85 trace_mali_timeline_gpu_slot_action(ts.tv_sec, ts.tv_nsec, \
86 SW_SET_GPU_SLOT_NEXT, \
87 (int)kctx->timeline.owner_tgid, \
91 /* Trace atoms present in JS_HEAD */
92 #define KBASE_TIMELINE_JOB_START_HEAD(kctx, js, count) \
95 getrawmonotonic(&ts); \
96 trace_mali_timeline_gpu_slot_action(ts.tv_sec, ts.tv_nsec, \
97 SW_SET_GPU_SLOT_HEAD, \
98 (int)kctx->timeline.owner_tgid, \
102 /* Trace that a soft stop/evict from next is being attempted on a slot */
103 #define KBASE_TIMELINE_TRY_SOFT_STOP(kctx, js, count) \
105 struct timespec ts; \
106 getrawmonotonic(&ts); \
107 trace_mali_timeline_gpu_slot_action(ts.tv_sec, ts.tv_nsec, \
108 SW_SET_GPU_SLOT_STOPPING, \
109 (kctx) ? (int)kctx->timeline.owner_tgid : 0, \
115 /* Trace state of overall GPU power */
116 #define KBASE_TIMELINE_GPU_POWER(kbdev, active) \
118 struct timespec ts; \
119 getrawmonotonic(&ts); \
120 trace_mali_timeline_gpu_power_active(ts.tv_sec, ts.tv_nsec, \
121 SW_SET_GPU_POWER_ACTIVE, active); \
124 /* Trace state of tiler power */
125 #define KBASE_TIMELINE_POWER_TILER(kbdev, bitmap) \
127 struct timespec ts; \
128 getrawmonotonic(&ts); \
129 trace_mali_timeline_gpu_power_active(ts.tv_sec, ts.tv_nsec, \
130 SW_SET_GPU_POWER_TILER_ACTIVE, \
131 hweight64(bitmap)); \
134 /* Trace number of shaders currently powered */
135 #define KBASE_TIMELINE_POWER_SHADER(kbdev, bitmap) \
137 struct timespec ts; \
138 getrawmonotonic(&ts); \
139 trace_mali_timeline_gpu_power_active(ts.tv_sec, ts.tv_nsec, \
140 SW_SET_GPU_POWER_SHADER_ACTIVE, \
141 hweight64(bitmap)); \
144 /* Trace state of L2 power */
145 #define KBASE_TIMELINE_POWER_L2(kbdev, bitmap) \
147 struct timespec ts; \
148 getrawmonotonic(&ts); \
149 trace_mali_timeline_gpu_power_active(ts.tv_sec, ts.tv_nsec, \
150 SW_SET_GPU_POWER_L2_ACTIVE, \
151 hweight64(bitmap)); \
154 /* Trace state of L2 cache*/
155 #define KBASE_TIMELINE_POWERING_L2(kbdev) \
157 struct timespec ts; \
158 getrawmonotonic(&ts); \
159 trace_mali_timeline_l2_power_active(ts.tv_sec, ts.tv_nsec, \
160 SW_FLOW_GPU_POWER_L2_POWERING, \
164 #define KBASE_TIMELINE_POWERED_L2(kbdev) \
166 struct timespec ts; \
167 getrawmonotonic(&ts); \
168 trace_mali_timeline_l2_power_active(ts.tv_sec, ts.tv_nsec, \
169 SW_FLOW_GPU_POWER_L2_ACTIVE, \
173 /* Trace kbase_pm_send_event message send */
174 #define KBASE_TIMELINE_PM_SEND_EVENT(kbdev, event_type, pm_event_id) \
176 struct timespec ts; \
177 getrawmonotonic(&ts); \
178 trace_mali_timeline_pm_event(ts.tv_sec, ts.tv_nsec, \
179 SW_FLOW_PM_SEND_EVENT, \
180 event_type, pm_event_id); \
183 /* Trace kbase_pm_worker message receive */
184 #define KBASE_TIMELINE_PM_HANDLE_EVENT(kbdev, event_type, pm_event_id) \
186 struct timespec ts; \
187 getrawmonotonic(&ts); \
188 trace_mali_timeline_pm_event(ts.tv_sec, ts.tv_nsec, \
189 SW_FLOW_PM_HANDLE_EVENT, \
190 event_type, pm_event_id); \
194 /* Trace atom_id starting in JS_HEAD */
195 #define KBASE_TIMELINE_JOB_START(kctx, js, _consumerof_atom_number) \
197 struct timespec ts; \
198 getrawmonotonic(&ts); \
199 trace_mali_timeline_slot_atom(ts.tv_sec, ts.tv_nsec, \
200 HW_START_GPU_JOB_CHAIN_SW_APPROX, \
201 (int)kctx->timeline.owner_tgid, \
202 js, _consumerof_atom_number); \
205 /* Trace atom_id stopping on JS_HEAD */
206 #define KBASE_TIMELINE_JOB_STOP(kctx, js, _producerof_atom_number_completed) \
208 struct timespec ts; \
209 getrawmonotonic(&ts); \
210 trace_mali_timeline_slot_atom(ts.tv_sec, ts.tv_nsec, \
211 HW_STOP_GPU_JOB_CHAIN_SW_APPROX, \
212 (int)kctx->timeline.owner_tgid, \
213 js, _producerof_atom_number_completed); \
216 /** Trace beginning/end of a call to kbase_pm_check_transitions_nolock from a
218 #define KBASE_TIMELINE_PM_CHECKTRANS(kbdev, trace_code) \
220 struct timespec ts; \
221 getrawmonotonic(&ts); \
222 trace_mali_timeline_pm_checktrans(ts.tv_sec, ts.tv_nsec, \
226 /* Trace number of contexts active */
227 #define KBASE_TIMELINE_CONTEXT_ACTIVE(kbdev, count) \
229 struct timespec ts; \
230 getrawmonotonic(&ts); \
231 trace_mali_timeline_context_active(ts.tv_sec, ts.tv_nsec, \
236 /* NOTE: kbase_timeline_pm_cores_func() is in mali_kbase_pm_policy.c */
239 * Trace that an atom is starting on a job slot
241 * The caller must be holding kbasep_js_device_data::runpool_irq::lock
243 void kbase_timeline_job_slot_submit(struct kbase_device *kbdev, struct kbase_context *kctx,
244 struct kbase_jd_atom *katom, int js);
247 * Trace that an atom has done on a job slot
249 * 'Done' in this sense can occur either because:
250 * - the atom in JS_HEAD finished
251 * - the atom in JS_NEXT was evicted
253 * Whether the atom finished or was evicted is passed in @a done_code
255 * It is assumed that the atom has already been removed from the submit slot,
257 * - kbasep_jm_dequeue_submit_slot()
258 * - kbasep_jm_dequeue_tail_submit_slot()
260 * The caller must be holding kbasep_js_device_data::runpool_irq::lock
262 void kbase_timeline_job_slot_done(struct kbase_device *kbdev, struct kbase_context *kctx,
263 struct kbase_jd_atom *katom, int js,
264 kbasep_js_atom_done_code done_code);
267 /** Trace a pm event starting */
268 void kbase_timeline_pm_send_event(struct kbase_device *kbdev,
269 enum kbase_timeline_pm_event event_sent);
271 /** Trace a pm event finishing */
272 void kbase_timeline_pm_check_handle_event(struct kbase_device *kbdev, enum kbase_timeline_pm_event event);
274 /** Check whether a pm event was present, and if so trace finishing it */
275 void kbase_timeline_pm_handle_event(struct kbase_device *kbdev, enum kbase_timeline_pm_event event);
277 /** Trace L2 power-up start */
278 void kbase_timeline_pm_l2_transition_start(struct kbase_device *kbdev);
280 /** Trace L2 power-up done */
281 void kbase_timeline_pm_l2_transition_done(struct kbase_device *kbdev);
285 #define KBASE_TIMELINE_ATOMS_IN_FLIGHT(kctx, count) CSTD_NOP()
287 #define KBASE_TIMELINE_ATOM_READY(kctx, atom_id) CSTD_NOP()
289 #define KBASE_TIMELINE_ATOMS_SUBMITTED(kctx, js, count) CSTD_NOP()
291 #define KBASE_TIMELINE_JOB_START_NEXT(kctx, js, count) CSTD_NOP()
293 #define KBASE_TIMELINE_JOB_START_HEAD(kctx, js, count) CSTD_NOP()
295 #define KBASE_TIMELINE_TRY_SOFT_STOP(kctx, js, count) CSTD_NOP()
297 #define KBASE_TIMELINE_GPU_POWER(kbdev, active) CSTD_NOP()
299 #define KBASE_TIMELINE_POWER_TILER(kbdev, bitmap) CSTD_NOP()
301 #define KBASE_TIMELINE_POWER_SHADER(kbdev, bitmap) CSTD_NOP()
303 #define KBASE_TIMELINE_POWER_L2(kbdev, active) CSTD_NOP()
305 #define KBASE_TIMELINE_POWERING_L2(kbdev) CSTD_NOP()
307 #define KBASE_TIMELINE_POWERED_L2(kbdev) CSTD_NOP()
309 #define KBASE_TIMELINE_PM_SEND_EVENT(kbdev, event_type, pm_event_id) CSTD_NOP()
311 #define KBASE_TIMELINE_PM_HANDLE_EVENT(kbdev, event_type, pm_event_id) CSTD_NOP()
313 #define KBASE_TIMELINE_JOB_START(kctx, js, _consumerof_atom_number) CSTD_NOP()
315 #define KBASE_TIMELINE_JOB_STOP(kctx, js, _producerof_atom_number_completed) CSTD_NOP()
317 #define KBASE_TIMELINE_PM_CHECKTRANS(kbdev, trace_code) CSTD_NOP()
319 #define KBASE_TIMELINE_CONTEXT_ACTIVE(kbdev, count) CSTD_NOP()
321 static inline void kbase_timeline_job_slot_submit(struct kbase_device *kbdev, struct kbase_context *kctx,
322 struct kbase_jd_atom *katom, int js)
324 lockdep_assert_held(&kbdev->js_data.runpool_irq.lock);
327 static inline void kbase_timeline_job_slot_done(struct kbase_device *kbdev, struct kbase_context *kctx,
328 struct kbase_jd_atom *katom, int js,
329 kbasep_js_atom_done_code done_code)
331 lockdep_assert_held(&kbdev->js_data.runpool_irq.lock);
334 static inline void kbase_timeline_pm_send_event(struct kbase_device *kbdev, enum kbase_timeline_pm_event event_sent)
338 static inline void kbase_timeline_pm_check_handle_event(struct kbase_device *kbdev, enum kbase_timeline_pm_event event)
342 static inline void kbase_timeline_pm_handle_event(struct kbase_device *kbdev, enum kbase_timeline_pm_event event)
346 static inline void kbase_timeline_pm_l2_transition_start(struct kbase_device *kbdev)
350 static inline void kbase_timeline_pm_l2_transition_done(struct kbase_device *kbdev)
353 #endif /* CONFIG_MALI_TRACE_TIMELINE */
355 #endif /* _KBASE_TRACE_TIMELINE_H */