i915_trace.h 27.4 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
C
Chris Wilson 已提交
2 3 4 5 6 7 8 9
#if !defined(_I915_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
#define _I915_TRACE_H_

#include <linux/stringify.h>
#include <linux/types.h>
#include <linux/tracepoint.h>

#include <drm/drmP.h>
10
#include "i915_drv.h"
11
#include "intel_drv.h"
C
Chris Wilson 已提交
12
#include "intel_ringbuffer.h"
C
Chris Wilson 已提交
13 14 15 16 17

#undef TRACE_SYSTEM
#define TRACE_SYSTEM i915
#define TRACE_INCLUDE_FILE i915_trace

18 19
/* watermark/fifo updates */

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
TRACE_EVENT(intel_cpu_fifo_underrun,
	    TP_PROTO(struct drm_i915_private *dev_priv, enum pipe pipe),
	    TP_ARGS(dev_priv, pipe),

	    TP_STRUCT__entry(
			     __field(enum pipe, pipe)
			     __field(u32, frame)
			     __field(u32, scanline)
			     ),

	    TP_fast_assign(
			   __entry->pipe = pipe;
			   __entry->frame = dev_priv->drm.driver->get_vblank_counter(&dev_priv->drm, pipe);
			   __entry->scanline = intel_get_crtc_scanline(intel_get_crtc_for_pipe(dev_priv, pipe));
			   ),

	    TP_printk("pipe %c, frame=%u, scanline=%u",
		      pipe_name(__entry->pipe),
		      __entry->frame, __entry->scanline)
);

TRACE_EVENT(intel_pch_fifo_underrun,
42
	    TP_PROTO(struct drm_i915_private *dev_priv, enum pipe pch_transcoder),
43 44 45 46 47 48 49 50 51
	    TP_ARGS(dev_priv, pch_transcoder),

	    TP_STRUCT__entry(
			     __field(enum pipe, pipe)
			     __field(u32, frame)
			     __field(u32, scanline)
			     ),

	    TP_fast_assign(
52
			   enum pipe pipe = pch_transcoder;
53 54 55 56 57 58 59 60 61 62
			   __entry->pipe = pipe;
			   __entry->frame = dev_priv->drm.driver->get_vblank_counter(&dev_priv->drm, pipe);
			   __entry->scanline = intel_get_crtc_scanline(intel_get_crtc_for_pipe(dev_priv, pipe));
			   ),

	    TP_printk("pch transcoder %c, frame=%u, scanline=%u",
		      pipe_name(__entry->pipe),
		      __entry->frame, __entry->scanline)
);

63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
TRACE_EVENT(intel_memory_cxsr,
	    TP_PROTO(struct drm_i915_private *dev_priv, bool old, bool new),
	    TP_ARGS(dev_priv, old, new),

	    TP_STRUCT__entry(
			     __array(u32, frame, 3)
			     __array(u32, scanline, 3)
			     __field(bool, old)
			     __field(bool, new)
			     ),

	    TP_fast_assign(
			   enum pipe pipe;
			   for_each_pipe(dev_priv, pipe) {
				   __entry->frame[pipe] =
					   dev_priv->drm.driver->get_vblank_counter(&dev_priv->drm, pipe);
				   __entry->scanline[pipe] =
					   intel_get_crtc_scanline(intel_get_crtc_for_pipe(dev_priv, pipe));
			   }
			   __entry->old = old;
			   __entry->new = new;
			   ),

	    TP_printk("%s->%s, pipe A: frame=%u, scanline=%u, pipe B: frame=%u, scanline=%u, pipe C: frame=%u, scanline=%u",
		      onoff(__entry->old), onoff(__entry->new),
		      __entry->frame[PIPE_A], __entry->scanline[PIPE_A],
		      __entry->frame[PIPE_B], __entry->scanline[PIPE_B],
		      __entry->frame[PIPE_C], __entry->scanline[PIPE_C])
);

93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
TRACE_EVENT(g4x_wm,
	    TP_PROTO(struct intel_crtc *crtc, const struct g4x_wm_values *wm),
	    TP_ARGS(crtc, wm),

	    TP_STRUCT__entry(
			     __field(enum pipe, pipe)
			     __field(u32, frame)
			     __field(u32, scanline)
			     __field(u16, primary)
			     __field(u16, sprite)
			     __field(u16, cursor)
			     __field(u16, sr_plane)
			     __field(u16, sr_cursor)
			     __field(u16, sr_fbc)
			     __field(u16, hpll_plane)
			     __field(u16, hpll_cursor)
			     __field(u16, hpll_fbc)
			     __field(bool, cxsr)
			     __field(bool, hpll)
			     __field(bool, fbc)
			     ),

	    TP_fast_assign(
			   __entry->pipe = crtc->pipe;
			   __entry->frame = crtc->base.dev->driver->get_vblank_counter(crtc->base.dev,
										       crtc->pipe);
			   __entry->scanline = intel_get_crtc_scanline(crtc);
			   __entry->primary = wm->pipe[crtc->pipe].plane[PLANE_PRIMARY];
			   __entry->sprite = wm->pipe[crtc->pipe].plane[PLANE_SPRITE0];
			   __entry->cursor = wm->pipe[crtc->pipe].plane[PLANE_CURSOR];
			   __entry->sr_plane = wm->sr.plane;
			   __entry->sr_cursor = wm->sr.cursor;
			   __entry->sr_fbc = wm->sr.fbc;
			   __entry->hpll_plane = wm->hpll.plane;
			   __entry->hpll_cursor = wm->hpll.cursor;
			   __entry->hpll_fbc = wm->hpll.fbc;
			   __entry->cxsr = wm->cxsr;
			   __entry->hpll = wm->hpll_en;
			   __entry->fbc = wm->fbc_en;
			   ),

	    TP_printk("pipe %c, frame=%u, scanline=%u, wm %d/%d/%d, sr %s/%d/%d/%d, hpll %s/%d/%d/%d, fbc %s",
		      pipe_name(__entry->pipe), __entry->frame, __entry->scanline,
		      __entry->primary, __entry->sprite, __entry->cursor,
		      yesno(__entry->cxsr), __entry->sr_plane, __entry->sr_cursor, __entry->sr_fbc,
		      yesno(__entry->hpll), __entry->hpll_plane, __entry->hpll_cursor, __entry->hpll_fbc,
		      yesno(__entry->fbc))
);

