i915_trace.h 25.1 KB
Newer Older
C
Chris Wilson 已提交
1 2 3 4 5 6 7 8
#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>
9
#include "i915_drv.h"
10
#include "intel_drv.h"
C
Chris Wilson 已提交
11
#include "intel_ringbuffer.h"
C
Chris Wilson 已提交
12 13 14 15 16

#undef TRACE_SYSTEM
#define TRACE_SYSTEM i915
#define TRACE_INCLUDE_FILE i915_trace

17 18
/* watermark/fifo updates */

19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
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])
);

49 50 51 52 53 54 55 56 57 58 59 60 61 62 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 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
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)
);

118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 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
/* 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)
);

174 175 176
/* pipe updates */

TRACE_EVENT(i915_pipe_update_start,
177 178
	    TP_PROTO(struct intel_crtc *crtc),
	    TP_ARGS(crtc),
179 180 181 182 183 184 185 186 187 188 189 190 191 192

	    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);
193 194
			   __entry->min = crtc->debug.min_vbl;
			   __entry->max = crtc->debug.max_vbl;
195 196 197 198 199 200 201 202
			   ),

	    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,
203 204
	    TP_PROTO(struct intel_crtc *crtc),
	    TP_ARGS(crtc),
205 206 207 208 209 210 211 212 213 214 215

	    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;
216 217 218 219
			   __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;
220 221 222 223 224 225 226 227
			   ),

	    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,
228 229
	    TP_PROTO(struct intel_crtc *crtc, u32 frame, int scanline_end),
	    TP_ARGS(crtc, frame, scanline_end),
230 231 232 233 234 235 236 237 238 239

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

	    TP_fast_assign(
			   __entry->pipe = crtc->pipe;
			   __entry->frame = frame;
240
			   __entry->scanline = scanline_end;
241 242 243 244 245 246 247
			   ),

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

C
Chris Wilson 已提交
248 249 250
/* object tracking */

TRACE_EVENT(i915_gem_object_create,
251
	    TP_PROTO(struct drm_i915_gem_object *obj),
C
Chris Wilson 已提交
252 253 254
	    TP_ARGS(obj),

	    TP_STRUCT__entry(
255
			     __field(struct drm_i915_gem_object *, obj)
C
Chris Wilson 已提交
256 257 258 259 260
			     __field(u32, size)
			     ),

	    TP_fast_assign(
			   __entry->obj = obj;
261
			   __entry->size = obj->base.size;
C
Chris Wilson 已提交
262 263 264 265 266
			   ),

	    TP_printk("obj=%p, size=%u", __entry->obj, __entry->size)
);

267 268 269 270 271 272 273 274 275 276 277
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(
278
			   __entry->dev = i915->drm.primary->index;
279 280 281 282 283 284 285 286
			   __entry->target = target;
			   __entry->flags = flags;
			   ),

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

287
TRACE_EVENT(i915_vma_bind,
288 289
	    TP_PROTO(struct i915_vma *vma, unsigned flags),
	    TP_ARGS(vma, flags),
C
Chris Wilson 已提交
290 291

	    TP_STRUCT__entry(
292
			     __field(struct drm_i915_gem_object *, obj)
293
			     __field(struct i915_address_space *, vm)
294
			     __field(u64, offset)
C
Chris Wilson 已提交
295
			     __field(u32, size)
296
			     __field(unsigned, flags)
C
Chris Wilson 已提交
297 298 299
			     ),

	    TP_fast_assign(
300 301 302 303
			   __entry->obj = vma->obj;
			   __entry->vm = vma->vm;
			   __entry->offset = vma->node.start;
			   __entry->size = vma->node.size;
304
			   __entry->flags = flags;
C
Chris Wilson 已提交
305 306
			   ),

307
	    TP_printk("obj=%p, offset=%016llx size=%x%s vm=%p",
C
Chris Wilson 已提交
308
		      __entry->obj, __entry->offset, __entry->size,
309
		      __entry->flags & PIN_MAPPABLE ? ", mappable" : "",
310
		      __entry->vm)
C
Chris Wilson 已提交
311 312
);

