xref: /linux/drivers/gpu/drm/xe/xe_trace.h (revision a9aaf1ff88a8cb99a1335c9eb76de637f0cf8c10)
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_gpu_scheduler_types.h"
17 #include "xe_gt_tlb_invalidation_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_vm.h"
22 
23 #define __dev_name_xe(xe)	dev_name((xe)->drm.dev)
24 #define __dev_name_gt(gt)	__dev_name_xe(gt_to_xe((gt)))
25 #define __dev_name_eq(q)	__dev_name_gt((q)->gt)
26 
27 DECLARE_EVENT_CLASS(xe_gt_tlb_invalidation_fence,
28 		    TP_PROTO(struct xe_device *xe, struct xe_gt_tlb_invalidation_fence *fence),
29 		    TP_ARGS(xe, fence),
30 
31 		    TP_STRUCT__entry(
32 			     __string(dev, __dev_name_xe(xe))
33 			     __field(struct xe_gt_tlb_invalidation_fence *, fence)
34 			     __field(int, seqno)
35 			     ),
36 
37 		    TP_fast_assign(
38 			   __assign_str(dev);
39 			   __entry->fence = fence;
40 			   __entry->seqno = fence->seqno;
41 			   ),
42 
43 		    TP_printk("dev=%s, fence=%p, seqno=%d",
44 			      __get_str(dev), __entry->fence, __entry->seqno)
45 );
46 
47 DEFINE_EVENT(xe_gt_tlb_invalidation_fence, xe_gt_tlb_invalidation_fence_create,
48 	     TP_PROTO(struct xe_device *xe, struct xe_gt_tlb_invalidation_fence *fence),
49 	     TP_ARGS(xe, fence)
50 );
51 
52 DEFINE_EVENT(xe_gt_tlb_invalidation_fence,
53 	     xe_gt_tlb_invalidation_fence_work_func,
54 	     TP_PROTO(struct xe_device *xe, struct xe_gt_tlb_invalidation_fence *fence),
55 	     TP_ARGS(xe, fence)
56 );
57 
58 DEFINE_EVENT(xe_gt_tlb_invalidation_fence, xe_gt_tlb_invalidation_fence_cb,
59 	     TP_PROTO(struct xe_device *xe, struct xe_gt_tlb_invalidation_fence *fence),
60 	     TP_ARGS(xe, fence)
61 );
62 
63 DEFINE_EVENT(xe_gt_tlb_invalidation_fence, xe_gt_tlb_invalidation_fence_send,
64 	     TP_PROTO(struct xe_device *xe, struct xe_gt_tlb_invalidation_fence *fence),
65 	     TP_ARGS(xe, fence)
66 );
67 
68 DEFINE_EVENT(xe_gt_tlb_invalidation_fence, xe_gt_tlb_invalidation_fence_recv,
69 	     TP_PROTO(struct xe_device *xe, struct xe_gt_tlb_invalidation_fence *fence),
70 	     TP_ARGS(xe, fence)
71 );
72 
73 DEFINE_EVENT(xe_gt_tlb_invalidation_fence, xe_gt_tlb_invalidation_fence_signal,
74 	     TP_PROTO(struct xe_device *xe, struct xe_gt_tlb_invalidation_fence *fence),
75 	     TP_ARGS(xe, fence)
76 );
77 
78 DEFINE_EVENT(xe_gt_tlb_invalidation_fence, xe_gt_tlb_invalidation_fence_timeout,
79 	     TP_PROTO(struct xe_device *xe, struct xe_gt_tlb_invalidation_fence *fence),
80 	     TP_ARGS(xe, fence)
81 );
82 
83 DECLARE_EVENT_CLASS(xe_exec_queue,
84 		    TP_PROTO(struct xe_exec_queue *q),
85 		    TP_ARGS(q),
86 
87 		    TP_STRUCT__entry(
88 			     __string(dev, __dev_name_eq(q))
89 			     __field(enum xe_engine_class, class)
90 			     __field(u32, logical_mask)
91 			     __field(u8, gt_id)
92 			     __field(u16, width)
93 			     __field(u16, guc_id)
94 			     __field(u32, guc_state)
95 			     __field(u32, flags)
96 			     ),
97 
98 		    TP_fast_assign(
99 			   __assign_str(dev);
100 			   __entry->class = q->class;
101 			   __entry->logical_mask = q->logical_mask;
102 			   __entry->gt_id = q->gt->info.id;
103 			   __entry->width = q->width;
104 			   __entry->guc_id = q->guc->id;
105 			   __entry->guc_state = atomic_read(&q->guc->state);
106 			   __entry->flags = q->flags;
107 			   ),
108 
109 		    TP_printk("dev=%s, %d:0x%x, gt=%d, width=%d, guc_id=%d, guc_state=0x%x, flags=0x%x",
110 			      __get_str(dev), __entry->class, __entry->logical_mask,
111 			      __entry->gt_id, __entry->width, __entry->guc_id,
112 			      __entry->guc_state, __entry->flags)
113 );
114 
115 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_create,
116 	     TP_PROTO(struct xe_exec_queue *q),
117 	     TP_ARGS(q)
118 );
119 
120 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_supress_resume,
121 	     TP_PROTO(struct xe_exec_queue *q),
122 	     TP_ARGS(q)
123 );
124 
125 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_submit,
126 	     TP_PROTO(struct xe_exec_queue *q),
127 	     TP_ARGS(q)
128 );
129 
130 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_scheduling_enable,
131 	     TP_PROTO(struct xe_exec_queue *q),
132 	     TP_ARGS(q)
133 );
134 
135 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_scheduling_disable,
136 	     TP_PROTO(struct xe_exec_queue *q),
137 	     TP_ARGS(q)
138 );
139 
140 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_scheduling_done,
141 	     TP_PROTO(struct xe_exec_queue *q),
142 	     TP_ARGS(q)
143 );
144 
145 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_register,
146 	     TP_PROTO(struct xe_exec_queue *q),
147 	     TP_ARGS(q)
148 );
149 
150 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_deregister,
151 	     TP_PROTO(struct xe_exec_queue *q),
152 	     TP_ARGS(q)
153 );
154 
155 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_deregister_done,
156 	     TP_PROTO(struct xe_exec_queue *q),
157 	     TP_ARGS(q)
158 );
159 
160 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_close,
161 	     TP_PROTO(struct xe_exec_queue *q),
162 	     TP_ARGS(q)
163 );
164 
165 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_kill,
166 	     TP_PROTO(struct xe_exec_queue *q),
167 	     TP_ARGS(q)
168 );
169 
170 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_cleanup_entity,
171 	     TP_PROTO(struct xe_exec_queue *q),
172 	     TP_ARGS(q)
173 );
174 
175 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_destroy,
176 	     TP_PROTO(struct xe_exec_queue *q),
177 	     TP_ARGS(q)
178 );
179 
180 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_reset,
181 	     TP_PROTO(struct xe_exec_queue *q),
182 	     TP_ARGS(q)
183 );
184 
185 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_memory_cat_error,
186 	     TP_PROTO(struct xe_exec_queue *q),
187 	     TP_ARGS(q)
188 );
189 
190 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_stop,
191 	     TP_PROTO(struct xe_exec_queue *q),
192 	     TP_ARGS(q)
193 );
194 
195 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_resubmit,
196 	     TP_PROTO(struct xe_exec_queue *q),
197 	     TP_ARGS(q)
198 );
199 
200 DEFINE_EVENT(xe_exec_queue, xe_exec_queue_lr_cleanup,
201 	     TP_PROTO(struct xe_exec_queue *q),
202 	     TP_ARGS(q)
203 );
204 
205 DECLARE_EVENT_CLASS(xe_sched_job,
206 		    TP_PROTO(struct xe_sched_job *job),
207 		    TP_ARGS(job),
208 
209 		    TP_STRUCT__entry(
210 			     __string(dev, __dev_name_eq(job->q))
211 			     __field(u32, seqno)
212 			     __field(u32, lrc_seqno)
213 			     __field(u16, guc_id)
214 			     __field(u32, guc_state)
215 			     __field(u32, flags)
216 			     __field(int, error)
217 			     __field(struct dma_fence *, fence)
218 			     __field(u64, batch_addr)
219 			     ),
220 
221 		    TP_fast_assign(
222 			   __assign_str(dev);
223 			   __entry->seqno = xe_sched_job_seqno(job);
224 			   __entry->lrc_seqno = xe_sched_job_lrc_seqno(job);
225 			   __entry->guc_id = job->q->guc->id;
226 			   __entry->guc_state =
227 			   atomic_read(&job->q->guc->state);
228 			   __entry->flags = job->q->flags;
229 			   __entry->error = job->fence ? job->fence->error : 0;
230 			   __entry->fence = job->fence;
231 			   __entry->batch_addr = (u64)job->ptrs[0].batch_addr;
232 			   ),
233 
234 		    TP_printk("dev=%s, fence=%p, seqno=%u, lrc_seqno=%u, guc_id=%d, batch_addr=0x%012llx, guc_state=0x%x, flags=0x%x, error=%d",
235 			      __get_str(dev), __entry->fence, __entry->seqno,
236 			      __entry->lrc_seqno, __entry->guc_id,
237 			      __entry->batch_addr, __entry->guc_state,
238 			      __entry->flags, __entry->error)
239 );
240 
241 DEFINE_EVENT(xe_sched_job, xe_sched_job_create,
242 	     TP_PROTO(struct xe_sched_job *job),
243 	     TP_ARGS(job)
244 );
245 
246 DEFINE_EVENT(xe_sched_job, xe_sched_job_exec,
247 	     TP_PROTO(struct xe_sched_job *job),
248 	     TP_ARGS(job)
249 );
250 
251 DEFINE_EVENT(xe_sched_job, xe_sched_job_run,
252 	     TP_PROTO(struct xe_sched_job *job),
253 	     TP_ARGS(job)
254 );
255 
256 DEFINE_EVENT(xe_sched_job, xe_sched_job_free,
257 	     TP_PROTO(struct xe_sched_job *job),
258 	     TP_ARGS(job)
259 );
260 
261 DEFINE_EVENT(xe_sched_job, xe_sched_job_timedout,
262 	     TP_PROTO(struct xe_sched_job *job),
263 	     TP_ARGS(job)
264 );
265 
266 DEFINE_EVENT(xe_sched_job, xe_sched_job_set_error,
267 	     TP_PROTO(struct xe_sched_job *job),
268 	     TP_ARGS(job)
269 );
270 
271 DEFINE_EVENT(xe_sched_job, xe_sched_job_ban,
272 	     TP_PROTO(struct xe_sched_job *job),
273 	     TP_ARGS(job)
274 );
275 
276 DECLARE_EVENT_CLASS(xe_sched_msg,
277 		    TP_PROTO(struct xe_sched_msg *msg),
278 		    TP_ARGS(msg),
279 
280 		    TP_STRUCT__entry(
281 			     __string(dev, __dev_name_eq(((struct xe_exec_queue *)msg->private_data)))
282 			     __field(u32, opcode)
283 			     __field(u16, guc_id)
284 			     ),
285 
286 		    TP_fast_assign(
287 			   __assign_str(dev);
288 			   __entry->opcode = msg->opcode;
289 			   __entry->guc_id =
290 			   ((struct xe_exec_queue *)msg->private_data)->guc->id;
291 			   ),
292 
293 		    TP_printk("dev=%s, guc_id=%d, opcode=%u", __get_str(dev), __entry->guc_id,
294 			      __entry->opcode)
295 );
296 
297 DEFINE_EVENT(xe_sched_msg, xe_sched_msg_add,
298 	     TP_PROTO(struct xe_sched_msg *msg),
299 	     TP_ARGS(msg)
300 );
301 
302 DEFINE_EVENT(xe_sched_msg, xe_sched_msg_recv,
303 	     TP_PROTO(struct xe_sched_msg *msg),
304 	     TP_ARGS(msg)
305 );
306 
307 DECLARE_EVENT_CLASS(xe_hw_fence,
308 		    TP_PROTO(struct xe_hw_fence *fence),
309 		    TP_ARGS(fence),
310 
311 		    TP_STRUCT__entry(
312 			     __string(dev, __dev_name_gt(fence->ctx->gt))
313 			     __field(u64, ctx)
314 			     __field(u32, seqno)
315 			     __field(struct xe_hw_fence *, fence)
316 			     ),
317 
318 		    TP_fast_assign(
319 			   __assign_str(dev);
320 			   __entry->ctx = fence->dma.context;
321 			   __entry->seqno = fence->dma.seqno;
322 			   __entry->fence = fence;
323 			   ),
324 
325 		    TP_printk("dev=%s, ctx=0x%016llx, fence=%p, seqno=%u",
326 			      __get_str(dev), __entry->ctx, __entry->fence, __entry->seqno)
327 );
328 
329 DEFINE_EVENT(xe_hw_fence, xe_hw_fence_create,
330 	     TP_PROTO(struct xe_hw_fence *fence),
331 	     TP_ARGS(fence)
332 );
333 
334 DEFINE_EVENT(xe_hw_fence, xe_hw_fence_signal,
335 	     TP_PROTO(struct xe_hw_fence *fence),
336 	     TP_ARGS(fence)
337 );
338 
339 DEFINE_EVENT(xe_hw_fence, xe_hw_fence_try_signal,
340 	     TP_PROTO(struct xe_hw_fence *fence),
341 	     TP_ARGS(fence)
342 );
343 
344 TRACE_EVENT(xe_reg_rw,
345 	TP_PROTO(struct xe_gt *gt, bool write, u32 reg, u64 val, int len),
346 
347 	TP_ARGS(gt, write, reg, val, len),
348 
349 	TP_STRUCT__entry(
350 		__string(dev, __dev_name_gt(gt))
351 		__field(u64, val)
352 		__field(u32, reg)
353 		__field(u16, write)
354 		__field(u16, len)
355 		),
356 
357 	TP_fast_assign(
358 		__assign_str(dev);
359 		__entry->val = val;
360 		__entry->reg = reg;
361 		__entry->write = write;
362 		__entry->len = len;
363 		),
364 
365 	TP_printk("dev=%s, %s reg=0x%x, len=%d, val=(0x%x, 0x%x)",
366 		  __get_str(dev), __entry->write ? "write" : "read",
367 		  __entry->reg, __entry->len,
368 		  (u32)(__entry->val & 0xffffffff),
369 		  (u32)(__entry->val >> 32))
370 );
371 
372 #endif
373 
374 /* This part must be outside protection */
375 #undef TRACE_INCLUDE_PATH
376 #undef TRACE_INCLUDE_FILE
377 #define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/xe
378 #define TRACE_INCLUDE_FILE xe_trace
379 #include <trace/define_trace.h>
380