xref: /openbmc/linux/sound/soc/intel/avs/messages.h (revision 469e87ca)
12879516fSCezary Rojewski /* SPDX-License-Identifier: GPL-2.0-only */
22879516fSCezary Rojewski /*
32879516fSCezary Rojewski  * Copyright(c) 2021-2022 Intel Corporation. All rights reserved.
42879516fSCezary Rojewski  *
52879516fSCezary Rojewski  * Authors: Cezary Rojewski <cezary.rojewski@intel.com>
62879516fSCezary Rojewski  *          Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>
72879516fSCezary Rojewski  */
82879516fSCezary Rojewski 
92879516fSCezary Rojewski #ifndef __SOUND_SOC_INTEL_AVS_MSGS_H
102879516fSCezary Rojewski #define __SOUND_SOC_INTEL_AVS_MSGS_H
112879516fSCezary Rojewski 
122879516fSCezary Rojewski struct avs_dev;
132879516fSCezary Rojewski 
142879516fSCezary Rojewski #define AVS_MAILBOX_SIZE 4096
152879516fSCezary Rojewski 
162879516fSCezary Rojewski enum avs_msg_target {
172879516fSCezary Rojewski 	AVS_FW_GEN_MSG = 0,
182879516fSCezary Rojewski 	AVS_MOD_MSG = 1
192879516fSCezary Rojewski };
202879516fSCezary Rojewski 
212879516fSCezary Rojewski enum avs_msg_direction {
222879516fSCezary Rojewski 	AVS_MSG_REQUEST = 0,
232879516fSCezary Rojewski 	AVS_MSG_REPLY = 1
242879516fSCezary Rojewski };
252879516fSCezary Rojewski 
262879516fSCezary Rojewski enum avs_global_msg_type {
27cb1eb6b5SCezary Rojewski 	AVS_GLB_LOAD_MULTIPLE_MODULES = 15,
28cb1eb6b5SCezary Rojewski 	AVS_GLB_UNLOAD_MULTIPLE_MODULES = 16,
29b956b27bSCezary Rojewski 	AVS_GLB_CREATE_PIPELINE = 17,
30b956b27bSCezary Rojewski 	AVS_GLB_DELETE_PIPELINE = 18,
31b956b27bSCezary Rojewski 	AVS_GLB_SET_PIPELINE_STATE = 19,
32b956b27bSCezary Rojewski 	AVS_GLB_GET_PIPELINE_STATE = 20,
33cb1eb6b5SCezary Rojewski 	AVS_GLB_LOAD_LIBRARY = 24,
342879516fSCezary Rojewski 	AVS_GLB_NOTIFICATION = 27,
352879516fSCezary Rojewski };
362879516fSCezary Rojewski 
372879516fSCezary Rojewski union avs_global_msg {
382879516fSCezary Rojewski 	u64 val;
392879516fSCezary Rojewski 	struct {
402879516fSCezary Rojewski 		union {
412879516fSCezary Rojewski 			u32 primary;
422879516fSCezary Rojewski 			struct {
432879516fSCezary Rojewski 				u32 rsvd:24;
442879516fSCezary Rojewski 				u32 global_msg_type:5;
452879516fSCezary Rojewski 				u32 msg_direction:1;
462879516fSCezary Rojewski 				u32 msg_target:1;
472879516fSCezary Rojewski 			};
48cb1eb6b5SCezary Rojewski 			/* module loading */
49cb1eb6b5SCezary Rojewski 			struct {
50cb1eb6b5SCezary Rojewski 				u32 mod_cnt:8;
51cb1eb6b5SCezary Rojewski 			} load_multi_mods;
52b956b27bSCezary Rojewski 			/* pipeline management */
53b956b27bSCezary Rojewski 			struct {
54b956b27bSCezary Rojewski 				u32 ppl_mem_size:11;
55b956b27bSCezary Rojewski 				u32 ppl_priority:5;
56b956b27bSCezary Rojewski 				u32 instance_id:8;
57b956b27bSCezary Rojewski 			} create_ppl;
58b956b27bSCezary Rojewski 			struct {
59b956b27bSCezary Rojewski 				u32 rsvd:16;
60b956b27bSCezary Rojewski 				u32 instance_id:8;
61b956b27bSCezary Rojewski 			} ppl; /* generic ppl request */
62b956b27bSCezary Rojewski 			struct {
63b956b27bSCezary Rojewski 				u32 state:16;
64b956b27bSCezary Rojewski 				u32 ppl_id:8;
65b956b27bSCezary Rojewski 			} set_ppl_state;
66b956b27bSCezary Rojewski 			struct {
67b956b27bSCezary Rojewski 				u32 ppl_id:8;
68b956b27bSCezary Rojewski 			} get_ppl_state;
69cb1eb6b5SCezary Rojewski 			/* library loading */
70cb1eb6b5SCezary Rojewski 			struct {
71cb1eb6b5SCezary Rojewski 				u32 dma_id:5;
72cb1eb6b5SCezary Rojewski 				u32 rsvd:11;
73cb1eb6b5SCezary Rojewski 				u32 lib_id:4;
74cb1eb6b5SCezary Rojewski 			} load_lib;
752879516fSCezary Rojewski 		};
762879516fSCezary Rojewski 		union {
772879516fSCezary Rojewski 			u32 val;
78b956b27bSCezary Rojewski 			/* pipeline management */
79b956b27bSCezary Rojewski 			struct {
80b956b27bSCezary Rojewski 				u32 lp:1; /* low power flag */
81b956b27bSCezary Rojewski 				u32 rsvd:3;
82b956b27bSCezary Rojewski 				u32 attributes:16; /* additional scheduling flags */
83b956b27bSCezary Rojewski 			} create_ppl;
842879516fSCezary Rojewski 		} ext;
852879516fSCezary Rojewski 	};
862879516fSCezary Rojewski } __packed;
872879516fSCezary Rojewski 
882879516fSCezary Rojewski struct avs_tlv {
892879516fSCezary Rojewski 	u32 type;
902879516fSCezary Rojewski 	u32 length;
912879516fSCezary Rojewski 	u32 value[];
922879516fSCezary Rojewski } __packed;
932879516fSCezary Rojewski 
94f14a1c5aSCezary Rojewski enum avs_module_msg_type {
95f14a1c5aSCezary Rojewski 	AVS_MOD_INIT_INSTANCE = 0,
96f14a1c5aSCezary Rojewski 	AVS_MOD_LARGE_CONFIG_GET = 3,
97f14a1c5aSCezary Rojewski 	AVS_MOD_LARGE_CONFIG_SET = 4,
98f14a1c5aSCezary Rojewski 	AVS_MOD_BIND = 5,
99f14a1c5aSCezary Rojewski 	AVS_MOD_UNBIND = 6,
100*469e87caSCezary Rojewski 	AVS_MOD_SET_DX = 7,
101*469e87caSCezary Rojewski 	AVS_MOD_SET_D0IX = 8,
102f14a1c5aSCezary Rojewski 	AVS_MOD_DELETE_INSTANCE = 11,
103f14a1c5aSCezary Rojewski };
104f14a1c5aSCezary Rojewski 
1052879516fSCezary Rojewski union avs_module_msg {
1062879516fSCezary Rojewski 	u64 val;
1072879516fSCezary Rojewski 	struct {
1082879516fSCezary Rojewski 		union {
1092879516fSCezary Rojewski 			u32 primary;
1102879516fSCezary Rojewski 			struct {
1112879516fSCezary Rojewski 				u32 module_id:16;
1122879516fSCezary Rojewski 				u32 instance_id:8;
1132879516fSCezary Rojewski 				u32 module_msg_type:5;
1142879516fSCezary Rojewski 				u32 msg_direction:1;
1152879516fSCezary Rojewski 				u32 msg_target:1;
1162879516fSCezary Rojewski 			};
1172879516fSCezary Rojewski 		};
1182879516fSCezary Rojewski 		union {
1192879516fSCezary Rojewski 			u32 val;
120f14a1c5aSCezary Rojewski 			struct {
121f14a1c5aSCezary Rojewski 				u32 param_block_size:16;
122f14a1c5aSCezary Rojewski 				u32 ppl_instance_id:8;
123f14a1c5aSCezary Rojewski 				u32 core_id:4;
124f14a1c5aSCezary Rojewski 				u32 proc_domain:1;
125f14a1c5aSCezary Rojewski 			} init_instance;
126f14a1c5aSCezary Rojewski 			struct {
127f14a1c5aSCezary Rojewski 				u32 data_off_size:20;
128f14a1c5aSCezary Rojewski 				u32 large_param_id:8;
129f14a1c5aSCezary Rojewski 				u32 final_block:1;
130f14a1c5aSCezary Rojewski 				u32 init_block:1;
131f14a1c5aSCezary Rojewski 			} large_config;
132f14a1c5aSCezary Rojewski 			struct {
133f14a1c5aSCezary Rojewski 				u32 dst_module_id:16;
134f14a1c5aSCezary Rojewski 				u32 dst_instance_id:8;
135f14a1c5aSCezary Rojewski 				u32 dst_queue:3;
136f14a1c5aSCezary Rojewski 				u32 src_queue:3;
137f14a1c5aSCezary Rojewski 			} bind_unbind;
138*469e87caSCezary Rojewski 			struct {
139*469e87caSCezary Rojewski 				u32 wake:1;
140*469e87caSCezary Rojewski 				u32 streaming:1;
141*469e87caSCezary Rojewski 			} set_d0ix;
1422879516fSCezary Rojewski 		} ext;
1432879516fSCezary Rojewski 	};
1442879516fSCezary Rojewski } __packed;
1452879516fSCezary Rojewski 
1462879516fSCezary Rojewski union avs_reply_msg {
1472879516fSCezary Rojewski 	u64 val;
1482879516fSCezary Rojewski 	struct {
1492879516fSCezary Rojewski 		union {
1502879516fSCezary Rojewski 			u32 primary;
1512879516fSCezary Rojewski 			struct {
1522879516fSCezary Rojewski 				u32 status:24;
1532879516fSCezary Rojewski 				u32 global_msg_type:5;
1542879516fSCezary Rojewski 				u32 msg_direction:1;
1552879516fSCezary Rojewski 				u32 msg_target:1;
1562879516fSCezary Rojewski 			};
1572879516fSCezary Rojewski 		};
1582879516fSCezary Rojewski 		union {
1592879516fSCezary Rojewski 			u32 val;
160cb1eb6b5SCezary Rojewski 			/* module loading */
161cb1eb6b5SCezary Rojewski 			struct {
162cb1eb6b5SCezary Rojewski 				u32 err_mod_id:16;
163cb1eb6b5SCezary Rojewski 			} load_multi_mods;
164b956b27bSCezary Rojewski 			/* pipeline management */
165b956b27bSCezary Rojewski 			struct {
166b956b27bSCezary Rojewski 				u32 state:5;
167b956b27bSCezary Rojewski 			} get_ppl_state;
168f14a1c5aSCezary Rojewski 			/* module management */
169f14a1c5aSCezary Rojewski 			struct {
170f14a1c5aSCezary Rojewski 				u32 data_off_size:20;
171f14a1c5aSCezary Rojewski 				u32 large_param_id:8;
172f14a1c5aSCezary Rojewski 				u32 final_block:1;
173f14a1c5aSCezary Rojewski 				u32 init_block:1;
174f14a1c5aSCezary Rojewski 			} large_config;
1752879516fSCezary Rojewski 		} ext;
1762879516fSCezary Rojewski 	};
1772879516fSCezary Rojewski } __packed;
1782879516fSCezary Rojewski 
1792879516fSCezary Rojewski enum avs_notify_msg_type {
1802879516fSCezary Rojewski 	AVS_NOTIFY_PHRASE_DETECTED = 4,
1812879516fSCezary Rojewski 	AVS_NOTIFY_RESOURCE_EVENT = 5,
1822879516fSCezary Rojewski 	AVS_NOTIFY_FW_READY = 8,
1832879516fSCezary Rojewski 	AVS_NOTIFY_MODULE_EVENT = 12,
1842879516fSCezary Rojewski };
1852879516fSCezary Rojewski 
1862879516fSCezary Rojewski union avs_notify_msg {
1872879516fSCezary Rojewski 	u64 val;
1882879516fSCezary Rojewski 	struct {
1892879516fSCezary Rojewski 		union {
1902879516fSCezary Rojewski 			u32 primary;
1912879516fSCezary Rojewski 			struct {
1922879516fSCezary Rojewski 				u32 rsvd:16;
1932879516fSCezary Rojewski 				u32 notify_msg_type:8;
1942879516fSCezary Rojewski 				u32 global_msg_type:5;
1952879516fSCezary Rojewski 				u32 msg_direction:1;
1962879516fSCezary Rojewski 				u32 msg_target:1;
1972879516fSCezary Rojewski 			};
1982879516fSCezary Rojewski 		};
1992879516fSCezary Rojewski 		union {
2002879516fSCezary Rojewski 			u32 val;
2012879516fSCezary Rojewski 		} ext;
2022879516fSCezary Rojewski 	};
2032879516fSCezary Rojewski } __packed;
2042879516fSCezary Rojewski 
2052879516fSCezary Rojewski #define AVS_MSG(hdr) { .val = hdr }
2062879516fSCezary Rojewski 
2072879516fSCezary Rojewski #define AVS_GLOBAL_REQUEST(msg_type)		\
2082879516fSCezary Rojewski {						\
2092879516fSCezary Rojewski 	.global_msg_type = AVS_GLB_##msg_type,	\
2102879516fSCezary Rojewski 	.msg_direction = AVS_MSG_REQUEST,	\
2112879516fSCezary Rojewski 	.msg_target = AVS_FW_GEN_MSG,		\
2122879516fSCezary Rojewski }
2132879516fSCezary Rojewski 
2142879516fSCezary Rojewski #define AVS_MODULE_REQUEST(msg_type)		\
2152879516fSCezary Rojewski {						\
2162879516fSCezary Rojewski 	.module_msg_type = AVS_MOD_##msg_type,	\
2172879516fSCezary Rojewski 	.msg_direction = AVS_MSG_REQUEST,	\
2182879516fSCezary Rojewski 	.msg_target = AVS_MOD_MSG,		\
2192879516fSCezary Rojewski }
2202879516fSCezary Rojewski 
2212879516fSCezary Rojewski #define AVS_NOTIFICATION(msg_type)		\
2222879516fSCezary Rojewski {						\
2232879516fSCezary Rojewski 	.notify_msg_type = AVS_NOTIFY_##msg_type,\
2242879516fSCezary Rojewski 	.global_msg_type = AVS_GLB_NOTIFICATION,\
2252879516fSCezary Rojewski 	.msg_direction = AVS_MSG_REPLY,		\
2262879516fSCezary Rojewski 	.msg_target = AVS_FW_GEN_MSG,		\
2272879516fSCezary Rojewski }
2282879516fSCezary Rojewski 
2292879516fSCezary Rojewski #define avs_msg_is_reply(hdr) \
2302879516fSCezary Rojewski ({ \
2312879516fSCezary Rojewski 	union avs_reply_msg __msg = AVS_MSG(hdr); \
2322879516fSCezary Rojewski 	__msg.msg_direction == AVS_MSG_REPLY && \
2332879516fSCezary Rojewski 	__msg.global_msg_type != AVS_GLB_NOTIFICATION; \
2342879516fSCezary Rojewski })
2352879516fSCezary Rojewski 
2362879516fSCezary Rojewski /* Notification types */
2372879516fSCezary Rojewski 
2382879516fSCezary Rojewski struct avs_notify_voice_data {
2392879516fSCezary Rojewski 	u16 kpd_score;
2402879516fSCezary Rojewski 	u16 reserved;
2412879516fSCezary Rojewski } __packed;
2422879516fSCezary Rojewski 
2432879516fSCezary Rojewski struct avs_notify_res_data {
2442879516fSCezary Rojewski 	u32 resource_type;
2452879516fSCezary Rojewski 	u32 resource_id;
2462879516fSCezary Rojewski 	u32 event_type;
2472879516fSCezary Rojewski 	u32 reserved;
2482879516fSCezary Rojewski 	u32 data[6];
2492879516fSCezary Rojewski } __packed;
2502879516fSCezary Rojewski 
2512879516fSCezary Rojewski struct avs_notify_mod_data {
2522879516fSCezary Rojewski 	u32 module_instance_id;
2532879516fSCezary Rojewski 	u32 event_id;
2542879516fSCezary Rojewski 	u32 data_size;
2552879516fSCezary Rojewski 	u32 data[];
2562879516fSCezary Rojewski } __packed;
2572879516fSCezary Rojewski 
258cb1eb6b5SCezary Rojewski /* Code loading messages */
259cb1eb6b5SCezary Rojewski int avs_ipc_load_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids);
260cb1eb6b5SCezary Rojewski int avs_ipc_unload_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids);
261cb1eb6b5SCezary Rojewski int avs_ipc_load_library(struct avs_dev *adev, u32 dma_id, u32 lib_id);
262cb1eb6b5SCezary Rojewski 
263b956b27bSCezary Rojewski /* Pipeline management messages */
264b956b27bSCezary Rojewski enum avs_pipeline_state {
265b956b27bSCezary Rojewski 	AVS_PPL_STATE_INVALID,
266b956b27bSCezary Rojewski 	AVS_PPL_STATE_UNINITIALIZED,
267b956b27bSCezary Rojewski 	AVS_PPL_STATE_RESET,
268b956b27bSCezary Rojewski 	AVS_PPL_STATE_PAUSED,
269b956b27bSCezary Rojewski 	AVS_PPL_STATE_RUNNING,
270b956b27bSCezary Rojewski };
271b956b27bSCezary Rojewski 
272b956b27bSCezary Rojewski int avs_ipc_create_pipeline(struct avs_dev *adev, u16 req_size, u8 priority,
273b956b27bSCezary Rojewski 			    u8 instance_id, bool lp, u16 attributes);
274b956b27bSCezary Rojewski int avs_ipc_delete_pipeline(struct avs_dev *adev, u8 instance_id);
275b956b27bSCezary Rojewski int avs_ipc_set_pipeline_state(struct avs_dev *adev, u8 instance_id,
276b956b27bSCezary Rojewski 			       enum avs_pipeline_state state);
277b956b27bSCezary Rojewski int avs_ipc_get_pipeline_state(struct avs_dev *adev, u8 instance_id,
278b956b27bSCezary Rojewski 			       enum avs_pipeline_state *state);
279b956b27bSCezary Rojewski 
280f14a1c5aSCezary Rojewski /* Module management messages */
281f14a1c5aSCezary Rojewski int avs_ipc_init_instance(struct avs_dev *adev, u16 module_id, u8 instance_id,
282f14a1c5aSCezary Rojewski 			  u8 ppl_id, u8 core_id, u8 domain,
283f14a1c5aSCezary Rojewski 			  void *param, u32 param_size);
284f14a1c5aSCezary Rojewski int avs_ipc_delete_instance(struct avs_dev *adev, u16 module_id, u8 instance_id);
285f14a1c5aSCezary Rojewski int avs_ipc_bind(struct avs_dev *adev, u16 module_id, u8 instance_id,
286f14a1c5aSCezary Rojewski 		 u16 dst_module_id, u8 dst_instance_id,
287f14a1c5aSCezary Rojewski 		 u8 dst_queue, u8 src_queue);
288f14a1c5aSCezary Rojewski int avs_ipc_unbind(struct avs_dev *adev, u16 module_id, u8 instance_id,
289f14a1c5aSCezary Rojewski 		   u16 dst_module_id, u8 dst_instance_id,
290f14a1c5aSCezary Rojewski 		   u8 dst_queue, u8 src_queue);
291f14a1c5aSCezary Rojewski int avs_ipc_set_large_config(struct avs_dev *adev, u16 module_id,
292f14a1c5aSCezary Rojewski 			     u8 instance_id, u8 param_id,
293f14a1c5aSCezary Rojewski 			     u8 *request, size_t request_size);
294f14a1c5aSCezary Rojewski int avs_ipc_get_large_config(struct avs_dev *adev, u16 module_id, u8 instance_id,
295f14a1c5aSCezary Rojewski 			     u8 param_id, u8 *request_data, size_t request_size,
296f14a1c5aSCezary Rojewski 			     u8 **reply_data, size_t *reply_size);
297f14a1c5aSCezary Rojewski 
298*469e87caSCezary Rojewski /* DSP cores and domains power management messages */
299*469e87caSCezary Rojewski struct avs_dxstate_info {
300*469e87caSCezary Rojewski 	u32 core_mask;	/* which cores are subject for power transition */
301*469e87caSCezary Rojewski 	u32 dx_mask;	/* bit[n]=1 core n goes to D0, bit[n]=0 it goes to D3 */
302*469e87caSCezary Rojewski } __packed;
303*469e87caSCezary Rojewski 
304*469e87caSCezary Rojewski int avs_ipc_set_dx(struct avs_dev *adev, u32 core_mask, bool powerup);
305*469e87caSCezary Rojewski int avs_ipc_set_d0ix(struct avs_dev *adev, bool enable_pg, bool streaming);
306*469e87caSCezary Rojewski 
3072879516fSCezary Rojewski #endif /* __SOUND_SOC_INTEL_AVS_MSGS_H */
308