313 314 315
TRACE_EVENT(i915_vma_unbind,
	    TP_PROTO(struct i915_vma *vma),
	    TP_ARGS(vma),
C
Chris Wilson 已提交
316 317 318

	    TP_STRUCT__entry(
			     __field(struct drm_i915_gem_object *, obj)
319
			     __field(struct i915_address_space *, vm)
320
			     __field(u64, offset)
C
Chris Wilson 已提交
321 322
			     __field(u32, size)
			     ),
C
Chris Wilson 已提交
323

C
Chris Wilson 已提交
324
	    TP_fast_assign(
325 326 327 328
			   __entry->obj = vma->obj;
			   __entry->vm = vma->vm;
			   __entry->offset = vma->node.start;
			   __entry->size = vma->node.size;
C
Chris Wilson 已提交
329
			   ),
C
Chris Wilson 已提交
330

331
	    TP_printk("obj=%p, offset=%016llx size=%x vm=%p",
332
		      __entry->obj, __entry->offset, __entry->size, __entry->vm)
C
Chris Wilson 已提交
333 334 335 336 337
);

TRACE_EVENT(i915_gem_object_pwrite,
	    TP_PROTO(struct drm_i915_gem_object *obj, u32 offset, u32 len),
	    TP_ARGS(obj, offset, len),
C
Chris Wilson 已提交
338

C
Chris Wilson 已提交
339 340 341 342 343
	    TP_STRUCT__entry(
			     __field(struct drm_i915_gem_object *, obj)
			     __field(u32, offset)
			     __field(u32, len)
			     ),
C
Chris Wilson 已提交
344

C
Chris Wilson 已提交
345 346 347 348 349 350 351 352 353 354 355 356 357
	    TP_fast_assign(
			   __entry->obj = obj;
			   __entry->offset = offset;
			   __entry->len = len;
			   ),

	    TP_printk("obj=%p, offset=%u, len=%u",
		      __entry->obj, __entry->offset, __entry->len)
);

TRACE_EVENT(i915_gem_object_pread,
	    TP_PROTO(struct drm_i915_gem_object *obj, u32 offset, u32 len),
	    TP_ARGS(obj, offset, len),
C
Chris Wilson 已提交
358 359

	    TP_STRUCT__entry(
360
			     __field(struct drm_i915_gem_object *, obj)
C
Chris Wilson 已提交
361 362
			     __field(u32, offset)
			     __field(u32, len)
C
Chris Wilson 已提交
363 364 365 366
			     ),

	    TP_fast_assign(
			   __entry->obj = obj;
C
Chris Wilson 已提交
367 368
			   __entry->offset = offset;
			   __entry->len = len;
C
Chris Wilson 已提交
369 370
			   ),

C
Chris Wilson 已提交
371 372
	    TP_printk("obj=%p, offset=%u, len=%u",
		      __entry->obj, __entry->offset, __entry->len)
C
Chris Wilson 已提交
373 374
);

C
Chris Wilson 已提交
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
TRACE_EVENT(i915_gem_object_fault,
	    TP_PROTO(struct drm_i915_gem_object *obj, u32 index, bool gtt, bool write),
	    TP_ARGS(obj, index, gtt, write),

	    TP_STRUCT__entry(
			     __field(struct drm_i915_gem_object *, obj)
			     __field(u32, index)
			     __field(bool, gtt)
			     __field(bool, write)
			     ),

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

C
Chris Wilson 已提交
393 394 395 396 397 398 399 400
	    TP_printk("obj=%p, %s index=%u %s",
		      __entry->obj,
		      __entry->gtt ? "GTT" : "CPU",
		      __entry->index,
		      __entry->write ? ", writable" : "")
);

DECLARE_EVENT_CLASS(i915_gem_object,
401
	    TP_PROTO(struct drm_i915_gem_object *obj),
C
Chris Wilson 已提交
402
	    TP_ARGS(obj),
403

C
Chris Wilson 已提交
404 405 406 407 408 409 410 411 412
	    TP_STRUCT__entry(
			     __field(struct drm_i915_gem_object *, obj)
			     ),

	    TP_fast_assign(
			   __entry->obj = obj;
			   ),

	    TP_printk("obj=%p", __entry->obj)
413 414
);