142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
TRACE_EVENT(vlv_wm,
	    TP_PROTO(struct intel_crtc *crtc, const struct vlv_wm_values *wm),
	    TP_ARGS(crtc, wm),

	    TP_STRUCT__entry(
			     __field(enum pipe, pipe)
			     __field(u32, frame)
			     __field(u32, scanline)
			     __field(u32, level)
			     __field(u32, cxsr)
			     __field(u32, primary)
			     __field(u32, sprite0)
			     __field(u32, sprite1)
			     __field(u32, cursor)
			     __field(u32, sr_plane)
			     __field(u32, sr_cursor)
			     ),

	    TP_fast_assign(
			   __entry->pipe = crtc->pipe;
			   __entry->frame = crtc->base.dev->driver->get_vblank_counter(crtc->base.dev,
										       crtc->pipe);
			   __entry->scanline = intel_get_crtc_scanline(crtc);
			   __entry->level = wm->level;
			   __entry->cxsr = wm->cxsr;
			   __entry->primary = wm->pipe[crtc->pipe].plane[PLANE_PRIMARY];
			   __entry->sprite0 = wm->pipe[crtc->pipe].plane[PLANE_SPRITE0];
			   __entry->sprite1 = wm->pipe[crtc->pipe].plane[PLANE_SPRITE1];
			   __entry->cursor = wm->pipe[crtc->pipe].plane[PLANE_CURSOR];
			   __entry->sr_plane = wm->sr.plane;
			   __entry->sr_cursor = wm->sr.cursor;
			   ),

	    TP_printk("pipe %c, frame=%u, scanline=%u, level=%d, cxsr=%d, wm %d/%d/%d/%d, sr %d/%d",
		      pipe_name(__entry->pipe), __entry->frame,
		      __entry->scanline, __entry->level, __entry->cxsr,
		      __entry->primary, __entry->sprite0, __entry->sprite1, __entry->cursor,
		      __entry->sr_plane, __entry->sr_cursor)
);

TRACE_EVENT(vlv_fifo_size,
	    TP_PROTO(struct intel_crtc *crtc, u32 sprite0_start, u32 sprite1_start, u32 fifo_size),
	    TP_ARGS(crtc, sprite0_start, sprite1_start, fifo_size),

	    TP_STRUCT__entry(
			     __field(enum pipe, pipe)
			     __field(u32, frame)
			     __field(u32, scanline)
			     __field(u32, sprite0_start)
			     __field(u32, sprite1_start)
			     __field(u32, fifo_size)
			     ),

	    TP_fast_assign(
			   __entry->pipe = crtc->pipe;
			   __entry->frame = crtc->base.dev->driver->get_vblank_counter(crtc->base.dev,
										       crtc->pipe);
			   __entry->scanline = intel_get_crtc_scanline(crtc);
			   __entry->sprite0_start = sprite0_start;
			   __entry->sprite1_start = sprite1_start;
			   __entry->fifo_size = fifo_size;
			   ),

	    TP_printk("pipe %c, frame=%u, scanline=%u, %d/%d/%d",
		      pipe_name(__entry->pipe), __entry->frame,
		      __entry->scanline, __entry->sprite0_start,
		      __entry->sprite1_start, __entry->fifo_size)
);

211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
/* plane updates */

TRACE_EVENT(intel_update_plane,
	    TP_PROTO(struct drm_plane *plane, struct intel_crtc *crtc),
	    TP_ARGS(plane, crtc),

	    TP_STRUCT__entry(
			     __field(enum pipe, pipe)
			     __field(const char *, name)
			     __field(u32, frame)
			     __field(u32, scanline)
			     __array(int, src, 4)
			     __array(int, dst, 4)
			     ),

	    TP_fast_assign(
			   __entry->pipe = crtc->pipe;
			   __entry->name = plane->name;
			   __entry->frame = crtc->base.dev->driver->get_vblank_counter(crtc->base.dev,
										       crtc->pipe);
			   __entry->scanline = intel_get_crtc_scanline(crtc);
			   memcpy(__entry->src, &plane->state->src, sizeof(__entry->src));
			   memcpy(__entry->dst, &plane->state->dst, sizeof(__entry->dst));
			   ),

	    TP_printk("pipe %c, plane %s, frame=%u, scanline=%u, " DRM_RECT_FP_FMT " -> " DRM_RECT_FMT,
		      pipe_name(__entry->pipe), __entry->name,
		      __entry->frame, __entry->scanline,
		      DRM_RECT_FP_ARG((const struct drm_rect *)__entry->src),
		      DRM_RECT_ARG((const struct drm_rect *)__entry->dst))
);

