i915_trace.h 18.5 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
2 3 4 5

#undef TRACE_SYSTEM
#define TRACE_SYSTEM i915

C
Chris Wilson 已提交
6 7 8 9 10 11 12
#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>

13 14
#include <drm/drm_drv.h>

15 16
#include "gt/intel_engine.h"

17
#include "i915_drv.h"
18
#include "i915_irq.h"
C
Chris Wilson 已提交
19 20 21 22

/* object tracking */

TRACE_EVENT(i915_gem_object_create,
23
	    TP_PROTO(struct drm_i915_gem_object *obj),
C
Chris Wilson 已提交
24 25 26
	    TP_ARGS(obj),

	    TP_STRUCT__entry(
27
			     __field(struct drm_i915_gem_object *, obj)
28
			     __field(u64, size)
C
Chris Wilson 已提交
29 30 31 32
			     ),

	    TP_fast_assign(
			   __entry->obj = obj;
33
			   __entry->size = obj->base.size;
C
Chris Wilson 已提交
34 35
			   ),

36
	    TP_printk("obj=%p, size=0x%llx", __entry->obj, __entry->size)
C
Chris Wilson 已提交
37 38
);

39 40 41 42 43 44 45 46 47 48 49
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(
50
			   __entry->dev = i915->drm.primary->index;
51 52 53 54 55 56 57 58
			   __entry->target = target;
			   __entry->flags = flags;
			   ),

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

59
TRACE_EVENT(i915_vma_bind,
60 61
	    TP_PROTO(struct i915_vma *vma, unsigned flags),
	    TP_ARGS(vma, flags),
C
Chris Wilson 已提交
62 63

	    TP_STRUCT__entry(
64
			     __field(struct drm_i915_gem_object *, obj)
65
			     __field(struct i915_address_space *, vm)
66
			     __field(u64, offset)
67
			     __field(u64, size)
68
			     __field(unsigned, flags)
C
Chris Wilson 已提交
69 70 71
			     ),

	    TP_fast_assign(
72 73 74 75
			   __entry->obj = vma->obj;
			   __entry->vm = vma->vm;
			   __entry->offset = vma->node.start;
			   __entry->size = vma->node.size;
76
			   __entry->flags = flags;
C
Chris Wilson 已提交
77 78
			   ),

79
	    TP_printk("obj=%p, offset=0x%016llx size=0x%llx%s vm=%p",
C
Chris Wilson 已提交
80
		      __entry->obj, __entry->offset, __entry->size,
81
		      __entry->flags & PIN_MAPPABLE ? ", mappable" : "",
82
		      __entry->vm)
C
Chris Wilson 已提交
83 84
);

85 86 87
TRACE_EVENT(i915_vma_unbind,
	    TP_PROTO(struct i915_vma *vma),
	    TP_ARGS(vma),
C
Chris Wilson 已提交
88 89 90

	    TP_STRUCT__entry(
			     __field(struct drm_i915_gem_object *, obj)
91
			     __field(struct i915_address_space *, vm)
92
			     __field(u64, offset)
93
			     __field(u64, size)
C
Chris Wilson 已提交
94
			     ),
C
Chris Wilson 已提交
95

C
Chris Wilson 已提交
96
	    TP_fast_assign(
97 98 99 100
			   __entry->obj = vma->obj;
			   __entry->vm = vma->vm;
			   __entry->offset = vma->node.start;
			   __entry->size = vma->node.size;
C
Chris Wilson 已提交
101
			   ),
C
Chris Wilson 已提交
102

103
	    TP_printk("obj=%p, offset=0x%016llx size=0x%llx vm=%p",
104
		      __entry->obj, __entry->offset, __entry->size, __entry->vm)
C
Chris Wilson 已提交
105 106 107
);

