xref: /openbsd-src/sys/dev/pci/drm/amd/include/mes_v11_api_def.h (revision f074e99dd34d6f7ac12551ffef94a2c762278207)
11bb76ff1Sjsg /*
21bb76ff1Sjsg  * Copyright 2022 Advanced Micro Devices, Inc.
31bb76ff1Sjsg  *
41bb76ff1Sjsg  * Permission is hereby granted, free of charge, to any person obtaining a
51bb76ff1Sjsg  * copy of this software and associated documentation files (the "Software"),
61bb76ff1Sjsg  * to deal in the Software without restriction, including without limitation
71bb76ff1Sjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
81bb76ff1Sjsg  * and/or sell copies of the Software, and to permit persons to whom the
91bb76ff1Sjsg  * Software is furnished to do so, subject to the following conditions:
101bb76ff1Sjsg  *
111bb76ff1Sjsg  * The above copyright notice and this permission notice shall be included in
121bb76ff1Sjsg  * all copies or substantial portions of the Software.
131bb76ff1Sjsg  *
141bb76ff1Sjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
151bb76ff1Sjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
161bb76ff1Sjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
171bb76ff1Sjsg  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
181bb76ff1Sjsg  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
191bb76ff1Sjsg  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
201bb76ff1Sjsg  * OTHER DEALINGS IN THE SOFTWARE.
211bb76ff1Sjsg  *
221bb76ff1Sjsg  */
231bb76ff1Sjsg 
241bb76ff1Sjsg #ifndef __MES_API_DEF_H__
251bb76ff1Sjsg #define __MES_API_DEF_H__
261bb76ff1Sjsg 
271bb76ff1Sjsg #pragma pack(push, 4)
281bb76ff1Sjsg 
291bb76ff1Sjsg #define MES_API_VERSION 1
301bb76ff1Sjsg 
311bb76ff1Sjsg /* Driver submits one API(cmd) as a single Frame and this command size is same
321bb76ff1Sjsg  * for all API to ease the debugging and parsing of ring buffer.
331bb76ff1Sjsg  */
341bb76ff1Sjsg enum { API_FRAME_SIZE_IN_DWORDS = 64 };
351bb76ff1Sjsg 
361bb76ff1Sjsg /* To avoid command in scheduler context to be overwritten whenenver mutilple
371bb76ff1Sjsg  * interrupts come in, this creates another queue.
381bb76ff1Sjsg  */
391bb76ff1Sjsg enum { API_NUMBER_OF_COMMAND_MAX = 32 };
401bb76ff1Sjsg 
411bb76ff1Sjsg enum MES_API_TYPE {
421bb76ff1Sjsg 	MES_API_TYPE_SCHEDULER = 1,
431bb76ff1Sjsg 	MES_API_TYPE_MAX
441bb76ff1Sjsg };
451bb76ff1Sjsg 
461bb76ff1Sjsg enum MES_SCH_API_OPCODE {
471bb76ff1Sjsg 	MES_SCH_API_SET_HW_RSRC			= 0,
481bb76ff1Sjsg 	MES_SCH_API_SET_SCHEDULING_CONFIG	= 1, /* agreegated db, quantums, etc */
491bb76ff1Sjsg 	MES_SCH_API_ADD_QUEUE			= 2,
501bb76ff1Sjsg 	MES_SCH_API_REMOVE_QUEUE		= 3,
511bb76ff1Sjsg 	MES_SCH_API_PERFORM_YIELD		= 4,
521bb76ff1Sjsg 	MES_SCH_API_SET_GANG_PRIORITY_LEVEL	= 5,
531bb76ff1Sjsg 	MES_SCH_API_SUSPEND			= 6,
541bb76ff1Sjsg 	MES_SCH_API_RESUME			= 7,
551bb76ff1Sjsg 	MES_SCH_API_RESET			= 8,
561bb76ff1Sjsg 	MES_SCH_API_SET_LOG_BUFFER		= 9,
571bb76ff1Sjsg 	MES_SCH_API_CHANGE_GANG_PRORITY		= 10,
581bb76ff1Sjsg 	MES_SCH_API_QUERY_SCHEDULER_STATUS	= 11,
591bb76ff1Sjsg 	MES_SCH_API_PROGRAM_GDS			= 12,
601bb76ff1Sjsg 	MES_SCH_API_SET_DEBUG_VMID		= 13,
611bb76ff1Sjsg 	MES_SCH_API_MISC			= 14,
621bb76ff1Sjsg 	MES_SCH_API_UPDATE_ROOT_PAGE_TABLE      = 15,
631bb76ff1Sjsg 	MES_SCH_API_AMD_LOG                     = 16,
641bb76ff1Sjsg 	MES_SCH_API_MAX				= 0xFF
651bb76ff1Sjsg };
661bb76ff1Sjsg 
671bb76ff1Sjsg union MES_API_HEADER {
681bb76ff1Sjsg 	struct {
691bb76ff1Sjsg 		uint32_t type		: 4; /* 0 - Invalid; 1 - Scheduling; 2 - TBD */
701bb76ff1Sjsg 		uint32_t opcode		: 8;
711bb76ff1Sjsg 		uint32_t dwsize		: 8; /* including header */
721bb76ff1Sjsg 		uint32_t reserved	: 12;
731bb76ff1Sjsg 	};
741bb76ff1Sjsg 
751bb76ff1Sjsg 	uint32_t	u32All;
761bb76ff1Sjsg };
771bb76ff1Sjsg 
781bb76ff1Sjsg enum MES_AMD_PRIORITY_LEVEL {
791bb76ff1Sjsg 	AMD_PRIORITY_LEVEL_LOW		= 0,
801bb76ff1Sjsg 	AMD_PRIORITY_LEVEL_NORMAL	= 1,
811bb76ff1Sjsg 	AMD_PRIORITY_LEVEL_MEDIUM	= 2,
821bb76ff1Sjsg 	AMD_PRIORITY_LEVEL_HIGH		= 3,
831bb76ff1Sjsg 	AMD_PRIORITY_LEVEL_REALTIME	= 4,
841bb76ff1Sjsg 	AMD_PRIORITY_NUM_LEVELS
851bb76ff1Sjsg };
861bb76ff1Sjsg 
871bb76ff1Sjsg enum MES_QUEUE_TYPE {
881bb76ff1Sjsg 	MES_QUEUE_TYPE_GFX,
891bb76ff1Sjsg 	MES_QUEUE_TYPE_COMPUTE,
901bb76ff1Sjsg 	MES_QUEUE_TYPE_SDMA,
911bb76ff1Sjsg 	MES_QUEUE_TYPE_MAX,
921bb76ff1Sjsg };
931bb76ff1Sjsg 
941bb76ff1Sjsg struct MES_API_STATUS {
951bb76ff1Sjsg 	uint64_t	api_completion_fence_addr;
961bb76ff1Sjsg 	uint64_t	api_completion_fence_value;
971bb76ff1Sjsg };
981bb76ff1Sjsg 
991bb76ff1Sjsg enum { MAX_COMPUTE_PIPES = 8 };
1001bb76ff1Sjsg enum { MAX_GFX_PIPES = 2 };
1011bb76ff1Sjsg enum { MAX_SDMA_PIPES = 2 };
1021bb76ff1Sjsg 
1031bb76ff1Sjsg enum { MAX_COMPUTE_HQD_PER_PIPE = 8 };
1041bb76ff1Sjsg enum { MAX_GFX_HQD_PER_PIPE = 8 };
1051bb76ff1Sjsg enum { MAX_SDMA_HQD_PER_PIPE = 10 };
1061bb76ff1Sjsg enum { MAX_SDMA_HQD_PER_PIPE_11_0   = 8 };
1071bb76ff1Sjsg 
1081bb76ff1Sjsg enum { MAX_QUEUES_IN_A_GANG = 8 };
1091bb76ff1Sjsg 
1101bb76ff1Sjsg enum VM_HUB_TYPE {
1111bb76ff1Sjsg 	VM_HUB_TYPE_GC = 0,
1121bb76ff1Sjsg 	VM_HUB_TYPE_MM = 1,
1131bb76ff1Sjsg 	VM_HUB_TYPE_MAX,
1141bb76ff1Sjsg };
1151bb76ff1Sjsg 
1161bb76ff1Sjsg enum { VMID_INVALID = 0xffff };
1171bb76ff1Sjsg 
1181bb76ff1Sjsg enum { MAX_VMID_GCHUB = 16 };
1191bb76ff1Sjsg enum { MAX_VMID_MMHUB = 16 };
1201bb76ff1Sjsg 
1211bb76ff1Sjsg enum SET_DEBUG_VMID_OPERATIONS {
1221bb76ff1Sjsg 	DEBUG_VMID_OP_PROGRAM = 0,
1231bb76ff1Sjsg 	DEBUG_VMID_OP_ALLOCATE = 1,
1241bb76ff1Sjsg 	DEBUG_VMID_OP_RELEASE = 2
1251bb76ff1Sjsg };
1261bb76ff1Sjsg 
1271bb76ff1Sjsg enum MES_LOG_OPERATION {
1281bb76ff1Sjsg 	MES_LOG_OPERATION_CONTEXT_STATE_CHANGE = 0,
1291bb76ff1Sjsg 	MES_LOG_OPERATION_QUEUE_NEW_WORK = 1,
1301bb76ff1Sjsg 	MES_LOG_OPERATION_QUEUE_UNWAIT_SYNC_OBJECT = 2,
1311bb76ff1Sjsg 	MES_LOG_OPERATION_QUEUE_NO_MORE_WORK = 3,
1321bb76ff1Sjsg 	MES_LOG_OPERATION_QUEUE_WAIT_SYNC_OBJECT = 4,
1331bb76ff1Sjsg 	MES_LOG_OPERATION_QUEUE_INVALID = 0xF,
1341bb76ff1Sjsg };
1351bb76ff1Sjsg 
1361bb76ff1Sjsg enum MES_LOG_CONTEXT_STATE {
1371bb76ff1Sjsg 	MES_LOG_CONTEXT_STATE_IDLE		= 0,
1381bb76ff1Sjsg 	MES_LOG_CONTEXT_STATE_RUNNING		= 1,
1391bb76ff1Sjsg 	MES_LOG_CONTEXT_STATE_READY		= 2,
1401bb76ff1Sjsg 	MES_LOG_CONTEXT_STATE_READY_STANDBY	= 3,
1411bb76ff1Sjsg 	MES_LOG_CONTEXT_STATE_INVALID           = 0xF,
1421bb76ff1Sjsg };
1431bb76ff1Sjsg 
1441bb76ff1Sjsg struct MES_LOG_CONTEXT_STATE_CHANGE {
1451bb76ff1Sjsg 	void				*h_context;
1461bb76ff1Sjsg 	enum MES_LOG_CONTEXT_STATE	new_context_state;
1471bb76ff1Sjsg };
1481bb76ff1Sjsg 
1491bb76ff1Sjsg struct MES_LOG_QUEUE_NEW_WORK {
1501bb76ff1Sjsg 	uint64_t                   h_queue;
1511bb76ff1Sjsg 	uint64_t                   reserved;
1521bb76ff1Sjsg };
1531bb76ff1Sjsg 
1541bb76ff1Sjsg struct MES_LOG_QUEUE_UNWAIT_SYNC_OBJECT {
1551bb76ff1Sjsg 	uint64_t                   h_queue;
1561bb76ff1Sjsg 	uint64_t                   h_sync_object;
1571bb76ff1Sjsg };
1581bb76ff1Sjsg 
1591bb76ff1Sjsg struct MES_LOG_QUEUE_NO_MORE_WORK {
1601bb76ff1Sjsg 	uint64_t                   h_queue;
1611bb76ff1Sjsg 	uint64_t                   reserved;
1621bb76ff1Sjsg };
1631bb76ff1Sjsg 
1641bb76ff1Sjsg struct MES_LOG_QUEUE_WAIT_SYNC_OBJECT {
1651bb76ff1Sjsg 	uint64_t                   h_queue;
1661bb76ff1Sjsg 	uint64_t                   h_sync_object;
1671bb76ff1Sjsg };
1681bb76ff1Sjsg 
1691bb76ff1Sjsg struct MES_LOG_ENTRY_HEADER {
1701bb76ff1Sjsg 	uint32_t	first_free_entry_index;
1711bb76ff1Sjsg 	uint32_t	wraparound_count;
1721bb76ff1Sjsg 	uint64_t	number_of_entries;
1731bb76ff1Sjsg 	uint64_t	reserved[2];
1741bb76ff1Sjsg };
1751bb76ff1Sjsg 
1761bb76ff1Sjsg struct MES_LOG_ENTRY_DATA {
1771bb76ff1Sjsg 	uint64_t	gpu_time_stamp;
1781bb76ff1Sjsg 	uint32_t	operation_type; /* operation_type is of MES_LOG_OPERATION type */
1791bb76ff1Sjsg 	uint32_t	reserved_operation_type_bits;
1801bb76ff1Sjsg 	union {
1811bb76ff1Sjsg 		struct MES_LOG_CONTEXT_STATE_CHANGE     context_state_change;
1821bb76ff1Sjsg 		struct MES_LOG_QUEUE_NEW_WORK           queue_new_work;
1831bb76ff1Sjsg 		struct MES_LOG_QUEUE_UNWAIT_SYNC_OBJECT queue_unwait_sync_object;
1841bb76ff1Sjsg 		struct MES_LOG_QUEUE_NO_MORE_WORK       queue_no_more_work;
1851bb76ff1Sjsg 		struct MES_LOG_QUEUE_WAIT_SYNC_OBJECT   queue_wait_sync_object;
1861bb76ff1Sjsg 		uint64_t                                all[2];
1871bb76ff1Sjsg 	};
1881bb76ff1Sjsg };
1891bb76ff1Sjsg 
1901bb76ff1Sjsg struct MES_LOG_BUFFER {
1911bb76ff1Sjsg 	struct MES_LOG_ENTRY_HEADER	header;
1921bb76ff1Sjsg 	struct MES_LOG_ENTRY_DATA	entries[1];
1931bb76ff1Sjsg };
1941bb76ff1Sjsg 
1951bb76ff1Sjsg enum MES_SWIP_TO_HWIP_DEF {
1961bb76ff1Sjsg 	MES_MAX_HWIP_SEGMENT = 8,
1971bb76ff1Sjsg };
1981bb76ff1Sjsg 
1991bb76ff1Sjsg union MESAPI_SET_HW_RESOURCES {
2001bb76ff1Sjsg 	struct {
2011bb76ff1Sjsg 		union MES_API_HEADER	header;
2021bb76ff1Sjsg 		uint32_t		vmid_mask_mmhub;
2031bb76ff1Sjsg 		uint32_t		vmid_mask_gfxhub;
2041bb76ff1Sjsg 		uint32_t		gds_size;
2051bb76ff1Sjsg 		uint32_t		paging_vmid;
2061bb76ff1Sjsg 		uint32_t		compute_hqd_mask[MAX_COMPUTE_PIPES];
2071bb76ff1Sjsg 		uint32_t		gfx_hqd_mask[MAX_GFX_PIPES];
2081bb76ff1Sjsg 		uint32_t		sdma_hqd_mask[MAX_SDMA_PIPES];
2091bb76ff1Sjsg 		uint32_t		aggregated_doorbells[AMD_PRIORITY_NUM_LEVELS];
2101bb76ff1Sjsg 		uint64_t		g_sch_ctx_gpu_mc_ptr;
2111bb76ff1Sjsg 		uint64_t		query_status_fence_gpu_mc_ptr;
2121bb76ff1Sjsg 		uint32_t		gc_base[MES_MAX_HWIP_SEGMENT];
2131bb76ff1Sjsg 		uint32_t		mmhub_base[MES_MAX_HWIP_SEGMENT];
2141bb76ff1Sjsg 		uint32_t		osssys_base[MES_MAX_HWIP_SEGMENT];
2151bb76ff1Sjsg 		struct MES_API_STATUS	api_status;
2161bb76ff1Sjsg 		union {
2171bb76ff1Sjsg 			struct {
2181bb76ff1Sjsg 				uint32_t disable_reset	: 1;
2191bb76ff1Sjsg 				uint32_t use_different_vmid_compute : 1;
2201bb76ff1Sjsg 				uint32_t disable_mes_log   : 1;
2211bb76ff1Sjsg 				uint32_t apply_mmhub_pgvm_invalidate_ack_loss_wa : 1;
2221bb76ff1Sjsg 				uint32_t apply_grbm_remote_register_dummy_read_wa : 1;
2231bb76ff1Sjsg 				uint32_t second_gfx_pipe_enabled : 1;
2241bb76ff1Sjsg 				uint32_t enable_level_process_quantum_check : 1;
2252f62d8f7Sjsg 				uint32_t legacy_sch_mode : 1;
2262f62d8f7Sjsg 				uint32_t disable_add_queue_wptr_mc_addr : 1;
2272f62d8f7Sjsg 				uint32_t enable_mes_event_int_logging : 1;
2282f62d8f7Sjsg 				uint32_t enable_reg_active_poll : 1;
2292f62d8f7Sjsg 				uint32_t reserved	: 21;
2301bb76ff1Sjsg 			};
2311bb76ff1Sjsg 			uint32_t	uint32_t_all;
2321bb76ff1Sjsg 		};
2331bb76ff1Sjsg 		uint32_t	oversubscription_timer;
2341bb76ff1Sjsg 		uint64_t        doorbell_info;
2351bb76ff1Sjsg 	};
2361bb76ff1Sjsg 
2371bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
2381bb76ff1Sjsg };
2391bb76ff1Sjsg 
2401bb76ff1Sjsg union MESAPI__ADD_QUEUE {
2411bb76ff1Sjsg 	struct {
2421bb76ff1Sjsg 		union MES_API_HEADER		header;
2431bb76ff1Sjsg 		uint32_t			process_id;
2441bb76ff1Sjsg 		uint64_t			page_table_base_addr;
2451bb76ff1Sjsg 		uint64_t			process_va_start;
2461bb76ff1Sjsg 		uint64_t			process_va_end;
2471bb76ff1Sjsg 		uint64_t			process_quantum;
2481bb76ff1Sjsg 		uint64_t			process_context_addr;
2491bb76ff1Sjsg 		uint64_t			gang_quantum;
2501bb76ff1Sjsg 		uint64_t			gang_context_addr;
2511bb76ff1Sjsg 		uint32_t			inprocess_gang_priority;
2521bb76ff1Sjsg 		enum MES_AMD_PRIORITY_LEVEL	gang_global_priority_level;
2531bb76ff1Sjsg 		uint32_t			doorbell_offset;
2541bb76ff1Sjsg 		uint64_t			mqd_addr;
2551bb76ff1Sjsg 		uint64_t			wptr_addr;
2561bb76ff1Sjsg 		uint64_t                        h_context;
2571bb76ff1Sjsg 		uint64_t                        h_queue;
2581bb76ff1Sjsg 		enum MES_QUEUE_TYPE		queue_type;
2591bb76ff1Sjsg 		uint32_t			gds_base;
2601bb76ff1Sjsg 		uint32_t			gds_size;
2611bb76ff1Sjsg 		uint32_t			gws_base;
2621bb76ff1Sjsg 		uint32_t			gws_size;
2631bb76ff1Sjsg 		uint32_t			oa_mask;
2641bb76ff1Sjsg 		uint64_t                        trap_handler_addr;
2651bb76ff1Sjsg 		uint32_t                        vm_context_cntl;
2661bb76ff1Sjsg 
2671bb76ff1Sjsg 		struct {
2681bb76ff1Sjsg 			uint32_t paging			: 1;
2691bb76ff1Sjsg 			uint32_t debug_vmid		: 4;
2701bb76ff1Sjsg 			uint32_t program_gds		: 1;
2711bb76ff1Sjsg 			uint32_t is_gang_suspended	: 1;
2721bb76ff1Sjsg 			uint32_t is_tmz_queue		: 1;
2731bb76ff1Sjsg 			uint32_t map_kiq_utility_queue  : 1;
2741bb76ff1Sjsg 			uint32_t is_kfd_process		: 1;
2751bb76ff1Sjsg 			uint32_t trap_en		: 1;
2761bb76ff1Sjsg 			uint32_t is_aql_queue		: 1;
277f005ef32Sjsg 			uint32_t skip_process_ctx_clear : 1;
278f005ef32Sjsg 			uint32_t map_legacy_kq		: 1;
279f005ef32Sjsg 			uint32_t exclusively_scheduled	: 1;
280f005ef32Sjsg 			uint32_t reserved		: 17;
2811bb76ff1Sjsg 		};
2821bb76ff1Sjsg 		struct MES_API_STATUS		api_status;
2831bb76ff1Sjsg 		uint64_t                        tma_addr;
2841bb76ff1Sjsg 	};
2851bb76ff1Sjsg 
2861bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
2871bb76ff1Sjsg };
2881bb76ff1Sjsg 
2891bb76ff1Sjsg union MESAPI__REMOVE_QUEUE {
2901bb76ff1Sjsg 	struct {
2911bb76ff1Sjsg 		union MES_API_HEADER	header;
2921bb76ff1Sjsg 		uint32_t		doorbell_offset;
2931bb76ff1Sjsg 		uint64_t		gang_context_addr;
2941bb76ff1Sjsg 
2951bb76ff1Sjsg 		struct {
2961bb76ff1Sjsg 			uint32_t unmap_legacy_gfx_queue   : 1;
2971bb76ff1Sjsg 			uint32_t unmap_kiq_utility_queue  : 1;
2981bb76ff1Sjsg 			uint32_t preempt_legacy_gfx_queue : 1;
2991bb76ff1Sjsg 			uint32_t unmap_legacy_queue       : 1;
3001bb76ff1Sjsg 			uint32_t reserved                 : 28;
3011bb76ff1Sjsg 		};
3021bb76ff1Sjsg 		struct MES_API_STATUS	    api_status;
3031bb76ff1Sjsg 
3041bb76ff1Sjsg 		uint32_t                    pipe_id;
3051bb76ff1Sjsg 		uint32_t                    queue_id;
3061bb76ff1Sjsg 
3071bb76ff1Sjsg 		uint64_t                    tf_addr;
3081bb76ff1Sjsg 		uint32_t                    tf_data;
3091bb76ff1Sjsg 
3101bb76ff1Sjsg 		enum MES_QUEUE_TYPE         queue_type;
3111bb76ff1Sjsg 	};
3121bb76ff1Sjsg 
3131bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
3141bb76ff1Sjsg };
3151bb76ff1Sjsg 
3161bb76ff1Sjsg union MESAPI__SET_SCHEDULING_CONFIG {
3171bb76ff1Sjsg 	struct {
3181bb76ff1Sjsg 		union MES_API_HEADER	header;
3191bb76ff1Sjsg 		/* Grace period when preempting another priority band for this
3201bb76ff1Sjsg 		 * priority band. The value for idle priority band is ignored,
3211bb76ff1Sjsg 		 * as it never preempts other bands.
3221bb76ff1Sjsg 		 */
3231bb76ff1Sjsg 		uint64_t		grace_period_other_levels[AMD_PRIORITY_NUM_LEVELS];
3241bb76ff1Sjsg 		/* Default quantum for scheduling across processes within
3251bb76ff1Sjsg 		 * a priority band.
3261bb76ff1Sjsg 		 */
3271bb76ff1Sjsg 		uint64_t		process_quantum_for_level[AMD_PRIORITY_NUM_LEVELS];
3281bb76ff1Sjsg 		/* Default grace period for processes that preempt each other
3291bb76ff1Sjsg 		 * within a priority band.
3301bb76ff1Sjsg 		 */
3311bb76ff1Sjsg 		uint64_t		process_grace_period_same_level[AMD_PRIORITY_NUM_LEVELS];
3321bb76ff1Sjsg 		/* For normal level this field specifies the target GPU
3331bb76ff1Sjsg 		 * percentage in situations when it's starved by the high level.
3341bb76ff1Sjsg 		 * Valid values are between 0 and 50, with the default being 10.
3351bb76ff1Sjsg 		 */
3361bb76ff1Sjsg 		uint32_t		normal_yield_percent;
3371bb76ff1Sjsg 		struct MES_API_STATUS	api_status;
3381bb76ff1Sjsg 	};
3391bb76ff1Sjsg 
3401bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
3411bb76ff1Sjsg };
3421bb76ff1Sjsg 
3431bb76ff1Sjsg union MESAPI__PERFORM_YIELD {
3441bb76ff1Sjsg 	struct {
3451bb76ff1Sjsg 		union MES_API_HEADER	header;
3461bb76ff1Sjsg 		uint32_t		dummy;
3471bb76ff1Sjsg 		struct MES_API_STATUS	api_status;
3481bb76ff1Sjsg 	};
3491bb76ff1Sjsg 
3501bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
3511bb76ff1Sjsg };
3521bb76ff1Sjsg 
3531bb76ff1Sjsg union MESAPI__CHANGE_GANG_PRIORITY_LEVEL {
3541bb76ff1Sjsg 	struct {
3551bb76ff1Sjsg 		union MES_API_HEADER		header;
3561bb76ff1Sjsg 		uint32_t			inprocess_gang_priority;
3571bb76ff1Sjsg 		enum MES_AMD_PRIORITY_LEVEL	gang_global_priority_level;
3581bb76ff1Sjsg 		uint64_t			gang_quantum;
3591bb76ff1Sjsg 		uint64_t			gang_context_addr;
3601bb76ff1Sjsg 		struct MES_API_STATUS		api_status;
3611bb76ff1Sjsg 	};
3621bb76ff1Sjsg 
3631bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
3641bb76ff1Sjsg };
3651bb76ff1Sjsg 
3661bb76ff1Sjsg union MESAPI__SUSPEND {
3671bb76ff1Sjsg 	struct {
3681bb76ff1Sjsg 		union MES_API_HEADER	header;
3691bb76ff1Sjsg 		/* false - suspend all gangs; true - specific gang */
3701bb76ff1Sjsg 		struct {
3711bb76ff1Sjsg 			uint32_t suspend_all_gangs	: 1;
3721bb76ff1Sjsg 			uint32_t reserved		: 31;
3731bb76ff1Sjsg 		};
3741bb76ff1Sjsg 		/* gang_context_addr is valid only if suspend_all = false */
3751bb76ff1Sjsg 		uint64_t		gang_context_addr;
3761bb76ff1Sjsg 
3771bb76ff1Sjsg 		uint64_t		suspend_fence_addr;
3781bb76ff1Sjsg 		uint32_t		suspend_fence_value;
3791bb76ff1Sjsg 
3801bb76ff1Sjsg 		struct MES_API_STATUS	api_status;
3811bb76ff1Sjsg 	};
3821bb76ff1Sjsg 
3831bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
3841bb76ff1Sjsg };
3851bb76ff1Sjsg 
3861bb76ff1Sjsg union MESAPI__RESUME {
3871bb76ff1Sjsg 	struct {
3881bb76ff1Sjsg 		union MES_API_HEADER	header;
3891bb76ff1Sjsg 		/* false - resume all gangs; true - specified gang */
3901bb76ff1Sjsg 		struct {
3911bb76ff1Sjsg 			uint32_t resume_all_gangs	: 1;
3921bb76ff1Sjsg 			uint32_t reserved		: 31;
3931bb76ff1Sjsg 		};
3941bb76ff1Sjsg 		/* valid only if resume_all_gangs = false */
3951bb76ff1Sjsg 		uint64_t		gang_context_addr;
3961bb76ff1Sjsg 
3971bb76ff1Sjsg 		struct MES_API_STATUS	api_status;
3981bb76ff1Sjsg 	};
3991bb76ff1Sjsg 
4001bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
4011bb76ff1Sjsg };
4021bb76ff1Sjsg 
4031bb76ff1Sjsg union MESAPI__RESET {
4041bb76ff1Sjsg 	struct {
4051bb76ff1Sjsg 		union MES_API_HEADER		header;
4061bb76ff1Sjsg 
4071bb76ff1Sjsg 		struct {
4081bb76ff1Sjsg 			/* Only reset the queue given by doorbell_offset (not entire gang) */
4091bb76ff1Sjsg 			uint32_t                reset_queue_only : 1;
4101bb76ff1Sjsg 			/* Hang detection first then reset any queues that are hung */
4111bb76ff1Sjsg 			uint32_t                hang_detect_then_reset : 1;
4121bb76ff1Sjsg 			/* Only do hang detection (no reset) */
4131bb76ff1Sjsg 			uint32_t                hang_detect_only : 1;
4141bb76ff1Sjsg 			/* Rest HP and LP kernel queues not managed by MES */
4151bb76ff1Sjsg 			uint32_t                reset_legacy_gfx : 1;
4161bb76ff1Sjsg 			uint32_t                reserved : 28;
4171bb76ff1Sjsg 		};
4181bb76ff1Sjsg 
4191bb76ff1Sjsg 		uint64_t			gang_context_addr;
4201bb76ff1Sjsg 
4211bb76ff1Sjsg 		/* valid only if reset_queue_only = true */
4221bb76ff1Sjsg 		uint32_t			doorbell_offset;
4231bb76ff1Sjsg 
4241bb76ff1Sjsg 		/* valid only if hang_detect_then_reset = true */
4251bb76ff1Sjsg 		uint64_t			doorbell_offset_addr;
4261bb76ff1Sjsg 		enum MES_QUEUE_TYPE		queue_type;
4271bb76ff1Sjsg 
4281bb76ff1Sjsg 		/* valid only if reset_legacy_gfx = true */
4291bb76ff1Sjsg 		uint32_t			pipe_id_lp;
4301bb76ff1Sjsg 		uint32_t			queue_id_lp;
4311bb76ff1Sjsg 		uint32_t			vmid_id_lp;
4321bb76ff1Sjsg 		uint64_t			mqd_mc_addr_lp;
4331bb76ff1Sjsg 		uint32_t			doorbell_offset_lp;
4341bb76ff1Sjsg 		uint64_t			wptr_addr_lp;
4351bb76ff1Sjsg 
4361bb76ff1Sjsg 		uint32_t			pipe_id_hp;
4371bb76ff1Sjsg 		uint32_t			queue_id_hp;
4381bb76ff1Sjsg 		uint32_t			vmid_id_hp;
4391bb76ff1Sjsg 		uint64_t			mqd_mc_addr_hp;
4401bb76ff1Sjsg 		uint32_t			doorbell_offset_hp;
4411bb76ff1Sjsg 		uint64_t			wptr_addr_hp;
4421bb76ff1Sjsg 
4431bb76ff1Sjsg 		struct MES_API_STATUS		api_status;
4441bb76ff1Sjsg 	};
4451bb76ff1Sjsg 
4461bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
4471bb76ff1Sjsg };
4481bb76ff1Sjsg 
4491bb76ff1Sjsg union MESAPI__SET_LOGGING_BUFFER {
4501bb76ff1Sjsg 	struct {
4511bb76ff1Sjsg 		union MES_API_HEADER	header;
4521bb76ff1Sjsg 		/* There are separate log buffers for each queue type */
4531bb76ff1Sjsg 		enum MES_QUEUE_TYPE	log_type;
4541bb76ff1Sjsg 		/* Log buffer GPU Address */
4551bb76ff1Sjsg 		uint64_t		logging_buffer_addr;
4561bb76ff1Sjsg 		/* number of entries in the log buffer */
4571bb76ff1Sjsg 		uint32_t		number_of_entries;
4581bb76ff1Sjsg 		/* Entry index at which CPU interrupt needs to be signalled */
4591bb76ff1Sjsg 		uint32_t		interrupt_entry;
4601bb76ff1Sjsg 
4611bb76ff1Sjsg 		struct MES_API_STATUS	api_status;
4621bb76ff1Sjsg 	};
4631bb76ff1Sjsg 
4641bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
4651bb76ff1Sjsg };
4661bb76ff1Sjsg 
4671bb76ff1Sjsg union MESAPI__QUERY_MES_STATUS {
4681bb76ff1Sjsg 	struct {
4691bb76ff1Sjsg 		union MES_API_HEADER	header;
4701bb76ff1Sjsg 		bool			mes_healthy; /* 0 - not healthy, 1 - healthy */
4711bb76ff1Sjsg 		struct MES_API_STATUS	api_status;
4721bb76ff1Sjsg 	};
4731bb76ff1Sjsg 
4741bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
4751bb76ff1Sjsg };
4761bb76ff1Sjsg 
4771bb76ff1Sjsg union MESAPI__PROGRAM_GDS {
4781bb76ff1Sjsg 	struct {
4791bb76ff1Sjsg 		union MES_API_HEADER	header;
4801bb76ff1Sjsg 		uint64_t		process_context_addr;
4811bb76ff1Sjsg 		uint32_t		gds_base;
4821bb76ff1Sjsg 		uint32_t		gds_size;
4831bb76ff1Sjsg 		uint32_t		gws_base;
4841bb76ff1Sjsg 		uint32_t		gws_size;
4851bb76ff1Sjsg 		uint32_t		oa_mask;
4861bb76ff1Sjsg 		struct MES_API_STATUS	api_status;
4871bb76ff1Sjsg 	};
4881bb76ff1Sjsg 
4891bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
4901bb76ff1Sjsg };
4911bb76ff1Sjsg 
4921bb76ff1Sjsg union MESAPI__SET_DEBUG_VMID {
4931bb76ff1Sjsg 	struct {
4941bb76ff1Sjsg 		union MES_API_HEADER	header;
4951bb76ff1Sjsg 		struct MES_API_STATUS	api_status;
4961bb76ff1Sjsg 		union {
4971bb76ff1Sjsg 			struct {
4981bb76ff1Sjsg 				uint32_t use_gds	: 1;
4991bb76ff1Sjsg 				uint32_t operation      : 2;
5001bb76ff1Sjsg 				uint32_t reserved       : 29;
5011bb76ff1Sjsg 			} flags;
5021bb76ff1Sjsg 			uint32_t	u32All;
5031bb76ff1Sjsg 		};
5041bb76ff1Sjsg 		uint32_t		reserved;
5051bb76ff1Sjsg 		uint32_t		debug_vmid;
5061bb76ff1Sjsg 		uint64_t		process_context_addr;
5071bb76ff1Sjsg 		uint64_t		page_table_base_addr;
5081bb76ff1Sjsg 		uint64_t		process_va_start;
5091bb76ff1Sjsg 		uint64_t		process_va_end;
5101bb76ff1Sjsg 		uint32_t		gds_base;
5111bb76ff1Sjsg 		uint32_t		gds_size;
5121bb76ff1Sjsg 		uint32_t		gws_base;
5131bb76ff1Sjsg 		uint32_t		gws_size;
5141bb76ff1Sjsg 		uint32_t		oa_mask;
5151bb76ff1Sjsg 
5161bb76ff1Sjsg 		/* output addr of the acquired vmid value */
5171bb76ff1Sjsg 		uint64_t                output_addr;
5181bb76ff1Sjsg 	};
5191bb76ff1Sjsg 
5201bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
5211bb76ff1Sjsg };
5221bb76ff1Sjsg 
5231bb76ff1Sjsg enum MESAPI_MISC_OPCODE {
5241bb76ff1Sjsg 	MESAPI_MISC__WRITE_REG,
5251bb76ff1Sjsg 	MESAPI_MISC__INV_GART,
5261bb76ff1Sjsg 	MESAPI_MISC__QUERY_STATUS,
5271bb76ff1Sjsg 	MESAPI_MISC__READ_REG,
5281bb76ff1Sjsg 	MESAPI_MISC__WAIT_REG_MEM,
529f005ef32Sjsg 	MESAPI_MISC__SET_SHADER_DEBUGGER,
5301bb76ff1Sjsg 	MESAPI_MISC__MAX,
5311bb76ff1Sjsg };
5321bb76ff1Sjsg 
5331bb76ff1Sjsg enum { MISC_DATA_MAX_SIZE_IN_DWORDS = 20 };
5341bb76ff1Sjsg 
5351bb76ff1Sjsg struct WRITE_REG {
5361bb76ff1Sjsg 	uint32_t                  reg_offset;
5371bb76ff1Sjsg 	uint32_t                  reg_value;
5381bb76ff1Sjsg };
5391bb76ff1Sjsg 
5401bb76ff1Sjsg struct READ_REG {
5411bb76ff1Sjsg 	uint32_t                  reg_offset;
5421bb76ff1Sjsg 	uint64_t                  buffer_addr;
5431bb76ff1Sjsg };
5441bb76ff1Sjsg 
5451bb76ff1Sjsg enum WRM_OPERATION {
5461bb76ff1Sjsg 	WRM_OPERATION__WAIT_REG_MEM,
5471bb76ff1Sjsg 	WRM_OPERATION__WR_WAIT_WR_REG,
5481bb76ff1Sjsg 	WRM_OPERATION__MAX,
5491bb76ff1Sjsg };
5501bb76ff1Sjsg 
5511bb76ff1Sjsg struct WAIT_REG_MEM {
5521bb76ff1Sjsg 	enum WRM_OPERATION         op;
5531bb76ff1Sjsg 	uint32_t                   reference;
5541bb76ff1Sjsg 	uint32_t                   mask;
5551bb76ff1Sjsg 	uint32_t                   reg_offset1;
5561bb76ff1Sjsg 	uint32_t                   reg_offset2;
5571bb76ff1Sjsg };
5581bb76ff1Sjsg 
5591bb76ff1Sjsg struct INV_GART {
5601bb76ff1Sjsg 	uint64_t                  inv_range_va_start;
5611bb76ff1Sjsg 	uint64_t                  inv_range_size;
5621bb76ff1Sjsg };
5631bb76ff1Sjsg 
5641bb76ff1Sjsg struct QUERY_STATUS {
5651bb76ff1Sjsg 	uint32_t context_id;
5661bb76ff1Sjsg };
5671bb76ff1Sjsg 
568f005ef32Sjsg struct SET_SHADER_DEBUGGER {
569f005ef32Sjsg 	uint64_t process_context_addr;
570f005ef32Sjsg 	union {
571f005ef32Sjsg 		struct {
572f005ef32Sjsg 			uint32_t single_memop : 1;  /* SQ_DEBUG.single_memop */
573f005ef32Sjsg 			uint32_t single_alu_op : 1; /* SQ_DEBUG.single_alu_op */
574*f074e99dSjsg 			uint32_t reserved : 29;
575*f074e99dSjsg 			uint32_t process_ctx_flush : 1;
576f005ef32Sjsg 		};
577f005ef32Sjsg 		uint32_t u32all;
578f005ef32Sjsg 	} flags;
579f005ef32Sjsg 	uint32_t spi_gdbg_per_vmid_cntl;
580f005ef32Sjsg 	uint32_t tcp_watch_cntl[4]; /* TCP_WATCHx_CNTL */
581f005ef32Sjsg 	uint32_t trap_en;
582f005ef32Sjsg };
583f005ef32Sjsg 
5841bb76ff1Sjsg union MESAPI__MISC {
5851bb76ff1Sjsg 	struct {
5861bb76ff1Sjsg 		union MES_API_HEADER	header;
5871bb76ff1Sjsg 		enum MESAPI_MISC_OPCODE	opcode;
5881bb76ff1Sjsg 		struct MES_API_STATUS	api_status;
5891bb76ff1Sjsg 
5901bb76ff1Sjsg 		union {
5911bb76ff1Sjsg 			struct		WRITE_REG write_reg;
5921bb76ff1Sjsg 			struct		INV_GART inv_gart;
5931bb76ff1Sjsg 			struct		QUERY_STATUS query_status;
5941bb76ff1Sjsg 			struct		READ_REG read_reg;
5951bb76ff1Sjsg 			struct          WAIT_REG_MEM wait_reg_mem;
596f005ef32Sjsg 			struct		SET_SHADER_DEBUGGER set_shader_debugger;
597f005ef32Sjsg 			enum MES_AMD_PRIORITY_LEVEL queue_sch_level;
598f005ef32Sjsg 
5991bb76ff1Sjsg 			uint32_t	data[MISC_DATA_MAX_SIZE_IN_DWORDS];
6001bb76ff1Sjsg 		};
6011bb76ff1Sjsg 	};
6021bb76ff1Sjsg 
6031bb76ff1Sjsg 	uint32_t	max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
6041bb76ff1Sjsg };
6051bb76ff1Sjsg 
6061bb76ff1Sjsg union MESAPI__UPDATE_ROOT_PAGE_TABLE {
6071bb76ff1Sjsg 	struct {
6081bb76ff1Sjsg 		union MES_API_HEADER        header;
6091bb76ff1Sjsg 		uint64_t                    page_table_base_addr;
6101bb76ff1Sjsg 		uint64_t                    process_context_addr;
6111bb76ff1Sjsg 		struct MES_API_STATUS       api_status;
6121bb76ff1Sjsg 	};
6131bb76ff1Sjsg 
6141bb76ff1Sjsg 	uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
6151bb76ff1Sjsg };
6161bb76ff1Sjsg 
6171bb76ff1Sjsg union MESAPI_AMD_LOG {
6181bb76ff1Sjsg 	struct {
6191bb76ff1Sjsg 		union MES_API_HEADER        header;
6201bb76ff1Sjsg 		uint64_t                    p_buffer_memory;
6211bb76ff1Sjsg 		uint64_t                    p_buffer_size_used;
6221bb76ff1Sjsg 		struct MES_API_STATUS       api_status;
6231bb76ff1Sjsg 	};
6241bb76ff1Sjsg 
6251bb76ff1Sjsg 	uint32_t max_dwords_in_api[API_FRAME_SIZE_IN_DWORDS];
6261bb76ff1Sjsg };
6271bb76ff1Sjsg 
6281bb76ff1Sjsg #pragma pack(pop)
6291bb76ff1Sjsg #endif
630