xref: /linux/drivers/accel/amdxdna/aie2_msg_priv.h (revision b61104e7a6349bd2c2b3e2fb3260d87f15eda8f4)
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 struct create_ctx_req {
112 	__u32	aie_type;
113 	__u8	start_col;
114 	__u8	num_col;
115 	__u16	reserved;
116 	__u8	num_cq_pairs_requested;
117 	__u8	reserved1;
118 	__u16	pasid;
119 	__u32	pad[2];
120 	__u32	sec_comm_target_type;
121 	__u32	context_priority;
122 } __packed;
123 
124 struct create_ctx_resp {
125 	enum aie2_msg_status	status;
126 	__u32			context_id;
127 	__u16			msix_id;
128 	__u8			num_cq_pairs_allocated;
129 	__u8			reserved;
130 	struct cq_pair		cq_pair[MAX_CQ_PAIRS];
131 } __packed;
132 
133 struct destroy_ctx_req {
134 	__u32	context_id;
135 } __packed;
136 
137 struct destroy_ctx_resp {
138 	enum aie2_msg_status	status;
139 } __packed;
140 
141 enum telemetry_type {
142 	TELEMETRY_TYPE_DISABLED,
143 	TELEMETRY_TYPE_HEALTH,
144 	TELEMETRY_TYPE_ERROR_INFO,
145 	TELEMETRY_TYPE_PROFILING,
146 	TELEMETRY_TYPE_DEBUG,
147 	MAX_TELEMETRY_TYPE
148 };
149 
150 struct get_telemetry_req {
151 	enum telemetry_type	type;
152 	__u64	buf_addr;
153 	__u32	buf_size;
154 } __packed;
155 
156 struct get_telemetry_resp {
157 	__u32	major;
158 	__u32	minor;
159 	__u32	size;
160 	enum aie2_msg_status	status;
161 } __packed;
162 
163 struct execute_buffer_req {
164 	__u32	cu_idx;
165 	__u32	payload[19];
166 } __packed;
167 
168 struct exec_dpu_req {
169 	__u64	inst_buf_addr;
170 	__u32	inst_size;
171 	__u32	inst_prop_cnt;
172 	__u32	cu_idx;
173 	__u32	payload[35];
174 } __packed;
175 
176 enum exec_npu_type {
177 	EXEC_NPU_TYPE_NON_ELF		= 0x1,
178 	EXEC_NPU_TYPE_PARTIAL_ELF	= 0x2,
179 	EXEC_NPU_TYPE_PREEMPT		= 0x3,
180 	EXEC_NPU_TYPE_ELF		= 0x4,
181 };
182 
183 union exec_req {
184 	struct execute_buffer_req ebuf;
185 	struct exec_dpu_req dpu_req;
186 };
187 
188 struct execute_buffer_resp {
189 	enum aie2_msg_status	status;
190 } __packed;
191 
192 struct aie_tile_info {
193 	__u32		size;
194 	__u16		major;
195 	__u16		minor;
196 	__u16		cols;
197 	__u16		rows;
198 	__u16		core_rows;
199 	__u16		mem_rows;
200 	__u16		shim_rows;
201 	__u16		core_row_start;
202 	__u16		mem_row_start;
203 	__u16		shim_row_start;
204 	__u16		core_dma_channels;
205 	__u16		mem_dma_channels;
206 	__u16		shim_dma_channels;
207 	__u16		core_locks;
208 	__u16		mem_locks;
209 	__u16		shim_locks;
210 	__u16		core_events;
211 	__u16		mem_events;
212 	__u16		shim_events;
213 	__u16		reserved;
214 };
215 
216 struct aie_tile_info_req {
217 	__u32	reserved;
218 } __packed;
219 
220 struct aie_tile_info_resp {
221 	enum aie2_msg_status	status;
222 	struct aie_tile_info	info;
223 } __packed;
224 
225 struct aie_version_info_req {
226 	__u32		reserved;
227 } __packed;
228 
229 struct aie_version_info_resp {
230 	enum aie2_msg_status	status;
231 	__u16			major;
232 	__u16			minor;
233 } __packed;
234 
235 struct aie_column_info_req {
236 	__u64 dump_buff_addr;
237 	__u32 dump_buff_size;
238 	__u32 num_cols;
239 	__u32 aie_bitmap;
240 } __packed;
241 
242 struct aie_column_info_resp {
243 	enum aie2_msg_status	status;
244 	__u32 size;
245 } __packed;
246 
247 struct suspend_req {
248 	__u32		place_holder;
249 } __packed;
250 
251 struct suspend_resp {
252 	enum aie2_msg_status	status;
253 } __packed;
254 
255 struct resume_req {
256 	__u32		place_holder;
257 } __packed;
258 
259 struct resume_resp {
260 	enum aie2_msg_status	status;
261 } __packed;
262 
263 struct check_header_hash_req {
264 	__u64		hash_high;
265 	__u64		hash_low;
266 } __packed;
267 
268 struct check_header_hash_resp {
269 	enum aie2_msg_status	status;
270 } __packed;
271 
272 struct query_error_req {
273 	__u64		buf_addr;
274 	__u32		buf_size;
275 	__u32		next_row;
276 	__u32		next_column;
277 	__u32		next_module;
278 } __packed;
279 
280 struct query_error_resp {
281 	enum aie2_msg_status	status;
282 	__u32			num_err;
283 	__u32			has_next_err;
284 	__u32			next_row;
285 	__u32			next_column;
286 	__u32			next_module;
287 } __packed;
288 
289 struct protocol_version_req {
290 	__u32		reserved;
291 } __packed;
292 
293 struct protocol_version_resp {
294 	enum aie2_msg_status	status;
295 	__u32			major;
296 	__u32			minor;
297 } __packed;
298 
299 struct firmware_version_req {
300 	__u32		reserved;
301 } __packed;
302 
303 struct firmware_version_resp {
304 	enum aie2_msg_status	status;
305 	__u32			major;
306 	__u32			minor;
307 	__u32			sub;
308 	__u32			build;
309 } __packed;
310 
311 #define MAX_NUM_CUS			32
312 #define AIE2_MSG_CFG_CU_PDI_ADDR	GENMASK(16, 0)
313 #define AIE2_MSG_CFG_CU_FUNC		GENMASK(24, 17)
314 struct config_cu_req {
315 	__u32	num_cus;
316 	__u32	cfgs[MAX_NUM_CUS];
317 } __packed;
318 
319 struct config_cu_resp {
320 	enum aie2_msg_status	status;
321 } __packed;
322 
323 struct set_runtime_cfg_req {
324 	__u32	type;
325 	__u64	value;
326 } __packed;
327 
328 struct set_runtime_cfg_resp {
329 	enum aie2_msg_status	status;
330 } __packed;
331 
332 struct get_runtime_cfg_req {
333 	__u32	type;
334 } __packed;
335 
336 struct get_runtime_cfg_resp {
337 	enum aie2_msg_status	status;
338 	__u64			value;
339 } __packed;
340 
341 enum async_event_type {
342 	ASYNC_EVENT_TYPE_AIE_ERROR,
343 	ASYNC_EVENT_TYPE_EXCEPTION,
344 	MAX_ASYNC_EVENT_TYPE
345 };
346 
347 #define ASYNC_BUF_SIZE SZ_8K
348 struct async_event_msg_req {
349 	__u64 buf_addr;
350 	__u32 buf_size;
351 } __packed;
352 
353 struct async_event_msg_resp {
354 	enum aie2_msg_status	status;
355 	enum async_event_type	type;
356 } __packed;
357 
358 #define MAX_CHAIN_CMDBUF_SIZE SZ_4K
359 
360 struct cmd_chain_slot_execbuf_cf {
361 	__u32 cu_idx;
362 	__u32 arg_cnt;
363 	__u32 args[] __counted_by(arg_cnt);
364 };
365 
366 struct cmd_chain_slot_dpu {
367 	__u64 inst_buf_addr;
368 	__u32 inst_size;
369 	__u32 inst_prop_cnt;
370 	__u32 cu_idx;
371 	__u32 arg_cnt;
372 #define MAX_DPU_ARGS_SIZE (34 * sizeof(__u32))
373 	__u32 args[] __counted_by(arg_cnt);
374 };
375 
376 #define MAX_NPU_ARGS_SIZE (26 * sizeof(__u32))
377 #define AIE2_EXEC_BUFFER_KERNEL_OP_TXN	3
378 struct cmd_chain_slot_npu {
379 	enum exec_npu_type type;
380 	u64 inst_buf_addr;
381 	u64 save_buf_addr;
382 	u64 restore_buf_addr;
383 	u32 inst_size;
384 	u32 save_size;
385 	u32 restore_size;
386 	u32 inst_prop_cnt;
387 	u32 cu_idx;
388 	u32 arg_cnt;
389 	u32 args[] __counted_by(arg_cnt);
390 } __packed;
391 
392 struct cmd_chain_req {
393 	__u64 buf_addr;
394 	__u32 buf_size;
395 	__u32 count;
396 } __packed;
397 
398 struct cmd_chain_npu_req {
399 	u32 flags;
400 	u32 reserved;
401 	u64 buf_addr;
402 	u32 buf_size;
403 	u32 count;
404 } __packed;
405 
406 union exec_chain_req {
407 	struct cmd_chain_npu_req npu_req;
408 	struct cmd_chain_req req;
409 };
410 
411 struct cmd_chain_resp {
412 	enum aie2_msg_status	status;
413 	__u32			fail_cmd_idx;
414 	enum aie2_msg_status	fail_cmd_status;
415 } __packed;
416 
417 #define AIE2_MSG_SYNC_BO_SRC_TYPE	GENMASK(3, 0)
418 #define AIE2_MSG_SYNC_BO_DST_TYPE	GENMASK(7, 4)
419 struct sync_bo_req {
420 	__u64 src_addr;
421 	__u64 dst_addr;
422 	__u32 size;
423 #define SYNC_BO_DEV_MEM  0
424 #define SYNC_BO_HOST_MEM 2
425 	__u32 type;
426 } __packed;
427 
428 struct sync_bo_resp {
429 	enum aie2_msg_status	status;
430 } __packed;
431 
432 #define DEBUG_BO_UNREGISTER 0
433 #define DEBUG_BO_REGISTER   1
434 struct config_debug_bo_req {
435 	__u64	offset;
436 	__u64	size;
437 	/*
438 	 * config operations.
439 	 *   DEBUG_BO_REGISTER: Register debug buffer
440 	 *   DEBUG_BO_UNREGISTER: Unregister debug buffer
441 	 */
442 	__u32	config;
443 } __packed;
444 
445 struct config_debug_bo_resp {
446 	enum aie2_msg_status	status;
447 } __packed;
448 #endif /* _AIE2_MSG_PRIV_H_ */
449