C
Chris Wilson 已提交
415 416 417 418
DEFINE_EVENT(i915_gem_object, i915_gem_object_clflush,
	     TP_PROTO(struct drm_i915_gem_object *obj),
	     TP_ARGS(obj)
);
C
Chris Wilson 已提交
419

C
Chris Wilson 已提交
420
DEFINE_EVENT(i915_gem_object, i915_gem_object_destroy,
421
	    TP_PROTO(struct drm_i915_gem_object *obj),
422 423
	    TP_ARGS(obj)
);
C
Chris Wilson 已提交
424

C
Chris Wilson 已提交
425
TRACE_EVENT(i915_gem_evict,
426 427
	    TP_PROTO(struct i915_address_space *vm, u32 size, u32 align, unsigned int flags),
	    TP_ARGS(vm, size, align, flags),
C
Chris Wilson 已提交
428

C
Chris Wilson 已提交
429 430
	    TP_STRUCT__entry(
			     __field(u32, dev)
431
			     __field(struct i915_address_space *, vm)
C
Chris Wilson 已提交
432 433
			     __field(u32, size)
			     __field(u32, align)
434
			     __field(unsigned int, flags)
C
Chris Wilson 已提交
435
			    ),
C
Chris Wilson 已提交
436

C
Chris Wilson 已提交
437
	    TP_fast_assign(
438
			   __entry->dev = vm->i915->drm.primary->index;
439
			   __entry->vm = vm;
C
Chris Wilson 已提交
440 441
			   __entry->size = size;
			   __entry->align = align;
442
			   __entry->flags = flags;
C
Chris Wilson 已提交
443 444
			  ),

445 446
	    TP_printk("dev=%d, vm=%p, size=%d, align=%d %s",
		      __entry->dev, __entry->vm, __entry->size, __entry->align,
447
		      __entry->flags & PIN_MAPPABLE ? ", mappable" : "")
C
Chris Wilson 已提交
448 449
);

C
Chris Wilson 已提交
450
TRACE_EVENT(i915_gem_evict_everything,
C
Chris Wilson 已提交
451 452
	    TP_PROTO(struct drm_device *dev),
	    TP_ARGS(dev),
C
Chris Wilson 已提交
453

C
Chris Wilson 已提交
454 455 456 457 458 459 460
	    TP_STRUCT__entry(
			     __field(u32, dev)
			    ),

	    TP_fast_assign(
			   __entry->dev = dev->primary->index;
			  ),
C
Chris Wilson 已提交
461

C
Chris Wilson 已提交
462
	    TP_printk("dev=%d", __entry->dev)
C
Chris Wilson 已提交
463
);
C
Chris Wilson 已提交
464

465 466 467 468 469
TRACE_EVENT(i915_gem_evict_vm,
	    TP_PROTO(struct i915_address_space *vm),
	    TP_ARGS(vm),

	    TP_STRUCT__entry(
470
			     __field(u32, dev)
471 472 473 474
			     __field(struct i915_address_space *, vm)
			    ),

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

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

482 483 484
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),
485 486 487 488 489 490 491 492 493 494 495

	    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(
496 497 498 499 500
			   __entry->dev = vm->i915->drm.primary->index;
			   __entry->vm = vm;
			   __entry->start = node->start;
			   __entry->size = node->size;
			   __entry->color = node->color;
501 502 503 504 505 506 507 508 509
			   __entry->flags = flags;
			  ),

	    TP_printk("dev=%d, vm=%p, start=%llx size=%llx, color=%lx, flags=%x",
		      __entry->dev, __entry->vm,
		      __entry->start, __entry->size,
		      __entry->color, __entry->flags)
);

