xref: /netbsd-src/sys/external/bsd/drm2/dist/drm/amd/amdkfd/kfd_pm4_headers_vi.h (revision 41ec02673d281bbb3d38e6c78504ce6e30c228c1)
1 /*	$NetBSD: kfd_pm4_headers_vi.h,v 1.3 2021/12/18 23:44:59 riastradh Exp $	*/
2 
3 /*
4  * Copyright 2014 Advanced Micro Devices, Inc.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22  * OTHER DEALINGS IN THE SOFTWARE.
23  *
24  */
25 
26 #ifndef F32_MES_PM4_PACKETS_H
27 #define F32_MES_PM4_PACKETS_H
28 
29 #ifndef PM4_MES_HEADER_DEFINED
30 #define PM4_MES_HEADER_DEFINED
31 union PM4_MES_TYPE_3_HEADER {
32 	struct {
33 		uint32_t reserved1 : 8; /* < reserved */
34 		uint32_t opcode    : 8; /* < IT opcode */
35 		uint32_t count     : 14;/* < Number of DWORDS - 1 in the
36 					 *   information body
37 					 */
38 		uint32_t type      : 2; /* < packet identifier
39 					 *   It should be 3 for type 3 packets
40 					 */
41 	};
42 	uint32_t u32All;
43 };
44 #endif /* PM4_MES_HEADER_DEFINED */
45 
46 /*--------------------MES_SET_RESOURCES--------------------*/
47 
48 #ifndef PM4_MES_SET_RESOURCES_DEFINED
49 #define PM4_MES_SET_RESOURCES_DEFINED
50 enum mes_set_resources_queue_type_enum {
51 	queue_type__mes_set_resources__kernel_interface_queue_kiq = 0,
52 	queue_type__mes_set_resources__hsa_interface_queue_hiq = 1,
53 	queue_type__mes_set_resources__hsa_debug_interface_queue = 4
54 };
55 
56 
57 struct pm4_mes_set_resources {
58 	union {
59 		union PM4_MES_TYPE_3_HEADER	header;		/* header */
60 		uint32_t			ordinal1;
61 	};
62 
63 	union {
64 		struct {
65 			uint32_t vmid_mask:16;
66 			uint32_t unmap_latency:8;
67 			uint32_t reserved1:5;
68 			enum mes_set_resources_queue_type_enum queue_type:3;
69 		} bitfields2;
70 		uint32_t ordinal2;
71 	};
72 
73 	uint32_t queue_mask_lo;
74 	uint32_t queue_mask_hi;
75 	uint32_t gws_mask_lo;
76 	uint32_t gws_mask_hi;
77 
78 	union {
79 		struct {
80 			uint32_t oac_mask:16;
81 			uint32_t reserved2:16;
82 		} bitfields7;
83 		uint32_t ordinal7;
84 	};
85 
86 	union {
87 		struct {
88 		uint32_t gds_heap_base:6;
89 		uint32_t reserved3:5;
90 		uint32_t gds_heap_size:6;
91 		uint32_t reserved4:15;
92 		} bitfields8;
93 		uint32_t ordinal8;
94 	};
95 
96 };
97 #endif
98 
99 /*--------------------MES_RUN_LIST--------------------*/
100 
101 #ifndef PM4_MES_RUN_LIST_DEFINED
102 #define PM4_MES_RUN_LIST_DEFINED
103 
104 struct pm4_mes_runlist {
105 	union {
106 	    union PM4_MES_TYPE_3_HEADER   header;            /* header */
107 	    uint32_t            ordinal1;
108 	};
109 
110 	union {
111 		struct {
112 			uint32_t reserved1:2;
113 			uint32_t ib_base_lo:30;
114 		} bitfields2;
115 		uint32_t ordinal2;
116 	};
117 
118 	union {
119 		struct {
120 			uint32_t ib_base_hi:16;
121 			uint32_t reserved2:16;
122 		} bitfields3;
123 		uint32_t ordinal3;
124 	};
125 
126 	union {
127 		struct {
128 			uint32_t ib_size:20;
129 			uint32_t chain:1;
130 			uint32_t offload_polling:1;
131 			uint32_t reserved2:1;
132 			uint32_t valid:1;
133 			uint32_t process_cnt:4;
134 			uint32_t reserved3:4;
135 		} bitfields4;
136 		uint32_t ordinal4;
137 	};
138 
139 };
140 #endif
141 
142 /*--------------------MES_MAP_PROCESS--------------------*/
143 
144 #ifndef PM4_MES_MAP_PROCESS_DEFINED
145 #define PM4_MES_MAP_PROCESS_DEFINED
146 
147 struct pm4_mes_map_process {
148 	union {
149 		union PM4_MES_TYPE_3_HEADER header;	/* header */
150 		uint32_t ordinal1;
151 	};
152 
153 	union {
154 		struct {
155 			uint32_t pasid:16;
156 			uint32_t reserved1:8;
157 			uint32_t diq_enable:1;
158 			uint32_t process_quantum:7;
159 		} bitfields2;
160 		uint32_t ordinal2;
161 	};
162 
163 	union {
164 		struct {
165 			uint32_t page_table_base:28;
166 			uint32_t reserved3:4;
167 		} bitfields3;
168 		uint32_t ordinal3;
169 	};
170 
171 	uint32_t reserved;
172 
173 	uint32_t sh_mem_bases;
174 	uint32_t sh_mem_config;
175 	uint32_t sh_mem_ape1_base;
176 	uint32_t sh_mem_ape1_limit;
177 
178 	uint32_t sh_hidden_private_base_vmid;
179 
180 	uint32_t reserved2;
181 	uint32_t reserved3;
182 
183 	uint32_t gds_addr_lo;
184 	uint32_t gds_addr_hi;
185 
186 	union {
187 		struct {
188 			uint32_t num_gws:6;
189 			uint32_t reserved4:2;
190 			uint32_t num_oac:4;
191 			uint32_t reserved5:4;
192 			uint32_t gds_size:6;
193 			uint32_t num_queues:10;
194 		} bitfields10;
195 		uint32_t ordinal10;
196 	};
197 
198 	uint32_t completion_signal_lo;
199 	uint32_t completion_signal_hi;
200 
201 };
202 
203 #endif
204 
205 /*--------------------MES_MAP_QUEUES--------------------*/
206 
207 #ifndef PM4_MES_MAP_QUEUES_VI_DEFINED
208 #define PM4_MES_MAP_QUEUES_VI_DEFINED
209 enum mes_map_queues_queue_sel_vi_enum {
210 	queue_sel__mes_map_queues__map_to_specified_queue_slots_vi = 0,
211 queue_sel__mes_map_queues__map_to_hws_determined_queue_slots_vi = 1
212 };
213 
214 enum mes_map_queues_queue_type_vi_enum {
215 	queue_type__mes_map_queues__normal_compute_vi = 0,
216 	queue_type__mes_map_queues__debug_interface_queue_vi = 1,
217 	queue_type__mes_map_queues__normal_latency_static_queue_vi = 2,
218 queue_type__mes_map_queues__low_latency_static_queue_vi = 3
219 };
220 
221 enum mes_map_queues_engine_sel_vi_enum {
222 	engine_sel__mes_map_queues__compute_vi = 0,
223 	engine_sel__mes_map_queues__sdma0_vi = 2,
224 	engine_sel__mes_map_queues__sdma1_vi = 3
225 };
226 
227 
228 struct pm4_mes_map_queues {
229 	union {
230 		union PM4_MES_TYPE_3_HEADER   header;            /* header */
231 		uint32_t            ordinal1;
232 	};
233 
234 	union {
235 		struct {
236 			uint32_t reserved1:4;
237 			enum mes_map_queues_queue_sel_vi_enum queue_sel:2;
238 			uint32_t reserved2:15;
239 			enum mes_map_queues_queue_type_vi_enum queue_type:3;
240 			uint32_t reserved3:2;
241 			enum mes_map_queues_engine_sel_vi_enum engine_sel:3;
242 			uint32_t num_queues:3;
243 		} bitfields2;
244 		uint32_t ordinal2;
245 	};
246 
247 	union {
248 		struct {
249 			uint32_t reserved3:1;
250 			uint32_t check_disable:1;
251 			uint32_t doorbell_offset:21;
252 			uint32_t reserved4:3;
253 			uint32_t queue:6;
254 		} bitfields3;
255 		uint32_t ordinal3;
256 	};
257 
258 	uint32_t mqd_addr_lo;
259 	uint32_t mqd_addr_hi;
260 	uint32_t wptr_addr_lo;
261 	uint32_t wptr_addr_hi;
262 };
263 #endif
264 
265 /*--------------------MES_QUERY_STATUS--------------------*/
266 
267 #ifndef PM4_MES_QUERY_STATUS_DEFINED
268 #define PM4_MES_QUERY_STATUS_DEFINED
269 enum mes_query_status_interrupt_sel_enum {
270 	interrupt_sel__mes_query_status__completion_status = 0,
271 	interrupt_sel__mes_query_status__process_status = 1,
272 	interrupt_sel__mes_query_status__queue_status = 2
273 };
274 
275 enum mes_query_status_command_enum {
276 	command__mes_query_status__interrupt_only = 0,
277 	command__mes_query_status__fence_only_immediate = 1,
278 	command__mes_query_status__fence_only_after_write_ack = 2,
279 	command__mes_query_status__fence_wait_for_write_ack_send_interrupt = 3
280 };
281 
282 enum mes_query_status_engine_sel_enum {
283 	engine_sel__mes_query_status__compute = 0,
284 	engine_sel__mes_query_status__sdma0_queue = 2,
285 	engine_sel__mes_query_status__sdma1_queue = 3
286 };
287 
288 struct pm4_mes_query_status {
289 	union {
290 		union PM4_MES_TYPE_3_HEADER   header;            /* header */
291 		uint32_t            ordinal1;
292 	};
293 
294 	union {
295 		struct {
296 			uint32_t context_id:28;
297 			enum mes_query_status_interrupt_sel_enum
298 				interrupt_sel:2;
299 			enum mes_query_status_command_enum command:2;
300 		} bitfields2;
301 		uint32_t ordinal2;
302 	};
303 
304 	union {
305 		struct {
306 			uint32_t pasid:16;
307 			uint32_t reserved1:16;
308 		} bitfields3a;
309 		struct {
310 			uint32_t reserved2:2;
311 			uint32_t doorbell_offset:21;
312 			uint32_t reserved3:2;
313 			enum mes_query_status_engine_sel_enum engine_sel:3;
314 			uint32_t reserved4:4;
315 		} bitfields3b;
316 		uint32_t ordinal3;
317 	};
318 
319 	uint32_t addr_lo;
320 	uint32_t addr_hi;
321 	uint32_t data_lo;
322 	uint32_t data_hi;
323 };
324 #endif
325 
326 /*--------------------MES_UNMAP_QUEUES--------------------*/
327 
328 #ifndef PM4_MES_UNMAP_QUEUES_DEFINED
329 #define PM4_MES_UNMAP_QUEUES_DEFINED
330 enum mes_unmap_queues_action_enum {
331 	action__mes_unmap_queues__preempt_queues = 0,
332 	action__mes_unmap_queues__reset_queues = 1,
333 	action__mes_unmap_queues__disable_process_queues = 2,
334 	action__mes_unmap_queues__reserved = 3
335 };
336 
337 enum mes_unmap_queues_queue_sel_enum {
338 	queue_sel__mes_unmap_queues__perform_request_on_specified_queues = 0,
339 	queue_sel__mes_unmap_queues__perform_request_on_pasid_queues = 1,
340 	queue_sel__mes_unmap_queues__unmap_all_queues = 2,
341 	queue_sel__mes_unmap_queues__unmap_all_non_static_queues = 3
342 };
343 
344 enum mes_unmap_queues_engine_sel_enum {
345 	engine_sel__mes_unmap_queues__compute = 0,
346 	engine_sel__mes_unmap_queues__sdma0 = 2,
347 	engine_sel__mes_unmap_queues__sdmal = 3
348 };
349 
350 struct pm4_mes_unmap_queues {
351 	union {
352 		union PM4_MES_TYPE_3_HEADER   header;            /* header */
353 		uint32_t            ordinal1;
354 	};
355 
356 	union {
357 		struct {
358 			enum mes_unmap_queues_action_enum action:2;
359 			uint32_t reserved1:2;
360 			enum mes_unmap_queues_queue_sel_enum queue_sel:2;
361 			uint32_t reserved2:20;
362 			enum mes_unmap_queues_engine_sel_enum engine_sel:3;
363 			uint32_t num_queues:3;
364 		} bitfields2;
365 		uint32_t ordinal2;
366 	};
367 
368 	union {
369 		struct {
370 			uint32_t pasid:16;
371 			uint32_t reserved3:16;
372 		} bitfields3a;
373 		struct {
374 			uint32_t reserved4:2;
375 			uint32_t doorbell_offset0:21;
376 			uint32_t reserved5:9;
377 		} bitfields3b;
378 		uint32_t ordinal3;
379 	};
380 
381 	union {
382 	struct {
383 			uint32_t reserved6:2;
384 			uint32_t doorbell_offset1:21;
385 			uint32_t reserved7:9;
386 		} bitfields4;
387 		uint32_t ordinal4;
388 	};
389 
390 	union {
391 		struct {
392 			uint32_t reserved8:2;
393 			uint32_t doorbell_offset2:21;
394 			uint32_t reserved9:9;
395 		} bitfields5;
396 		uint32_t ordinal5;
397 	};
398 
399 	union {
400 		struct {
401 			uint32_t reserved10:2;
402 			uint32_t doorbell_offset3:21;
403 			uint32_t reserved11:9;
404 		} bitfields6;
405 		uint32_t ordinal6;
406 	};
407 };
408 #endif
409 
410 #ifndef PM4_MEC_RELEASE_MEM_DEFINED
411 #define PM4_MEC_RELEASE_MEM_DEFINED
412 enum RELEASE_MEM_event_index_enum {
413 	event_index___release_mem__end_of_pipe = 5,
414 	event_index___release_mem__shader_done = 6
415 };
416 
417 enum RELEASE_MEM_cache_policy_enum {
418 	cache_policy___release_mem__lru = 0,
419 	cache_policy___release_mem__stream = 1,
420 	cache_policy___release_mem__bypass = 2
421 };
422 
423 enum RELEASE_MEM_dst_sel_enum {
424 	dst_sel___release_mem__memory_controller = 0,
425 	dst_sel___release_mem__tc_l2 = 1,
426 	dst_sel___release_mem__queue_write_pointer_register = 2,
427 	dst_sel___release_mem__queue_write_pointer_poll_mask_bit = 3
428 };
429 
430 enum RELEASE_MEM_int_sel_enum {
431 	int_sel___release_mem__none = 0,
432 	int_sel___release_mem__send_interrupt_only = 1,
433 	int_sel___release_mem__send_interrupt_after_write_confirm = 2,
434 	int_sel___release_mem__send_data_after_write_confirm = 3
435 };
436 
437 enum RELEASE_MEM_data_sel_enum {
438 	data_sel___release_mem__none = 0,
439 	data_sel___release_mem__send_32_bit_low = 1,
440 	data_sel___release_mem__send_64_bit_data = 2,
441 	data_sel___release_mem__send_gpu_clock_counter = 3,
442 	data_sel___release_mem__send_cp_perfcounter_hi_lo = 4,
443 	data_sel___release_mem__store_gds_data_to_memory = 5
444 };
445 
446 struct pm4_mec_release_mem {
447 	union {
448 		union PM4_MES_TYPE_3_HEADER header;     /*header */
449 		unsigned int ordinal1;
450 	};
451 
452 	union {
453 		struct {
454 			unsigned int event_type:6;
455 			unsigned int reserved1:2;
456 			enum RELEASE_MEM_event_index_enum event_index:4;
457 			unsigned int tcl1_vol_action_ena:1;
458 			unsigned int tc_vol_action_ena:1;
459 			unsigned int reserved2:1;
460 			unsigned int tc_wb_action_ena:1;
461 			unsigned int tcl1_action_ena:1;
462 			unsigned int tc_action_ena:1;
463 			unsigned int reserved3:6;
464 			unsigned int atc:1;
465 			enum RELEASE_MEM_cache_policy_enum cache_policy:2;
466 			unsigned int reserved4:5;
467 		} bitfields2;
468 		unsigned int ordinal2;
469 	};
470 
471 	union {
472 		struct {
473 			unsigned int reserved5:16;
474 			enum RELEASE_MEM_dst_sel_enum dst_sel:2;
475 			unsigned int reserved6:6;
476 			enum RELEASE_MEM_int_sel_enum int_sel:3;
477 			unsigned int reserved7:2;
478 			enum RELEASE_MEM_data_sel_enum data_sel:3;
479 		} bitfields3;
480 		unsigned int ordinal3;
481 	};
482 
483 	union {
484 		struct {
485 			unsigned int reserved8:2;
486 			unsigned int address_lo_32b:30;
487 		} bitfields4;
488 		struct {
489 			unsigned int reserved9:3;
490 			unsigned int address_lo_64b:29;
491 		} bitfields5;
492 		unsigned int ordinal4;
493 	};
494 
495 	unsigned int address_hi;
496 
497 	unsigned int data_lo;
498 
499 	unsigned int data_hi;
500 };
501 #endif
502 
503 enum {
504 	CACHE_FLUSH_AND_INV_TS_EVENT = 0x00000014
505 };
506 
507 #endif
508