xref: /openbmc/linux/drivers/gpu/drm/i915/i915_trace.h (revision 72744cb1)
11c5d22f7SChris Wilson #if !defined(_I915_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
21c5d22f7SChris Wilson #define _I915_TRACE_H_
31c5d22f7SChris Wilson 
41c5d22f7SChris Wilson #include <linux/stringify.h>
51c5d22f7SChris Wilson #include <linux/types.h>
61c5d22f7SChris Wilson #include <linux/tracepoint.h>
71c5d22f7SChris Wilson 
81c5d22f7SChris Wilson #include <drm/drmP.h>
905394f39SChris Wilson #include "i915_drv.h"
1025ef284aSVille Syrjälä #include "intel_drv.h"
11db53a302SChris Wilson #include "intel_ringbuffer.h"
121c5d22f7SChris Wilson 
131c5d22f7SChris Wilson #undef TRACE_SYSTEM
141c5d22f7SChris Wilson #define TRACE_SYSTEM i915
151c5d22f7SChris Wilson #define TRACE_SYSTEM_STRING __stringify(TRACE_SYSTEM)
161c5d22f7SChris Wilson #define TRACE_INCLUDE_FILE i915_trace
171c5d22f7SChris Wilson 
1825ef284aSVille Syrjälä /* pipe updates */
1925ef284aSVille Syrjälä 
2025ef284aSVille Syrjälä TRACE_EVENT(i915_pipe_update_start,
2125ef284aSVille Syrjälä 	    TP_PROTO(struct intel_crtc *crtc, u32 min, u32 max),
2225ef284aSVille Syrjälä 	    TP_ARGS(crtc, min, max),
2325ef284aSVille Syrjälä 
2425ef284aSVille Syrjälä 	    TP_STRUCT__entry(
2525ef284aSVille Syrjälä 			     __field(enum pipe, pipe)
2625ef284aSVille Syrjälä 			     __field(u32, frame)
2725ef284aSVille Syrjälä 			     __field(u32, scanline)
2825ef284aSVille Syrjälä 			     __field(u32, min)
2925ef284aSVille Syrjälä 			     __field(u32, max)
3025ef284aSVille Syrjälä 			     ),
3125ef284aSVille Syrjälä 
3225ef284aSVille Syrjälä 	    TP_fast_assign(
3325ef284aSVille Syrjälä 			   __entry->pipe = crtc->pipe;
3425ef284aSVille Syrjälä 			   __entry->frame = crtc->base.dev->driver->get_vblank_counter(crtc->base.dev,
3525ef284aSVille Syrjälä 										       crtc->pipe);
3625ef284aSVille Syrjälä 			   __entry->scanline = intel_get_crtc_scanline(crtc);
3725ef284aSVille Syrjälä 			   __entry->min = min;
3825ef284aSVille Syrjälä 			   __entry->max = max;
3925ef284aSVille Syrjälä 			   ),
4025ef284aSVille Syrjälä 
4125ef284aSVille Syrjälä 	    TP_printk("pipe %c, frame=%u, scanline=%u, min=%u, max=%u",
4225ef284aSVille Syrjälä 		      pipe_name(__entry->pipe), __entry->frame,
4325ef284aSVille Syrjälä 		       __entry->scanline, __entry->min, __entry->max)
4425ef284aSVille Syrjälä );
4525ef284aSVille Syrjälä 
4625ef284aSVille Syrjälä TRACE_EVENT(i915_pipe_update_vblank_evaded,
4725ef284aSVille Syrjälä 	    TP_PROTO(struct intel_crtc *crtc, u32 min, u32 max, u32 frame),
4825ef284aSVille Syrjälä 	    TP_ARGS(crtc, min, max, frame),
4925ef284aSVille Syrjälä 
5025ef284aSVille Syrjälä 	    TP_STRUCT__entry(
5125ef284aSVille Syrjälä 			     __field(enum pipe, pipe)
5225ef284aSVille Syrjälä 			     __field(u32, frame)
5325ef284aSVille Syrjälä 			     __field(u32, scanline)
5425ef284aSVille Syrjälä 			     __field(u32, min)
5525ef284aSVille Syrjälä 			     __field(u32, max)
5625ef284aSVille Syrjälä 			     ),
5725ef284aSVille Syrjälä 
5825ef284aSVille Syrjälä 	    TP_fast_assign(
5925ef284aSVille Syrjälä 			   __entry->pipe = crtc->pipe;
6025ef284aSVille Syrjälä 			   __entry->frame = frame;
6125ef284aSVille Syrjälä 			   __entry->scanline = intel_get_crtc_scanline(crtc);
6225ef284aSVille Syrjälä 			   __entry->min = min;
6325ef284aSVille Syrjälä 			   __entry->max = max;
6425ef284aSVille Syrjälä 			   ),
6525ef284aSVille Syrjälä 
6625ef284aSVille Syrjälä 	    TP_printk("pipe %c, frame=%u, scanline=%u, min=%u, max=%u",
6725ef284aSVille Syrjälä 		      pipe_name(__entry->pipe), __entry->frame,
6825ef284aSVille Syrjälä 		       __entry->scanline, __entry->min, __entry->max)
6925ef284aSVille Syrjälä );
7025ef284aSVille Syrjälä 
7125ef284aSVille Syrjälä TRACE_EVENT(i915_pipe_update_end,
7225ef284aSVille Syrjälä 	    TP_PROTO(struct intel_crtc *crtc, u32 frame),
7325ef284aSVille Syrjälä 	    TP_ARGS(crtc, frame),
7425ef284aSVille Syrjälä 
7525ef284aSVille Syrjälä 	    TP_STRUCT__entry(
7625ef284aSVille Syrjälä 			     __field(enum pipe, pipe)
7725ef284aSVille Syrjälä 			     __field(u32, frame)
7825ef284aSVille Syrjälä 			     __field(u32, scanline)
7925ef284aSVille Syrjälä 			     ),
8025ef284aSVille Syrjälä 
8125ef284aSVille Syrjälä 	    TP_fast_assign(
8225ef284aSVille Syrjälä 			   __entry->pipe = crtc->pipe;
8325ef284aSVille Syrjälä 			   __entry->frame = frame;
8425ef284aSVille Syrjälä 			   __entry->scanline = intel_get_crtc_scanline(crtc);
8525ef284aSVille Syrjälä 			   ),
8625ef284aSVille Syrjälä 
8725ef284aSVille Syrjälä 	    TP_printk("pipe %c, frame=%u, scanline=%u",
8825ef284aSVille Syrjälä 		      pipe_name(__entry->pipe), __entry->frame,
8925ef284aSVille Syrjälä 		      __entry->scanline)
9025ef284aSVille Syrjälä );
9125ef284aSVille Syrjälä 
921c5d22f7SChris Wilson /* object tracking */
931c5d22f7SChris Wilson 
941c5d22f7SChris Wilson TRACE_EVENT(i915_gem_object_create,
9505394f39SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj),
961c5d22f7SChris Wilson 	    TP_ARGS(obj),
971c5d22f7SChris Wilson 
981c5d22f7SChris Wilson 	    TP_STRUCT__entry(
9905394f39SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
1001c5d22f7SChris Wilson 			     __field(u32, size)
1011c5d22f7SChris Wilson 			     ),
1021c5d22f7SChris Wilson 
1031c5d22f7SChris Wilson 	    TP_fast_assign(
1041c5d22f7SChris Wilson 			   __entry->obj = obj;
10505394f39SChris Wilson 			   __entry->size = obj->base.size;
1061c5d22f7SChris Wilson 			   ),
1071c5d22f7SChris Wilson 
1081c5d22f7SChris Wilson 	    TP_printk("obj=%p, size=%u", __entry->obj, __entry->size)
1091c5d22f7SChris Wilson );
1101c5d22f7SChris Wilson 
11107fe0b12SBen Widawsky TRACE_EVENT(i915_vma_bind,
1121ec9e26dSDaniel Vetter 	    TP_PROTO(struct i915_vma *vma, unsigned flags),
1131ec9e26dSDaniel Vetter 	    TP_ARGS(vma, flags),
1141c5d22f7SChris Wilson 
1151c5d22f7SChris Wilson 	    TP_STRUCT__entry(
11605394f39SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
11707fe0b12SBen Widawsky 			     __field(struct i915_address_space *, vm)
11833938714SBen Widawsky 			     __field(u64, offset)
119db53a302SChris Wilson 			     __field(u32, size)
1201ec9e26dSDaniel Vetter 			     __field(unsigned, flags)
1211c5d22f7SChris Wilson 			     ),
1221c5d22f7SChris Wilson 
1231c5d22f7SChris Wilson 	    TP_fast_assign(
12407fe0b12SBen Widawsky 			   __entry->obj = vma->obj;
12507fe0b12SBen Widawsky 			   __entry->vm = vma->vm;
12607fe0b12SBen Widawsky 			   __entry->offset = vma->node.start;
12707fe0b12SBen Widawsky 			   __entry->size = vma->node.size;
1281ec9e26dSDaniel Vetter 			   __entry->flags = flags;
1291c5d22f7SChris Wilson 			   ),
1301c5d22f7SChris Wilson 
13133938714SBen Widawsky 	    TP_printk("obj=%p, offset=%016llx size=%x%s vm=%p",
132db53a302SChris Wilson 		      __entry->obj, __entry->offset, __entry->size,
1331ec9e26dSDaniel Vetter 		      __entry->flags & PIN_MAPPABLE ? ", mappable" : "",
13407fe0b12SBen Widawsky 		      __entry->vm)
1351c5d22f7SChris Wilson );
1361c5d22f7SChris Wilson 
13707fe0b12SBen Widawsky TRACE_EVENT(i915_vma_unbind,
13807fe0b12SBen Widawsky 	    TP_PROTO(struct i915_vma *vma),
13907fe0b12SBen Widawsky 	    TP_ARGS(vma),
140db53a302SChris Wilson 
141db53a302SChris Wilson 	    TP_STRUCT__entry(
142db53a302SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
14307fe0b12SBen Widawsky 			     __field(struct i915_address_space *, vm)
14433938714SBen Widawsky 			     __field(u64, offset)
145db53a302SChris Wilson 			     __field(u32, size)
146db53a302SChris Wilson 			     ),
147db53a302SChris Wilson 
148db53a302SChris Wilson 	    TP_fast_assign(
14907fe0b12SBen Widawsky 			   __entry->obj = vma->obj;
15007fe0b12SBen Widawsky 			   __entry->vm = vma->vm;
15107fe0b12SBen Widawsky 			   __entry->offset = vma->node.start;
15207fe0b12SBen Widawsky 			   __entry->size = vma->node.size;
153db53a302SChris Wilson 			   ),
154db53a302SChris Wilson 
15533938714SBen Widawsky 	    TP_printk("obj=%p, offset=%016llx size=%x vm=%p",
15607fe0b12SBen Widawsky 		      __entry->obj, __entry->offset, __entry->size, __entry->vm)
157db53a302SChris Wilson );
158db53a302SChris Wilson 
15972744cb1SMichel Thierry #define VM_TO_TRACE_NAME(vm) \
16072744cb1SMichel Thierry 	(i915_is_ggtt(vm) ? "G" : \
16172744cb1SMichel Thierry 		      "P")
16272744cb1SMichel Thierry 
16372744cb1SMichel Thierry DECLARE_EVENT_CLASS(i915_va,
16472744cb1SMichel Thierry 	TP_PROTO(struct i915_address_space *vm, u64 start, u64 length, const char *name),
16572744cb1SMichel Thierry 	TP_ARGS(vm, start, length, name),
16672744cb1SMichel Thierry 
16772744cb1SMichel Thierry 	TP_STRUCT__entry(
16872744cb1SMichel Thierry 		__field(struct i915_address_space *, vm)
16972744cb1SMichel Thierry 		__field(u64, start)
17072744cb1SMichel Thierry 		__field(u64, end)
17172744cb1SMichel Thierry 		__string(name, name)
17272744cb1SMichel Thierry 	),
17372744cb1SMichel Thierry 
17472744cb1SMichel Thierry 	TP_fast_assign(
17572744cb1SMichel Thierry 		__entry->vm = vm;
17672744cb1SMichel Thierry 		__entry->start = start;
17772744cb1SMichel Thierry 		__entry->end = start + length - 1;
17872744cb1SMichel Thierry 		__assign_str(name, name);
17972744cb1SMichel Thierry 	),
18072744cb1SMichel Thierry 
18172744cb1SMichel Thierry 	TP_printk("vm=%p (%s), 0x%llx-0x%llx",
18272744cb1SMichel Thierry 		  __entry->vm, __get_str(name),  __entry->start, __entry->end)
18372744cb1SMichel Thierry );
18472744cb1SMichel Thierry 
18572744cb1SMichel Thierry DEFINE_EVENT(i915_va, i915_va_alloc,
18672744cb1SMichel Thierry 	     TP_PROTO(struct i915_address_space *vm, u64 start, u64 length, const char *name),
18772744cb1SMichel Thierry 	     TP_ARGS(vm, start, length, name)
18872744cb1SMichel Thierry );
18972744cb1SMichel Thierry 
19072744cb1SMichel Thierry DECLARE_EVENT_CLASS(i915_page_table_entry,
19172744cb1SMichel Thierry 	TP_PROTO(struct i915_address_space *vm, u32 pde, u64 start, u64 pde_shift),
19272744cb1SMichel Thierry 	TP_ARGS(vm, pde, start, pde_shift),
19372744cb1SMichel Thierry 
19472744cb1SMichel Thierry 	TP_STRUCT__entry(
19572744cb1SMichel Thierry 		__field(struct i915_address_space *, vm)
19672744cb1SMichel Thierry 		__field(u32, pde)
19772744cb1SMichel Thierry 		__field(u64, start)
19872744cb1SMichel Thierry 		__field(u64, end)
19972744cb1SMichel Thierry 	),
20072744cb1SMichel Thierry 
20172744cb1SMichel Thierry 	TP_fast_assign(
20272744cb1SMichel Thierry 		__entry->vm = vm;
20372744cb1SMichel Thierry 		__entry->pde = pde;
20472744cb1SMichel Thierry 		__entry->start = start;
20572744cb1SMichel Thierry 		__entry->end = ((start + (1ULL << pde_shift)) & ~((1ULL << pde_shift)-1)) - 1;
20672744cb1SMichel Thierry 	),
20772744cb1SMichel Thierry 
20872744cb1SMichel Thierry 	TP_printk("vm=%p, pde=%d (0x%llx-0x%llx)",
20972744cb1SMichel Thierry 		  __entry->vm, __entry->pde, __entry->start, __entry->end)
21072744cb1SMichel Thierry );
21172744cb1SMichel Thierry 
21272744cb1SMichel Thierry DEFINE_EVENT(i915_page_table_entry, i915_page_table_entry_alloc,
21372744cb1SMichel Thierry 	     TP_PROTO(struct i915_address_space *vm, u32 pde, u64 start, u64 pde_shift),
21472744cb1SMichel Thierry 	     TP_ARGS(vm, pde, start, pde_shift)
21572744cb1SMichel Thierry );
21672744cb1SMichel Thierry 
21772744cb1SMichel Thierry /* Avoid extra math because we only support two sizes. The format is defined by
21872744cb1SMichel Thierry  * bitmap_scnprintf. Each 32 bits is 8 HEX digits followed by comma */
21972744cb1SMichel Thierry #define TRACE_PT_SIZE(bits) \
22072744cb1SMichel Thierry 	((((bits) == 1024) ? 288 : 144) + 1)
22172744cb1SMichel Thierry 
22272744cb1SMichel Thierry DECLARE_EVENT_CLASS(i915_page_table_entry_update,
22372744cb1SMichel Thierry 	TP_PROTO(struct i915_address_space *vm, u32 pde,
22472744cb1SMichel Thierry 		 struct i915_page_table_entry *pt, u32 first, u32 count, u32 bits),
22572744cb1SMichel Thierry 	TP_ARGS(vm, pde, pt, first, count, bits),
22672744cb1SMichel Thierry 
22772744cb1SMichel Thierry 	TP_STRUCT__entry(
22872744cb1SMichel Thierry 		__field(struct i915_address_space *, vm)
22972744cb1SMichel Thierry 		__field(u32, pde)
23072744cb1SMichel Thierry 		__field(u32, first)
23172744cb1SMichel Thierry 		__field(u32, last)
23272744cb1SMichel Thierry 		__dynamic_array(char, cur_ptes, TRACE_PT_SIZE(bits))
23372744cb1SMichel Thierry 	),
23472744cb1SMichel Thierry 
23572744cb1SMichel Thierry 	TP_fast_assign(
23672744cb1SMichel Thierry 		__entry->vm = vm;
23772744cb1SMichel Thierry 		__entry->pde = pde;
23872744cb1SMichel Thierry 		__entry->first = first;
23972744cb1SMichel Thierry 		__entry->last = first + count - 1;
24072744cb1SMichel Thierry 		scnprintf(__get_str(cur_ptes),
24172744cb1SMichel Thierry 			  TRACE_PT_SIZE(bits),
24272744cb1SMichel Thierry 			  "%*pb",
24372744cb1SMichel Thierry 			  bits,
24472744cb1SMichel Thierry 			  pt->used_ptes);
24572744cb1SMichel Thierry 	),
24672744cb1SMichel Thierry 
24772744cb1SMichel Thierry 	TP_printk("vm=%p, pde=%d, updating %u:%u\t%s",
24872744cb1SMichel Thierry 		  __entry->vm, __entry->pde, __entry->last, __entry->first,
24972744cb1SMichel Thierry 		  __get_str(cur_ptes))
25072744cb1SMichel Thierry );
25172744cb1SMichel Thierry 
25272744cb1SMichel Thierry DEFINE_EVENT(i915_page_table_entry_update, i915_page_table_entry_map,
25372744cb1SMichel Thierry 	TP_PROTO(struct i915_address_space *vm, u32 pde,
25472744cb1SMichel Thierry 		 struct i915_page_table_entry *pt, u32 first, u32 count, u32 bits),
25572744cb1SMichel Thierry 	TP_ARGS(vm, pde, pt, first, count, bits)
25672744cb1SMichel Thierry );
25772744cb1SMichel Thierry 
2581c5d22f7SChris Wilson TRACE_EVENT(i915_gem_object_change_domain,
259db53a302SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj, u32 old_read, u32 old_write),
260db53a302SChris Wilson 	    TP_ARGS(obj, old_read, old_write),
2611c5d22f7SChris Wilson 
2621c5d22f7SChris Wilson 	    TP_STRUCT__entry(
26305394f39SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
2641c5d22f7SChris Wilson 			     __field(u32, read_domains)
2651c5d22f7SChris Wilson 			     __field(u32, write_domain)
2661c5d22f7SChris Wilson 			     ),
2671c5d22f7SChris Wilson 
2681c5d22f7SChris Wilson 	    TP_fast_assign(
2691c5d22f7SChris Wilson 			   __entry->obj = obj;
270db53a302SChris Wilson 			   __entry->read_domains = obj->base.read_domains | (old_read << 16);
271db53a302SChris Wilson 			   __entry->write_domain = obj->base.write_domain | (old_write << 16);
2721c5d22f7SChris Wilson 			   ),
2731c5d22f7SChris Wilson 
274db53a302SChris Wilson 	    TP_printk("obj=%p, read=%02x=>%02x, write=%02x=>%02x",
2751c5d22f7SChris Wilson 		      __entry->obj,
276db53a302SChris Wilson 		      __entry->read_domains >> 16,
277db53a302SChris Wilson 		      __entry->read_domains & 0xffff,
278db53a302SChris Wilson 		      __entry->write_domain >> 16,
279db53a302SChris Wilson 		      __entry->write_domain & 0xffff)
280db53a302SChris Wilson );
281db53a302SChris Wilson 
282db53a302SChris Wilson TRACE_EVENT(i915_gem_object_pwrite,
283db53a302SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj, u32 offset, u32 len),
284db53a302SChris Wilson 	    TP_ARGS(obj, offset, len),
285db53a302SChris Wilson 
286db53a302SChris Wilson 	    TP_STRUCT__entry(
287db53a302SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
288db53a302SChris Wilson 			     __field(u32, offset)
289db53a302SChris Wilson 			     __field(u32, len)
290db53a302SChris Wilson 			     ),
291db53a302SChris Wilson 
292db53a302SChris Wilson 	    TP_fast_assign(
293db53a302SChris Wilson 			   __entry->obj = obj;
294db53a302SChris Wilson 			   __entry->offset = offset;
295db53a302SChris Wilson 			   __entry->len = len;
296db53a302SChris Wilson 			   ),
297db53a302SChris Wilson 
298db53a302SChris Wilson 	    TP_printk("obj=%p, offset=%u, len=%u",
299db53a302SChris Wilson 		      __entry->obj, __entry->offset, __entry->len)
300db53a302SChris Wilson );
301db53a302SChris Wilson 
302db53a302SChris Wilson TRACE_EVENT(i915_gem_object_pread,
303db53a302SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj, u32 offset, u32 len),
304db53a302SChris Wilson 	    TP_ARGS(obj, offset, len),
305db53a302SChris Wilson 
306db53a302SChris Wilson 	    TP_STRUCT__entry(
307db53a302SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
308db53a302SChris Wilson 			     __field(u32, offset)
309db53a302SChris Wilson 			     __field(u32, len)
310db53a302SChris Wilson 			     ),
311db53a302SChris Wilson 
312db53a302SChris Wilson 	    TP_fast_assign(
313db53a302SChris Wilson 			   __entry->obj = obj;
314db53a302SChris Wilson 			   __entry->offset = offset;
315db53a302SChris Wilson 			   __entry->len = len;
316db53a302SChris Wilson 			   ),
317db53a302SChris Wilson 
318db53a302SChris Wilson 	    TP_printk("obj=%p, offset=%u, len=%u",
319db53a302SChris Wilson 		      __entry->obj, __entry->offset, __entry->len)
320db53a302SChris Wilson );
321db53a302SChris Wilson 
322db53a302SChris Wilson TRACE_EVENT(i915_gem_object_fault,
323db53a302SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj, u32 index, bool gtt, bool write),
324db53a302SChris Wilson 	    TP_ARGS(obj, index, gtt, write),
325db53a302SChris Wilson 
326db53a302SChris Wilson 	    TP_STRUCT__entry(
327db53a302SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
328db53a302SChris Wilson 			     __field(u32, index)
329db53a302SChris Wilson 			     __field(bool, gtt)
330db53a302SChris Wilson 			     __field(bool, write)
331db53a302SChris Wilson 			     ),
332db53a302SChris Wilson 
333db53a302SChris Wilson 	    TP_fast_assign(
334db53a302SChris Wilson 			   __entry->obj = obj;
335db53a302SChris Wilson 			   __entry->index = index;
336db53a302SChris Wilson 			   __entry->gtt = gtt;
337db53a302SChris Wilson 			   __entry->write = write;
338db53a302SChris Wilson 			   ),
339db53a302SChris Wilson 
340db53a302SChris Wilson 	    TP_printk("obj=%p, %s index=%u %s",
341db53a302SChris Wilson 		      __entry->obj,
342db53a302SChris Wilson 		      __entry->gtt ? "GTT" : "CPU",
343db53a302SChris Wilson 		      __entry->index,
344db53a302SChris Wilson 		      __entry->write ? ", writable" : "")
3451c5d22f7SChris Wilson );
3461c5d22f7SChris Wilson 
347903cf20cSLi Zefan DECLARE_EVENT_CLASS(i915_gem_object,
34805394f39SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj),
3491c5d22f7SChris Wilson 	    TP_ARGS(obj),
3501c5d22f7SChris Wilson 
3511c5d22f7SChris Wilson 	    TP_STRUCT__entry(
35205394f39SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
3531c5d22f7SChris Wilson 			     ),
3541c5d22f7SChris Wilson 
3551c5d22f7SChris Wilson 	    TP_fast_assign(
3561c5d22f7SChris Wilson 			   __entry->obj = obj;
3571c5d22f7SChris Wilson 			   ),
3581c5d22f7SChris Wilson 
3591c5d22f7SChris Wilson 	    TP_printk("obj=%p", __entry->obj)
3601c5d22f7SChris Wilson );
3611c5d22f7SChris Wilson 
362f41275e8SLi Zefan DEFINE_EVENT(i915_gem_object, i915_gem_object_clflush,
36305394f39SChris Wilson 	     TP_PROTO(struct drm_i915_gem_object *obj),
364903cf20cSLi Zefan 	     TP_ARGS(obj)
365903cf20cSLi Zefan );
3661c5d22f7SChris Wilson 
367903cf20cSLi Zefan DEFINE_EVENT(i915_gem_object, i915_gem_object_destroy,
36805394f39SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj),
369903cf20cSLi Zefan 	    TP_ARGS(obj)
3701c5d22f7SChris Wilson );
3711c5d22f7SChris Wilson 
372db53a302SChris Wilson TRACE_EVENT(i915_gem_evict,
3731ec9e26dSDaniel Vetter 	    TP_PROTO(struct drm_device *dev, u32 size, u32 align, unsigned flags),
3741ec9e26dSDaniel Vetter 	    TP_ARGS(dev, size, align, flags),
3751c5d22f7SChris Wilson 
3761c5d22f7SChris Wilson 	    TP_STRUCT__entry(
3774f49be54SChris Wilson 			     __field(u32, dev)
378db53a302SChris Wilson 			     __field(u32, size)
379db53a302SChris Wilson 			     __field(u32, align)
3801ec9e26dSDaniel Vetter 			     __field(unsigned, flags)
3811c5d22f7SChris Wilson 			    ),
3821c5d22f7SChris Wilson 
3831c5d22f7SChris Wilson 	    TP_fast_assign(
3844f49be54SChris Wilson 			   __entry->dev = dev->primary->index;
385db53a302SChris Wilson 			   __entry->size = size;
386db53a302SChris Wilson 			   __entry->align = align;
3871ec9e26dSDaniel Vetter 			   __entry->flags = flags;
3881c5d22f7SChris Wilson 			  ),
3891c5d22f7SChris Wilson 
390db53a302SChris Wilson 	    TP_printk("dev=%d, size=%d, align=%d %s",
391db53a302SChris Wilson 		      __entry->dev, __entry->size, __entry->align,
3921ec9e26dSDaniel Vetter 		      __entry->flags & PIN_MAPPABLE ? ", mappable" : "")
3931c5d22f7SChris Wilson );
3941c5d22f7SChris Wilson 
395db53a302SChris Wilson TRACE_EVENT(i915_gem_evict_everything,
3966c085a72SChris Wilson 	    TP_PROTO(struct drm_device *dev),
3976c085a72SChris Wilson 	    TP_ARGS(dev),
3981c5d22f7SChris Wilson 
3991c5d22f7SChris Wilson 	    TP_STRUCT__entry(
4004f49be54SChris Wilson 			     __field(u32, dev)
4011c5d22f7SChris Wilson 			    ),
4021c5d22f7SChris Wilson 
4031c5d22f7SChris Wilson 	    TP_fast_assign(
4044f49be54SChris Wilson 			   __entry->dev = dev->primary->index;
4051c5d22f7SChris Wilson 			  ),
4061c5d22f7SChris Wilson 
4076c085a72SChris Wilson 	    TP_printk("dev=%d", __entry->dev)
408db53a302SChris Wilson );
409db53a302SChris Wilson 
410bcccff84SBen Widawsky TRACE_EVENT(i915_gem_evict_vm,
411bcccff84SBen Widawsky 	    TP_PROTO(struct i915_address_space *vm),
412bcccff84SBen Widawsky 	    TP_ARGS(vm),
413bcccff84SBen Widawsky 
414bcccff84SBen Widawsky 	    TP_STRUCT__entry(
4159297ebf2SSteven Rostedt 			     __field(u32, dev)
416bcccff84SBen Widawsky 			     __field(struct i915_address_space *, vm)
417bcccff84SBen Widawsky 			    ),
418bcccff84SBen Widawsky 
419bcccff84SBen Widawsky 	    TP_fast_assign(
4209297ebf2SSteven Rostedt 			   __entry->dev = vm->dev->primary->index;
421bcccff84SBen Widawsky 			   __entry->vm = vm;
422bcccff84SBen Widawsky 			  ),
423bcccff84SBen Widawsky 
4249297ebf2SSteven Rostedt 	    TP_printk("dev=%d, vm=%p", __entry->dev, __entry->vm)
425bcccff84SBen Widawsky );
426bcccff84SBen Widawsky 
427b52b89daSChris Wilson TRACE_EVENT(i915_gem_ring_sync_to,
428a4872ba6SOscar Mateo 	    TP_PROTO(struct intel_engine_cs *from,
429a4872ba6SOscar Mateo 		     struct intel_engine_cs *to,
43074328ee5SJohn Harrison 		     struct drm_i915_gem_request *req),
43174328ee5SJohn Harrison 	    TP_ARGS(from, to, req),
432b52b89daSChris Wilson 
433b52b89daSChris Wilson 	    TP_STRUCT__entry(
434b52b89daSChris Wilson 			     __field(u32, dev)
435b52b89daSChris Wilson 			     __field(u32, sync_from)
436b52b89daSChris Wilson 			     __field(u32, sync_to)
437b52b89daSChris Wilson 			     __field(u32, seqno)
438b52b89daSChris Wilson 			     ),
439b52b89daSChris Wilson 
440b52b89daSChris Wilson 	    TP_fast_assign(
441b52b89daSChris Wilson 			   __entry->dev = from->dev->primary->index;
442b52b89daSChris Wilson 			   __entry->sync_from = from->id;
443b52b89daSChris Wilson 			   __entry->sync_to = to->id;
44474328ee5SJohn Harrison 			   __entry->seqno = i915_gem_request_get_seqno(req);
445b52b89daSChris Wilson 			   ),
446b52b89daSChris Wilson 
447b52b89daSChris Wilson 	    TP_printk("dev=%u, sync-from=%u, sync-to=%u, seqno=%u",
448b52b89daSChris Wilson 		      __entry->dev,
449b52b89daSChris Wilson 		      __entry->sync_from, __entry->sync_to,
450b52b89daSChris Wilson 		      __entry->seqno)
451b52b89daSChris Wilson );
452b52b89daSChris Wilson 
453db53a302SChris Wilson TRACE_EVENT(i915_gem_ring_dispatch,
45474328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req, u32 flags),
45574328ee5SJohn Harrison 	    TP_ARGS(req, flags),
456db53a302SChris Wilson 
457db53a302SChris Wilson 	    TP_STRUCT__entry(
458db53a302SChris Wilson 			     __field(u32, dev)
459db53a302SChris Wilson 			     __field(u32, ring)
460db53a302SChris Wilson 			     __field(u32, seqno)
461d7d4eeddSChris Wilson 			     __field(u32, flags)
462db53a302SChris Wilson 			     ),
463db53a302SChris Wilson 
464db53a302SChris Wilson 	    TP_fast_assign(
46574328ee5SJohn Harrison 			   struct intel_engine_cs *ring =
46674328ee5SJohn Harrison 						i915_gem_request_get_ring(req);
467db53a302SChris Wilson 			   __entry->dev = ring->dev->primary->index;
468db53a302SChris Wilson 			   __entry->ring = ring->id;
46974328ee5SJohn Harrison 			   __entry->seqno = i915_gem_request_get_seqno(req);
470d7d4eeddSChris Wilson 			   __entry->flags = flags;
471581c26e8SJohn Harrison 			   i915_trace_irq_get(ring, req);
472db53a302SChris Wilson 			   ),
473db53a302SChris Wilson 
474d7d4eeddSChris Wilson 	    TP_printk("dev=%u, ring=%u, seqno=%u, flags=%x",
475d7d4eeddSChris Wilson 		      __entry->dev, __entry->ring, __entry->seqno, __entry->flags)
476db53a302SChris Wilson );
477db53a302SChris Wilson 
478db53a302SChris Wilson TRACE_EVENT(i915_gem_ring_flush,
479a4872ba6SOscar Mateo 	    TP_PROTO(struct intel_engine_cs *ring, u32 invalidate, u32 flush),
480db53a302SChris Wilson 	    TP_ARGS(ring, invalidate, flush),
481db53a302SChris Wilson 
482db53a302SChris Wilson 	    TP_STRUCT__entry(
483db53a302SChris Wilson 			     __field(u32, dev)
484db53a302SChris Wilson 			     __field(u32, ring)
485db53a302SChris Wilson 			     __field(u32, invalidate)
486db53a302SChris Wilson 			     __field(u32, flush)
487db53a302SChris Wilson 			     ),
488db53a302SChris Wilson 
489db53a302SChris Wilson 	    TP_fast_assign(
490db53a302SChris Wilson 			   __entry->dev = ring->dev->primary->index;
491db53a302SChris Wilson 			   __entry->ring = ring->id;
492db53a302SChris Wilson 			   __entry->invalidate = invalidate;
493db53a302SChris Wilson 			   __entry->flush = flush;
494db53a302SChris Wilson 			   ),
495db53a302SChris Wilson 
496db53a302SChris Wilson 	    TP_printk("dev=%u, ring=%x, invalidate=%04x, flush=%04x",
497db53a302SChris Wilson 		      __entry->dev, __entry->ring,
498db53a302SChris Wilson 		      __entry->invalidate, __entry->flush)
4991c5d22f7SChris Wilson );
5001c5d22f7SChris Wilson 
501903cf20cSLi Zefan DECLARE_EVENT_CLASS(i915_gem_request,
50274328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
50374328ee5SJohn Harrison 	    TP_ARGS(req),
5041c5d22f7SChris Wilson 
5051c5d22f7SChris Wilson 	    TP_STRUCT__entry(
5064f49be54SChris Wilson 			     __field(u32, dev)
507db53a302SChris Wilson 			     __field(u32, ring)
508bcfcc8baSJohn Harrison 			     __field(u32, uniq)
5091c5d22f7SChris Wilson 			     __field(u32, seqno)
5101c5d22f7SChris Wilson 			     ),
5111c5d22f7SChris Wilson 
5121c5d22f7SChris Wilson 	    TP_fast_assign(
51374328ee5SJohn Harrison 			   struct intel_engine_cs *ring =
51474328ee5SJohn Harrison 						i915_gem_request_get_ring(req);
515db53a302SChris Wilson 			   __entry->dev = ring->dev->primary->index;
516db53a302SChris Wilson 			   __entry->ring = ring->id;
517bcfcc8baSJohn Harrison 			   __entry->uniq = req ? req->uniq : 0;
51874328ee5SJohn Harrison 			   __entry->seqno = i915_gem_request_get_seqno(req);
5191c5d22f7SChris Wilson 			   ),
5201c5d22f7SChris Wilson 
521bcfcc8baSJohn Harrison 	    TP_printk("dev=%u, ring=%u, uniq=%u, seqno=%u",
522bcfcc8baSJohn Harrison 		      __entry->dev, __entry->ring, __entry->uniq,
523bcfcc8baSJohn Harrison 		      __entry->seqno)
524db53a302SChris Wilson );
525db53a302SChris Wilson 
526db53a302SChris Wilson DEFINE_EVENT(i915_gem_request, i915_gem_request_add,
52774328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
52874328ee5SJohn Harrison 	    TP_ARGS(req)
5291c5d22f7SChris Wilson );
5301c5d22f7SChris Wilson 
531bcfcc8baSJohn Harrison TRACE_EVENT(i915_gem_request_notify,
532a4872ba6SOscar Mateo 	    TP_PROTO(struct intel_engine_cs *ring),
533814e9b57SChris Wilson 	    TP_ARGS(ring),
534814e9b57SChris Wilson 
535814e9b57SChris Wilson 	    TP_STRUCT__entry(
536814e9b57SChris Wilson 			     __field(u32, dev)
537814e9b57SChris Wilson 			     __field(u32, ring)
538814e9b57SChris Wilson 			     __field(u32, seqno)
539814e9b57SChris Wilson 			     ),
540814e9b57SChris Wilson 
541814e9b57SChris Wilson 	    TP_fast_assign(
542814e9b57SChris Wilson 			   __entry->dev = ring->dev->primary->index;
543814e9b57SChris Wilson 			   __entry->ring = ring->id;
544814e9b57SChris Wilson 			   __entry->seqno = ring->get_seqno(ring, false);
545814e9b57SChris Wilson 			   ),
546814e9b57SChris Wilson 
547814e9b57SChris Wilson 	    TP_printk("dev=%u, ring=%u, seqno=%u",
548814e9b57SChris Wilson 		      __entry->dev, __entry->ring, __entry->seqno)
5491c5d22f7SChris Wilson );
5501c5d22f7SChris Wilson 
551903cf20cSLi Zefan DEFINE_EVENT(i915_gem_request, i915_gem_request_retire,
55274328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
55374328ee5SJohn Harrison 	    TP_ARGS(req)
5541c5d22f7SChris Wilson );
5551c5d22f7SChris Wilson 
556bcfcc8baSJohn Harrison DEFINE_EVENT(i915_gem_request, i915_gem_request_complete,
557bcfcc8baSJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
558bcfcc8baSJohn Harrison 	    TP_ARGS(req)
559bcfcc8baSJohn Harrison );
560bcfcc8baSJohn Harrison 
561f3fd3768SBen Widawsky TRACE_EVENT(i915_gem_request_wait_begin,
56274328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
56374328ee5SJohn Harrison 	    TP_ARGS(req),
564f3fd3768SBen Widawsky 
565f3fd3768SBen Widawsky 	    TP_STRUCT__entry(
566f3fd3768SBen Widawsky 			     __field(u32, dev)
567f3fd3768SBen Widawsky 			     __field(u32, ring)
568bcfcc8baSJohn Harrison 			     __field(u32, uniq)
569f3fd3768SBen Widawsky 			     __field(u32, seqno)
570f3fd3768SBen Widawsky 			     __field(bool, blocking)
571f3fd3768SBen Widawsky 			     ),
572f3fd3768SBen Widawsky 
573f3fd3768SBen Widawsky 	    /* NB: the blocking information is racy since mutex_is_locked
574f3fd3768SBen Widawsky 	     * doesn't check that the current thread holds the lock. The only
575f3fd3768SBen Widawsky 	     * other option would be to pass the boolean information of whether
576f3fd3768SBen Widawsky 	     * or not the class was blocking down through the stack which is
577f3fd3768SBen Widawsky 	     * less desirable.
578f3fd3768SBen Widawsky 	     */
579f3fd3768SBen Widawsky 	    TP_fast_assign(
58074328ee5SJohn Harrison 			   struct intel_engine_cs *ring =
58174328ee5SJohn Harrison 						i915_gem_request_get_ring(req);
582f3fd3768SBen Widawsky 			   __entry->dev = ring->dev->primary->index;
583f3fd3768SBen Widawsky 			   __entry->ring = ring->id;
584bcfcc8baSJohn Harrison 			   __entry->uniq = req ? req->uniq : 0;
58574328ee5SJohn Harrison 			   __entry->seqno = i915_gem_request_get_seqno(req);
58674328ee5SJohn Harrison 			   __entry->blocking =
58774328ee5SJohn Harrison 				     mutex_is_locked(&ring->dev->struct_mutex);
588f3fd3768SBen Widawsky 			   ),
589f3fd3768SBen Widawsky 
590bcfcc8baSJohn Harrison 	    TP_printk("dev=%u, ring=%u, uniq=%u, seqno=%u, blocking=%s",
591bcfcc8baSJohn Harrison 		      __entry->dev, __entry->ring, __entry->uniq,
592bcfcc8baSJohn Harrison 		      __entry->seqno, __entry->blocking ?  "yes (NB)" : "no")
5931c5d22f7SChris Wilson );
5941c5d22f7SChris Wilson 
595903cf20cSLi Zefan DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_end,
59674328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
59774328ee5SJohn Harrison 	    TP_ARGS(req)
598903cf20cSLi Zefan );
599903cf20cSLi Zefan 
600903cf20cSLi Zefan DECLARE_EVENT_CLASS(i915_ring,
601a4872ba6SOscar Mateo 	    TP_PROTO(struct intel_engine_cs *ring),
602db53a302SChris Wilson 	    TP_ARGS(ring),
6031c5d22f7SChris Wilson 
6041c5d22f7SChris Wilson 	    TP_STRUCT__entry(
6054f49be54SChris Wilson 			     __field(u32, dev)
606db53a302SChris Wilson 			     __field(u32, ring)
6071c5d22f7SChris Wilson 			     ),
6081c5d22f7SChris Wilson 
6091c5d22f7SChris Wilson 	    TP_fast_assign(
610db53a302SChris Wilson 			   __entry->dev = ring->dev->primary->index;
611db53a302SChris Wilson 			   __entry->ring = ring->id;
6121c5d22f7SChris Wilson 			   ),
6131c5d22f7SChris Wilson 
614db53a302SChris Wilson 	    TP_printk("dev=%u, ring=%u", __entry->dev, __entry->ring)
6151c5d22f7SChris Wilson );
6161c5d22f7SChris Wilson 
617903cf20cSLi Zefan DEFINE_EVENT(i915_ring, i915_ring_wait_begin,
618a4872ba6SOscar Mateo 	    TP_PROTO(struct intel_engine_cs *ring),
619db53a302SChris Wilson 	    TP_ARGS(ring)
620903cf20cSLi Zefan );
6211c5d22f7SChris Wilson 
622903cf20cSLi Zefan DEFINE_EVENT(i915_ring, i915_ring_wait_end,
623a4872ba6SOscar Mateo 	    TP_PROTO(struct intel_engine_cs *ring),
624db53a302SChris Wilson 	    TP_ARGS(ring)
6251c5d22f7SChris Wilson );
6261c5d22f7SChris Wilson 
627e5510facSJesse Barnes TRACE_EVENT(i915_flip_request,
62805394f39SChris Wilson 	    TP_PROTO(int plane, struct drm_i915_gem_object *obj),
629e5510facSJesse Barnes 
630e5510facSJesse Barnes 	    TP_ARGS(plane, obj),
631e5510facSJesse Barnes 
632e5510facSJesse Barnes 	    TP_STRUCT__entry(
633e5510facSJesse Barnes 		    __field(int, plane)
63405394f39SChris Wilson 		    __field(struct drm_i915_gem_object *, obj)
635e5510facSJesse Barnes 		    ),
636e5510facSJesse Barnes 
637e5510facSJesse Barnes 	    TP_fast_assign(
638e5510facSJesse Barnes 		    __entry->plane = plane;
639e5510facSJesse Barnes 		    __entry->obj = obj;
640e5510facSJesse Barnes 		    ),
641e5510facSJesse Barnes 
642e5510facSJesse Barnes 	    TP_printk("plane=%d, obj=%p", __entry->plane, __entry->obj)
643e5510facSJesse Barnes );
644e5510facSJesse Barnes 
645e5510facSJesse Barnes TRACE_EVENT(i915_flip_complete,
64605394f39SChris Wilson 	    TP_PROTO(int plane, struct drm_i915_gem_object *obj),
647e5510facSJesse Barnes 
648e5510facSJesse Barnes 	    TP_ARGS(plane, obj),
649e5510facSJesse Barnes 
650e5510facSJesse Barnes 	    TP_STRUCT__entry(
651e5510facSJesse Barnes 		    __field(int, plane)
65205394f39SChris Wilson 		    __field(struct drm_i915_gem_object *, obj)
653e5510facSJesse Barnes 		    ),
654e5510facSJesse Barnes 
655e5510facSJesse Barnes 	    TP_fast_assign(
656e5510facSJesse Barnes 		    __entry->plane = plane;
657e5510facSJesse Barnes 		    __entry->obj = obj;
658e5510facSJesse Barnes 		    ),
659e5510facSJesse Barnes 
660e5510facSJesse Barnes 	    TP_printk("plane=%d, obj=%p", __entry->plane, __entry->obj)
661e5510facSJesse Barnes );
662e5510facSJesse Barnes 
663ed71f1b4SChris Wilson TRACE_EVENT_CONDITION(i915_reg_rw,
664ed71f1b4SChris Wilson 	TP_PROTO(bool write, u32 reg, u64 val, int len, bool trace),
665ba4f01a3SYuanhan Liu 
666ed71f1b4SChris Wilson 	TP_ARGS(write, reg, val, len, trace),
667ed71f1b4SChris Wilson 
668ed71f1b4SChris Wilson 	TP_CONDITION(trace),
669ba4f01a3SYuanhan Liu 
670ba4f01a3SYuanhan Liu 	TP_STRUCT__entry(
671db53a302SChris Wilson 		__field(u64, val)
672db53a302SChris Wilson 		__field(u32, reg)
673db53a302SChris Wilson 		__field(u16, write)
674db53a302SChris Wilson 		__field(u16, len)
675ba4f01a3SYuanhan Liu 		),
676ba4f01a3SYuanhan Liu 
677ba4f01a3SYuanhan Liu 	TP_fast_assign(
678db53a302SChris Wilson 		__entry->val = (u64)val;
679ba4f01a3SYuanhan Liu 		__entry->reg = reg;
680db53a302SChris Wilson 		__entry->write = write;
681ba4f01a3SYuanhan Liu 		__entry->len = len;
682ba4f01a3SYuanhan Liu 		),
683ba4f01a3SYuanhan Liu 
684db53a302SChris Wilson 	TP_printk("%s reg=0x%x, len=%d, val=(0x%x, 0x%x)",
685db53a302SChris Wilson 		__entry->write ? "write" : "read",
686db53a302SChris Wilson 		__entry->reg, __entry->len,
687db53a302SChris Wilson 		(u32)(__entry->val & 0xffffffff),
688db53a302SChris Wilson 		(u32)(__entry->val >> 32))
689ba4f01a3SYuanhan Liu );
690ba4f01a3SYuanhan Liu 
691be2cde9aSDaniel Vetter TRACE_EVENT(intel_gpu_freq_change,
692be2cde9aSDaniel Vetter 	    TP_PROTO(u32 freq),
693be2cde9aSDaniel Vetter 	    TP_ARGS(freq),
694be2cde9aSDaniel Vetter 
695be2cde9aSDaniel Vetter 	    TP_STRUCT__entry(
696be2cde9aSDaniel Vetter 			     __field(u32, freq)
697be2cde9aSDaniel Vetter 			     ),
698be2cde9aSDaniel Vetter 
699be2cde9aSDaniel Vetter 	    TP_fast_assign(
700be2cde9aSDaniel Vetter 			   __entry->freq = freq;
701be2cde9aSDaniel Vetter 			   ),
702be2cde9aSDaniel Vetter 
703be2cde9aSDaniel Vetter 	    TP_printk("new_freq=%u", __entry->freq)
704be2cde9aSDaniel Vetter );
705be2cde9aSDaniel Vetter 
706198c974dSDaniele Ceraolo Spurio /**
707198c974dSDaniele Ceraolo Spurio  * DOC: i915_ppgtt_create and i915_ppgtt_release tracepoints
708198c974dSDaniele Ceraolo Spurio  *
709198c974dSDaniele Ceraolo Spurio  * With full ppgtt enabled each process using drm will allocate at least one
710198c974dSDaniele Ceraolo Spurio  * translation table. With these traces it is possible to keep track of the
711198c974dSDaniele Ceraolo Spurio  * allocation and of the lifetime of the tables; this can be used during
712198c974dSDaniele Ceraolo Spurio  * testing/debug to verify that we are not leaking ppgtts.
713198c974dSDaniele Ceraolo Spurio  * These traces identify the ppgtt through the vm pointer, which is also printed
714198c974dSDaniele Ceraolo Spurio  * by the i915_vma_bind and i915_vma_unbind tracepoints.
715198c974dSDaniele Ceraolo Spurio  */
716198c974dSDaniele Ceraolo Spurio DECLARE_EVENT_CLASS(i915_ppgtt,
717198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct i915_address_space *vm),
718198c974dSDaniele Ceraolo Spurio 	TP_ARGS(vm),
719198c974dSDaniele Ceraolo Spurio 
720198c974dSDaniele Ceraolo Spurio 	TP_STRUCT__entry(
721198c974dSDaniele Ceraolo Spurio 			__field(struct i915_address_space *, vm)
722198c974dSDaniele Ceraolo Spurio 			__field(u32, dev)
723198c974dSDaniele Ceraolo Spurio 	),
724198c974dSDaniele Ceraolo Spurio 
725198c974dSDaniele Ceraolo Spurio 	TP_fast_assign(
726198c974dSDaniele Ceraolo Spurio 			__entry->vm = vm;
727198c974dSDaniele Ceraolo Spurio 			__entry->dev = vm->dev->primary->index;
728198c974dSDaniele Ceraolo Spurio 	),
729198c974dSDaniele Ceraolo Spurio 
730198c974dSDaniele Ceraolo Spurio 	TP_printk("dev=%u, vm=%p", __entry->dev, __entry->vm)
731198c974dSDaniele Ceraolo Spurio )
732198c974dSDaniele Ceraolo Spurio 
733198c974dSDaniele Ceraolo Spurio DEFINE_EVENT(i915_ppgtt, i915_ppgtt_create,
734198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct i915_address_space *vm),
735198c974dSDaniele Ceraolo Spurio 	TP_ARGS(vm)
736198c974dSDaniele Ceraolo Spurio );
737198c974dSDaniele Ceraolo Spurio 
738198c974dSDaniele Ceraolo Spurio DEFINE_EVENT(i915_ppgtt, i915_ppgtt_release,
739198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct i915_address_space *vm),
740198c974dSDaniele Ceraolo Spurio 	TP_ARGS(vm)
741198c974dSDaniele Ceraolo Spurio );
742198c974dSDaniele Ceraolo Spurio 
743198c974dSDaniele Ceraolo Spurio /**
744198c974dSDaniele Ceraolo Spurio  * DOC: i915_context_create and i915_context_free tracepoints
745198c974dSDaniele Ceraolo Spurio  *
746198c974dSDaniele Ceraolo Spurio  * These tracepoints are used to track creation and deletion of contexts.
747198c974dSDaniele Ceraolo Spurio  * If full ppgtt is enabled, they also print the address of the vm assigned to
748198c974dSDaniele Ceraolo Spurio  * the context.
749198c974dSDaniele Ceraolo Spurio  */
750198c974dSDaniele Ceraolo Spurio DECLARE_EVENT_CLASS(i915_context,
751198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct intel_context *ctx),
752198c974dSDaniele Ceraolo Spurio 	TP_ARGS(ctx),
753198c974dSDaniele Ceraolo Spurio 
754198c974dSDaniele Ceraolo Spurio 	TP_STRUCT__entry(
755198c974dSDaniele Ceraolo Spurio 			__field(u32, dev)
756198c974dSDaniele Ceraolo Spurio 			__field(struct intel_context *, ctx)
757198c974dSDaniele Ceraolo Spurio 			__field(struct i915_address_space *, vm)
758198c974dSDaniele Ceraolo Spurio 	),
759198c974dSDaniele Ceraolo Spurio 
760198c974dSDaniele Ceraolo Spurio 	TP_fast_assign(
761198c974dSDaniele Ceraolo Spurio 			__entry->ctx = ctx;
762198c974dSDaniele Ceraolo Spurio 			__entry->vm = ctx->ppgtt ? &ctx->ppgtt->base : NULL;
763198c974dSDaniele Ceraolo Spurio 			__entry->dev = ctx->file_priv->dev_priv->dev->primary->index;
764198c974dSDaniele Ceraolo Spurio 	),
765198c974dSDaniele Ceraolo Spurio 
766198c974dSDaniele Ceraolo Spurio 	TP_printk("dev=%u, ctx=%p, ctx_vm=%p",
767198c974dSDaniele Ceraolo Spurio 		  __entry->dev, __entry->ctx, __entry->vm)
768198c974dSDaniele Ceraolo Spurio )
769198c974dSDaniele Ceraolo Spurio 
770198c974dSDaniele Ceraolo Spurio DEFINE_EVENT(i915_context, i915_context_create,
771198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct intel_context *ctx),
772198c974dSDaniele Ceraolo Spurio 	TP_ARGS(ctx)
773198c974dSDaniele Ceraolo Spurio );
774198c974dSDaniele Ceraolo Spurio 
775198c974dSDaniele Ceraolo Spurio DEFINE_EVENT(i915_context, i915_context_free,
776198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct intel_context *ctx),
777198c974dSDaniele Ceraolo Spurio 	TP_ARGS(ctx)
778198c974dSDaniele Ceraolo Spurio );
779198c974dSDaniele Ceraolo Spurio 
780198c974dSDaniele Ceraolo Spurio /**
781198c974dSDaniele Ceraolo Spurio  * DOC: switch_mm tracepoint
782198c974dSDaniele Ceraolo Spurio  *
783198c974dSDaniele Ceraolo Spurio  * This tracepoint allows tracking of the mm switch, which is an important point
784198c974dSDaniele Ceraolo Spurio  * in the lifetime of the vm in the legacy submission path. This tracepoint is
785198c974dSDaniele Ceraolo Spurio  * called only if full ppgtt is enabled.
786198c974dSDaniele Ceraolo Spurio  */
787198c974dSDaniele Ceraolo Spurio TRACE_EVENT(switch_mm,
788198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct intel_engine_cs *ring, struct intel_context *to),
789198c974dSDaniele Ceraolo Spurio 
790198c974dSDaniele Ceraolo Spurio 	TP_ARGS(ring, to),
791198c974dSDaniele Ceraolo Spurio 
792198c974dSDaniele Ceraolo Spurio 	TP_STRUCT__entry(
793198c974dSDaniele Ceraolo Spurio 			__field(u32, ring)
794198c974dSDaniele Ceraolo Spurio 			__field(struct intel_context *, to)
795198c974dSDaniele Ceraolo Spurio 			__field(struct i915_address_space *, vm)
796198c974dSDaniele Ceraolo Spurio 			__field(u32, dev)
797198c974dSDaniele Ceraolo Spurio 	),
798198c974dSDaniele Ceraolo Spurio 
799198c974dSDaniele Ceraolo Spurio 	TP_fast_assign(
800198c974dSDaniele Ceraolo Spurio 			__entry->ring = ring->id;
801198c974dSDaniele Ceraolo Spurio 			__entry->to = to;
802198c974dSDaniele Ceraolo Spurio 			__entry->vm = to->ppgtt? &to->ppgtt->base : NULL;
803198c974dSDaniele Ceraolo Spurio 			__entry->dev = ring->dev->primary->index;
804198c974dSDaniele Ceraolo Spurio 	),
805198c974dSDaniele Ceraolo Spurio 
806198c974dSDaniele Ceraolo Spurio 	TP_printk("dev=%u, ring=%u, ctx=%p, ctx_vm=%p",
807198c974dSDaniele Ceraolo Spurio 		  __entry->dev, __entry->ring, __entry->to, __entry->vm)
808198c974dSDaniele Ceraolo Spurio );
809198c974dSDaniele Ceraolo Spurio 
8101c5d22f7SChris Wilson #endif /* _I915_TRACE_H_ */
8111c5d22f7SChris Wilson 
8121c5d22f7SChris Wilson /* This part must be outside protection */
8131c5d22f7SChris Wilson #undef TRACE_INCLUDE_PATH
814a7c54278SPeter Clifton #define TRACE_INCLUDE_PATH .
8151c5d22f7SChris Wilson #include <trace/define_trace.h>
816