TRACE_EVENT(intel_disable_plane,
	    TP_PROTO(struct drm_plane *plane, struct intel_crtc *crtc),
	    TP_ARGS(plane, crtc),

	    TP_STRUCT__entry(
			     __field(enum pipe, pipe)
			     __field(const char *, name)
			     __field(u32, frame)
			     __field(u32, scanline)
			     ),

	    TP_fast_assign(
			   __entry->pipe = crtc->pipe;
			   __entry->name = plane->name;
			   __entry->frame = crtc->base.dev->driver->get_vblank_counter(crtc->base.dev,
										       crtc->pipe);
			   __entry->scanline = intel_get_crtc_scanline(crtc);
			   ),

	    TP_printk("pipe %c, plane %s, frame=%u, scanline=%u",
		      pipe_name(__entry->pipe), __entry->name,
		      __entry->frame, __entry->scanline)
);

267 268 269
/* pipe updates */

TRACE_EVENT(i915_pipe_update_start,
270 271
	    TP_PROTO(struct intel_crtc *crtc),
	    TP_ARGS(crtc),
272 273 274 275 276 277 278 279 280 281 282 283 284 285

	    TP_STRUCT__entry(
			     __field(enum pipe, pipe)
			     __field(u32, frame)
			     __field(u32, scanline)
			     __field(u32, min)
			     __field(u32, max)
			     ),

	    TP_fast_assign(
			   __entry->pipe = crtc->pipe;
			   __entry->frame = crtc->base.dev->driver->get_vblank_counter(crtc->base.dev,
										       crtc->pipe);
			   __entry->scanline = intel_get_crtc_scanline(crtc);
286 287
			   __entry->min = crtc->debug.min_vbl;
			   __entry->max = crtc->debug.max_vbl;
288 289 290 291 292 293 294 295
			   ),

	    TP_printk("pipe %c, frame=%u, scanline=%u, min=%u, max=%u",
		      pipe_name(__entry->pipe), __entry->frame,
		       __entry->scanline, __entry->min, __entry->max)
);

TRACE_EVENT(i915_pipe_update_vblank_evaded,
296 297
	    TP_PROTO(struct intel_crtc *crtc),
	    TP_ARGS(crtc),
298 299 300 301 302 303 304 305 306 307 308

	    TP_STRUCT__entry(
			     __field(enum pipe, pipe)
			     __field(u32, frame)
			     __field(u32, scanline)
			     __field(u32, min)
			     __field(u32, max)
			     ),

	    TP_fast_assign(
			   __entry->pipe = crtc->pipe;
309 310 311 312
			   __entry->frame = crtc->debug.start_vbl_count;
			   __entry->scanline = crtc->debug.scanline_start;
			   __entry->min = crtc->debug.min_vbl;
			   __entry->max = crtc->debug.max_vbl;
313 314 315 316 317 318 319 320
			   ),

	    TP_printk("pipe %c, frame=%u, scanline=%u, min=%u, max=%u",
		      pipe_name(__entry->pipe), __entry->frame,
		       __entry->scanline, __entry->min, __entry->max)
);

TRACE_EVENT(i915_pipe_update_end,
321 322
	    TP_PROTO(struct intel_crtc *crtc, u32 frame, int scanline_end),
	    TP_ARGS(crtc, frame, scanline_end),
323 324 325 326 327 328 329 330 331 332

	    TP_STRUCT__entry(
			     __field(enum pipe, pipe)
			     __field(u32, frame)
			     __field(u32, scanline)
			     ),

	    TP_fast_assign(
			   __entry->pipe = crtc->pipe;
			   __entry->frame = frame;
333
			   __entry->scanline = scanline_end;
334 335 336 337 338 339 340
			   ),

	    TP_printk("pipe %c, frame=%u, scanline=%u",
		      pipe_name(__entry->pipe), __entry->frame,
		      __entry->scanline)
);

C
Chris Wilson 已提交
341 342 343
/* object tracking */

TRACE_EVENT(i915_gem_object_create,
344
	    TP_PROTO(struct drm_i915_gem_object *obj),
C
Chris Wilson 已提交
345 346 347
	    TP_ARGS(obj),

	    TP_STRUCT__entry(
348
			     __field(struct drm_i915_gem_object *, obj)
349
			     __field(u64, size)
C
Chris Wilson 已提交
350 351 352 353
			     ),

	    TP_fast_assign(
			   __entry->obj = obj;
354
			   __entry->size = obj->base.size;
C
Chris Wilson 已提交
355 356
			   ),

357
	    TP_printk("obj=%p, size=0x%llx", __entry->obj, __entry->size)
C
Chris Wilson 已提交
358 359
);