TRACE_EVENT(i915_gem_object_pwrite,
108
	    TP_PROTO(struct drm_i915_gem_object *obj, u64 offset, u64 len),
C
Chris Wilson 已提交
109
	    TP_ARGS(obj, offset, len),
C
Chris Wilson 已提交
110

C
Chris Wilson 已提交
111 112
	    TP_STRUCT__entry(
			     __field(struct drm_i915_gem_object *, obj)
113 114
			     __field(u64, offset)
			     __field(u64, len)
C
Chris Wilson 已提交
115
			     ),
C
Chris Wilson 已提交
116

C
Chris Wilson 已提交
117 118 119 120 121 122
	    TP_fast_assign(
			   __entry->obj = obj;
			   __entry->offset = offset;
			   __entry->len = len;
			   ),

123
	    TP_printk("obj=%p, offset=0x%llx, len=0x%llx",
C
Chris Wilson 已提交
124 125 126 127
		      __entry->obj, __entry->offset, __entry->len)
);

TRACE_EVENT(i915_gem_object_pread,
128
	    TP_PROTO(struct drm_i915_gem_object *obj, u64 offset, u64 len),
C
Chris Wilson 已提交
129
	    TP_ARGS(obj, offset, len),
C
Chris Wilson 已提交
130 131

	    TP_STRUCT__entry(
132
			     __field(struct drm_i915_gem_object *, obj)
133 134
			     __field(u64, offset)
			     __field(u64, len)
C
Chris Wilson 已提交
135 136 137 138
			     ),

	    TP_fast_assign(
			   __entry->obj = obj;
C
Chris Wilson 已提交
139 140
			   __entry->offset = offset;
			   __entry->len = len;
C
Chris Wilson 已提交
141 142
			   ),

143
	    TP_printk("obj=%p, offset=0x%llx, len=0x%llx",
C
Chris Wilson 已提交
144
		      __entry->obj, __entry->offset, __entry->len)
C
Chris Wilson 已提交
145 146
);

C
Chris Wilson 已提交
147
TRACE_EVENT(i915_gem_object_fault,
148
	    TP_PROTO(struct drm_i915_gem_object *obj, u64 index, bool gtt, bool write),
C
Chris Wilson 已提交
149 150 151 152
	    TP_ARGS(obj, index, gtt, write),

	    TP_STRUCT__entry(
			     __field(struct drm_i915_gem_object *, obj)
153
			     __field(u64, index)
C
Chris Wilson 已提交
154 155 156 157 158 159 160 161 162 163
			     __field(bool, gtt)
			     __field(bool, write)
			     ),

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

165
	    TP_printk("obj=%p, %s index=%llu %s",
C
Chris Wilson 已提交
166 167 168 169 170 171 172
		      __entry->obj,
		      __entry->gtt ? "GTT" : "CPU",
		      __entry->index,
		      __entry->write ? ", writable" : "")
);

DECLARE_EVENT_CLASS(i915_gem_object,
173
	    TP_PROTO(struct drm_i915_gem_object *obj),
C
Chris Wilson 已提交
174
	    TP_ARGS(obj),
175

C
Chris Wilson 已提交
176 177 178 179 180 181 182 183 184
	    TP_STRUCT__entry(
			     __field(struct drm_i915_gem_object *, obj)
			     ),

	    TP_fast_assign(
			   __entry->obj = obj;
			   ),

	    TP_printk("obj=%p", __entry->obj)
185 186
);

C
Chris Wilson 已提交
187 188 189 190
DEFINE_EVENT(i915_gem_object, i915_gem_object_clflush,
	     TP_PROTO(struct drm_i915_gem_object *obj),
	     TP_ARGS(obj)
);
C
Chris Wilson 已提交
191

C
Chris Wilson 已提交
192
DEFINE_EVENT(i915_gem_object, i915_gem_object_destroy,
193
	    TP_PROTO(struct drm_i915_gem_object *obj),
194 195
	    TP_ARGS(obj)
);
C
Chris Wilson 已提交
196

