755 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2 3#undef TRACE_SYSTEM4#define TRACE_SYSTEM i9155 6#if !defined(_I915_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)7#define _I915_TRACE_H_8 9#include <linux/stringify.h>10#include <linux/types.h>11#include <linux/tracepoint.h>12 13#include <drm/drm_drv.h>14 15#include "gt/intel_engine.h"16 17#include "i915_drv.h"18 19/* object tracking */20 21TRACE_EVENT(i915_gem_object_create,22 TP_PROTO(struct drm_i915_gem_object *obj),23 TP_ARGS(obj),24 25 TP_STRUCT__entry(26 __field(struct drm_i915_gem_object *, obj)27 __field(u64, size)28 ),29 30 TP_fast_assign(31 __entry->obj = obj;32 __entry->size = obj->base.size;33 ),34 35 TP_printk("obj=%p, size=0x%llx", __entry->obj, __entry->size)36);37 38TRACE_EVENT(i915_gem_shrink,39 TP_PROTO(struct drm_i915_private *i915, unsigned long target, unsigned flags),40 TP_ARGS(i915, target, flags),41 42 TP_STRUCT__entry(43 __field(int, dev)44 __field(unsigned long, target)45 __field(unsigned, flags)46 ),47 48 TP_fast_assign(49 __entry->dev = i915->drm.primary->index;50 __entry->target = target;51 __entry->flags = flags;52 ),53 54 TP_printk("dev=%d, target=%lu, flags=%x",55 __entry->dev, __entry->target, __entry->flags)56);57 58TRACE_EVENT(i915_vma_bind,59 TP_PROTO(struct i915_vma *vma, unsigned flags),60 TP_ARGS(vma, flags),61 62 TP_STRUCT__entry(63 __field(struct drm_i915_gem_object *, obj)64 __field(struct i915_address_space *, vm)65 __field(u64, offset)66 __field(u64, size)67 __field(unsigned, flags)68 ),69 70 TP_fast_assign(71 __entry->obj = vma->obj;72 __entry->vm = vma->vm;73 __entry->offset = vma->node.start;74 __entry->size = vma->node.size;75 __entry->flags = flags;76 ),77 78 TP_printk("obj=%p, offset=0x%016llx size=0x%llx%s vm=%p",79 __entry->obj, __entry->offset, __entry->size,80 __entry->flags & PIN_MAPPABLE ? ", mappable" : "",81 __entry->vm)82);83 84TRACE_EVENT(i915_vma_unbind,85 TP_PROTO(struct i915_vma *vma),86 TP_ARGS(vma),87 88 TP_STRUCT__entry(89 __field(struct drm_i915_gem_object *, obj)90 __field(struct i915_address_space *, vm)91 __field(u64, offset)92 __field(u64, size)93 ),94 95 TP_fast_assign(96 __entry->obj = vma->obj;97 __entry->vm = vma->vm;98 __entry->offset = vma->node.start;99 __entry->size = vma->node.size;100 ),101 102 TP_printk("obj=%p, offset=0x%016llx size=0x%llx vm=%p",103 __entry->obj, __entry->offset, __entry->size, __entry->vm)104);105 106TRACE_EVENT(i915_gem_object_pwrite,107 TP_PROTO(struct drm_i915_gem_object *obj, u64 offset, u64 len),108 TP_ARGS(obj, offset, len),109 110 TP_STRUCT__entry(111 __field(struct drm_i915_gem_object *, obj)112 __field(u64, offset)113 __field(u64, len)114 ),115 116 TP_fast_assign(117 __entry->obj = obj;118 __entry->offset = offset;119 __entry->len = len;120 ),121 122 TP_printk("obj=%p, offset=0x%llx, len=0x%llx",123 __entry->obj, __entry->offset, __entry->len)124);125 126TRACE_EVENT(i915_gem_object_pread,127 TP_PROTO(struct drm_i915_gem_object *obj, u64 offset, u64 len),128 TP_ARGS(obj, offset, len),129 130 TP_STRUCT__entry(131 __field(struct drm_i915_gem_object *, obj)132 __field(u64, offset)133 __field(u64, len)134 ),135 136 TP_fast_assign(137 __entry->obj = obj;138 __entry->offset = offset;139 __entry->len = len;140 ),141 142 TP_printk("obj=%p, offset=0x%llx, len=0x%llx",143 __entry->obj, __entry->offset, __entry->len)144);145 146TRACE_EVENT(i915_gem_object_fault,147 TP_PROTO(struct drm_i915_gem_object *obj, u64 index, bool gtt, bool write),148 TP_ARGS(obj, index, gtt, write),149 150 TP_STRUCT__entry(151 __field(struct drm_i915_gem_object *, obj)152 __field(u64, index)153 __field(bool, gtt)154 __field(bool, write)155 ),156 157 TP_fast_assign(158 __entry->obj = obj;159 __entry->index = index;160 __entry->gtt = gtt;161 __entry->write = write;162 ),163 164 TP_printk("obj=%p, %s index=%llu %s",165 __entry->obj,166 __entry->gtt ? "GTT" : "CPU",167 __entry->index,168 __entry->write ? ", writable" : "")169);170 171DECLARE_EVENT_CLASS(i915_gem_object,172 TP_PROTO(struct drm_i915_gem_object *obj),173 TP_ARGS(obj),174 175 TP_STRUCT__entry(176 __field(struct drm_i915_gem_object *, obj)177 ),178 179 TP_fast_assign(180 __entry->obj = obj;181 ),182 183 TP_printk("obj=%p", __entry->obj)184);185 186DEFINE_EVENT(i915_gem_object, i915_gem_object_clflush,187 TP_PROTO(struct drm_i915_gem_object *obj),188 TP_ARGS(obj)189);190 191DEFINE_EVENT(i915_gem_object, i915_gem_object_destroy,192 TP_PROTO(struct drm_i915_gem_object *obj),193 TP_ARGS(obj)194);195 196TRACE_EVENT(i915_gem_evict,197 TP_PROTO(struct i915_address_space *vm, u64 size, u64 align, unsigned int flags),198 TP_ARGS(vm, size, align, flags),199 200 TP_STRUCT__entry(201 __field(u32, dev)202 __field(struct i915_address_space *, vm)203 __field(u64, size)204 __field(u64, align)205 __field(unsigned int, flags)206 ),207 208 TP_fast_assign(209 __entry->dev = vm->i915->drm.primary->index;210 __entry->vm = vm;211 __entry->size = size;212 __entry->align = align;213 __entry->flags = flags;214 ),215 216 TP_printk("dev=%d, vm=%p, size=0x%llx, align=0x%llx %s",217 __entry->dev, __entry->vm, __entry->size, __entry->align,218 __entry->flags & PIN_MAPPABLE ? ", mappable" : "")219);220 221TRACE_EVENT(i915_gem_evict_node,222 TP_PROTO(struct i915_address_space *vm, struct drm_mm_node *node, unsigned int flags),223 TP_ARGS(vm, node, flags),224 225 TP_STRUCT__entry(226 __field(u32, dev)227 __field(struct i915_address_space *, vm)228 __field(u64, start)229 __field(u64, size)230 __field(unsigned long, color)231 __field(unsigned int, flags)232 ),233 234 TP_fast_assign(235 __entry->dev = vm->i915->drm.primary->index;236 __entry->vm = vm;237 __entry->start = node->start;238 __entry->size = node->size;239 __entry->color = node->color;240 __entry->flags = flags;241 ),242 243 TP_printk("dev=%d, vm=%p, start=0x%llx size=0x%llx, color=0x%lx, flags=%x",244 __entry->dev, __entry->vm,245 __entry->start, __entry->size,246 __entry->color, __entry->flags)247);248 249TRACE_EVENT(i915_gem_evict_vm,250 TP_PROTO(struct i915_address_space *vm),251 TP_ARGS(vm),252 253 TP_STRUCT__entry(254 __field(u32, dev)255 __field(struct i915_address_space *, vm)256 ),257 258 TP_fast_assign(259 __entry->dev = vm->i915->drm.primary->index;260 __entry->vm = vm;261 ),262 263 TP_printk("dev=%d, vm=%p", __entry->dev, __entry->vm)264);265 266TRACE_EVENT(i915_request_queue,267 TP_PROTO(struct i915_request *rq, u32 flags),268 TP_ARGS(rq, flags),269 270 TP_STRUCT__entry(271 __field(u32, dev)272 __field(u64, ctx)273 __field(u16, class)274 __field(u16, instance)275 __field(u32, seqno)276 __field(u32, flags)277 ),278 279 TP_fast_assign(280 __entry->dev = rq->i915->drm.primary->index;281 __entry->class = rq->engine->uabi_class;282 __entry->instance = rq->engine->uabi_instance;283 __entry->ctx = rq->fence.context;284 __entry->seqno = rq->fence.seqno;285 __entry->flags = flags;286 ),287 288 TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, flags=0x%x",289 __entry->dev, __entry->class, __entry->instance,290 __entry->ctx, __entry->seqno, __entry->flags)291);292 293DECLARE_EVENT_CLASS(i915_request,294 TP_PROTO(struct i915_request *rq),295 TP_ARGS(rq),296 297 TP_STRUCT__entry(298 __field(u32, dev)299 __field(u64, ctx)300 __field(u16, class)301 __field(u16, instance)302 __field(u32, seqno)303 __field(u32, tail)304 ),305 306 TP_fast_assign(307 __entry->dev = rq->i915->drm.primary->index;308 __entry->class = rq->engine->uabi_class;309 __entry->instance = rq->engine->uabi_instance;310 __entry->ctx = rq->fence.context;311 __entry->seqno = rq->fence.seqno;312 __entry->tail = rq->tail;313 ),314 315 TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, tail=%u",316 __entry->dev, __entry->class, __entry->instance,317 __entry->ctx, __entry->seqno, __entry->tail)318);319 320DEFINE_EVENT(i915_request, i915_request_add,321 TP_PROTO(struct i915_request *rq),322 TP_ARGS(rq)323);324 325#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS)326DEFINE_EVENT(i915_request, i915_request_guc_submit,327 TP_PROTO(struct i915_request *rq),328 TP_ARGS(rq)329);330 331DEFINE_EVENT(i915_request, i915_request_submit,332 TP_PROTO(struct i915_request *rq),333 TP_ARGS(rq)334);335 336DEFINE_EVENT(i915_request, i915_request_execute,337 TP_PROTO(struct i915_request *rq),338 TP_ARGS(rq)339);340 341TRACE_EVENT(i915_request_in,342 TP_PROTO(struct i915_request *rq, unsigned int port),343 TP_ARGS(rq, port),344 345 TP_STRUCT__entry(346 __field(u32, dev)347 __field(u64, ctx)348 __field(u16, class)349 __field(u16, instance)350 __field(u32, seqno)351 __field(u32, port)352 __field(s32, prio)353 ),354 355 TP_fast_assign(356 __entry->dev = rq->i915->drm.primary->index;357 __entry->class = rq->engine->uabi_class;358 __entry->instance = rq->engine->uabi_instance;359 __entry->ctx = rq->fence.context;360 __entry->seqno = rq->fence.seqno;361 __entry->prio = rq->sched.attr.priority;362 __entry->port = port;363 ),364 365 TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, prio=%d, port=%u",366 __entry->dev, __entry->class, __entry->instance,367 __entry->ctx, __entry->seqno,368 __entry->prio, __entry->port)369);370 371TRACE_EVENT(i915_request_out,372 TP_PROTO(struct i915_request *rq),373 TP_ARGS(rq),374 375 TP_STRUCT__entry(376 __field(u32, dev)377 __field(u64, ctx)378 __field(u16, class)379 __field(u16, instance)380 __field(u32, seqno)381 __field(u32, completed)382 ),383 384 TP_fast_assign(385 __entry->dev = rq->i915->drm.primary->index;386 __entry->class = rq->engine->uabi_class;387 __entry->instance = rq->engine->uabi_instance;388 __entry->ctx = rq->fence.context;389 __entry->seqno = rq->fence.seqno;390 __entry->completed = i915_request_completed(rq);391 ),392 393 TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, completed?=%u",394 __entry->dev, __entry->class, __entry->instance,395 __entry->ctx, __entry->seqno, __entry->completed)396);397 398DECLARE_EVENT_CLASS(intel_context,399 TP_PROTO(struct intel_context *ce),400 TP_ARGS(ce),401 402 TP_STRUCT__entry(403 __field(u32, guc_id)404 __field(int, pin_count)405 __field(u32, sched_state)406 __field(u8, guc_prio)407 ),408 409 TP_fast_assign(410 __entry->guc_id = ce->guc_id.id;411 __entry->pin_count = atomic_read(&ce->pin_count);412 __entry->sched_state = ce->guc_state.sched_state;413 __entry->guc_prio = ce->guc_state.prio;414 ),415 416 TP_printk("guc_id=%d, pin_count=%d sched_state=0x%x, guc_prio=%u",417 __entry->guc_id, __entry->pin_count,418 __entry->sched_state,419 __entry->guc_prio)420);421 422DEFINE_EVENT(intel_context, intel_context_set_prio,423 TP_PROTO(struct intel_context *ce),424 TP_ARGS(ce)425);426 427DEFINE_EVENT(intel_context, intel_context_reset,428 TP_PROTO(struct intel_context *ce),429 TP_ARGS(ce)430);431 432DEFINE_EVENT(intel_context, intel_context_ban,433 TP_PROTO(struct intel_context *ce),434 TP_ARGS(ce)435);436 437DEFINE_EVENT(intel_context, intel_context_register,438 TP_PROTO(struct intel_context *ce),439 TP_ARGS(ce)440);441 442DEFINE_EVENT(intel_context, intel_context_deregister,443 TP_PROTO(struct intel_context *ce),444 TP_ARGS(ce)445);446 447DEFINE_EVENT(intel_context, intel_context_deregister_done,448 TP_PROTO(struct intel_context *ce),449 TP_ARGS(ce)450);451 452DEFINE_EVENT(intel_context, intel_context_sched_enable,453 TP_PROTO(struct intel_context *ce),454 TP_ARGS(ce)455);456 457DEFINE_EVENT(intel_context, intel_context_sched_disable,458 TP_PROTO(struct intel_context *ce),459 TP_ARGS(ce)460);461 462DEFINE_EVENT(intel_context, intel_context_sched_done,463 TP_PROTO(struct intel_context *ce),464 TP_ARGS(ce)465);466 467DEFINE_EVENT(intel_context, intel_context_create,468 TP_PROTO(struct intel_context *ce),469 TP_ARGS(ce)470);471 472DEFINE_EVENT(intel_context, intel_context_fence_release,473 TP_PROTO(struct intel_context *ce),474 TP_ARGS(ce)475);476 477DEFINE_EVENT(intel_context, intel_context_free,478 TP_PROTO(struct intel_context *ce),479 TP_ARGS(ce)480);481 482DEFINE_EVENT(intel_context, intel_context_steal_guc_id,483 TP_PROTO(struct intel_context *ce),484 TP_ARGS(ce)485);486 487DEFINE_EVENT(intel_context, intel_context_do_pin,488 TP_PROTO(struct intel_context *ce),489 TP_ARGS(ce)490);491 492DEFINE_EVENT(intel_context, intel_context_do_unpin,493 TP_PROTO(struct intel_context *ce),494 TP_ARGS(ce)495);496 497#else498#if !defined(TRACE_HEADER_MULTI_READ)499static inline void500trace_i915_request_guc_submit(struct i915_request *rq)501{502}503 504static inline void505trace_i915_request_submit(struct i915_request *rq)506{507}508 509static inline void510trace_i915_request_execute(struct i915_request *rq)511{512}513 514static inline void515trace_i915_request_in(struct i915_request *rq, unsigned int port)516{517}518 519static inline void520trace_i915_request_out(struct i915_request *rq)521{522}523 524static inline void525trace_intel_context_set_prio(struct intel_context *ce)526{527}528 529static inline void530trace_intel_context_reset(struct intel_context *ce)531{532}533 534static inline void535trace_intel_context_ban(struct intel_context *ce)536{537}538 539static inline void540trace_intel_context_register(struct intel_context *ce)541{542}543 544static inline void545trace_intel_context_deregister(struct intel_context *ce)546{547}548 549static inline void550trace_intel_context_deregister_done(struct intel_context *ce)551{552}553 554static inline void555trace_intel_context_sched_enable(struct intel_context *ce)556{557}558 559static inline void560trace_intel_context_sched_disable(struct intel_context *ce)561{562}563 564static inline void565trace_intel_context_sched_done(struct intel_context *ce)566{567}568 569static inline void570trace_intel_context_create(struct intel_context *ce)571{572}573 574static inline void575trace_intel_context_fence_release(struct intel_context *ce)576{577}578 579static inline void580trace_intel_context_free(struct intel_context *ce)581{582}583 584static inline void585trace_intel_context_steal_guc_id(struct intel_context *ce)586{587}588 589static inline void590trace_intel_context_do_pin(struct intel_context *ce)591{592}593 594static inline void595trace_intel_context_do_unpin(struct intel_context *ce)596{597}598#endif599#endif600 601DEFINE_EVENT(i915_request, i915_request_retire,602 TP_PROTO(struct i915_request *rq),603 TP_ARGS(rq)604);605 606TRACE_EVENT(i915_request_wait_begin,607 TP_PROTO(struct i915_request *rq, unsigned int flags),608 TP_ARGS(rq, flags),609 610 TP_STRUCT__entry(611 __field(u32, dev)612 __field(u64, ctx)613 __field(u16, class)614 __field(u16, instance)615 __field(u32, seqno)616 __field(unsigned int, flags)617 ),618 619 /* NB: the blocking information is racy since mutex_is_locked620 * doesn't check that the current thread holds the lock. The only621 * other option would be to pass the boolean information of whether622 * or not the class was blocking down through the stack which is623 * less desirable.624 */625 TP_fast_assign(626 __entry->dev = rq->i915->drm.primary->index;627 __entry->class = rq->engine->uabi_class;628 __entry->instance = rq->engine->uabi_instance;629 __entry->ctx = rq->fence.context;630 __entry->seqno = rq->fence.seqno;631 __entry->flags = flags;632 ),633 634 TP_printk("dev=%u, engine=%u:%u, ctx=%llu, seqno=%u, flags=0x%x",635 __entry->dev, __entry->class, __entry->instance,636 __entry->ctx, __entry->seqno,637 __entry->flags)638);639 640DEFINE_EVENT(i915_request, i915_request_wait_end,641 TP_PROTO(struct i915_request *rq),642 TP_ARGS(rq)643);644 645TRACE_EVENT_CONDITION(i915_reg_rw,646 TP_PROTO(bool write, i915_reg_t reg, u64 val, int len, bool trace),647 648 TP_ARGS(write, reg, val, len, trace),649 650 TP_CONDITION(trace),651 652 TP_STRUCT__entry(653 __field(u64, val)654 __field(u32, reg)655 __field(u16, write)656 __field(u16, len)657 ),658 659 TP_fast_assign(660 __entry->val = (u64)val;661 __entry->reg = i915_mmio_reg_offset(reg);662 __entry->write = write;663 __entry->len = len;664 ),665 666 TP_printk("%s reg=0x%x, len=%d, val=(0x%x, 0x%x)",667 __entry->write ? "write" : "read",668 __entry->reg, __entry->len,669 (u32)(__entry->val & 0xffffffff),670 (u32)(__entry->val >> 32))671);672 673/**674 * DOC: i915_ppgtt_create and i915_ppgtt_release tracepoints675 *676 * With full ppgtt enabled each process using drm will allocate at least one677 * translation table. With these traces it is possible to keep track of the678 * allocation and of the lifetime of the tables; this can be used during679 * testing/debug to verify that we are not leaking ppgtts.680 * These traces identify the ppgtt through the vm pointer, which is also printed681 * by the i915_vma_bind and i915_vma_unbind tracepoints.682 */683DECLARE_EVENT_CLASS(i915_ppgtt,684 TP_PROTO(struct i915_address_space *vm),685 TP_ARGS(vm),686 687 TP_STRUCT__entry(688 __field(struct i915_address_space *, vm)689 __field(u32, dev)690 ),691 692 TP_fast_assign(693 __entry->vm = vm;694 __entry->dev = vm->i915->drm.primary->index;695 ),696 697 TP_printk("dev=%u, vm=%p", __entry->dev, __entry->vm)698)699 700DEFINE_EVENT(i915_ppgtt, i915_ppgtt_create,701 TP_PROTO(struct i915_address_space *vm),702 TP_ARGS(vm)703);704 705DEFINE_EVENT(i915_ppgtt, i915_ppgtt_release,706 TP_PROTO(struct i915_address_space *vm),707 TP_ARGS(vm)708);709 710/**711 * DOC: i915_context_create and i915_context_free tracepoints712 *713 * These tracepoints are used to track creation and deletion of contexts.714 * If full ppgtt is enabled, they also print the address of the vm assigned to715 * the context.716 */717DECLARE_EVENT_CLASS(i915_context,718 TP_PROTO(struct i915_gem_context *ctx),719 TP_ARGS(ctx),720 721 TP_STRUCT__entry(722 __field(u32, dev)723 __field(struct i915_gem_context *, ctx)724 __field(struct i915_address_space *, vm)725 ),726 727 TP_fast_assign(728 __entry->dev = ctx->i915->drm.primary->index;729 __entry->ctx = ctx;730 __entry->vm = ctx->vm;731 ),732 733 TP_printk("dev=%u, ctx=%p, ctx_vm=%p",734 __entry->dev, __entry->ctx, __entry->vm)735)736 737DEFINE_EVENT(i915_context, i915_context_create,738 TP_PROTO(struct i915_gem_context *ctx),739 TP_ARGS(ctx)740);741 742DEFINE_EVENT(i915_context, i915_context_free,743 TP_PROTO(struct i915_gem_context *ctx),744 TP_ARGS(ctx)745);746 747#endif /* _I915_TRACE_H_ */748 749/* This part must be outside protection */750#undef TRACE_INCLUDE_PATH751#undef TRACE_INCLUDE_FILE752#define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/i915753#define TRACE_INCLUDE_FILE i915_trace754#include <trace/define_trace.h>755