xref: /openbmc/linux/drivers/gpu/drm/i915/i915_trace.h (revision 581c26e8)
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)
118db53a302SChris Wilson 			     __field(u32, 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 
13107fe0b12SBen Widawsky 	    TP_printk("obj=%p, offset=%08x 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)
144db53a302SChris Wilson 			     __field(u32, 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 
15507fe0b12SBen Widawsky 	    TP_printk("obj=%p, offset=%08x size=%x vm=%p",
15607fe0b12SBen Widawsky 		      __entry->obj, __entry->offset, __entry->size, __entry->vm)
157db53a302SChris Wilson );
158db53a302SChris Wilson 
1591c5d22f7SChris Wilson TRACE_EVENT(i915_gem_object_change_domain,
160db53a302SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj, u32 old_read, u32 old_write),
161db53a302SChris Wilson 	    TP_ARGS(obj, old_read, old_write),
1621c5d22f7SChris Wilson 
1631c5d22f7SChris Wilson 	    TP_STRUCT__entry(
16405394f39SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
1651c5d22f7SChris Wilson 			     __field(u32, read_domains)
1661c5d22f7SChris Wilson 			     __field(u32, write_domain)
1671c5d22f7SChris Wilson 			     ),
1681c5d22f7SChris Wilson 
1691c5d22f7SChris Wilson 	    TP_fast_assign(
1701c5d22f7SChris Wilson 			   __entry->obj = obj;
171db53a302SChris Wilson 			   __entry->read_domains = obj->base.read_domains | (old_read << 16);
172db53a302SChris Wilson 			   __entry->write_domain = obj->base.write_domain | (old_write << 16);
1731c5d22f7SChris Wilson 			   ),
1741c5d22f7SChris Wilson 
175db53a302SChris Wilson 	    TP_printk("obj=%p, read=%02x=>%02x, write=%02x=>%02x",
1761c5d22f7SChris Wilson 		      __entry->obj,
177db53a302SChris Wilson 		      __entry->read_domains >> 16,
178db53a302SChris Wilson 		      __entry->read_domains & 0xffff,
179db53a302SChris Wilson 		      __entry->write_domain >> 16,
180db53a302SChris Wilson 		      __entry->write_domain & 0xffff)
181db53a302SChris Wilson );
182db53a302SChris Wilson 
183db53a302SChris Wilson TRACE_EVENT(i915_gem_object_pwrite,
184db53a302SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj, u32 offset, u32 len),
185db53a302SChris Wilson 	    TP_ARGS(obj, offset, len),
186db53a302SChris Wilson 
187db53a302SChris Wilson 	    TP_STRUCT__entry(
188db53a302SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
189db53a302SChris Wilson 			     __field(u32, offset)
190db53a302SChris Wilson 			     __field(u32, len)
191db53a302SChris Wilson 			     ),
192db53a302SChris Wilson 
193db53a302SChris Wilson 	    TP_fast_assign(
194db53a302SChris Wilson 			   __entry->obj = obj;
195db53a302SChris Wilson 			   __entry->offset = offset;
196db53a302SChris Wilson 			   __entry->len = len;
197db53a302SChris Wilson 			   ),
198db53a302SChris Wilson 
199db53a302SChris Wilson 	    TP_printk("obj=%p, offset=%u, len=%u",
200db53a302SChris Wilson 		      __entry->obj, __entry->offset, __entry->len)
201db53a302SChris Wilson );
202db53a302SChris Wilson 
203db53a302SChris Wilson TRACE_EVENT(i915_gem_object_pread,
204db53a302SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj, u32 offset, u32 len),
205db53a302SChris Wilson 	    TP_ARGS(obj, offset, len),
206db53a302SChris Wilson 
207db53a302SChris Wilson 	    TP_STRUCT__entry(
208db53a302SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
209db53a302SChris Wilson 			     __field(u32, offset)
210db53a302SChris Wilson 			     __field(u32, len)
211db53a302SChris Wilson 			     ),
212db53a302SChris Wilson 
213db53a302SChris Wilson 	    TP_fast_assign(
214db53a302SChris Wilson 			   __entry->obj = obj;
215db53a302SChris Wilson 			   __entry->offset = offset;
216db53a302SChris Wilson 			   __entry->len = len;
217db53a302SChris Wilson 			   ),
218db53a302SChris Wilson 
219db53a302SChris Wilson 	    TP_printk("obj=%p, offset=%u, len=%u",
220db53a302SChris Wilson 		      __entry->obj, __entry->offset, __entry->len)
221db53a302SChris Wilson );
222db53a302SChris Wilson 
223db53a302SChris Wilson TRACE_EVENT(i915_gem_object_fault,
224db53a302SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj, u32 index, bool gtt, bool write),
225db53a302SChris Wilson 	    TP_ARGS(obj, index, gtt, write),
226db53a302SChris Wilson 
227db53a302SChris Wilson 	    TP_STRUCT__entry(
228db53a302SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
229db53a302SChris Wilson 			     __field(u32, index)
230db53a302SChris Wilson 			     __field(bool, gtt)
231db53a302SChris Wilson 			     __field(bool, write)
232db53a302SChris Wilson 			     ),
233db53a302SChris Wilson 
234db53a302SChris Wilson 	    TP_fast_assign(
235db53a302SChris Wilson 			   __entry->obj = obj;
236db53a302SChris Wilson 			   __entry->index = index;
237db53a302SChris Wilson 			   __entry->gtt = gtt;
238db53a302SChris Wilson 			   __entry->write = write;
239db53a302SChris Wilson 			   ),
240db53a302SChris Wilson 
241db53a302SChris Wilson 	    TP_printk("obj=%p, %s index=%u %s",
242db53a302SChris Wilson 		      __entry->obj,
243db53a302SChris Wilson 		      __entry->gtt ? "GTT" : "CPU",
244db53a302SChris Wilson 		      __entry->index,
245db53a302SChris Wilson 		      __entry->write ? ", writable" : "")
2461c5d22f7SChris Wilson );
2471c5d22f7SChris Wilson 
248903cf20cSLi Zefan DECLARE_EVENT_CLASS(i915_gem_object,
24905394f39SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj),
2501c5d22f7SChris Wilson 	    TP_ARGS(obj),
2511c5d22f7SChris Wilson 
2521c5d22f7SChris Wilson 	    TP_STRUCT__entry(
25305394f39SChris Wilson 			     __field(struct drm_i915_gem_object *, obj)
2541c5d22f7SChris Wilson 			     ),
2551c5d22f7SChris Wilson 
2561c5d22f7SChris Wilson 	    TP_fast_assign(
2571c5d22f7SChris Wilson 			   __entry->obj = obj;
2581c5d22f7SChris Wilson 			   ),
2591c5d22f7SChris Wilson 
2601c5d22f7SChris Wilson 	    TP_printk("obj=%p", __entry->obj)
2611c5d22f7SChris Wilson );
2621c5d22f7SChris Wilson 
263f41275e8SLi Zefan DEFINE_EVENT(i915_gem_object, i915_gem_object_clflush,
26405394f39SChris Wilson 	     TP_PROTO(struct drm_i915_gem_object *obj),
265903cf20cSLi Zefan 	     TP_ARGS(obj)
266903cf20cSLi Zefan );
2671c5d22f7SChris Wilson 
268903cf20cSLi Zefan DEFINE_EVENT(i915_gem_object, i915_gem_object_destroy,
26905394f39SChris Wilson 	    TP_PROTO(struct drm_i915_gem_object *obj),
270903cf20cSLi Zefan 	    TP_ARGS(obj)
2711c5d22f7SChris Wilson );
2721c5d22f7SChris Wilson 
273db53a302SChris Wilson TRACE_EVENT(i915_gem_evict,
2741ec9e26dSDaniel Vetter 	    TP_PROTO(struct drm_device *dev, u32 size, u32 align, unsigned flags),
2751ec9e26dSDaniel Vetter 	    TP_ARGS(dev, size, align, flags),
2761c5d22f7SChris Wilson 
2771c5d22f7SChris Wilson 	    TP_STRUCT__entry(
2784f49be54SChris Wilson 			     __field(u32, dev)
279db53a302SChris Wilson 			     __field(u32, size)
280db53a302SChris Wilson 			     __field(u32, align)
2811ec9e26dSDaniel Vetter 			     __field(unsigned, flags)
2821c5d22f7SChris Wilson 			    ),
2831c5d22f7SChris Wilson 
2841c5d22f7SChris Wilson 	    TP_fast_assign(
2854f49be54SChris Wilson 			   __entry->dev = dev->primary->index;
286db53a302SChris Wilson 			   __entry->size = size;
287db53a302SChris Wilson 			   __entry->align = align;
2881ec9e26dSDaniel Vetter 			   __entry->flags = flags;
2891c5d22f7SChris Wilson 			  ),
2901c5d22f7SChris Wilson 
291db53a302SChris Wilson 	    TP_printk("dev=%d, size=%d, align=%d %s",
292db53a302SChris Wilson 		      __entry->dev, __entry->size, __entry->align,
2931ec9e26dSDaniel Vetter 		      __entry->flags & PIN_MAPPABLE ? ", mappable" : "")
2941c5d22f7SChris Wilson );
2951c5d22f7SChris Wilson 
296db53a302SChris Wilson TRACE_EVENT(i915_gem_evict_everything,
2976c085a72SChris Wilson 	    TP_PROTO(struct drm_device *dev),
2986c085a72SChris Wilson 	    TP_ARGS(dev),
2991c5d22f7SChris Wilson 
3001c5d22f7SChris Wilson 	    TP_STRUCT__entry(
3014f49be54SChris Wilson 			     __field(u32, dev)
3021c5d22f7SChris Wilson 			    ),
3031c5d22f7SChris Wilson 
3041c5d22f7SChris Wilson 	    TP_fast_assign(
3054f49be54SChris Wilson 			   __entry->dev = dev->primary->index;
3061c5d22f7SChris Wilson 			  ),
3071c5d22f7SChris Wilson 
3086c085a72SChris Wilson 	    TP_printk("dev=%d", __entry->dev)
309db53a302SChris Wilson );
310db53a302SChris Wilson 
311bcccff84SBen Widawsky TRACE_EVENT(i915_gem_evict_vm,
312bcccff84SBen Widawsky 	    TP_PROTO(struct i915_address_space *vm),
313bcccff84SBen Widawsky 	    TP_ARGS(vm),
314bcccff84SBen Widawsky 
315bcccff84SBen Widawsky 	    TP_STRUCT__entry(
3169297ebf2SSteven Rostedt 			     __field(u32, dev)
317bcccff84SBen Widawsky 			     __field(struct i915_address_space *, vm)
318bcccff84SBen Widawsky 			    ),
319bcccff84SBen Widawsky 
320bcccff84SBen Widawsky 	    TP_fast_assign(
3219297ebf2SSteven Rostedt 			   __entry->dev = vm->dev->primary->index;
322bcccff84SBen Widawsky 			   __entry->vm = vm;
323bcccff84SBen Widawsky 			  ),
324bcccff84SBen Widawsky 
3259297ebf2SSteven Rostedt 	    TP_printk("dev=%d, vm=%p", __entry->dev, __entry->vm)
326bcccff84SBen Widawsky );
327bcccff84SBen Widawsky 
328b52b89daSChris Wilson TRACE_EVENT(i915_gem_ring_sync_to,
329a4872ba6SOscar Mateo 	    TP_PROTO(struct intel_engine_cs *from,
330a4872ba6SOscar Mateo 		     struct intel_engine_cs *to,
33174328ee5SJohn Harrison 		     struct drm_i915_gem_request *req),
33274328ee5SJohn Harrison 	    TP_ARGS(from, to, req),
333b52b89daSChris Wilson 
334b52b89daSChris Wilson 	    TP_STRUCT__entry(
335b52b89daSChris Wilson 			     __field(u32, dev)
336b52b89daSChris Wilson 			     __field(u32, sync_from)
337b52b89daSChris Wilson 			     __field(u32, sync_to)
338b52b89daSChris Wilson 			     __field(u32, seqno)
339b52b89daSChris Wilson 			     ),
340b52b89daSChris Wilson 
341b52b89daSChris Wilson 	    TP_fast_assign(
342b52b89daSChris Wilson 			   __entry->dev = from->dev->primary->index;
343b52b89daSChris Wilson 			   __entry->sync_from = from->id;
344b52b89daSChris Wilson 			   __entry->sync_to = to->id;
34574328ee5SJohn Harrison 			   __entry->seqno = i915_gem_request_get_seqno(req);
346b52b89daSChris Wilson 			   ),
347b52b89daSChris Wilson 
348b52b89daSChris Wilson 	    TP_printk("dev=%u, sync-from=%u, sync-to=%u, seqno=%u",
349b52b89daSChris Wilson 		      __entry->dev,
350b52b89daSChris Wilson 		      __entry->sync_from, __entry->sync_to,
351b52b89daSChris Wilson 		      __entry->seqno)
352b52b89daSChris Wilson );
353b52b89daSChris Wilson 
354db53a302SChris Wilson TRACE_EVENT(i915_gem_ring_dispatch,
35574328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req, u32 flags),
35674328ee5SJohn Harrison 	    TP_ARGS(req, flags),
357db53a302SChris Wilson 
358db53a302SChris Wilson 	    TP_STRUCT__entry(
359db53a302SChris Wilson 			     __field(u32, dev)
360db53a302SChris Wilson 			     __field(u32, ring)
361db53a302SChris Wilson 			     __field(u32, seqno)
362d7d4eeddSChris Wilson 			     __field(u32, flags)
363db53a302SChris Wilson 			     ),
364db53a302SChris Wilson 
365db53a302SChris Wilson 	    TP_fast_assign(
36674328ee5SJohn Harrison 			   struct intel_engine_cs *ring =
36774328ee5SJohn Harrison 						i915_gem_request_get_ring(req);
368db53a302SChris Wilson 			   __entry->dev = ring->dev->primary->index;
369db53a302SChris Wilson 			   __entry->ring = ring->id;
37074328ee5SJohn Harrison 			   __entry->seqno = i915_gem_request_get_seqno(req);
371d7d4eeddSChris Wilson 			   __entry->flags = flags;
372581c26e8SJohn Harrison 			   i915_trace_irq_get(ring, req);
373db53a302SChris Wilson 			   ),
374db53a302SChris Wilson 
375d7d4eeddSChris Wilson 	    TP_printk("dev=%u, ring=%u, seqno=%u, flags=%x",
376d7d4eeddSChris Wilson 		      __entry->dev, __entry->ring, __entry->seqno, __entry->flags)
377db53a302SChris Wilson );
378db53a302SChris Wilson 
379db53a302SChris Wilson TRACE_EVENT(i915_gem_ring_flush,
380a4872ba6SOscar Mateo 	    TP_PROTO(struct intel_engine_cs *ring, u32 invalidate, u32 flush),
381db53a302SChris Wilson 	    TP_ARGS(ring, invalidate, flush),
382db53a302SChris Wilson 
383db53a302SChris Wilson 	    TP_STRUCT__entry(
384db53a302SChris Wilson 			     __field(u32, dev)
385db53a302SChris Wilson 			     __field(u32, ring)
386db53a302SChris Wilson 			     __field(u32, invalidate)
387db53a302SChris Wilson 			     __field(u32, flush)
388db53a302SChris Wilson 			     ),
389db53a302SChris Wilson 
390db53a302SChris Wilson 	    TP_fast_assign(
391db53a302SChris Wilson 			   __entry->dev = ring->dev->primary->index;
392db53a302SChris Wilson 			   __entry->ring = ring->id;
393db53a302SChris Wilson 			   __entry->invalidate = invalidate;
394db53a302SChris Wilson 			   __entry->flush = flush;
395db53a302SChris Wilson 			   ),
396db53a302SChris Wilson 
397db53a302SChris Wilson 	    TP_printk("dev=%u, ring=%x, invalidate=%04x, flush=%04x",
398db53a302SChris Wilson 		      __entry->dev, __entry->ring,
399db53a302SChris Wilson 		      __entry->invalidate, __entry->flush)
4001c5d22f7SChris Wilson );
4011c5d22f7SChris Wilson 
402903cf20cSLi Zefan DECLARE_EVENT_CLASS(i915_gem_request,
40374328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
40474328ee5SJohn Harrison 	    TP_ARGS(req),
4051c5d22f7SChris Wilson 
4061c5d22f7SChris Wilson 	    TP_STRUCT__entry(
4074f49be54SChris Wilson 			     __field(u32, dev)
408db53a302SChris Wilson 			     __field(u32, ring)
4091c5d22f7SChris Wilson 			     __field(u32, seqno)
4101c5d22f7SChris Wilson 			     ),
4111c5d22f7SChris Wilson 
4121c5d22f7SChris Wilson 	    TP_fast_assign(
41374328ee5SJohn Harrison 			   struct intel_engine_cs *ring =
41474328ee5SJohn Harrison 						i915_gem_request_get_ring(req);
415db53a302SChris Wilson 			   __entry->dev = ring->dev->primary->index;
416db53a302SChris Wilson 			   __entry->ring = ring->id;
41774328ee5SJohn Harrison 			   __entry->seqno = i915_gem_request_get_seqno(req);
4181c5d22f7SChris Wilson 			   ),
4191c5d22f7SChris Wilson 
420db53a302SChris Wilson 	    TP_printk("dev=%u, ring=%u, seqno=%u",
421db53a302SChris Wilson 		      __entry->dev, __entry->ring, __entry->seqno)
422db53a302SChris Wilson );
423db53a302SChris Wilson 
424db53a302SChris Wilson DEFINE_EVENT(i915_gem_request, i915_gem_request_add,
42574328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
42674328ee5SJohn Harrison 	    TP_ARGS(req)
4271c5d22f7SChris Wilson );
4281c5d22f7SChris Wilson 
429814e9b57SChris Wilson TRACE_EVENT(i915_gem_request_complete,
430a4872ba6SOscar Mateo 	    TP_PROTO(struct intel_engine_cs *ring),
431814e9b57SChris Wilson 	    TP_ARGS(ring),
432814e9b57SChris Wilson 
433814e9b57SChris Wilson 	    TP_STRUCT__entry(
434814e9b57SChris Wilson 			     __field(u32, dev)
435814e9b57SChris Wilson 			     __field(u32, ring)
436814e9b57SChris Wilson 			     __field(u32, seqno)
437814e9b57SChris Wilson 			     ),
438814e9b57SChris Wilson 
439814e9b57SChris Wilson 	    TP_fast_assign(
440814e9b57SChris Wilson 			   __entry->dev = ring->dev->primary->index;
441814e9b57SChris Wilson 			   __entry->ring = ring->id;
442814e9b57SChris Wilson 			   __entry->seqno = ring->get_seqno(ring, false);
443814e9b57SChris Wilson 			   ),
444814e9b57SChris Wilson 
445814e9b57SChris Wilson 	    TP_printk("dev=%u, ring=%u, seqno=%u",
446814e9b57SChris Wilson 		      __entry->dev, __entry->ring, __entry->seqno)
4471c5d22f7SChris Wilson );
4481c5d22f7SChris Wilson 
449903cf20cSLi Zefan DEFINE_EVENT(i915_gem_request, i915_gem_request_retire,
45074328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
45174328ee5SJohn Harrison 	    TP_ARGS(req)
4521c5d22f7SChris Wilson );
4531c5d22f7SChris Wilson 
454f3fd3768SBen Widawsky TRACE_EVENT(i915_gem_request_wait_begin,
45574328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
45674328ee5SJohn Harrison 	    TP_ARGS(req),
457f3fd3768SBen Widawsky 
458f3fd3768SBen Widawsky 	    TP_STRUCT__entry(
459f3fd3768SBen Widawsky 			     __field(u32, dev)
460f3fd3768SBen Widawsky 			     __field(u32, ring)
461f3fd3768SBen Widawsky 			     __field(u32, seqno)
462f3fd3768SBen Widawsky 			     __field(bool, blocking)
463f3fd3768SBen Widawsky 			     ),
464f3fd3768SBen Widawsky 
465f3fd3768SBen Widawsky 	    /* NB: the blocking information is racy since mutex_is_locked
466f3fd3768SBen Widawsky 	     * doesn't check that the current thread holds the lock. The only
467f3fd3768SBen Widawsky 	     * other option would be to pass the boolean information of whether
468f3fd3768SBen Widawsky 	     * or not the class was blocking down through the stack which is
469f3fd3768SBen Widawsky 	     * less desirable.
470f3fd3768SBen Widawsky 	     */
471f3fd3768SBen Widawsky 	    TP_fast_assign(
47274328ee5SJohn Harrison 			   struct intel_engine_cs *ring =
47374328ee5SJohn Harrison 						i915_gem_request_get_ring(req);
474f3fd3768SBen Widawsky 			   __entry->dev = ring->dev->primary->index;
475f3fd3768SBen Widawsky 			   __entry->ring = ring->id;
47674328ee5SJohn Harrison 			   __entry->seqno = i915_gem_request_get_seqno(req);
47774328ee5SJohn Harrison 			   __entry->blocking =
47874328ee5SJohn Harrison 				     mutex_is_locked(&ring->dev->struct_mutex);
479f3fd3768SBen Widawsky 			   ),
480f3fd3768SBen Widawsky 
481f3fd3768SBen Widawsky 	    TP_printk("dev=%u, ring=%u, seqno=%u, blocking=%s",
482f3fd3768SBen Widawsky 		      __entry->dev, __entry->ring, __entry->seqno,
483f3fd3768SBen Widawsky 		      __entry->blocking ?  "yes (NB)" : "no")
4841c5d22f7SChris Wilson );
4851c5d22f7SChris Wilson 
486903cf20cSLi Zefan DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_end,
48774328ee5SJohn Harrison 	    TP_PROTO(struct drm_i915_gem_request *req),
48874328ee5SJohn Harrison 	    TP_ARGS(req)
489903cf20cSLi Zefan );
490903cf20cSLi Zefan 
491903cf20cSLi Zefan DECLARE_EVENT_CLASS(i915_ring,
492a4872ba6SOscar Mateo 	    TP_PROTO(struct intel_engine_cs *ring),
493db53a302SChris Wilson 	    TP_ARGS(ring),
4941c5d22f7SChris Wilson 
4951c5d22f7SChris Wilson 	    TP_STRUCT__entry(
4964f49be54SChris Wilson 			     __field(u32, dev)
497db53a302SChris Wilson 			     __field(u32, ring)
4981c5d22f7SChris Wilson 			     ),
4991c5d22f7SChris Wilson 
5001c5d22f7SChris Wilson 	    TP_fast_assign(
501db53a302SChris Wilson 			   __entry->dev = ring->dev->primary->index;
502db53a302SChris Wilson 			   __entry->ring = ring->id;
5031c5d22f7SChris Wilson 			   ),
5041c5d22f7SChris Wilson 
505db53a302SChris Wilson 	    TP_printk("dev=%u, ring=%u", __entry->dev, __entry->ring)
5061c5d22f7SChris Wilson );
5071c5d22f7SChris Wilson 
508903cf20cSLi Zefan DEFINE_EVENT(i915_ring, i915_ring_wait_begin,
509a4872ba6SOscar Mateo 	    TP_PROTO(struct intel_engine_cs *ring),
510db53a302SChris Wilson 	    TP_ARGS(ring)
511903cf20cSLi Zefan );
5121c5d22f7SChris Wilson 
513903cf20cSLi Zefan DEFINE_EVENT(i915_ring, i915_ring_wait_end,
514a4872ba6SOscar Mateo 	    TP_PROTO(struct intel_engine_cs *ring),
515db53a302SChris Wilson 	    TP_ARGS(ring)
5161c5d22f7SChris Wilson );
5171c5d22f7SChris Wilson 
518e5510facSJesse Barnes TRACE_EVENT(i915_flip_request,
51905394f39SChris Wilson 	    TP_PROTO(int plane, struct drm_i915_gem_object *obj),
520e5510facSJesse Barnes 
521e5510facSJesse Barnes 	    TP_ARGS(plane, obj),
522e5510facSJesse Barnes 
523e5510facSJesse Barnes 	    TP_STRUCT__entry(
524e5510facSJesse Barnes 		    __field(int, plane)
52505394f39SChris Wilson 		    __field(struct drm_i915_gem_object *, obj)
526e5510facSJesse Barnes 		    ),
527e5510facSJesse Barnes 
528e5510facSJesse Barnes 	    TP_fast_assign(
529e5510facSJesse Barnes 		    __entry->plane = plane;
530e5510facSJesse Barnes 		    __entry->obj = obj;
531e5510facSJesse Barnes 		    ),
532e5510facSJesse Barnes 
533e5510facSJesse Barnes 	    TP_printk("plane=%d, obj=%p", __entry->plane, __entry->obj)
534e5510facSJesse Barnes );
535e5510facSJesse Barnes 
536e5510facSJesse Barnes TRACE_EVENT(i915_flip_complete,
53705394f39SChris Wilson 	    TP_PROTO(int plane, struct drm_i915_gem_object *obj),
538e5510facSJesse Barnes 
539e5510facSJesse Barnes 	    TP_ARGS(plane, obj),
540e5510facSJesse Barnes 
541e5510facSJesse Barnes 	    TP_STRUCT__entry(
542e5510facSJesse Barnes 		    __field(int, plane)
54305394f39SChris Wilson 		    __field(struct drm_i915_gem_object *, obj)
544e5510facSJesse Barnes 		    ),
545e5510facSJesse Barnes 
546e5510facSJesse Barnes 	    TP_fast_assign(
547e5510facSJesse Barnes 		    __entry->plane = plane;
548e5510facSJesse Barnes 		    __entry->obj = obj;
549e5510facSJesse Barnes 		    ),
550e5510facSJesse Barnes 
551e5510facSJesse Barnes 	    TP_printk("plane=%d, obj=%p", __entry->plane, __entry->obj)
552e5510facSJesse Barnes );
553e5510facSJesse Barnes 
554ed71f1b4SChris Wilson TRACE_EVENT_CONDITION(i915_reg_rw,
555ed71f1b4SChris Wilson 	TP_PROTO(bool write, u32 reg, u64 val, int len, bool trace),
556ba4f01a3SYuanhan Liu 
557ed71f1b4SChris Wilson 	TP_ARGS(write, reg, val, len, trace),
558ed71f1b4SChris Wilson 
559ed71f1b4SChris Wilson 	TP_CONDITION(trace),
560ba4f01a3SYuanhan Liu 
561ba4f01a3SYuanhan Liu 	TP_STRUCT__entry(
562db53a302SChris Wilson 		__field(u64, val)
563db53a302SChris Wilson 		__field(u32, reg)
564db53a302SChris Wilson 		__field(u16, write)
565db53a302SChris Wilson 		__field(u16, len)
566ba4f01a3SYuanhan Liu 		),
567ba4f01a3SYuanhan Liu 
568ba4f01a3SYuanhan Liu 	TP_fast_assign(
569db53a302SChris Wilson 		__entry->val = (u64)val;
570ba4f01a3SYuanhan Liu 		__entry->reg = reg;
571db53a302SChris Wilson 		__entry->write = write;
572ba4f01a3SYuanhan Liu 		__entry->len = len;
573ba4f01a3SYuanhan Liu 		),
574ba4f01a3SYuanhan Liu 
575db53a302SChris Wilson 	TP_printk("%s reg=0x%x, len=%d, val=(0x%x, 0x%x)",
576db53a302SChris Wilson 		__entry->write ? "write" : "read",
577db53a302SChris Wilson 		__entry->reg, __entry->len,
578db53a302SChris Wilson 		(u32)(__entry->val & 0xffffffff),
579db53a302SChris Wilson 		(u32)(__entry->val >> 32))
580ba4f01a3SYuanhan Liu );
581ba4f01a3SYuanhan Liu 
582be2cde9aSDaniel Vetter TRACE_EVENT(intel_gpu_freq_change,
583be2cde9aSDaniel Vetter 	    TP_PROTO(u32 freq),
584be2cde9aSDaniel Vetter 	    TP_ARGS(freq),
585be2cde9aSDaniel Vetter 
586be2cde9aSDaniel Vetter 	    TP_STRUCT__entry(
587be2cde9aSDaniel Vetter 			     __field(u32, freq)
588be2cde9aSDaniel Vetter 			     ),
589be2cde9aSDaniel Vetter 
590be2cde9aSDaniel Vetter 	    TP_fast_assign(
591be2cde9aSDaniel Vetter 			   __entry->freq = freq;
592be2cde9aSDaniel Vetter 			   ),
593be2cde9aSDaniel Vetter 
594be2cde9aSDaniel Vetter 	    TP_printk("new_freq=%u", __entry->freq)
595be2cde9aSDaniel Vetter );
596be2cde9aSDaniel Vetter 
597198c974dSDaniele Ceraolo Spurio /**
598198c974dSDaniele Ceraolo Spurio  * DOC: i915_ppgtt_create and i915_ppgtt_release tracepoints
599198c974dSDaniele Ceraolo Spurio  *
600198c974dSDaniele Ceraolo Spurio  * With full ppgtt enabled each process using drm will allocate at least one
601198c974dSDaniele Ceraolo Spurio  * translation table. With these traces it is possible to keep track of the
602198c974dSDaniele Ceraolo Spurio  * allocation and of the lifetime of the tables; this can be used during
603198c974dSDaniele Ceraolo Spurio  * testing/debug to verify that we are not leaking ppgtts.
604198c974dSDaniele Ceraolo Spurio  * These traces identify the ppgtt through the vm pointer, which is also printed
605198c974dSDaniele Ceraolo Spurio  * by the i915_vma_bind and i915_vma_unbind tracepoints.
606198c974dSDaniele Ceraolo Spurio  */
607198c974dSDaniele Ceraolo Spurio DECLARE_EVENT_CLASS(i915_ppgtt,
608198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct i915_address_space *vm),
609198c974dSDaniele Ceraolo Spurio 	TP_ARGS(vm),
610198c974dSDaniele Ceraolo Spurio 
611198c974dSDaniele Ceraolo Spurio 	TP_STRUCT__entry(
612198c974dSDaniele Ceraolo Spurio 			__field(struct i915_address_space *, vm)
613198c974dSDaniele Ceraolo Spurio 			__field(u32, dev)
614198c974dSDaniele Ceraolo Spurio 	),
615198c974dSDaniele Ceraolo Spurio 
616198c974dSDaniele Ceraolo Spurio 	TP_fast_assign(
617198c974dSDaniele Ceraolo Spurio 			__entry->vm = vm;
618198c974dSDaniele Ceraolo Spurio 			__entry->dev = vm->dev->primary->index;
619198c974dSDaniele Ceraolo Spurio 	),
620198c974dSDaniele Ceraolo Spurio 
621198c974dSDaniele Ceraolo Spurio 	TP_printk("dev=%u, vm=%p", __entry->dev, __entry->vm)
622198c974dSDaniele Ceraolo Spurio )
623198c974dSDaniele Ceraolo Spurio 
624198c974dSDaniele Ceraolo Spurio DEFINE_EVENT(i915_ppgtt, i915_ppgtt_create,
625198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct i915_address_space *vm),
626198c974dSDaniele Ceraolo Spurio 	TP_ARGS(vm)
627198c974dSDaniele Ceraolo Spurio );
628198c974dSDaniele Ceraolo Spurio 
629198c974dSDaniele Ceraolo Spurio DEFINE_EVENT(i915_ppgtt, i915_ppgtt_release,
630198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct i915_address_space *vm),
631198c974dSDaniele Ceraolo Spurio 	TP_ARGS(vm)
632198c974dSDaniele Ceraolo Spurio );
633198c974dSDaniele Ceraolo Spurio 
634198c974dSDaniele Ceraolo Spurio /**
635198c974dSDaniele Ceraolo Spurio  * DOC: i915_context_create and i915_context_free tracepoints
636198c974dSDaniele Ceraolo Spurio  *
637198c974dSDaniele Ceraolo Spurio  * These tracepoints are used to track creation and deletion of contexts.
638198c974dSDaniele Ceraolo Spurio  * If full ppgtt is enabled, they also print the address of the vm assigned to
639198c974dSDaniele Ceraolo Spurio  * the context.
640198c974dSDaniele Ceraolo Spurio  */
641198c974dSDaniele Ceraolo Spurio DECLARE_EVENT_CLASS(i915_context,
642198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct intel_context *ctx),
643198c974dSDaniele Ceraolo Spurio 	TP_ARGS(ctx),
644198c974dSDaniele Ceraolo Spurio 
645198c974dSDaniele Ceraolo Spurio 	TP_STRUCT__entry(
646198c974dSDaniele Ceraolo Spurio 			__field(u32, dev)
647198c974dSDaniele Ceraolo Spurio 			__field(struct intel_context *, ctx)
648198c974dSDaniele Ceraolo Spurio 			__field(struct i915_address_space *, vm)
649198c974dSDaniele Ceraolo Spurio 	),
650198c974dSDaniele Ceraolo Spurio 
651198c974dSDaniele Ceraolo Spurio 	TP_fast_assign(
652198c974dSDaniele Ceraolo Spurio 			__entry->ctx = ctx;
653198c974dSDaniele Ceraolo Spurio 			__entry->vm = ctx->ppgtt ? &ctx->ppgtt->base : NULL;
654198c974dSDaniele Ceraolo Spurio 			__entry->dev = ctx->file_priv->dev_priv->dev->primary->index;
655198c974dSDaniele Ceraolo Spurio 	),
656198c974dSDaniele Ceraolo Spurio 
657198c974dSDaniele Ceraolo Spurio 	TP_printk("dev=%u, ctx=%p, ctx_vm=%p",
658198c974dSDaniele Ceraolo Spurio 		  __entry->dev, __entry->ctx, __entry->vm)
659198c974dSDaniele Ceraolo Spurio )
660198c974dSDaniele Ceraolo Spurio 
661198c974dSDaniele Ceraolo Spurio DEFINE_EVENT(i915_context, i915_context_create,
662198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct intel_context *ctx),
663198c974dSDaniele Ceraolo Spurio 	TP_ARGS(ctx)
664198c974dSDaniele Ceraolo Spurio );
665198c974dSDaniele Ceraolo Spurio 
666198c974dSDaniele Ceraolo Spurio DEFINE_EVENT(i915_context, i915_context_free,
667198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct intel_context *ctx),
668198c974dSDaniele Ceraolo Spurio 	TP_ARGS(ctx)
669198c974dSDaniele Ceraolo Spurio );
670198c974dSDaniele Ceraolo Spurio 
671198c974dSDaniele Ceraolo Spurio /**
672198c974dSDaniele Ceraolo Spurio  * DOC: switch_mm tracepoint
673198c974dSDaniele Ceraolo Spurio  *
674198c974dSDaniele Ceraolo Spurio  * This tracepoint allows tracking of the mm switch, which is an important point
675198c974dSDaniele Ceraolo Spurio  * in the lifetime of the vm in the legacy submission path. This tracepoint is
676198c974dSDaniele Ceraolo Spurio  * called only if full ppgtt is enabled.
677198c974dSDaniele Ceraolo Spurio  */
678198c974dSDaniele Ceraolo Spurio TRACE_EVENT(switch_mm,
679198c974dSDaniele Ceraolo Spurio 	TP_PROTO(struct intel_engine_cs *ring, struct intel_context *to),
680198c974dSDaniele Ceraolo Spurio 
681198c974dSDaniele Ceraolo Spurio 	TP_ARGS(ring, to),
682198c974dSDaniele Ceraolo Spurio 
683198c974dSDaniele Ceraolo Spurio 	TP_STRUCT__entry(
684198c974dSDaniele Ceraolo Spurio 			__field(u32, ring)
685198c974dSDaniele Ceraolo Spurio 			__field(struct intel_context *, to)
686198c974dSDaniele Ceraolo Spurio 			__field(struct i915_address_space *, vm)
687198c974dSDaniele Ceraolo Spurio 			__field(u32, dev)
688198c974dSDaniele Ceraolo Spurio 	),
689198c974dSDaniele Ceraolo Spurio 
690198c974dSDaniele Ceraolo Spurio 	TP_fast_assign(
691198c974dSDaniele Ceraolo Spurio 			__entry->ring = ring->id;
692198c974dSDaniele Ceraolo Spurio 			__entry->to = to;
693198c974dSDaniele Ceraolo Spurio 			__entry->vm = to->ppgtt? &to->ppgtt->base : NULL;
694198c974dSDaniele Ceraolo Spurio 			__entry->dev = ring->dev->primary->index;
695198c974dSDaniele Ceraolo Spurio 	),
696198c974dSDaniele Ceraolo Spurio 
697198c974dSDaniele Ceraolo Spurio 	TP_printk("dev=%u, ring=%u, ctx=%p, ctx_vm=%p",
698198c974dSDaniele Ceraolo Spurio 		  __entry->dev, __entry->ring, __entry->to, __entry->vm)
699198c974dSDaniele Ceraolo Spurio );
700198c974dSDaniele Ceraolo Spurio 
7011c5d22f7SChris Wilson #endif /* _I915_TRACE_H_ */
7021c5d22f7SChris Wilson 
7031c5d22f7SChris Wilson /* This part must be outside protection */
7041c5d22f7SChris Wilson #undef TRACE_INCLUDE_PATH
705a7c54278SPeter Clifton #define TRACE_INCLUDE_PATH .
7061c5d22f7SChris Wilson #include <trace/define_trace.h>
707