C
Chris Wilson 已提交
197
TRACE_EVENT(i915_gem_evict,
198
	    TP_PROTO(struct i915_address_space *vm, u64 size, u64 align, unsigned int flags),
199
	    TP_ARGS(vm, size, align, flags),
C
Chris Wilson 已提交
200

C
Chris Wilson 已提交
201 202
	    TP_STRUCT__entry(
			     __field(u32, dev)
203
			     __field(struct i915_address_space *, vm)
204 205
			     __field(u64, size)
			     __field(u64, align)
206
			     __field(unsigned int, flags)
C
Chris Wilson 已提交
207
			    ),
C
Chris Wilson 已提交
208

C
Chris Wilson 已提交
209
	    TP_fast_assign(
210
			   __entry->dev = vm->i915->drm.primary->index;
211
			   __entry->vm = vm;
C
Chris Wilson 已提交
212 213
			   __entry->size = size;
			   __entry->align = align;
214
			   __entry->flags = flags;
C
Chris Wilson 已提交
215 216
			  ),

217
	    TP_printk("dev=%d, vm=%p, size=0x%llx, align=0x%llx %s",
218
		      __entry->dev, __entry->vm, __entry->size, __entry->align,
219
		      __entry->flags & PIN_MAPPABLE ? ", mappable" : "")
C
Chris Wilson 已提交
220 221
);

222 223 224
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),
225 226 227 228 229 230 231 232 233 234 235

	    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(
236 237 238 239 240
			   __entry->dev = vm->i915->drm.primary->index;
			   __entry->vm = vm;
			   __entry->start = node->start;
			   __entry->size = node->size;
			   __entry->color = node->color;
241 242 243
			   __entry->flags = flags;
			  ),

244
	    TP_printk("dev=%d, vm=%p, start=0x%llx size=0x%llx, color=0x%lx, flags=%x",
245 246 247 248 249
		      __entry->dev, __entry->vm,
		      __entry->start, __entry->size,
		      __entry->color, __entry->flags)
);

250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
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)
);

267 268 269
TRACE_EVENT(i915_request_queue,
	    TP_PROTO(struct i915_request *rq, u32 flags),
	    TP_ARGS(rq, flags),
C
Chris Wilson 已提交
270 271

	    TP_STRUCT__entry(
272
			     __field(u32, dev)
273
			     __field(u64, ctx)
274 275
			     __field(u16, class)
			     __field(u16, instance)
C
Chris Wilson 已提交
276
			     __field(u32, seqno)
277
			     __field(u32, flags)
C
Chris Wilson 已提交
278 279 280
			     ),

	    TP_fast_assign(
281
			   __entry->dev = rq->engine->i915->drm.primary->index;
282
			   __entry->class = rq->engine->uabi_class;
283
			   __entry->instance = rq->engine->uabi_instance;
284 285
			   __entry->ctx = rq->fence.context;
			   __entry->seqno = rq->fence.seqno;
286
			   __entry->flags = flags;
C
Chris Wilson 已提交
287 288
			   ),

C
Chris Wilson 已提交
289
	    TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, flags=0x%x",
290
		      __entry->dev, __entry->class, __entry->instance,
C
Chris Wilson 已提交
291
		      __entry->ctx, __entry->seqno, __entry->flags)
C
Chris Wilson 已提交
292 293
);

294 295 296
DECLARE_EVENT_CLASS(i915_request,
	    TP_PROTO(struct i915_request *rq),
	    TP_ARGS(rq),
C
Chris Wilson 已提交
297 298

	    TP_STRUCT__entry(
299
			     __field(u32, dev)
300
			     __field(u64, ctx)
301 302
			     __field(u16, class)
			     __field(u16, instance)
C
Chris Wilson 已提交
303
			     __field(u32, seqno)
304
			     __field(u32, tail)
C
Chris Wilson 已提交
305 306 307
			     ),

	    TP_fast_assign(
308
			   __entry->dev = rq->engine->i915->drm.primary->index;
309
			   __entry->class = rq->engine->uabi_class;
310
			   __entry->instance = rq->engine->uabi_instance;
311 312
			   __entry->ctx = rq->fence.context;
			   __entry->seqno = rq->fence.seqno;
313
			   __entry->tail = rq->tail;
C
Chris Wilson 已提交
314 315
			   ),

316
	    TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, tail=%u",
317
		      __entry->dev, __entry->class, __entry->instance,
318
		      __entry->ctx, __entry->seqno, __entry->tail)
