| .. | .. |
|---|
| 28 | 28 | #include <linux/types.h> |
|---|
| 29 | 29 | #include <linux/tracepoint.h> |
|---|
| 30 | 30 | |
|---|
| 31 | | -#include <drm/drmP.h> |
|---|
| 32 | | - |
|---|
| 33 | 31 | #undef TRACE_SYSTEM |
|---|
| 34 | 32 | #define TRACE_SYSTEM amdgpu |
|---|
| 35 | 33 | #define TRACE_INCLUDE_FILE amdgpu_trace |
|---|
| .. | .. |
|---|
| 37 | 35 | #define AMDGPU_JOB_GET_TIMELINE_NAME(job) \ |
|---|
| 38 | 36 | job->base.s_fence->finished.ops->get_timeline_name(&job->base.s_fence->finished) |
|---|
| 39 | 37 | |
|---|
| 40 | | -TRACE_EVENT(amdgpu_mm_rreg, |
|---|
| 38 | +TRACE_EVENT(amdgpu_device_rreg, |
|---|
| 41 | 39 | TP_PROTO(unsigned did, uint32_t reg, uint32_t value), |
|---|
| 42 | 40 | TP_ARGS(did, reg, value), |
|---|
| 43 | 41 | TP_STRUCT__entry( |
|---|
| .. | .. |
|---|
| 56 | 54 | (unsigned long)__entry->value) |
|---|
| 57 | 55 | ); |
|---|
| 58 | 56 | |
|---|
| 59 | | -TRACE_EVENT(amdgpu_mm_wreg, |
|---|
| 57 | +TRACE_EVENT(amdgpu_device_wreg, |
|---|
| 60 | 58 | TP_PROTO(unsigned did, uint32_t reg, uint32_t value), |
|---|
| 61 | 59 | TP_ARGS(did, reg, value), |
|---|
| 62 | 60 | TP_STRUCT__entry( |
|---|
| .. | .. |
|---|
| 76 | 74 | ); |
|---|
| 77 | 75 | |
|---|
| 78 | 76 | TRACE_EVENT(amdgpu_iv, |
|---|
| 79 | | - TP_PROTO(struct amdgpu_iv_entry *iv), |
|---|
| 80 | | - TP_ARGS(iv), |
|---|
| 77 | + TP_PROTO(unsigned ih, struct amdgpu_iv_entry *iv), |
|---|
| 78 | + TP_ARGS(ih, iv), |
|---|
| 81 | 79 | TP_STRUCT__entry( |
|---|
| 80 | + __field(unsigned, ih) |
|---|
| 82 | 81 | __field(unsigned, client_id) |
|---|
| 83 | 82 | __field(unsigned, src_id) |
|---|
| 84 | 83 | __field(unsigned, ring_id) |
|---|
| .. | .. |
|---|
| 90 | 89 | __array(unsigned, src_data, 4) |
|---|
| 91 | 90 | ), |
|---|
| 92 | 91 | TP_fast_assign( |
|---|
| 92 | + __entry->ih = ih; |
|---|
| 93 | 93 | __entry->client_id = iv->client_id; |
|---|
| 94 | 94 | __entry->src_id = iv->src_id; |
|---|
| 95 | 95 | __entry->ring_id = iv->ring_id; |
|---|
| .. | .. |
|---|
| 103 | 103 | __entry->src_data[2] = iv->src_data[2]; |
|---|
| 104 | 104 | __entry->src_data[3] = iv->src_data[3]; |
|---|
| 105 | 105 | ), |
|---|
| 106 | | - TP_printk("client_id:%u src_id:%u ring:%u vmid:%u timestamp: %llu pasid:%u src_data: %08x %08x %08x %08x\n", |
|---|
| 107 | | - __entry->client_id, __entry->src_id, |
|---|
| 106 | + TP_printk("ih:%u client_id:%u src_id:%u ring:%u vmid:%u " |
|---|
| 107 | + "timestamp: %llu pasid:%u src_data: %08x %08x %08x %08x", |
|---|
| 108 | + __entry->ih, __entry->client_id, __entry->src_id, |
|---|
| 108 | 109 | __entry->ring_id, __entry->vmid, |
|---|
| 109 | 110 | __entry->timestamp, __entry->pasid, |
|---|
| 110 | 111 | __entry->src_data[0], __entry->src_data[1], |
|---|
| .. | .. |
|---|
| 150 | 151 | |
|---|
| 151 | 152 | TP_fast_assign( |
|---|
| 152 | 153 | __entry->bo_list = p->bo_list; |
|---|
| 153 | | - __entry->ring = p->ring->idx; |
|---|
| 154 | + __entry->ring = to_amdgpu_ring(p->entity->rq->sched)->idx; |
|---|
| 154 | 155 | __entry->dw = p->job->ibs[i].length_dw; |
|---|
| 155 | 156 | __entry->fences = amdgpu_fence_count_emitted( |
|---|
| 156 | | - p->ring); |
|---|
| 157 | + to_amdgpu_ring(p->entity->rq->sched)); |
|---|
| 157 | 158 | ), |
|---|
| 158 | 159 | TP_printk("bo_list=%p, ring=%u, dw=%u, fences=%u", |
|---|
| 159 | 160 | __entry->bo_list, __entry->ring, __entry->dw, |
|---|
| .. | .. |
|---|
| 169 | 170 | __field(unsigned int, context) |
|---|
| 170 | 171 | __field(unsigned int, seqno) |
|---|
| 171 | 172 | __field(struct dma_fence *, fence) |
|---|
| 172 | | - __field(char *, ring_name) |
|---|
| 173 | + __string(ring, to_amdgpu_ring(job->base.sched)->name) |
|---|
| 173 | 174 | __field(u32, num_ibs) |
|---|
| 174 | 175 | ), |
|---|
| 175 | 176 | |
|---|
| .. | .. |
|---|
| 178 | 179 | __assign_str(timeline, AMDGPU_JOB_GET_TIMELINE_NAME(job)) |
|---|
| 179 | 180 | __entry->context = job->base.s_fence->finished.context; |
|---|
| 180 | 181 | __entry->seqno = job->base.s_fence->finished.seqno; |
|---|
| 181 | | - __entry->ring_name = to_amdgpu_ring(job->base.sched)->name; |
|---|
| 182 | + __assign_str(ring, to_amdgpu_ring(job->base.sched)->name) |
|---|
| 182 | 183 | __entry->num_ibs = job->num_ibs; |
|---|
| 183 | 184 | ), |
|---|
| 184 | 185 | TP_printk("sched_job=%llu, timeline=%s, context=%u, seqno=%u, ring_name=%s, num_ibs=%u", |
|---|
| 185 | 186 | __entry->sched_job_id, __get_str(timeline), __entry->context, |
|---|
| 186 | | - __entry->seqno, __entry->ring_name, __entry->num_ibs) |
|---|
| 187 | + __entry->seqno, __get_str(ring), __entry->num_ibs) |
|---|
| 187 | 188 | ); |
|---|
| 188 | 189 | |
|---|
| 189 | 190 | TRACE_EVENT(amdgpu_sched_run_job, |
|---|
| .. | .. |
|---|
| 194 | 195 | __string(timeline, AMDGPU_JOB_GET_TIMELINE_NAME(job)) |
|---|
| 195 | 196 | __field(unsigned int, context) |
|---|
| 196 | 197 | __field(unsigned int, seqno) |
|---|
| 197 | | - __field(char *, ring_name) |
|---|
| 198 | + __string(ring, to_amdgpu_ring(job->base.sched)->name) |
|---|
| 198 | 199 | __field(u32, num_ibs) |
|---|
| 199 | 200 | ), |
|---|
| 200 | 201 | |
|---|
| .. | .. |
|---|
| 203 | 204 | __assign_str(timeline, AMDGPU_JOB_GET_TIMELINE_NAME(job)) |
|---|
| 204 | 205 | __entry->context = job->base.s_fence->finished.context; |
|---|
| 205 | 206 | __entry->seqno = job->base.s_fence->finished.seqno; |
|---|
| 206 | | - __entry->ring_name = to_amdgpu_ring(job->base.sched)->name; |
|---|
| 207 | + __assign_str(ring, to_amdgpu_ring(job->base.sched)->name) |
|---|
| 207 | 208 | __entry->num_ibs = job->num_ibs; |
|---|
| 208 | 209 | ), |
|---|
| 209 | 210 | TP_printk("sched_job=%llu, timeline=%s, context=%u, seqno=%u, ring_name=%s, num_ibs=%u", |
|---|
| 210 | 211 | __entry->sched_job_id, __get_str(timeline), __entry->context, |
|---|
| 211 | | - __entry->seqno, __entry->ring_name, __entry->num_ibs) |
|---|
| 212 | + __entry->seqno, __get_str(ring), __entry->num_ibs) |
|---|
| 212 | 213 | ); |
|---|
| 213 | 214 | |
|---|
| 214 | 215 | |
|---|
| .. | .. |
|---|
| 218 | 219 | TP_ARGS(vm, ring, job), |
|---|
| 219 | 220 | TP_STRUCT__entry( |
|---|
| 220 | 221 | __field(u32, pasid) |
|---|
| 222 | + __string(ring, ring->name) |
|---|
| 221 | 223 | __field(u32, ring) |
|---|
| 222 | 224 | __field(u32, vmid) |
|---|
| 223 | 225 | __field(u32, vm_hub) |
|---|
| .. | .. |
|---|
| 227 | 229 | |
|---|
| 228 | 230 | TP_fast_assign( |
|---|
| 229 | 231 | __entry->pasid = vm->pasid; |
|---|
| 230 | | - __entry->ring = ring->idx; |
|---|
| 232 | + __assign_str(ring, ring->name) |
|---|
| 231 | 233 | __entry->vmid = job->vmid; |
|---|
| 232 | 234 | __entry->vm_hub = ring->funcs->vmhub, |
|---|
| 233 | 235 | __entry->pd_addr = job->vm_pd_addr; |
|---|
| 234 | 236 | __entry->needs_flush = job->vm_needs_flush; |
|---|
| 235 | 237 | ), |
|---|
| 236 | | - TP_printk("pasid=%d, ring=%u, id=%u, hub=%u, pd_addr=%010Lx needs_flush=%u", |
|---|
| 237 | | - __entry->pasid, __entry->ring, __entry->vmid, |
|---|
| 238 | + TP_printk("pasid=%d, ring=%s, id=%u, hub=%u, pd_addr=%010Lx needs_flush=%u", |
|---|
| 239 | + __entry->pasid, __get_str(ring), __entry->vmid, |
|---|
| 238 | 240 | __entry->vm_hub, __entry->pd_addr, __entry->needs_flush) |
|---|
| 239 | 241 | ); |
|---|
| 240 | 242 | |
|---|
| .. | .. |
|---|
| 319 | 321 | TP_ARGS(mapping) |
|---|
| 320 | 322 | ); |
|---|
| 321 | 323 | |
|---|
| 324 | +TRACE_EVENT(amdgpu_vm_update_ptes, |
|---|
| 325 | + TP_PROTO(struct amdgpu_vm_update_params *p, |
|---|
| 326 | + uint64_t start, uint64_t end, |
|---|
| 327 | + unsigned int nptes, uint64_t dst, |
|---|
| 328 | + uint64_t incr, uint64_t flags, |
|---|
| 329 | + pid_t pid, uint64_t vm_ctx), |
|---|
| 330 | + TP_ARGS(p, start, end, nptes, dst, incr, flags, pid, vm_ctx), |
|---|
| 331 | + TP_STRUCT__entry( |
|---|
| 332 | + __field(u64, start) |
|---|
| 333 | + __field(u64, end) |
|---|
| 334 | + __field(u64, flags) |
|---|
| 335 | + __field(unsigned int, nptes) |
|---|
| 336 | + __field(u64, incr) |
|---|
| 337 | + __field(pid_t, pid) |
|---|
| 338 | + __field(u64, vm_ctx) |
|---|
| 339 | + __dynamic_array(u64, dst, nptes) |
|---|
| 340 | + ), |
|---|
| 341 | + |
|---|
| 342 | + TP_fast_assign( |
|---|
| 343 | + unsigned int i; |
|---|
| 344 | + |
|---|
| 345 | + __entry->start = start; |
|---|
| 346 | + __entry->end = end; |
|---|
| 347 | + __entry->flags = flags; |
|---|
| 348 | + __entry->incr = incr; |
|---|
| 349 | + __entry->nptes = nptes; |
|---|
| 350 | + __entry->pid = pid; |
|---|
| 351 | + __entry->vm_ctx = vm_ctx; |
|---|
| 352 | + for (i = 0; i < nptes; ++i) { |
|---|
| 353 | + u64 addr = p->pages_addr ? amdgpu_vm_map_gart( |
|---|
| 354 | + p->pages_addr, dst) : dst; |
|---|
| 355 | + |
|---|
| 356 | + ((u64 *)__get_dynamic_array(dst))[i] = addr; |
|---|
| 357 | + dst += incr; |
|---|
| 358 | + } |
|---|
| 359 | + ), |
|---|
| 360 | + TP_printk("pid:%u vm_ctx:0x%llx start:0x%010llx end:0x%010llx," |
|---|
| 361 | + " flags:0x%llx, incr:%llu, dst:\n%s", __entry->pid, |
|---|
| 362 | + __entry->vm_ctx, __entry->start, __entry->end, |
|---|
| 363 | + __entry->flags, __entry->incr, __print_array( |
|---|
| 364 | + __get_dynamic_array(dst), __entry->nptes, 8)) |
|---|
| 365 | +); |
|---|
| 366 | + |
|---|
| 322 | 367 | TRACE_EVENT(amdgpu_vm_set_ptes, |
|---|
| 323 | 368 | TP_PROTO(uint64_t pe, uint64_t addr, unsigned count, |
|---|
| 324 | | - uint32_t incr, uint64_t flags), |
|---|
| 325 | | - TP_ARGS(pe, addr, count, incr, flags), |
|---|
| 369 | + uint32_t incr, uint64_t flags, bool direct), |
|---|
| 370 | + TP_ARGS(pe, addr, count, incr, flags, direct), |
|---|
| 326 | 371 | TP_STRUCT__entry( |
|---|
| 327 | 372 | __field(u64, pe) |
|---|
| 328 | 373 | __field(u64, addr) |
|---|
| 329 | 374 | __field(u32, count) |
|---|
| 330 | 375 | __field(u32, incr) |
|---|
| 331 | 376 | __field(u64, flags) |
|---|
| 377 | + __field(bool, direct) |
|---|
| 332 | 378 | ), |
|---|
| 333 | 379 | |
|---|
| 334 | 380 | TP_fast_assign( |
|---|
| .. | .. |
|---|
| 337 | 383 | __entry->count = count; |
|---|
| 338 | 384 | __entry->incr = incr; |
|---|
| 339 | 385 | __entry->flags = flags; |
|---|
| 386 | + __entry->direct = direct; |
|---|
| 340 | 387 | ), |
|---|
| 341 | | - TP_printk("pe=%010Lx, addr=%010Lx, incr=%u, flags=%llx, count=%u", |
|---|
| 342 | | - __entry->pe, __entry->addr, __entry->incr, |
|---|
| 343 | | - __entry->flags, __entry->count) |
|---|
| 388 | + TP_printk("pe=%010Lx, addr=%010Lx, incr=%u, flags=%llx, count=%u, " |
|---|
| 389 | + "direct=%d", __entry->pe, __entry->addr, __entry->incr, |
|---|
| 390 | + __entry->flags, __entry->count, __entry->direct) |
|---|
| 344 | 391 | ); |
|---|
| 345 | 392 | |
|---|
| 346 | 393 | TRACE_EVENT(amdgpu_vm_copy_ptes, |
|---|
| 347 | | - TP_PROTO(uint64_t pe, uint64_t src, unsigned count), |
|---|
| 348 | | - TP_ARGS(pe, src, count), |
|---|
| 394 | + TP_PROTO(uint64_t pe, uint64_t src, unsigned count, bool direct), |
|---|
| 395 | + TP_ARGS(pe, src, count, direct), |
|---|
| 349 | 396 | TP_STRUCT__entry( |
|---|
| 350 | 397 | __field(u64, pe) |
|---|
| 351 | 398 | __field(u64, src) |
|---|
| 352 | 399 | __field(u32, count) |
|---|
| 400 | + __field(bool, direct) |
|---|
| 353 | 401 | ), |
|---|
| 354 | 402 | |
|---|
| 355 | 403 | TP_fast_assign( |
|---|
| 356 | 404 | __entry->pe = pe; |
|---|
| 357 | 405 | __entry->src = src; |
|---|
| 358 | 406 | __entry->count = count; |
|---|
| 407 | + __entry->direct = direct; |
|---|
| 359 | 408 | ), |
|---|
| 360 | | - TP_printk("pe=%010Lx, src=%010Lx, count=%u", |
|---|
| 361 | | - __entry->pe, __entry->src, __entry->count) |
|---|
| 409 | + TP_printk("pe=%010Lx, src=%010Lx, count=%u, direct=%d", |
|---|
| 410 | + __entry->pe, __entry->src, __entry->count, |
|---|
| 411 | + __entry->direct) |
|---|
| 362 | 412 | ); |
|---|
| 363 | 413 | |
|---|
| 364 | 414 | TRACE_EVENT(amdgpu_vm_flush, |
|---|
| .. | .. |
|---|
| 366 | 416 | uint64_t pd_addr), |
|---|
| 367 | 417 | TP_ARGS(ring, vmid, pd_addr), |
|---|
| 368 | 418 | TP_STRUCT__entry( |
|---|
| 369 | | - __field(u32, ring) |
|---|
| 419 | + __string(ring, ring->name) |
|---|
| 370 | 420 | __field(u32, vmid) |
|---|
| 371 | 421 | __field(u32, vm_hub) |
|---|
| 372 | 422 | __field(u64, pd_addr) |
|---|
| 373 | 423 | ), |
|---|
| 374 | 424 | |
|---|
| 375 | 425 | TP_fast_assign( |
|---|
| 376 | | - __entry->ring = ring->idx; |
|---|
| 426 | + __assign_str(ring, ring->name) |
|---|
| 377 | 427 | __entry->vmid = vmid; |
|---|
| 378 | 428 | __entry->vm_hub = ring->funcs->vmhub; |
|---|
| 379 | 429 | __entry->pd_addr = pd_addr; |
|---|
| 380 | 430 | ), |
|---|
| 381 | | - TP_printk("ring=%u, id=%u, hub=%u, pd_addr=%010Lx", |
|---|
| 382 | | - __entry->ring, __entry->vmid, |
|---|
| 431 | + TP_printk("ring=%s, id=%u, hub=%u, pd_addr=%010Lx", |
|---|
| 432 | + __get_str(ring), __entry->vmid, |
|---|
| 383 | 433 | __entry->vm_hub,__entry->pd_addr) |
|---|
| 384 | 434 | ); |
|---|
| 385 | 435 | |
|---|
| .. | .. |
|---|
| 462 | 512 | __entry->new_placement, __entry->bo_size) |
|---|
| 463 | 513 | ); |
|---|
| 464 | 514 | |
|---|
| 515 | +TRACE_EVENT(amdgpu_ib_pipe_sync, |
|---|
| 516 | + TP_PROTO(struct amdgpu_job *sched_job, struct dma_fence *fence), |
|---|
| 517 | + TP_ARGS(sched_job, fence), |
|---|
| 518 | + TP_STRUCT__entry( |
|---|
| 519 | + __string(ring, sched_job->base.sched->name) |
|---|
| 520 | + __field(uint64_t, id) |
|---|
| 521 | + __field(struct dma_fence *, fence) |
|---|
| 522 | + __field(uint64_t, ctx) |
|---|
| 523 | + __field(unsigned, seqno) |
|---|
| 524 | + ), |
|---|
| 525 | + |
|---|
| 526 | + TP_fast_assign( |
|---|
| 527 | + __assign_str(ring, sched_job->base.sched->name) |
|---|
| 528 | + __entry->id = sched_job->base.id; |
|---|
| 529 | + __entry->fence = fence; |
|---|
| 530 | + __entry->ctx = fence->context; |
|---|
| 531 | + __entry->seqno = fence->seqno; |
|---|
| 532 | + ), |
|---|
| 533 | + TP_printk("job ring=%s, id=%llu, need pipe sync to fence=%p, context=%llu, seq=%u", |
|---|
| 534 | + __get_str(ring), __entry->id, |
|---|
| 535 | + __entry->fence, __entry->ctx, |
|---|
| 536 | + __entry->seqno) |
|---|
| 537 | +); |
|---|
| 538 | + |
|---|
| 465 | 539 | #undef AMDGPU_JOB_GET_TIMELINE_NAME |
|---|
| 466 | 540 | #endif |
|---|
| 467 | 541 | |
|---|