360 361 362 363 364 365 366 367 368 369 370
TRACE_EVENT(i915_gem_shrink,
	    TP_PROTO(struct drm_i915_private *i915, unsigned long target, unsigned flags),
	    TP_ARGS(i915, target, flags),

	    TP_STRUCT__entry(
			     __field(int, dev)
			     __field(unsigned long, target)
			     __field(unsigned, flags)
			     ),

	    TP_fast_assign(
371
			   __entry->dev = i915->drm.primary->index;
372 373 374 375 376 377 378 379
			   __entry->target = target;
			   __entry->flags = flags;
			   ),

	    TP_printk("dev=%d, target=%lu, flags=%x",
		      __entry->dev, __entry->target, __entry->flags)
);

380
TRACE_EVENT(i915_vma_bind,
381 382
	    TP_PROTO(struct i915_vma *vma, unsigned flags),
	    TP_ARGS(vma, flags),
C
Chris Wilson 已提交
383 384

	    TP_STRUCT__entry(
385
			     __field(struct drm_i915_gem_object *, obj)
386
			     __field(struct i915_address_space *, vm)
387
			     __field(u64, offset)
388
			     __field(u64, size)
389
			     __field(unsigned, flags)
C
Chris Wilson 已提交
390 391 392
			     ),

	    TP_fast_assign(
393 394 395 396
			   __entry->obj = vma->obj;
			   __entry->vm = vma->vm;
			   __entry->offset = vma->node.start;
			   __entry->size = vma->node.size;
397
			   __entry->flags = flags;
C
Chris Wilson 已提交
398 399
			   ),

400
	    TP_printk("obj=%p, offset=0x%016llx size=0x%llx%s vm=%p",
C
Chris Wilson 已提交
401
		      __entry->obj, __entry->offset, __entry->size,
402
		      __entry->flags & PIN_MAPPABLE ? ", mappable" : "",
403
		      __entry->vm)
C
Chris Wilson 已提交
404 405
);

406 407 408
TRACE_EVENT(i915_vma_unbind,
	    TP_PROTO(struct i915_vma *vma),
	    TP_ARGS(vma),
C
Chris Wilson 已提交
409 410 411

	    TP_STRUCT__entry(
			     __field(struct drm_i915_gem_object *, obj)
412
			     __field(struct i915_address_space *, vm)
413
			     __field(u64, offset)
414
			     __field(u64, size)
C
Chris Wilson 已提交
415
			     ),
C
Chris Wilson 已提交
416

C
Chris Wilson 已提交
417
	    TP_fast_assign(
418 419 420 421
			   __entry->obj = vma->obj;
			   __entry->vm = vma->vm;
			   __entry->offset = vma->node.start;
			   __entry->size = vma->node.size;
C
Chris Wilson 已提交
422
			   ),
C
Chris Wilson 已提交
423

424
	    TP_printk("obj=%p, offset=0x%016llx size=0x%llx vm=%p",
425
		      __entry->obj, __entry->offset, __entry->size, __entry->vm)
C
Chris Wilson 已提交
426 427 428
);

TRACE_EVENT(i915_gem_object_pwrite,
429
	    TP_PROTO(struct drm_i915_gem_object *obj, u64 offset, u64 len),
C
Chris Wilson 已提交
430
	    TP_ARGS(obj, offset, len),
C
Chris Wilson 已提交
431

C
Chris Wilson 已提交
432 433
	    TP_STRUCT__entry(
			     __field(struct drm_i915_gem_object *, obj)
434 435
			     __field(u64, offset)
			     __field(u64, len)
C
Chris Wilson 已提交
436
			     ),
C
Chris Wilson 已提交
437

C
Chris Wilson 已提交
438 439 440 441 442 443
	    TP_fast_assign(
			   __entry->obj = obj;
			   __entry->offset = offset;
			   __entry->len = len;
			   ),

444
	    TP_printk("obj=%p, offset=0x%llx, len=0x%llx",
C
Chris Wilson 已提交
445 446 447 448
		      __entry->obj, __entry->offset, __entry->len)
);

TRACE_EVENT(i915_gem_object_pread,
449
	    TP_PROTO(struct drm_i915_gem_object *obj, u64 offset, u64 len),
C
Chris Wilson 已提交
450
	    TP_ARGS(obj, offset, len),
C
Chris Wilson 已提交
451 452

	    TP_STRUCT__entry(
453
			     __field(struct drm_i915_gem_object *, obj)
454 455
			     __field(u64, offset)
			     __field(u64, len)
C
Chris Wilson 已提交
456 457 458 459
			     ),

	    TP_fast_assign(
			   __entry->obj = obj;
C
Chris Wilson 已提交
460 461
			   __entry->offset = offset;
			   __entry->len = len;
C
Chris Wilson 已提交
462 463
			   ),

464
	    TP_printk("obj=%p, offset=0x%llx, len=0x%llx",
C
Chris Wilson 已提交
465
		      __entry->obj, __entry->offset, __entry->len)
C
Chris Wilson 已提交
466 467
);

