xref: /openbsd-src/sys/dev/pci/drm/amd/include/mes_api_def.h (revision 1bb76ff151c0aba8e3312a604e4cd2e5195cf4b7)
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