1b7facbaeSOded Gabbay /* 2b7facbaeSOded Gabbay * Copyright 2014 Advanced Micro Devices, Inc. 3b7facbaeSOded Gabbay * 4b7facbaeSOded Gabbay * Permission is hereby granted, free of charge, to any person obtaining a 5b7facbaeSOded Gabbay * copy of this software and associated documentation files (the "Software"), 6b7facbaeSOded Gabbay * to deal in the Software without restriction, including without limitation 7b7facbaeSOded Gabbay * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8b7facbaeSOded Gabbay * and/or sell copies of the Software, and to permit persons to whom the 9b7facbaeSOded Gabbay * Software is furnished to do so, subject to the following conditions: 10b7facbaeSOded Gabbay * 11b7facbaeSOded Gabbay * The above copyright notice and this permission notice shall be included in 12b7facbaeSOded Gabbay * all copies or substantial portions of the Software. 13b7facbaeSOded Gabbay * 14b7facbaeSOded Gabbay * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15b7facbaeSOded Gabbay * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16b7facbaeSOded Gabbay * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17b7facbaeSOded Gabbay * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18b7facbaeSOded Gabbay * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19b7facbaeSOded Gabbay * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20b7facbaeSOded Gabbay * OTHER DEALINGS IN THE SOFTWARE. 21b7facbaeSOded Gabbay */ 22b7facbaeSOded Gabbay 23b7facbaeSOded Gabbay #ifndef KFD_IOCTL_H_INCLUDED 24b7facbaeSOded Gabbay #define KFD_IOCTL_H_INCLUDED 25b7facbaeSOded Gabbay 26472b46c3SMikko Rapeli #include <drm/drm.h> 27b7facbaeSOded Gabbay #include <linux/ioctl.h> 28b7facbaeSOded Gabbay 2991e2c191SAmber Lin /* 3091e2c191SAmber Lin * - 1.1 - initial version 3191e2c191SAmber Lin * - 1.3 - Add SMI events support 328c44390dSFelix Kuehling * - 1.4 - Indicate new SRAM EDC bit in device properties 3340ce74d1SPhilip Yang * - 1.5 - Add SVM API 34a43e2a0eSFelix Kuehling * - 1.6 - Query clear flags in SVM get_attr API 35692996f2SRajneesh Bhardwaj * - 1.7 - Checkpoint Restore (CRIU) API 3665722ff6SDavid Yat Sin * - 1.8 - CRIU - Support for SDMA transfers with GTT BOs 379731dd4cSDaniel Phillips * - 1.9 - Add available memory ioctl 383db7f894SPhilip Yang * - 1.10 - Add SMI profiler event log 3950e8ca0bSEric Huang * - 1.11 - Add unified memory for ctx save/restore area 40fd234e75SFelix Kuehling * - 1.12 - Add DMA buf export ioctl 41a159afdaSJonathan Kim * - 1.13 - Add debugger API 42d297eedfSJames Zhu * - 1.14 - Update kfd_event_data 434cabb217SFelix Kuehling * - 1.15 - Enable managing mappings in compute VMs with GEM_VA ioctl 4452666d8cSPhilip Yang * - 1.16 - Add contiguous VRAM allocation flag 45e06b71b2SJonathan Kim * - 1.17 - Add SDMA queue creation with target SDMA engine ID 46*cf6d949aSHarish Kasiviswanathan * - 1.18 - Rename pad in set_memory_policy_args to misc_process_flag 4791e2c191SAmber Lin */ 48b7facbaeSOded Gabbay #define KFD_IOCTL_MAJOR_VERSION 1 49*cf6d949aSHarish Kasiviswanathan #define KFD_IOCTL_MINOR_VERSION 18 50b7facbaeSOded Gabbay 51b7facbaeSOded Gabbay struct kfd_ioctl_get_version_args { 52472b46c3SMikko Rapeli __u32 major_version; /* from KFD */ 53472b46c3SMikko Rapeli __u32 minor_version; /* from KFD */ 54b7facbaeSOded Gabbay }; 55b7facbaeSOded Gabbay 56b7facbaeSOded Gabbay /* For kfd_ioctl_create_queue_args.queue_type. */ 571b4670f6SOak Zeng #define KFD_IOC_QUEUE_TYPE_COMPUTE 0x0 581b4670f6SOak Zeng #define KFD_IOC_QUEUE_TYPE_SDMA 0x1 591b4670f6SOak Zeng #define KFD_IOC_QUEUE_TYPE_COMPUTE_AQL 0x2 601b4670f6SOak Zeng #define KFD_IOC_QUEUE_TYPE_SDMA_XGMI 0x3 61e06b71b2SJonathan Kim #define KFD_IOC_QUEUE_TYPE_SDMA_BY_ENG_ID 0x4 62b7facbaeSOded Gabbay 63b7facbaeSOded Gabbay #define KFD_MAX_QUEUE_PERCENTAGE 100 64b7facbaeSOded Gabbay #define KFD_MAX_QUEUE_PRIORITY 15 65b7facbaeSOded Gabbay 66e9071194SDavid Yat Sin #define KFD_MIN_QUEUE_RING_SIZE 1024 67e9071194SDavid Yat Sin 68b7facbaeSOded Gabbay struct kfd_ioctl_create_queue_args { 69472b46c3SMikko Rapeli __u64 ring_base_address; /* to KFD */ 70472b46c3SMikko Rapeli __u64 write_pointer_address; /* from KFD */ 71472b46c3SMikko Rapeli __u64 read_pointer_address; /* from KFD */ 72472b46c3SMikko Rapeli __u64 doorbell_offset; /* from KFD */ 73b7facbaeSOded Gabbay 74472b46c3SMikko Rapeli __u32 ring_size; /* to KFD */ 75472b46c3SMikko Rapeli __u32 gpu_id; /* to KFD */ 76472b46c3SMikko Rapeli __u32 queue_type; /* to KFD */ 77472b46c3SMikko Rapeli __u32 queue_percentage; /* to KFD */ 78472b46c3SMikko Rapeli __u32 queue_priority; /* to KFD */ 79472b46c3SMikko Rapeli __u32 queue_id; /* from KFD */ 80b7facbaeSOded Gabbay 81472b46c3SMikko Rapeli __u64 eop_buffer_address; /* to KFD */ 82472b46c3SMikko Rapeli __u64 eop_buffer_size; /* to KFD */ 83472b46c3SMikko Rapeli __u64 ctx_save_restore_address; /* to KFD */ 84373d7080SFelix Kuehling __u32 ctx_save_restore_size; /* to KFD */ 85373d7080SFelix Kuehling __u32 ctl_stack_size; /* to KFD */ 86e06b71b2SJonathan Kim __u32 sdma_engine_id; /* to KFD */ 87e06b71b2SJonathan Kim __u32 pad; 88b7facbaeSOded Gabbay }; 89b7facbaeSOded Gabbay 90b7facbaeSOded Gabbay struct kfd_ioctl_destroy_queue_args { 91472b46c3SMikko Rapeli __u32 queue_id; /* to KFD */ 92472b46c3SMikko Rapeli __u32 pad; 93b7facbaeSOded Gabbay }; 94b7facbaeSOded Gabbay 95b7facbaeSOded Gabbay struct kfd_ioctl_update_queue_args { 96472b46c3SMikko Rapeli __u64 ring_base_address; /* to KFD */ 97b7facbaeSOded Gabbay 98472b46c3SMikko Rapeli __u32 queue_id; /* to KFD */ 99472b46c3SMikko Rapeli __u32 ring_size; /* to KFD */ 100472b46c3SMikko Rapeli __u32 queue_percentage; /* to KFD */ 101472b46c3SMikko Rapeli __u32 queue_priority; /* to KFD */ 102b7facbaeSOded Gabbay }; 103b7facbaeSOded Gabbay 104a7fe68a1SFelix Kuehling struct kfd_ioctl_set_cu_mask_args { 105a7fe68a1SFelix Kuehling __u32 queue_id; /* to KFD */ 106a7fe68a1SFelix Kuehling __u32 num_cu_mask; /* to KFD */ 107a7fe68a1SFelix Kuehling __u64 cu_mask_ptr; /* to KFD */ 108a7fe68a1SFelix Kuehling }; 109a7fe68a1SFelix Kuehling 1105df099e8SJay Cornwall struct kfd_ioctl_get_queue_wave_state_args { 1118e7f9171SDmitry V. Levin __u64 ctl_stack_address; /* to KFD */ 1128e7f9171SDmitry V. Levin __u32 ctl_stack_used_size; /* from KFD */ 1138e7f9171SDmitry V. Levin __u32 save_area_used_size; /* from KFD */ 1148e7f9171SDmitry V. Levin __u32 queue_id; /* to KFD */ 1158e7f9171SDmitry V. Levin __u32 pad; 1165df099e8SJay Cornwall }; 1175df099e8SJay Cornwall 1189731dd4cSDaniel Phillips struct kfd_ioctl_get_available_memory_args { 1199731dd4cSDaniel Phillips __u64 available; /* from KFD */ 1209731dd4cSDaniel Phillips __u32 gpu_id; /* to KFD */ 1219731dd4cSDaniel Phillips __u32 pad; 1229731dd4cSDaniel Phillips }; 1239731dd4cSDaniel Phillips 1244f98cf2bSJonathan Kim struct kfd_dbg_device_info_entry { 1254f98cf2bSJonathan Kim __u64 exception_status; 1264f98cf2bSJonathan Kim __u64 lds_base; 1274f98cf2bSJonathan Kim __u64 lds_limit; 1284f98cf2bSJonathan Kim __u64 scratch_base; 1294f98cf2bSJonathan Kim __u64 scratch_limit; 1304f98cf2bSJonathan Kim __u64 gpuvm_base; 1314f98cf2bSJonathan Kim __u64 gpuvm_limit; 1324f98cf2bSJonathan Kim __u32 gpu_id; 1334f98cf2bSJonathan Kim __u32 location_id; 1344f98cf2bSJonathan Kim __u32 vendor_id; 1354f98cf2bSJonathan Kim __u32 device_id; 1364f98cf2bSJonathan Kim __u32 revision_id; 1374f98cf2bSJonathan Kim __u32 subsystem_vendor_id; 1384f98cf2bSJonathan Kim __u32 subsystem_device_id; 1394f98cf2bSJonathan Kim __u32 fw_version; 1404f98cf2bSJonathan Kim __u32 gfx_target_version; 1414f98cf2bSJonathan Kim __u32 simd_count; 1424f98cf2bSJonathan Kim __u32 max_waves_per_simd; 1434f98cf2bSJonathan Kim __u32 array_count; 1444f98cf2bSJonathan Kim __u32 simd_arrays_per_engine; 1454f98cf2bSJonathan Kim __u32 num_xcc; 1464f98cf2bSJonathan Kim __u32 capability; 1474f98cf2bSJonathan Kim __u32 debug_prop; 1484f98cf2bSJonathan Kim }; 1494f98cf2bSJonathan Kim 150b7facbaeSOded Gabbay /* For kfd_ioctl_set_memory_policy_args.default_policy and alternate_policy */ 151b7facbaeSOded Gabbay #define KFD_IOC_CACHE_POLICY_COHERENT 0 152b7facbaeSOded Gabbay #define KFD_IOC_CACHE_POLICY_NONCOHERENT 1 153b7facbaeSOded Gabbay 154*cf6d949aSHarish Kasiviswanathan /* Misc. per process flags */ 155*cf6d949aSHarish Kasiviswanathan #define KFD_PROC_FLAG_MFMA_HIGH_PRECISION (1 << 0) 156*cf6d949aSHarish Kasiviswanathan 157b7facbaeSOded Gabbay struct kfd_ioctl_set_memory_policy_args { 158472b46c3SMikko Rapeli __u64 alternate_aperture_base; /* to KFD */ 159472b46c3SMikko Rapeli __u64 alternate_aperture_size; /* to KFD */ 160b7facbaeSOded Gabbay 161472b46c3SMikko Rapeli __u32 gpu_id; /* to KFD */ 162472b46c3SMikko Rapeli __u32 default_policy; /* to KFD */ 163472b46c3SMikko Rapeli __u32 alternate_policy; /* to KFD */ 164*cf6d949aSHarish Kasiviswanathan __u32 misc_process_flag; /* to KFD */ 165b7facbaeSOded Gabbay }; 166b7facbaeSOded Gabbay 167b7facbaeSOded Gabbay /* 168b7facbaeSOded Gabbay * All counters are monotonic. They are used for profiling of compute jobs. 169b7facbaeSOded Gabbay * The profiling is done by userspace. 170b7facbaeSOded Gabbay * 171b7facbaeSOded Gabbay * In case of GPU reset, the counter should not be affected. 172b7facbaeSOded Gabbay */ 173b7facbaeSOded Gabbay 174b7facbaeSOded Gabbay struct kfd_ioctl_get_clock_counters_args { 175472b46c3SMikko Rapeli __u64 gpu_clock_counter; /* from KFD */ 176472b46c3SMikko Rapeli __u64 cpu_clock_counter; /* from KFD */ 177472b46c3SMikko Rapeli __u64 system_clock_counter; /* from KFD */ 178472b46c3SMikko Rapeli __u64 system_clock_freq; /* from KFD */ 179b7facbaeSOded Gabbay 180472b46c3SMikko Rapeli __u32 gpu_id; /* to KFD */ 181472b46c3SMikko Rapeli __u32 pad; 182b7facbaeSOded Gabbay }; 183b7facbaeSOded Gabbay 184b7facbaeSOded Gabbay struct kfd_process_device_apertures { 185472b46c3SMikko Rapeli __u64 lds_base; /* from KFD */ 186472b46c3SMikko Rapeli __u64 lds_limit; /* from KFD */ 187472b46c3SMikko Rapeli __u64 scratch_base; /* from KFD */ 188472b46c3SMikko Rapeli __u64 scratch_limit; /* from KFD */ 189472b46c3SMikko Rapeli __u64 gpuvm_base; /* from KFD */ 190472b46c3SMikko Rapeli __u64 gpuvm_limit; /* from KFD */ 191472b46c3SMikko Rapeli __u32 gpu_id; /* from KFD */ 192472b46c3SMikko Rapeli __u32 pad; 193b7facbaeSOded Gabbay }; 194b7facbaeSOded Gabbay 195c7bcbfa4SFelix Kuehling /* 196c7bcbfa4SFelix Kuehling * AMDKFD_IOC_GET_PROCESS_APERTURES is deprecated. Use 197c7bcbfa4SFelix Kuehling * AMDKFD_IOC_GET_PROCESS_APERTURES_NEW instead, which supports an 198c7bcbfa4SFelix Kuehling * unlimited number of GPUs. 199c7bcbfa4SFelix Kuehling */ 200c7bcbfa4SFelix Kuehling #define NUM_OF_SUPPORTED_GPUS 7 201b7facbaeSOded Gabbay struct kfd_ioctl_get_process_apertures_args { 202b7facbaeSOded Gabbay struct kfd_process_device_apertures 203b7facbaeSOded Gabbay process_apertures[NUM_OF_SUPPORTED_GPUS];/* from KFD */ 204b7facbaeSOded Gabbay 205b7facbaeSOded Gabbay /* from KFD, should be in the range [1 - NUM_OF_SUPPORTED_GPUS] */ 206472b46c3SMikko Rapeli __u32 num_of_nodes; 207472b46c3SMikko Rapeli __u32 pad; 208b7facbaeSOded Gabbay }; 209b7facbaeSOded Gabbay 210c7bcbfa4SFelix Kuehling struct kfd_ioctl_get_process_apertures_new_args { 211c7bcbfa4SFelix Kuehling /* User allocated. Pointer to struct kfd_process_device_apertures 212c7bcbfa4SFelix Kuehling * filled in by Kernel 213c7bcbfa4SFelix Kuehling */ 214c7bcbfa4SFelix Kuehling __u64 kfd_process_device_apertures_ptr; 215c7bcbfa4SFelix Kuehling /* to KFD - indicates amount of memory present in 216c7bcbfa4SFelix Kuehling * kfd_process_device_apertures_ptr 217c7bcbfa4SFelix Kuehling * from KFD - Number of entries filled by KFD. 218c7bcbfa4SFelix Kuehling */ 219c7bcbfa4SFelix Kuehling __u32 num_of_nodes; 220c7bcbfa4SFelix Kuehling __u32 pad; 221c7bcbfa4SFelix Kuehling }; 222c7bcbfa4SFelix Kuehling 223aef11009SYair Shachar #define MAX_ALLOWED_NUM_POINTS 100 224aef11009SYair Shachar #define MAX_ALLOWED_AW_BUFF_SIZE 4096 225aef11009SYair Shachar #define MAX_ALLOWED_WAC_BUFF_SIZE 128 226aef11009SYair Shachar 227aef11009SYair Shachar struct kfd_ioctl_dbg_register_args { 228472b46c3SMikko Rapeli __u32 gpu_id; /* to KFD */ 229472b46c3SMikko Rapeli __u32 pad; 230aef11009SYair Shachar }; 231aef11009SYair Shachar 232aef11009SYair Shachar struct kfd_ioctl_dbg_unregister_args { 233472b46c3SMikko Rapeli __u32 gpu_id; /* to KFD */ 234472b46c3SMikko Rapeli __u32 pad; 235aef11009SYair Shachar }; 236aef11009SYair Shachar 237aef11009SYair Shachar struct kfd_ioctl_dbg_address_watch_args { 238472b46c3SMikko Rapeli __u64 content_ptr; /* a pointer to the actual content */ 239472b46c3SMikko Rapeli __u32 gpu_id; /* to KFD */ 240472b46c3SMikko Rapeli __u32 buf_size_in_bytes; /*including gpu_id and buf_size */ 241aef11009SYair Shachar }; 242aef11009SYair Shachar 243aef11009SYair Shachar struct kfd_ioctl_dbg_wave_control_args { 244472b46c3SMikko Rapeli __u64 content_ptr; /* a pointer to the actual content */ 245472b46c3SMikko Rapeli __u32 gpu_id; /* to KFD */ 246472b46c3SMikko Rapeli __u32 buf_size_in_bytes; /*including gpu_id and buf_size */ 247aef11009SYair Shachar }; 248aef11009SYair Shachar 24965722ff6SDavid Yat Sin #define KFD_INVALID_FD 0xffffffff 25065722ff6SDavid Yat Sin 25129a5d3ebSAndrew Lewycky /* Matching HSA_EVENTTYPE */ 25229a5d3ebSAndrew Lewycky #define KFD_IOC_EVENT_SIGNAL 0 25329a5d3ebSAndrew Lewycky #define KFD_IOC_EVENT_NODECHANGE 1 25429a5d3ebSAndrew Lewycky #define KFD_IOC_EVENT_DEVICESTATECHANGE 2 25529a5d3ebSAndrew Lewycky #define KFD_IOC_EVENT_HW_EXCEPTION 3 25629a5d3ebSAndrew Lewycky #define KFD_IOC_EVENT_SYSTEM_EVENT 4 25729a5d3ebSAndrew Lewycky #define KFD_IOC_EVENT_DEBUG_EVENT 5 25829a5d3ebSAndrew Lewycky #define KFD_IOC_EVENT_PROFILE_EVENT 6 25929a5d3ebSAndrew Lewycky #define KFD_IOC_EVENT_QUEUE_EVENT 7 26029a5d3ebSAndrew Lewycky #define KFD_IOC_EVENT_MEMORY 8 26129a5d3ebSAndrew Lewycky 26229a5d3ebSAndrew Lewycky #define KFD_IOC_WAIT_RESULT_COMPLETE 0 26329a5d3ebSAndrew Lewycky #define KFD_IOC_WAIT_RESULT_TIMEOUT 1 26429a5d3ebSAndrew Lewycky #define KFD_IOC_WAIT_RESULT_FAIL 2 26529a5d3ebSAndrew Lewycky 2667e86a365SOded Gabbay #define KFD_SIGNAL_EVENT_LIMIT 4096 26729a5d3ebSAndrew Lewycky 2680c119abaSShaoyun Liu /* For kfd_event_data.hw_exception_data.reset_type. */ 2690c119abaSShaoyun Liu #define KFD_HW_EXCEPTION_WHOLE_GPU_RESET 0 2700c119abaSShaoyun Liu #define KFD_HW_EXCEPTION_PER_ENGINE_RESET 1 2710c119abaSShaoyun Liu 2720c119abaSShaoyun Liu /* For kfd_event_data.hw_exception_data.reset_cause. */ 2730c119abaSShaoyun Liu #define KFD_HW_EXCEPTION_GPU_HANG 0 2740c119abaSShaoyun Liu #define KFD_HW_EXCEPTION_ECC 1 2750c119abaSShaoyun Liu 2769b54d201SEric Huang /* For kfd_hsa_memory_exception_data.ErrorType */ 2779b54d201SEric Huang #define KFD_MEM_ERR_NO_RAS 0 2789b54d201SEric Huang #define KFD_MEM_ERR_SRAM_ECC 1 2799b54d201SEric Huang #define KFD_MEM_ERR_POISON_CONSUMED 2 2809b54d201SEric Huang #define KFD_MEM_ERR_GPU_HANG 3 2810c119abaSShaoyun Liu 28229a5d3ebSAndrew Lewycky struct kfd_ioctl_create_event_args { 283472b46c3SMikko Rapeli __u64 event_page_offset; /* from KFD */ 284472b46c3SMikko Rapeli __u32 event_trigger_data; /* from KFD - signal events only */ 285472b46c3SMikko Rapeli __u32 event_type; /* to KFD */ 286472b46c3SMikko Rapeli __u32 auto_reset; /* to KFD */ 287472b46c3SMikko Rapeli __u32 node_id; /* to KFD - only valid for certain 28829a5d3ebSAndrew Lewycky event types */ 289472b46c3SMikko Rapeli __u32 event_id; /* from KFD */ 290472b46c3SMikko Rapeli __u32 event_slot_index; /* from KFD */ 29129a5d3ebSAndrew Lewycky }; 29229a5d3ebSAndrew Lewycky 29329a5d3ebSAndrew Lewycky struct kfd_ioctl_destroy_event_args { 294472b46c3SMikko Rapeli __u32 event_id; /* to KFD */ 295472b46c3SMikko Rapeli __u32 pad; 29629a5d3ebSAndrew Lewycky }; 29729a5d3ebSAndrew Lewycky 29829a5d3ebSAndrew Lewycky struct kfd_ioctl_set_event_args { 299472b46c3SMikko Rapeli __u32 event_id; /* to KFD */ 300472b46c3SMikko Rapeli __u32 pad; 30129a5d3ebSAndrew Lewycky }; 30229a5d3ebSAndrew Lewycky 30329a5d3ebSAndrew Lewycky struct kfd_ioctl_reset_event_args { 304472b46c3SMikko Rapeli __u32 event_id; /* to KFD */ 305472b46c3SMikko Rapeli __u32 pad; 30629a5d3ebSAndrew Lewycky }; 30729a5d3ebSAndrew Lewycky 30829a5d3ebSAndrew Lewycky struct kfd_memory_exception_failure { 309472b46c3SMikko Rapeli __u32 NotPresent; /* Page not present or supervisor privilege */ 310472b46c3SMikko Rapeli __u32 ReadOnly; /* Write access to a read-only page */ 311472b46c3SMikko Rapeli __u32 NoExecute; /* Execute access to a page marked NX */ 3122640c3faSshaoyunl __u32 imprecise; /* Can't determine the exact fault address */ 31329a5d3ebSAndrew Lewycky }; 31429a5d3ebSAndrew Lewycky 31529a5d3ebSAndrew Lewycky /* memory exception data */ 31629a5d3ebSAndrew Lewycky struct kfd_hsa_memory_exception_data { 31729a5d3ebSAndrew Lewycky struct kfd_memory_exception_failure failure; 318472b46c3SMikko Rapeli __u64 va; 319472b46c3SMikko Rapeli __u32 gpu_id; 3209b54d201SEric Huang __u32 ErrorType; /* 0 = no RAS error, 3219b54d201SEric Huang * 1 = ECC_SRAM, 3229b54d201SEric Huang * 2 = Link_SYNFLOOD (poison), 3239b54d201SEric Huang * 3 = GPU hang (not attributable to a specific cause), 3249b54d201SEric Huang * other values reserved 3259b54d201SEric Huang */ 32629a5d3ebSAndrew Lewycky }; 32729a5d3ebSAndrew Lewycky 3280c119abaSShaoyun Liu /* hw exception data */ 3290c119abaSShaoyun Liu struct kfd_hsa_hw_exception_data { 330aba11838SDmitry V. Levin __u32 reset_type; 331aba11838SDmitry V. Levin __u32 reset_cause; 332aba11838SDmitry V. Levin __u32 memory_lost; 333aba11838SDmitry V. Levin __u32 gpu_id; 3340c119abaSShaoyun Liu }; 3350c119abaSShaoyun Liu 3366f582513SJames Zhu /* hsa signal event data */ 3376f582513SJames Zhu struct kfd_hsa_signal_event_data { 3386f582513SJames Zhu __u64 last_event_age; /* to and from KFD */ 3396f582513SJames Zhu }; 3406f582513SJames Zhu 34129a5d3ebSAndrew Lewycky /* Event data */ 34229a5d3ebSAndrew Lewycky struct kfd_event_data { 34329a5d3ebSAndrew Lewycky union { 3446f582513SJames Zhu /* From KFD */ 34529a5d3ebSAndrew Lewycky struct kfd_hsa_memory_exception_data memory_exception_data; 3460c119abaSShaoyun Liu struct kfd_hsa_hw_exception_data hw_exception_data; 3476f582513SJames Zhu /* To and From KFD */ 3486f582513SJames Zhu struct kfd_hsa_signal_event_data signal_event_data; 3496f582513SJames Zhu }; 350472b46c3SMikko Rapeli __u64 kfd_event_data_ext; /* pointer to an extension structure 35129a5d3ebSAndrew Lewycky for future exception types */ 352472b46c3SMikko Rapeli __u32 event_id; /* to KFD */ 353472b46c3SMikko Rapeli __u32 pad; 35429a5d3ebSAndrew Lewycky }; 35529a5d3ebSAndrew Lewycky 35629a5d3ebSAndrew Lewycky struct kfd_ioctl_wait_events_args { 357472b46c3SMikko Rapeli __u64 events_ptr; /* pointed to struct 358aef11009SYair Shachar kfd_event_data array, to KFD */ 359472b46c3SMikko Rapeli __u32 num_events; /* to KFD */ 360472b46c3SMikko Rapeli __u32 wait_for_all; /* to KFD */ 361472b46c3SMikko Rapeli __u32 timeout; /* to KFD */ 362472b46c3SMikko Rapeli __u32 wait_result; /* from KFD */ 36329a5d3ebSAndrew Lewycky }; 36429a5d3ebSAndrew Lewycky 3656a1c9510SMoses Reuben struct kfd_ioctl_set_scratch_backing_va_args { 366b4d08520SDmitry V. Levin __u64 va_addr; /* to KFD */ 367b4d08520SDmitry V. Levin __u32 gpu_id; /* to KFD */ 368b4d08520SDmitry V. Levin __u32 pad; 3696a1c9510SMoses Reuben }; 3706a1c9510SMoses Reuben 3715d71dbc3SYong Zhao struct kfd_ioctl_get_tile_config_args { 3725d71dbc3SYong Zhao /* to KFD: pointer to tile array */ 373b4d08520SDmitry V. Levin __u64 tile_config_ptr; 3745d71dbc3SYong Zhao /* to KFD: pointer to macro tile array */ 375b4d08520SDmitry V. Levin __u64 macro_tile_config_ptr; 3765d71dbc3SYong Zhao /* to KFD: array size allocated by user mode 3775d71dbc3SYong Zhao * from KFD: array size filled by kernel 3785d71dbc3SYong Zhao */ 379b4d08520SDmitry V. Levin __u32 num_tile_configs; 3805d71dbc3SYong Zhao /* to KFD: array size allocated by user mode 3815d71dbc3SYong Zhao * from KFD: array size filled by kernel 3825d71dbc3SYong Zhao */ 383b4d08520SDmitry V. Levin __u32 num_macro_tile_configs; 3845d71dbc3SYong Zhao 385b4d08520SDmitry V. Levin __u32 gpu_id; /* to KFD */ 386b4d08520SDmitry V. Levin __u32 gb_addr_config; /* from KFD */ 387b4d08520SDmitry V. Levin __u32 num_banks; /* from KFD */ 388b4d08520SDmitry V. Levin __u32 num_ranks; /* from KFD */ 3895d71dbc3SYong Zhao /* struct size can be extended later if needed 3905d71dbc3SYong Zhao * without breaking ABI compatibility 3915d71dbc3SYong Zhao */ 3925d71dbc3SYong Zhao }; 3935d71dbc3SYong Zhao 394d7b9bd22SFelix Kuehling struct kfd_ioctl_set_trap_handler_args { 395a1102445SFelix Kuehling __u64 tba_addr; /* to KFD */ 396a1102445SFelix Kuehling __u64 tma_addr; /* to KFD */ 397a1102445SFelix Kuehling __u32 gpu_id; /* to KFD */ 398a1102445SFelix Kuehling __u32 pad; 399d7b9bd22SFelix Kuehling }; 400d7b9bd22SFelix Kuehling 4015ec7e028SFelix Kuehling struct kfd_ioctl_acquire_vm_args { 4025ec7e028SFelix Kuehling __u32 drm_fd; /* to KFD */ 4035ec7e028SFelix Kuehling __u32 gpu_id; /* to KFD */ 4045ec7e028SFelix Kuehling }; 4055ec7e028SFelix Kuehling 4065ec7e028SFelix Kuehling /* Allocation flags: memory types */ 4075ec7e028SFelix Kuehling #define KFD_IOC_ALLOC_MEM_FLAGS_VRAM (1 << 0) 4085ec7e028SFelix Kuehling #define KFD_IOC_ALLOC_MEM_FLAGS_GTT (1 << 1) 4095ec7e028SFelix Kuehling #define KFD_IOC_ALLOC_MEM_FLAGS_USERPTR (1 << 2) 4105ec7e028SFelix Kuehling #define KFD_IOC_ALLOC_MEM_FLAGS_DOORBELL (1 << 3) 411d8e408a8SOak Zeng #define KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP (1 << 4) 4125ec7e028SFelix Kuehling /* Allocation flags: attributes/access options */ 4135ec7e028SFelix Kuehling #define KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE (1 << 31) 4145ec7e028SFelix Kuehling #define KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE (1 << 30) 4155ec7e028SFelix Kuehling #define KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC (1 << 29) 4165ec7e028SFelix Kuehling #define KFD_IOC_ALLOC_MEM_FLAGS_NO_SUBSTITUTE (1 << 28) 4175ec7e028SFelix Kuehling #define KFD_IOC_ALLOC_MEM_FLAGS_AQL_QUEUE_MEM (1 << 27) 4185ec7e028SFelix Kuehling #define KFD_IOC_ALLOC_MEM_FLAGS_COHERENT (1 << 26) 41998291d6dSEric Huang #define KFD_IOC_ALLOC_MEM_FLAGS_UNCACHED (1 << 25) 4205f248462SDavid Francis #define KFD_IOC_ALLOC_MEM_FLAGS_EXT_COHERENT (1 << 24) 421155ce502SPhilip Yang #define KFD_IOC_ALLOC_MEM_FLAGS_CONTIGUOUS (1 << 23) 4225ec7e028SFelix Kuehling 4235ec7e028SFelix Kuehling /* Allocate memory for later SVM (shared virtual memory) mapping. 4245ec7e028SFelix Kuehling * 4255ec7e028SFelix Kuehling * @va_addr: virtual address of the memory to be allocated 4265ec7e028SFelix Kuehling * all later mappings on all GPUs will use this address 4275ec7e028SFelix Kuehling * @size: size in bytes 4285ec7e028SFelix Kuehling * @handle: buffer handle returned to user mode, used to refer to 4295ec7e028SFelix Kuehling * this allocation for mapping, unmapping and freeing 4305ec7e028SFelix Kuehling * @mmap_offset: for CPU-mapping the allocation by mmapping a render node 4315ec7e028SFelix Kuehling * for userptrs this is overloaded to specify the CPU address 4325ec7e028SFelix Kuehling * @gpu_id: device identifier 4335ec7e028SFelix Kuehling * @flags: memory type and attributes. See KFD_IOC_ALLOC_MEM_FLAGS above 4345ec7e028SFelix Kuehling */ 4355ec7e028SFelix Kuehling struct kfd_ioctl_alloc_memory_of_gpu_args { 4365ec7e028SFelix Kuehling __u64 va_addr; /* to KFD */ 4375ec7e028SFelix Kuehling __u64 size; /* to KFD */ 4385ec7e028SFelix Kuehling __u64 handle; /* from KFD */ 4395ec7e028SFelix Kuehling __u64 mmap_offset; /* to KFD (userptr), from KFD (mmap offset) */ 4405ec7e028SFelix Kuehling __u32 gpu_id; /* to KFD */ 4415ec7e028SFelix Kuehling __u32 flags; 4425ec7e028SFelix Kuehling }; 4435ec7e028SFelix Kuehling 4445ec7e028SFelix Kuehling /* Free memory allocated with kfd_ioctl_alloc_memory_of_gpu 4455ec7e028SFelix Kuehling * 4465ec7e028SFelix Kuehling * @handle: memory handle returned by alloc 4475ec7e028SFelix Kuehling */ 4485ec7e028SFelix Kuehling struct kfd_ioctl_free_memory_of_gpu_args { 4495ec7e028SFelix Kuehling __u64 handle; /* to KFD */ 4505ec7e028SFelix Kuehling }; 4515ec7e028SFelix Kuehling 4525ec7e028SFelix Kuehling /* Map memory to one or more GPUs 4535ec7e028SFelix Kuehling * 4545ec7e028SFelix Kuehling * @handle: memory handle returned by alloc 4555ec7e028SFelix Kuehling * @device_ids_array_ptr: array of gpu_ids (__u32 per device) 4565ec7e028SFelix Kuehling * @n_devices: number of devices in the array 4575ec7e028SFelix Kuehling * @n_success: number of devices mapped successfully 4585ec7e028SFelix Kuehling * 4595ec7e028SFelix Kuehling * @n_success returns information to the caller how many devices from 4605ec7e028SFelix Kuehling * the start of the array have mapped the buffer successfully. It can 4615ec7e028SFelix Kuehling * be passed into a subsequent retry call to skip those devices. For 4625ec7e028SFelix Kuehling * the first call the caller should initialize it to 0. 4635ec7e028SFelix Kuehling * 4645ec7e028SFelix Kuehling * If the ioctl completes with return code 0 (success), n_success == 4655ec7e028SFelix Kuehling * n_devices. 4665ec7e028SFelix Kuehling */ 4675ec7e028SFelix Kuehling struct kfd_ioctl_map_memory_to_gpu_args { 4685ec7e028SFelix Kuehling __u64 handle; /* to KFD */ 4695ec7e028SFelix Kuehling __u64 device_ids_array_ptr; /* to KFD */ 4705ec7e028SFelix Kuehling __u32 n_devices; /* to KFD */ 4715ec7e028SFelix Kuehling __u32 n_success; /* to/from KFD */ 4725ec7e028SFelix Kuehling }; 4735ec7e028SFelix Kuehling 4745ec7e028SFelix Kuehling /* Unmap memory from one or more GPUs 4755ec7e028SFelix Kuehling * 4765ec7e028SFelix Kuehling * same arguments as for mapping 4775ec7e028SFelix Kuehling */ 4785ec7e028SFelix Kuehling struct kfd_ioctl_unmap_memory_from_gpu_args { 4795ec7e028SFelix Kuehling __u64 handle; /* to KFD */ 4805ec7e028SFelix Kuehling __u64 device_ids_array_ptr; /* to KFD */ 4815ec7e028SFelix Kuehling __u32 n_devices; /* to KFD */ 4825ec7e028SFelix Kuehling __u32 n_success; /* to/from KFD */ 4835ec7e028SFelix Kuehling }; 4845ec7e028SFelix Kuehling 4855bb4b78bSOak Zeng /* Allocate GWS for specific queue 4865bb4b78bSOak Zeng * 4875bb4b78bSOak Zeng * @queue_id: queue's id that GWS is allocated for 4885bb4b78bSOak Zeng * @num_gws: how many GWS to allocate 4895bb4b78bSOak Zeng * @first_gws: index of the first GWS allocated. 4905bb4b78bSOak Zeng * only support contiguous GWS allocation 4915bb4b78bSOak Zeng */ 4925bb4b78bSOak Zeng struct kfd_ioctl_alloc_queue_gws_args { 4935bb4b78bSOak Zeng __u32 queue_id; /* to KFD */ 4945bb4b78bSOak Zeng __u32 num_gws; /* to KFD */ 4955bb4b78bSOak Zeng __u32 first_gws; /* from KFD */ 4965bb4b78bSOak Zeng __u32 pad; 4975bb4b78bSOak Zeng }; 4985bb4b78bSOak Zeng 4991dde0ea9SFelix Kuehling struct kfd_ioctl_get_dmabuf_info_args { 5001dde0ea9SFelix Kuehling __u64 size; /* from KFD */ 5011dde0ea9SFelix Kuehling __u64 metadata_ptr; /* to KFD */ 5021dde0ea9SFelix Kuehling __u32 metadata_size; /* to KFD (space allocated by user) 5031dde0ea9SFelix Kuehling * from KFD (actual metadata size) 5041dde0ea9SFelix Kuehling */ 5051dde0ea9SFelix Kuehling __u32 gpu_id; /* from KFD */ 5061dde0ea9SFelix Kuehling __u32 flags; /* from KFD (KFD_IOC_ALLOC_MEM_FLAGS) */ 5071dde0ea9SFelix Kuehling __u32 dmabuf_fd; /* to KFD */ 5081dde0ea9SFelix Kuehling }; 5091dde0ea9SFelix Kuehling 5101dde0ea9SFelix Kuehling struct kfd_ioctl_import_dmabuf_args { 5111dde0ea9SFelix Kuehling __u64 va_addr; /* to KFD */ 5121dde0ea9SFelix Kuehling __u64 handle; /* from KFD */ 5131dde0ea9SFelix Kuehling __u32 gpu_id; /* to KFD */ 5141dde0ea9SFelix Kuehling __u32 dmabuf_fd; /* to KFD */ 5151dde0ea9SFelix Kuehling }; 5161dde0ea9SFelix Kuehling 517fd234e75SFelix Kuehling struct kfd_ioctl_export_dmabuf_args { 518fd234e75SFelix Kuehling __u64 handle; /* to KFD */ 519fd234e75SFelix Kuehling __u32 flags; /* to KFD */ 520fd234e75SFelix Kuehling __u32 dmabuf_fd; /* from KFD */ 521fd234e75SFelix Kuehling }; 522fd234e75SFelix Kuehling 523938a0650SAmber Lin /* 524938a0650SAmber Lin * KFD SMI(System Management Interface) events 525938a0650SAmber Lin */ 526522ec6e0SMukul Joshi enum kfd_smi_event { 527522ec6e0SMukul Joshi KFD_SMI_EVENT_NONE = 0, /* not used */ 528522ec6e0SMukul Joshi KFD_SMI_EVENT_VMFAULT = 1, /* event start counting at 1 */ 529522ec6e0SMukul Joshi KFD_SMI_EVENT_THERMAL_THROTTLE = 2, 53055977744SMukul Joshi KFD_SMI_EVENT_GPU_PRE_RESET = 3, 53155977744SMukul Joshi KFD_SMI_EVENT_GPU_POST_RESET = 4, 532d7cfea33SPhilip Yang KFD_SMI_EVENT_MIGRATE_START = 5, 533d7cfea33SPhilip Yang KFD_SMI_EVENT_MIGRATE_END = 6, 534d7cfea33SPhilip Yang KFD_SMI_EVENT_PAGE_FAULT_START = 7, 535d7cfea33SPhilip Yang KFD_SMI_EVENT_PAGE_FAULT_END = 8, 536d7cfea33SPhilip Yang KFD_SMI_EVENT_QUEUE_EVICTION = 9, 537d7cfea33SPhilip Yang KFD_SMI_EVENT_QUEUE_RESTORE = 10, 538d7cfea33SPhilip Yang KFD_SMI_EVENT_UNMAP_FROM_GPU = 11, 539d7cfea33SPhilip Yang 540d7cfea33SPhilip Yang /* 541d7cfea33SPhilip Yang * max event number, as a flag bit to get events from all processes, 542d7cfea33SPhilip Yang * this requires super user permission, otherwise will not be able to 543d7cfea33SPhilip Yang * receive event from any process. Without this flag to receive events 544d7cfea33SPhilip Yang * from same process. 545d7cfea33SPhilip Yang */ 546d7cfea33SPhilip Yang KFD_SMI_EVENT_ALL_PROCESS = 64 547d7cfea33SPhilip Yang }; 548d7cfea33SPhilip Yang 549663b0f1eSPhilip Yang /* The reason of the page migration event */ 550d7cfea33SPhilip Yang enum KFD_MIGRATE_TRIGGERS { 551663b0f1eSPhilip Yang KFD_MIGRATE_TRIGGER_PREFETCH, /* Prefetch to GPU VRAM or system memory */ 552663b0f1eSPhilip Yang KFD_MIGRATE_TRIGGER_PAGEFAULT_GPU, /* GPU page fault recover */ 553663b0f1eSPhilip Yang KFD_MIGRATE_TRIGGER_PAGEFAULT_CPU, /* CPU page fault recover */ 554663b0f1eSPhilip Yang KFD_MIGRATE_TRIGGER_TTM_EVICTION /* TTM eviction */ 555d7cfea33SPhilip Yang }; 556d7cfea33SPhilip Yang 557663b0f1eSPhilip Yang /* The reason of user queue evition event */ 558d7cfea33SPhilip Yang enum KFD_QUEUE_EVICTION_TRIGGERS { 559663b0f1eSPhilip Yang KFD_QUEUE_EVICTION_TRIGGER_SVM, /* SVM buffer migration */ 560663b0f1eSPhilip Yang KFD_QUEUE_EVICTION_TRIGGER_USERPTR, /* userptr movement */ 561663b0f1eSPhilip Yang KFD_QUEUE_EVICTION_TRIGGER_TTM, /* TTM move buffer */ 562663b0f1eSPhilip Yang KFD_QUEUE_EVICTION_TRIGGER_SUSPEND, /* GPU suspend */ 563663b0f1eSPhilip Yang KFD_QUEUE_EVICTION_CRIU_CHECKPOINT, /* CRIU checkpoint */ 564663b0f1eSPhilip Yang KFD_QUEUE_EVICTION_CRIU_RESTORE /* CRIU restore */ 565d7cfea33SPhilip Yang }; 566d7cfea33SPhilip Yang 567663b0f1eSPhilip Yang /* The reason of unmap buffer from GPU event */ 568d7cfea33SPhilip Yang enum KFD_SVM_UNMAP_TRIGGERS { 569663b0f1eSPhilip Yang KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY, /* MMU notifier CPU buffer movement */ 570663b0f1eSPhilip Yang KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY_MIGRATE,/* MMU notifier page migration */ 571663b0f1eSPhilip Yang KFD_SVM_UNMAP_TRIGGER_UNMAP_FROM_CPU /* Unmap to free the buffer */ 572522ec6e0SMukul Joshi }; 573522ec6e0SMukul Joshi 574522ec6e0SMukul Joshi #define KFD_SMI_EVENT_MASK_FROM_INDEX(i) (1ULL << ((i) - 1)) 575d58b8a99SPhilip Yang #define KFD_SMI_EVENT_MSG_SIZE 96 576938a0650SAmber Lin 577938a0650SAmber Lin struct kfd_ioctl_smi_events_args { 578938a0650SAmber Lin __u32 gpuid; /* to KFD */ 579938a0650SAmber Lin __u32 anon_fd; /* from KFD */ 580938a0650SAmber Lin }; 581938a0650SAmber Lin 582663b0f1eSPhilip Yang /* 583663b0f1eSPhilip Yang * SVM event tracing via SMI system management interface 584663b0f1eSPhilip Yang * 585663b0f1eSPhilip Yang * Open event file descriptor 586663b0f1eSPhilip Yang * use ioctl AMDKFD_IOC_SMI_EVENTS, pass in gpuid and return a anonymous file 587663b0f1eSPhilip Yang * descriptor to receive SMI events. 588663b0f1eSPhilip Yang * If calling with sudo permission, then file descriptor can be used to receive 589663b0f1eSPhilip Yang * SVM events from all processes, otherwise, to only receive SVM events of same 590663b0f1eSPhilip Yang * process. 591663b0f1eSPhilip Yang * 592663b0f1eSPhilip Yang * To enable the SVM event 593663b0f1eSPhilip Yang * Write event file descriptor with KFD_SMI_EVENT_MASK_FROM_INDEX(event) bitmap 594663b0f1eSPhilip Yang * mask to start record the event to the kfifo, use bitmap mask combination 595663b0f1eSPhilip Yang * for multiple events. New event mask will overwrite the previous event mask. 596663b0f1eSPhilip Yang * KFD_SMI_EVENT_MASK_FROM_INDEX(KFD_SMI_EVENT_ALL_PROCESS) bit requires sudo 597663b0f1eSPhilip Yang * permisson to receive SVM events from all process. 598663b0f1eSPhilip Yang * 599663b0f1eSPhilip Yang * To receive the event 600663b0f1eSPhilip Yang * Application can poll file descriptor to wait for the events, then read event 601663b0f1eSPhilip Yang * from the file into a buffer. Each event is one line string message, starting 602663b0f1eSPhilip Yang * with the event id, then the event specific information. 603663b0f1eSPhilip Yang * 604663b0f1eSPhilip Yang * To decode event information 605663b0f1eSPhilip Yang * The following event format string macro can be used with sscanf to decode 606663b0f1eSPhilip Yang * the specific event information. 607663b0f1eSPhilip Yang * event triggers: the reason to generate the event, defined as enum for unmap, 608663b0f1eSPhilip Yang * eviction and migrate events. 609663b0f1eSPhilip Yang * node, from, to, prefetch_loc, preferred_loc: GPU ID, or 0 for system memory. 610663b0f1eSPhilip Yang * addr: user mode address, in pages 611663b0f1eSPhilip Yang * size: in pages 612663b0f1eSPhilip Yang * pid: the process ID to generate the event 613663b0f1eSPhilip Yang * ns: timestamp in nanosecond-resolution, starts at system boot time but 614663b0f1eSPhilip Yang * stops during suspend 615663b0f1eSPhilip Yang * migrate_update: GPU page fault is recovered by 'M' for migrate, 'U' for update 616663b0f1eSPhilip Yang * rw: 'W' for write page fault, 'R' for read page fault 617663b0f1eSPhilip Yang * rescheduled: 'R' if the queue restore failed and rescheduled to try again 618dad6c45cSPhilip Yang * error_code: migrate failure error code, 0 if no error 619663b0f1eSPhilip Yang */ 620663b0f1eSPhilip Yang #define KFD_EVENT_FMT_UPDATE_GPU_RESET(reset_seq_num, reset_cause)\ 621663b0f1eSPhilip Yang "%x %s\n", (reset_seq_num), (reset_cause) 622663b0f1eSPhilip Yang 623663b0f1eSPhilip Yang #define KFD_EVENT_FMT_THERMAL_THROTTLING(bitmask, counter)\ 624663b0f1eSPhilip Yang "%llx:%llx\n", (bitmask), (counter) 625663b0f1eSPhilip Yang 626663b0f1eSPhilip Yang #define KFD_EVENT_FMT_VMFAULT(pid, task_name)\ 627663b0f1eSPhilip Yang "%x:%s\n", (pid), (task_name) 628663b0f1eSPhilip Yang 629663b0f1eSPhilip Yang #define KFD_EVENT_FMT_PAGEFAULT_START(ns, pid, addr, node, rw)\ 630663b0f1eSPhilip Yang "%lld -%d @%lx(%x) %c\n", (ns), (pid), (addr), (node), (rw) 631663b0f1eSPhilip Yang 632663b0f1eSPhilip Yang #define KFD_EVENT_FMT_PAGEFAULT_END(ns, pid, addr, node, migrate_update)\ 633663b0f1eSPhilip Yang "%lld -%d @%lx(%x) %c\n", (ns), (pid), (addr), (node), (migrate_update) 634663b0f1eSPhilip Yang 635663b0f1eSPhilip Yang #define KFD_EVENT_FMT_MIGRATE_START(ns, pid, start, size, from, to, prefetch_loc,\ 636663b0f1eSPhilip Yang preferred_loc, migrate_trigger)\ 637663b0f1eSPhilip Yang "%lld -%d @%lx(%lx) %x->%x %x:%x %d\n", (ns), (pid), (start), (size),\ 638663b0f1eSPhilip Yang (from), (to), (prefetch_loc), (preferred_loc), (migrate_trigger) 639663b0f1eSPhilip Yang 640dad6c45cSPhilip Yang #define KFD_EVENT_FMT_MIGRATE_END(ns, pid, start, size, from, to, migrate_trigger, error_code) \ 641dad6c45cSPhilip Yang "%lld -%d @%lx(%lx) %x->%x %d %d\n", (ns), (pid), (start), (size),\ 642dad6c45cSPhilip Yang (from), (to), (migrate_trigger), (error_code) 643663b0f1eSPhilip Yang 644663b0f1eSPhilip Yang #define KFD_EVENT_FMT_QUEUE_EVICTION(ns, pid, node, evict_trigger)\ 645663b0f1eSPhilip Yang "%lld -%d %x %d\n", (ns), (pid), (node), (evict_trigger) 646663b0f1eSPhilip Yang 647663b0f1eSPhilip Yang #define KFD_EVENT_FMT_QUEUE_RESTORE(ns, pid, node, rescheduled)\ 648663b0f1eSPhilip Yang "%lld -%d %x %c\n", (ns), (pid), (node), (rescheduled) 649663b0f1eSPhilip Yang 650663b0f1eSPhilip Yang #define KFD_EVENT_FMT_UNMAP_FROM_GPU(ns, pid, addr, size, node, unmap_trigger)\ 651663b0f1eSPhilip Yang "%lld -%d @%lx(%lx) %x %d\n", (ns), (pid), (addr), (size),\ 652663b0f1eSPhilip Yang (node), (unmap_trigger) 653663b0f1eSPhilip Yang 65436988070SRajneesh Bhardwaj /************************************************************************************************** 65536988070SRajneesh Bhardwaj * CRIU IOCTLs (Checkpoint Restore In Userspace) 65636988070SRajneesh Bhardwaj * 65736988070SRajneesh Bhardwaj * When checkpointing a process, the userspace application will perform: 65836988070SRajneesh Bhardwaj * 1. PROCESS_INFO op to determine current process information. This pauses execution and evicts 65936988070SRajneesh Bhardwaj * all the queues. 66036988070SRajneesh Bhardwaj * 2. CHECKPOINT op to checkpoint process contents (BOs, queues, events, svm-ranges) 66136988070SRajneesh Bhardwaj * 3. UNPAUSE op to un-evict all the queues 66236988070SRajneesh Bhardwaj * 66336988070SRajneesh Bhardwaj * When restoring a process, the CRIU userspace application will perform: 66436988070SRajneesh Bhardwaj * 66536988070SRajneesh Bhardwaj * 1. RESTORE op to restore process contents 66636988070SRajneesh Bhardwaj * 2. RESUME op to start the process 66736988070SRajneesh Bhardwaj * 66836988070SRajneesh Bhardwaj * Note: Queues are forced into an evicted state after a successful PROCESS_INFO. User 66936988070SRajneesh Bhardwaj * application needs to perform an UNPAUSE operation after calling PROCESS_INFO. 67036988070SRajneesh Bhardwaj */ 67136988070SRajneesh Bhardwaj 67236988070SRajneesh Bhardwaj enum kfd_criu_op { 67336988070SRajneesh Bhardwaj KFD_CRIU_OP_PROCESS_INFO, 67436988070SRajneesh Bhardwaj KFD_CRIU_OP_CHECKPOINT, 67536988070SRajneesh Bhardwaj KFD_CRIU_OP_UNPAUSE, 67636988070SRajneesh Bhardwaj KFD_CRIU_OP_RESTORE, 67736988070SRajneesh Bhardwaj KFD_CRIU_OP_RESUME, 67836988070SRajneesh Bhardwaj }; 67936988070SRajneesh Bhardwaj 68036988070SRajneesh Bhardwaj /** 68136988070SRajneesh Bhardwaj * kfd_ioctl_criu_args - Arguments perform CRIU operation 68236988070SRajneesh Bhardwaj * @devices: [in/out] User pointer to memory location for devices information. 68336988070SRajneesh Bhardwaj * This is an array of type kfd_criu_device_bucket. 68436988070SRajneesh Bhardwaj * @bos: [in/out] User pointer to memory location for BOs information 68536988070SRajneesh Bhardwaj * This is an array of type kfd_criu_bo_bucket. 68636988070SRajneesh Bhardwaj * @priv_data: [in/out] User pointer to memory location for private data 68736988070SRajneesh Bhardwaj * @priv_data_size: [in/out] Size of priv_data in bytes 68836988070SRajneesh Bhardwaj * @num_devices: [in/out] Number of GPUs used by process. Size of @devices array. 68936988070SRajneesh Bhardwaj * @num_bos [in/out] Number of BOs used by process. Size of @bos array. 69036988070SRajneesh Bhardwaj * @num_objects: [in/out] Number of objects used by process. Objects are opaque to 69136988070SRajneesh Bhardwaj * user application. 69236988070SRajneesh Bhardwaj * @pid: [in/out] PID of the process being checkpointed 69336988070SRajneesh Bhardwaj * @op [in] Type of operation (kfd_criu_op) 69436988070SRajneesh Bhardwaj * 69536988070SRajneesh Bhardwaj * Return: 0 on success, -errno on failure 69636988070SRajneesh Bhardwaj */ 69736988070SRajneesh Bhardwaj struct kfd_ioctl_criu_args { 69836988070SRajneesh Bhardwaj __u64 devices; /* Used during ops: CHECKPOINT, RESTORE */ 69936988070SRajneesh Bhardwaj __u64 bos; /* Used during ops: CHECKPOINT, RESTORE */ 70036988070SRajneesh Bhardwaj __u64 priv_data; /* Used during ops: CHECKPOINT, RESTORE */ 70136988070SRajneesh Bhardwaj __u64 priv_data_size; /* Used during ops: PROCESS_INFO, RESTORE */ 70236988070SRajneesh Bhardwaj __u32 num_devices; /* Used during ops: PROCESS_INFO, RESTORE */ 70336988070SRajneesh Bhardwaj __u32 num_bos; /* Used during ops: PROCESS_INFO, RESTORE */ 70436988070SRajneesh Bhardwaj __u32 num_objects; /* Used during ops: PROCESS_INFO, RESTORE */ 70536988070SRajneesh Bhardwaj __u32 pid; /* Used during ops: PROCESS_INFO, RESUME */ 70636988070SRajneesh Bhardwaj __u32 op; 70736988070SRajneesh Bhardwaj }; 70836988070SRajneesh Bhardwaj 70936988070SRajneesh Bhardwaj struct kfd_criu_device_bucket { 71036988070SRajneesh Bhardwaj __u32 user_gpu_id; 71136988070SRajneesh Bhardwaj __u32 actual_gpu_id; 71236988070SRajneesh Bhardwaj __u32 drm_fd; 71336988070SRajneesh Bhardwaj __u32 pad; 71436988070SRajneesh Bhardwaj }; 71536988070SRajneesh Bhardwaj 71636988070SRajneesh Bhardwaj struct kfd_criu_bo_bucket { 71736988070SRajneesh Bhardwaj __u64 addr; 71836988070SRajneesh Bhardwaj __u64 size; 71936988070SRajneesh Bhardwaj __u64 offset; 72036988070SRajneesh Bhardwaj __u64 restored_offset; /* During restore, updated offset for BO */ 72136988070SRajneesh Bhardwaj __u32 gpu_id; /* This is the user_gpu_id */ 72236988070SRajneesh Bhardwaj __u32 alloc_flags; 72336988070SRajneesh Bhardwaj __u32 dmabuf_fd; 72436988070SRajneesh Bhardwaj __u32 pad; 72536988070SRajneesh Bhardwaj }; 72636988070SRajneesh Bhardwaj 72736988070SRajneesh Bhardwaj /* CRIU IOCTLs - END */ 72836988070SRajneesh Bhardwaj /**************************************************************************************************/ 72936988070SRajneesh Bhardwaj 73088807dc8SOak Zeng /* Register offset inside the remapped mmio page 73188807dc8SOak Zeng */ 73288807dc8SOak Zeng enum kfd_mmio_remap { 73388807dc8SOak Zeng KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL = 0, 73488807dc8SOak Zeng KFD_MMIO_REMAP_HDP_REG_FLUSH_CNTL = 4, 73588807dc8SOak Zeng }; 73688807dc8SOak Zeng 73740ce74d1SPhilip Yang /* Guarantee host access to memory */ 73840ce74d1SPhilip Yang #define KFD_IOCTL_SVM_FLAG_HOST_ACCESS 0x00000001 73940ce74d1SPhilip Yang /* Fine grained coherency between all devices with access */ 74040ce74d1SPhilip Yang #define KFD_IOCTL_SVM_FLAG_COHERENT 0x00000002 74140ce74d1SPhilip Yang /* Use any GPU in same hive as preferred device */ 74240ce74d1SPhilip Yang #define KFD_IOCTL_SVM_FLAG_HIVE_LOCAL 0x00000004 74340ce74d1SPhilip Yang /* GPUs only read, allows replication */ 74440ce74d1SPhilip Yang #define KFD_IOCTL_SVM_FLAG_GPU_RO 0x00000008 74540ce74d1SPhilip Yang /* Allow execution on GPU */ 74640ce74d1SPhilip Yang #define KFD_IOCTL_SVM_FLAG_GPU_EXEC 0x00000010 74740ce74d1SPhilip Yang /* GPUs mostly read, may allow similar optimizations as RO, but writes fault */ 74840ce74d1SPhilip Yang #define KFD_IOCTL_SVM_FLAG_GPU_READ_MOSTLY 0x00000020 749fce7bf30SEric Huang /* Keep GPU memory mapping always valid as if XNACK is disable */ 750fce7bf30SEric Huang #define KFD_IOCTL_SVM_FLAG_GPU_ALWAYS_MAPPED 0x00000040 7515f248462SDavid Francis /* Fine grained coherency between all devices using device-scope atomics */ 7525f248462SDavid Francis #define KFD_IOCTL_SVM_FLAG_EXT_COHERENT 0x00000080 75340ce74d1SPhilip Yang 75440ce74d1SPhilip Yang /** 75540ce74d1SPhilip Yang * kfd_ioctl_svm_op - SVM ioctl operations 75640ce74d1SPhilip Yang * 75740ce74d1SPhilip Yang * @KFD_IOCTL_SVM_OP_SET_ATTR: Modify one or more attributes 75840ce74d1SPhilip Yang * @KFD_IOCTL_SVM_OP_GET_ATTR: Query one or more attributes 75940ce74d1SPhilip Yang */ 76040ce74d1SPhilip Yang enum kfd_ioctl_svm_op { 76140ce74d1SPhilip Yang KFD_IOCTL_SVM_OP_SET_ATTR, 76240ce74d1SPhilip Yang KFD_IOCTL_SVM_OP_GET_ATTR 76340ce74d1SPhilip Yang }; 76440ce74d1SPhilip Yang 76540ce74d1SPhilip Yang /** kfd_ioctl_svm_location - Enum for preferred and prefetch locations 76640ce74d1SPhilip Yang * 76740ce74d1SPhilip Yang * GPU IDs are used to specify GPUs as preferred and prefetch locations. 76840ce74d1SPhilip Yang * Below definitions are used for system memory or for leaving the preferred 76940ce74d1SPhilip Yang * location unspecified. 77040ce74d1SPhilip Yang */ 77140ce74d1SPhilip Yang enum kfd_ioctl_svm_location { 77240ce74d1SPhilip Yang KFD_IOCTL_SVM_LOCATION_SYSMEM = 0, 77340ce74d1SPhilip Yang KFD_IOCTL_SVM_LOCATION_UNDEFINED = 0xffffffff 77440ce74d1SPhilip Yang }; 77540ce74d1SPhilip Yang 77640ce74d1SPhilip Yang /** 77740ce74d1SPhilip Yang * kfd_ioctl_svm_attr_type - SVM attribute types 77840ce74d1SPhilip Yang * 77940ce74d1SPhilip Yang * @KFD_IOCTL_SVM_ATTR_PREFERRED_LOC: gpuid of the preferred location, 0 for 78040ce74d1SPhilip Yang * system memory 78140ce74d1SPhilip Yang * @KFD_IOCTL_SVM_ATTR_PREFETCH_LOC: gpuid of the prefetch location, 0 for 78240ce74d1SPhilip Yang * system memory. Setting this triggers an 78340ce74d1SPhilip Yang * immediate prefetch (migration). 78440ce74d1SPhilip Yang * @KFD_IOCTL_SVM_ATTR_ACCESS: 78540ce74d1SPhilip Yang * @KFD_IOCTL_SVM_ATTR_ACCESS_IN_PLACE: 78640ce74d1SPhilip Yang * @KFD_IOCTL_SVM_ATTR_NO_ACCESS: specify memory access for the gpuid given 78740ce74d1SPhilip Yang * by the attribute value 78840ce74d1SPhilip Yang * @KFD_IOCTL_SVM_ATTR_SET_FLAGS: bitmask of flags to set (see 78940ce74d1SPhilip Yang * KFD_IOCTL_SVM_FLAG_...) 79040ce74d1SPhilip Yang * @KFD_IOCTL_SVM_ATTR_CLR_FLAGS: bitmask of flags to clear 79140ce74d1SPhilip Yang * @KFD_IOCTL_SVM_ATTR_GRANULARITY: migration granularity 79240ce74d1SPhilip Yang * (log2 num pages) 79340ce74d1SPhilip Yang */ 79440ce74d1SPhilip Yang enum kfd_ioctl_svm_attr_type { 79540ce74d1SPhilip Yang KFD_IOCTL_SVM_ATTR_PREFERRED_LOC, 79640ce74d1SPhilip Yang KFD_IOCTL_SVM_ATTR_PREFETCH_LOC, 79740ce74d1SPhilip Yang KFD_IOCTL_SVM_ATTR_ACCESS, 79840ce74d1SPhilip Yang KFD_IOCTL_SVM_ATTR_ACCESS_IN_PLACE, 79940ce74d1SPhilip Yang KFD_IOCTL_SVM_ATTR_NO_ACCESS, 80040ce74d1SPhilip Yang KFD_IOCTL_SVM_ATTR_SET_FLAGS, 80140ce74d1SPhilip Yang KFD_IOCTL_SVM_ATTR_CLR_FLAGS, 80240ce74d1SPhilip Yang KFD_IOCTL_SVM_ATTR_GRANULARITY 80340ce74d1SPhilip Yang }; 80440ce74d1SPhilip Yang 80540ce74d1SPhilip Yang /** 80640ce74d1SPhilip Yang * kfd_ioctl_svm_attribute - Attributes as pairs of type and value 80740ce74d1SPhilip Yang * 80840ce74d1SPhilip Yang * The meaning of the @value depends on the attribute type. 80940ce74d1SPhilip Yang * 81040ce74d1SPhilip Yang * @type: attribute type (see enum @kfd_ioctl_svm_attr_type) 81140ce74d1SPhilip Yang * @value: attribute value 81240ce74d1SPhilip Yang */ 81340ce74d1SPhilip Yang struct kfd_ioctl_svm_attribute { 81440ce74d1SPhilip Yang __u32 type; 81540ce74d1SPhilip Yang __u32 value; 81640ce74d1SPhilip Yang }; 81740ce74d1SPhilip Yang 81840ce74d1SPhilip Yang /** 81940ce74d1SPhilip Yang * kfd_ioctl_svm_args - Arguments for SVM ioctl 82040ce74d1SPhilip Yang * 82140ce74d1SPhilip Yang * @op specifies the operation to perform (see enum 82240ce74d1SPhilip Yang * @kfd_ioctl_svm_op). @start_addr and @size are common for all 82340ce74d1SPhilip Yang * operations. 82440ce74d1SPhilip Yang * 82540ce74d1SPhilip Yang * A variable number of attributes can be given in @attrs. 82640ce74d1SPhilip Yang * @nattr specifies the number of attributes. New attributes can be 82740ce74d1SPhilip Yang * added in the future without breaking the ABI. If unknown attributes 82840ce74d1SPhilip Yang * are given, the function returns -EINVAL. 82940ce74d1SPhilip Yang * 83040ce74d1SPhilip Yang * @KFD_IOCTL_SVM_OP_SET_ATTR sets attributes for a virtual address 83140ce74d1SPhilip Yang * range. It may overlap existing virtual address ranges. If it does, 83240ce74d1SPhilip Yang * the existing ranges will be split such that the attribute changes 83340ce74d1SPhilip Yang * only apply to the specified address range. 83440ce74d1SPhilip Yang * 83540ce74d1SPhilip Yang * @KFD_IOCTL_SVM_OP_GET_ATTR returns the intersection of attributes 83640ce74d1SPhilip Yang * over all memory in the given range and returns the result as the 83740ce74d1SPhilip Yang * attribute value. If different pages have different preferred or 83840ce74d1SPhilip Yang * prefetch locations, 0xffffffff will be returned for 83940ce74d1SPhilip Yang * @KFD_IOCTL_SVM_ATTR_PREFERRED_LOC or 84040ce74d1SPhilip Yang * @KFD_IOCTL_SVM_ATTR_PREFETCH_LOC resepctively. For 84140ce74d1SPhilip Yang * @KFD_IOCTL_SVM_ATTR_SET_FLAGS, flags of all pages will be 842a43e2a0eSFelix Kuehling * aggregated by bitwise AND. That means, a flag will be set in the 843a43e2a0eSFelix Kuehling * output, if that flag is set for all pages in the range. For 844a43e2a0eSFelix Kuehling * @KFD_IOCTL_SVM_ATTR_CLR_FLAGS, flags of all pages will be 845a43e2a0eSFelix Kuehling * aggregated by bitwise NOR. That means, a flag will be set in the 846a43e2a0eSFelix Kuehling * output, if that flag is clear for all pages in the range. 847a43e2a0eSFelix Kuehling * The minimum migration granularity throughout the range will be 848a43e2a0eSFelix Kuehling * returned for @KFD_IOCTL_SVM_ATTR_GRANULARITY. 84940ce74d1SPhilip Yang * 85040ce74d1SPhilip Yang * Querying of accessibility attributes works by initializing the 85140ce74d1SPhilip Yang * attribute type to @KFD_IOCTL_SVM_ATTR_ACCESS and the value to the 85240ce74d1SPhilip Yang * GPUID being queried. Multiple attributes can be given to allow 85340ce74d1SPhilip Yang * querying multiple GPUIDs. The ioctl function overwrites the 85440ce74d1SPhilip Yang * attribute type to indicate the access for the specified GPU. 85540ce74d1SPhilip Yang */ 85640ce74d1SPhilip Yang struct kfd_ioctl_svm_args { 85740ce74d1SPhilip Yang __u64 start_addr; 85840ce74d1SPhilip Yang __u64 size; 85940ce74d1SPhilip Yang __u32 op; 86040ce74d1SPhilip Yang __u32 nattr; 86140ce74d1SPhilip Yang /* Variable length array of attributes */ 86279aa0367SFelix Kuehling struct kfd_ioctl_svm_attribute attrs[]; 86340ce74d1SPhilip Yang }; 86440ce74d1SPhilip Yang 8650f7b5c44SAlex Sierra /** 8660f7b5c44SAlex Sierra * kfd_ioctl_set_xnack_mode_args - Arguments for set_xnack_mode 8670f7b5c44SAlex Sierra * 8680f7b5c44SAlex Sierra * @xnack_enabled: [in/out] Whether to enable XNACK mode for this process 8690f7b5c44SAlex Sierra * 8700f7b5c44SAlex Sierra * @xnack_enabled indicates whether recoverable page faults should be 8710f7b5c44SAlex Sierra * enabled for the current process. 0 means disabled, positive means 8720f7b5c44SAlex Sierra * enabled, negative means leave unchanged. If enabled, virtual address 8730f7b5c44SAlex Sierra * translations on GFXv9 and later AMD GPUs can return XNACK and retry 8740f7b5c44SAlex Sierra * the access until a valid PTE is available. This is used to implement 8750f7b5c44SAlex Sierra * device page faults. 8760f7b5c44SAlex Sierra * 8770f7b5c44SAlex Sierra * On output, @xnack_enabled returns the (new) current mode (0 or 8780f7b5c44SAlex Sierra * positive). Therefore, a negative input value can be used to query 8790f7b5c44SAlex Sierra * the current mode without changing it. 8800f7b5c44SAlex Sierra * 8810f7b5c44SAlex Sierra * The XNACK mode fundamentally changes the way SVM managed memory works 8820f7b5c44SAlex Sierra * in the driver, with subtle effects on application performance and 8830f7b5c44SAlex Sierra * functionality. 8840f7b5c44SAlex Sierra * 8850f7b5c44SAlex Sierra * Enabling XNACK mode requires shader programs to be compiled 8860f7b5c44SAlex Sierra * differently. Furthermore, not all GPUs support changing the mode 8870f7b5c44SAlex Sierra * per-process. Therefore changing the mode is only allowed while no 8880f7b5c44SAlex Sierra * user mode queues exist in the process. This ensure that no shader 8890f7b5c44SAlex Sierra * code is running that may be compiled for the wrong mode. And GPUs 8900f7b5c44SAlex Sierra * that cannot change to the requested mode will prevent the XNACK 8910f7b5c44SAlex Sierra * mode from occurring. All GPUs used by the process must be in the 8920f7b5c44SAlex Sierra * same XNACK mode. 8930f7b5c44SAlex Sierra * 8940f7b5c44SAlex Sierra * GFXv8 or older GPUs do not support 48 bit virtual addresses or SVM. 8950f7b5c44SAlex Sierra * Therefore those GPUs are not considered for the XNACK mode switch. 8960f7b5c44SAlex Sierra * 8970f7b5c44SAlex Sierra * Return: 0 on success, -errno on failure 8980f7b5c44SAlex Sierra */ 8990f7b5c44SAlex Sierra struct kfd_ioctl_set_xnack_mode_args { 9000f7b5c44SAlex Sierra __s32 xnack_enabled; 9010f7b5c44SAlex Sierra }; 9020f7b5c44SAlex Sierra 9034f98cf2bSJonathan Kim /* Wave launch override modes */ 9044f98cf2bSJonathan Kim enum kfd_dbg_trap_override_mode { 9054f98cf2bSJonathan Kim KFD_DBG_TRAP_OVERRIDE_OR = 0, 9064f98cf2bSJonathan Kim KFD_DBG_TRAP_OVERRIDE_REPLACE = 1 9074f98cf2bSJonathan Kim }; 9084f98cf2bSJonathan Kim 9094f98cf2bSJonathan Kim /* Wave launch overrides */ 9104f98cf2bSJonathan Kim enum kfd_dbg_trap_mask { 9114f98cf2bSJonathan Kim KFD_DBG_TRAP_MASK_FP_INVALID = 1, 9124f98cf2bSJonathan Kim KFD_DBG_TRAP_MASK_FP_INPUT_DENORMAL = 2, 9134f98cf2bSJonathan Kim KFD_DBG_TRAP_MASK_FP_DIVIDE_BY_ZERO = 4, 9144f98cf2bSJonathan Kim KFD_DBG_TRAP_MASK_FP_OVERFLOW = 8, 9154f98cf2bSJonathan Kim KFD_DBG_TRAP_MASK_FP_UNDERFLOW = 16, 9164f98cf2bSJonathan Kim KFD_DBG_TRAP_MASK_FP_INEXACT = 32, 9174f98cf2bSJonathan Kim KFD_DBG_TRAP_MASK_INT_DIVIDE_BY_ZERO = 64, 9184f98cf2bSJonathan Kim KFD_DBG_TRAP_MASK_DBG_ADDRESS_WATCH = 128, 9194f98cf2bSJonathan Kim KFD_DBG_TRAP_MASK_DBG_MEMORY_VIOLATION = 256, 9204f98cf2bSJonathan Kim KFD_DBG_TRAP_MASK_TRAP_ON_WAVE_START = (1 << 30), 9214f98cf2bSJonathan Kim KFD_DBG_TRAP_MASK_TRAP_ON_WAVE_END = (1 << 31) 9224f98cf2bSJonathan Kim }; 9234f98cf2bSJonathan Kim 9244f98cf2bSJonathan Kim /* Wave launch modes */ 9254f98cf2bSJonathan Kim enum kfd_dbg_trap_wave_launch_mode { 9264f98cf2bSJonathan Kim KFD_DBG_TRAP_WAVE_LAUNCH_MODE_NORMAL = 0, 9274f98cf2bSJonathan Kim KFD_DBG_TRAP_WAVE_LAUNCH_MODE_HALT = 1, 9284f98cf2bSJonathan Kim KFD_DBG_TRAP_WAVE_LAUNCH_MODE_DEBUG = 3 9294f98cf2bSJonathan Kim }; 9304f98cf2bSJonathan Kim 9314f98cf2bSJonathan Kim /* Address watch modes */ 9324f98cf2bSJonathan Kim enum kfd_dbg_trap_address_watch_mode { 9334f98cf2bSJonathan Kim KFD_DBG_TRAP_ADDRESS_WATCH_MODE_READ = 0, 9344f98cf2bSJonathan Kim KFD_DBG_TRAP_ADDRESS_WATCH_MODE_NONREAD = 1, 9354f98cf2bSJonathan Kim KFD_DBG_TRAP_ADDRESS_WATCH_MODE_ATOMIC = 2, 9364f98cf2bSJonathan Kim KFD_DBG_TRAP_ADDRESS_WATCH_MODE_ALL = 3 9374f98cf2bSJonathan Kim }; 9384f98cf2bSJonathan Kim 9394f98cf2bSJonathan Kim /* Additional wave settings */ 9404f98cf2bSJonathan Kim enum kfd_dbg_trap_flags { 9414f98cf2bSJonathan Kim KFD_DBG_TRAP_FLAG_SINGLE_MEM_OP = 1, 9429243240bSJonathan Kim KFD_DBG_TRAP_FLAG_SINGLE_ALU_OP = 2, 9434f98cf2bSJonathan Kim }; 9444f98cf2bSJonathan Kim 9454f98cf2bSJonathan Kim /* Trap exceptions */ 9464f98cf2bSJonathan Kim enum kfd_dbg_trap_exception_code { 9474f98cf2bSJonathan Kim EC_NONE = 0, 9484f98cf2bSJonathan Kim /* per queue */ 9494f98cf2bSJonathan Kim EC_QUEUE_WAVE_ABORT = 1, 9504f98cf2bSJonathan Kim EC_QUEUE_WAVE_TRAP = 2, 9514f98cf2bSJonathan Kim EC_QUEUE_WAVE_MATH_ERROR = 3, 9524f98cf2bSJonathan Kim EC_QUEUE_WAVE_ILLEGAL_INSTRUCTION = 4, 9534f98cf2bSJonathan Kim EC_QUEUE_WAVE_MEMORY_VIOLATION = 5, 9544f98cf2bSJonathan Kim EC_QUEUE_WAVE_APERTURE_VIOLATION = 6, 9554f98cf2bSJonathan Kim EC_QUEUE_PACKET_DISPATCH_DIM_INVALID = 16, 9564f98cf2bSJonathan Kim EC_QUEUE_PACKET_DISPATCH_GROUP_SEGMENT_SIZE_INVALID = 17, 9574f98cf2bSJonathan Kim EC_QUEUE_PACKET_DISPATCH_CODE_INVALID = 18, 9584f98cf2bSJonathan Kim EC_QUEUE_PACKET_RESERVED = 19, 9594f98cf2bSJonathan Kim EC_QUEUE_PACKET_UNSUPPORTED = 20, 9604f98cf2bSJonathan Kim EC_QUEUE_PACKET_DISPATCH_WORK_GROUP_SIZE_INVALID = 21, 9614f98cf2bSJonathan Kim EC_QUEUE_PACKET_DISPATCH_REGISTER_INVALID = 22, 9624f98cf2bSJonathan Kim EC_QUEUE_PACKET_VENDOR_UNSUPPORTED = 23, 9634f98cf2bSJonathan Kim EC_QUEUE_PREEMPTION_ERROR = 30, 9644f98cf2bSJonathan Kim EC_QUEUE_NEW = 31, 9654f98cf2bSJonathan Kim /* per device */ 9664f98cf2bSJonathan Kim EC_DEVICE_QUEUE_DELETE = 32, 9674f98cf2bSJonathan Kim EC_DEVICE_MEMORY_VIOLATION = 33, 9684f98cf2bSJonathan Kim EC_DEVICE_RAS_ERROR = 34, 9694f98cf2bSJonathan Kim EC_DEVICE_FATAL_HALT = 35, 9704f98cf2bSJonathan Kim EC_DEVICE_NEW = 36, 9714f98cf2bSJonathan Kim /* per process */ 9724f98cf2bSJonathan Kim EC_PROCESS_RUNTIME = 48, 9734f98cf2bSJonathan Kim EC_PROCESS_DEVICE_REMOVE = 49, 9744f98cf2bSJonathan Kim EC_MAX 9754f98cf2bSJonathan Kim }; 9764f98cf2bSJonathan Kim 9774f98cf2bSJonathan Kim /* Mask generated by ecode in kfd_dbg_trap_exception_code */ 9784f98cf2bSJonathan Kim #define KFD_EC_MASK(ecode) (1ULL << (ecode - 1)) 9794f98cf2bSJonathan Kim 9804f98cf2bSJonathan Kim /* Masks for exception code type checks below */ 9814f98cf2bSJonathan Kim #define KFD_EC_MASK_QUEUE (KFD_EC_MASK(EC_QUEUE_WAVE_ABORT) | \ 9824f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_WAVE_TRAP) | \ 9834f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_WAVE_MATH_ERROR) | \ 9844f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_WAVE_ILLEGAL_INSTRUCTION) | \ 9854f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_WAVE_MEMORY_VIOLATION) | \ 9864f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_WAVE_APERTURE_VIOLATION) | \ 9874f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_DIM_INVALID) | \ 9884f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_GROUP_SEGMENT_SIZE_INVALID) | \ 9894f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_CODE_INVALID) | \ 9904f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_RESERVED) | \ 9914f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_UNSUPPORTED) | \ 9924f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_WORK_GROUP_SIZE_INVALID) | \ 9934f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_REGISTER_INVALID) | \ 9944f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_VENDOR_UNSUPPORTED) | \ 9954f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PREEMPTION_ERROR) | \ 9964f98cf2bSJonathan Kim KFD_EC_MASK(EC_QUEUE_NEW)) 9974f98cf2bSJonathan Kim #define KFD_EC_MASK_DEVICE (KFD_EC_MASK(EC_DEVICE_QUEUE_DELETE) | \ 9984f98cf2bSJonathan Kim KFD_EC_MASK(EC_DEVICE_RAS_ERROR) | \ 9994f98cf2bSJonathan Kim KFD_EC_MASK(EC_DEVICE_FATAL_HALT) | \ 10004f98cf2bSJonathan Kim KFD_EC_MASK(EC_DEVICE_MEMORY_VIOLATION) | \ 10014f98cf2bSJonathan Kim KFD_EC_MASK(EC_DEVICE_NEW)) 10024f98cf2bSJonathan Kim #define KFD_EC_MASK_PROCESS (KFD_EC_MASK(EC_PROCESS_RUNTIME) | \ 10034f98cf2bSJonathan Kim KFD_EC_MASK(EC_PROCESS_DEVICE_REMOVE)) 10040cac183bSJonathan Kim #define KFD_EC_MASK_PACKET (KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_DIM_INVALID) | \ 10050cac183bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_GROUP_SEGMENT_SIZE_INVALID) | \ 10060cac183bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_CODE_INVALID) | \ 10070cac183bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_RESERVED) | \ 10080cac183bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_UNSUPPORTED) | \ 10090cac183bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_WORK_GROUP_SIZE_INVALID) | \ 10100cac183bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_DISPATCH_REGISTER_INVALID) | \ 10110cac183bSJonathan Kim KFD_EC_MASK(EC_QUEUE_PACKET_VENDOR_UNSUPPORTED)) 10124f98cf2bSJonathan Kim 10134f98cf2bSJonathan Kim /* Checks for exception code types for KFD search */ 10140cac183bSJonathan Kim #define KFD_DBG_EC_IS_VALID(ecode) (ecode > EC_NONE && ecode < EC_MAX) 10154f98cf2bSJonathan Kim #define KFD_DBG_EC_TYPE_IS_QUEUE(ecode) \ 10160cac183bSJonathan Kim (KFD_DBG_EC_IS_VALID(ecode) && !!(KFD_EC_MASK(ecode) & KFD_EC_MASK_QUEUE)) 10174f98cf2bSJonathan Kim #define KFD_DBG_EC_TYPE_IS_DEVICE(ecode) \ 10180cac183bSJonathan Kim (KFD_DBG_EC_IS_VALID(ecode) && !!(KFD_EC_MASK(ecode) & KFD_EC_MASK_DEVICE)) 10194f98cf2bSJonathan Kim #define KFD_DBG_EC_TYPE_IS_PROCESS(ecode) \ 10200cac183bSJonathan Kim (KFD_DBG_EC_IS_VALID(ecode) && !!(KFD_EC_MASK(ecode) & KFD_EC_MASK_PROCESS)) 10210cac183bSJonathan Kim #define KFD_DBG_EC_TYPE_IS_PACKET(ecode) \ 10220cac183bSJonathan Kim (KFD_DBG_EC_IS_VALID(ecode) && !!(KFD_EC_MASK(ecode) & KFD_EC_MASK_PACKET)) 10234f98cf2bSJonathan Kim 10244f98cf2bSJonathan Kim 10254f98cf2bSJonathan Kim /* Runtime enable states */ 10264f98cf2bSJonathan Kim enum kfd_dbg_runtime_state { 10274f98cf2bSJonathan Kim DEBUG_RUNTIME_STATE_DISABLED = 0, 10284f98cf2bSJonathan Kim DEBUG_RUNTIME_STATE_ENABLED = 1, 10294f98cf2bSJonathan Kim DEBUG_RUNTIME_STATE_ENABLED_BUSY = 2, 10304f98cf2bSJonathan Kim DEBUG_RUNTIME_STATE_ENABLED_ERROR = 3 10314f98cf2bSJonathan Kim }; 10324f98cf2bSJonathan Kim 10334f98cf2bSJonathan Kim /* Runtime enable status */ 10344f98cf2bSJonathan Kim struct kfd_runtime_info { 10354f98cf2bSJonathan Kim __u64 r_debug; 10364f98cf2bSJonathan Kim __u32 runtime_state; 10374f98cf2bSJonathan Kim __u32 ttmp_setup; 10384f98cf2bSJonathan Kim }; 10394f98cf2bSJonathan Kim 10404f98cf2bSJonathan Kim /* Enable modes for runtime enable */ 10414f98cf2bSJonathan Kim #define KFD_RUNTIME_ENABLE_MODE_ENABLE_MASK 1 10424f98cf2bSJonathan Kim #define KFD_RUNTIME_ENABLE_MODE_TTMP_SAVE_MASK 2 10434f98cf2bSJonathan Kim 10444f98cf2bSJonathan Kim /** 10454f98cf2bSJonathan Kim * kfd_ioctl_runtime_enable_args - Arguments for runtime enable 10464f98cf2bSJonathan Kim * 10474f98cf2bSJonathan Kim * Coordinates debug exception signalling and debug device enablement with runtime. 10484f98cf2bSJonathan Kim * 10494f98cf2bSJonathan Kim * @r_debug - pointer to user struct for sharing information between ROCr and the debuggger 10504f98cf2bSJonathan Kim * @mode_mask - mask to set mode 10514f98cf2bSJonathan Kim * KFD_RUNTIME_ENABLE_MODE_ENABLE_MASK - enable runtime for debugging, otherwise disable 10524f98cf2bSJonathan Kim * KFD_RUNTIME_ENABLE_MODE_TTMP_SAVE_MASK - enable trap temporary setup (ignore on disable) 10534f98cf2bSJonathan Kim * @capabilities_mask - mask to notify runtime on what KFD supports 10544f98cf2bSJonathan Kim * 10554f98cf2bSJonathan Kim * Return - 0 on SUCCESS. 10564f98cf2bSJonathan Kim * - EBUSY if runtime enable call already pending. 10574f98cf2bSJonathan Kim * - EEXIST if user queues already active prior to call. 10584f98cf2bSJonathan Kim * If process is debug enabled, runtime enable will enable debug devices and 10594f98cf2bSJonathan Kim * wait for debugger process to send runtime exception EC_PROCESS_RUNTIME 10604f98cf2bSJonathan Kim * to unblock - see kfd_ioctl_dbg_trap_args. 10614f98cf2bSJonathan Kim * 10624f98cf2bSJonathan Kim */ 10634f98cf2bSJonathan Kim struct kfd_ioctl_runtime_enable_args { 10644f98cf2bSJonathan Kim __u64 r_debug; 10654f98cf2bSJonathan Kim __u32 mode_mask; 10664f98cf2bSJonathan Kim __u32 capabilities_mask; 10674f98cf2bSJonathan Kim }; 10684f98cf2bSJonathan Kim 10694f98cf2bSJonathan Kim /* Queue information */ 10704f98cf2bSJonathan Kim struct kfd_queue_snapshot_entry { 10714f98cf2bSJonathan Kim __u64 exception_status; 10724f98cf2bSJonathan Kim __u64 ring_base_address; 10734f98cf2bSJonathan Kim __u64 write_pointer_address; 10744f98cf2bSJonathan Kim __u64 read_pointer_address; 10754f98cf2bSJonathan Kim __u64 ctx_save_restore_address; 10764f98cf2bSJonathan Kim __u32 queue_id; 10774f98cf2bSJonathan Kim __u32 gpu_id; 10784f98cf2bSJonathan Kim __u32 ring_size; 10794f98cf2bSJonathan Kim __u32 queue_type; 10804f98cf2bSJonathan Kim __u32 ctx_save_restore_area_size; 10814f98cf2bSJonathan Kim __u32 reserved; 10824f98cf2bSJonathan Kim }; 10834f98cf2bSJonathan Kim 10844f98cf2bSJonathan Kim /* Queue status return for suspend/resume */ 10854f98cf2bSJonathan Kim #define KFD_DBG_QUEUE_ERROR_BIT 30 10864f98cf2bSJonathan Kim #define KFD_DBG_QUEUE_INVALID_BIT 31 10874f98cf2bSJonathan Kim #define KFD_DBG_QUEUE_ERROR_MASK (1 << KFD_DBG_QUEUE_ERROR_BIT) 10884f98cf2bSJonathan Kim #define KFD_DBG_QUEUE_INVALID_MASK (1 << KFD_DBG_QUEUE_INVALID_BIT) 10894f98cf2bSJonathan Kim 10904f98cf2bSJonathan Kim /* Context save area header information */ 10914f98cf2bSJonathan Kim struct kfd_context_save_area_header { 10924f98cf2bSJonathan Kim struct { 10934f98cf2bSJonathan Kim __u32 control_stack_offset; 10944f98cf2bSJonathan Kim __u32 control_stack_size; 10954f98cf2bSJonathan Kim __u32 wave_state_offset; 10964f98cf2bSJonathan Kim __u32 wave_state_size; 10974f98cf2bSJonathan Kim } wave_state; 10984f98cf2bSJonathan Kim __u32 debug_offset; 10994f98cf2bSJonathan Kim __u32 debug_size; 11004f98cf2bSJonathan Kim __u64 err_payload_addr; 11014f98cf2bSJonathan Kim __u32 err_event_id; 11024f98cf2bSJonathan Kim __u32 reserved1; 11034f98cf2bSJonathan Kim }; 11044f98cf2bSJonathan Kim 11054f98cf2bSJonathan Kim /* 11064f98cf2bSJonathan Kim * Debug operations 11074f98cf2bSJonathan Kim * 11084f98cf2bSJonathan Kim * For specifics on usage and return values, see documentation per operation 11094f98cf2bSJonathan Kim * below. Otherwise, generic error returns apply: 11104f98cf2bSJonathan Kim * - ESRCH if the process to debug does not exist. 11114f98cf2bSJonathan Kim * 11124f98cf2bSJonathan Kim * - EINVAL (with KFD_IOC_DBG_TRAP_ENABLE exempt) if operation 11134f98cf2bSJonathan Kim * KFD_IOC_DBG_TRAP_ENABLE has not succeeded prior. 11144f98cf2bSJonathan Kim * Also returns this error if GPU hardware scheduling is not supported. 11154f98cf2bSJonathan Kim * 11164f98cf2bSJonathan Kim * - EPERM (with KFD_IOC_DBG_TRAP_DISABLE exempt) if target process is not 11174f98cf2bSJonathan Kim * PTRACE_ATTACHED. KFD_IOC_DBG_TRAP_DISABLE is exempt to allow 11184f98cf2bSJonathan Kim * clean up of debug mode as long as process is debug enabled. 11194f98cf2bSJonathan Kim * 11204f98cf2bSJonathan Kim * - EACCES if any DBG_HW_OP (debug hardware operation) is requested when 11214f98cf2bSJonathan Kim * AMDKFD_IOC_RUNTIME_ENABLE has not succeeded prior. 11224f98cf2bSJonathan Kim * 11234f98cf2bSJonathan Kim * - ENODEV if any GPU does not support debugging on a DBG_HW_OP call. 11244f98cf2bSJonathan Kim * 11254f98cf2bSJonathan Kim * - Other errors may be returned when a DBG_HW_OP occurs while the GPU 11264f98cf2bSJonathan Kim * is in a fatal state. 11274f98cf2bSJonathan Kim * 11284f98cf2bSJonathan Kim */ 11294f98cf2bSJonathan Kim enum kfd_dbg_trap_operations { 11304f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_ENABLE = 0, 11314f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_DISABLE = 1, 11324f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_SEND_RUNTIME_EVENT = 2, 11334f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_SET_EXCEPTIONS_ENABLED = 3, 11344f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_OVERRIDE = 4, /* DBG_HW_OP */ 11354f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_MODE = 5, /* DBG_HW_OP */ 11364f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_SUSPEND_QUEUES = 6, /* DBG_HW_OP */ 11374f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_RESUME_QUEUES = 7, /* DBG_HW_OP */ 11384f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_SET_NODE_ADDRESS_WATCH = 8, /* DBG_HW_OP */ 11394f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_CLEAR_NODE_ADDRESS_WATCH = 9, /* DBG_HW_OP */ 11404f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_SET_FLAGS = 10, 11414f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_QUERY_DEBUG_EVENT = 11, 11424f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_QUERY_EXCEPTION_INFO = 12, 11434f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_GET_QUEUE_SNAPSHOT = 13, 11444f98cf2bSJonathan Kim KFD_IOC_DBG_TRAP_GET_DEVICE_SNAPSHOT = 14 11454f98cf2bSJonathan Kim }; 11464f98cf2bSJonathan Kim 11474f98cf2bSJonathan Kim /** 11484f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_enable_args 11494f98cf2bSJonathan Kim * 11504f98cf2bSJonathan Kim * Arguments for KFD_IOC_DBG_TRAP_ENABLE. 11514f98cf2bSJonathan Kim * 11524f98cf2bSJonathan Kim * Enables debug session for target process. Call @op KFD_IOC_DBG_TRAP_DISABLE in 11534f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_args to disable debug session. 11544f98cf2bSJonathan Kim * 11554f98cf2bSJonathan Kim * @exception_mask (IN) - exceptions to raise to the debugger 11564f98cf2bSJonathan Kim * @rinfo_ptr (IN) - pointer to runtime info buffer (see kfd_runtime_info) 11574f98cf2bSJonathan Kim * @rinfo_size (IN/OUT) - size of runtime info buffer in bytes 11584f98cf2bSJonathan Kim * @dbg_fd (IN) - fd the KFD will nofify the debugger with of raised 11594f98cf2bSJonathan Kim * exceptions set in exception_mask. 11604f98cf2bSJonathan Kim * 11614f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 11624f98cf2bSJonathan Kim * Return - 0 on SUCCESS. 11634f98cf2bSJonathan Kim * Copies KFD saved kfd_runtime_info to @rinfo_ptr on enable. 11644f98cf2bSJonathan Kim * Size of kfd_runtime saved by the KFD returned to @rinfo_size. 11654f98cf2bSJonathan Kim * - EBADF if KFD cannot get a reference to dbg_fd. 11664f98cf2bSJonathan Kim * - EFAULT if KFD cannot copy runtime info to rinfo_ptr. 11674f98cf2bSJonathan Kim * - EINVAL if target process is already debug enabled. 11684f98cf2bSJonathan Kim * 11694f98cf2bSJonathan Kim */ 11704f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_enable_args { 11714f98cf2bSJonathan Kim __u64 exception_mask; 11724f98cf2bSJonathan Kim __u64 rinfo_ptr; 11734f98cf2bSJonathan Kim __u32 rinfo_size; 11744f98cf2bSJonathan Kim __u32 dbg_fd; 11754f98cf2bSJonathan Kim }; 11764f98cf2bSJonathan Kim 11774f98cf2bSJonathan Kim /** 11784f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_send_runtime_event_args 11794f98cf2bSJonathan Kim * 11804f98cf2bSJonathan Kim * 11814f98cf2bSJonathan Kim * Arguments for KFD_IOC_DBG_TRAP_SEND_RUNTIME_EVENT. 11824f98cf2bSJonathan Kim * Raises exceptions to runtime. 11834f98cf2bSJonathan Kim * 11844f98cf2bSJonathan Kim * @exception_mask (IN) - exceptions to raise to runtime 11854f98cf2bSJonathan Kim * @gpu_id (IN) - target device id 11864f98cf2bSJonathan Kim * @queue_id (IN) - target queue id 11874f98cf2bSJonathan Kim * 11884f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 11894f98cf2bSJonathan Kim * Return - 0 on SUCCESS. 11904f98cf2bSJonathan Kim * - ENODEV if gpu_id not found. 11914f98cf2bSJonathan Kim * If exception_mask contains EC_PROCESS_RUNTIME, unblocks pending 11924f98cf2bSJonathan Kim * AMDKFD_IOC_RUNTIME_ENABLE call - see kfd_ioctl_runtime_enable_args. 11934f98cf2bSJonathan Kim * All other exceptions are raised to runtime through err_payload_addr. 11944f98cf2bSJonathan Kim * See kfd_context_save_area_header. 11954f98cf2bSJonathan Kim */ 11964f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_send_runtime_event_args { 11974f98cf2bSJonathan Kim __u64 exception_mask; 11984f98cf2bSJonathan Kim __u32 gpu_id; 11994f98cf2bSJonathan Kim __u32 queue_id; 12004f98cf2bSJonathan Kim }; 12014f98cf2bSJonathan Kim 12024f98cf2bSJonathan Kim /** 12034f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_set_exceptions_enabled_args 12044f98cf2bSJonathan Kim * 12054f98cf2bSJonathan Kim * Arguments for KFD_IOC_SET_EXCEPTIONS_ENABLED 12064f98cf2bSJonathan Kim * Set new exceptions to be raised to the debugger. 12074f98cf2bSJonathan Kim * 12084f98cf2bSJonathan Kim * @exception_mask (IN) - new exceptions to raise the debugger 12094f98cf2bSJonathan Kim * 12104f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 12114f98cf2bSJonathan Kim * Return - 0 on SUCCESS. 12124f98cf2bSJonathan Kim */ 12134f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_set_exceptions_enabled_args { 12144f98cf2bSJonathan Kim __u64 exception_mask; 12154f98cf2bSJonathan Kim }; 12164f98cf2bSJonathan Kim 12174f98cf2bSJonathan Kim /** 12184f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_set_wave_launch_override_args 12194f98cf2bSJonathan Kim * 12204f98cf2bSJonathan Kim * Arguments for KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_OVERRIDE 12214f98cf2bSJonathan Kim * Enable HW exceptions to raise trap. 12224f98cf2bSJonathan Kim * 12234f98cf2bSJonathan Kim * @override_mode (IN) - see kfd_dbg_trap_override_mode 12244f98cf2bSJonathan Kim * @enable_mask (IN/OUT) - reference kfd_dbg_trap_mask. 12254f98cf2bSJonathan Kim * IN is the override modes requested to be enabled. 12264f98cf2bSJonathan Kim * OUT is referenced in Return below. 12274f98cf2bSJonathan Kim * @support_request_mask (IN/OUT) - reference kfd_dbg_trap_mask. 12284f98cf2bSJonathan Kim * IN is the override modes requested for support check. 12294f98cf2bSJonathan Kim * OUT is referenced in Return below. 12304f98cf2bSJonathan Kim * 12314f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 12324f98cf2bSJonathan Kim * Return - 0 on SUCCESS. 12334f98cf2bSJonathan Kim * Previous enablement is returned in @enable_mask. 12344f98cf2bSJonathan Kim * Actual override support is returned in @support_request_mask. 12354f98cf2bSJonathan Kim * - EINVAL if override mode is not supported. 12364f98cf2bSJonathan Kim * - EACCES if trap support requested is not actually supported. 12374f98cf2bSJonathan Kim * i.e. enable_mask (IN) is not a subset of support_request_mask (OUT). 12384f98cf2bSJonathan Kim * Otherwise it is considered a generic error (see kfd_dbg_trap_operations). 12394f98cf2bSJonathan Kim */ 12404f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_set_wave_launch_override_args { 12414f98cf2bSJonathan Kim __u32 override_mode; 12424f98cf2bSJonathan Kim __u32 enable_mask; 12434f98cf2bSJonathan Kim __u32 support_request_mask; 12444f98cf2bSJonathan Kim __u32 pad; 12454f98cf2bSJonathan Kim }; 12464f98cf2bSJonathan Kim 12474f98cf2bSJonathan Kim /** 12484f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_set_wave_launch_mode_args 12494f98cf2bSJonathan Kim * 12504f98cf2bSJonathan Kim * Arguments for KFD_IOC_DBG_TRAP_SET_WAVE_LAUNCH_MODE 12514f98cf2bSJonathan Kim * Set wave launch mode. 12524f98cf2bSJonathan Kim * 12534f98cf2bSJonathan Kim * @mode (IN) - see kfd_dbg_trap_wave_launch_mode 12544f98cf2bSJonathan Kim * 12554f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 12564f98cf2bSJonathan Kim * Return - 0 on SUCCESS. 12574f98cf2bSJonathan Kim */ 12584f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_set_wave_launch_mode_args { 12594f98cf2bSJonathan Kim __u32 launch_mode; 12604f98cf2bSJonathan Kim __u32 pad; 12614f98cf2bSJonathan Kim }; 12624f98cf2bSJonathan Kim 12634f98cf2bSJonathan Kim /** 12644f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_suspend_queues_ags 12654f98cf2bSJonathan Kim * 12664f98cf2bSJonathan Kim * Arguments for KFD_IOC_DBG_TRAP_SUSPEND_QUEUES 12674f98cf2bSJonathan Kim * Suspend queues. 12684f98cf2bSJonathan Kim * 12694f98cf2bSJonathan Kim * @exception_mask (IN) - raised exceptions to clear 12704f98cf2bSJonathan Kim * @queue_array_ptr (IN) - pointer to array of queue ids (u32 per queue id) 12714f98cf2bSJonathan Kim * to suspend 12724f98cf2bSJonathan Kim * @num_queues (IN) - number of queues to suspend in @queue_array_ptr 12734f98cf2bSJonathan Kim * @grace_period (IN) - wave time allowance before preemption 12744f98cf2bSJonathan Kim * per 1K GPU clock cycle unit 12754f98cf2bSJonathan Kim * 12764f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 12774f98cf2bSJonathan Kim * Destruction of a suspended queue is blocked until the queue is 12784f98cf2bSJonathan Kim * resumed. This allows the debugger to access queue information and 12794f98cf2bSJonathan Kim * the its context save area without running into a race condition on 12804f98cf2bSJonathan Kim * queue destruction. 12814f98cf2bSJonathan Kim * Automatically copies per queue context save area header information 12824f98cf2bSJonathan Kim * into the save area base 12834f98cf2bSJonathan Kim * (see kfd_queue_snapshot_entry and kfd_context_save_area_header). 12844f98cf2bSJonathan Kim * 12854f98cf2bSJonathan Kim * Return - Number of queues suspended on SUCCESS. 12864f98cf2bSJonathan Kim * . KFD_DBG_QUEUE_ERROR_MASK and KFD_DBG_QUEUE_INVALID_MASK masked 12874f98cf2bSJonathan Kim * for each queue id in @queue_array_ptr array reports unsuccessful 12884f98cf2bSJonathan Kim * suspend reason. 12894f98cf2bSJonathan Kim * KFD_DBG_QUEUE_ERROR_MASK = HW failure. 12904f98cf2bSJonathan Kim * KFD_DBG_QUEUE_INVALID_MASK = queue does not exist, is new or 12914f98cf2bSJonathan Kim * is being destroyed. 12924f98cf2bSJonathan Kim */ 12934f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_suspend_queues_args { 12944f98cf2bSJonathan Kim __u64 exception_mask; 12954f98cf2bSJonathan Kim __u64 queue_array_ptr; 12964f98cf2bSJonathan Kim __u32 num_queues; 12974f98cf2bSJonathan Kim __u32 grace_period; 12984f98cf2bSJonathan Kim }; 12994f98cf2bSJonathan Kim 13004f98cf2bSJonathan Kim /** 13014f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_resume_queues_args 13024f98cf2bSJonathan Kim * 13034f98cf2bSJonathan Kim * Arguments for KFD_IOC_DBG_TRAP_RESUME_QUEUES 13044f98cf2bSJonathan Kim * Resume queues. 13054f98cf2bSJonathan Kim * 13064f98cf2bSJonathan Kim * @queue_array_ptr (IN) - pointer to array of queue ids (u32 per queue id) 13074f98cf2bSJonathan Kim * to resume 13084f98cf2bSJonathan Kim * @num_queues (IN) - number of queues to resume in @queue_array_ptr 13094f98cf2bSJonathan Kim * 13104f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 13114f98cf2bSJonathan Kim * Return - Number of queues resumed on SUCCESS. 13124f98cf2bSJonathan Kim * KFD_DBG_QUEUE_ERROR_MASK and KFD_DBG_QUEUE_INVALID_MASK mask 13134f98cf2bSJonathan Kim * for each queue id in @queue_array_ptr array reports unsuccessful 13144f98cf2bSJonathan Kim * resume reason. 13154f98cf2bSJonathan Kim * KFD_DBG_QUEUE_ERROR_MASK = HW failure. 13164f98cf2bSJonathan Kim * KFD_DBG_QUEUE_INVALID_MASK = queue does not exist. 13174f98cf2bSJonathan Kim */ 13184f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_resume_queues_args { 13194f98cf2bSJonathan Kim __u64 queue_array_ptr; 13204f98cf2bSJonathan Kim __u32 num_queues; 13214f98cf2bSJonathan Kim __u32 pad; 13224f98cf2bSJonathan Kim }; 13234f98cf2bSJonathan Kim 13244f98cf2bSJonathan Kim /** 13254f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_set_node_address_watch_args 13264f98cf2bSJonathan Kim * 13274f98cf2bSJonathan Kim * Arguments for KFD_IOC_DBG_TRAP_SET_NODE_ADDRESS_WATCH 13284f98cf2bSJonathan Kim * Sets address watch for device. 13294f98cf2bSJonathan Kim * 13304f98cf2bSJonathan Kim * @address (IN) - watch address to set 13314f98cf2bSJonathan Kim * @mode (IN) - see kfd_dbg_trap_address_watch_mode 13324f98cf2bSJonathan Kim * @mask (IN) - watch address mask 13334f98cf2bSJonathan Kim * @gpu_id (IN) - target gpu to set watch point 13344f98cf2bSJonathan Kim * @id (OUT) - watch id allocated 13354f98cf2bSJonathan Kim * 13364f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 13374f98cf2bSJonathan Kim * Return - 0 on SUCCESS. 13384f98cf2bSJonathan Kim * Allocated watch ID returned to @id. 13394f98cf2bSJonathan Kim * - ENODEV if gpu_id not found. 13404f98cf2bSJonathan Kim * - ENOMEM if watch IDs can be allocated 13414f98cf2bSJonathan Kim */ 13424f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_set_node_address_watch_args { 13434f98cf2bSJonathan Kim __u64 address; 13444f98cf2bSJonathan Kim __u32 mode; 13454f98cf2bSJonathan Kim __u32 mask; 13464f98cf2bSJonathan Kim __u32 gpu_id; 13474f98cf2bSJonathan Kim __u32 id; 13484f98cf2bSJonathan Kim }; 13494f98cf2bSJonathan Kim 13504f98cf2bSJonathan Kim /** 13514f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_clear_node_address_watch_args 13524f98cf2bSJonathan Kim * 13534f98cf2bSJonathan Kim * Arguments for KFD_IOC_DBG_TRAP_CLEAR_NODE_ADDRESS_WATCH 13544f98cf2bSJonathan Kim * Clear address watch for device. 13554f98cf2bSJonathan Kim * 13564f98cf2bSJonathan Kim * @gpu_id (IN) - target device to clear watch point 13574f98cf2bSJonathan Kim * @id (IN) - allocated watch id to clear 13584f98cf2bSJonathan Kim * 13594f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 13604f98cf2bSJonathan Kim * Return - 0 on SUCCESS. 13614f98cf2bSJonathan Kim * - ENODEV if gpu_id not found. 13624f98cf2bSJonathan Kim * - EINVAL if watch ID has not been allocated. 13634f98cf2bSJonathan Kim */ 13644f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_clear_node_address_watch_args { 13654f98cf2bSJonathan Kim __u32 gpu_id; 13664f98cf2bSJonathan Kim __u32 id; 13674f98cf2bSJonathan Kim }; 13684f98cf2bSJonathan Kim 13694f98cf2bSJonathan Kim /** 13704f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_set_flags_args 13714f98cf2bSJonathan Kim * 13724f98cf2bSJonathan Kim * Arguments for KFD_IOC_DBG_TRAP_SET_FLAGS 13734f98cf2bSJonathan Kim * Sets flags for wave behaviour. 13744f98cf2bSJonathan Kim * 13754f98cf2bSJonathan Kim * @flags (IN/OUT) - IN = flags to enable, OUT = flags previously enabled 13764f98cf2bSJonathan Kim * 13774f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 13784f98cf2bSJonathan Kim * Return - 0 on SUCCESS. 13794f98cf2bSJonathan Kim * - EACCESS if any debug device does not allow flag options. 13804f98cf2bSJonathan Kim */ 13814f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_set_flags_args { 13824f98cf2bSJonathan Kim __u32 flags; 13834f98cf2bSJonathan Kim __u32 pad; 13844f98cf2bSJonathan Kim }; 13854f98cf2bSJonathan Kim 13864f98cf2bSJonathan Kim /** 13874f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_query_debug_event_args 13884f98cf2bSJonathan Kim * 13894f98cf2bSJonathan Kim * Arguments for KFD_IOC_DBG_TRAP_QUERY_DEBUG_EVENT 13904f98cf2bSJonathan Kim * 13914f98cf2bSJonathan Kim * Find one or more raised exceptions. This function can return multiple 13924f98cf2bSJonathan Kim * exceptions from a single queue or a single device with one call. To find 13934f98cf2bSJonathan Kim * all raised exceptions, this function must be called repeatedly until it 13944f98cf2bSJonathan Kim * returns -EAGAIN. Returned exceptions can optionally be cleared by 13954f98cf2bSJonathan Kim * setting the corresponding bit in the @exception_mask input parameter. 13964f98cf2bSJonathan Kim * However, clearing an exception prevents retrieving further information 13974f98cf2bSJonathan Kim * about it with KFD_IOC_DBG_TRAP_QUERY_EXCEPTION_INFO. 13984f98cf2bSJonathan Kim * 13994f98cf2bSJonathan Kim * @exception_mask (IN/OUT) - exception to clear (IN) and raised (OUT) 14004f98cf2bSJonathan Kim * @gpu_id (OUT) - gpu id of exceptions raised 14014f98cf2bSJonathan Kim * @queue_id (OUT) - queue id of exceptions raised 14024f98cf2bSJonathan Kim * 14034f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 14044f98cf2bSJonathan Kim * Return - 0 on raised exception found 14054f98cf2bSJonathan Kim * Raised exceptions found are returned in @exception mask 14064f98cf2bSJonathan Kim * with reported source id returned in @gpu_id or @queue_id. 14074f98cf2bSJonathan Kim * - EAGAIN if no raised exception has been found 14084f98cf2bSJonathan Kim */ 14094f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_query_debug_event_args { 14104f98cf2bSJonathan Kim __u64 exception_mask; 14114f98cf2bSJonathan Kim __u32 gpu_id; 14124f98cf2bSJonathan Kim __u32 queue_id; 14134f98cf2bSJonathan Kim }; 14144f98cf2bSJonathan Kim 14154f98cf2bSJonathan Kim /** 14164f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_query_exception_info_args 14174f98cf2bSJonathan Kim * 14184f98cf2bSJonathan Kim * Arguments KFD_IOC_DBG_TRAP_QUERY_EXCEPTION_INFO 14194f98cf2bSJonathan Kim * Get additional info on raised exception. 14204f98cf2bSJonathan Kim * 14214f98cf2bSJonathan Kim * @info_ptr (IN) - pointer to exception info buffer to copy to 14224f98cf2bSJonathan Kim * @info_size (IN/OUT) - exception info buffer size (bytes) 14234f98cf2bSJonathan Kim * @source_id (IN) - target gpu or queue id 14244f98cf2bSJonathan Kim * @exception_code (IN) - target exception 14254f98cf2bSJonathan Kim * @clear_exception (IN) - clear raised @exception_code exception 14264f98cf2bSJonathan Kim * (0 = false, 1 = true) 14274f98cf2bSJonathan Kim * 14284f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 14294f98cf2bSJonathan Kim * Return - 0 on SUCCESS. 14304f98cf2bSJonathan Kim * If @exception_code is EC_DEVICE_MEMORY_VIOLATION, copy @info_size(OUT) 14314f98cf2bSJonathan Kim * bytes of memory exception data to @info_ptr. 14324f98cf2bSJonathan Kim * If @exception_code is EC_PROCESS_RUNTIME, copy saved 14334f98cf2bSJonathan Kim * kfd_runtime_info to @info_ptr. 14344f98cf2bSJonathan Kim * Actual required @info_ptr size (bytes) is returned in @info_size. 14354f98cf2bSJonathan Kim */ 14364f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_query_exception_info_args { 14374f98cf2bSJonathan Kim __u64 info_ptr; 14384f98cf2bSJonathan Kim __u32 info_size; 14394f98cf2bSJonathan Kim __u32 source_id; 14404f98cf2bSJonathan Kim __u32 exception_code; 14414f98cf2bSJonathan Kim __u32 clear_exception; 14424f98cf2bSJonathan Kim }; 14434f98cf2bSJonathan Kim 14444f98cf2bSJonathan Kim /** 14454f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_get_queue_snapshot_args 14464f98cf2bSJonathan Kim * 14474f98cf2bSJonathan Kim * Arguments KFD_IOC_DBG_TRAP_GET_QUEUE_SNAPSHOT 14484f98cf2bSJonathan Kim * Get queue information. 14494f98cf2bSJonathan Kim * 14504f98cf2bSJonathan Kim * @exception_mask (IN) - exceptions raised to clear 14514f98cf2bSJonathan Kim * @snapshot_buf_ptr (IN) - queue snapshot entry buffer (see kfd_queue_snapshot_entry) 14524f98cf2bSJonathan Kim * @num_queues (IN/OUT) - number of queue snapshot entries 14534f98cf2bSJonathan Kim * The debugger specifies the size of the array allocated in @num_queues. 14544f98cf2bSJonathan Kim * KFD returns the number of queues that actually existed. If this is 14554f98cf2bSJonathan Kim * larger than the size specified by the debugger, KFD will not overflow 14564f98cf2bSJonathan Kim * the array allocated by the debugger. 14574f98cf2bSJonathan Kim * 14584f98cf2bSJonathan Kim * @entry_size (IN/OUT) - size per entry in bytes 14594f98cf2bSJonathan Kim * The debugger specifies sizeof(struct kfd_queue_snapshot_entry) in 14604f98cf2bSJonathan Kim * @entry_size. KFD returns the number of bytes actually populated per 14614f98cf2bSJonathan Kim * entry. The debugger should use the KFD_IOCTL_MINOR_VERSION to determine, 14624f98cf2bSJonathan Kim * which fields in struct kfd_queue_snapshot_entry are valid. This allows 14634f98cf2bSJonathan Kim * growing the ABI in a backwards compatible manner. 14644f98cf2bSJonathan Kim * Note that entry_size(IN) should still be used to stride the snapshot buffer in the 14654f98cf2bSJonathan Kim * event that it's larger than actual kfd_queue_snapshot_entry. 14664f98cf2bSJonathan Kim * 14674f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 14684f98cf2bSJonathan Kim * Return - 0 on SUCCESS. 14694f98cf2bSJonathan Kim * Copies @num_queues(IN) queue snapshot entries of size @entry_size(IN) 14704f98cf2bSJonathan Kim * into @snapshot_buf_ptr if @num_queues(IN) > 0. 14714f98cf2bSJonathan Kim * Otherwise return @num_queues(OUT) queue snapshot entries that exist. 14724f98cf2bSJonathan Kim */ 14734f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_queue_snapshot_args { 14744f98cf2bSJonathan Kim __u64 exception_mask; 14754f98cf2bSJonathan Kim __u64 snapshot_buf_ptr; 14764f98cf2bSJonathan Kim __u32 num_queues; 14774f98cf2bSJonathan Kim __u32 entry_size; 14784f98cf2bSJonathan Kim }; 14794f98cf2bSJonathan Kim 14804f98cf2bSJonathan Kim /** 14814f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_get_device_snapshot_args 14824f98cf2bSJonathan Kim * 14834f98cf2bSJonathan Kim * Arguments for KFD_IOC_DBG_TRAP_GET_DEVICE_SNAPSHOT 14844f98cf2bSJonathan Kim * Get device information. 14854f98cf2bSJonathan Kim * 14864f98cf2bSJonathan Kim * @exception_mask (IN) - exceptions raised to clear 14874f98cf2bSJonathan Kim * @snapshot_buf_ptr (IN) - pointer to snapshot buffer (see kfd_dbg_device_info_entry) 14884f98cf2bSJonathan Kim * @num_devices (IN/OUT) - number of debug devices to snapshot 14894f98cf2bSJonathan Kim * The debugger specifies the size of the array allocated in @num_devices. 14904f98cf2bSJonathan Kim * KFD returns the number of devices that actually existed. If this is 14914f98cf2bSJonathan Kim * larger than the size specified by the debugger, KFD will not overflow 14924f98cf2bSJonathan Kim * the array allocated by the debugger. 14934f98cf2bSJonathan Kim * 14944f98cf2bSJonathan Kim * @entry_size (IN/OUT) - size per entry in bytes 14954f98cf2bSJonathan Kim * The debugger specifies sizeof(struct kfd_dbg_device_info_entry) in 14964f98cf2bSJonathan Kim * @entry_size. KFD returns the number of bytes actually populated. The 14974f98cf2bSJonathan Kim * debugger should use KFD_IOCTL_MINOR_VERSION to determine, which fields 14984f98cf2bSJonathan Kim * in struct kfd_dbg_device_info_entry are valid. This allows growing the 14994f98cf2bSJonathan Kim * ABI in a backwards compatible manner. 15004f98cf2bSJonathan Kim * Note that entry_size(IN) should still be used to stride the snapshot buffer in the 15014f98cf2bSJonathan Kim * event that it's larger than actual kfd_dbg_device_info_entry. 15024f98cf2bSJonathan Kim * 15034f98cf2bSJonathan Kim * Generic errors apply (see kfd_dbg_trap_operations). 15044f98cf2bSJonathan Kim * Return - 0 on SUCCESS. 15054f98cf2bSJonathan Kim * Copies @num_devices(IN) device snapshot entries of size @entry_size(IN) 15064f98cf2bSJonathan Kim * into @snapshot_buf_ptr if @num_devices(IN) > 0. 15074f98cf2bSJonathan Kim * Otherwise return @num_devices(OUT) queue snapshot entries that exist. 15084f98cf2bSJonathan Kim */ 15094f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_device_snapshot_args { 15104f98cf2bSJonathan Kim __u64 exception_mask; 15114f98cf2bSJonathan Kim __u64 snapshot_buf_ptr; 15124f98cf2bSJonathan Kim __u32 num_devices; 15134f98cf2bSJonathan Kim __u32 entry_size; 15144f98cf2bSJonathan Kim }; 15154f98cf2bSJonathan Kim 15164f98cf2bSJonathan Kim /** 15174f98cf2bSJonathan Kim * kfd_ioctl_dbg_trap_args 15184f98cf2bSJonathan Kim * 15194f98cf2bSJonathan Kim * Arguments to debug target process. 15204f98cf2bSJonathan Kim * 15214f98cf2bSJonathan Kim * @pid - target process to debug 15224f98cf2bSJonathan Kim * @op - debug operation (see kfd_dbg_trap_operations) 15234f98cf2bSJonathan Kim * 15244f98cf2bSJonathan Kim * @op determines which union struct args to use. 15254f98cf2bSJonathan Kim * Refer to kern docs for each kfd_ioctl_dbg_trap_*_args struct. 15264f98cf2bSJonathan Kim */ 15274f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_args { 15284f98cf2bSJonathan Kim __u32 pid; 15294f98cf2bSJonathan Kim __u32 op; 15304f98cf2bSJonathan Kim 15314f98cf2bSJonathan Kim union { 15324f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_enable_args enable; 15334f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_send_runtime_event_args send_runtime_event; 15344f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_set_exceptions_enabled_args set_exceptions_enabled; 15354f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_set_wave_launch_override_args launch_override; 15364f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_set_wave_launch_mode_args launch_mode; 15374f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_suspend_queues_args suspend_queues; 15384f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_resume_queues_args resume_queues; 15394f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_set_node_address_watch_args set_node_address_watch; 15404f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_clear_node_address_watch_args clear_node_address_watch; 15414f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_set_flags_args set_flags; 15424f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_query_debug_event_args query_debug_event; 15434f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_query_exception_info_args query_exception_info; 15444f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_queue_snapshot_args queue_snapshot; 15454f98cf2bSJonathan Kim struct kfd_ioctl_dbg_trap_device_snapshot_args device_snapshot; 15464f98cf2bSJonathan Kim }; 15474f98cf2bSJonathan Kim }; 15484f98cf2bSJonathan Kim 1549b81c55dbSOded Gabbay #define AMDKFD_IOCTL_BASE 'K' 1550b81c55dbSOded Gabbay #define AMDKFD_IO(nr) _IO(AMDKFD_IOCTL_BASE, nr) 1551b81c55dbSOded Gabbay #define AMDKFD_IOR(nr, type) _IOR(AMDKFD_IOCTL_BASE, nr, type) 1552b81c55dbSOded Gabbay #define AMDKFD_IOW(nr, type) _IOW(AMDKFD_IOCTL_BASE, nr, type) 1553b81c55dbSOded Gabbay #define AMDKFD_IOWR(nr, type) _IOWR(AMDKFD_IOCTL_BASE, nr, type) 1554b7facbaeSOded Gabbay 1555b81c55dbSOded Gabbay #define AMDKFD_IOC_GET_VERSION \ 1556b81c55dbSOded Gabbay AMDKFD_IOR(0x01, struct kfd_ioctl_get_version_args) 1557b7facbaeSOded Gabbay 1558b81c55dbSOded Gabbay #define AMDKFD_IOC_CREATE_QUEUE \ 1559b81c55dbSOded Gabbay AMDKFD_IOWR(0x02, struct kfd_ioctl_create_queue_args) 1560b7facbaeSOded Gabbay 1561b81c55dbSOded Gabbay #define AMDKFD_IOC_DESTROY_QUEUE \ 1562b81c55dbSOded Gabbay AMDKFD_IOWR(0x03, struct kfd_ioctl_destroy_queue_args) 1563b7facbaeSOded Gabbay 1564b81c55dbSOded Gabbay #define AMDKFD_IOC_SET_MEMORY_POLICY \ 1565b81c55dbSOded Gabbay AMDKFD_IOW(0x04, struct kfd_ioctl_set_memory_policy_args) 1566b7facbaeSOded Gabbay 1567b81c55dbSOded Gabbay #define AMDKFD_IOC_GET_CLOCK_COUNTERS \ 1568b81c55dbSOded Gabbay AMDKFD_IOWR(0x05, struct kfd_ioctl_get_clock_counters_args) 1569b7facbaeSOded Gabbay 1570b81c55dbSOded Gabbay #define AMDKFD_IOC_GET_PROCESS_APERTURES \ 1571b81c55dbSOded Gabbay AMDKFD_IOR(0x06, struct kfd_ioctl_get_process_apertures_args) 1572b7facbaeSOded Gabbay 1573b81c55dbSOded Gabbay #define AMDKFD_IOC_UPDATE_QUEUE \ 1574b81c55dbSOded Gabbay AMDKFD_IOW(0x07, struct kfd_ioctl_update_queue_args) 1575b81c55dbSOded Gabbay 157629a5d3ebSAndrew Lewycky #define AMDKFD_IOC_CREATE_EVENT \ 157729a5d3ebSAndrew Lewycky AMDKFD_IOWR(0x08, struct kfd_ioctl_create_event_args) 157829a5d3ebSAndrew Lewycky 157929a5d3ebSAndrew Lewycky #define AMDKFD_IOC_DESTROY_EVENT \ 158029a5d3ebSAndrew Lewycky AMDKFD_IOW(0x09, struct kfd_ioctl_destroy_event_args) 158129a5d3ebSAndrew Lewycky 158229a5d3ebSAndrew Lewycky #define AMDKFD_IOC_SET_EVENT \ 158329a5d3ebSAndrew Lewycky AMDKFD_IOW(0x0A, struct kfd_ioctl_set_event_args) 158429a5d3ebSAndrew Lewycky 158529a5d3ebSAndrew Lewycky #define AMDKFD_IOC_RESET_EVENT \ 158629a5d3ebSAndrew Lewycky AMDKFD_IOW(0x0B, struct kfd_ioctl_reset_event_args) 158729a5d3ebSAndrew Lewycky 158829a5d3ebSAndrew Lewycky #define AMDKFD_IOC_WAIT_EVENTS \ 158929a5d3ebSAndrew Lewycky AMDKFD_IOWR(0x0C, struct kfd_ioctl_wait_events_args) 159029a5d3ebSAndrew Lewycky 15915bdd3eb2SMukul Joshi #define AMDKFD_IOC_DBG_REGISTER_DEPRECATED \ 1592aef11009SYair Shachar AMDKFD_IOW(0x0D, struct kfd_ioctl_dbg_register_args) 1593aef11009SYair Shachar 15945bdd3eb2SMukul Joshi #define AMDKFD_IOC_DBG_UNREGISTER_DEPRECATED \ 1595aef11009SYair Shachar AMDKFD_IOW(0x0E, struct kfd_ioctl_dbg_unregister_args) 1596aef11009SYair Shachar 15975bdd3eb2SMukul Joshi #define AMDKFD_IOC_DBG_ADDRESS_WATCH_DEPRECATED \ 1598aef11009SYair Shachar AMDKFD_IOW(0x0F, struct kfd_ioctl_dbg_address_watch_args) 1599aef11009SYair Shachar 16005bdd3eb2SMukul Joshi #define AMDKFD_IOC_DBG_WAVE_CONTROL_DEPRECATED \ 1601aef11009SYair Shachar AMDKFD_IOW(0x10, struct kfd_ioctl_dbg_wave_control_args) 1602aef11009SYair Shachar 16036a1c9510SMoses Reuben #define AMDKFD_IOC_SET_SCRATCH_BACKING_VA \ 16046a1c9510SMoses Reuben AMDKFD_IOWR(0x11, struct kfd_ioctl_set_scratch_backing_va_args) 16056a1c9510SMoses Reuben 16065d71dbc3SYong Zhao #define AMDKFD_IOC_GET_TILE_CONFIG \ 16075d71dbc3SYong Zhao AMDKFD_IOWR(0x12, struct kfd_ioctl_get_tile_config_args) 16085d71dbc3SYong Zhao 1609d7b9bd22SFelix Kuehling #define AMDKFD_IOC_SET_TRAP_HANDLER \ 1610d7b9bd22SFelix Kuehling AMDKFD_IOW(0x13, struct kfd_ioctl_set_trap_handler_args) 1611d7b9bd22SFelix Kuehling 1612c7bcbfa4SFelix Kuehling #define AMDKFD_IOC_GET_PROCESS_APERTURES_NEW \ 1613c7bcbfa4SFelix Kuehling AMDKFD_IOWR(0x14, \ 1614c7bcbfa4SFelix Kuehling struct kfd_ioctl_get_process_apertures_new_args) 1615c7bcbfa4SFelix Kuehling 16165ec7e028SFelix Kuehling #define AMDKFD_IOC_ACQUIRE_VM \ 16175ec7e028SFelix Kuehling AMDKFD_IOW(0x15, struct kfd_ioctl_acquire_vm_args) 16185ec7e028SFelix Kuehling 16195ec7e028SFelix Kuehling #define AMDKFD_IOC_ALLOC_MEMORY_OF_GPU \ 16205ec7e028SFelix Kuehling AMDKFD_IOWR(0x16, struct kfd_ioctl_alloc_memory_of_gpu_args) 16215ec7e028SFelix Kuehling 16225ec7e028SFelix Kuehling #define AMDKFD_IOC_FREE_MEMORY_OF_GPU \ 16235ec7e028SFelix Kuehling AMDKFD_IOW(0x17, struct kfd_ioctl_free_memory_of_gpu_args) 16245ec7e028SFelix Kuehling 16255ec7e028SFelix Kuehling #define AMDKFD_IOC_MAP_MEMORY_TO_GPU \ 16265ec7e028SFelix Kuehling AMDKFD_IOWR(0x18, struct kfd_ioctl_map_memory_to_gpu_args) 16275ec7e028SFelix Kuehling 16285ec7e028SFelix Kuehling #define AMDKFD_IOC_UNMAP_MEMORY_FROM_GPU \ 16295ec7e028SFelix Kuehling AMDKFD_IOWR(0x19, struct kfd_ioctl_unmap_memory_from_gpu_args) 16305ec7e028SFelix Kuehling 1631a7fe68a1SFelix Kuehling #define AMDKFD_IOC_SET_CU_MASK \ 1632a7fe68a1SFelix Kuehling AMDKFD_IOW(0x1A, struct kfd_ioctl_set_cu_mask_args) 1633a7fe68a1SFelix Kuehling 16345df099e8SJay Cornwall #define AMDKFD_IOC_GET_QUEUE_WAVE_STATE \ 16355df099e8SJay Cornwall AMDKFD_IOWR(0x1B, struct kfd_ioctl_get_queue_wave_state_args) 16365df099e8SJay Cornwall 16371dde0ea9SFelix Kuehling #define AMDKFD_IOC_GET_DMABUF_INFO \ 16381dde0ea9SFelix Kuehling AMDKFD_IOWR(0x1C, struct kfd_ioctl_get_dmabuf_info_args) 16391dde0ea9SFelix Kuehling 16401dde0ea9SFelix Kuehling #define AMDKFD_IOC_IMPORT_DMABUF \ 16411dde0ea9SFelix Kuehling AMDKFD_IOWR(0x1D, struct kfd_ioctl_import_dmabuf_args) 16421dde0ea9SFelix Kuehling 16435bb4b78bSOak Zeng #define AMDKFD_IOC_ALLOC_QUEUE_GWS \ 16445bb4b78bSOak Zeng AMDKFD_IOWR(0x1E, struct kfd_ioctl_alloc_queue_gws_args) 16455bb4b78bSOak Zeng 1646938a0650SAmber Lin #define AMDKFD_IOC_SMI_EVENTS \ 1647938a0650SAmber Lin AMDKFD_IOWR(0x1F, struct kfd_ioctl_smi_events_args) 1648938a0650SAmber Lin 164940ce74d1SPhilip Yang #define AMDKFD_IOC_SVM AMDKFD_IOWR(0x20, struct kfd_ioctl_svm_args) 165040ce74d1SPhilip Yang 16510f7b5c44SAlex Sierra #define AMDKFD_IOC_SET_XNACK_MODE \ 16520f7b5c44SAlex Sierra AMDKFD_IOWR(0x21, struct kfd_ioctl_set_xnack_mode_args) 16530f7b5c44SAlex Sierra 165436988070SRajneesh Bhardwaj #define AMDKFD_IOC_CRIU_OP \ 165536988070SRajneesh Bhardwaj AMDKFD_IOWR(0x22, struct kfd_ioctl_criu_args) 165636988070SRajneesh Bhardwaj 16579731dd4cSDaniel Phillips #define AMDKFD_IOC_AVAILABLE_MEMORY \ 16589731dd4cSDaniel Phillips AMDKFD_IOWR(0x23, struct kfd_ioctl_get_available_memory_args) 16599731dd4cSDaniel Phillips 1660fd234e75SFelix Kuehling #define AMDKFD_IOC_EXPORT_DMABUF \ 1661fd234e75SFelix Kuehling AMDKFD_IOWR(0x24, struct kfd_ioctl_export_dmabuf_args) 1662fd234e75SFelix Kuehling 16634f98cf2bSJonathan Kim #define AMDKFD_IOC_RUNTIME_ENABLE \ 16644f98cf2bSJonathan Kim AMDKFD_IOWR(0x25, struct kfd_ioctl_runtime_enable_args) 16654f98cf2bSJonathan Kim 16664f98cf2bSJonathan Kim #define AMDKFD_IOC_DBG_TRAP \ 16674f98cf2bSJonathan Kim AMDKFD_IOWR(0x26, struct kfd_ioctl_dbg_trap_args) 16684f98cf2bSJonathan Kim 1669b81c55dbSOded Gabbay #define AMDKFD_COMMAND_START 0x01 16704f98cf2bSJonathan Kim #define AMDKFD_COMMAND_END 0x27 1671b7facbaeSOded Gabbay 1672b7facbaeSOded Gabbay #endif 1673