C
Chris Wilson 已提交
468
TRACE_EVENT(i915_gem_object_fault,
469
	    TP_PROTO(struct drm_i915_gem_object *obj, u64 index, bool gtt, bool write),
C
Chris Wilson 已提交
470 471 472 473
	    TP_ARGS(obj, index, gtt, write),

	    TP_STRUCT__entry(
			     __field(struct drm_i915_gem_object *, obj)
474
			     __field(u64, index)
C
Chris Wilson 已提交
475 476 477 478 479 480 481 482 483 484
			     __field(bool, gtt)
			     __field(bool, write)
			     ),

	    TP_fast_assign(
			   __entry->obj = obj;
			   __entry->index = index;
			   __entry->gtt = gtt;
			   __entry->write = write;
			   ),
485

486
	    TP_printk("obj=%p, %s index=%llu %s",
C
Chris Wilson 已提交
487 488 489 490 491 492 493
		      __entry->obj,
		      __entry->gtt ? "GTT" : "CPU",
		      __entry->index,
		      __entry->write ? ", writable" : "")
);

DECLARE_EVENT_CLASS(i915_gem_object,
494
	    TP_PROTO(struct drm_i915_gem_object *obj),
C
Chris Wilson 已提交
495
	    TP_ARGS(obj),
496

C
Chris Wilson 已提交
497 498 499 500 501 502 503 504 505
	    TP_STRUCT__entry(
			     __field(struct drm_i915_gem_object *, obj)
			     ),

	    TP_fast_assign(
			   __entry->obj = obj;
			   ),

	    TP_printk("obj=%p", __entry->obj)
506 507
);

C
Chris Wilson 已提交
508 509 510 511
DEFINE_EVENT(i915_gem_object, i915_gem_object_clflush,
	     TP_PROTO(struct drm_i915_gem_object *obj),
	     TP_ARGS(obj)
);
C
Chris Wilson 已提交
512

C
Chris Wilson 已提交
513
DEFINE_EVENT(i915_gem_object, i915_gem_object_destroy,
514
	    TP_PROTO(struct drm_i915_gem_object *obj),
515 516
	    TP_ARGS(obj)
);
C
Chris Wilson 已提交
517

C
Chris Wilson 已提交
518
TRACE_EVENT(i915_gem_evict,
519
	    TP_PROTO(struct i915_address_space *vm, u64 size, u64 align, unsigned int flags),
520
	    TP_ARGS(vm, size, align, flags),
C
Chris Wilson 已提交
521

C
Chris Wilson 已提交
522 523
	    TP_STRUCT__entry(
			     __field(u32, dev)
524
			     __field(struct i915_address_space *, vm)
525 526
			     __field(u64, size)
			     __field(u64, align)
527
			     __field(unsigned int, flags)
C
Chris Wilson 已提交
528
			    ),
C
Chris Wilson 已提交
529

C
Chris Wilson 已提交
530
	    TP_fast_assign(
531
			   __entry->dev = vm->i915->drm.primary->index;
532
			   __entry->vm = vm;
C
Chris Wilson 已提交
533 534
			   __entry->size = size;
			   __entry->align = align;
535
			   __entry->flags = flags;
C
Chris Wilson 已提交
536 537
			  ),

538
	    TP_printk("dev=%d, vm=%p, size=0x%llx, align=0x%llx %s",
539
		      __entry->dev, __entry->vm, __entry->size, __entry->align,
540
		      __entry->flags & PIN_MAPPABLE ? ", mappable" : "")
C
Chris Wilson 已提交
541 542
);

543 544 545
TRACE_EVENT(i915_gem_evict_node,
	    TP_PROTO(struct i915_address_space *vm, struct drm_mm_node *node, unsigned int flags),
	    TP_ARGS(vm, node, flags),
546 547 548 549 550 551 552 553 554 555 556

	    TP_STRUCT__entry(
			     __field(u32, dev)
			     __field(struct i915_address_space *, vm)
			     __field(u64, start)
			     __field(u64, size)
			     __field(unsigned long, color)
			     __field(unsigned int, flags)
			    ),

	    TP_fast_assign(
557 558 559 560 561
			   __entry->dev = vm->i915->drm.primary->index;
			   __entry->vm = vm;
			   __entry->start = node->start;
			   __entry->size = node->size;
			   __entry->color = node->color;
562 563 564
			   __entry->flags = flags;
			  ),

565
	    TP_printk("dev=%d, vm=%p, start=0x%llx size=0x%llx, color=0x%lx, flags=%x",
566 567 568 569 570
		      __entry->dev, __entry->vm,
		      __entry->start, __entry->size,
		      __entry->color, __entry->flags)
);

571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587
TRACE_EVENT(i915_gem_evict_vm,
	    TP_PROTO(struct i915_address_space *vm),
	    TP_ARGS(vm),

	    TP_STRUCT__entry(
			     __field(u32, dev)
			     __field(struct i915_address_space *, vm)
			    ),

	    TP_fast_assign(
			   __entry->dev = vm->i915->drm.primary->index;
			   __entry->vm = vm;
			  ),

	    TP_printk("dev=%d, vm=%p", __entry->dev, __entry->vm)
);

