Home | History | Annotate | Line # | Download | only in include
i915_trace.h revision 1.17
      1 /*	$NetBSD: i915_trace.h,v 1.17 2021/12/19 11:13:06 riastradh Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2013, 2018 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Taylor R. Campbell.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #ifndef _I915_TRACE_H_
     33 #define _I915_TRACE_H_
     34 
     35 #include <sys/types.h>
     36 #include <sys/sdt.h>
     37 
     38 #include "i915_request.h"
     39 #include "i915_drv.h"
     40 
     41 /* Must come last.  */
     42 #include <drm/drm_trace_netbsd.h>
     43 
     44 DEFINE_TRACE3(i915,, cpu__fifo__underrun,
     45     "enum pipe_drmhack"/*pipe*/,
     46     "uint32_t"/*frame*/,
     47     "uint32_t"/*scanline*/);
     48 static inline void
     49 trace_intel_cpu_fifo_underrun(struct drm_i915_private *dev_priv,
     50     enum pipe pipe)
     51 {
     52 	TRACE3(i915,, cpu__fifo__underrun,
     53 	    pipe,
     54 	    dev_priv->drm.driver->get_vblank_counter(&dev_priv->drm, pipe),
     55 	    intel_get_crtc_scanline(intel_get_crtc_for_pipe(dev_priv, pipe)));
     56 }
     57 
     58 DEFINE_TRACE3(i915,, pch__fifo__underrun,
     59     "enum pipe_drmhack"/*pipe*/,
     60     "uint32_t"/*frame*/,
     61     "uint32_t"/*scanline*/);
     62 static inline void
     63 trace_intel_pch_fifo_underrun(struct drm_i915_private *dev_priv,
     64     enum pipe pipe)
     65 {
     66 	TRACE3(i915,, pch__fifo__underrun,
     67 	    pipe,
     68 	    dev_priv->drm.driver->get_vblank_counter(&dev_priv->drm, pipe),
     69 	    intel_get_crtc_scanline(intel_get_crtc_for_pipe(dev_priv, pipe)));
     70 }
     71 
     72 DEFINE_TRACE5(i915,, gem__evict,
     73     "int"/*devno*/,
     74     "struct i915_address_space *"/*vm*/,
     75     "uint64_t"/*size*/,
     76     "uint64_t"/*align*/,
     77     "unsigned"/*flags*/);
     78 static inline void
     79 trace_i915_gem_evict(struct i915_address_space *vm,
     80     uint64_t size, uint64_t align, unsigned flags)
     81 {
     82 	TRACE5(i915,, gem__evict,
     83 	    vm->i915->drm.primary->index, vm, size, align, flags);
     84 }
     85 
     86 DEFINE_TRACE6(i915,, gem__evict__node,
     87     "int"/*devno*/,
     88     "struct i915_address_space *"/*vm*/,
     89     "uint64_t"/*start*/,
     90     "uint64_t"/*size*/,
     91     "unsigned long"/*color*/,
     92     "unsigned"/*flags*/);
     93 static inline void
     94 trace_i915_gem_evict_node(struct i915_address_space *vm,
     95     struct drm_mm_node *node, unsigned flags)
     96 {
     97 	TRACE6(i915,, gem__evict__node,
     98 	    vm->i915->drm.primary->index, vm,
     99 	    node->start, node->size, node->color,
    100 	    flags);
    101 }
    102 
    103 DEFINE_TRACE2(i915,, gem__evict__vm,
    104     "int"/*devno*/,
    105     "struct i915_address_space *"/*vm*/);
    106 static inline void
    107 trace_i915_gem_evict_vm(struct i915_address_space *vm)
    108 {
    109 	TRACE2(i915,, gem__evict__vm,  vm->i915->drm.primary->index, vm);
    110 }
    111 
    112 DEFINE_TRACE1(i915,, gem__object__clflush,
    113     "struct drm_i915_gem_object *"/*obj*/);
    114 static inline void
    115 trace_i915_gem_object_clflush(struct drm_i915_gem_object *obj)
    116 {
    117 	TRACE1(i915,, gem__object__clflush,  obj);
    118 }
    119 
    120 DEFINE_TRACE2(i915,, gem__object__create,
    121     "struct drm_i915_gem_object *"/*obj*/,
    122     "size_t"/*size*/);
    123 static inline void
    124 trace_i915_gem_object_create(struct drm_i915_gem_object *obj)
    125 {
    126 	TRACE2(i915,, gem__object__create,  obj, obj->base.size);
    127 }
    128 
    129 DEFINE_TRACE1(i915,, gem__object__destroy,
    130     "struct drm_i915_gem_object *"/*obj*/);
    131 static inline void
    132 trace_i915_gem_object_destroy(struct drm_i915_gem_object *obj)
    133 {
    134 	TRACE1(i915,, gem__object__destroy,  obj);
    135 }
    136 
    137 DEFINE_TRACE4(i915,, gem__object__fault,
    138     "struct drm_i915_gem_object *"/*obj*/,
    139     "pgoff_t"/*page_offset*/,
    140     "bool"/*gtt*/,
    141     "bool"/*write*/);
    142 static inline void
    143 trace_i915_gem_object_fault(struct drm_i915_gem_object *obj,
    144     pgoff_t page_offset, bool gtt, bool write)
    145 {
    146 	TRACE4(i915,, gem__object__fault,  obj, page_offset, gtt, write);
    147 }
    148 
    149 /* XXX Not sure about size/offset types here.  */
    150 DEFINE_TRACE3(i915,, gem__object__pread,
    151     "struct drm_i915_gem_object *"/*obj*/,
    152     "off_t"/*offset*/,
    153     "size_t"/*size*/);
    154 static inline void
    155 trace_i915_gem_object_pread(struct drm_i915_gem_object *obj, off_t offset,
    156     size_t size)
    157 {
    158 	TRACE3(i915,, gem__object__pread,  obj, offset, size);
    159 }
    160 
    161 DEFINE_TRACE3(i915,, gem__object__write,
    162     "struct drm_i915_gem_object *"/*obj*/,
    163     "off_t"/*offset*/,
    164     "size_t"/*size*/);
    165 static inline void
    166 trace_i915_gem_object_pwrite(struct drm_i915_gem_object *obj, off_t offset,
    167     size_t size)
    168 {
    169 	TRACE3(i915,, gem__object__write,  obj, offset, size);
    170 }
    171 
    172 #define	I915_DEFINE_TRACE_REQ(M, F, N)					      \
    173 	DEFINE_TRACE7(M, F, N,						      \
    174 	    "int"/*devno*/,						      \
    175 	    "unsigned"/*hw_id*/,					      \
    176 	    "uint8_t"/*uabi_class*/,					      \
    177 	    "uint8_t"/*instance*/,					      \
    178 	    "unsigned"/*context*/,					      \
    179 	    "unsigned"/*seqno*/,					      \
    180 	    "unsigned"/*global*/)
    181 
    182 #define	I915_TRACE_REQ(M, F, N, R)					      \
    183 	TRACE7(M, F, N,							      \
    184 	    (R)->i915->drm.primary->index,				      \
    185 	    (R)->gem_context->hw_id,					      \
    186 	    (R)->engine->uabi_class,					      \
    187 	    (R)->engine->instance,					      \
    188 	    (R)->fence.context,						      \
    189 	    (R)->fence.seqno,						      \
    190 	    (R)->global_seqno)
    191 
    192 I915_DEFINE_TRACE_REQ(i915,, request__queue);
    193 static inline void
    194 trace_i915_request_queue(struct i915_request *request, uint32_t flags)
    195 {
    196 	__USE(flags);		/* XXX too many trace operands */
    197 	I915_TRACE_REQ(i915,, request__queue,  request);
    198 }
    199 
    200 I915_DEFINE_TRACE_REQ(i915,, request__add);
    201 static inline void
    202 trace_i915_request_add(struct i915_request *request)
    203 {
    204 	I915_TRACE_REQ(i915,, request__add,  request);
    205 }
    206 
    207 I915_DEFINE_TRACE_REQ(i915,, request__submit);
    208 static inline void
    209 trace_i915_request_submit(struct i915_request *request)
    210 {
    211 	I915_TRACE_REQ(i915,, request__submit,  request);
    212 }
    213 
    214 I915_DEFINE_TRACE_REQ(i915,, request__execute);
    215 static inline void
    216 trace_i915_request_execute(struct i915_request *request)
    217 {
    218 	I915_TRACE_REQ(i915,, request__execute,  request);
    219 }
    220 
    221 I915_DEFINE_TRACE_REQ(i915,, request__in);
    222 static inline void
    223 trace_i915_request_in(struct i915_request *request, unsigned port)
    224 {
    225 	__USE(port);		/* XXX too many trace operands */
    226 	I915_TRACE_REQ(i915,, request__in,  request);
    227 }
    228 
    229 I915_DEFINE_TRACE_REQ(i915,, request__out);
    230 static inline void
    231 trace_i915_request_out(struct i915_request *request)
    232 {
    233 	/* XXX i915_request_completed(request) */
    234 	I915_TRACE_REQ(i915,, request__out,  request);
    235 }
    236 
    237 I915_DEFINE_TRACE_REQ(i915,, request__retire);
    238 static inline void
    239 trace_i915_request_retire(struct i915_request *request)
    240 {
    241 	I915_TRACE_REQ(i915,, request__retire, request);
    242 }
    243 
    244 I915_DEFINE_TRACE_REQ(i915,, request__wait__begin);
    245 static inline void
    246 trace_i915_request_wait_begin(struct i915_request *request)
    247 {
    248 	I915_TRACE_REQ(i915,, request__wait__begin, request);
    249 }
    250 
    251 I915_DEFINE_TRACE_REQ(i915,, request__wait__end);
    252 static inline void
    253 trace_i915_request_wait_end(struct i915_request *request)
    254 {
    255 	I915_TRACE_REQ(i915,, request__wait__end, request);
    256 }
    257 
    258 DEFINE_TRACE5(i915,, engine__notify,
    259     "int"/*devno*/,
    260     "uint8_t"/*uabi_class*/,
    261     "uint8_t"/*instance*/,
    262     "unsigned"/*seqno*/,
    263     "bool"/*waiters*/);
    264 static inline void
    265 trace_intel_engine_notify(struct intel_engine_cs *engine, bool waiters)
    266 {
    267 	TRACE5(i915,, engine__notify,
    268 	    engine->i915->drm.primary->index,
    269 	    engine->uabi_class,
    270 	    engine->instance,
    271 	    intel_engine_get_seqno(engine),
    272 	    waiters);
    273 }
    274 
    275 DEFINE_TRACE6(i915,, gem__ring__sync__to,
    276     "int"/*devno*/,
    277     "uint8_t"/*from_class*/,
    278     "uint8_t"/*from_instance*/,
    279     "uint8_t"/*to_class*/,
    280     "uint8_t"/*to_instance*/,
    281     "unsigned"/*seqno*/);
    282 static inline void
    283 trace_i915_gem_ring_sync_to(struct i915_request *to, struct i915_request *from)
    284 {
    285 	TRACE6(i915,, gem__ring__sync__to,
    286 	    from->i915->drm.primary->index,
    287 	    from->engine->uabi_class,
    288 	    from->engine->instance,
    289 	    to->engine->uabi_class,
    290 	    to->engine->instance,
    291 	    from->global_seqno);
    292 }
    293 
    294 DEFINE_TRACE3(i915,, register__read,
    295     "uint32_t"/*reg*/, "uint64_t"/*value*/, "size_t"/*len*/);
    296 DEFINE_TRACE3(i915,, register__write,
    297     "uint32_t"/*reg*/, "uint64_t"/*value*/, "size_t"/*len*/);
    298 static inline void
    299 trace_i915_reg_rw(bool write, i915_reg_t reg, uint64_t value, size_t len,
    300     bool trace)
    301 {
    302 	uint32_t regoff = i915_mmio_reg_offset(reg);
    303 
    304 	if (!trace)
    305 		return;
    306 	if (write) {
    307 		TRACE3(i915,, register__read,  regoff, value, len);
    308 	} else {
    309 		TRACE3(i915,, register__write,  regoff, value, len);
    310 	}
    311 }
    312 
    313 DEFINE_TRACE5(i915,, vma__bind,
    314     "struct drm_i915_gem_object *"/*obj*/,
    315     "struct i915_address_space *"/*vm*/,
    316     "uint64_t"/*offset*/,
    317     "uint64_t"/*size*/,
    318     "uint64_t"/*flags*/);
    319 static inline void
    320 trace_i915_vma_bind(struct i915_vma *vma, uint64_t flags)
    321 {
    322 	TRACE5(i915,, vma__bind,
    323 	    vma->obj, vma->vm, vma->node.start, vma->node.size, flags);
    324 }
    325 
    326 DEFINE_TRACE4(i915,, vma__unbind,
    327     "struct drm_i915_gem_object *"/*obj*/,
    328     "struct i915_address_space *"/*vm*/,
    329     "uint64_t"/*offset*/,
    330     "uint64_t"/*size*/);
    331 static inline void
    332 trace_i915_vma_unbind(struct i915_vma *vma)
    333 {
    334 	TRACE4(i915,, vma__unbind,
    335 	    vma->obj, vma->vm, vma->node.start, vma->node.size);
    336 }
    337 
    338 DEFINE_TRACE1(i915,, gpu__freq__change,
    339     "int"/*freq*/);
    340 static inline void
    341 trace_intel_gpu_freq_change(int freq)
    342 {
    343 	TRACE1(i915,, gpu__freq__change,  freq);
    344 }
    345 
    346 DEFINE_TRACE4(i915,, context__create,
    347     "int"/*devno*/,
    348     "struct i915_gem_context *"/*ctx*/,
    349     "unsigned"/*hw_id*/,
    350     "struct i915_address_space *"/*vm*/);
    351 static inline void
    352 trace_i915_context_create(struct i915_gem_context *ctx)
    353 {
    354 	TRACE4(i915,, context__create,
    355 	    ctx->i915->drm.primary->index,
    356 	    ctx,
    357 	    ctx->hw_id,
    358 	    (ctx->ppgtt ? &ctx->ppgtt->vm : NULL));
    359 }
    360 
    361 DEFINE_TRACE4(i915,, context__free,
    362     "int"/*devno*/,
    363     "struct i915_gem_context *"/*ctx*/,
    364     "unsigned"/*hw_id*/,
    365     "struct i915_address_space *"/*vm*/);
    366 static inline void
    367 trace_i915_context_free(struct i915_gem_context *ctx)
    368 {
    369 	TRACE4(i915,, context__free,
    370 	    ctx->i915->drm.primary->index,
    371 	    ctx,
    372 	    ctx->hw_id,
    373 	    (ctx->ppgtt ? &ctx->ppgtt->vm : NULL));
    374 }
    375 
    376 DEFINE_TRACE4(i915,, page_directory_entry_alloc,
    377     "struct i915_address_space *"/*vm*/,
    378     "uint32_t"/*pdpe*/,
    379     "uint64_t"/*start*/,
    380     "uint64_t"/*pde_shift*/);
    381 static inline void
    382 trace_i915_page_directory_entry_alloc(struct i915_address_space *vm,
    383     uint32_t pdpe, uint64_t start, uint64_t pde_shift)
    384 {
    385 	TRACE4(i915,, page_directory_entry_alloc,  vm, pdpe, start, pde_shift);
    386 }
    387 
    388 DEFINE_TRACE4(i915,, page_directory_pointer_entry_alloc,
    389     "struct i915_address_space *"/*vm*/,
    390     "uint32_t"/*pml4e*/,
    391     "uint64_t"/*start*/,
    392     "uint64_t"/*pde_shift*/);
    393 static inline void
    394 trace_i915_page_directory_pointer_entry_alloc(struct i915_address_space *vm,
    395     uint32_t pml4e, uint64_t start, uint64_t pde_shift)
    396 {
    397 	TRACE4(i915,, page_directory_pointer_entry_alloc,
    398 	    vm, pml4e, start, pde_shift);
    399 }
    400 
    401 DEFINE_TRACE4(i915,, page_table_entry_alloc,
    402     "struct i915_address_space *"/*vm*/,
    403     "uint32_t"/*pde*/,
    404     "uint64_t"/*start*/,
    405     "uint64_t"/*pde_shift*/);
    406 static inline void
    407 trace_i915_page_table_entry_alloc(struct i915_address_space *vm, uint32_t pde,
    408     uint64_t start, uint64_t pde_shift)
    409 {
    410 	TRACE4(i915,, page_table_entry_alloc,  vm, pde, start, pde_shift);
    411 }
    412 
    413 DEFINE_TRACE6(i915,, page_table_entry_map,
    414     "struct i915_address_space *"/*vm*/,
    415     "uint32_t"/*pde*/,
    416     "struct i915_page_table *"/*pt*/,
    417     "uint32_t"/*first*/,
    418     "uint32_t"/*count*/,
    419     "uint32_t"/*bits*/);
    420 static inline void
    421 trace_i915_page_table_entry_map(struct i915_address_space *vm, uint32_t pde,
    422     struct i915_page_table *pt, uint32_t first, uint32_t count, uint32_t bits)
    423 {
    424 	TRACE6(i915,, page_table_entry_map,  vm, pde, pt, first, count, bits);
    425 }
    426 
    427 DEFINE_TRACE2(i915,, ppgtt__create,
    428     "int"/*devno*/,
    429     "struct i915_address_space *"/*vm*/);
    430 static inline void
    431 trace_i915_ppgtt_create(struct i915_address_space *vm)
    432 {
    433 	TRACE2(i915,, ppgtt__create,  vm->i915->drm.primary->index, vm);
    434 }
    435 
    436 DEFINE_TRACE2(i915,, ppgtt__release,
    437     "int"/*devno*/,
    438     "struct i915_address_space *"/*vm*/);
    439 static inline void
    440 trace_i915_ppgtt_release(struct i915_address_space *vm)
    441 {
    442 	TRACE2(i915,, ppgtt__release,  vm->i915->drm.primary->index, vm);
    443 }
    444 
    445 #define	VM_TO_TRACE_NAME(vm)	(i915_is_ggtt(vm) ? "G" : "P")
    446 
    447 DEFINE_TRACE4(i915,, va__alloc,
    448     "struct i915_address_space *"/*vm*/,
    449     "uint64_t"/*start*/,
    450     "uint64_t"/*end*/,
    451     "const char *"/*name*/);
    452 static inline void
    453 trace_i915_va_alloc(struct i915_address_space *vm, uint64_t start,
    454     uint64_t length, const char *name)
    455 {
    456 	/* XXX Why start/end upstream?  */
    457 	TRACE4(i915,, va__alloc,  vm, start, start + length - 1, name);
    458 }
    459 
    460 DEFINE_TRACE3(i915,, gem__shrink,
    461     "int"/*devno*/,
    462     "unsigned long"/*target*/,
    463     "unsigned"/*flags*/);
    464 static inline void
    465 trace_i915_gem_shrink(struct drm_i915_private *dev_priv, unsigned long target,
    466     unsigned flags)
    467 {
    468 	TRACE3(i915,, gem__shrink,
    469 	    dev_priv->drm.primary->index, target, flags);
    470 }
    471 
    472 DEFINE_TRACE5(i915,, pipe__update__start,
    473     "enum pipe_drmhack"/*pipe*/,
    474     "uint32_t"/*frame*/,
    475     "int"/*scanline*/,
    476     "uint32_t"/*min*/,
    477     "uint32_t"/*max*/);
    478 static inline void
    479 trace_i915_pipe_update_start(struct intel_crtc *crtc)
    480 {
    481 	TRACE5(i915,, pipe__update__start,
    482 	    crtc->pipe,
    483 	    crtc->base.dev->driver->get_vblank_counter(crtc->base.dev,
    484 		crtc->pipe),
    485 	    intel_get_crtc_scanline(crtc),
    486 	    crtc->debug.min_vbl,
    487 	    crtc->debug.max_vbl);
    488 }
    489 
    490 DEFINE_TRACE5(i915,, pipe__update__vblank__evaded,
    491     "enum pipe_drmhack"/*pipe*/,
    492     "uint32_t"/*frame*/,
    493     "int"/*scanline*/,
    494     "uint32_t"/*min*/,
    495     "uint32_t"/*max*/);
    496 static inline void
    497 trace_i915_pipe_update_vblank_evaded(struct intel_crtc *crtc)
    498 {
    499 	TRACE5(i915,, pipe__update__vblank__evaded,
    500 	    crtc->pipe,
    501 	    crtc->debug.start_vbl_count,
    502 	    crtc->debug.scanline_start,
    503 	    crtc->debug.min_vbl,
    504 	    crtc->debug.max_vbl);
    505 }
    506 
    507 DEFINE_TRACE3(i915,, pipe__update__end,
    508     "enum pipe_drmhack"/*pipe*/,
    509     "uint32_t"/*frame*/,
    510     "int"/*scanline*/);
    511 static inline void
    512 trace_i915_pipe_update_end(struct intel_crtc *crtc, uint32_t frame,
    513     int scanline)
    514 {
    515 	TRACE3(i915,, pipe__update__end,  crtc->pipe, frame, scanline);
    516 }
    517 
    518 #endif  /* _I915_TRACE_H_ */
    519