1 /* $NetBSD: i915_trace.h,v 1.14 2018/08/27 15:25:28 riastradh Exp $ */ 2 3 /*- 4 * Copyright (c) 2013 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 "intel_drv.h" 39 40 /* Must come last. */ 41 #include <drm/drm_trace_netbsd.h> 42 43 DEFINE_TRACE2(i915,, flip__request, 44 "enum plane"/*plane*/, "struct drm_i915_gem_object *"/*obj*/); 45 static inline void 46 trace_i915_flip_request(enum plane plane, struct drm_i915_gem_object *obj) 47 { 48 TRACE2(i915,, flip__request, plane, obj); 49 } 50 51 DEFINE_TRACE2(i915,, flip__complete, 52 "enum plane"/*plane*/, "struct drm_i915_gem_object *"/*obj*/); 53 static inline void 54 trace_i915_flip_complete(enum plane plane, struct drm_i915_gem_object *obj) 55 { 56 TRACE2(i915,, flip__complete, plane, obj); 57 } 58 59 DEFINE_TRACE4(i915,, gem__evict, 60 "int"/*devno*/, 61 "int"/*min_size*/, "unsigned"/*alignment*/, "unsigned"/*flags*/); 62 static inline void 63 trace_i915_gem_evict(struct drm_device *dev, int min_size, unsigned alignment, 64 unsigned flags) 65 { 66 TRACE4(i915,, gem__evict, 67 dev->primary->index, min_size, alignment, flags); 68 } 69 70 DEFINE_TRACE2(i915,, gem__evict__vm, 71 "int"/*devno*/, "struct i915_address_space *"/*vm*/); 72 static inline void 73 trace_i915_gem_evict_vm(struct i915_address_space *vm) 74 { 75 TRACE2(i915,, gem__evict__vm, vm->dev->primary->index, vm); 76 } 77 78 DEFINE_TRACE3(i915,, gem__object__change__domain, 79 "struct drm_i915_gem_object *"/*obj*/, 80 "uint32_t"/*read_domains*/, 81 "uint32_t"/*write_domain*/); 82 static inline void 83 trace_i915_gem_object_change_domain(struct drm_i915_gem_object *obj, 84 uint32_t old_read_domains, uint32_t old_write_domain) 85 { 86 TRACE3(i915,, gem__object__change__domain, 87 obj, 88 obj->base.read_domains | (old_read_domains << 16), 89 obj->base.write_domain | (old_write_domain << 16)); 90 } 91 92 DEFINE_TRACE1(i915,, gem__object__clflush, 93 "struct drm_i915_gem_object *"/*obj*/); 94 static inline void 95 trace_i915_gem_object_clflush(struct drm_i915_gem_object *obj) 96 { 97 TRACE1(i915,, gem__object__clflush, obj); 98 } 99 100 DEFINE_TRACE2(i915,, gem__object__create, 101 "struct drm_i915_gem_object *"/*obj*/, 102 "size_t"/*size*/); 103 static inline void 104 trace_i915_gem_object_create(struct drm_i915_gem_object *obj) 105 { 106 TRACE2(i915,, gem__object__create, obj, obj->base.size); 107 } 108 109 DEFINE_TRACE1(i915,, gem__object__destroy, 110 "struct drm_i915_gem_object *"/*obj*/); 111 static inline void 112 trace_i915_gem_object_destroy(struct drm_i915_gem_object *obj) 113 { 114 TRACE1(i915,, gem__object__destroy, obj); 115 } 116 117 DEFINE_TRACE4(i915,, gem__object__fault, 118 "struct drm_i915_gem_object *"/*obj*/, 119 "pgoff_t"/*page_offset*/, 120 "bool"/*gtt*/, 121 "bool"/*write*/); 122 static inline void 123 trace_i915_gem_object_fault(struct drm_i915_gem_object *obj, 124 pgoff_t page_offset, bool gtt, bool write) 125 { 126 TRACE4(i915,, gem__object__fault, obj, page_offset, gtt, write); 127 } 128 129 /* XXX Not sure about size/offset types here. */ 130 DEFINE_TRACE3(i915,, gem__object__pread, 131 "struct drm_i915_gem_object *"/*obj*/, 132 "off_t"/*offset*/, 133 "size_t"/*size*/); 134 static inline void 135 trace_i915_gem_object_pread(struct drm_i915_gem_object *obj, off_t offset, 136 size_t size) 137 { 138 TRACE3(i915,, gem__object__pread, obj, offset, size); 139 } 140 141 DEFINE_TRACE3(i915,, gem__object__write, 142 "struct drm_i915_gem_object *"/*obj*/, 143 "off_t"/*offset*/, 144 "size_t"/*size*/); 145 static inline void 146 trace_i915_gem_object_pwrite(struct drm_i915_gem_object *obj, off_t offset, 147 size_t size) 148 { 149 TRACE3(i915,, gem__object__write, obj, offset, size); 150 } 151 152 DEFINE_TRACE3(i915,, gem__request__add, 153 "int"/*devno*/, "int"/*ringid*/, "uint32_t"/*seqno*/); 154 static inline void 155 trace_i915_gem_request_add(struct drm_i915_gem_request *request) 156 { 157 TRACE3(i915,, gem__request__add, 158 request->ring->dev->primary->index, 159 request->ring->id, 160 request->seqno); 161 } 162 163 DEFINE_TRACE3(i915,, gem__request__retire, 164 "int"/*devno*/, "int"/*ringid*/, "uint32_t"/*seqno*/); 165 static inline void 166 trace_i915_gem_request_retire(struct drm_i915_gem_request *request) 167 { 168 TRACE3(i915,, gem__request__retire, 169 request->ring->dev->primary->index, 170 request->ring->id, 171 request->seqno); 172 } 173 174 DEFINE_TRACE3(i915,, gem__request__wait__begin, 175 "int"/*devno*/, "int"/*ringid*/, "uint32_t"/*seqno*/); 176 static inline void 177 trace_i915_gem_request_wait_begin(struct drm_i915_gem_request *request) 178 { 179 TRACE3(i915,, gem__request__wait__begin, 180 request->ring->dev->primary->index, 181 request->ring->id, 182 request->seqno); 183 } 184 185 DEFINE_TRACE3(i915,, gem__request__wait__end, 186 "int"/*devno*/, "int"/*ringid*/, "uint32_t"/*seqno*/); 187 static inline void 188 trace_i915_gem_request_wait_end(struct drm_i915_gem_request *request) 189 { 190 TRACE3(i915,, gem__request__wait__end, 191 request->ring->dev->primary->index, 192 request->ring->id, 193 request->seqno); 194 } 195 196 DEFINE_TRACE3(i915,, gem__request__notify, 197 "int"/*devno*/, "int"/*ringid*/, "uint32_t"/*seqno*/); 198 static inline void 199 trace_i915_gem_request_notify(struct intel_engine_cs *ring) 200 { 201 TRACE3(i915,, gem__request__notify, 202 ring->dev->primary->index, ring->id, ring->get_seqno(ring, false)); 203 } 204 205 /* XXX Why no request in the trace upstream? */ 206 DEFINE_TRACE4(i915,, gem__ring__dispatch, 207 "int"/*devno*/, "int"/*ringid*/, "uint32_t"/*seqno*/, "uint32_t"/*flags*/); 208 static inline void 209 trace_i915_gem_ring_dispatch(struct drm_i915_gem_request *request, 210 uint32_t flags) 211 { 212 TRACE4(i915,, gem__ring__dispatch, 213 request->ring->dev->primary->index, 214 request->ring->id, 215 request->seqno, 216 flags); 217 /* XXX i915_trace_irq_get? Doesn't seem to be used. */ 218 } 219 220 DEFINE_TRACE4(i915,, gem__ring__flush, 221 "int"/*devno*/, 222 "int"/*ringid*/, 223 "uint32_t"/*invalidate*/, 224 "uint32_t"/*flags*/); 225 static inline void 226 trace_i915_gem_ring_flush(struct drm_i915_gem_request *request, 227 uint32_t invalidate, uint32_t flags) 228 { 229 TRACE4(i915,, gem__ring__flush, 230 request->ring->dev->primary->index, 231 request->ring->id, 232 invalidate, 233 flags); 234 } 235 236 DEFINE_TRACE4(i915,, gem__ring__sync__to, 237 "int"/*devno*/, 238 "int"/*from_ringid*/, 239 "int"/*to_ringid*/, 240 "uint32_t"/*seqno*/); 241 static inline void 242 trace_i915_gem_ring_sync_to(struct drm_i915_gem_request *to_req, 243 struct intel_engine_cs *from, struct drm_i915_gem_request *from_req) 244 { 245 TRACE4(i915,, gem__ring__sync__to, 246 from->dev->primary->index, 247 from->id, 248 to_req->ring->id, 249 i915_gem_request_get_seqno(from_req)); 250 } 251 252 DEFINE_TRACE3(i915,, register__read, 253 "uint32_t"/*reg*/, "uint64_t"/*value*/, "size_t"/*len*/); 254 DEFINE_TRACE3(i915,, register__write, 255 "uint32_t"/*reg*/, "uint64_t"/*value*/, "size_t"/*len*/); 256 static inline void 257 trace_i915_reg_rw(bool write, uint32_t reg, uint64_t value, size_t len, 258 bool trace) 259 { 260 if (!trace) 261 return; 262 if (write) { 263 TRACE3(i915,, register__read, reg, value, len); 264 } else { 265 TRACE3(i915,, register__write, reg, value, len); 266 } 267 } 268 269 DEFINE_TRACE5(i915,, vma__bind, 270 "struct drm_i915_gem_object *"/*obj*/, 271 "struct i915_address_space *"/*vm*/, 272 "uint64_t"/*offset*/, 273 "uint64_t"/*size*/, 274 "uint64_t"/*flags*/); 275 static inline void 276 trace_i915_vma_bind(struct i915_vma *vma, uint64_t flags) 277 { 278 TRACE5(i915,, vma__bind, 279 vma->obj, vma->vm, vma->node.start, vma->node.size, flags); 280 } 281 282 DEFINE_TRACE4(i915,, vma__unbind, 283 "struct drm_i915_gem_object *"/*obj*/, 284 "struct i915_address_space *"/*vm*/, 285 "uint64_t"/*offset*/, 286 "uint64_t"/*size*/); 287 static inline void 288 trace_i915_vma_unbind(struct i915_vma *vma) 289 { 290 TRACE4(i915,, vma__unbind, 291 vma->obj, vma->vm, vma->node.start, vma->node.size); 292 } 293 294 DEFINE_TRACE1(i915,, gpu__freq__change, 295 "int"/*freq*/); 296 static inline void 297 trace_intel_gpu_freq_change(int freq) 298 { 299 TRACE1(i915,, gpu__freq__change, freq); 300 } 301 302 DEFINE_TRACE3(i915,, context__create, 303 "int"/*devno*/, 304 "struct intel_context *"/*ctx*/, 305 "struct i915_address_space *"/*vm*/); 306 static inline void 307 trace_i915_context_create(struct intel_context *ctx) 308 { 309 TRACE3(i915,, context__create, 310 ctx->i915->dev->primary->index, 311 ctx, 312 (ctx->ppgtt ? &ctx->ppgtt->base : NULL)); 313 } 314 315 DEFINE_TRACE3(i915,, context__free, 316 "int"/*devno*/, 317 "struct intel_context *"/*ctx*/, 318 "struct i915_address_space *"/*vm*/); 319 static inline void 320 trace_i915_context_free(struct intel_context *ctx) 321 { 322 TRACE3(i915,, context__free, 323 ctx->i915->dev->primary->index, 324 ctx, 325 (ctx->ppgtt ? &ctx->ppgtt->base : NULL)); 326 } 327 328 DEFINE_TRACE4(i915,, page_directory_entry_alloc, 329 "struct i915_address_space *"/*vm*/, 330 "uint32_t"/*pdpe*/, 331 "uint64_t"/*start*/, 332 "uint64_t"/*pde_shift*/); 333 static inline void 334 trace_i915_page_directory_entry_alloc(struct i915_address_space *vm, 335 uint32_t pdpe, uint64_t start, uint64_t pde_shift) 336 { 337 TRACE4(i915,, page_directory_entry_alloc, vm, pdpe, start, pde_shift); 338 } 339 340 DEFINE_TRACE4(i915,, page_directory_pointer_entry_alloc, 341 "struct i915_address_space *"/*vm*/, 342 "uint32_t"/*pml4e*/, 343 "uint64_t"/*start*/, 344 "uint64_t"/*pde_shift*/); 345 static inline void 346 trace_i915_page_directory_pointer_entry_alloc(struct i915_address_space *vm, 347 uint32_t pml4e, uint64_t start, uint64_t pde_shift) 348 { 349 TRACE4(i915,, page_directory_pointer_entry_alloc, 350 vm, pml4e, start, pde_shift); 351 } 352 353 DEFINE_TRACE4(i915,, page_table_entry_alloc, 354 "struct i915_address_space *"/*vm*/, 355 "uint32_t"/*pde*/, 356 "uint64_t"/*start*/, 357 "uint64_t"/*pde_shift*/); 358 static inline void 359 trace_i915_page_table_entry_alloc(struct i915_address_space *vm, uint32_t pde, 360 uint64_t start, uint64_t pde_shift) 361 { 362 TRACE4(i915,, page_table_entry_alloc, vm, pde, start, pde_shift); 363 } 364 365 DEFINE_TRACE6(i915,, page_table_entry_map, 366 "struct i915_address_space *"/*vm*/, 367 "uint32_t"/*pde*/, 368 "struct i915_page_table *"/*pt*/, 369 "uint32_t"/*first*/, 370 "uint32_t"/*count*/, 371 "uint32_t"/*bits*/); 372 static inline void 373 trace_i915_page_table_entry_map(struct i915_address_space *vm, uint32_t pde, 374 struct i915_page_table *pt, uint32_t first, uint32_t count, uint32_t bits) 375 { 376 TRACE6(i915,, page_table_entry_map, vm, pde, pt, first, count, bits); 377 } 378 379 DEFINE_TRACE2(i915,, ppgtt__create, 380 "int"/*devno*/, 381 "struct i915_address_space *"/*vm*/); 382 static inline void 383 trace_i915_ppgtt_create(struct i915_address_space *vm) 384 { 385 TRACE2(i915,, ppgtt__create, vm->dev->primary->index, vm); 386 } 387 388 DEFINE_TRACE2(i915,, ppgtt__release, 389 "int"/*devno*/, 390 "struct i915_address_space *"/*vm*/); 391 static inline void 392 trace_i915_ppgtt_release(struct i915_address_space *vm) 393 { 394 TRACE2(i915,, ppgtt__release, vm->dev->primary->index, vm); 395 } 396 397 #define VM_TO_TRACE_NAME(vm) (i915_is_ggtt(vm) ? "G" : "P") 398 399 DEFINE_TRACE4(i915,, va__alloc, 400 "struct i915_address_space *"/*vm*/, 401 "uint64_t"/*start*/, 402 "uint64_t"/*end*/, 403 "const char *"/*name*/); 404 static inline void 405 trace_i915_va_alloc(struct i915_address_space *vm, uint64_t start, 406 uint64_t length, const char *name) 407 { 408 /* XXX Why start/end upstream? */ 409 TRACE4(i915,, va__alloc, vm, start, start + length - 1, name); 410 } 411 412 DEFINE_TRACE3(i915,, gem__shrink, 413 "int"/*devno*/, 414 "unsigned long"/*target*/, 415 "unsigned"/*flags*/); 416 static inline void 417 trace_i915_gem_shrink(struct drm_i915_private *dev_priv, unsigned long target, 418 unsigned flags) 419 { 420 TRACE3(i915,, gem__shrink, 421 dev_priv->dev->primary->index, target, flags); 422 } 423 424 DEFINE_TRACE5(i915,, pipe__update__start, 425 "enum i915_pipe"/*pipe*/, 426 "uint32_t"/*frame*/, 427 "int"/*scanline*/, 428 "uint32_t"/*min*/, 429 "uint32_t"/*max*/); 430 static inline void 431 trace_i915_pipe_update_start(struct intel_crtc *crtc) 432 { 433 TRACE5(i915,, pipe__update__start, 434 crtc->pipe, 435 crtc->base.dev->driver->get_vblank_counter(crtc->base.dev, 436 crtc->pipe), 437 intel_get_crtc_scanline(crtc), 438 crtc->debug.min_vbl, 439 crtc->debug.max_vbl); 440 } 441 442 DEFINE_TRACE5(i915,, pipe__update__vblank__evaded, 443 "enum i915_pipe"/*pipe*/, 444 "uint32_t"/*frame*/, 445 "int"/*scanline*/, 446 "uint32_t"/*min*/, 447 "uint32_t"/*max*/); 448 static inline void 449 trace_i915_pipe_update_vblank_evaded(struct intel_crtc *crtc) 450 { 451 TRACE5(i915,, pipe__update__vblank__evaded, 452 crtc->pipe, 453 crtc->debug.start_vbl_count, 454 crtc->debug.scanline_start, 455 crtc->debug.min_vbl, 456 crtc->debug.max_vbl); 457 } 458 459 DEFINE_TRACE3(i915,, pipe__update__end, 460 "enum i915_pipe"/*pipe*/, 461 "uint32_t"/*frame*/, 462 "int"/*scanline*/); 463 static inline void 464 trace_i915_pipe_update_end(struct intel_crtc *crtc, uint32_t frame, 465 int scanline) 466 { 467 TRACE3(i915,, pipe__update__end, crtc->pipe, frame, scanline); 468 } 469 470 DEFINE_TRACE4(i915,, switch__mm, 471 "int"/*devno*/, 472 "int"/*ringid*/, 473 "struct intel_context *"/*to*/, 474 "struct i915_address_space *"/*vm*/); 475 static inline void 476 trace_switch_mm(struct intel_engine_cs *ring, struct intel_context *to) 477 { 478 TRACE4(i915,, switch__mm, 479 ring->dev->primary->index, 480 ring->id, 481 to, 482 to->ppgtt ? &to->ppgtt->base : NULL); 483 } 484 485 #endif /* _I915_TRACE_H_ */ 486