xref: /openbmc/linux/drivers/gpu/drm/i915/i915_trace.h (revision f54d1867)
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_INCLUDE_FILE i915_trace
161c5d22f7SChris Wilson 
1725ef284aSVille Syrjälä /* pipe updates */
1825ef284aSVille Syrjälä 
1925ef284aSVille Syrjälä TRACE_EVENT(i915_pipe_update_start,
20d637ce3fSJesse Barnes 	    TP_PROTO(struct intel_crtc *crtc),
21d637ce3fSJesse Barnes 	    TP_ARGS(crtc),
2225ef284aSVille Syrjälä 
2325ef284aSVille Syrjälä 	    TP_STRUCT__entry(
2425ef284aSVille Syrjälä 			     __field(enum pipe, pipe)
2525ef284aSVille Syrjälä 			     __field(u32, frame)
2625ef284aSVille Syrjälä 			     __field(u32, scanline)
2725ef284aSVille Syrjälä 			     __field(u32, min)
2825ef284aSVille Syrjälä 			     __field(u32, max)
2925ef284aSVille Syrjälä 			     ),
3025ef284aSVille Syrjälä 
3125ef284aSVille Syrjälä 	    TP_fast_assign(
3225ef284aSVille Syrjälä 			   __entry->pipe = crtc->pipe;
3325ef284aSVille Syrjälä 			   __entry->frame = crtc->base.dev->driver->get_vblank_counter(crtc->base.dev,
3425ef284aSVille Syrjälä 										       crtc->pipe);
3525ef284aSVille Syrjälä 			   __entry->scanline = intel_get_crtc_scanline(crtc);
36d637ce3fSJesse Barnes 			   __entry->min = crtc->debug.min_vbl;
37d637ce3fSJesse Barnes 			   __entry->max = crtc->debug.max_vbl;
3825ef284aSVille Syrjälä 			   ),
3925ef284aSVille Syrjälä 
4025ef284aSVille Syrjälä 	    TP_printk("pipe %c, frame=%u, scanline=%u, min=%u, max=%u",
4125ef284aSVille Syrjälä 		      pipe_name(__entry->pipe), __entry->frame,
4225ef284aSVille Syrjälä 		       __entry->scanline, __entry->min, __entry->max)
4325ef284aSVille Syrjälä );
4425ef284aSVille Syrjälä 
4525ef284aSVille Syrjälä TRACE_EVENT(i915_pipe_update_vblank_evaded,
46d637ce3fSJesse Barnes 	    TP_PROTO(struct intel_crtc *crtc),
47d637ce3fSJesse Barnes 	    TP_ARGS(crtc),
4825ef284aSVille Syrjälä 
4925ef284aSVille Syrjälä 	    TP_STRUCT__entry(
5025ef284aSVille Syrjälä 			     __field(enum pipe, pipe)
5125ef284aSVille Syrjälä 			     __field(u32, frame)
5225ef284aSVille Syrjälä 			     __field(u32, scanline)
5325ef284aSVille Syrjälä 			     __field(u32, min)
5425ef284aSVille Syrjälä 			     __field(u32, max)
5525ef284aSVille Syrjälä 			     ),
5625ef284aSVille Syrjälä 
5725ef284aSVille Syrjälä 	    TP_fast_assign(
5825ef284aSVille Syrjälä 			   __entry->pipe = crtc->pipe;
59d637ce3fSJesse Barnes 			   __entry->frame = crtc->debug.start_vbl_count;
60d637ce3fSJesse Barnes 			   __entry->scanline = crtc->debug.scanline_start;
61d637ce3fSJesse Barnes 			   __entry->min = crtc->debug.min_vbl;
62d637ce3fSJesse Barnes 			   __entry->max = crtc->debug.max_vbl;
6325ef284aSVille Syrjälä 			   ),
6425ef284aSVille Syrjälä 
6525ef284aSVille Syrjälä 	    TP_printk("pipe %c, frame=%u, scanline=%u, min=%u, max=%u",
6625ef284aSVille Syrjälä 		      pipe_name(__entry->pipe), __entry->frame,
6725ef284aSVille Syrjälä 		       __entry->scanline, __entry->min, __entry->max)
6825ef284aSVille Syrjälä );
6925ef284aSVille Syrjälä 
7025ef284aSVille Syrjälä TRACE_EVENT(i915_pipe_update_end,
71d637ce3fSJesse Barnes 	    TP_PROTO(struct intel_crtc *crtc, u32 frame, int scanline_end),
72d637ce3fSJesse Barnes 	    TP_ARGS(crtc, frame, scanline_end),
7325ef284aSVille Syrjälä 
7425ef284aSVille Syrjälä 	    TP_STRUCT__entry(
7525ef284aSVille Syrjälä 			     __field(enum pipe, pipe)
7625ef284aSVille Syrjälä 			     __field(u32, frame)
7725ef284aSVille Syrjälä 			     __field(u32, scanline)
7825ef284aSVille Syrjälä 			     ),
7925ef284aSVille Syrjälä 
8025ef284aSVille Syrjälä 	    TP_fast_assign(
8125ef284aSVille Syrjälä 			   __entry->pipe = crtc->pipe;
8225ef284aSVille Syrjälä 			   __entry->frame = frame;
83d637ce3fSJesse Barnes 			   __entry->scanline = scanline_end;
8425ef284aSVille Syrjälä 			   ),
8525ef284aSVille Syrjälä 
8625ef284aSVille Syrjälä 	    TP_printk("pipe %c, frame=%u, scanline=%u",
8725ef284aSVille Syrjälä 		      pipe_name(__entry->pipe), __entry->frame,
8825ef284aSVille Syrjälä 		      __entry->scanline)
8925ef284aSVille Syrjälä );
9025ef284aSVille Syrjälä 
911c5d22f7SChris Wilson /* object tracking */
921c5d22f7SChris Wilson 
931c5d22f7SChris Wilson TRACE_EVENT(i915_gem_object_create,
9405394f39SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj),
951c5d22f7SChris Wilson 	    TP_ARGS(obj),
961c5d22f7SChris Wilson 
971c5d22f7SChris Wilson 	    TP_STRUCT__entry(
9805394f39SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
991c5d22f7SChris Wilson 			     __field(u32, size)
1001c5d22f7SChris Wilson 			     ),
1011c5d22f7SChris Wilson 
1021c5d22f7SChris Wilson 	    TP_fast_assign(
1031c5d22f7SChris Wilson 			   __entry->obj = obj;
10405394f39SChris Wilson 			   __entry->size = obj->base.size;
1051c5d22f7SChris Wilson 			   ),
1061c5d22f7SChris Wilson 
1071c5d22f7SChris Wilson 	    TP_printk("obj=%p, size=%u", __entry->obj, __entry->size)
1081c5d22f7SChris Wilson );
1091c5d22f7SChris Wilson 
1103abafa53SChris Wilson TRACE_EVENT(i915_gem_shrink,
1113abafa53SChris Wilson 	    TP_PROTO(struct drm_i915_private *i915, unsigned long target, unsigned flags),
1123abafa53SChris Wilson 	    TP_ARGS(i915, target, flags),
1133abafa53SChris Wilson 
1143abafa53SChris Wilson 	    TP_STRUCT__entry(
1153abafa53SChris Wilson 			     __field(int, dev)
1163abafa53SChris Wilson 			     __field(unsigned long, target)
1173abafa53SChris Wilson 			     __field(unsigned, flags)
1183abafa53SChris Wilson 			     ),
1193abafa53SChris Wilson 
1203abafa53SChris Wilson 	    TP_fast_assign(
12191c8a326SChris Wilson 			   __entry->dev = i915->drm.primary->index;
1223abafa53SChris Wilson 			   __entry->target = target;
1233abafa53SChris Wilson 			   __entry->flags = flags;
1243abafa53SChris Wilson 			   ),
1253abafa53SChris Wilson 
1263abafa53SChris Wilson 	    TP_printk("dev=%d, target=%lu, flags=%x",
1273abafa53SChris Wilson 		      __entry->dev, __entry->target, __entry->flags)
1283abafa53SChris Wilson );
1293abafa53SChris Wilson 
13007fe0b12SBen Widawsky TRACE_EVENT(i915_vma_bind,
1311ec9e26dSDaniel Vetter 	    TP_PROTO(struct i915_vma *vma, unsigned flags),
1321ec9e26dSDaniel Vetter 	    TP_ARGS(vma, flags),
1331c5d22f7SChris Wilson 
1341c5d22f7SChris Wilson 	    TP_STRUCT__entry(
13505394f39SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
13607fe0b12SBen Widawsky 			     __field(struct i915_address_space *, vm)
13733938714SBen Widawsky 			     __field(u64, offset)
138db53a302SChris Wilson 			     __field(u32, size)
1391ec9e26dSDaniel Vetter 			     __field(unsigned, flags)
1401c5d22f7SChris Wilson 			     ),
1411c5d22f7SChris Wilson 
1421c5d22f7SChris Wilson 	    TP_fast_assign(
14307fe0b12SBen Widawsky 			   __entry->obj = vma->obj;
14407fe0b12SBen Widawsky 			   __entry->vm = vma->vm;
14507fe0b12SBen Widawsky 			   __entry->offset = vma->node.start;
14607fe0b12SBen Widawsky 			   __entry->size = vma->node.size;
1471ec9e26dSDaniel Vetter 			   __entry->flags = flags;
1481c5d22f7SChris Wilson 			   ),
1491c5d22f7SChris Wilson 
15033938714SBen Widawsky 	    TP_printk("obj=%p, offset=%016llx size=%x%s vm=%p",
151db53a302SChris Wilson 		      __entry->obj, __entry->offset, __entry->size,
1521ec9e26dSDaniel Vetter 		      __entry->flags & PIN_MAPPABLE ? ", mappable" : "",
15307fe0b12SBen Widawsky 		      __entry->vm)
1541c5d22f7SChris Wilson );
1551c5d22f7SChris Wilson 
15607fe0b12SBen Widawsky TRACE_EVENT(i915_vma_unbind,
15707fe0b12SBen Widawsky 	    TP_PROTO(struct i915_vma *vma),
15807fe0b12SBen Widawsky 	    TP_ARGS(vma),
159db53a302SChris Wilson 
160db53a302SChris Wilson 	    TP_STRUCT__entry(
161db53a302SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
16207fe0b12SBen Widawsky 			     __field(struct i915_address_space *, vm)
16333938714SBen Widawsky 			     __field(u64, offset)
164db53a302SChris Wilson 			     __field(u32, size)
165db53a302SChris Wilson 			     ),
166db53a302SChris Wilson 
167db53a302SChris Wilson 	    TP_fast_assign(
16807fe0b12SBen Widawsky 			   __entry->obj = vma->obj;
16907fe0b12SBen Widawsky 			   __entry->vm = vma->vm;
17007fe0b12SBen Widawsky 			   __entry->offset = vma->node.start;
17107fe0b12SBen Widawsky 			   __entry->size = vma->node.size;
172db53a302SChris Wilson 			   ),
173db53a302SChris Wilson 
17433938714SBen Widawsky 	    TP_printk("obj=%p, offset=%016llx size=%x vm=%p",
17507fe0b12SBen Widawsky 		      __entry->obj, __entry->offset, __entry->size, __entry->vm)
176db53a302SChris Wilson );
177db53a302SChris Wilson 
178596c5923SChris Wilson TRACE_EVENT(i915_va_alloc,
179596c5923SChris Wilson 	TP_PROTO(struct i915_vma *vma),
180596c5923SChris Wilson 	TP_ARGS(vma),
18172744cb1SMichel Thierry 
18272744cb1SMichel Thierry 	TP_STRUCT__entry(
18372744cb1SMichel Thierry 		__field(struct i915_address_space *, vm)
18472744cb1SMichel Thierry 		__field(u64, start)
18572744cb1SMichel Thierry 		__field(u64, end)
18672744cb1SMichel Thierry 	),
18772744cb1SMichel Thierry 
18872744cb1SMichel Thierry 	TP_fast_assign(
189596c5923SChris Wilson 		__entry->vm = vma->vm;
190596c5923SChris Wilson 		__entry->start = vma->node.start;
191596c5923SChris Wilson 		__entry->end = vma->node.start + vma->node.size - 1;
19272744cb1SMichel Thierry 	),
19372744cb1SMichel Thierry 
194596c5923SChris Wilson 	TP_printk("vm=%p (%c), 0x%llx-0x%llx",
195596c5923SChris Wilson 		  __entry->vm, i915_is_ggtt(__entry->vm) ? 'G' : 'P',  __entry->start, __entry->end)
19672744cb1SMichel Thierry );
19772744cb1SMichel Thierry 
1984c06ec8dSMichel Thierry DECLARE_EVENT_CLASS(i915_px_entry,
1994c06ec8dSMichel Thierry 	TP_PROTO(struct i915_address_space *vm, u32 px, u64 start, u64 px_shift),
2004c06ec8dSMichel Thierry 	TP_ARGS(vm, px, start, px_shift),
20172744cb1SMichel Thierry 
20272744cb1SMichel Thierry 	TP_STRUCT__entry(
20372744cb1SMichel Thierry 		__field(struct i915_address_space *, vm)
2044c06ec8dSMichel Thierry 		__field(u32, px)
20572744cb1SMichel Thierry 		__field(u64, start)
20672744cb1SMichel Thierry 		__field(u64, end)
20772744cb1SMichel Thierry 	),
20872744cb1SMichel Thierry 
20972744cb1SMichel Thierry 	TP_fast_assign(
21072744cb1SMichel Thierry 		__entry->vm = vm;
2114c06ec8dSMichel Thierry 		__entry->px = px;
21272744cb1SMichel Thierry 		__entry->start = start;
2134c06ec8dSMichel Thierry 		__entry->end = ((start + (1ULL << px_shift)) & ~((1ULL << px_shift)-1)) - 1;
21472744cb1SMichel Thierry 	),
21572744cb1SMichel Thierry 
21672744cb1SMichel Thierry 	TP_printk("vm=%p, pde=%d (0x%llx-0x%llx)",
2174c06ec8dSMichel Thierry 		  __entry->vm, __entry->px, __entry->start, __entry->end)
21872744cb1SMichel Thierry );
21972744cb1SMichel Thierry 
2204c06ec8dSMichel Thierry DEFINE_EVENT(i915_px_entry, i915_page_table_entry_alloc,
22172744cb1SMichel Thierry 	     TP_PROTO(struct i915_address_space *vm, u32 pde, u64 start, u64 pde_shift),
22272744cb1SMichel Thierry 	     TP_ARGS(vm, pde, start, pde_shift)
22372744cb1SMichel Thierry );
22472744cb1SMichel Thierry 
2254c06ec8dSMichel Thierry DEFINE_EVENT_PRINT(i915_px_entry, i915_page_directory_entry_alloc,
2264c06ec8dSMichel Thierry 		   TP_PROTO(struct i915_address_space *vm, u32 pdpe, u64 start, u64 pdpe_shift),
2274c06ec8dSMichel Thierry 		   TP_ARGS(vm, pdpe, start, pdpe_shift),
2284c06ec8dSMichel Thierry 
2294c06ec8dSMichel Thierry 		   TP_printk("vm=%p, pdpe=%d (0x%llx-0x%llx)",
2304c06ec8dSMichel Thierry 			     __entry->vm, __entry->px, __entry->start, __entry->end)
2314c06ec8dSMichel Thierry );
2324c06ec8dSMichel Thierry 
233762d9936SMichel Thierry DEFINE_EVENT_PRINT(i915_px_entry, i915_page_directory_pointer_entry_alloc,
234762d9936SMichel Thierry 		   TP_PROTO(struct i915_address_space *vm, u32 pml4e, u64 start, u64 pml4e_shift),
235762d9936SMichel Thierry 		   TP_ARGS(vm, pml4e, start, pml4e_shift),
236762d9936SMichel Thierry 
237762d9936SMichel Thierry 		   TP_printk("vm=%p, pml4e=%d (0x%llx-0x%llx)",
238762d9936SMichel Thierry 			     __entry->vm, __entry->px, __entry->start, __entry->end)
239762d9936SMichel Thierry );
240762d9936SMichel Thierry 
24172744cb1SMichel Thierry /* Avoid extra math because we only support two sizes. The format is defined by
24272744cb1SMichel Thierry  * bitmap_scnprintf. Each 32 bits is 8 HEX digits followed by comma */
24372744cb1SMichel Thierry #define TRACE_PT_SIZE(bits) \
24472744cb1SMichel Thierry 	((((bits) == 1024) ? 288 : 144) + 1)
24572744cb1SMichel Thierry 
24672744cb1SMichel Thierry DECLARE_EVENT_CLASS(i915_page_table_entry_update,
24772744cb1SMichel Thierry 	TP_PROTO(struct i915_address_space *vm, u32 pde,
248ec565b3cSMichel Thierry 		 struct i915_page_table *pt, u32 first, u32 count, u32 bits),
24972744cb1SMichel Thierry 	TP_ARGS(vm, pde, pt, first, count, bits),
25072744cb1SMichel Thierry 
25172744cb1SMichel Thierry 	TP_STRUCT__entry(
25272744cb1SMichel Thierry 		__field(struct i915_address_space *, vm)
25372744cb1SMichel Thierry 		__field(u32, pde)
25472744cb1SMichel Thierry 		__field(u32, first)
25572744cb1SMichel Thierry 		__field(u32, last)
25672744cb1SMichel Thierry 		__dynamic_array(char, cur_ptes, TRACE_PT_SIZE(bits))
25772744cb1SMichel Thierry 	),
25872744cb1SMichel Thierry 
25972744cb1SMichel Thierry 	TP_fast_assign(
26072744cb1SMichel Thierry 		__entry->vm = vm;
26172744cb1SMichel Thierry 		__entry->pde = pde;
26272744cb1SMichel Thierry 		__entry->first = first;
26372744cb1SMichel Thierry 		__entry->last = first + count - 1;
26472744cb1SMichel Thierry 		scnprintf(__get_str(cur_ptes),
26572744cb1SMichel Thierry 			  TRACE_PT_SIZE(bits),
26672744cb1SMichel Thierry 			  "%*pb",
26772744cb1SMichel Thierry 			  bits,
26872744cb1SMichel Thierry 			  pt->used_ptes);
26972744cb1SMichel Thierry 	),
27072744cb1SMichel Thierry 
27172744cb1SMichel Thierry 	TP_printk("vm=%p, pde=%d, updating %u:%u\t%s",
27272744cb1SMichel Thierry 		  __entry->vm, __entry->pde, __entry->last, __entry->first,
27372744cb1SMichel Thierry 		  __get_str(cur_ptes))
27472744cb1SMichel Thierry );
27572744cb1SMichel Thierry 
27672744cb1SMichel Thierry DEFINE_EVENT(i915_page_table_entry_update, i915_page_table_entry_map,
27772744cb1SMichel Thierry 	TP_PROTO(struct i915_address_space *vm, u32 pde,
278ec565b3cSMichel Thierry 		 struct i915_page_table *pt, u32 first, u32 count, u32 bits),
27972744cb1SMichel Thierry 	TP_ARGS(vm, pde, pt, first, count, bits)
28072744cb1SMichel Thierry );
28172744cb1SMichel Thierry 
2821c5d22f7SChris Wilson TRACE_EVENT(i915_gem_object_change_domain,
283db53a302SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj, u32 old_read, u32 old_write),
284db53a302SChris Wilson 	    TP_ARGS(obj, old_read, old_write),
2851c5d22f7SChris Wilson 
2861c5d22f7SChris Wilson 	    TP_STRUCT__entry(
28705394f39SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
2881c5d22f7SChris Wilson 			     __field(u32, read_domains)
2891c5d22f7SChris Wilson 			     __field(u32, write_domain)
2901c5d22f7SChris Wilson 			     ),
2911c5d22f7SChris Wilson 
2921c5d22f7SChris Wilson 	    TP_fast_assign(
2931c5d22f7SChris Wilson 			   __entry->obj = obj;
294db53a302SChris Wilson 			   __entry->read_domains = obj->base.read_domains | (old_read << 16);
295db53a302SChris Wilson 			   __entry->write_domain = obj->base.write_domain | (old_write << 16);
2961c5d22f7SChris Wilson 			   ),
2971c5d22f7SChris Wilson 
298db53a302SChris Wilson 	    TP_printk("obj=%p, read=%02x=>%02x, write=%02x=>%02x",
2991c5d22f7SChris Wilson 		      __entry->obj,
300db53a302SChris Wilson 		      __entry->read_domains >> 16,
301db53a302SChris Wilson 		      __entry->read_domains & 0xffff,
302db53a302SChris Wilson 		      __entry->write_domain >> 16,
303db53a302SChris Wilson 		      __entry->write_domain & 0xffff)
304db53a302SChris Wilson );
305db53a302SChris Wilson 
306db53a302SChris Wilson TRACE_EVENT(i915_gem_object_pwrite,
307db53a302SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj, u32 offset, u32 len),
308db53a302SChris Wilson 	    TP_ARGS(obj, offset, len),
309db53a302SChris Wilson 
310db53a302SChris Wilson 	    TP_STRUCT__entry(
311db53a302SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
312db53a302SChris Wilson 			     __field(u32, offset)
313db53a302SChris Wilson 			     __field(u32, len)
314db53a302SChris Wilson 			     ),
315db53a302SChris Wilson 
316db53a302SChris Wilson 	    TP_fast_assign(
317db53a302SChris Wilson 			   __entry->obj = obj;
318db53a302SChris Wilson 			   __entry->offset = offset;
319db53a302SChris Wilson 			   __entry->len = len;
320db53a302SChris Wilson 			   ),
321db53a302SChris Wilson 
322db53a302SChris Wilson 	    TP_printk("obj=%p, offset=%u, len=%u",
323db53a302SChris Wilson 		      __entry->obj, __entry->offset, __entry->len)
324db53a302SChris Wilson );
325db53a302SChris Wilson 
326db53a302SChris Wilson TRACE_EVENT(i915_gem_object_pread,
327db53a302SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj, u32 offset, u32 len),
328db53a302SChris Wilson 	    TP_ARGS(obj, offset, len),
329db53a302SChris Wilson 
330db53a302SChris Wilson 	    TP_STRUCT__entry(
331db53a302SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
332db53a302SChris Wilson 			     __field(u32, offset)
333db53a302SChris Wilson 			     __field(u32, len)
334db53a302SChris Wilson 			     ),
335db53a302SChris Wilson 
336db53a302SChris Wilson 	    TP_fast_assign(
337db53a302SChris Wilson 			   __entry->obj = obj;
338db53a302SChris Wilson 			   __entry->offset = offset;
339db53a302SChris Wilson 			   __entry->len = len;
340db53a302SChris Wilson 			   ),
341db53a302SChris Wilson 
342db53a302SChris Wilson 	    TP_printk("obj=%p, offset=%u, len=%u",
343db53a302SChris Wilson 		      __entry->obj, __entry->offset, __entry->len)
344db53a302SChris Wilson );
345db53a302SChris Wilson 
346db53a302SChris Wilson TRACE_EVENT(i915_gem_object_fault,
347db53a302SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj, u32 index, bool gtt, bool write),
348db53a302SChris Wilson 	    TP_ARGS(obj, index, gtt, write),
349db53a302SChris Wilson 
350db53a302SChris Wilson 	    TP_STRUCT__entry(
351db53a302SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
352db53a302SChris Wilson 			     __field(u32, index)
353db53a302SChris Wilson 			     __field(bool, gtt)
354db53a302SChris Wilson 			     __field(bool, write)
355db53a302SChris Wilson 			     ),
356db53a302SChris Wilson 
357db53a302SChris Wilson 	    TP_fast_assign(
358db53a302SChris Wilson 			   __entry->obj = obj;
359db53a302SChris Wilson 			   __entry->index = index;
360db53a302SChris Wilson 			   __entry->gtt = gtt;
361db53a302SChris Wilson 			   __entry->write = write;
362db53a302SChris Wilson 			   ),
363db53a302SChris Wilson 
364db53a302SChris Wilson 	    TP_printk("obj=%p, %s index=%u %s",
365db53a302SChris Wilson 		      __entry->obj,
366db53a302SChris Wilson 		      __entry->gtt ? "GTT" : "CPU",
367db53a302SChris Wilson 		      __entry->index,
368db53a302SChris Wilson 		      __entry->write ? ", writable" : "")
3691c5d22f7SChris Wilson );
3701c5d22f7SChris Wilson 
371903cf20cSLi Zefan DECLARE_EVENT_CLASS(i915_gem_object,
37205394f39SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj),
3731c5d22f7SChris Wilson 	    TP_ARGS(obj),
3741c5d22f7SChris Wilson 
3751c5d22f7SChris Wilson 	    TP_STRUCT__entry(
37605394f39SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
3771c5d22f7SChris Wilson 			     ),
3781c5d22f7SChris Wilson 
3791c5d22f7SChris Wilson 	    TP_fast_assign(
3801c5d22f7SChris Wilson 			   __entry->obj = obj;
3811c5d22f7SChris Wilson 			   ),
3821c5d22f7SChris Wilson 
3831c5d22f7SChris Wilson 	    TP_printk("obj=%p", __entry->obj)
3841c5d22f7SChris Wilson );
3851c5d22f7SChris Wilson 
386f41275e8SLi Zefan DEFINE_EVENT(i915_gem_object, i915_gem_object_clflush,
38705394f39SChris Wilson 	     TP_PROTO(struct drm_i915_gem_object *obj),
388903cf20cSLi Zefan 	     TP_ARGS(obj)
389903cf20cSLi Zefan );
3901c5d22f7SChris Wilson 
391903cf20cSLi Zefan DEFINE_EVENT(i915_gem_object, i915_gem_object_destroy,
39205394f39SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj),
393903cf20cSLi Zefan 	    TP_ARGS(obj)
3941c5d22f7SChris Wilson );
3951c5d22f7SChris Wilson 
396db53a302SChris Wilson TRACE_EVENT(i915_gem_evict,
397e522ac23SChris Wilson 	    TP_PROTO(struct i915_address_space *vm, u32 size, u32 align, unsigned int flags),
398e522ac23SChris Wilson 	    TP_ARGS(vm, size, align, flags),
3991c5d22f7SChris Wilson 
4001c5d22f7SChris Wilson 	    TP_STRUCT__entry(
4014f49be54SChris Wilson 			     __field(u32, dev)
402e522ac23SChris Wilson 			     __field(struct i915_address_space *, vm)
403db53a302SChris Wilson 			     __field(u32, size)
404db53a302SChris Wilson 			     __field(u32, align)
405e522ac23SChris Wilson 			     __field(unsigned int, flags)
4061c5d22f7SChris Wilson 			    ),
4071c5d22f7SChris Wilson 
4081c5d22f7SChris Wilson 	    TP_fast_assign(
409e522ac23SChris Wilson 			   __entry->dev = vm->dev->primary->index;
410e522ac23SChris Wilson 			   __entry->vm = vm;
411db53a302SChris Wilson 			   __entry->size = size;
412db53a302SChris Wilson 			   __entry->align = align;
4131ec9e26dSDaniel Vetter 			   __entry->flags = flags;
4141c5d22f7SChris Wilson 			  ),
4151c5d22f7SChris Wilson 
416e522ac23SChris Wilson 	    TP_printk("dev=%d, vm=%p, size=%d, align=%d %s",
417e522ac23SChris Wilson 		      __entry->dev, __entry->vm, __entry->size, __entry->align,
4181ec9e26dSDaniel Vetter 		      __entry->flags & PIN_MAPPABLE ? ", mappable" : "")
4191c5d22f7SChris Wilson );
4201c5d22f7SChris Wilson 
421db53a302SChris Wilson TRACE_EVENT(i915_gem_evict_everything,
4226c085a72SChris Wilson 	    TP_PROTO(struct drm_device *dev),
4236c085a72SChris Wilson 	    TP_ARGS(dev),
4241c5d22f7SChris Wilson 
4251c5d22f7SChris Wilson 	    TP_STRUCT__entry(
4264f49be54SChris Wilson 			     __field(u32, dev)
4271c5d22f7SChris Wilson 			    ),
4281c5d22f7SChris Wilson 
4291c5d22f7SChris Wilson 	    TP_fast_assign(
4304f49be54SChris Wilson 			   __entry->dev = dev->primary->index;
4311c5d22f7SChris Wilson 			  ),
4321c5d22f7SChris Wilson 
4336c085a72SChris Wilson 	    TP_printk("dev=%d", __entry->dev)
434db53a302SChris Wilson );
435db53a302SChris Wilson 
436bcccff84SBen Widawsky TRACE_EVENT(i915_gem_evict_vm,
437bcccff84SBen Widawsky 	    TP_PROTO(struct i915_address_space *vm),
438bcccff84SBen Widawsky 	    TP_ARGS(vm),
439bcccff84SBen Widawsky 
440bcccff84SBen Widawsky 	    TP_STRUCT__entry(
4419297ebf2SSteven Rostedt 			     __field(u32, dev)
442bcccff84SBen Widawsky 			     __field(struct i915_address_space *, vm)
443bcccff84SBen Widawsky 			    ),
444bcccff84SBen Widawsky 
445bcccff84SBen Widawsky 	    TP_fast_assign(
4469297ebf2SSteven Rostedt 			   __entry->dev = vm->dev->primary->index;
447bcccff84SBen Widawsky 			   __entry->vm = vm;
448bcccff84SBen Widawsky 			  ),
449bcccff84SBen Widawsky 
4509297ebf2SSteven Rostedt 	    TP_printk("dev=%d, vm=%p", __entry->dev, __entry->vm)
451bcccff84SBen Widawsky );
452bcccff84SBen Widawsky 
453b52b89daSChris Wilson TRACE_EVENT(i915_gem_ring_sync_to,
4548e637178SChris Wilson 	    TP_PROTO(struct drm_i915_gem_request *to,
4558e637178SChris Wilson 		     struct drm_i915_gem_request *from),
4568e637178SChris Wilson 	    TP_ARGS(to, from),
457b52b89daSChris Wilson 
458b52b89daSChris Wilson 	    TP_STRUCT__entry(
459b52b89daSChris Wilson 			     __field(u32, dev)
460b52b89daSChris Wilson 			     __field(u32, sync_from)
461b52b89daSChris Wilson 			     __field(u32, sync_to)
462b52b89daSChris Wilson 			     __field(u32, seqno)
463b52b89daSChris Wilson 			     ),
464b52b89daSChris Wilson 
465b52b89daSChris Wilson 	    TP_fast_assign(
46691c8a326SChris Wilson 			   __entry->dev = from->i915->drm.primary->index;
4678e637178SChris Wilson 			   __entry->sync_from = from->engine->id;
4688e637178SChris Wilson 			   __entry->sync_to = to->engine->id;
4698e637178SChris Wilson 			   __entry->seqno = from->fence.seqno;
470b52b89daSChris Wilson 			   ),
471b52b89daSChris Wilson 
472b52b89daSChris Wilson 	    TP_printk("dev=%u, sync-from=%u, sync-to=%u, seqno=%u",
473b52b89daSChris Wilson 		      __entry->dev,
474b52b89daSChris Wilson 		      __entry->sync_from, __entry->sync_to,
475b52b89daSChris Wilson 		      __entry->seqno)
476b52b89daSChris Wilson );
477b52b89daSChris Wilson 
478db53a302SChris Wilson TRACE_EVENT(i915_gem_ring_dispatch,
47974328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req, u32 flags),
48074328ee5SJohn Harrison 	    TP_ARGS(req, flags),
481db53a302SChris Wilson 
482db53a302SChris Wilson 	    TP_STRUCT__entry(
483db53a302SChris Wilson 			     __field(u32, dev)
484db53a302SChris Wilson 			     __field(u32, ring)
485db53a302SChris Wilson 			     __field(u32, seqno)
486d7d4eeddSChris Wilson 			     __field(u32, flags)
487db53a302SChris Wilson 			     ),
488db53a302SChris Wilson 
489db53a302SChris Wilson 	    TP_fast_assign(
49091c8a326SChris Wilson 			   __entry->dev = req->i915->drm.primary->index;
491c033666aSChris Wilson 			   __entry->ring = req->engine->id;
49204769652SChris Wilson 			   __entry->seqno = req->fence.seqno;
493d7d4eeddSChris Wilson 			   __entry->flags = flags;
494f54d1867SChris Wilson 			   dma_fence_enable_sw_signaling(&req->fence);
495db53a302SChris Wilson 			   ),
496db53a302SChris Wilson 
497d7d4eeddSChris Wilson 	    TP_printk("dev=%u, ring=%u, seqno=%u, flags=%x",
498d7d4eeddSChris Wilson 		      __entry->dev, __entry->ring, __entry->seqno, __entry->flags)
499db53a302SChris Wilson );
500db53a302SChris Wilson 
501db53a302SChris Wilson TRACE_EVENT(i915_gem_ring_flush,
502a84c3ae1SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req, u32 invalidate, u32 flush),
503a84c3ae1SJohn Harrison 	    TP_ARGS(req, invalidate, flush),
504db53a302SChris Wilson 
505db53a302SChris Wilson 	    TP_STRUCT__entry(
506db53a302SChris Wilson 			     __field(u32, dev)
507db53a302SChris Wilson 			     __field(u32, ring)
508db53a302SChris Wilson 			     __field(u32, invalidate)
509db53a302SChris Wilson 			     __field(u32, flush)
510db53a302SChris Wilson 			     ),
511db53a302SChris Wilson 
512db53a302SChris Wilson 	    TP_fast_assign(
51391c8a326SChris Wilson 			   __entry->dev = req->i915->drm.primary->index;
5144a570db5STvrtko Ursulin 			   __entry->ring = req->engine->id;
515db53a302SChris Wilson 			   __entry->invalidate = invalidate;
516db53a302SChris Wilson 			   __entry->flush = flush;
517db53a302SChris Wilson 			   ),
518db53a302SChris Wilson 
519db53a302SChris Wilson 	    TP_printk("dev=%u, ring=%x, invalidate=%04x, flush=%04x",
520db53a302SChris Wilson 		      __entry->dev, __entry->ring,
521db53a302SChris Wilson 		      __entry->invalidate, __entry->flush)
5221c5d22f7SChris Wilson );
5231c5d22f7SChris Wilson 
524903cf20cSLi Zefan DECLARE_EVENT_CLASS(i915_gem_request,
52574328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
52674328ee5SJohn Harrison 	    TP_ARGS(req),
5271c5d22f7SChris Wilson 
5281c5d22f7SChris Wilson 	    TP_STRUCT__entry(
5294f49be54SChris Wilson 			     __field(u32, dev)
530db53a302SChris Wilson 			     __field(u32, ring)
5311c5d22f7SChris Wilson 			     __field(u32, seqno)
5321c5d22f7SChris Wilson 			     ),
5331c5d22f7SChris Wilson 
5341c5d22f7SChris Wilson 	    TP_fast_assign(
53591c8a326SChris Wilson 			   __entry->dev = req->i915->drm.primary->index;
536c033666aSChris Wilson 			   __entry->ring = req->engine->id;
53704769652SChris Wilson 			   __entry->seqno = req->fence.seqno;
5381c5d22f7SChris Wilson 			   ),
5391c5d22f7SChris Wilson 
540d7b9ca2fSChris Wilson 	    TP_printk("dev=%u, ring=%u, seqno=%u",
541d7b9ca2fSChris Wilson 		      __entry->dev, __entry->ring, __entry->seqno)
542db53a302SChris Wilson );
543db53a302SChris Wilson 
544db53a302SChris Wilson DEFINE_EVENT(i915_gem_request, i915_gem_request_add,
54574328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
54674328ee5SJohn Harrison 	    TP_ARGS(req)
5471c5d22f7SChris Wilson );
5481c5d22f7SChris Wilson 
549bcfcc8baSJohn Harrison TRACE_EVENT(i915_gem_request_notify,
5504a570db5STvrtko Ursulin 	    TP_PROTO(struct intel_engine_cs *engine),
5514a570db5STvrtko Ursulin 	    TP_ARGS(engine),
552814e9b57SChris Wilson 
553814e9b57SChris Wilson 	    TP_STRUCT__entry(
554814e9b57SChris Wilson 			     __field(u32, dev)
555814e9b57SChris Wilson 			     __field(u32, ring)
556814e9b57SChris Wilson 			     __field(u32, seqno)
557814e9b57SChris Wilson 			     ),
558814e9b57SChris Wilson 
559814e9b57SChris Wilson 	    TP_fast_assign(
56091c8a326SChris Wilson 			   __entry->dev = engine->i915->drm.primary->index;
5614a570db5STvrtko Ursulin 			   __entry->ring = engine->id;
5621b7744e7SChris Wilson 			   __entry->seqno = intel_engine_get_seqno(engine);
563814e9b57SChris Wilson 			   ),
564814e9b57SChris Wilson 
565814e9b57SChris Wilson 	    TP_printk("dev=%u, ring=%u, seqno=%u",
566814e9b57SChris Wilson 		      __entry->dev, __entry->ring, __entry->seqno)
5671c5d22f7SChris Wilson );
5681c5d22f7SChris Wilson 
569903cf20cSLi Zefan DEFINE_EVENT(i915_gem_request, i915_gem_request_retire,
57074328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
57174328ee5SJohn Harrison 	    TP_ARGS(req)
5721c5d22f7SChris Wilson );
5731c5d22f7SChris Wilson 
574bcfcc8baSJohn Harrison DEFINE_EVENT(i915_gem_request, i915_gem_request_complete,
575bcfcc8baSJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
576bcfcc8baSJohn Harrison 	    TP_ARGS(req)
577bcfcc8baSJohn Harrison );
578bcfcc8baSJohn Harrison 
579f3fd3768SBen Widawsky TRACE_EVENT(i915_gem_request_wait_begin,
58074328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
58174328ee5SJohn Harrison 	    TP_ARGS(req),
582f3fd3768SBen Widawsky 
583f3fd3768SBen Widawsky 	    TP_STRUCT__entry(
584f3fd3768SBen Widawsky 			     __field(u32, dev)
585f3fd3768SBen Widawsky 			     __field(u32, ring)
586f3fd3768SBen Widawsky 			     __field(u32, seqno)
587f3fd3768SBen Widawsky 			     __field(bool, blocking)
588f3fd3768SBen Widawsky 			     ),
589f3fd3768SBen Widawsky 
590f3fd3768SBen Widawsky 	    /* NB: the blocking information is racy since mutex_is_locked
591f3fd3768SBen Widawsky 	     * doesn't check that the current thread holds the lock. The only
592f3fd3768SBen Widawsky 	     * other option would be to pass the boolean information of whether
593f3fd3768SBen Widawsky 	     * or not the class was blocking down through the stack which is
594f3fd3768SBen Widawsky 	     * less desirable.
595f3fd3768SBen Widawsky 	     */
596f3fd3768SBen Widawsky 	    TP_fast_assign(
59791c8a326SChris Wilson 			   __entry->dev = req->i915->drm.primary->index;
598c033666aSChris Wilson 			   __entry->ring = req->engine->id;
59904769652SChris Wilson 			   __entry->seqno = req->fence.seqno;
60074328ee5SJohn Harrison 			   __entry->blocking =
60191c8a326SChris Wilson 				     mutex_is_locked(&req->i915->drm.struct_mutex);
602f3fd3768SBen Widawsky 			   ),
603f3fd3768SBen Widawsky 
604d7b9ca2fSChris Wilson 	    TP_printk("dev=%u, ring=%u, seqno=%u, blocking=%s",
605d7b9ca2fSChris Wilson 		      __entry->dev, __entry->ring,
606bcfcc8baSJohn Harrison 		      __entry->seqno, __entry->blocking ?  "yes (NB)" : "no")
6071c5d22f7SChris Wilson );
6081c5d22f7SChris Wilson 
609903cf20cSLi Zefan DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_end,
61074328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
61174328ee5SJohn Harrison 	    TP_ARGS(req)
612903cf20cSLi Zefan );
613903cf20cSLi Zefan 
614e5510facSJesse Barnes TRACE_EVENT(i915_flip_request,
61505394f39SChris Wilson 	    TP_PROTO(int plane, struct drm_i915_gem_object *obj),
616e5510facSJesse Barnes 
617e5510facSJesse Barnes 	    TP_ARGS(plane, obj),
618e5510facSJesse Barnes 
619e5510facSJesse Barnes 	    TP_STRUCT__entry(
620e5510facSJesse Barnes 		    __field(int, plane)
62105394f39SChris Wilson 		    __field(struct drm_i915_gem_object *, obj)
622e5510facSJesse Barnes 		    ),
623e5510facSJesse Barnes 
624e5510facSJesse Barnes 	    TP_fast_assign(
625e5510facSJesse Barnes 		    __entry->plane = plane;
626e5510facSJesse Barnes 		    __entry->obj = obj;
627e5510facSJesse Barnes 		    ),
628e5510facSJesse Barnes 
629e5510facSJesse Barnes 	    TP_printk("plane=%d, obj=%p", __entry->plane, __entry->obj)
630e5510facSJesse Barnes );
631e5510facSJesse Barnes 
632e5510facSJesse Barnes TRACE_EVENT(i915_flip_complete,
63305394f39SChris Wilson 	    TP_PROTO(int plane, struct drm_i915_gem_object *obj),
634e5510facSJesse Barnes 
635e5510facSJesse Barnes 	    TP_ARGS(plane, obj),
636e5510facSJesse Barnes 
637e5510facSJesse Barnes 	    TP_STRUCT__entry(
638e5510facSJesse Barnes 		    __field(int, plane)
63905394f39SChris Wilson 		    __field(struct drm_i915_gem_object *, obj)
640e5510facSJesse Barnes 		    ),
641e5510facSJesse Barnes 
642e5510facSJesse Barnes 	    TP_fast_assign(
643e5510facSJesse Barnes 		    __entry->plane = plane;
644e5510facSJesse Barnes 		    __entry->obj = obj;
645e5510facSJesse Barnes 		    ),
646e5510facSJesse Barnes 
647e5510facSJesse Barnes 	    TP_printk("plane=%d, obj=%p", __entry->plane, __entry->obj)
648e5510facSJesse Barnes );
649e5510facSJesse Barnes 
650ed71f1b4SChris Wilson TRACE_EVENT_CONDITION(i915_reg_rw,
651f0f59a00SVille Syrjälä 	TP_PROTO(bool write, i915_reg_t reg, u64 val, int len, bool trace),
652ba4f01a3SYuanhan Liu 
653ed71f1b4SChris Wilson 	TP_ARGS(write, reg, val, len, trace),
654ed71f1b4SChris Wilson 
655ed71f1b4SChris Wilson 	TP_CONDITION(trace),
656ba4f01a3SYuanhan Liu 
657ba4f01a3SYuanhan Liu 	TP_STRUCT__entry(
658db53a302SChris Wilson 		__field(u64, val)
659db53a302SChris Wilson 		__field(u32, reg)
660db53a302SChris Wilson 		__field(u16, write)
661db53a302SChris Wilson 		__field(u16, len)
662ba4f01a3SYuanhan Liu 		),
663ba4f01a3SYuanhan Liu 
664ba4f01a3SYuanhan Liu 	TP_fast_assign(
665db53a302SChris Wilson 		__entry->val = (u64)val;
666f0f59a00SVille Syrjälä 		__entry->reg = i915_mmio_reg_offset(reg);
667db53a302SChris Wilson 		__entry->write = write;
668ba4f01a3SYuanhan Liu 		__entry->len = len;
669ba4f01a3SYuanhan Liu 		),
670ba4f01a3SYuanhan Liu 
671db53a302SChris Wilson 	TP_printk("%s reg=0x%x, len=%d, val=(0x%x, 0x%x)",
672db53a302SChris Wilson 		__entry->write ? "write" : "read",
673db53a302SChris Wilson 		__entry->reg, __entry->len,
674db53a302SChris Wilson 		(u32)(__entry->val & 0xffffffff),
675db53a302SChris Wilson 		(u32)(__entry->val >> 32))
676ba4f01a3SYuanhan Liu );
677ba4f01a3SYuanhan Liu 
678be2cde9aSDaniel Vetter TRACE_EVENT(intel_gpu_freq_change,
679be2cde9aSDaniel Vetter 	    TP_PROTO(u32 freq),
680be2cde9aSDaniel Vetter 	    TP_ARGS(freq),
681be2cde9aSDaniel Vetter 
682be2cde9aSDaniel Vetter 	    TP_STRUCT__entry(
683be2cde9aSDaniel Vetter 			     __field(u32, freq)
684be2cde9aSDaniel Vetter 			     ),
685be2cde9aSDaniel Vetter 
686be2cde9aSDaniel Vetter 	    TP_fast_assign(
687be2cde9aSDaniel Vetter 			   __entry->freq = freq;
688be2cde9aSDaniel Vetter 			   ),
689be2cde9aSDaniel Vetter 
690be2cde9aSDaniel Vetter 	    TP_printk("new_freq=%u", __entry->freq)
691be2cde9aSDaniel Vetter );
692be2cde9aSDaniel Vetter 
693198c974dSDaniele Ceraolo Spurio /**
694198c974dSDaniele Ceraolo Spurio  * DOC: i915_ppgtt_create and i915_ppgtt_release tracepoints
695198c974dSDaniele Ceraolo Spurio  *
696198c974dSDaniele Ceraolo Spurio  * With full ppgtt enabled each process using drm will allocate at least one
697198c974dSDaniele Ceraolo Spurio  * translation table. With these traces it is possible to keep track of the
698198c974dSDaniele Ceraolo Spurio  * allocation and of the lifetime of the tables; this can be used during
699198c974dSDaniele Ceraolo Spurio  * testing/debug to verify that we are not leaking ppgtts.
700198c974dSDaniele Ceraolo Spurio  * These traces identify the ppgtt through the vm pointer, which is also printed
701198c974dSDaniele Ceraolo Spurio  * by the i915_vma_bind and i915_vma_unbind tracepoints.
702198c974dSDaniele Ceraolo Spurio  */
703198c974dSDaniele Ceraolo Spurio DECLARE_EVENT_CLASS(i915_ppgtt,
704198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct i915_address_space *vm),
705198c974dSDaniele Ceraolo Spurio 	TP_ARGS(vm),
706198c974dSDaniele Ceraolo Spurio 
707198c974dSDaniele Ceraolo Spurio 	TP_STRUCT__entry(
708198c974dSDaniele Ceraolo Spurio 			__field(struct i915_address_space *, vm)
709198c974dSDaniele Ceraolo Spurio 			__field(u32, dev)
710198c974dSDaniele Ceraolo Spurio 	),
711198c974dSDaniele Ceraolo Spurio 
712198c974dSDaniele Ceraolo Spurio 	TP_fast_assign(
713198c974dSDaniele Ceraolo Spurio 			__entry->vm = vm;
714198c974dSDaniele Ceraolo Spurio 			__entry->dev = vm->dev->primary->index;
715198c974dSDaniele Ceraolo Spurio 	),
716198c974dSDaniele Ceraolo Spurio 
717198c974dSDaniele Ceraolo Spurio 	TP_printk("dev=%u, vm=%p", __entry->dev, __entry->vm)
718198c974dSDaniele Ceraolo Spurio )
719198c974dSDaniele Ceraolo Spurio 
720198c974dSDaniele Ceraolo Spurio DEFINE_EVENT(i915_ppgtt, i915_ppgtt_create,
721198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct i915_address_space *vm),
722198c974dSDaniele Ceraolo Spurio 	TP_ARGS(vm)
723198c974dSDaniele Ceraolo Spurio );
724198c974dSDaniele Ceraolo Spurio 
725198c974dSDaniele Ceraolo Spurio DEFINE_EVENT(i915_ppgtt, i915_ppgtt_release,
726198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct i915_address_space *vm),
727198c974dSDaniele Ceraolo Spurio 	TP_ARGS(vm)
728198c974dSDaniele Ceraolo Spurio );
729198c974dSDaniele Ceraolo Spurio 
730198c974dSDaniele Ceraolo Spurio /**
731198c974dSDaniele Ceraolo Spurio  * DOC: i915_context_create and i915_context_free tracepoints
732198c974dSDaniele Ceraolo Spurio  *
733198c974dSDaniele Ceraolo Spurio  * These tracepoints are used to track creation and deletion of contexts.
734198c974dSDaniele Ceraolo Spurio  * If full ppgtt is enabled, they also print the address of the vm assigned to
735198c974dSDaniele Ceraolo Spurio  * the context.
736198c974dSDaniele Ceraolo Spurio  */
737198c974dSDaniele Ceraolo Spurio DECLARE_EVENT_CLASS(i915_context,
738e2efd130SChris Wilson 	TP_PROTO(struct i915_gem_context *ctx),
739198c974dSDaniele Ceraolo Spurio 	TP_ARGS(ctx),
740198c974dSDaniele Ceraolo Spurio 
741198c974dSDaniele Ceraolo Spurio 	TP_STRUCT__entry(
742198c974dSDaniele Ceraolo Spurio 			__field(u32, dev)
743e2efd130SChris Wilson 			__field(struct i915_gem_context *, ctx)
744198c974dSDaniele Ceraolo Spurio 			__field(struct i915_address_space *, vm)
745198c974dSDaniele Ceraolo Spurio 	),
746198c974dSDaniele Ceraolo Spurio 
747198c974dSDaniele Ceraolo Spurio 	TP_fast_assign(
748198c974dSDaniele Ceraolo Spurio 			__entry->ctx = ctx;
749198c974dSDaniele Ceraolo Spurio 			__entry->vm = ctx->ppgtt ? &ctx->ppgtt->base : NULL;
75091c8a326SChris Wilson 			__entry->dev = ctx->i915->drm.primary->index;
751198c974dSDaniele Ceraolo Spurio 	),
752198c974dSDaniele Ceraolo Spurio 
753198c974dSDaniele Ceraolo Spurio 	TP_printk("dev=%u, ctx=%p, ctx_vm=%p",
754198c974dSDaniele Ceraolo Spurio 		  __entry->dev, __entry->ctx, __entry->vm)
755198c974dSDaniele Ceraolo Spurio )
756198c974dSDaniele Ceraolo Spurio 
757198c974dSDaniele Ceraolo Spurio DEFINE_EVENT(i915_context, i915_context_create,
758e2efd130SChris Wilson 	TP_PROTO(struct i915_gem_context *ctx),
759198c974dSDaniele Ceraolo Spurio 	TP_ARGS(ctx)
760198c974dSDaniele Ceraolo Spurio );
761198c974dSDaniele Ceraolo Spurio 
762198c974dSDaniele Ceraolo Spurio DEFINE_EVENT(i915_context, i915_context_free,
763e2efd130SChris Wilson 	TP_PROTO(struct i915_gem_context *ctx),
764198c974dSDaniele Ceraolo Spurio 	TP_ARGS(ctx)
765198c974dSDaniele Ceraolo Spurio );
766198c974dSDaniele Ceraolo Spurio 
767198c974dSDaniele Ceraolo Spurio /**
768198c974dSDaniele Ceraolo Spurio  * DOC: switch_mm tracepoint
769198c974dSDaniele Ceraolo Spurio  *
770198c974dSDaniele Ceraolo Spurio  * This tracepoint allows tracking of the mm switch, which is an important point
771198c974dSDaniele Ceraolo Spurio  * in the lifetime of the vm in the legacy submission path. This tracepoint is
772198c974dSDaniele Ceraolo Spurio  * called only if full ppgtt is enabled.
773198c974dSDaniele Ceraolo Spurio  */
774198c974dSDaniele Ceraolo Spurio TRACE_EVENT(switch_mm,
775e2efd130SChris Wilson 	TP_PROTO(struct intel_engine_cs *engine, struct i915_gem_context *to),
776198c974dSDaniele Ceraolo Spurio 
7774a570db5STvrtko Ursulin 	TP_ARGS(engine, to),
778198c974dSDaniele Ceraolo Spurio 
779198c974dSDaniele Ceraolo Spurio 	TP_STRUCT__entry(
780198c974dSDaniele Ceraolo Spurio 			__field(u32, ring)
781e2efd130SChris Wilson 			__field(struct i915_gem_context *, to)
782198c974dSDaniele Ceraolo Spurio 			__field(struct i915_address_space *, vm)
783198c974dSDaniele Ceraolo Spurio 			__field(u32, dev)
784198c974dSDaniele Ceraolo Spurio 	),
785198c974dSDaniele Ceraolo Spurio 
786198c974dSDaniele Ceraolo Spurio 	TP_fast_assign(
7874a570db5STvrtko Ursulin 			__entry->ring = engine->id;
788198c974dSDaniele Ceraolo Spurio 			__entry->to = to;
789198c974dSDaniele Ceraolo Spurio 			__entry->vm = to->ppgtt? &to->ppgtt->base : NULL;
79091c8a326SChris Wilson 			__entry->dev = engine->i915->drm.primary->index;
791198c974dSDaniele Ceraolo Spurio 	),
792198c974dSDaniele Ceraolo Spurio 
793198c974dSDaniele Ceraolo Spurio 	TP_printk("dev=%u, ring=%u, ctx=%p, ctx_vm=%p",
794198c974dSDaniele Ceraolo Spurio 		  __entry->dev, __entry->ring, __entry->to, __entry->vm)
795198c974dSDaniele Ceraolo Spurio );
796198c974dSDaniele Ceraolo Spurio 
7971c5d22f7SChris Wilson #endif /* _I915_TRACE_H_ */
7981c5d22f7SChris Wilson 
7991c5d22f7SChris Wilson /* This part must be outside protection */
8001c5d22f7SChris Wilson #undef TRACE_INCLUDE_PATH
801a7c54278SPeter Clifton #define TRACE_INCLUDE_PATH .
8021c5d22f7SChris Wilson #include <trace/define_trace.h>
803