588
TRACE_EVENT(i915_gem_ring_sync_to,
589
	    TP_PROTO(struct i915_request *to, struct i915_request *from),
590
	    TP_ARGS(to, from),
591 592 593 594 595 596 597 598 599

	    TP_STRUCT__entry(
			     __field(u32, dev)
			     __field(u32, sync_from)
			     __field(u32, sync_to)
			     __field(u32, seqno)
			     ),

	    TP_fast_assign(
600
			   __entry->dev = from->i915->drm.primary->index;
601 602
			   __entry->sync_from = from->engine->id;
			   __entry->sync_to = to->engine->id;
603
			   __entry->seqno = from->global_seqno;
604 605 606 607 608 609 610 611
			   ),

	    TP_printk("dev=%u, sync-from=%u, sync-to=%u, seqno=%u",
		      __entry->dev,
		      __entry->sync_from, __entry->sync_to,
		      __entry->seqno)
);

612 613 614
TRACE_EVENT(i915_request_queue,
	    TP_PROTO(struct i915_request *rq, u32 flags),
	    TP_ARGS(rq, flags),
C
Chris Wilson 已提交
615 616

	    TP_STRUCT__entry(
617
			     __field(u32, dev)
618
			     __field(u32, hw_id)
C
Chris Wilson 已提交
619
			     __field(u32, ring)
620
			     __field(u32, ctx)
C
Chris Wilson 已提交
621
			     __field(u32, seqno)
622
			     __field(u32, flags)
C
Chris Wilson 已提交
623 624 625
			     ),

	    TP_fast_assign(
626 627 628 629 630
			   __entry->dev = rq->i915->drm.primary->index;
			   __entry->hw_id = rq->ctx->hw_id;
			   __entry->ring = rq->engine->id;
			   __entry->ctx = rq->fence.context;
			   __entry->seqno = rq->fence.seqno;
631
			   __entry->flags = flags;
C
Chris Wilson 已提交
632 633
			   ),

634 635 636
	    TP_printk("dev=%u, hw_id=%u, ring=%u, ctx=%u, seqno=%u, flags=0x%x",
		      __entry->dev, __entry->hw_id, __entry->ring, __entry->ctx,
		      __entry->seqno, __entry->flags)
C
Chris Wilson 已提交
637 638
);

639 640 641
DECLARE_EVENT_CLASS(i915_request,
	    TP_PROTO(struct i915_request *rq),
	    TP_ARGS(rq),
C
Chris Wilson 已提交
642 643

	    TP_STRUCT__entry(
644
			     __field(u32, dev)
645
			     __field(u32, hw_id)
C
Chris Wilson 已提交
646
			     __field(u32, ring)
647
			     __field(u32, ctx)
C
Chris Wilson 已提交
648
			     __field(u32, seqno)
649
			     __field(u32, global)
C
Chris Wilson 已提交
650 651 652
			     ),

	    TP_fast_assign(
653 654 655 656 657 658
			   __entry->dev = rq->i915->drm.primary->index;
			   __entry->hw_id = rq->ctx->hw_id;
			   __entry->ring = rq->engine->id;
			   __entry->ctx = rq->fence.context;
			   __entry->seqno = rq->fence.seqno;
			   __entry->global = rq->global_seqno;
C
Chris Wilson 已提交
659 660
			   ),

661 662 663
	    TP_printk("dev=%u, hw_id=%u, ring=%u, ctx=%u, seqno=%u, global=%u",
		      __entry->dev, __entry->hw_id, __entry->ring, __entry->ctx,
		      __entry->seqno, __entry->global)
C
Chris Wilson 已提交
664 665
);

666 667 668
DEFINE_EVENT(i915_request, i915_request_add,
	    TP_PROTO(struct i915_request *rq),
	    TP_ARGS(rq)
C
Chris Wilson 已提交
669
);
C
Chris Wilson 已提交
670

671
#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS)
672 673 674
DEFINE_EVENT(i915_request, i915_request_submit,
	     TP_PROTO(struct i915_request *rq),
	     TP_ARGS(rq)
675 676
);

677 678 679
DEFINE_EVENT(i915_request, i915_request_execute,
	     TP_PROTO(struct i915_request *rq),
	     TP_ARGS(rq)
680
);
681

682 683 684 685 686 687 688 689 690 691 692 693 694 695
TRACE_EVENT(i915_request_in,
	    TP_PROTO(struct i915_request *rq, unsigned int port),
	    TP_ARGS(rq, port),

	    TP_STRUCT__entry(
			     __field(u32, dev)
			     __field(u32, hw_id)
			     __field(u32, ring)
			     __field(u32, ctx)
			     __field(u32, seqno)
			     __field(u32, global_seqno)
			     __field(u32, port)
			     __field(u32, prio)
			    ),
696

697 698 699 700 701 702 703 704 705 706 707 708 709 710 711
	    TP_fast_assign(
			   __entry->dev = rq->i915->drm.primary->index;
			   __entry->hw_id = rq->ctx->hw_id;
			   __entry->ring = rq->engine->id;
			   __entry->ctx = rq->fence.context;
			   __entry->seqno = rq->fence.seqno;
			   __entry->global_seqno = rq->global_seqno;
			   __entry->prio = rq->sched.attr.priority;
			   __entry->port = port;
			   ),

	    TP_printk("dev=%u, hw_id=%u, ring=%u, ctx=%u, seqno=%u, prio=%u, global=%u, port=%u",
		      __entry->dev, __entry->hw_id, __entry->ring, __entry->ctx,
		      __entry->seqno, __entry->prio, __entry->global_seqno,
		      __entry->port)
712 713
);

