xref: /linux/drivers/gpu/drm/xe/xe_trace.h (revision 570f7e331f5febb30f1384817463c7e42b65ca7d)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright © 2022 Intel Corporation
4  */
5 
6 #undef TRACE_SYSTEM
7 #define TRACE_SYSTEM xe
8 
9 #if !defined(_XE_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
10 #define _XE_TRACE_H_
11 
12 #include <linux/tracepoint.h>
13 #include <linux/types.h>
14 
15 #include "xe_exec_queue_types.h"
16 #include "xe_exec_queue.h"
17 #include "xe_gpu_scheduler_types.h"
18 #include "xe_gt_types.h"
19 #include "xe_guc_exec_queue_types.h"
20 #include "xe_sched_job.h"
21 #include "xe_tlb_inval_types.h"
22 #include "xe_vm.h"
23 
24 #define __dev_name_xe(xe)	dev_name((xe)->drm.dev)
25 #define __dev_name_tile(tile)	__dev_name_xe(tile_to_xe((tile)))
26 #define __dev_name_gt(gt)	__dev_name_xe(gt_to_xe((gt)))
27 #define __dev_name_eq(q)	__dev_name_gt((q)->gt)
28 
29 DECLARE_EVENT_CLASS(xe_tlb_inval_fence,
30 		    TP_PROTO(struct xe_device *xe, struct xe_tlb_inval_fence *fence),
31 		    TP_ARGS(xe, fence),
32 
33 		    TP_STRUCT__entry(
34 			     __string(dev, __dev_name_xe(xe))
35 			     __field(struct xe_tlb_inval_fence *, fence)
36 			     __field(int, seqno)
37 			     ),
38 
39 		    TP_fast_assign(
40 			   __assign_str(dev);
41 			   __entry->fence = fence;
42 			   __entry->seqno = fence->seqno;
43 			   ),
44 
45 		    TP_printk("dev=%s, fence=%p, seqno=%d",
46 			      __get_str(dev), __entry->fence, __entry->seqno)
47 );
48 
49 DEFINE_EVENT(xe_tlb_inval_fence, xe_tlb_inval_fence_send,
50 	     TP_PROTO(struct xe_device *xe, struct xe_tlb_inval_fence *fence),
51 	     TP_ARGS(xe, fence)
52 );
53 
54 DEFINE_EVENT(xe_tlb_inval_fence, xe_tlb_inval_fence_recv,
55 	     TP_PROTO(struct xe_device *xe, struct xe_tlb_inval_fence *fence),
56 	     TP_ARGS(xe, fence)
57 );
58 
59 DEFINE_EVENT(xe_tlb_inval_fence, xe_tlb_inval_fence_signal,
60 	     TP_PROTO(struct xe_device *xe, struct xe_tlb_inval_fence *fence),
61 	     TP_ARGS(xe, fence)
62 );
63 
64 DEFINE_EVENT(xe_tlb_inval_fence, xe_tlb_inval_fence_timeout,
65 	     TP_PROTO(struct xe_device *xe, struct xe_tlb_inval_fence *fence),
66 	     TP_ARGS(xe, fence)
67 );
68 
69 DECLARE_EVENT_CLASS(xe_exec_queue,
70 		    TP_PROTO(struct xe_exec_queue *q),
71 		    TP_ARGS(q),
72 
73 		    TP_STRUCT__entry(
74 			     __string(dev, __dev_name_eq(q))
75 			     __field(enum xe_engine_class, class)
76 			     __field(u32, logical_mask)
77 			     __field(u8, gt_id)
78 			     __field(u16, width)
79 			     __field(u16, guc_id)
80 			     __field(u32, guc_state)
81 			     __field(u32, flags)
82 			     ),
83 
84 		    TP_fast_assign(
85 			   __assign_str(dev);
86 			   __entry->class = q->class;
87 			   __entry->logical_mask = q->logical_mask;
88 			   __entry->gt_id = q->gt->info.id;
89 			   __entry->width = q->width;
90 			   __entry->guc_id = q->guc->id;
91 			   __entry->guc_state = atomic_read(&q->guc->state);
92 			   __entry->flags = q->flags;
93 			   ),
94 
95 		    TP_printk("dev=%s, %d:0x%x, gt=%d, width=%d, guc_id=%d, guc_state=0x%x, flags=0x%x",
96 			      __get_str(dev), __entry->class, __entry->logical_mask,
97 			      __entry->gt_id, __entry->width, __entry->guc_id,
98 			      __entry->guc_state, __entry->flags)
99 );
100 
101 DECLARE_EVENT_CLASS(xe_exec_queue_multi_queue,
102 		    TP_PROTO(struct xe_exec_queue *q),
103 		    TP_ARGS(q),
104 
105 		    TP_STRUCT__entry(
106 			     __string(dev, __dev_name_eq(q))
107 			     __field(enum xe_engine_class, class)
108 			     __field(u32, logical_mask)
109 			     __field(u8, gt_id)
110 			     __field(u16, width)
111 			     __field(u32, guc_id)
112 			     __field(u32, guc_state)
113 			     __field(u32, flags)
114 			     __field(u32, primary)
115 			     ),
116 
117 		    TP_fast_assign(
118 			   __assign_str(dev);
119 			   __entry->class = q->class;
120 			   __entry->logical_mask = q->logical_mask;
121 			   __entry->gt_id = q->gt->info.id;
122 			   __entry->width = q->width;
123 			   __entry->guc_id = q->guc->id;
124 			   __entry->guc_state = atomic_read(&q->guc->state);
125 			   __entry->flags = q->flags;
126 			   __entry->primary = xe_exec_queue_multi_queue_primary(q)->guc->id;
127 			   ),
128 
129 		    TP_printk("dev=%s, %d:0x%x, gt=%d, width=%d guc_id=%d, guc_state=0x%x, flags=0x%x, primary=%d",
130 			      __get_str(dev), __entry->class, __entry->logical_mask,
131 			      __entry->gt_id, __entry->width, __entry->guc_id,
132 			      __entry->guc_state, __entry->flags,
133 			      __entry->primary)
134 );
135 
136 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_create,
137 	     TP_PROTO(struct xe_exec_queue *q),
138 	     TP_ARGS(q)
139 );
140 
141 DEFINE_EVENT(xe_exec_queue_multi_queue, xe_exec_queue_create_multi_queue,
142 	     TP_PROTO(struct xe_exec_queue *q),
143 	     TP_ARGS(q)
144 );
145 
146 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_supress_resume,
147 	     TP_PROTO(struct xe_exec_queue *q),
148 	     TP_ARGS(q)
149 );
150 
151 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_submit,
152 	     TP_PROTO(struct xe_exec_queue *q),
153 	     TP_ARGS(q)
154 );
155 
156 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_scheduling_enable,
157 	     TP_PROTO(struct xe_exec_queue *q),
158 	     TP_ARGS(q)
159 );
160 
161 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_scheduling_disable,
162 	     TP_PROTO(struct xe_exec_queue *q),
163 	     TP_ARGS(q)
164 );
165 
166 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_scheduling_done,
167 	     TP_PROTO(struct xe_exec_queue *q),
168 	     TP_ARGS(q)
169 );
170 
171 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_register,
172 	     TP_PROTO(struct xe_exec_queue *q),
173 	     TP_ARGS(q)
174 );
175 
176 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_deregister,
177 	     TP_PROTO(struct xe_exec_queue *q),
178 	     TP_ARGS(q)
179 );
180 
181 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_deregister_done,
182 	     TP_PROTO(struct xe_exec_queue *q),
183 	     TP_ARGS(q)
184 );
185 
186 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_close,
187 	     TP_PROTO(struct xe_exec_queue *q),
188 	     TP_ARGS(q)
189 );
190 
191 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_kill,
192 	     TP_PROTO(struct xe_exec_queue *q),
193 	     TP_ARGS(q)
194 );
195 
196 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_cleanup_entity,
197 	     TP_PROTO(struct xe_exec_queue *q),
198 	     TP_ARGS(q)
199 );
200 
201 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_destroy,
202 	     TP_PROTO(struct xe_exec_queue *q),
203 	     TP_ARGS(q)
204 );
205 
206 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_reset,
207 	     TP_PROTO(struct xe_exec_queue *q),
208 	     TP_ARGS(q)
209 );
210 
211 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_memory_cat_error,
212 	     TP_PROTO(struct xe_exec_queue *q),
213 	     TP_ARGS(q)
214 );
215 
216 DEFINE_EVENT(xe_exec_queue, xe_guc_uncorrectable_error,
217 	     TP_PROTO(struct xe_exec_queue *q),
218 	     TP_ARGS(q)
219 );
220 
221 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_cgp_context_error,
222 	     TP_PROTO(struct xe_exec_queue *q),
223 	     TP_ARGS(q)
224 );
225 
226 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_stop,
227 	     TP_PROTO(struct xe_exec_queue *q),
228 	     TP_ARGS(q)
229 );
230 
231 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_resubmit,
232 	     TP_PROTO(struct xe_exec_queue *q),
233 	     TP_ARGS(q)
234 );
235 
236 DECLARE_EVENT_CLASS(xe_sched_job,
237 		    TP_PROTO(struct xe_sched_job *job),
238 		    TP_ARGS(job),
239 
240 		    TP_STRUCT__entry(
241 			     __string(dev, __dev_name_eq(job->q))
242 			     __field(u32, seqno)
243 			     __field(u32, lrc_seqno)
244 			     __field(u8, gt_id)
245 			     __field(u16, guc_id)
246 			     __field(u32, guc_state)
247 			     __field(u32, flags)
248 			     __field(int, error)
249 			     __field(struct dma_fence *, fence)
250 			     __field(u64, batch_addr)
251 			     ),
252 
253 		    TP_fast_assign(
254 			   __assign_str(dev);
255 			   __entry->seqno = xe_sched_job_seqno(job);
256 			   __entry->lrc_seqno = xe_sched_job_lrc_seqno(job);
257 			   __entry->gt_id = job->q->gt->info.id;
258 			   __entry->guc_id = job->q->guc->id;
259 			   __entry->guc_state =
260 			   atomic_read(&job->q->guc->state);
261 			   __entry->flags = job->q->flags;
262 			   __entry->error = job->fence ? job->fence->error : 0;
263 			   __entry->fence = job->fence;
264 			   __entry->batch_addr = (u64)job->ptrs[0].batch_addr;
265 			   ),
266 
267 		    TP_printk("dev=%s, fence=%p, seqno=%u, lrc_seqno=%u, gt=%u, guc_id=%d, batch_addr=0x%012llx, guc_state=0x%x, flags=0x%x, error=%d",
268 			      __get_str(dev), __entry->fence, __entry->seqno,
269 			      __entry->lrc_seqno, __entry->gt_id, __entry->guc_id,
270 			      __entry->batch_addr, __entry->guc_state,
271 			      __entry->flags, __entry->error)
272 );
273 
274 DEFINE_EVENT(xe_sched_job, xe_sched_job_create,
275 	     TP_PROTO(struct xe_sched_job *job),
276 	     TP_ARGS(job)
277 );
278 
279 DEFINE_EVENT(xe_sched_job, xe_sched_job_exec,
280 	     TP_PROTO(struct xe_sched_job *job),
281 	     TP_ARGS(job)
282 );
283 
284 DEFINE_EVENT(xe_sched_job, xe_sched_job_run,
285 	     TP_PROTO(struct xe_sched_job *job),
286 	     TP_ARGS(job)
287 );
288 
289 DEFINE_EVENT(xe_sched_job, xe_sched_job_free,
290 	     TP_PROTO(struct xe_sched_job *job),
291 	     TP_ARGS(job)
292 );
293 
294 DEFINE_EVENT(xe_sched_job, xe_sched_job_timedout,
295 	     TP_PROTO(struct xe_sched_job *job),
296 	     TP_ARGS(job)
297 );
298 
299 DEFINE_EVENT(xe_sched_job, xe_sched_job_set_error,
300 	     TP_PROTO(struct xe_sched_job *job),
301 	     TP_ARGS(job)
302 );
303 
304 DEFINE_EVENT(xe_sched_job, xe_sched_job_ban,
305 	     TP_PROTO(struct xe_sched_job *job),
306 	     TP_ARGS(job)
307 );
308 
309 DECLARE_EVENT_CLASS(xe_sched_msg,
310 		    TP_PROTO(struct xe_sched_msg *msg),
311 		    TP_ARGS(msg),
312 
313 		    TP_STRUCT__entry(
314 			     __string(dev, __dev_name_eq(((struct xe_exec_queue *)msg->private_data)))
315 			     __field(u32, opcode)
316 			     __field(u16, guc_id)
317 			     __field(u8, gt_id)
318 			     ),
319 
320 		    TP_fast_assign(
321 			   __assign_str(dev);
322 			   __entry->opcode = msg->opcode;
323 			   __entry->guc_id =
324 			   ((struct xe_exec_queue *)msg->private_data)->guc->id;
325 			   __entry->gt_id =
326 			   ((struct xe_exec_queue *)msg->private_data)->gt->info.id;
327 			   ),
328 
329 		    TP_printk("dev=%s, gt=%u guc_id=%d, opcode=%u", __get_str(dev), __entry->gt_id, __entry->guc_id,
330 			      __entry->opcode)
331 );
332 
333 DEFINE_EVENT(xe_sched_msg, xe_sched_msg_add,
334 	     TP_PROTO(struct xe_sched_msg *msg),
335 	     TP_ARGS(msg)
336 );
337 
338 DEFINE_EVENT(xe_sched_msg, xe_sched_msg_recv,
339 	     TP_PROTO(struct xe_sched_msg *msg),
340 	     TP_ARGS(msg)
341 );
342 
343 DECLARE_EVENT_CLASS(xe_hw_fence,
344 		    TP_PROTO(struct xe_hw_fence *fence),
345 		    TP_ARGS(fence),
346 
347 		    TP_STRUCT__entry(
348 			     __string(dev, __dev_name_xe(fence->xe))
349 			     __field(u64, ctx)
350 			     __field(u32, seqno)
351 			     __field(struct xe_hw_fence *, fence)
352 			     ),
353 
354 		    TP_fast_assign(
355 			   __assign_str(dev);
356 			   __entry->ctx = fence->dma.context;
357 			   __entry->seqno = fence->dma.seqno;
358 			   __entry->fence = fence;
359 			   ),
360 
361 		    TP_printk("dev=%s, ctx=0x%016llx, fence=%p, seqno=%u",
362 			      __get_str(dev), __entry->ctx, __entry->fence, __entry->seqno)
363 );
364 
365 DEFINE_EVENT(xe_hw_fence, xe_hw_fence_create,
366 	     TP_PROTO(struct xe_hw_fence *fence),
367 	     TP_ARGS(fence)
368 );
369 
370 DEFINE_EVENT(xe_hw_fence, xe_hw_fence_signal,
371 	     TP_PROTO(struct xe_hw_fence *fence),
372 	     TP_ARGS(fence)
373 );
374 
375 DEFINE_EVENT(xe_hw_fence, xe_hw_fence_try_signal,
376 	     TP_PROTO(struct xe_hw_fence *fence),
377 	     TP_ARGS(fence)
378 );
379 
380 TRACE_EVENT(xe_reg_rw,
381 	TP_PROTO(struct xe_mmio *mmio, bool write, u32 reg, u64 val, int len),
382 
383 	TP_ARGS(mmio, write, reg, val, len),
384 
385 	TP_STRUCT__entry(
386 		__string(dev, __dev_name_tile(mmio->tile))
387 		__field(u64, val)
388 		__field(u32, reg)
389 		__field(u16, write)
390 		__field(u16, len)
391 		),
392 
393 	TP_fast_assign(
394 		__assign_str(dev);
395 		__entry->val = val;
396 		__entry->reg = reg;
397 		__entry->write = write;
398 		__entry->len = len;
399 		),
400 
401 	TP_printk("dev=%s, %s reg=0x%x, len=%d, val=(0x%x, 0x%x)",
402 		  __get_str(dev), __entry->write ? "write" : "read",
403 		  __entry->reg, __entry->len,
404 		  (u32)(__entry->val & 0xffffffff),
405 		  (u32)(__entry->val >> 32))
406 );
407 
408 DECLARE_EVENT_CLASS(xe_pm_runtime,
409 		    TP_PROTO(struct xe_device *xe, void *caller),
410 		    TP_ARGS(xe, caller),
411 
412 		    TP_STRUCT__entry(
413 			     __string(dev, __dev_name_xe(xe))
414 			     __field(void *, caller)
415 			     ),
416 
417 		    TP_fast_assign(
418 			   __assign_str(dev);
419 			   __entry->caller = caller;
420 			   ),
421 
422 		    TP_printk("dev=%s caller_function=%pS", __get_str(dev), __entry->caller)
423 );
424 
425 DEFINE_EVENT(xe_pm_runtime, xe_pm_runtime_get,
426 	     TP_PROTO(struct xe_device *xe, void *caller),
427 	     TP_ARGS(xe, caller)
428 );
429 
430 DEFINE_EVENT(xe_pm_runtime, xe_pm_runtime_put,
431 	     TP_PROTO(struct xe_device *xe, void *caller),
432 	     TP_ARGS(xe, caller)
433 );
434 
435 DEFINE_EVENT(xe_pm_runtime, xe_pm_resume,
436 	     TP_PROTO(struct xe_device *xe, void *caller),
437 	     TP_ARGS(xe, caller)
438 );
439 
440 DEFINE_EVENT(xe_pm_runtime, xe_pm_suspend,
441 	     TP_PROTO(struct xe_device *xe, void *caller),
442 	     TP_ARGS(xe, caller)
443 );
444 
445 DEFINE_EVENT(xe_pm_runtime, xe_pm_runtime_resume,
446 	     TP_PROTO(struct xe_device *xe, void *caller),
447 	     TP_ARGS(xe, caller)
448 );
449 
450 DEFINE_EVENT(xe_pm_runtime, xe_pm_runtime_suspend,
451 	     TP_PROTO(struct xe_device *xe, void *caller),
452 	     TP_ARGS(xe, caller)
453 );
454 
455 DEFINE_EVENT(xe_pm_runtime, xe_pm_runtime_get_ioctl,
456 	     TP_PROTO(struct xe_device *xe, void *caller),
457 	     TP_ARGS(xe, caller)
458 );
459 
460 TRACE_EVENT(xe_eu_stall_data_read,
461 	    TP_PROTO(u8 slice, u8 subslice,
462 		     u32 read_ptr, u32 write_ptr,
463 		     size_t read_size, size_t total_size),
464 	    TP_ARGS(slice, subslice,
465 		    read_ptr, write_ptr,
466 		    read_size, total_size),
467 
468 	    TP_STRUCT__entry(__field(u8, slice)
469 			     __field(u8, subslice)
470 			     __field(u32, read_ptr)
471 			     __field(u32, write_ptr)
472 			     __field(size_t, read_size)
473 			     __field(size_t, total_size)
474 			     ),
475 
476 	    TP_fast_assign(__entry->slice = slice;
477 			   __entry->subslice = subslice;
478 			   __entry->read_ptr = read_ptr;
479 			   __entry->write_ptr = write_ptr;
480 			   __entry->read_size = read_size;
481 			   __entry->total_size = total_size;
482 			   ),
483 
484 	    TP_printk("slice: %u subslice: %u read ptr: 0x%x write ptr: 0x%x read size: %zu total read size: %zu",
485 		      __entry->slice, __entry->subslice,
486 		      __entry->read_ptr, __entry->write_ptr,
487 		      __entry->read_size, __entry->total_size)
488 );
489 
490 TRACE_EVENT(xe_exec_queue_reach_max_job_count,
491 	    TP_PROTO(struct xe_exec_queue *q, int max_cnt),
492 	    TP_ARGS(q, max_cnt),
493 
494 	    TP_STRUCT__entry(__string(dev, __dev_name_eq(q))
495 			     __field(enum xe_engine_class, class)
496 			     __field(u32, logical_mask)
497 			     __field(u16, guc_id)
498 			     __field(int, max_cnt)
499 			     ),
500 
501 	    TP_fast_assign(__assign_str(dev);
502 			   __entry->class = q->class;
503 			   __entry->logical_mask = q->logical_mask;
504 			   __entry->guc_id = q->guc->id;
505 			   __entry->max_cnt = max_cnt;
506 			   ),
507 
508 	    TP_printk("dev=%s, job count exceeded the maximum limit (%d) per exec queue. engine_class=0x%x, logical_mask=0x%x, guc_id=%d",
509 		      __get_str(dev), __entry->max_cnt,
510 		      __entry->class, __entry->logical_mask, __entry->guc_id)
511 );
512 
513 #endif
514 
515 /* This part must be outside protection */
516 #undef TRACE_INCLUDE_PATH
517 #undef TRACE_INCLUDE_FILE
518 #define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/xe
519 #define TRACE_INCLUDE_FILE xe_trace
520 #include <trace/define_trace.h>
521