1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright © 2024 Intel Corporation 4 */ 5 6 #undef TRACE_SYSTEM 7 #define TRACE_SYSTEM xe 8 9 #if !defined(_XE_TRACE_BO_H_) || defined(TRACE_HEADER_MULTI_READ) 10 #define _XE_TRACE_BO_H_ 11 12 #include <linux/tracepoint.h> 13 #include <linux/types.h> 14 15 #include "xe_bo.h" 16 #include "xe_bo_types.h" 17 #include "xe_vm.h" 18 19 #define __dev_name_xe(xe) dev_name((xe)->drm.dev) 20 #define __dev_name_bo(bo) dev_name(xe_bo_device(bo)->drm.dev) 21 #define __dev_name_vm(vm) dev_name((vm)->xe->drm.dev) 22 #define __dev_name_vma(vma) __dev_name_vm(xe_vma_vm(vma)) 23 24 #define XE_VM_TRACE_MODE_DMA_FENCE 0 25 #define XE_VM_TRACE_MODE_PREEMPT_FENCE 1 26 #define XE_VM_TRACE_MODE_FAULT 2 27 28 DECLARE_EVENT_CLASS(xe_bo, 29 TP_PROTO(struct xe_bo *bo), 30 TP_ARGS(bo), 31 32 TP_STRUCT__entry( 33 __string(dev, __dev_name_bo(bo)) 34 __field(size_t, size) 35 __field(u32, flags) 36 __field(struct xe_vm *, vm) 37 ), 38 39 TP_fast_assign( 40 __assign_str(dev); 41 __entry->size = xe_bo_size(bo); 42 __entry->flags = bo->flags; 43 __entry->vm = bo->vm; 44 ), 45 46 TP_printk("dev=%s, size=%zu, flags=0x%02x, vm=%p", 47 __get_str(dev), __entry->size, 48 __entry->flags, __entry->vm) 49 ); 50 51 DEFINE_EVENT(xe_bo, xe_bo_cpu_fault, 52 TP_PROTO(struct xe_bo *bo), 53 TP_ARGS(bo) 54 ); 55 56 DEFINE_EVENT(xe_bo, xe_bo_validate, 57 TP_PROTO(struct xe_bo *bo), 58 TP_ARGS(bo) 59 ); 60 61 DEFINE_EVENT(xe_bo, xe_bo_create, 62 TP_PROTO(struct xe_bo *bo), 63 TP_ARGS(bo) 64 ); 65 66 TRACE_EVENT(xe_bo_move, 67 TP_PROTO(struct xe_bo *bo, uint32_t new_placement, uint32_t old_placement, 68 bool move_lacks_source), 69 TP_ARGS(bo, new_placement, old_placement, move_lacks_source), 70 TP_STRUCT__entry( 71 __field(struct xe_bo *, bo) 72 __field(size_t, size) 73 __string(new_placement_name, xe_mem_type_to_name[new_placement]) 74 __string(old_placement_name, xe_mem_type_to_name[old_placement]) 75 __string(device_id, __dev_name_bo(bo)) 76 __field(bool, move_lacks_source) 77 ), 78 79 TP_fast_assign( 80 __entry->bo = bo; 81 __entry->size = xe_bo_size(bo); 82 __assign_str(new_placement_name); 83 __assign_str(old_placement_name); 84 __assign_str(device_id); 85 __entry->move_lacks_source = move_lacks_source; 86 ), 87 TP_printk("move_lacks_source:%s, migrate object %p [size %zu] from %s to %s device_id:%s", 88 __entry->move_lacks_source ? "yes" : "no", __entry->bo, __entry->size, 89 __get_str(old_placement_name), 90 __get_str(new_placement_name), __get_str(device_id)) 91 ); 92 93 DECLARE_EVENT_CLASS(xe_vma, 94 TP_PROTO(struct xe_vma *vma), 95 TP_ARGS(vma), 96 97 TP_STRUCT__entry( 98 __string(dev, __dev_name_vma(vma)) 99 __field(struct xe_vma *, vma) 100 __field(struct xe_vm *, vm) 101 __field(u32, asid) 102 __field(u64, start) 103 __field(u64, end) 104 __field(u64, ptr) 105 ), 106 107 TP_fast_assign( 108 __assign_str(dev); 109 __entry->vma = vma; 110 __entry->vm = xe_vma_vm(vma); 111 __entry->asid = xe_vma_vm(vma)->usm.asid; 112 __entry->start = xe_vma_start(vma); 113 __entry->end = xe_vma_end(vma) - 1; 114 __entry->ptr = xe_vma_userptr(vma); 115 ), 116 117 TP_printk("dev=%s, vma=%p, vm=%p, asid=0x%05x, start=0x%012llx, end=0x%012llx, userptr=0x%012llx", 118 __get_str(dev), __entry->vma, __entry->vm, 119 __entry->asid, __entry->start, 120 __entry->end, __entry->ptr) 121 ) 122 123 DEFINE_EVENT(xe_vma, xe_vma_flush, 124 TP_PROTO(struct xe_vma *vma), 125 TP_ARGS(vma) 126 ); 127 128 DEFINE_EVENT(xe_vma, xe_vma_pagefault, 129 TP_PROTO(struct xe_vma *vma), 130 TP_ARGS(vma) 131 ); 132 133 DEFINE_EVENT(xe_vma, xe_vma_acc, 134 TP_PROTO(struct xe_vma *vma), 135 TP_ARGS(vma) 136 ); 137 138 DEFINE_EVENT(xe_vma, xe_vma_bind, 139 TP_PROTO(struct xe_vma *vma), 140 TP_ARGS(vma) 141 ); 142 143 DEFINE_EVENT(xe_vma, xe_vma_pf_bind, 144 TP_PROTO(struct xe_vma *vma), 145 TP_ARGS(vma) 146 ); 147 148 DEFINE_EVENT(xe_vma, xe_vma_unbind, 149 TP_PROTO(struct xe_vma *vma), 150 TP_ARGS(vma) 151 ); 152 153 DEFINE_EVENT(xe_vma, xe_vma_userptr_rebind_worker, 154 TP_PROTO(struct xe_vma *vma), 155 TP_ARGS(vma) 156 ); 157 158 DEFINE_EVENT(xe_vma, xe_vma_userptr_rebind_exec, 159 TP_PROTO(struct xe_vma *vma), 160 TP_ARGS(vma) 161 ); 162 163 DEFINE_EVENT(xe_vma, xe_vma_rebind_worker, 164 TP_PROTO(struct xe_vma *vma), 165 TP_ARGS(vma) 166 ); 167 168 DEFINE_EVENT(xe_vma, xe_vma_rebind_exec, 169 TP_PROTO(struct xe_vma *vma), 170 TP_ARGS(vma) 171 ); 172 173 DEFINE_EVENT(xe_vma, xe_vma_userptr_invalidate, 174 TP_PROTO(struct xe_vma *vma), 175 TP_ARGS(vma) 176 ); 177 178 DEFINE_EVENT(xe_vma, xe_vma_invalidate, 179 TP_PROTO(struct xe_vma *vma), 180 TP_ARGS(vma) 181 ); 182 183 DEFINE_EVENT(xe_vma, xe_vma_evict, 184 TP_PROTO(struct xe_vma *vma), 185 TP_ARGS(vma) 186 ); 187 188 DEFINE_EVENT(xe_vma, xe_vma_userptr_invalidate_complete, 189 TP_PROTO(struct xe_vma *vma), 190 TP_ARGS(vma) 191 ); 192 193 DECLARE_EVENT_CLASS(xe_vm, 194 TP_PROTO(struct xe_vm *vm), 195 TP_ARGS(vm), 196 197 TP_STRUCT__entry( 198 __string(dev, __dev_name_vm(vm)) 199 __field(struct xe_vm *, vm) 200 __field(u32, asid) 201 __field(u32, flags) 202 __field(u8, mode) 203 ), 204 205 TP_fast_assign( 206 __assign_str(dev); 207 __entry->vm = vm; 208 __entry->asid = vm->usm.asid; 209 __entry->flags = vm->flags; 210 __entry->mode = xe_vm_in_fault_mode(vm) ? 211 XE_VM_TRACE_MODE_FAULT : 212 xe_vm_in_preempt_fence_mode(vm) ? 213 XE_VM_TRACE_MODE_PREEMPT_FENCE : 214 XE_VM_TRACE_MODE_DMA_FENCE; 215 ), 216 217 TP_printk("dev=%s, vm=%p, asid=0x%05x, vm flags=0x%05x, mode=%s", 218 __get_str(dev), __entry->vm, __entry->asid, 219 __entry->flags, 220 __print_symbolic(__entry->mode, 221 { XE_VM_TRACE_MODE_DMA_FENCE, "dma-fence" }, 222 { XE_VM_TRACE_MODE_PREEMPT_FENCE, "preempt-fence" }, 223 { XE_VM_TRACE_MODE_FAULT, "fault" })) 224 ); 225 226 DEFINE_EVENT(xe_vm, xe_vm_kill, 227 TP_PROTO(struct xe_vm *vm), 228 TP_ARGS(vm) 229 ); 230 231 DEFINE_EVENT(xe_vm, xe_vm_create, 232 TP_PROTO(struct xe_vm *vm), 233 TP_ARGS(vm) 234 ); 235 236 DEFINE_EVENT(xe_vm, xe_vm_free, 237 TP_PROTO(struct xe_vm *vm), 238 TP_ARGS(vm) 239 ); 240 241 DEFINE_EVENT(xe_vm, xe_vm_close_and_put, 242 TP_PROTO(struct xe_vm *vm), 243 TP_ARGS(vm) 244 ); 245 246 DEFINE_EVENT(xe_vm, xe_vm_asid_release, 247 TP_PROTO(struct xe_vm *vm), 248 TP_ARGS(vm) 249 ); 250 251 DEFINE_EVENT(xe_vm, xe_vm_cpu_bind, 252 TP_PROTO(struct xe_vm *vm), 253 TP_ARGS(vm) 254 ); 255 256 DEFINE_EVENT(xe_vm, xe_vm_restart, 257 TP_PROTO(struct xe_vm *vm), 258 TP_ARGS(vm) 259 ); 260 261 DEFINE_EVENT(xe_vm, xe_vm_rebind_worker_enter, 262 TP_PROTO(struct xe_vm *vm), 263 TP_ARGS(vm) 264 ); 265 266 DEFINE_EVENT(xe_vm, xe_vm_rebind_worker_retry, 267 TP_PROTO(struct xe_vm *vm), 268 TP_ARGS(vm) 269 ); 270 271 DEFINE_EVENT(xe_vm, xe_vm_rebind_worker_exit, 272 TP_PROTO(struct xe_vm *vm), 273 TP_ARGS(vm) 274 ); 275 276 DEFINE_EVENT(xe_vm, xe_vm_ops_fail, 277 TP_PROTO(struct xe_vm *vm), 278 TP_ARGS(vm) 279 ); 280 281 TRACE_EVENT(xe_pagefault_fail, 282 TP_PROTO(struct xe_device *xe, struct xe_vm *vm, struct xe_vma *vma, 283 u32 asid, u64 page_addr, u8 reason, int err), 284 TP_ARGS(xe, vm, vma, asid, page_addr, reason, err), 285 286 TP_STRUCT__entry(__string(dev, __dev_name_xe(xe)) 287 __field(struct xe_vm *, vm) 288 __field(struct xe_vma *, vma) 289 __field(u32, asid) 290 __field(u64, page_addr) 291 __field(u8, reason) 292 __field(int, err) 293 ), 294 295 TP_fast_assign(__assign_str(dev); 296 __entry->vm = vm; 297 __entry->vma = vma; 298 __entry->asid = asid; 299 __entry->page_addr = page_addr; 300 __entry->reason = reason; 301 __entry->err = err; 302 ), 303 304 TP_printk("dev=%s, vm=%p, vma=%p, asid=0x%05x, page_addr=0x%012llx, reason=%u, err=%d", 305 __get_str(dev), __entry->vm, __entry->vma, 306 __entry->asid, __entry->page_addr, __entry->reason, 307 __entry->err) 308 ); 309 310 #endif 311 312 /* This part must be outside protection */ 313 #undef TRACE_INCLUDE_PATH 314 #undef TRACE_INCLUDE_FILE 315 #define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/xe 316 #define TRACE_INCLUDE_FILE xe_trace_bo 317 #include <trace/define_trace.h> 318