714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741
TRACE_EVENT(i915_request_out,
	    TP_PROTO(struct i915_request *rq),
	    TP_ARGS(rq),

	    TP_STRUCT__entry(
			     __field(u32, dev)
			     __field(u32, hw_id)
			     __field(u32, ring)
			     __field(u32, ctx)
			     __field(u32, seqno)
			     __field(u32, global_seqno)
			     __field(u32, completed)
			    ),

	    TP_fast_assign(
			   __entry->dev = rq->i915->drm.primary->index;
			   __entry->hw_id = rq->ctx->hw_id;
			   __entry->ring = rq->engine->id;
			   __entry->ctx = rq->fence.context;
			   __entry->seqno = rq->fence.seqno;
			   __entry->global_seqno = rq->global_seqno;
			   __entry->completed = i915_request_completed(rq);
			   ),

		    TP_printk("dev=%u, hw_id=%u, ring=%u, ctx=%u, seqno=%u, global=%u, completed?=%u",
			      __entry->dev, __entry->hw_id, __entry->ring,
			      __entry->ctx, __entry->seqno,
			      __entry->global_seqno, __entry->completed)
742
);
743

744 745 746
#else
#if !defined(TRACE_HEADER_MULTI_READ)
static inline void
747
trace_i915_request_submit(struct i915_request *rq)
748 749 750 751
{
}

static inline void
752
trace_i915_request_execute(struct i915_request *rq)
753 754
{
}
755 756

static inline void
757
trace_i915_request_in(struct i915_request *rq, unsigned int port)
758 759 760 761
{
}

static inline void
762
trace_i915_request_out(struct i915_request *rq)
763 764
{
}
765 766 767
#endif
#endif

768 769 770
TRACE_EVENT(intel_engine_notify,
	    TP_PROTO(struct intel_engine_cs *engine, bool waiters),
	    TP_ARGS(engine, waiters),
771 772 773 774 775

	    TP_STRUCT__entry(
			     __field(u32, dev)
			     __field(u32, ring)
			     __field(u32, seqno)
776
			     __field(bool, waiters)
777 778 779
			     ),

	    TP_fast_assign(
780
			   __entry->dev = engine->i915->drm.primary->index;
781
			   __entry->ring = engine->id;
782
			   __entry->seqno = intel_engine_get_seqno(engine);
783
			   __entry->waiters = waiters;
784 785
			   ),

786 787 788
	    TP_printk("dev=%u, ring=%u, seqno=%u, waiters=%u",
		      __entry->dev, __entry->ring, __entry->seqno,
		      __entry->waiters)
C
Chris Wilson 已提交
789 790
);

791 792 793
DEFINE_EVENT(i915_request, i915_request_retire,
	    TP_PROTO(struct i915_request *rq),
	    TP_ARGS(rq)
C
Chris Wilson 已提交
794 795
);

796 797 798
TRACE_EVENT(i915_request_wait_begin,
	    TP_PROTO(struct i915_request *rq, unsigned int flags),
	    TP_ARGS(rq, flags),
799 800 801

	    TP_STRUCT__entry(
			     __field(u32, dev)
802
			     __field(u32, hw_id)
803
			     __field(u32, ring)
804
			     __field(u32, ctx)
805
			     __field(u32, seqno)
806 807
			     __field(u32, global)
			     __field(unsigned int, flags)
808 809 810 811 812 813 814 815 816
			     ),

	    /* NB: the blocking information is racy since mutex_is_locked
	     * doesn't check that the current thread holds the lock. The only
	     * other option would be to pass the boolean information of whether
	     * or not the class was blocking down through the stack which is
	     * less desirable.
	     */
	    TP_fast_assign(
817 818 819 820 821 822
			   __entry->dev = rq->i915->drm.primary->index;
			   __entry->hw_id = rq->ctx->hw_id;
			   __entry->ring = rq->engine->id;
			   __entry->ctx = rq->fence.context;
			   __entry->seqno = rq->fence.seqno;
			   __entry->global = rq->global_seqno;
823
			   __entry->flags = flags;
824 825
			   ),

826 827 828 829
	    TP_printk("dev=%u, hw_id=%u, ring=%u, ctx=%u, seqno=%u, global=%u, blocking=%u, flags=0x%x",
		      __entry->dev, __entry->hw_id, __entry->ring, __entry->ctx,
		      __entry->seqno, __entry->global,
		      !!(__entry->flags & I915_WAIT_LOCKED), __entry->flags)
830
);
C
Chris Wilson 已提交
831

832 833 834
DEFINE_EVENT(i915_request, i915_request_wait_end,
	    TP_PROTO(struct i915_request *rq),
	    TP_ARGS(rq)
C
Chris Wilson 已提交
835 836
);

