xref: /linux/drivers/accel/amdxdna/aie2_msg_priv.h (revision e005fd94e2e5867f2a4e66e5df85069cda6f0db4)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2022-2024, Advanced Micro Devices, Inc.
4  */
5 
6 #ifndef _AIE2_MSG_PRIV_H_
7 #define _AIE2_MSG_PRIV_H_
8 
9 enum aie2_msg_opcode {
10 	MSG_OP_CREATE_CONTEXT              = 0x2,
11 	MSG_OP_DESTROY_CONTEXT             = 0x3,
12 	MSG_OP_GET_TELEMETRY               = 0x4,
13 	MSG_OP_SYNC_BO                     = 0x7,
14 	MSG_OP_EXECUTE_BUFFER_CF           = 0xC,
15 	MSG_OP_QUERY_COL_STATUS            = 0xD,
16 	MSG_OP_QUERY_AIE_TILE_INFO         = 0xE,
17 	MSG_OP_QUERY_AIE_VERSION           = 0xF,
18 	MSG_OP_EXEC_DPU                    = 0x10,
19 	MSG_OP_CONFIG_CU                   = 0x11,
20 	MSG_OP_CHAIN_EXEC_BUFFER_CF        = 0x12,
21 	MSG_OP_CHAIN_EXEC_DPU              = 0x13,
22 	MSG_OP_CONFIG_DEBUG_BO             = 0x14,
23 	MSG_OP_CHAIN_EXEC_NPU              = 0x18,
24 	MSG_OP_MAX_XRT_OPCODE,
25 	MSG_OP_SUSPEND                     = 0x101,
26 	MSG_OP_RESUME                      = 0x102,
27 	MSG_OP_ASSIGN_MGMT_PASID           = 0x103,
28 	MSG_OP_INVOKE_SELF_TEST            = 0x104,
29 	MSG_OP_MAP_HOST_BUFFER             = 0x106,
30 	MSG_OP_GET_FIRMWARE_VERSION        = 0x108,
31 	MSG_OP_SET_RUNTIME_CONFIG          = 0x10A,
32 	MSG_OP_GET_RUNTIME_CONFIG          = 0x10B,
33 	MSG_OP_REGISTER_ASYNC_EVENT_MSG    = 0x10C,
34 	MSG_OP_MAX_DRV_OPCODE,
35 	MSG_OP_GET_PROTOCOL_VERSION        = 0x301,
36 	MSG_OP_MAX_OPCODE
37 };
38 
39 enum aie2_msg_status {
40 	AIE2_STATUS_SUCCESS				= 0x0,
41 	/* AIE Error codes */
42 	AIE2_STATUS_AIE_SATURATION_ERROR		= 0x1000001,
43 	AIE2_STATUS_AIE_FP_ERROR			= 0x1000002,
44 	AIE2_STATUS_AIE_STREAM_ERROR			= 0x1000003,
45 	AIE2_STATUS_AIE_ACCESS_ERROR			= 0x1000004,
46 	AIE2_STATUS_AIE_BUS_ERROR			= 0x1000005,
47 	AIE2_STATUS_AIE_INSTRUCTION_ERROR		= 0x1000006,
48 	AIE2_STATUS_AIE_ECC_ERROR			= 0x1000007,
49 	AIE2_STATUS_AIE_LOCK_ERROR			= 0x1000008,
50 	AIE2_STATUS_AIE_DMA_ERROR			= 0x1000009,
51 	AIE2_STATUS_AIE_MEM_PARITY_ERROR		= 0x100000a,
52 	AIE2_STATUS_AIE_PWR_CFG_ERROR			= 0x100000b,
53 	AIE2_STATUS_AIE_BACKTRACK_ERROR			= 0x100000c,
54 	AIE2_STATUS_MAX_AIE_STATUS_CODE,
55 	/* MGMT ERT Error codes */
56 	AIE2_STATUS_MGMT_ERT_SELF_TEST_FAILURE		= 0x2000001,
57 	AIE2_STATUS_MGMT_ERT_HASH_MISMATCH,
58 	AIE2_STATUS_MGMT_ERT_NOAVAIL,
59 	AIE2_STATUS_MGMT_ERT_INVALID_PARAM,
60 	AIE2_STATUS_MGMT_ERT_ENTER_SUSPEND_FAILURE,
61 	AIE2_STATUS_MGMT_ERT_BUSY,
62 	AIE2_STATUS_MGMT_ERT_APPLICATION_ACTIVE,
63 	MAX_MGMT_ERT_STATUS_CODE,
64 	/* APP ERT Error codes */
65 	AIE2_STATUS_APP_ERT_FIRST_ERROR			= 0x3000001,
66 	AIE2_STATUS_APP_INVALID_INSTR,
67 	AIE2_STATUS_APP_LOAD_PDI_FAIL,
68 	MAX_APP_ERT_STATUS_CODE,
69 	/* NPU RTOS Error Codes */
70 	AIE2_STATUS_INVALID_INPUT_BUFFER		= 0x4000001,
71 	AIE2_STATUS_INVALID_COMMAND,
72 	AIE2_STATUS_INVALID_PARAM,
73 	AIE2_STATUS_INVALID_OPERATION			= 0x4000006,
74 	AIE2_STATUS_ASYNC_EVENT_MSGS_FULL,
75 	AIE2_STATUS_MAX_RTOS_STATUS_CODE,
76 	MAX_AIE2_STATUS_CODE
77 };
78 
79 struct assign_mgmt_pasid_req {
80 	__u16	pasid;
81 	__u16	reserved;
82 } __packed;
83 
84 struct assign_mgmt_pasid_resp {
85 	enum aie2_msg_status	status;
86 } __packed;
87 
88 struct map_host_buffer_req {
89 	__u32		context_id;
90 	__u64		buf_addr;
91 	__u64		buf_size;
92 } __packed;
93 
94 struct map_host_buffer_resp {
95 	enum aie2_msg_status	status;
96 } __packed;
97 
98 #define MAX_CQ_PAIRS		2
99 struct cq_info {
100 	__u32 head_addr;
101 	__u32 tail_addr;
102 	__u32 buf_addr;
103 	__u32 buf_size;
104 };
105 
106 struct cq_pair {
107 	struct cq_info x2i_q;
108 	struct cq_info i2x_q;
109 };
110 
111 #define PRIORITY_REALTIME	1
112 #define PRIORITY_HIGH		2
113 #define PRIORITY_NORMAL		3
114 #define PRIORITY_LOW		4
115 
116 struct create_ctx_req {
117 	__u32	aie_type;
118 	__u8	start_col;
119 	__u8	num_col;
120 	__u8    num_unused_col;
121 	__u8	reserved;
122 	__u8	num_cq_pairs_requested;
123 	__u8	reserved1;
124 	__u16	pasid;
125 	__u32	pad[2];
126 	__u32	sec_comm_target_type;
127 	__u32	context_priority;
128 } __packed;
129 
130 struct create_ctx_resp {
131 	enum aie2_msg_status	status;
132 	__u32			context_id;
133 	__u16			msix_id;
134 	__u8			num_cq_pairs_allocated;
135 	__u8			reserved;
136 	struct cq_pair		cq_pair[MAX_CQ_PAIRS];
137 } __packed;
138 
139 struct destroy_ctx_req {
140 	__u32	context_id;
141 } __packed;
142 
143 struct destroy_ctx_resp {
144 	enum aie2_msg_status	status;
145 } __packed;
146 
147 enum telemetry_type {
148 	TELEMETRY_TYPE_DISABLED,
149 	TELEMETRY_TYPE_HEALTH,
150 	TELEMETRY_TYPE_ERROR_INFO,
151 	TELEMETRY_TYPE_PROFILING,
152 	TELEMETRY_TYPE_DEBUG,
153 	MAX_TELEMETRY_TYPE
154 };
155 
156 struct get_telemetry_req {
157 	enum telemetry_type	type;
158 	__u64	buf_addr;
159 	__u32	buf_size;
160 } __packed;
161 
162 struct get_telemetry_resp {
163 	__u32	major;
164 	__u32	minor;
165 	__u32	size;
166 	enum aie2_msg_status	status;
167 } __packed;
168 
169 struct execute_buffer_req {
170 	__u32	cu_idx;
171 	__u32	payload[19];
172 } __packed;
173 
174 struct exec_dpu_req {
175 	__u64	inst_buf_addr;
176 	__u32	inst_size;
177 	__u32	inst_prop_cnt;
178 	__u32	cu_idx;
179 	__u32	payload[35];
180 } __packed;
181 
182 enum exec_npu_type {
183 	EXEC_NPU_TYPE_NON_ELF		= 0x1,
184 	EXEC_NPU_TYPE_PARTIAL_ELF	= 0x2,
185 	EXEC_NPU_TYPE_PREEMPT		= 0x3,
186 	EXEC_NPU_TYPE_ELF		= 0x4,
187 };
188 
189 union exec_req {
190 	struct execute_buffer_req ebuf;
191 	struct exec_dpu_req dpu_req;
192 };
193 
194 struct execute_buffer_resp {
195 	enum aie2_msg_status	status;
196 } __packed;
197 
198 struct aie_tile_info {
199 	__u32		size;
200 	__u16		major;
201 	__u16		minor;
202 	__u16		cols;
203 	__u16		rows;
204 	__u16		core_rows;
205 	__u16		mem_rows;
206 	__u16		shim_rows;
207 	__u16		core_row_start;
208 	__u16		mem_row_start;
209 	__u16		shim_row_start;
210 	__u16		core_dma_channels;
211 	__u16		mem_dma_channels;
212 	__u16		shim_dma_channels;
213 	__u16		core_locks;
214 	__u16		mem_locks;
215 	__u16		shim_locks;
216 	__u16		core_events;
217 	__u16		mem_events;
218 	__u16		shim_events;
219 	__u16		reserved;
220 };
221 
222 struct aie_tile_info_req {
223 	__u32	reserved;
224 } __packed;
225 
226 struct aie_tile_info_resp {
227 	enum aie2_msg_status	status;
228 	struct aie_tile_info	info;
229 } __packed;
230 
231 struct aie_version_info_req {
232 	__u32		reserved;
233 } __packed;
234 
235 struct aie_version_info_resp {
236 	enum aie2_msg_status	status;
237 	__u16			major;
238 	__u16			minor;
239 } __packed;
240 
241 struct aie_column_info_req {
242 	__u64 dump_buff_addr;
243 	__u32 dump_buff_size;
244 	__u32 num_cols;
245 	__u32 aie_bitmap;
246 } __packed;
247 
248 struct aie_column_info_resp {
249 	enum aie2_msg_status	status;
250 	__u32 size;
251 } __packed;
252 
253 struct suspend_req {
254 	__u32		place_holder;
255 } __packed;
256 
257 struct suspend_resp {
258 	enum aie2_msg_status	status;
259 } __packed;
260 
261 struct resume_req {
262 	__u32		place_holder;
263 } __packed;
264 
265 struct resume_resp {
266 	enum aie2_msg_status	status;
267 } __packed;
268 
269 struct check_header_hash_req {
270 	__u64		hash_high;
271 	__u64		hash_low;
272 } __packed;
273 
274 struct check_header_hash_resp {
275 	enum aie2_msg_status	status;
276 } __packed;
277 
278 struct query_error_req {
279 	__u64		buf_addr;
280 	__u32		buf_size;
281 	__u32		next_row;
282 	__u32		next_column;
283 	__u32		next_module;
284 } __packed;
285 
286 struct query_error_resp {
287 	enum aie2_msg_status	status;
288 	__u32			num_err;
289 	__u32			has_next_err;
290 	__u32			next_row;
291 	__u32			next_column;
292 	__u32			next_module;
293 } __packed;
294 
295 struct protocol_version_req {
296 	__u32		reserved;
297 } __packed;
298 
299 struct protocol_version_resp {
300 	enum aie2_msg_status	status;
301 	__u32			major;
302 	__u32			minor;
303 } __packed;
304 
305 struct firmware_version_req {
306 	__u32		reserved;
307 } __packed;
308 
309 struct firmware_version_resp {
310 	enum aie2_msg_status	status;
311 	__u32			major;
312 	__u32			minor;
313 	__u32			sub;
314 	__u32			build;
315 } __packed;
316 
317 #define MAX_NUM_CUS			32
318 #define AIE2_MSG_CFG_CU_PDI_ADDR	GENMASK(16, 0)
319 #define AIE2_MSG_CFG_CU_FUNC		GENMASK(24, 17)
320 struct config_cu_req {
321 	__u32	num_cus;
322 	__u32	cfgs[MAX_NUM_CUS];
323 } __packed;
324 
325 struct config_cu_resp {
326 	enum aie2_msg_status	status;
327 } __packed;
328 
329 struct set_runtime_cfg_req {
330 	__u32	type;
331 	__u64	value;
332 } __packed;
333 
334 struct set_runtime_cfg_resp {
335 	enum aie2_msg_status	status;
336 } __packed;
337 
338 struct get_runtime_cfg_req {
339 	__u32	type;
340 } __packed;
341 
342 struct get_runtime_cfg_resp {
343 	enum aie2_msg_status	status;
344 	__u64			value;
345 } __packed;
346 
347 enum async_event_type {
348 	ASYNC_EVENT_TYPE_AIE_ERROR,
349 	ASYNC_EVENT_TYPE_EXCEPTION,
350 	MAX_ASYNC_EVENT_TYPE
351 };
352 
353 #define ASYNC_BUF_SIZE SZ_8K
354 struct async_event_msg_req {
355 	__u64 buf_addr;
356 	__u32 buf_size;
357 } __packed;
358 
359 struct async_event_msg_resp {
360 	enum aie2_msg_status	status;
361 	enum async_event_type	type;
362 } __packed;
363 
364 #define MAX_CHAIN_CMDBUF_SIZE SZ_4K
365 
366 struct cmd_chain_slot_execbuf_cf {
367 	__u32 cu_idx;
368 	__u32 arg_cnt;
369 	__u32 args[] __counted_by(arg_cnt);
370 };
371 
372 struct cmd_chain_slot_dpu {
373 	__u64 inst_buf_addr;
374 	__u32 inst_size;
375 	__u32 inst_prop_cnt;
376 	__u32 cu_idx;
377 	__u32 arg_cnt;
378 #define MAX_DPU_ARGS_SIZE (34 * sizeof(__u32))
379 	__u32 args[] __counted_by(arg_cnt);
380 };
381 
382 #define MAX_NPU_ARGS_SIZE (26 * sizeof(__u32))
383 #define AIE2_EXEC_BUFFER_KERNEL_OP_TXN	3
384 struct cmd_chain_slot_npu {
385 	enum exec_npu_type type;
386 	u64 inst_buf_addr;
387 	u64 save_buf_addr;
388 	u64 restore_buf_addr;
389 	u32 inst_size;
390 	u32 save_size;
391 	u32 restore_size;
392 	u32 inst_prop_cnt;
393 	u32 cu_idx;
394 	u32 arg_cnt;
395 	u32 args[] __counted_by(arg_cnt);
396 } __packed;
397 
398 struct cmd_chain_req {
399 	__u64 buf_addr;
400 	__u32 buf_size;
401 	__u32 count;
402 } __packed;
403 
404 struct cmd_chain_npu_req {
405 	u32 flags;
406 	u32 reserved;
407 	u64 buf_addr;
408 	u32 buf_size;
409 	u32 count;
410 } __packed;
411 
412 union exec_chain_req {
413 	struct cmd_chain_npu_req npu_req;
414 	struct cmd_chain_req req;
415 };
416 
417 struct cmd_chain_resp {
418 	enum aie2_msg_status	status;
419 	__u32			fail_cmd_idx;
420 	enum aie2_msg_status	fail_cmd_status;
421 } __packed;
422 
423 #define AIE2_MSG_SYNC_BO_SRC_TYPE	GENMASK(3, 0)
424 #define AIE2_MSG_SYNC_BO_DST_TYPE	GENMASK(7, 4)
425 struct sync_bo_req {
426 	__u64 src_addr;
427 	__u64 dst_addr;
428 	__u32 size;
429 #define SYNC_BO_DEV_MEM  0
430 #define SYNC_BO_HOST_MEM 2
431 	__u32 type;
432 } __packed;
433 
434 struct sync_bo_resp {
435 	enum aie2_msg_status	status;
436 } __packed;
437 
438 #define DEBUG_BO_UNREGISTER 0
439 #define DEBUG_BO_REGISTER   1
440 struct config_debug_bo_req {
441 	__u64	offset;
442 	__u64	size;
443 	/*
444 	 * config operations.
445 	 *   DEBUG_BO_REGISTER: Register debug buffer
446 	 *   DEBUG_BO_UNREGISTER: Unregister debug buffer
447 	 */
448 	__u32	config;
449 } __packed;
450 
451 struct config_debug_bo_resp {
452 	enum aie2_msg_status	status;
453 } __packed;
454 #endif /* _AIE2_MSG_PRIV_H_ */
455