C
Chris Wilson 已提交
319 320
);

321
DEFINE_EVENT(i915_request, i915_request_add,
322 323
	     TP_PROTO(struct i915_request *rq),
	     TP_ARGS(rq)
C
Chris Wilson 已提交
324
);
C
Chris Wilson 已提交
325

326
#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS)
327 328 329 330 331
DEFINE_EVENT(i915_request, i915_request_guc_submit,
	     TP_PROTO(struct i915_request *rq),
	     TP_ARGS(rq)
);

332 333 334
DEFINE_EVENT(i915_request, i915_request_submit,
	     TP_PROTO(struct i915_request *rq),
	     TP_ARGS(rq)
335 336
);

337 338 339
DEFINE_EVENT(i915_request, i915_request_execute,
	     TP_PROTO(struct i915_request *rq),
	     TP_ARGS(rq)
340
);
341

342 343 344 345 346 347
TRACE_EVENT(i915_request_in,
	    TP_PROTO(struct i915_request *rq, unsigned int port),
	    TP_ARGS(rq, port),

	    TP_STRUCT__entry(
			     __field(u32, dev)
348
			     __field(u64, ctx)
349 350
			     __field(u16, class)
			     __field(u16, instance)
351 352
			     __field(u32, seqno)
			     __field(u32, port)
353
			     __field(s32, prio)
354
			    ),
355

356
	    TP_fast_assign(
357
			   __entry->dev = rq->engine->i915->drm.primary->index;
358
			   __entry->class = rq->engine->uabi_class;
359
			   __entry->instance = rq->engine->uabi_instance;
360 361 362 363 364 365
			   __entry->ctx = rq->fence.context;
			   __entry->seqno = rq->fence.seqno;
			   __entry->prio = rq->sched.attr.priority;
			   __entry->port = port;
			   ),

366
	    TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, prio=%d, port=%u",
367
		      __entry->dev, __entry->class, __entry->instance,
C
Chris Wilson 已提交
368
		      __entry->ctx, __entry->seqno,
369
		      __entry->prio, __entry->port)
370 371
);

372 373 374 375 376 377
TRACE_EVENT(i915_request_out,
	    TP_PROTO(struct i915_request *rq),
	    TP_ARGS(rq),

	    TP_STRUCT__entry(
			     __field(u32, dev)
378
			     __field(u64, ctx)
379 380
			     __field(u16, class)
			     __field(u16, instance)
381 382 383 384 385
			     __field(u32, seqno)
			     __field(u32, completed)
			    ),

	    TP_fast_assign(
386
			   __entry->dev = rq->engine->i915->drm.primary->index;
387
			   __entry->class = rq->engine->uabi_class;
388
			   __entry->instance = rq->engine->uabi_instance;
389 390 391 392 393
			   __entry->ctx = rq->fence.context;
			   __entry->seqno = rq->fence.seqno;
			   __entry->completed = i915_request_completed(rq);
			   ),

C
Chris Wilson 已提交
394
		    TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, completed?=%u",
395
			      __entry->dev, __entry->class, __entry->instance,
C
Chris Wilson 已提交
396
			      __entry->ctx, __entry->seqno, __entry->completed)
397
);
398