837
TRACE_EVENT_CONDITION(i915_reg_rw,
838
	TP_PROTO(bool write, i915_reg_t reg, u64 val, int len, bool trace),
839

840 841 842
	TP_ARGS(write, reg, val, len, trace),

	TP_CONDITION(trace),
843 844 845 846 847 848 849 850 851 852

	TP_STRUCT__entry(
		__field(u64, val)
		__field(u32, reg)
		__field(u16, write)
		__field(u16, len)
		),

	TP_fast_assign(
		__entry->val = (u64)val;
853
		__entry->reg = i915_mmio_reg_offset(reg);
854 855 856 857 858 859 860 861 862
		__entry->write = write;
		__entry->len = len;
		),

	TP_printk("%s reg=0x%x, len=%d, val=(0x%x, 0x%x)",
		__entry->write ? "write" : "read",
		__entry->reg, __entry->len,
		(u32)(__entry->val & 0xffffffff),
		(u32)(__entry->val >> 32))
863 864
);

865 866 867 868 869 870 871 872 873 874 875 876 877 878 879
TRACE_EVENT(intel_gpu_freq_change,
	    TP_PROTO(u32 freq),
	    TP_ARGS(freq),

	    TP_STRUCT__entry(
			     __field(u32, freq)
			     ),

	    TP_fast_assign(
			   __entry->freq = freq;
			   ),

	    TP_printk("new_freq=%u", __entry->freq)
);

880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900
/**
 * DOC: i915_ppgtt_create and i915_ppgtt_release tracepoints
 *
 * With full ppgtt enabled each process using drm will allocate at least one
 * translation table. With these traces it is possible to keep track of the
 * allocation and of the lifetime of the tables; this can be used during
 * testing/debug to verify that we are not leaking ppgtts.
 * These traces identify the ppgtt through the vm pointer, which is also printed
 * by the i915_vma_bind and i915_vma_unbind tracepoints.
 */
DECLARE_EVENT_CLASS(i915_ppgtt,
	TP_PROTO(struct i915_address_space *vm),
	TP_ARGS(vm),

	TP_STRUCT__entry(
			__field(struct i915_address_space *, vm)
			__field(u32, dev)
	),

	TP_fast_assign(
			__entry->vm = vm;
901
			__entry->dev = vm->i915->drm.primary->index;
902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924
	),

	TP_printk("dev=%u, vm=%p", __entry->dev, __entry->vm)
)

DEFINE_EVENT(i915_ppgtt, i915_ppgtt_create,
	TP_PROTO(struct i915_address_space *vm),
	TP_ARGS(vm)
);

DEFINE_EVENT(i915_ppgtt, i915_ppgtt_release,
	TP_PROTO(struct i915_address_space *vm),
	TP_ARGS(vm)
);

/**
 * DOC: i915_context_create and i915_context_free tracepoints
 *
 * These tracepoints are used to track creation and deletion of contexts.
 * If full ppgtt is enabled, they also print the address of the vm assigned to
 * the context.
 */
DECLARE_EVENT_CLASS(i915_context,
925
	TP_PROTO(struct i915_gem_context *ctx),
926 927 928 929
	TP_ARGS(ctx),

	TP_STRUCT__entry(
			__field(u32, dev)
930
			__field(struct i915_gem_context *, ctx)
931
			__field(u32, hw_id)
932 933 934 935
			__field(struct i915_address_space *, vm)
	),

	TP_fast_assign(
936
			__entry->dev = ctx->i915->drm.primary->index;
937
			__entry->ctx = ctx;
938
			__entry->hw_id = ctx->hw_id;
939 940 941
			__entry->vm = ctx->ppgtt ? &ctx->ppgtt->base : NULL;
	),

942 943
	TP_printk("dev=%u, ctx=%p, ctx_vm=%p, hw_id=%u",
		  __entry->dev, __entry->ctx, __entry->vm, __entry->hw_id)
944 945 946
)

DEFINE_EVENT(i915_context, i915_context_create,
947
	TP_PROTO(struct i915_gem_context *ctx),
948 949 950 951
	TP_ARGS(ctx)
);

DEFINE_EVENT(i915_context, i915_context_free,
952
	TP_PROTO(struct i915_gem_context *ctx),
953 954 955 956 957 958 959 960 961 962 963
	TP_ARGS(ctx)
);

/**
 * DOC: switch_mm tracepoint
 *
 * This tracepoint allows tracking of the mm switch, which is an important point
 * in the lifetime of the vm in the legacy submission path. This tracepoint is
 * called only if full ppgtt is enabled.
 */
TRACE_EVENT(switch_mm,
964
	TP_PROTO(struct intel_engine_cs *engine, struct i915_gem_context *to),
965

966
	TP_ARGS(engine, to),
967 968 969

	TP_STRUCT__entry(
			__field(u32, ring)
970
			__field(struct i915_gem_context *, to)
971 972 973 974 975
			__field(struct i915_address_space *, vm)
			__field(u32, dev)
	),

	TP_fast_assign(
976
			__entry->ring = engine->id;
977 978
			__entry->to = to;
			__entry->vm = to->ppgtt? &to->ppgtt->base : NULL;
979
			__entry->dev = engine->i915->drm.primary->index;
980 981 982 983 984 985
	),

	TP_printk("dev=%u, ring=%u, ctx=%p, ctx_vm=%p",
		  __entry->dev, __entry->ring, __entry->to, __entry->vm)
);

C
Chris Wilson 已提交
986 987 988 989
#endif /* _I915_TRACE_H_ */

/* This part must be outside protection */
#undef TRACE_INCLUDE_PATH
990
#define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/i915
C
Chris Wilson 已提交
991
#include <trace/define_trace.h>