1*1bb76ff1Sjsg /* 2*1bb76ff1Sjsg * Copyright 2019 Advanced Micro Devices, Inc. 3*1bb76ff1Sjsg * 4*1bb76ff1Sjsg * Permission is hereby granted, free of charge, to any person obtaining a 5*1bb76ff1Sjsg * copy of this software and associated documentation files (the "Software"), 6*1bb76ff1Sjsg * to deal in the Software without restriction, including without limitation 7*1bb76ff1Sjsg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*1bb76ff1Sjsg * and/or sell copies of the Software, and to permit persons to whom the 9*1bb76ff1Sjsg * Software is furnished to do so, subject to the following conditions: 10*1bb76ff1Sjsg * 11*1bb76ff1Sjsg * The above copyright notice and this permission notice shall be included in 12*1bb76ff1Sjsg * all copies or substantial portions of the Software. 13*1bb76ff1Sjsg * 14*1bb76ff1Sjsg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15*1bb76ff1Sjsg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*1bb76ff1Sjsg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17*1bb76ff1Sjsg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18*1bb76ff1Sjsg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19*1bb76ff1Sjsg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20*1bb76ff1Sjsg * OTHER DEALINGS IN THE SOFTWARE. 21*1bb76ff1Sjsg * 22*1bb76ff1Sjsg */ 23*1bb76ff1Sjsg 24*1bb76ff1Sjsg #ifndef __MES_API_DEF_H__ 25*1bb76ff1Sjsg #define __MES_API_DEF_H__ 26*1bb76ff1Sjsg 27*1bb76ff1Sjsg #pragma pack(push, 4) 28*1bb76ff1Sjsg 29*1bb76ff1Sjsg #define MES_API_VERSION 1 30*1bb76ff1Sjsg 31*1bb76ff1Sjsg /* Driver submits one API(cmd) as a single Frame and this command size is same 32*1bb76ff1Sjsg * for all API to ease the debugging and parsing of ring buffer. 33*1bb76ff1Sjsg */ 34*1bb76ff1Sjsg enum { API_FRAME_SIZE_IN_DWORDS = 64 }; 35*1bb76ff1Sjsg 36*1bb76ff1Sjsg /* To avoid command in scheduler context to be overwritten whenever multiple 37*1bb76ff1Sjsg * interrupts come in, this creates another queue. 38*1bb76ff1Sjsg */ 39*1bb76ff1Sjsg enum { API_NUMBER_OF_COMMAND_MAX = 32 }; 40*1bb76ff1Sjsg 41*1bb76ff1Sjsg enum MES_API_TYPE { 42*1bb76ff1Sjsg MES_API_TYPE_SCHEDULER = 1, 43*1bb76ff1Sjsg MES_API_TYPE_MAX 44*1bb76ff1Sjsg }; 45*1bb76ff1Sjsg 46*1bb76ff1Sjsg enum MES_SCH_API_OPCODE { 47*1bb76ff1Sjsg MES_SCH_API_SET_HW_RSRC = 0, 48*1bb76ff1Sjsg MES_SCH_API_SET_SCHEDULING_CONFIG = 1, /* agreegated db, quantums, etc */ 49*1bb76ff1Sjsg MES_SCH_API_ADD_QUEUE = 2, 50*1bb76ff1Sjsg MES_SCH_API_REMOVE_QUEUE = 3, 51*1bb76ff1Sjsg MES_SCH_API_PERFORM_YIELD = 4, 52*1bb76ff1Sjsg MES_SCH_API_SET_GANG_PRIORITY_LEVEL = 5, 53*1bb76ff1Sjsg MES_SCH_API_SUSPEND = 6, 54*1bb76ff1Sjsg MES_SCH_API_RESUME = 7, 55*1bb76ff1Sjsg MES_SCH_API_RESET = 8, 56*1bb76ff1Sjsg MES_SCH_API_SET_LOG_BUFFER = 9, 57*1bb76ff1Sjsg MES_SCH_API_CHANGE_GANG_PRORITY = 10, 58*1bb76ff1Sjsg MES_SCH_API_QUERY_SCHEDULER_STATUS = 11, 59*1bb76ff1Sjsg MES_SCH_API_PROGRAM_GDS = 12, 60*1bb76ff1Sjsg MES_SCH_API_SET_DEBUG_VMID = 13, 61*1bb76ff1Sjsg MES_SCH_API_MISC = 14, 62*1bb76ff1Sjsg MES_SCH_API_UPDATE_ROOT_PAGE_TABLE = 15, 63*1bb76ff1Sjsg MES_SCH_API_AMD_LOG = 16, 64*1bb76ff1Sjsg MES_SCH_API_MAX = 0xFF 65*1bb76ff1Sjsg }; 66*1bb76ff1Sjsg 67*1bb76ff1Sjsg union MES_API_HEADER { 68*1bb76ff1Sjsg struct { 69*1bb76ff1Sjsg uint32_t type : 4; /* 0 - Invalid; 1 - Scheduling; 2 - TBD */ 70*1bb76ff1Sjsg uint32_t opcode : 8; 71*1bb76ff1Sjsg uint32_t dwsize : 8; /* including header */ 72*1bb76ff1Sjsg uint32_t reserved : 12; 73*1bb76ff1Sjsg }; 74*1bb76ff1Sjsg 75*1bb76ff1Sjsg uint32_t u32All; 76*1bb76ff1Sjsg }; 77*1bb76ff1Sjsg 78*1bb76ff1Sjsg enum MES_AMD_PRIORITY_LEVEL { 79*1bb76ff1Sjsg AMD_PRIORITY_LEVEL_LOW = 0, 80*1bb76ff1Sjsg AMD_PRIORITY_LEVEL_NORMAL = 1, 81*1bb76ff1Sjsg AMD_PRIORITY_LEVEL_MEDIUM = 2, 82*1bb76ff1Sjsg AMD_PRIORITY_LEVEL_HIGH = 3, 83*1bb76ff1Sjsg AMD_PRIORITY_LEVEL_REALTIME = 4, 84*1bb76ff1Sjsg AMD_PRIORITY_NUM_LEVELS 85*1bb76ff1Sjsg }; 86*1bb76ff1Sjsg 87*1bb76ff1Sjsg enum MES_QUEUE_TYPE { 88*1bb76ff1Sjsg MES_QUEUE_TYPE_GFX, 89*1bb76ff1Sjsg MES_QUEUE_TYPE_COMPUTE, 90*1bb76ff1Sjsg MES_QUEUE_TYPE_SDMA, 91*1bb76ff1Sjsg MES_QUEUE_TYPE_MAX, 92*1bb76ff1Sjsg }; 93*1bb76ff1Sjsg 94*1bb76ff1Sjsg struct MES_API_STATUS { 95*1bb76ff1Sjsg uint64_t api_completion_fence_addr; 96*1bb76ff1Sjsg uint64_t api_completion_fence_value; 97*1bb76ff1Sjsg }; 98*1bb76ff1Sjsg 99*1bb76ff1Sjsg enum { MAX_COMPUTE_PIPES = 8 }; 100*1bb76ff1Sjsg enum { MAX_GFX_PIPES = 2 }; 101*1bb76ff1Sjsg enum { MAX_SDMA_PIPES = 2 }; 102*1bb76ff1Sjsg 103*1bb76ff1Sjsg enum { MAX_COMPUTE_HQD_PER_PIPE = 8 }; 104*1bb76ff1Sjsg enum { MAX_GFX_HQD_PER_PIPE = 8 }; 105*1bb76ff1Sjsg enum { MAX_SDMA_HQD_PER_PIPE = 10 }; 106*1bb76ff1Sjsg 107*1bb76ff1Sjsg enum { MAX_QUEUES_IN_A_GANG = 8 }; 108*1bb76ff1Sjsg 109*1bb76ff1Sjsg enum VM_HUB_TYPE { 110*1bb76ff1Sjsg VM_HUB_TYPE_GC = 0, 111*1bb76ff1Sjsg VM_HUB_TYPE_MM = 1, 112*1bb76ff1Sjsg VM_HUB_TYPE_MAX, 113*1bb76ff1Sjsg }; 114*1bb76ff1Sjsg 115*1bb76ff1Sjsg enum { VMID_INVALID = 0xffff }; 116*1bb76ff1Sjsg 117*1bb76ff1Sjsg enum { MAX_VMID_GCHUB = 16 }; 118*1bb76ff1Sjsg enum { MAX_VMID_MMHUB = 16 }; 119*1bb76ff1Sjsg 120*1bb76ff1Sjsg enum MES_LOG_OPERATION { 121*1bb76ff1Sjsg MES_LOG_OPERATION_CONTEXT_STATE_CHANGE = 0, 122*1bb76ff1Sjsg MES_LOG_OPERATION_QUEUE_NEW_WORK = 1, 123*1bb76ff1Sjsg MES_LOG_OPERATION_QUEUE_UNWAIT_SYNC_OBJECT = 2, 124*1bb76ff1Sjsg MES_LOG_OPERATION_QUEUE_NO_MORE_WORK = 3, 125*1bb76ff1Sjsg MES_LOG_OPERATION_QUEUE_WAIT_SYNC_OBJECT = 4, 126*1bb76ff1Sjsg MES_LOG_OPERATION_QUEUE_INVALID = 0xF, 127*1bb76ff1Sjsg }; 128*1bb76ff1Sjsg 129*1bb76ff1Sjsg enum MES_LOG_CONTEXT_STATE { 130*1bb76ff1Sjsg MES_LOG_CONTEXT_STATE_IDLE = 0, 131*1bb76ff1Sjsg MES_LOG_CONTEXT_STATE_RUNNING = 1, 132*1bb76ff1Sjsg MES_LOG_CONTEXT_STATE_READY = 2, 133*1bb76ff1Sjsg MES_LOG_CONTEXT_STATE_READY_STANDBY = 3, 134*1bb76ff1Sjsg MES_LOG_CONTEXT_STATE_INVALID = 0xF, 135*1bb76ff1Sjsg }; 136*1bb76ff1Sjsg 137*1bb76ff1Sjsg struct MES_LOG_CONTEXT_STATE_CHANGE { 138*1bb76ff1Sjsg void *h_context; 139*1bb76ff1Sjsg enum MES_LOG_CONTEXT_STATE new_context_state; 140*1bb76ff1Sjsg }; 141*1bb76ff1Sjsg 142*1bb76ff1Sjsg struct MES_LOG_QUEUE_NEW_WORK { 143*1bb76ff1Sjsg uint64_t h_queue; 144*1bb76ff1Sjsg uint64_t reserved; 145*1bb76ff1Sjsg }; 146*1bb76ff1Sjsg 147*1bb76ff1Sjsg struct MES_LOG_QUEUE_UNWAIT_SYNC_OBJECT { 148*1bb76ff1Sjsg uint64_t h_queue; 149*1bb76ff1Sjsg uint64_t h_sync_object; 150*1bb76ff1Sjsg }; 151*1bb76ff1Sjsg 152*1bb76ff1Sjsg struct MES_LOG_QUEUE_NO_MORE_WORK { 153*1bb76ff1Sjsg uint64_t h_queue; 154*1bb76ff1Sjsg uint64_t reserved; 155*1bb76ff1Sjsg }; 156*1bb76ff1Sjsg 157*1bb76ff1Sjsg struct MES_LOG_QUEUE_WAIT_SYNC_OBJECT { 158*1bb76ff1Sjsg uint64_t h_queue; 159*1bb76ff1Sjsg uint64_t h_sync_object; 160*1bb76ff1Sjsg }; 161*1bb76ff1Sjsg 162*1bb76ff1Sjsg struct MES_LOG_ENTRY_HEADER { 163*1bb76ff1Sjsg uint32_t first_free_entry_index; 164*1bb76ff1Sjsg uint32_t wraparound_count; 165*1bb76ff1Sjsg uint64_t number_of_entries; 166*1bb76ff1Sjsg uint64_t reserved[2]; 167*1bb76ff1Sjsg }; 168*1bb76ff1Sjsg 169*1bb76ff1Sjsg struct MES_LOG_ENTRY_DATA { 170*1bb76ff1Sjsg uint64_t gpu_time_stamp; 171*1bb76ff1Sjsg uint32_t operation_type; /* operation_type is of MES_LOG_OPERATION type */ 172*1bb76ff1Sjsg uint32_t reserved_operation_type_bits; 173*1bb76ff1Sjsg union { 174*1bb76ff1Sjsg struct MES_LOG_CONTEXT_STATE_CHANGE context_state_change; 175*1bb76ff1Sjsg struct MES_LOG_QUEUE_NEW_WORK queue_new_work; 176*1bb76ff1Sjsg struct MES_LOG_QUEUE_UNWAIT_SYNC_OBJECT queue_unwait_sync_object; 177*1bb76ff1Sjsg struct MES_LOG_QUEUE_NO_MORE_WORK queue_no_more_work; 178*1bb76ff1Sjsg struct MES_LOG_QUEUE_WAIT_SYNC_OBJECT queue_wait_sync_object; 179*1bb76ff1Sjsg uint64_t all[2]; 180*1bb76ff1Sjsg }; 181*1bb76ff1Sjsg }; 182*1bb76ff1Sjsg 183*1bb76ff1Sjsg struct MES_LOG_BUFFER { 184*1bb76ff1Sjsg struct MES_LOG_ENTRY_HEADER header; 185*1bb76ff1Sjsg struct MES_LOG_ENTRY_DATA entries[1]; 186*1bb76ff1Sjsg }; 187*1bb76ff1Sjsg 188*1bb76ff1Sjsg enum MES_SWIP_TO_HWIP_DEF { 189*1bb76ff1Sjsg MES_MAX_HWIP_SEGMENT = 6, 190*1bb76ff1Sjsg }; 191*1bb76ff1Sjsg 192*1bb76ff1Sjsg union MESAPI_SET_HW_RESOURCES { 193*1bb76ff1Sjsg struct { 194*1bb76ff1Sjsg union MES_API_HEADER header; 195*1bb76ff1Sjsg uint32_t vmid_mask_mmhub; 196*1bb76ff1Sjsg uint32_t vmid_mask_gfxhub; 197*1bb76ff1Sjsg uint32_t gds_size; 198*1bb76ff1Sjsg uint32_t paging_vmid; 199*1bb76ff1Sjsg uint32_t compute_hqd_mask[MAX_COMPUTE_PIPES]; 200*1bb76ff1Sjsg uint32_t gfx_hqd_mask[MAX_GFX_PIPES]; 201*1bb76ff1Sjsg uint32_t sdma_hqd_mask[MAX_SDMA_PIPES]; 202*1bb76ff1Sjsg uint32_t aggregated_doorbells[AMD_PRIORITY_NUM_LEVELS]; 203*1bb76ff1Sjsg uint64_t g_sch_ctx_gpu_mc_ptr; 204*1bb76ff1Sjsg uint64_t query_status_fence_gpu_mc_ptr; 205*1bb76ff1Sjsg uint32_t gc_base[MES_MAX_HWIP_SEGMENT]; 206*1bb76ff1Sjsg uint32_t mmhub_base[MES_MAX_HWIP_SEGMENT]; 207*1bb76ff1Sjsg uint32_t osssys_base[MES_MAX_HWIP_SEGMENT]; 208*1bb76ff1Sjsg struct MES_API_STATUS api_status; 209*1bb76ff1Sjsg union { 210*1bb76ff1Sjsg struct { 211*1bb76ff1Sjsg uint32_t disable_reset : 1; 212*1bb76ff1Sjsg uint32_t use_different_vmid_compute : 1; 213*1bb76ff1Sjsg uint32_t disable_mes_log : 1; 214*1bb76ff1Sjsg uint32_t apply_mmhub_pgvm_invalidate_ack_loss_wa : 1; 215*1bb76ff1Sjsg uint32_t apply_grbm_remote_register_dummy_read_wa : 1; 216*1bb76ff1Sjsg uint32_t second_gfx_pipe_enabled : 1; 217*1bb76ff1Sjsg uint32_t enable_level_process_quantum_check : 1; 218*1bb76ff1Sjsg uint32_t apply_cwsr_program_all_vmid_sq_shader_tba_registers_wa : 1; 219*1bb76ff1Sjsg uint32_t enable_mqd_active_poll : 1; 220*1bb76ff1Sjsg uint32_t disable_timer_int : 1; 221*1bb76ff1Sjsg uint32_t reserved : 22; 222*1bb76ff1Sjsg }; 223*1bb76ff1Sjsg uint32_t uint32_t_all; 224*1bb76ff1Sjsg }; 225*1bb76ff1Sjsg }; 226*1bb76ff1Sjsg 227*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 228*1bb76ff1Sjsg }; 229*1bb76ff1Sjsg 230*1bb76ff1Sjsg union MESAPI__ADD_QUEUE { 231*1bb76ff1Sjsg struct { 232*1bb76ff1Sjsg union MES_API_HEADER header; 233*1bb76ff1Sjsg uint32_t process_id; 234*1bb76ff1Sjsg uint64_t page_table_base_addr; 235*1bb76ff1Sjsg uint64_t process_va_start; 236*1bb76ff1Sjsg uint64_t process_va_end; 237*1bb76ff1Sjsg uint64_t process_quantum; 238*1bb76ff1Sjsg uint64_t process_context_addr; 239*1bb76ff1Sjsg uint64_t gang_quantum; 240*1bb76ff1Sjsg uint64_t gang_context_addr; 241*1bb76ff1Sjsg uint32_t inprocess_gang_priority; 242*1bb76ff1Sjsg enum MES_AMD_PRIORITY_LEVEL gang_global_priority_level; 243*1bb76ff1Sjsg uint32_t doorbell_offset; 244*1bb76ff1Sjsg uint64_t mqd_addr; 245*1bb76ff1Sjsg uint64_t wptr_addr; 246*1bb76ff1Sjsg uint64_t h_context; 247*1bb76ff1Sjsg uint64_t h_queue; 248*1bb76ff1Sjsg enum MES_QUEUE_TYPE queue_type; 249*1bb76ff1Sjsg uint32_t gds_base; 250*1bb76ff1Sjsg uint32_t gds_size; 251*1bb76ff1Sjsg uint32_t gws_base; 252*1bb76ff1Sjsg uint32_t gws_size; 253*1bb76ff1Sjsg uint32_t oa_mask; 254*1bb76ff1Sjsg uint64_t trap_handler_addr; 255*1bb76ff1Sjsg uint32_t vm_context_cntl; 256*1bb76ff1Sjsg 257*1bb76ff1Sjsg struct { 258*1bb76ff1Sjsg uint32_t paging : 1; 259*1bb76ff1Sjsg uint32_t debug_vmid : 4; 260*1bb76ff1Sjsg uint32_t program_gds : 1; 261*1bb76ff1Sjsg uint32_t is_gang_suspended : 1; 262*1bb76ff1Sjsg uint32_t is_tmz_queue : 1; 263*1bb76ff1Sjsg uint32_t map_kiq_utility_queue : 1; 264*1bb76ff1Sjsg uint32_t reserved : 23; 265*1bb76ff1Sjsg }; 266*1bb76ff1Sjsg struct MES_API_STATUS api_status; 267*1bb76ff1Sjsg }; 268*1bb76ff1Sjsg 269*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 270*1bb76ff1Sjsg }; 271*1bb76ff1Sjsg 272*1bb76ff1Sjsg union MESAPI__REMOVE_QUEUE { 273*1bb76ff1Sjsg struct { 274*1bb76ff1Sjsg union MES_API_HEADER header; 275*1bb76ff1Sjsg uint32_t doorbell_offset; 276*1bb76ff1Sjsg uint64_t gang_context_addr; 277*1bb76ff1Sjsg 278*1bb76ff1Sjsg struct { 279*1bb76ff1Sjsg uint32_t unmap_legacy_gfx_queue : 1; 280*1bb76ff1Sjsg uint32_t unmap_kiq_utility_queue : 1; 281*1bb76ff1Sjsg uint32_t preempt_legacy_gfx_queue : 1; 282*1bb76ff1Sjsg uint32_t reserved : 29; 283*1bb76ff1Sjsg }; 284*1bb76ff1Sjsg struct MES_API_STATUS api_status; 285*1bb76ff1Sjsg 286*1bb76ff1Sjsg uint32_t pipe_id; 287*1bb76ff1Sjsg uint32_t queue_id; 288*1bb76ff1Sjsg 289*1bb76ff1Sjsg uint64_t tf_addr; 290*1bb76ff1Sjsg uint32_t tf_data; 291*1bb76ff1Sjsg }; 292*1bb76ff1Sjsg 293*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 294*1bb76ff1Sjsg }; 295*1bb76ff1Sjsg 296*1bb76ff1Sjsg union MESAPI__SET_SCHEDULING_CONFIG { 297*1bb76ff1Sjsg struct { 298*1bb76ff1Sjsg union MES_API_HEADER header; 299*1bb76ff1Sjsg /* Grace period when preempting another priority band for this 300*1bb76ff1Sjsg * priority band. The value for idle priority band is ignored, 301*1bb76ff1Sjsg * as it never preempts other bands. 302*1bb76ff1Sjsg */ 303*1bb76ff1Sjsg uint64_t grace_period_other_levels[AMD_PRIORITY_NUM_LEVELS]; 304*1bb76ff1Sjsg /* Default quantum for scheduling across processes within 305*1bb76ff1Sjsg * a priority band. 306*1bb76ff1Sjsg */ 307*1bb76ff1Sjsg uint64_t process_quantum_for_level[AMD_PRIORITY_NUM_LEVELS]; 308*1bb76ff1Sjsg /* Default grace period for processes that preempt each other 309*1bb76ff1Sjsg * within a priority band. 310*1bb76ff1Sjsg */ 311*1bb76ff1Sjsg uint64_t process_grace_period_same_level[AMD_PRIORITY_NUM_LEVELS]; 312*1bb76ff1Sjsg /* For normal level this field specifies the target GPU 313*1bb76ff1Sjsg * percentage in situations when it's starved by the high level. 314*1bb76ff1Sjsg * Valid values are between 0 and 50, with the default being 10. 315*1bb76ff1Sjsg */ 316*1bb76ff1Sjsg uint32_t normal_yield_percent; 317*1bb76ff1Sjsg struct MES_API_STATUS api_status; 318*1bb76ff1Sjsg }; 319*1bb76ff1Sjsg 320*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 321*1bb76ff1Sjsg }; 322*1bb76ff1Sjsg 323*1bb76ff1Sjsg union MESAPI__PERFORM_YIELD { 324*1bb76ff1Sjsg struct { 325*1bb76ff1Sjsg union MES_API_HEADER header; 326*1bb76ff1Sjsg uint32_t dummy; 327*1bb76ff1Sjsg struct MES_API_STATUS api_status; 328*1bb76ff1Sjsg }; 329*1bb76ff1Sjsg 330*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 331*1bb76ff1Sjsg }; 332*1bb76ff1Sjsg 333*1bb76ff1Sjsg union MESAPI__CHANGE_GANG_PRIORITY_LEVEL { 334*1bb76ff1Sjsg struct { 335*1bb76ff1Sjsg union MES_API_HEADER header; 336*1bb76ff1Sjsg uint32_t inprocess_gang_priority; 337*1bb76ff1Sjsg enum MES_AMD_PRIORITY_LEVEL gang_global_priority_level; 338*1bb76ff1Sjsg uint64_t gang_quantum; 339*1bb76ff1Sjsg uint64_t gang_context_addr; 340*1bb76ff1Sjsg struct MES_API_STATUS api_status; 341*1bb76ff1Sjsg }; 342*1bb76ff1Sjsg 343*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 344*1bb76ff1Sjsg }; 345*1bb76ff1Sjsg 346*1bb76ff1Sjsg union MESAPI__SUSPEND { 347*1bb76ff1Sjsg struct { 348*1bb76ff1Sjsg union MES_API_HEADER header; 349*1bb76ff1Sjsg /* false - suspend all gangs; true - specific gang */ 350*1bb76ff1Sjsg struct { 351*1bb76ff1Sjsg uint32_t suspend_all_gangs : 1; 352*1bb76ff1Sjsg uint32_t reserved : 31; 353*1bb76ff1Sjsg }; 354*1bb76ff1Sjsg /* gang_context_addr is valid only if suspend_all = false */ 355*1bb76ff1Sjsg uint64_t gang_context_addr; 356*1bb76ff1Sjsg 357*1bb76ff1Sjsg uint64_t suspend_fence_addr; 358*1bb76ff1Sjsg uint32_t suspend_fence_value; 359*1bb76ff1Sjsg 360*1bb76ff1Sjsg struct MES_API_STATUS api_status; 361*1bb76ff1Sjsg }; 362*1bb76ff1Sjsg 363*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 364*1bb76ff1Sjsg }; 365*1bb76ff1Sjsg 366*1bb76ff1Sjsg union MESAPI__RESUME { 367*1bb76ff1Sjsg struct { 368*1bb76ff1Sjsg union MES_API_HEADER header; 369*1bb76ff1Sjsg /* false - resume all gangs; true - specified gang */ 370*1bb76ff1Sjsg struct { 371*1bb76ff1Sjsg uint32_t resume_all_gangs : 1; 372*1bb76ff1Sjsg uint32_t reserved : 31; 373*1bb76ff1Sjsg }; 374*1bb76ff1Sjsg /* valid only if resume_all_gangs = false */ 375*1bb76ff1Sjsg uint64_t gang_context_addr; 376*1bb76ff1Sjsg 377*1bb76ff1Sjsg struct MES_API_STATUS api_status; 378*1bb76ff1Sjsg }; 379*1bb76ff1Sjsg 380*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 381*1bb76ff1Sjsg }; 382*1bb76ff1Sjsg 383*1bb76ff1Sjsg union MESAPI__RESET { 384*1bb76ff1Sjsg struct { 385*1bb76ff1Sjsg union MES_API_HEADER header; 386*1bb76ff1Sjsg 387*1bb76ff1Sjsg struct { 388*1bb76ff1Sjsg /* Only reset the queue given by doorbell_offset (not entire gang) */ 389*1bb76ff1Sjsg uint32_t reset_queue_only : 1; 390*1bb76ff1Sjsg /* Hang detection first then reset any queues that are hung */ 391*1bb76ff1Sjsg uint32_t hang_detect_then_reset : 1; 392*1bb76ff1Sjsg /* Only do hang detection (no reset) */ 393*1bb76ff1Sjsg uint32_t hang_detect_only : 1; 394*1bb76ff1Sjsg /* Rest HP and LP kernel queues not managed by MES */ 395*1bb76ff1Sjsg uint32_t reset_legacy_gfx : 1; 396*1bb76ff1Sjsg uint32_t reserved : 28; 397*1bb76ff1Sjsg }; 398*1bb76ff1Sjsg 399*1bb76ff1Sjsg uint64_t gang_context_addr; 400*1bb76ff1Sjsg 401*1bb76ff1Sjsg /* valid only if reset_queue_only = true */ 402*1bb76ff1Sjsg uint32_t doorbell_offset; 403*1bb76ff1Sjsg 404*1bb76ff1Sjsg /* valid only if hang_detect_then_reset = true */ 405*1bb76ff1Sjsg uint64_t doorbell_offset_addr; 406*1bb76ff1Sjsg enum MES_QUEUE_TYPE queue_type; 407*1bb76ff1Sjsg 408*1bb76ff1Sjsg /* valid only if reset_legacy_gfx = true */ 409*1bb76ff1Sjsg uint32_t pipe_id_lp; 410*1bb76ff1Sjsg uint32_t queue_id_lp; 411*1bb76ff1Sjsg uint32_t vmid_id_lp; 412*1bb76ff1Sjsg uint64_t mqd_mc_addr_lp; 413*1bb76ff1Sjsg uint32_t doorbell_offset_lp; 414*1bb76ff1Sjsg uint64_t wptr_addr_lp; 415*1bb76ff1Sjsg 416*1bb76ff1Sjsg uint32_t pipe_id_hp; 417*1bb76ff1Sjsg uint32_t queue_id_hp; 418*1bb76ff1Sjsg uint32_t vmid_id_hp; 419*1bb76ff1Sjsg uint64_t mqd_mc_addr_hp; 420*1bb76ff1Sjsg uint32_t doorbell_offset_hp; 421*1bb76ff1Sjsg uint64_t wptr_addr_hp; 422*1bb76ff1Sjsg 423*1bb76ff1Sjsg struct MES_API_STATUS api_status; 424*1bb76ff1Sjsg }; 425*1bb76ff1Sjsg 426*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 427*1bb76ff1Sjsg }; 428*1bb76ff1Sjsg 429*1bb76ff1Sjsg union MESAPI__SET_LOGGING_BUFFER { 430*1bb76ff1Sjsg struct { 431*1bb76ff1Sjsg union MES_API_HEADER header; 432*1bb76ff1Sjsg /* There are separate log buffers for each queue type */ 433*1bb76ff1Sjsg enum MES_QUEUE_TYPE log_type; 434*1bb76ff1Sjsg /* Log buffer GPU Address */ 435*1bb76ff1Sjsg uint64_t logging_buffer_addr; 436*1bb76ff1Sjsg /* number of entries in the log buffer */ 437*1bb76ff1Sjsg uint32_t number_of_entries; 438*1bb76ff1Sjsg /* Entry index at which CPU interrupt needs to be signalled */ 439*1bb76ff1Sjsg uint32_t interrupt_entry; 440*1bb76ff1Sjsg 441*1bb76ff1Sjsg struct MES_API_STATUS api_status; 442*1bb76ff1Sjsg }; 443*1bb76ff1Sjsg 444*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 445*1bb76ff1Sjsg }; 446*1bb76ff1Sjsg 447*1bb76ff1Sjsg union MESAPI__QUERY_MES_STATUS { 448*1bb76ff1Sjsg struct { 449*1bb76ff1Sjsg union MES_API_HEADER header; 450*1bb76ff1Sjsg bool mes_healthy; /* 0 - not healthy, 1 - healthy */ 451*1bb76ff1Sjsg struct MES_API_STATUS api_status; 452*1bb76ff1Sjsg }; 453*1bb76ff1Sjsg 454*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 455*1bb76ff1Sjsg }; 456*1bb76ff1Sjsg 457*1bb76ff1Sjsg union MESAPI__PROGRAM_GDS { 458*1bb76ff1Sjsg struct { 459*1bb76ff1Sjsg union MES_API_HEADER header; 460*1bb76ff1Sjsg uint64_t process_context_addr; 461*1bb76ff1Sjsg uint32_t gds_base; 462*1bb76ff1Sjsg uint32_t gds_size; 463*1bb76ff1Sjsg uint32_t gws_base; 464*1bb76ff1Sjsg uint32_t gws_size; 465*1bb76ff1Sjsg uint32_t oa_mask; 466*1bb76ff1Sjsg struct MES_API_STATUS api_status; 467*1bb76ff1Sjsg }; 468*1bb76ff1Sjsg 469*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 470*1bb76ff1Sjsg }; 471*1bb76ff1Sjsg 472*1bb76ff1Sjsg union MESAPI__SET_DEBUG_VMID { 473*1bb76ff1Sjsg struct { 474*1bb76ff1Sjsg union MES_API_HEADER header; 475*1bb76ff1Sjsg struct MES_API_STATUS api_status; 476*1bb76ff1Sjsg union { 477*1bb76ff1Sjsg struct { 478*1bb76ff1Sjsg uint32_t use_gds : 1; 479*1bb76ff1Sjsg uint32_t reserved : 31; 480*1bb76ff1Sjsg } flags; 481*1bb76ff1Sjsg uint32_t u32All; 482*1bb76ff1Sjsg }; 483*1bb76ff1Sjsg uint32_t reserved; 484*1bb76ff1Sjsg uint32_t debug_vmid; 485*1bb76ff1Sjsg uint64_t process_context_addr; 486*1bb76ff1Sjsg uint64_t page_table_base_addr; 487*1bb76ff1Sjsg uint64_t process_va_start; 488*1bb76ff1Sjsg uint64_t process_va_end; 489*1bb76ff1Sjsg uint32_t gds_base; 490*1bb76ff1Sjsg uint32_t gds_size; 491*1bb76ff1Sjsg uint32_t gws_base; 492*1bb76ff1Sjsg uint32_t gws_size; 493*1bb76ff1Sjsg uint32_t oa_mask; 494*1bb76ff1Sjsg }; 495*1bb76ff1Sjsg 496*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 497*1bb76ff1Sjsg }; 498*1bb76ff1Sjsg 499*1bb76ff1Sjsg enum MESAPI_MISC_OPCODE { 500*1bb76ff1Sjsg MESAPI_MISC__MODIFY_REG, 501*1bb76ff1Sjsg MESAPI_MISC__INV_GART, 502*1bb76ff1Sjsg MESAPI_MISC__QUERY_STATUS, 503*1bb76ff1Sjsg MESAPI_MISC__MAX, 504*1bb76ff1Sjsg }; 505*1bb76ff1Sjsg 506*1bb76ff1Sjsg enum MODIFY_REG_SUBCODE { 507*1bb76ff1Sjsg MODIFY_REG__OVERWRITE, 508*1bb76ff1Sjsg MODIFY_REG__RMW_OR, 509*1bb76ff1Sjsg MODIFY_REG__RMW_AND, 510*1bb76ff1Sjsg MODIFY_REG__MAX, 511*1bb76ff1Sjsg }; 512*1bb76ff1Sjsg 513*1bb76ff1Sjsg enum { MISC_DATA_MAX_SIZE_IN_DWORDS = 20 }; 514*1bb76ff1Sjsg 515*1bb76ff1Sjsg struct MODIFY_REG { 516*1bb76ff1Sjsg enum MODIFY_REG_SUBCODE subcode; 517*1bb76ff1Sjsg uint32_t reg_offset; 518*1bb76ff1Sjsg uint32_t reg_value; 519*1bb76ff1Sjsg }; 520*1bb76ff1Sjsg 521*1bb76ff1Sjsg struct INV_GART { 522*1bb76ff1Sjsg uint64_t inv_range_va_start; 523*1bb76ff1Sjsg uint64_t inv_range_size; 524*1bb76ff1Sjsg }; 525*1bb76ff1Sjsg 526*1bb76ff1Sjsg struct QUERY_STATUS { 527*1bb76ff1Sjsg uint32_t context_id; 528*1bb76ff1Sjsg }; 529*1bb76ff1Sjsg 530*1bb76ff1Sjsg union MESAPI__MISC { 531*1bb76ff1Sjsg struct { 532*1bb76ff1Sjsg union MES_API_HEADER header; 533*1bb76ff1Sjsg enum MESAPI_MISC_OPCODE opcode; 534*1bb76ff1Sjsg struct MES_API_STATUS api_status; 535*1bb76ff1Sjsg 536*1bb76ff1Sjsg union { 537*1bb76ff1Sjsg struct MODIFY_REG modify_reg; 538*1bb76ff1Sjsg struct INV_GART inv_gart; 539*1bb76ff1Sjsg struct QUERY_STATUS query_status; 540*1bb76ff1Sjsg uint32_t data[MISC_DATA_MAX_SIZE_IN_DWORDS]; 541*1bb76ff1Sjsg }; 542*1bb76ff1Sjsg }; 543*1bb76ff1Sjsg 544*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 545*1bb76ff1Sjsg }; 546*1bb76ff1Sjsg 547*1bb76ff1Sjsg union MESAPI__UPDATE_ROOT_PAGE_TABLE { 548*1bb76ff1Sjsg struct { 549*1bb76ff1Sjsg union MES_API_HEADER header; 550*1bb76ff1Sjsg uint64_t page_table_base_addr; 551*1bb76ff1Sjsg uint64_t process_context_addr; 552*1bb76ff1Sjsg struct MES_API_STATUS api_status; 553*1bb76ff1Sjsg }; 554*1bb76ff1Sjsg 555*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 556*1bb76ff1Sjsg }; 557*1bb76ff1Sjsg 558*1bb76ff1Sjsg union MESAPI_AMD_LOG { 559*1bb76ff1Sjsg struct { 560*1bb76ff1Sjsg union MES_API_HEADER header; 561*1bb76ff1Sjsg uint64_t p_buffer_memory; 562*1bb76ff1Sjsg uint64_t p_buffer_size_used; 563*1bb76ff1Sjsg struct MES_API_STATUS api_status; 564*1bb76ff1Sjsg }; 565*1bb76ff1Sjsg 566*1bb76ff1Sjsg uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS]; 567*1bb76ff1Sjsg }; 568*1bb76ff1Sjsg 569*1bb76ff1Sjsg #pragma pack(pop) 570*1bb76ff1Sjsg #endif 571