399 400 401 402 403 404 405 406
DECLARE_EVENT_CLASS(intel_context,
		    TP_PROTO(struct intel_context *ce),
		    TP_ARGS(ce),

		    TP_STRUCT__entry(
			     __field(u32, guc_id)
			     __field(int, pin_count)
			     __field(u32, sched_state)
407
			     __field(u8, guc_prio)
408 409 410
			     ),

		    TP_fast_assign(
411
			   __entry->guc_id = ce->guc_id.id;
412 413
			   __entry->pin_count = atomic_read(&ce->pin_count);
			   __entry->sched_state = ce->guc_state.sched_state;
414
			   __entry->guc_prio = ce->guc_state.prio;
415 416
			   ),

417
		    TP_printk("guc_id=%d, pin_count=%d sched_state=0x%x, guc_prio=%u",
418 419
			      __entry->guc_id, __entry->pin_count,
			      __entry->sched_state,
420 421 422 423 424 425
			      __entry->guc_prio)
);

DEFINE_EVENT(intel_context, intel_context_set_prio,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
426 427
);

428 429 430 431 432
DEFINE_EVENT(intel_context, intel_context_reset,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

433 434 435 436 437
DEFINE_EVENT(intel_context, intel_context_ban,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497
DEFINE_EVENT(intel_context, intel_context_register,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

DEFINE_EVENT(intel_context, intel_context_deregister,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

DEFINE_EVENT(intel_context, intel_context_deregister_done,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

DEFINE_EVENT(intel_context, intel_context_sched_enable,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

DEFINE_EVENT(intel_context, intel_context_sched_disable,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

DEFINE_EVENT(intel_context, intel_context_sched_done,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

DEFINE_EVENT(intel_context, intel_context_create,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

DEFINE_EVENT(intel_context, intel_context_fence_release,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

DEFINE_EVENT(intel_context, intel_context_free,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

DEFINE_EVENT(intel_context, intel_context_steal_guc_id,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

DEFINE_EVENT(intel_context, intel_context_do_pin,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

DEFINE_EVENT(intel_context, intel_context_do_unpin,
	     TP_PROTO(struct intel_context *ce),
	     TP_ARGS(ce)
);

498 499
#else
#if !defined(TRACE_HEADER_MULTI_READ)
500 501 502 503 504
static inline void
trace_i915_request_guc_submit(struct i915_request *rq)
{
}

505
static inline void
506
trace_i915_request_submit(struct i915_request *rq)
507 508 509 510
{
}

static inline void
511
trace_i915_request_execute(struct i915_request *rq)
512 513
{
}
514 515

static inline void
516
trace_i915_request_in(struct i915_request *rq, unsigned int port)
517 518 519 520
{
}

static inline void
521
trace_i915_request_out(struct i915_request *rq)
522 523
{
}
524

525 526 527 528 529
static inline void
trace_intel_context_set_prio(struct intel_context *ce)
{
}

530 531 532 533 534
static inline void
trace_intel_context_reset(struct intel_context *ce)
{
}

535 536 537 538 539
static inline void
trace_intel_context_ban(struct intel_context *ce)
{
}

540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598
static inline void
trace_intel_context_register(struct intel_context *ce)
{
}

static inline void
trace_intel_context_deregister(struct intel_context *ce)
{
}

static inline void
trace_intel_context_deregister_done(struct intel_context *ce)
{
}

static inline void
trace_intel_context_sched_enable(struct intel_context *ce)
{
}

static inline void
trace_intel_context_sched_disable(struct intel_context *ce)
{
}

static inline void
trace_intel_context_sched_done(struct intel_context *ce)
{
}

static inline void
trace_intel_context_create(struct intel_context *ce)
{
}

static inline void
trace_intel_context_fence_release(struct intel_context *ce)
{
}

static inline void
trace_intel_context_free(struct intel_context *ce)
{
}

static inline void
trace_intel_context_steal_guc_id(struct intel_context *ce)
{
}

static inline void
trace_intel_context_do_pin(struct intel_context *ce)
{
}

static inline void
trace_intel_context_do_unpin(struct intel_context *ce)
{
}
599 600 601
#endif
#endif

602 603 604
DEFINE_EVENT(i915_request, i915_request_retire,
	    TP_PROTO(struct i915_request *rq),
	    TP_ARGS(rq)
C
Chris Wilson 已提交
605 606
);

607 608 609
TRACE_EVENT(i915_request_wait_begin,
	    TP_PROTO(struct i915_request *rq, unsigned int flags),
	    TP_ARGS(rq, flags),
610 611 612

	    TP_STRUCT__entry(
			     __field(u32, dev)
613
			     __field(u64, ctx)
614 615
			     __field(u16, class)
			     __field(u16, instance)
616
			     __field(u32, seqno)
617
			     __field(unsigned int, flags)
618 619 620 621 622 623 624 625 626
			     ),

	    /* 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(
627
			   __entry->dev = rq->engine->i915->drm.primary->index;
628
			   __entry->class = rq->engine->uabi_class;
629
			   __entry->instance = rq->engine->uabi_instance;
630 631
			   __entry->ctx = rq->fence.context;
			   __entry->seqno = rq->fence.seqno;
632
			   __entry->flags = flags;
633 634
			   ),

C
Chris Wilson 已提交
635
	    TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, flags=0x%x",
636
		      __entry->dev, __entry->class, __entry->instance,
C
Chris Wilson 已提交
637
		      __entry->ctx, __entry->seqno,
638
		      __entry->flags)
639
);
C
Chris Wilson 已提交
640

641 642 643
DEFINE_EVENT(i915_request, i915_request_wait_end,
	    TP_PROTO(struct i915_request *rq),
	    TP_ARGS(rq)
C
Chris Wilson 已提交
644 645
);

646
TRACE_EVENT_CONDITION(i915_reg_rw,
647
	TP_PROTO(bool write, i915_reg_t reg, u64 val, int len, bool trace),
648

649 650 651
	TP_ARGS(write, reg, val, len, trace),

	TP_CONDITION(trace),
652 653 654 655 656 657 658 659 660 661

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

	TP_fast_assign(
		__entry->val = (u64)val;
662
		__entry->reg = i915_mmio_reg_offset(reg);
663 664 665 666 667 668 669 670 671
		__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))
672 673
);

674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
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)
);

689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
/**
 * 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;
710
			__entry->dev = vm->i915->drm.primary->index;
711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733
	),

	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,
734
	TP_PROTO(struct i915_gem_context *ctx),
735 736 737 738
	TP_ARGS(ctx),

	TP_STRUCT__entry(
			__field(u32, dev)
739
			__field(struct i915_gem_context *, ctx)
740 741 742 743
			__field(struct i915_address_space *, vm)
	),

	TP_fast_assign(
744
			__entry->dev = ctx->i915->drm.primary->index;
745
			__entry->ctx = ctx;
746
			__entry->vm = ctx->vm;
747 748
	),

C
Chris Wilson 已提交
749 750
	TP_printk("dev=%u, ctx=%p, ctx_vm=%p",
		  __entry->dev, __entry->ctx, __entry->vm)
751 752 753
)

DEFINE_EVENT(i915_context, i915_context_create,
754
	TP_PROTO(struct i915_gem_context *ctx),
755 756 757 758
	TP_ARGS(ctx)
);

DEFINE_EVENT(i915_context, i915_context_free,
759
	TP_PROTO(struct i915_gem_context *ctx),
760 761 762
	TP_ARGS(ctx)
);

C
Chris Wilson 已提交
763 764 765 766
#endif /* _I915_TRACE_H_ */

/* This part must be outside protection */
#undef TRACE_INCLUDE_PATH
767
#undef TRACE_INCLUDE_FILE
768
#define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/i915
769
#define TRACE_INCLUDE_FILE i915_trace
C
Chris Wilson 已提交
770
#include <trace/define_trace.h>