510
TRACE_EVENT(i915_gem_ring_sync_to,
511 512 513
	    TP_PROTO(struct drm_i915_gem_request *to,
		     struct drm_i915_gem_request *from),
	    TP_ARGS(to, from),
514 515 516 517 518 519 520 521 522

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

	    TP_fast_assign(
523
			   __entry->dev = from->i915->drm.primary->index;
524 525
			   __entry->sync_from = from->engine->id;
			   __entry->sync_to = to->engine->id;
526
			   __entry->seqno = from->global_seqno;
527 528 529 530 531 532 533 534
			   ),

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

535
TRACE_EVENT(i915_gem_request_queue,
536 537
	    TP_PROTO(struct drm_i915_gem_request *req, u32 flags),
	    TP_ARGS(req, flags),
C
Chris Wilson 已提交
538 539

	    TP_STRUCT__entry(
540
			     __field(u32, dev)
C
Chris Wilson 已提交
541
			     __field(u32, ring)
542
			     __field(u32, ctx)
C
Chris Wilson 已提交
543
			     __field(u32, seqno)
544
			     __field(u32, flags)
C
Chris Wilson 已提交
545 546 547
			     ),

	    TP_fast_assign(
548
			   __entry->dev = req->i915->drm.primary->index;
549
			   __entry->ring = req->engine->id;
550 551
			   __entry->ctx = req->ctx->hw_id;
			   __entry->seqno = req->fence.seqno;
552
			   __entry->flags = flags;
C
Chris Wilson 已提交
553 554
			   ),

555 556 557
	    TP_printk("dev=%u, ring=%u, ctx=%u, seqno=%u, flags=0x%x",
		      __entry->dev, __entry->ring, __entry->ctx, __entry->seqno,
		      __entry->flags)
C
Chris Wilson 已提交
558 559
);

C
Chris Wilson 已提交
560
TRACE_EVENT(i915_gem_ring_flush,
561 562
	    TP_PROTO(struct drm_i915_gem_request *req, u32 invalidate, u32 flush),
	    TP_ARGS(req, invalidate, flush),
C
Chris Wilson 已提交
563 564

	    TP_STRUCT__entry(
565
			     __field(u32, dev)
C
Chris Wilson 已提交
566 567 568
			     __field(u32, ring)
			     __field(u32, invalidate)
			     __field(u32, flush)
C
Chris Wilson 已提交
569 570 571
			     ),

	    TP_fast_assign(
572
			   __entry->dev = req->i915->drm.primary->index;
573
			   __entry->ring = req->engine->id;
C
Chris Wilson 已提交
574 575
			   __entry->invalidate = invalidate;
			   __entry->flush = flush;
C
Chris Wilson 已提交
576 577
			   ),

C
Chris Wilson 已提交
578 579 580
	    TP_printk("dev=%u, ring=%x, invalidate=%04x, flush=%04x",
		      __entry->dev, __entry->ring,
		      __entry->invalidate, __entry->flush)
C
Chris Wilson 已提交
581 582
);

583
DECLARE_EVENT_CLASS(i915_gem_request,
584 585
	    TP_PROTO(struct drm_i915_gem_request *req),
	    TP_ARGS(req),
C
Chris Wilson 已提交
586 587

	    TP_STRUCT__entry(
588
			     __field(u32, dev)
589
			     __field(u32, ctx)
C
Chris Wilson 已提交
590
			     __field(u32, ring)
C
Chris Wilson 已提交
591
			     __field(u32, seqno)
592
			     __field(u32, global)
C
Chris Wilson 已提交
593 594 595
			     ),

	    TP_fast_assign(
596
			   __entry->dev = req->i915->drm.primary->index;
597
			   __entry->ctx = req->ctx->hw_id;
598
			   __entry->ring = req->engine->id;
599 600
			   __entry->seqno = req->fence.seqno;
			   __entry->global = req->global_seqno;
C
Chris Wilson 已提交
601 602
			   ),

603 604 605
	    TP_printk("dev=%u, ring=%u, ctx=%u, seqno=%u, global=%u",
		      __entry->dev, __entry->ring, __entry->ctx, __entry->seqno,
		      __entry->global)
C
Chris Wilson 已提交
606 607
);

C
Chris Wilson 已提交
608
DEFINE_EVENT(i915_gem_request, i915_gem_request_add,
609 610
	    TP_PROTO(struct drm_i915_gem_request *req),
	    TP_ARGS(req)
C
Chris Wilson 已提交
611
);
C
Chris Wilson 已提交
612

613 614 615 616 617 618 619 620 621 622
#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS)
DEFINE_EVENT(i915_gem_request, i915_gem_request_submit,
	     TP_PROTO(struct drm_i915_gem_request *req),
	     TP_ARGS(req)
);

DEFINE_EVENT(i915_gem_request, i915_gem_request_execute,
	     TP_PROTO(struct drm_i915_gem_request *req),
	     TP_ARGS(req)
);
623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661

DECLARE_EVENT_CLASS(i915_gem_request_hw,
		    TP_PROTO(struct drm_i915_gem_request *req,
			     unsigned int port),
		    TP_ARGS(req, port),

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

		    TP_fast_assign(
			           __entry->dev = req->i915->drm.primary->index;
			           __entry->ring = req->engine->id;
			           __entry->ctx = req->ctx->hw_id;
			           __entry->seqno = req->fence.seqno;
			           __entry->global_seqno = req->global_seqno;
			           __entry->port = port;
			          ),

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

DEFINE_EVENT(i915_gem_request_hw, i915_gem_request_in,
	     TP_PROTO(struct drm_i915_gem_request *req, unsigned int port),
	     TP_ARGS(req, port)
);

DEFINE_EVENT(i915_gem_request, i915_gem_request_out,
	     TP_PROTO(struct drm_i915_gem_request *req),
	     TP_ARGS(req)
);
662 663 664 665 666 667 668 669 670 671 672
#else
#if !defined(TRACE_HEADER_MULTI_READ)
static inline void
trace_i915_gem_request_submit(struct drm_i915_gem_request *req)
{
}

static inline void
trace_i915_gem_request_execute(struct drm_i915_gem_request *req)
{
}
673 674 675 676 677 678 679 680 681 682

static inline void
trace_i915_gem_request_in(struct drm_i915_gem_request *req, unsigned int port)
{
}

static inline void
trace_i915_gem_request_out(struct drm_i915_gem_request *req)
{
}
683 684 685
#endif
#endif

686 687 688
TRACE_EVENT(intel_engine_notify,
	    TP_PROTO(struct intel_engine_cs *engine, bool waiters),
	    TP_ARGS(engine, waiters),
689 690 691 692 693

	    TP_STRUCT__entry(
			     __field(u32, dev)
			     __field(u32, ring)
			     __field(u32, seqno)
694
			     __field(bool, waiters)
695 696 697
			     ),

	    TP_fast_assign(
698
			   __entry->dev = engine->i915->drm.primary->index;
699
			   __entry->ring = engine->id;
700
			   __entry->seqno = intel_engine_get_seqno(engine);
701
			   __entry->waiters = waiters;
702 703
			   ),

704 705 706
	    TP_printk("dev=%u, ring=%u, seqno=%u, waiters=%u",
		      __entry->dev, __entry->ring, __entry->seqno,
		      __entry->waiters)
C
Chris Wilson 已提交
707 708
);

709
DEFINE_EVENT(i915_gem_request, i915_gem_request_retire,
710 711
	    TP_PROTO(struct drm_i915_gem_request *req),
	    TP_ARGS(req)
C
Chris Wilson 已提交
712 713
);

714
TRACE_EVENT(i915_gem_request_wait_begin,
715 716
	    TP_PROTO(struct drm_i915_gem_request *req, unsigned int flags),
	    TP_ARGS(req, flags),
717 718 719 720

	    TP_STRUCT__entry(
			     __field(u32, dev)
			     __field(u32, ring)
721
			     __field(u32, ctx)
722
			     __field(u32, seqno)
723 724
			     __field(u32, global)
			     __field(unsigned int, flags)
725 726 727 728 729 730 731 732 733
			     ),

	    /* 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(
734
			   __entry->dev = req->i915->drm.primary->index;
735
			   __entry->ring = req->engine->id;
736 737 738 739
			   __entry->ctx = req->ctx->hw_id;
			   __entry->seqno = req->fence.seqno;
			   __entry->global = req->global_seqno;
			   __entry->flags = flags;
740 741
			   ),

742 743 744 745
	    TP_printk("dev=%u, ring=%u, ctx=%u, seqno=%u, global=%u, blocking=%u, flags=0x%x",
		      __entry->dev, __entry->ring, __entry->ctx, __entry->seqno,
		      __entry->global, !!(__entry->flags & I915_WAIT_LOCKED),
		      __entry->flags)
746
);
C
Chris Wilson 已提交
747

748
DEFINE_EVENT(i915_gem_request, i915_gem_request_wait_end,
749 750
	    TP_PROTO(struct drm_i915_gem_request *req),
	    TP_ARGS(req)
C
Chris Wilson 已提交
751 752
);

753
TRACE_EVENT(i915_flip_request,
754
	    TP_PROTO(int plane, struct drm_i915_gem_object *obj),
755 756 757 758 759

	    TP_ARGS(plane, obj),

	    TP_STRUCT__entry(
		    __field(int, plane)
760
		    __field(struct drm_i915_gem_object *, obj)
761 762 763 764 765 766 767 768 769 770 771
		    ),

	    TP_fast_assign(
		    __entry->plane = plane;
		    __entry->obj = obj;
		    ),

	    TP_printk("plane=%d, obj=%p", __entry->plane, __entry->obj)
);

TRACE_EVENT(i915_flip_complete,
772
	    TP_PROTO(int plane, struct drm_i915_gem_object *obj),
773 774 775 776 777

	    TP_ARGS(plane, obj),

	    TP_STRUCT__entry(
		    __field(int, plane)
778
		    __field(struct drm_i915_gem_object *, obj)
779 780 781 782 783 784 785 786 787 788
		    ),

	    TP_fast_assign(
		    __entry->plane = plane;
		    __entry->obj = obj;
		    ),

	    TP_printk("plane=%d, obj=%p", __entry->plane, __entry->obj)
);

789
TRACE_EVENT_CONDITION(i915_reg_rw,
790
	TP_PROTO(bool write, i915_reg_t reg, u64 val, int len, bool trace),
791

792 793 794
	TP_ARGS(write, reg, val, len, trace),

	TP_CONDITION(trace),
795 796 797 798 799 800 801 802 803 804

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

	TP_fast_assign(
		__entry->val = (u64)val;
805
		__entry->reg = i915_mmio_reg_offset(reg);
806 807 808 809 810 811 812 813 814
		__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))
815 816
);

817 818 819 820 821 822 823 824 825 826 827 828 829 830 831
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)
);

832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852
/**
 * 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;
853
			__entry->dev = vm->i915->drm.primary->index;
854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876
	),

	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,
877
	TP_PROTO(struct i915_gem_context *ctx),
878 879 880 881
	TP_ARGS(ctx),

	TP_STRUCT__entry(
			__field(u32, dev)
882
			__field(struct i915_gem_context *, ctx)
883
			__field(u32, hw_id)
884 885 886 887
			__field(struct i915_address_space *, vm)
	),

	TP_fast_assign(
888
			__entry->dev = ctx->i915->drm.primary->index;
889
			__entry->ctx = ctx;
890
			__entry->hw_id = ctx->hw_id;
891 892 893
			__entry->vm = ctx->ppgtt ? &ctx->ppgtt->base : NULL;
	),

894 895
	TP_printk("dev=%u, ctx=%p, ctx_vm=%p, hw_id=%u",
		  __entry->dev, __entry->ctx, __entry->vm, __entry->hw_id)
896 897 898
)

DEFINE_EVENT(i915_context, i915_context_create,
899
	TP_PROTO(struct i915_gem_context *ctx),
900 901 902 903
	TP_ARGS(ctx)
);

DEFINE_EVENT(i915_context, i915_context_free,
904
	TP_PROTO(struct i915_gem_context *ctx),
905 906 907 908 909 910 911 912 913 914 915
	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,
916
	TP_PROTO(struct intel_engine_cs *engine, struct i915_gem_context *to),
917

918
	TP_ARGS(engine, to),
919 920 921

	TP_STRUCT__entry(
			__field(u32, ring)
922
			__field(struct i915_gem_context *, to)
923 924 925 926 927
			__field(struct i915_address_space *, vm)
			__field(u32, dev)
	),

	TP_fast_assign(
928
			__entry->ring = engine->id;
929 930
			__entry->to = to;
			__entry->vm = to->ppgtt? &to->ppgtt->base : NULL;
931
			__entry->dev = engine->i915->drm.primary->index;
932 933 934 935 936 937
	),

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

C
Chris Wilson 已提交
938 939 940 941
#endif /* _I915_TRACE_H_ */

/* This part must be outside protection */
#undef TRACE_INCLUDE_PATH
P
Peter Clifton 已提交
942
#define TRACE_INCLUDE_PATH .
C
Chris Wilson 已提交
943
#include <trace/define_trace.h>