1 #if !defined(_I915_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
4 #include <linux/stringify.h>
5 #include <linux/types.h>
6 #include <linux/tracepoint.h>
10 #include "intel_drv.h"
11 #include "intel_ringbuffer.h"
14 #define TRACE_SYSTEM i915
15 #define TRACE_INCLUDE_FILE i915_trace
19 TRACE_EVENT(i915_pipe_update_start
,
20 TP_PROTO(struct intel_crtc
*crtc
),
24 __field(enum pipe
, pipe
)
26 __field(u32
, scanline
)
32 __entry
->pipe
= crtc
->pipe
;
33 __entry
->frame
= crtc
->base
.dev
->driver
->get_vblank_counter(crtc
->base
.dev
,
35 __entry
->scanline
= intel_get_crtc_scanline(crtc
);
36 __entry
->min
= crtc
->debug
.min_vbl
;
37 __entry
->max
= crtc
->debug
.max_vbl
;
40 TP_printk("pipe %c, frame=%u, scanline=%u, min=%u, max=%u",
41 pipe_name(__entry
->pipe
), __entry
->frame
,
42 __entry
->scanline
, __entry
->min
, __entry
->max
)
45 TRACE_EVENT(i915_pipe_update_vblank_evaded
,
46 TP_PROTO(struct intel_crtc
*crtc
),
50 __field(enum pipe
, pipe
)
52 __field(u32
, scanline
)
58 __entry
->pipe
= crtc
->pipe
;
59 __entry
->frame
= crtc
->debug
.start_vbl_count
;
60 __entry
->scanline
= crtc
->debug
.scanline_start
;
61 __entry
->min
= crtc
->debug
.min_vbl
;
62 __entry
->max
= crtc
->debug
.max_vbl
;
65 TP_printk("pipe %c, frame=%u, scanline=%u, min=%u, max=%u",
66 pipe_name(__entry
->pipe
), __entry
->frame
,
67 __entry
->scanline
, __entry
->min
, __entry
->max
)
70 TRACE_EVENT(i915_pipe_update_end
,
71 TP_PROTO(struct intel_crtc
*crtc
, u32 frame
, int scanline_end
),
72 TP_ARGS(crtc
, frame
, scanline_end
),
75 __field(enum pipe
, pipe
)
77 __field(u32
, scanline
)
81 __entry
->pipe
= crtc
->pipe
;
82 __entry
->frame
= frame
;
83 __entry
->scanline
= scanline_end
;
86 TP_printk("pipe %c, frame=%u, scanline=%u",
87 pipe_name(__entry
->pipe
), __entry
->frame
,
93 TRACE_EVENT(i915_gem_object_create
,
94 TP_PROTO(struct drm_i915_gem_object
*obj
),
98 __field(struct drm_i915_gem_object
*, obj
)
104 __entry
->size
= obj
->base
.size
;
107 TP_printk("obj=%p, size=%u", __entry
->obj
, __entry
->size
)
110 TRACE_EVENT(i915_gem_shrink
,
111 TP_PROTO(struct drm_i915_private
*i915
, unsigned long target
, unsigned flags
),
112 TP_ARGS(i915
, target
, flags
),
116 __field(unsigned long, target
)
117 __field(unsigned, flags
)
121 __entry
->dev
= i915
->drm
.primary
->index
;
122 __entry
->target
= target
;
123 __entry
->flags
= flags
;
126 TP_printk("dev=%d, target=%lu, flags=%x",
127 __entry
->dev
, __entry
->target
, __entry
->flags
)
130 TRACE_EVENT(i915_vma_bind
,
131 TP_PROTO(struct i915_vma
*vma
, unsigned flags
),
135 __field(struct drm_i915_gem_object
*, obj
)
136 __field(struct i915_address_space
*, vm
)
139 __field(unsigned, flags
)
143 __entry
->obj
= vma
->obj
;
144 __entry
->vm
= vma
->vm
;
145 __entry
->offset
= vma
->node
.start
;
146 __entry
->size
= vma
->node
.size
;
147 __entry
->flags
= flags
;
150 TP_printk("obj=%p, offset=%016llx size=%x%s vm=%p",
151 __entry
->obj
, __entry
->offset
, __entry
->size
,
152 __entry
->flags
& PIN_MAPPABLE
? ", mappable" : "",
156 TRACE_EVENT(i915_vma_unbind
,
157 TP_PROTO(struct i915_vma
*vma
),
161 __field(struct drm_i915_gem_object
*, obj
)
162 __field(struct i915_address_space
*, vm
)
168 __entry
->obj
= vma
->obj
;
169 __entry
->vm
= vma
->vm
;
170 __entry
->offset
= vma
->node
.start
;
171 __entry
->size
= vma
->node
.size
;
174 TP_printk("obj=%p, offset=%016llx size=%x vm=%p",
175 __entry
->obj
, __entry
->offset
, __entry
->size
, __entry
->vm
)
178 TRACE_EVENT(i915_va_alloc
,
179 TP_PROTO(struct i915_vma
*vma
),
183 __field(struct i915_address_space
*, vm
)
189 __entry
->vm
= vma
->vm
;
190 __entry
->start
= vma
->node
.start
;
191 __entry
->end
= vma
->node
.start
+ vma
->node
.size
- 1;
194 TP_printk("vm=%p (%c), 0x%llx-0x%llx",
195 __entry
->vm
, i915_is_ggtt(__entry
->vm
) ? 'G' : 'P', __entry
->start
, __entry
->end
)
198 DECLARE_EVENT_CLASS(i915_px_entry
,
199 TP_PROTO(struct i915_address_space
*vm
, u32 px
, u64 start
, u64 px_shift
),
200 TP_ARGS(vm
, px
, start
, px_shift
),
203 __field(struct i915_address_space
*, vm
)
212 __entry
->start
= start
;
213 __entry
->end
= ((start
+ (1ULL << px_shift
)) & ~((1ULL << px_shift
)-1)) - 1;
216 TP_printk("vm=%p, pde=%d (0x%llx-0x%llx)",
217 __entry
->vm
, __entry
->px
, __entry
->start
, __entry
->end
)
220 DEFINE_EVENT(i915_px_entry
, i915_page_table_entry_alloc
,
221 TP_PROTO(struct i915_address_space
*vm
, u32 pde
, u64 start
, u64 pde_shift
),
222 TP_ARGS(vm
, pde
, start
, pde_shift
)
225 DEFINE_EVENT_PRINT(i915_px_entry
, i915_page_directory_entry_alloc
,
226 TP_PROTO(struct i915_address_space
*vm
, u32 pdpe
, u64 start
, u64 pdpe_shift
),
227 TP_ARGS(vm
, pdpe
, start
, pdpe_shift
),
229 TP_printk("vm=%p, pdpe=%d (0x%llx-0x%llx)",
230 __entry
->vm
, __entry
->px
, __entry
->start
, __entry
->end
)
233 DEFINE_EVENT_PRINT(i915_px_entry
, i915_page_directory_pointer_entry_alloc
,
234 TP_PROTO(struct i915_address_space
*vm
, u32 pml4e
, u64 start
, u64 pml4e_shift
),
235 TP_ARGS(vm
, pml4e
, start
, pml4e_shift
),
237 TP_printk("vm=%p, pml4e=%d (0x%llx-0x%llx)",
238 __entry
->vm
, __entry
->px
, __entry
->start
, __entry
->end
)
241 /* Avoid extra math because we only support two sizes. The format is defined by
242 * bitmap_scnprintf. Each 32 bits is 8 HEX digits followed by comma */
243 #define TRACE_PT_SIZE(bits) \
244 ((((bits) == 1024) ? 288 : 144) + 1)
246 DECLARE_EVENT_CLASS(i915_page_table_entry_update
,
247 TP_PROTO(struct i915_address_space
*vm
, u32 pde
,
248 struct i915_page_table
*pt
, u32 first
, u32 count
, u32 bits
),
249 TP_ARGS(vm
, pde
, pt
, first
, count
, bits
),
252 __field(struct i915_address_space
*, vm
)
256 __dynamic_array(char, cur_ptes
, TRACE_PT_SIZE(bits
))
262 __entry
->first
= first
;
263 __entry
->last
= first
+ count
- 1;
264 scnprintf(__get_str(cur_ptes
),
271 TP_printk("vm=%p, pde=%d, updating %u:%u\t%s",
272 __entry
->vm
, __entry
->pde
, __entry
->last
, __entry
->first
,
276 DEFINE_EVENT(i915_page_table_entry_update
, i915_page_table_entry_map
,
277 TP_PROTO(struct i915_address_space
*vm
, u32 pde
,
278 struct i915_page_table
*pt
, u32 first
, u32 count
, u32 bits
),
279 TP_ARGS(vm
, pde
, pt
, first
, count
, bits
)
282 TRACE_EVENT(i915_gem_object_change_domain
,
283 TP_PROTO(struct drm_i915_gem_object
*obj
, u32 old_read
, u32 old_write
),
284 TP_ARGS(obj
, old_read
, old_write
),
287 __field(struct drm_i915_gem_object
*, obj
)
288 __field(u32
, read_domains
)
289 __field(u32
, write_domain
)
294 __entry
->read_domains
= obj
->base
.read_domains
| (old_read
<< 16);
295 __entry
->write_domain
= obj
->base
.write_domain
| (old_write
<< 16);
298 TP_printk("obj=%p, read=%02x=>%02x, write=%02x=>%02x",
300 __entry
->read_domains
>> 16,
301 __entry
->read_domains
& 0xffff,
302 __entry
->write_domain
>> 16,
303 __entry
->write_domain
& 0xffff)
306 TRACE_EVENT(i915_gem_object_pwrite
,
307 TP_PROTO(struct drm_i915_gem_object
*obj
, u32 offset
, u32 len
),
308 TP_ARGS(obj
, offset
, len
),
311 __field(struct drm_i915_gem_object
*, obj
)
318 __entry
->offset
= offset
;
322 TP_printk("obj=%p, offset=%u, len=%u",
323 __entry
->obj
, __entry
->offset
, __entry
->len
)
326 TRACE_EVENT(i915_gem_object_pread
,
327 TP_PROTO(struct drm_i915_gem_object
*obj
, u32 offset
, u32 len
),
328 TP_ARGS(obj
, offset
, len
),
331 __field(struct drm_i915_gem_object
*, obj
)
338 __entry
->offset
= offset
;
342 TP_printk("obj=%p, offset=%u, len=%u",
343 __entry
->obj
, __entry
->offset
, __entry
->len
)
346 TRACE_EVENT(i915_gem_object_fault
,
347 TP_PROTO(struct drm_i915_gem_object
*obj
, u32 index
, bool gtt
, bool write
),
348 TP_ARGS(obj
, index
, gtt
, write
),
351 __field(struct drm_i915_gem_object
*, obj
)
359 __entry
->index
= index
;
361 __entry
->write
= write
;
364 TP_printk("obj=%p, %s index=%u %s",
366 __entry
->gtt
? "GTT" : "CPU",
368 __entry
->write
? ", writable" : "")
371 DECLARE_EVENT_CLASS(i915_gem_object
,
372 TP_PROTO(struct drm_i915_gem_object
*obj
),
376 __field(struct drm_i915_gem_object
*, obj
)
383 TP_printk("obj=%p", __entry
->obj
)
386 DEFINE_EVENT(i915_gem_object
, i915_gem_object_clflush
,
387 TP_PROTO(struct drm_i915_gem_object
*obj
),
391 DEFINE_EVENT(i915_gem_object
, i915_gem_object_destroy
,
392 TP_PROTO(struct drm_i915_gem_object
*obj
),
396 TRACE_EVENT(i915_gem_evict
,
397 TP_PROTO(struct i915_address_space
*vm
, u32 size
, u32 align
, unsigned int flags
),
398 TP_ARGS(vm
, size
, align
, flags
),
402 __field(struct i915_address_space
*, vm
)
405 __field(unsigned int, flags
)
409 __entry
->dev
= vm
->i915
->drm
.primary
->index
;
411 __entry
->size
= size
;
412 __entry
->align
= align
;
413 __entry
->flags
= flags
;
416 TP_printk("dev=%d, vm=%p, size=%d, align=%d %s",
417 __entry
->dev
, __entry
->vm
, __entry
->size
, __entry
->align
,
418 __entry
->flags
& PIN_MAPPABLE
? ", mappable" : "")
421 TRACE_EVENT(i915_gem_evict_everything
,
422 TP_PROTO(struct drm_device
*dev
),
430 __entry
->dev
= dev
->primary
->index
;
433 TP_printk("dev=%d", __entry
->dev
)
436 TRACE_EVENT(i915_gem_evict_vm
,
437 TP_PROTO(struct i915_address_space
*vm
),
442 __field(struct i915_address_space
*, vm
)
446 __entry
->dev
= vm
->i915
->drm
.primary
->index
;
450 TP_printk("dev=%d, vm=%p", __entry
->dev
, __entry
->vm
)
453 TRACE_EVENT(i915_gem_evict_node
,
454 TP_PROTO(struct i915_address_space
*vm
, struct drm_mm_node
*node
, unsigned int flags
),
455 TP_ARGS(vm
, node
, flags
),
459 __field(struct i915_address_space
*, vm
)
462 __field(unsigned long, color
)
463 __field(unsigned int, flags
)
467 __entry
->dev
= vm
->i915
->drm
.primary
->index
;
469 __entry
->start
= node
->start
;
470 __entry
->size
= node
->size
;
471 __entry
->color
= node
->color
;
472 __entry
->flags
= flags
;
475 TP_printk("dev=%d, vm=%p, start=%llx size=%llx, color=%lx, flags=%x",
476 __entry
->dev
, __entry
->vm
,
477 __entry
->start
, __entry
->size
,
478 __entry
->color
, __entry
->flags
)
481 TRACE_EVENT(i915_gem_ring_sync_to
,
482 TP_PROTO(struct drm_i915_gem_request
*to
,
483 struct drm_i915_gem_request
*from
),
488 __field(u32
, sync_from
)
489 __field(u32
, sync_to
)
494 __entry
->dev
= from
->i915
->drm
.primary
->index
;
495 __entry
->sync_from
= from
->engine
->id
;
496 __entry
->sync_to
= to
->engine
->id
;
497 __entry
->seqno
= from
->global_seqno
;
500 TP_printk("dev=%u, sync-from=%u, sync-to=%u, seqno=%u",
502 __entry
->sync_from
, __entry
->sync_to
,
506 TRACE_EVENT(i915_gem_ring_dispatch
,
507 TP_PROTO(struct drm_i915_gem_request
*req
, u32 flags
),
518 __entry
->dev
= req
->i915
->drm
.primary
->index
;
519 __entry
->ring
= req
->engine
->id
;
520 __entry
->seqno
= req
->global_seqno
;
521 __entry
->flags
= flags
;
522 dma_fence_enable_sw_signaling(&req
->fence
);
525 TP_printk("dev=%u, ring=%u, seqno=%u, flags=%x",
526 __entry
->dev
, __entry
->ring
, __entry
->seqno
, __entry
->flags
)
529 TRACE_EVENT(i915_gem_ring_flush
,
530 TP_PROTO(struct drm_i915_gem_request
*req
, u32 invalidate
, u32 flush
),
531 TP_ARGS(req
, invalidate
, flush
),
536 __field(u32
, invalidate
)
541 __entry
->dev
= req
->i915
->drm
.primary
->index
;
542 __entry
->ring
= req
->engine
->id
;
543 __entry
->invalidate
= invalidate
;
544 __entry
->flush
= flush
;
547 TP_printk("dev=%u, ring=%x, invalidate=%04x, flush=%04x",
548 __entry
->dev
, __entry
->ring
,
549 __entry
->invalidate
, __entry
->flush
)
552 DECLARE_EVENT_CLASS(i915_gem_request
,
553 TP_PROTO(struct drm_i915_gem_request
*req
),
563 __entry
->dev
= req
->i915
->drm
.primary
->index
;
564 __entry
->ring
= req
->engine
->id
;
565 __entry
->seqno
= req
->global_seqno
;
568 TP_printk("dev=%u, ring=%u, seqno=%u",
569 __entry
->dev
, __entry
->ring
, __entry
->seqno
)
572 DEFINE_EVENT(i915_gem_request
, i915_gem_request_add
,
573 TP_PROTO(struct drm_i915_gem_request
*req
),
577 TRACE_EVENT(i915_gem_request_notify
,
578 TP_PROTO(struct intel_engine_cs
*engine
),
588 __entry
->dev
= engine
->i915
->drm
.primary
->index
;
589 __entry
->ring
= engine
->id
;
590 __entry
->seqno
= intel_engine_get_seqno(engine
);
593 TP_printk("dev=%u, ring=%u, seqno=%u",
594 __entry
->dev
, __entry
->ring
, __entry
->seqno
)
597 DEFINE_EVENT(i915_gem_request
, i915_gem_request_retire
,
598 TP_PROTO(struct drm_i915_gem_request
*req
),
602 DEFINE_EVENT(i915_gem_request
, i915_gem_request_complete
,
603 TP_PROTO(struct drm_i915_gem_request
*req
),
607 TRACE_EVENT(i915_gem_request_wait_begin
,
608 TP_PROTO(struct drm_i915_gem_request
*req
),
615 __field(bool, blocking
)
618 /* NB: the blocking information is racy since mutex_is_locked
619 * doesn't check that the current thread holds the lock. The only
620 * other option would be to pass the boolean information of whether
621 * or not the class was blocking down through the stack which is
625 __entry
->dev
= req
->i915
->drm
.primary
->index
;
626 __entry
->ring
= req
->engine
->id
;
627 __entry
->seqno
= req
->global_seqno
;
629 mutex_is_locked(&req
->i915
->drm
.struct_mutex
);
632 TP_printk("dev=%u, ring=%u, seqno=%u, blocking=%s",
633 __entry
->dev
, __entry
->ring
,
634 __entry
->seqno
, __entry
->blocking
? "yes (NB)" : "no")
637 DEFINE_EVENT(i915_gem_request
, i915_gem_request_wait_end
,
638 TP_PROTO(struct drm_i915_gem_request
*req
),
642 TRACE_EVENT(i915_flip_request
,
643 TP_PROTO(int plane
, struct drm_i915_gem_object
*obj
),
649 __field(struct drm_i915_gem_object
*, obj
)
653 __entry
->plane
= plane
;
657 TP_printk("plane=%d, obj=%p", __entry
->plane
, __entry
->obj
)
660 TRACE_EVENT(i915_flip_complete
,
661 TP_PROTO(int plane
, struct drm_i915_gem_object
*obj
),
667 __field(struct drm_i915_gem_object
*, obj
)
671 __entry
->plane
= plane
;
675 TP_printk("plane=%d, obj=%p", __entry
->plane
, __entry
->obj
)
678 TRACE_EVENT_CONDITION(i915_reg_rw
,
679 TP_PROTO(bool write
, i915_reg_t reg
, u64 val
, int len
, bool trace
),
681 TP_ARGS(write
, reg
, val
, len
, trace
),
693 __entry
->val
= (u64
)val
;
694 __entry
->reg
= i915_mmio_reg_offset(reg
);
695 __entry
->write
= write
;
699 TP_printk("%s reg=0x%x, len=%d, val=(0x%x, 0x%x)",
700 __entry
->write
? "write" : "read",
701 __entry
->reg
, __entry
->len
,
702 (u32
)(__entry
->val
& 0xffffffff),
703 (u32
)(__entry
->val
>> 32))
706 TRACE_EVENT(intel_gpu_freq_change
,
715 __entry
->freq
= freq
;
718 TP_printk("new_freq=%u", __entry
->freq
)
722 * DOC: i915_ppgtt_create and i915_ppgtt_release tracepoints
724 * With full ppgtt enabled each process using drm will allocate at least one
725 * translation table. With these traces it is possible to keep track of the
726 * allocation and of the lifetime of the tables; this can be used during
727 * testing/debug to verify that we are not leaking ppgtts.
728 * These traces identify the ppgtt through the vm pointer, which is also printed
729 * by the i915_vma_bind and i915_vma_unbind tracepoints.
731 DECLARE_EVENT_CLASS(i915_ppgtt
,
732 TP_PROTO(struct i915_address_space
*vm
),
736 __field(struct i915_address_space
*, vm
)
742 __entry
->dev
= vm
->i915
->drm
.primary
->index
;
745 TP_printk("dev=%u, vm=%p", __entry
->dev
, __entry
->vm
)
748 DEFINE_EVENT(i915_ppgtt
, i915_ppgtt_create
,
749 TP_PROTO(struct i915_address_space
*vm
),
753 DEFINE_EVENT(i915_ppgtt
, i915_ppgtt_release
,
754 TP_PROTO(struct i915_address_space
*vm
),
759 * DOC: i915_context_create and i915_context_free tracepoints
761 * These tracepoints are used to track creation and deletion of contexts.
762 * If full ppgtt is enabled, they also print the address of the vm assigned to
765 DECLARE_EVENT_CLASS(i915_context
,
766 TP_PROTO(struct i915_gem_context
*ctx
),
771 __field(struct i915_gem_context
*, ctx
)
772 __field(struct i915_address_space
*, vm
)
777 __entry
->vm
= ctx
->ppgtt
? &ctx
->ppgtt
->base
: NULL
;
778 __entry
->dev
= ctx
->i915
->drm
.primary
->index
;
781 TP_printk("dev=%u, ctx=%p, ctx_vm=%p",
782 __entry
->dev
, __entry
->ctx
, __entry
->vm
)
785 DEFINE_EVENT(i915_context
, i915_context_create
,
786 TP_PROTO(struct i915_gem_context
*ctx
),
790 DEFINE_EVENT(i915_context
, i915_context_free
,
791 TP_PROTO(struct i915_gem_context
*ctx
),
796 * DOC: switch_mm tracepoint
798 * This tracepoint allows tracking of the mm switch, which is an important point
799 * in the lifetime of the vm in the legacy submission path. This tracepoint is
800 * called only if full ppgtt is enabled.
802 TRACE_EVENT(switch_mm
,
803 TP_PROTO(struct intel_engine_cs
*engine
, struct i915_gem_context
*to
),
809 __field(struct i915_gem_context
*, to
)
810 __field(struct i915_address_space
*, vm
)
815 __entry
->ring
= engine
->id
;
817 __entry
->vm
= to
->ppgtt
? &to
->ppgtt
->base
: NULL
;
818 __entry
->dev
= engine
->i915
->drm
.primary
->index
;
821 TP_printk("dev=%u, ring=%u, ctx=%p, ctx_vm=%p",
822 __entry
->dev
, __entry
->ring
, __entry
->to
, __entry
->vm
)
825 #endif /* _I915_TRACE_H_ */
827 /* This part must be outside protection */
828 #undef TRACE_INCLUDE_PATH
829 #define TRACE_INCLUDE_PATH .
830 #include <trace/define_trace.h>