1 /* SPDX-License-Identifier: GPL-2.0 */
2 #if !defined(_I915_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
5 #include <linux/stringify.h>
6 #include <linux/types.h>
7 #include <linux/tracepoint.h>
11 #include "intel_drv.h"
12 #include "intel_ringbuffer.h"
15 #define TRACE_SYSTEM i915
16 #define TRACE_INCLUDE_FILE i915_trace
18 /* watermark/fifo updates */
20 TRACE_EVENT(intel_cpu_fifo_underrun
,
21 TP_PROTO(struct drm_i915_private
*dev_priv
, enum pipe pipe
),
22 TP_ARGS(dev_priv
, pipe
),
25 __field(enum pipe
, pipe
)
27 __field(u32
, scanline
)
32 __entry
->frame
= dev_priv
->drm
.driver
->get_vblank_counter(&dev_priv
->drm
, pipe
);
33 __entry
->scanline
= intel_get_crtc_scanline(intel_get_crtc_for_pipe(dev_priv
, pipe
));
36 TP_printk("pipe %c, frame=%u, scanline=%u",
37 pipe_name(__entry
->pipe
),
38 __entry
->frame
, __entry
->scanline
)
41 TRACE_EVENT(intel_pch_fifo_underrun
,
42 TP_PROTO(struct drm_i915_private
*dev_priv
, enum pipe pch_transcoder
),
43 TP_ARGS(dev_priv
, pch_transcoder
),
46 __field(enum pipe
, pipe
)
48 __field(u32
, scanline
)
52 enum pipe pipe
= pch_transcoder
;
54 __entry
->frame
= dev_priv
->drm
.driver
->get_vblank_counter(&dev_priv
->drm
, pipe
);
55 __entry
->scanline
= intel_get_crtc_scanline(intel_get_crtc_for_pipe(dev_priv
, pipe
));
58 TP_printk("pch transcoder %c, frame=%u, scanline=%u",
59 pipe_name(__entry
->pipe
),
60 __entry
->frame
, __entry
->scanline
)
63 TRACE_EVENT(intel_memory_cxsr
,
64 TP_PROTO(struct drm_i915_private
*dev_priv
, bool old
, bool new),
65 TP_ARGS(dev_priv
, old
, new),
68 __array(u32
, frame
, 3)
69 __array(u32
, scanline
, 3)
76 for_each_pipe(dev_priv
, pipe
) {
77 __entry
->frame
[pipe
] =
78 dev_priv
->drm
.driver
->get_vblank_counter(&dev_priv
->drm
, pipe
);
79 __entry
->scanline
[pipe
] =
80 intel_get_crtc_scanline(intel_get_crtc_for_pipe(dev_priv
, pipe
));
86 TP_printk("%s->%s, pipe A: frame=%u, scanline=%u, pipe B: frame=%u, scanline=%u, pipe C: frame=%u, scanline=%u",
87 onoff(__entry
->old
), onoff(__entry
->new),
88 __entry
->frame
[PIPE_A
], __entry
->scanline
[PIPE_A
],
89 __entry
->frame
[PIPE_B
], __entry
->scanline
[PIPE_B
],
90 __entry
->frame
[PIPE_C
], __entry
->scanline
[PIPE_C
])
94 TP_PROTO(struct intel_crtc
*crtc
, const struct g4x_wm_values
*wm
),
98 __field(enum pipe
, pipe
)
100 __field(u32
, scanline
)
101 __field(u16
, primary
)
104 __field(u16
, sr_plane
)
105 __field(u16
, sr_cursor
)
107 __field(u16
, hpll_plane
)
108 __field(u16
, hpll_cursor
)
109 __field(u16
, hpll_fbc
)
116 __entry
->pipe
= crtc
->pipe
;
117 __entry
->frame
= crtc
->base
.dev
->driver
->get_vblank_counter(crtc
->base
.dev
,
119 __entry
->scanline
= intel_get_crtc_scanline(crtc
);
120 __entry
->primary
= wm
->pipe
[crtc
->pipe
].plane
[PLANE_PRIMARY
];
121 __entry
->sprite
= wm
->pipe
[crtc
->pipe
].plane
[PLANE_SPRITE0
];
122 __entry
->cursor
= wm
->pipe
[crtc
->pipe
].plane
[PLANE_CURSOR
];
123 __entry
->sr_plane
= wm
->sr
.plane
;
124 __entry
->sr_cursor
= wm
->sr
.cursor
;
125 __entry
->sr_fbc
= wm
->sr
.fbc
;
126 __entry
->hpll_plane
= wm
->hpll
.plane
;
127 __entry
->hpll_cursor
= wm
->hpll
.cursor
;
128 __entry
->hpll_fbc
= wm
->hpll
.fbc
;
129 __entry
->cxsr
= wm
->cxsr
;
130 __entry
->hpll
= wm
->hpll_en
;
131 __entry
->fbc
= wm
->fbc_en
;
134 TP_printk("pipe %c, frame=%u, scanline=%u, wm %d/%d/%d, sr %s/%d/%d/%d, hpll %s/%d/%d/%d, fbc %s",
135 pipe_name(__entry
->pipe
), __entry
->frame
, __entry
->scanline
,
136 __entry
->primary
, __entry
->sprite
, __entry
->cursor
,
137 yesno(__entry
->cxsr
), __entry
->sr_plane
, __entry
->sr_cursor
, __entry
->sr_fbc
,
138 yesno(__entry
->hpll
), __entry
->hpll_plane
, __entry
->hpll_cursor
, __entry
->hpll_fbc
,
143 TP_PROTO(struct intel_crtc
*crtc
, const struct vlv_wm_values
*wm
),
147 __field(enum pipe
, pipe
)
149 __field(u32
, scanline
)
152 __field(u32
, primary
)
153 __field(u32
, sprite0
)
154 __field(u32
, sprite1
)
156 __field(u32
, sr_plane
)
157 __field(u32
, sr_cursor
)
161 __entry
->pipe
= crtc
->pipe
;
162 __entry
->frame
= crtc
->base
.dev
->driver
->get_vblank_counter(crtc
->base
.dev
,
164 __entry
->scanline
= intel_get_crtc_scanline(crtc
);
165 __entry
->level
= wm
->level
;
166 __entry
->cxsr
= wm
->cxsr
;
167 __entry
->primary
= wm
->pipe
[crtc
->pipe
].plane
[PLANE_PRIMARY
];
168 __entry
->sprite0
= wm
->pipe
[crtc
->pipe
].plane
[PLANE_SPRITE0
];
169 __entry
->sprite1
= wm
->pipe
[crtc
->pipe
].plane
[PLANE_SPRITE1
];
170 __entry
->cursor
= wm
->pipe
[crtc
->pipe
].plane
[PLANE_CURSOR
];
171 __entry
->sr_plane
= wm
->sr
.plane
;
172 __entry
->sr_cursor
= wm
->sr
.cursor
;
175 TP_printk("pipe %c, frame=%u, scanline=%u, level=%d, cxsr=%d, wm %d/%d/%d/%d, sr %d/%d",
176 pipe_name(__entry
->pipe
), __entry
->frame
,
177 __entry
->scanline
, __entry
->level
, __entry
->cxsr
,
178 __entry
->primary
, __entry
->sprite0
, __entry
->sprite1
, __entry
->cursor
,
179 __entry
->sr_plane
, __entry
->sr_cursor
)
182 TRACE_EVENT(vlv_fifo_size
,
183 TP_PROTO(struct intel_crtc
*crtc
, u32 sprite0_start
, u32 sprite1_start
, u32 fifo_size
),
184 TP_ARGS(crtc
, sprite0_start
, sprite1_start
, fifo_size
),
187 __field(enum pipe
, pipe
)
189 __field(u32
, scanline
)
190 __field(u32
, sprite0_start
)
191 __field(u32
, sprite1_start
)
192 __field(u32
, fifo_size
)
196 __entry
->pipe
= crtc
->pipe
;
197 __entry
->frame
= crtc
->base
.dev
->driver
->get_vblank_counter(crtc
->base
.dev
,
199 __entry
->scanline
= intel_get_crtc_scanline(crtc
);
200 __entry
->sprite0_start
= sprite0_start
;
201 __entry
->sprite1_start
= sprite1_start
;
202 __entry
->fifo_size
= fifo_size
;
205 TP_printk("pipe %c, frame=%u, scanline=%u, %d/%d/%d",
206 pipe_name(__entry
->pipe
), __entry
->frame
,
207 __entry
->scanline
, __entry
->sprite0_start
,
208 __entry
->sprite1_start
, __entry
->fifo_size
)
213 TRACE_EVENT(intel_update_plane
,
214 TP_PROTO(struct drm_plane
*plane
, struct intel_crtc
*crtc
),
215 TP_ARGS(plane
, crtc
),
218 __field(enum pipe
, pipe
)
219 __field(const char *, name
)
221 __field(u32
, scanline
)
227 __entry
->pipe
= crtc
->pipe
;
228 __entry
->name
= plane
->name
;
229 __entry
->frame
= crtc
->base
.dev
->driver
->get_vblank_counter(crtc
->base
.dev
,
231 __entry
->scanline
= intel_get_crtc_scanline(crtc
);
232 memcpy(__entry
->src
, &plane
->state
->src
, sizeof(__entry
->src
));
233 memcpy(__entry
->dst
, &plane
->state
->dst
, sizeof(__entry
->dst
));
236 TP_printk("pipe %c, plane %s, frame=%u, scanline=%u, " DRM_RECT_FP_FMT
" -> " DRM_RECT_FMT
,
237 pipe_name(__entry
->pipe
), __entry
->name
,
238 __entry
->frame
, __entry
->scanline
,
239 DRM_RECT_FP_ARG((const struct drm_rect
*)__entry
->src
),
240 DRM_RECT_ARG((const struct drm_rect
*)__entry
->dst
))
243 TRACE_EVENT(intel_disable_plane
,
244 TP_PROTO(struct drm_plane
*plane
, struct intel_crtc
*crtc
),
245 TP_ARGS(plane
, crtc
),
248 __field(enum pipe
, pipe
)
249 __field(const char *, name
)
251 __field(u32
, scanline
)
255 __entry
->pipe
= crtc
->pipe
;
256 __entry
->name
= plane
->name
;
257 __entry
->frame
= crtc
->base
.dev
->driver
->get_vblank_counter(crtc
->base
.dev
,
259 __entry
->scanline
= intel_get_crtc_scanline(crtc
);
262 TP_printk("pipe %c, plane %s, frame=%u, scanline=%u",
263 pipe_name(__entry
->pipe
), __entry
->name
,
264 __entry
->frame
, __entry
->scanline
)
269 TRACE_EVENT(i915_pipe_update_start
,
270 TP_PROTO(struct intel_crtc
*crtc
),
274 __field(enum pipe
, pipe
)
276 __field(u32
, scanline
)
282 __entry
->pipe
= crtc
->pipe
;
283 __entry
->frame
= crtc
->base
.dev
->driver
->get_vblank_counter(crtc
->base
.dev
,
285 __entry
->scanline
= intel_get_crtc_scanline(crtc
);
286 __entry
->min
= crtc
->debug
.min_vbl
;
287 __entry
->max
= crtc
->debug
.max_vbl
;
290 TP_printk("pipe %c, frame=%u, scanline=%u, min=%u, max=%u",
291 pipe_name(__entry
->pipe
), __entry
->frame
,
292 __entry
->scanline
, __entry
->min
, __entry
->max
)
295 TRACE_EVENT(i915_pipe_update_vblank_evaded
,
296 TP_PROTO(struct intel_crtc
*crtc
),
300 __field(enum pipe
, pipe
)
302 __field(u32
, scanline
)
308 __entry
->pipe
= crtc
->pipe
;
309 __entry
->frame
= crtc
->debug
.start_vbl_count
;
310 __entry
->scanline
= crtc
->debug
.scanline_start
;
311 __entry
->min
= crtc
->debug
.min_vbl
;
312 __entry
->max
= crtc
->debug
.max_vbl
;
315 TP_printk("pipe %c, frame=%u, scanline=%u, min=%u, max=%u",
316 pipe_name(__entry
->pipe
), __entry
->frame
,
317 __entry
->scanline
, __entry
->min
, __entry
->max
)
320 TRACE_EVENT(i915_pipe_update_end
,
321 TP_PROTO(struct intel_crtc
*crtc
, u32 frame
, int scanline_end
),
322 TP_ARGS(crtc
, frame
, scanline_end
),
325 __field(enum pipe
, pipe
)
327 __field(u32
, scanline
)
331 __entry
->pipe
= crtc
->pipe
;
332 __entry
->frame
= frame
;
333 __entry
->scanline
= scanline_end
;
336 TP_printk("pipe %c, frame=%u, scanline=%u",
337 pipe_name(__entry
->pipe
), __entry
->frame
,
341 /* object tracking */
343 TRACE_EVENT(i915_gem_object_create
,
344 TP_PROTO(struct drm_i915_gem_object
*obj
),
348 __field(struct drm_i915_gem_object
*, obj
)
354 __entry
->size
= obj
->base
.size
;
357 TP_printk("obj=%p, size=0x%llx", __entry
->obj
, __entry
->size
)
360 TRACE_EVENT(i915_gem_shrink
,
361 TP_PROTO(struct drm_i915_private
*i915
, unsigned long target
, unsigned flags
),
362 TP_ARGS(i915
, target
, flags
),
366 __field(unsigned long, target
)
367 __field(unsigned, flags
)
371 __entry
->dev
= i915
->drm
.primary
->index
;
372 __entry
->target
= target
;
373 __entry
->flags
= flags
;
376 TP_printk("dev=%d, target=%lu, flags=%x",
377 __entry
->dev
, __entry
->target
, __entry
->flags
)
380 TRACE_EVENT(i915_vma_bind
,
381 TP_PROTO(struct i915_vma
*vma
, unsigned flags
),
385 __field(struct drm_i915_gem_object
*, obj
)
386 __field(struct i915_address_space
*, vm
)
389 __field(unsigned, flags
)
393 __entry
->obj
= vma
->obj
;
394 __entry
->vm
= vma
->vm
;
395 __entry
->offset
= vma
->node
.start
;
396 __entry
->size
= vma
->node
.size
;
397 __entry
->flags
= flags
;
400 TP_printk("obj=%p, offset=0x%016llx size=0x%llx%s vm=%p",
401 __entry
->obj
, __entry
->offset
, __entry
->size
,
402 __entry
->flags
& PIN_MAPPABLE
? ", mappable" : "",
406 TRACE_EVENT(i915_vma_unbind
,
407 TP_PROTO(struct i915_vma
*vma
),
411 __field(struct drm_i915_gem_object
*, obj
)
412 __field(struct i915_address_space
*, vm
)
418 __entry
->obj
= vma
->obj
;
419 __entry
->vm
= vma
->vm
;
420 __entry
->offset
= vma
->node
.start
;
421 __entry
->size
= vma
->node
.size
;
424 TP_printk("obj=%p, offset=0x%016llx size=0x%llx vm=%p",
425 __entry
->obj
, __entry
->offset
, __entry
->size
, __entry
->vm
)
428 TRACE_EVENT(i915_gem_object_pwrite
,
429 TP_PROTO(struct drm_i915_gem_object
*obj
, u64 offset
, u64 len
),
430 TP_ARGS(obj
, offset
, len
),
433 __field(struct drm_i915_gem_object
*, obj
)
440 __entry
->offset
= offset
;
444 TP_printk("obj=%p, offset=0x%llx, len=0x%llx",
445 __entry
->obj
, __entry
->offset
, __entry
->len
)
448 TRACE_EVENT(i915_gem_object_pread
,
449 TP_PROTO(struct drm_i915_gem_object
*obj
, u64 offset
, u64 len
),
450 TP_ARGS(obj
, offset
, len
),
453 __field(struct drm_i915_gem_object
*, obj
)
460 __entry
->offset
= offset
;
464 TP_printk("obj=%p, offset=0x%llx, len=0x%llx",
465 __entry
->obj
, __entry
->offset
, __entry
->len
)
468 TRACE_EVENT(i915_gem_object_fault
,
469 TP_PROTO(struct drm_i915_gem_object
*obj
, u64 index
, bool gtt
, bool write
),
470 TP_ARGS(obj
, index
, gtt
, write
),
473 __field(struct drm_i915_gem_object
*, obj
)
481 __entry
->index
= index
;
483 __entry
->write
= write
;
486 TP_printk("obj=%p, %s index=%llu %s",
488 __entry
->gtt
? "GTT" : "CPU",
490 __entry
->write
? ", writable" : "")
493 DECLARE_EVENT_CLASS(i915_gem_object
,
494 TP_PROTO(struct drm_i915_gem_object
*obj
),
498 __field(struct drm_i915_gem_object
*, obj
)
505 TP_printk("obj=%p", __entry
->obj
)
508 DEFINE_EVENT(i915_gem_object
, i915_gem_object_clflush
,
509 TP_PROTO(struct drm_i915_gem_object
*obj
),
513 DEFINE_EVENT(i915_gem_object
, i915_gem_object_destroy
,
514 TP_PROTO(struct drm_i915_gem_object
*obj
),
518 TRACE_EVENT(i915_gem_evict
,
519 TP_PROTO(struct i915_address_space
*vm
, u64 size
, u64 align
, unsigned int flags
),
520 TP_ARGS(vm
, size
, align
, flags
),
524 __field(struct i915_address_space
*, vm
)
527 __field(unsigned int, flags
)
531 __entry
->dev
= vm
->i915
->drm
.primary
->index
;
533 __entry
->size
= size
;
534 __entry
->align
= align
;
535 __entry
->flags
= flags
;
538 TP_printk("dev=%d, vm=%p, size=0x%llx, align=0x%llx %s",
539 __entry
->dev
, __entry
->vm
, __entry
->size
, __entry
->align
,
540 __entry
->flags
& PIN_MAPPABLE
? ", mappable" : "")
543 TRACE_EVENT(i915_gem_evict_node
,
544 TP_PROTO(struct i915_address_space
*vm
, struct drm_mm_node
*node
, unsigned int flags
),
545 TP_ARGS(vm
, node
, flags
),
549 __field(struct i915_address_space
*, vm
)
552 __field(unsigned long, color
)
553 __field(unsigned int, flags
)
557 __entry
->dev
= vm
->i915
->drm
.primary
->index
;
559 __entry
->start
= node
->start
;
560 __entry
->size
= node
->size
;
561 __entry
->color
= node
->color
;
562 __entry
->flags
= flags
;
565 TP_printk("dev=%d, vm=%p, start=0x%llx size=0x%llx, color=0x%lx, flags=%x",
566 __entry
->dev
, __entry
->vm
,
567 __entry
->start
, __entry
->size
,
568 __entry
->color
, __entry
->flags
)
571 TRACE_EVENT(i915_gem_evict_vm
,
572 TP_PROTO(struct i915_address_space
*vm
),
577 __field(struct i915_address_space
*, vm
)
581 __entry
->dev
= vm
->i915
->drm
.primary
->index
;
585 TP_printk("dev=%d, vm=%p", __entry
->dev
, __entry
->vm
)
588 TRACE_EVENT(i915_gem_ring_sync_to
,
589 TP_PROTO(struct drm_i915_gem_request
*to
,
590 struct drm_i915_gem_request
*from
),
595 __field(u32
, sync_from
)
596 __field(u32
, sync_to
)
601 __entry
->dev
= from
->i915
->drm
.primary
->index
;
602 __entry
->sync_from
= from
->engine
->id
;
603 __entry
->sync_to
= to
->engine
->id
;
604 __entry
->seqno
= from
->global_seqno
;
607 TP_printk("dev=%u, sync-from=%u, sync-to=%u, seqno=%u",
609 __entry
->sync_from
, __entry
->sync_to
,
613 TRACE_EVENT(i915_gem_request_queue
,
614 TP_PROTO(struct drm_i915_gem_request
*req
, u32 flags
),
627 __entry
->dev
= req
->i915
->drm
.primary
->index
;
628 __entry
->hw_id
= req
->ctx
->hw_id
;
629 __entry
->ring
= req
->engine
->id
;
630 __entry
->ctx
= req
->fence
.context
;
631 __entry
->seqno
= req
->fence
.seqno
;
632 __entry
->flags
= flags
;
635 TP_printk("dev=%u, hw_id=%u, ring=%u, ctx=%u, seqno=%u, flags=0x%x",
636 __entry
->dev
, __entry
->hw_id
, __entry
->ring
, __entry
->ctx
,
637 __entry
->seqno
, __entry
->flags
)
640 DECLARE_EVENT_CLASS(i915_gem_request
,
641 TP_PROTO(struct drm_i915_gem_request
*req
),
654 __entry
->dev
= req
->i915
->drm
.primary
->index
;
655 __entry
->hw_id
= req
->ctx
->hw_id
;
656 __entry
->ring
= req
->engine
->id
;
657 __entry
->ctx
= req
->fence
.context
;
658 __entry
->seqno
= req
->fence
.seqno
;
659 __entry
->global
= req
->global_seqno
;
662 TP_printk("dev=%u, hw_id=%u, ring=%u, ctx=%u, seqno=%u, global=%u",
663 __entry
->dev
, __entry
->hw_id
, __entry
->ring
, __entry
->ctx
,
664 __entry
->seqno
, __entry
->global
)
667 DEFINE_EVENT(i915_gem_request
, i915_gem_request_add
,
668 TP_PROTO(struct drm_i915_gem_request
*req
),
672 #if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS)
673 DEFINE_EVENT(i915_gem_request
, i915_gem_request_submit
,
674 TP_PROTO(struct drm_i915_gem_request
*req
),
678 DEFINE_EVENT(i915_gem_request
, i915_gem_request_execute
,
679 TP_PROTO(struct drm_i915_gem_request
*req
),
683 DECLARE_EVENT_CLASS(i915_gem_request_hw
,
684 TP_PROTO(struct drm_i915_gem_request
*req
,
694 __field(u32
, global_seqno
)
699 __entry
->dev
= req
->i915
->drm
.primary
->index
;
700 __entry
->hw_id
= req
->ctx
->hw_id
;
701 __entry
->ring
= req
->engine
->id
;
702 __entry
->ctx
= req
->fence
.context
;
703 __entry
->seqno
= req
->fence
.seqno
;
704 __entry
->global_seqno
= req
->global_seqno
;
705 __entry
->port
= port
;
708 TP_printk("dev=%u, hw_id=%u, ring=%u, ctx=%u, seqno=%u, global=%u, port=%u",
709 __entry
->dev
, __entry
->hw_id
, __entry
->ring
,
710 __entry
->ctx
, __entry
->seqno
,
711 __entry
->global_seqno
, __entry
->port
)
714 DEFINE_EVENT(i915_gem_request_hw
, i915_gem_request_in
,
715 TP_PROTO(struct drm_i915_gem_request
*req
, unsigned int port
),
719 DEFINE_EVENT(i915_gem_request
, i915_gem_request_out
,
720 TP_PROTO(struct drm_i915_gem_request
*req
),
724 #if !defined(TRACE_HEADER_MULTI_READ)
726 trace_i915_gem_request_submit(struct drm_i915_gem_request
*req
)
731 trace_i915_gem_request_execute(struct drm_i915_gem_request
*req
)
736 trace_i915_gem_request_in(struct drm_i915_gem_request
*req
, unsigned int port
)
741 trace_i915_gem_request_out(struct drm_i915_gem_request
*req
)
747 TRACE_EVENT(intel_engine_notify
,
748 TP_PROTO(struct intel_engine_cs
*engine
, bool waiters
),
749 TP_ARGS(engine
, waiters
),
755 __field(bool, waiters
)
759 __entry
->dev
= engine
->i915
->drm
.primary
->index
;
760 __entry
->ring
= engine
->id
;
761 __entry
->seqno
= intel_engine_get_seqno(engine
);
762 __entry
->waiters
= waiters
;
765 TP_printk("dev=%u, ring=%u, seqno=%u, waiters=%u",
766 __entry
->dev
, __entry
->ring
, __entry
->seqno
,
770 DEFINE_EVENT(i915_gem_request
, i915_gem_request_retire
,
771 TP_PROTO(struct drm_i915_gem_request
*req
),
775 TRACE_EVENT(i915_gem_request_wait_begin
,
776 TP_PROTO(struct drm_i915_gem_request
*req
, unsigned int flags
),
786 __field(unsigned int, flags
)
789 /* NB: the blocking information is racy since mutex_is_locked
790 * doesn't check that the current thread holds the lock. The only
791 * other option would be to pass the boolean information of whether
792 * or not the class was blocking down through the stack which is
796 __entry
->dev
= req
->i915
->drm
.primary
->index
;
797 __entry
->hw_id
= req
->ctx
->hw_id
;
798 __entry
->ring
= req
->engine
->id
;
799 __entry
->ctx
= req
->fence
.context
;
800 __entry
->seqno
= req
->fence
.seqno
;
801 __entry
->global
= req
->global_seqno
;
802 __entry
->flags
= flags
;
805 TP_printk("dev=%u, hw_id=%u, ring=%u, ctx=%u, seqno=%u, global=%u, blocking=%u, flags=0x%x",
806 __entry
->dev
, __entry
->hw_id
, __entry
->ring
, __entry
->ctx
,
807 __entry
->seqno
, __entry
->global
,
808 !!(__entry
->flags
& I915_WAIT_LOCKED
), __entry
->flags
)
811 DEFINE_EVENT(i915_gem_request
, i915_gem_request_wait_end
,
812 TP_PROTO(struct drm_i915_gem_request
*req
),
816 TRACE_EVENT(i915_flip_request
,
817 TP_PROTO(int plane
, struct drm_i915_gem_object
*obj
),
823 __field(struct drm_i915_gem_object
*, obj
)
827 __entry
->plane
= plane
;
831 TP_printk("plane=%d, obj=%p", __entry
->plane
, __entry
->obj
)
834 TRACE_EVENT(i915_flip_complete
,
835 TP_PROTO(int plane
, struct drm_i915_gem_object
*obj
),
841 __field(struct drm_i915_gem_object
*, obj
)
845 __entry
->plane
= plane
;
849 TP_printk("plane=%d, obj=%p", __entry
->plane
, __entry
->obj
)
852 TRACE_EVENT_CONDITION(i915_reg_rw
,
853 TP_PROTO(bool write
, i915_reg_t reg
, u64 val
, int len
, bool trace
),
855 TP_ARGS(write
, reg
, val
, len
, trace
),
867 __entry
->val
= (u64
)val
;
868 __entry
->reg
= i915_mmio_reg_offset(reg
);
869 __entry
->write
= write
;
873 TP_printk("%s reg=0x%x, len=%d, val=(0x%x, 0x%x)",
874 __entry
->write
? "write" : "read",
875 __entry
->reg
, __entry
->len
,
876 (u32
)(__entry
->val
& 0xffffffff),
877 (u32
)(__entry
->val
>> 32))
880 TRACE_EVENT(intel_gpu_freq_change
,
889 __entry
->freq
= freq
;
892 TP_printk("new_freq=%u", __entry
->freq
)
896 * DOC: i915_ppgtt_create and i915_ppgtt_release tracepoints
898 * With full ppgtt enabled each process using drm will allocate at least one
899 * translation table. With these traces it is possible to keep track of the
900 * allocation and of the lifetime of the tables; this can be used during
901 * testing/debug to verify that we are not leaking ppgtts.
902 * These traces identify the ppgtt through the vm pointer, which is also printed
903 * by the i915_vma_bind and i915_vma_unbind tracepoints.
905 DECLARE_EVENT_CLASS(i915_ppgtt
,
906 TP_PROTO(struct i915_address_space
*vm
),
910 __field(struct i915_address_space
*, vm
)
916 __entry
->dev
= vm
->i915
->drm
.primary
->index
;
919 TP_printk("dev=%u, vm=%p", __entry
->dev
, __entry
->vm
)
922 DEFINE_EVENT(i915_ppgtt
, i915_ppgtt_create
,
923 TP_PROTO(struct i915_address_space
*vm
),
927 DEFINE_EVENT(i915_ppgtt
, i915_ppgtt_release
,
928 TP_PROTO(struct i915_address_space
*vm
),
933 * DOC: i915_context_create and i915_context_free tracepoints
935 * These tracepoints are used to track creation and deletion of contexts.
936 * If full ppgtt is enabled, they also print the address of the vm assigned to
939 DECLARE_EVENT_CLASS(i915_context
,
940 TP_PROTO(struct i915_gem_context
*ctx
),
945 __field(struct i915_gem_context
*, ctx
)
947 __field(struct i915_address_space
*, vm
)
951 __entry
->dev
= ctx
->i915
->drm
.primary
->index
;
953 __entry
->hw_id
= ctx
->hw_id
;
954 __entry
->vm
= ctx
->ppgtt
? &ctx
->ppgtt
->base
: NULL
;
957 TP_printk("dev=%u, ctx=%p, ctx_vm=%p, hw_id=%u",
958 __entry
->dev
, __entry
->ctx
, __entry
->vm
, __entry
->hw_id
)
961 DEFINE_EVENT(i915_context
, i915_context_create
,
962 TP_PROTO(struct i915_gem_context
*ctx
),
966 DEFINE_EVENT(i915_context
, i915_context_free
,
967 TP_PROTO(struct i915_gem_context
*ctx
),
972 * DOC: switch_mm tracepoint
974 * This tracepoint allows tracking of the mm switch, which is an important point
975 * in the lifetime of the vm in the legacy submission path. This tracepoint is
976 * called only if full ppgtt is enabled.
978 TRACE_EVENT(switch_mm
,
979 TP_PROTO(struct intel_engine_cs
*engine
, struct i915_gem_context
*to
),
985 __field(struct i915_gem_context
*, to
)
986 __field(struct i915_address_space
*, vm
)
991 __entry
->ring
= engine
->id
;
993 __entry
->vm
= to
->ppgtt
? &to
->ppgtt
->base
: NULL
;
994 __entry
->dev
= engine
->i915
->drm
.primary
->index
;
997 TP_printk("dev=%u, ring=%u, ctx=%p, ctx_vm=%p",
998 __entry
->dev
, __entry
->ring
, __entry
->to
, __entry
->vm
)
1001 #endif /* _I915_TRACE_H_ */
1003 /* This part must be outside protection */
1004 #undef TRACE_INCLUDE_PATH
1005 #define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/i915
1006 #include <trace/define_trace.h>