messages.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright(c) 2021-2022 Intel Corporation. All rights reserved.
  4. *
  5. * Authors: Cezary Rojewski <[email protected]>
  6. * Amadeusz Slawinski <[email protected]>
  7. */
  8. #ifndef __SOUND_SOC_INTEL_AVS_MSGS_H
  9. #define __SOUND_SOC_INTEL_AVS_MSGS_H
  10. struct avs_dev;
  11. #define AVS_MAILBOX_SIZE 4096
  12. enum avs_msg_target {
  13. AVS_FW_GEN_MSG = 0,
  14. AVS_MOD_MSG = 1
  15. };
  16. enum avs_msg_direction {
  17. AVS_MSG_REQUEST = 0,
  18. AVS_MSG_REPLY = 1
  19. };
  20. enum avs_global_msg_type {
  21. AVS_GLB_ROM_CONTROL = 1,
  22. AVS_GLB_LOAD_MULTIPLE_MODULES = 15,
  23. AVS_GLB_UNLOAD_MULTIPLE_MODULES = 16,
  24. AVS_GLB_CREATE_PIPELINE = 17,
  25. AVS_GLB_DELETE_PIPELINE = 18,
  26. AVS_GLB_SET_PIPELINE_STATE = 19,
  27. AVS_GLB_GET_PIPELINE_STATE = 20,
  28. AVS_GLB_LOAD_LIBRARY = 24,
  29. AVS_GLB_NOTIFICATION = 27,
  30. };
  31. union avs_global_msg {
  32. u64 val;
  33. struct {
  34. union {
  35. u32 primary;
  36. struct {
  37. u32 rsvd:24;
  38. u32 global_msg_type:5;
  39. u32 msg_direction:1;
  40. u32 msg_target:1;
  41. };
  42. /* set boot config */
  43. struct {
  44. u32 rom_ctrl_msg_type:9;
  45. u32 dma_id:5;
  46. u32 purge_request:1;
  47. } boot_cfg;
  48. /* module loading */
  49. struct {
  50. u32 mod_cnt:8;
  51. } load_multi_mods;
  52. /* pipeline management */
  53. struct {
  54. u32 ppl_mem_size:11;
  55. u32 ppl_priority:5;
  56. u32 instance_id:8;
  57. } create_ppl;
  58. struct {
  59. u32 rsvd:16;
  60. u32 instance_id:8;
  61. } ppl; /* generic ppl request */
  62. struct {
  63. u32 state:16;
  64. u32 ppl_id:8;
  65. } set_ppl_state;
  66. struct {
  67. u32 ppl_id:8;
  68. } get_ppl_state;
  69. /* library loading */
  70. struct {
  71. u32 dma_id:5;
  72. u32 rsvd:11;
  73. u32 lib_id:4;
  74. } load_lib;
  75. };
  76. union {
  77. u32 val;
  78. /* pipeline management */
  79. struct {
  80. u32 lp:1; /* low power flag */
  81. u32 rsvd:3;
  82. u32 attributes:16; /* additional scheduling flags */
  83. } create_ppl;
  84. } ext;
  85. };
  86. } __packed;
  87. struct avs_tlv {
  88. u32 type;
  89. u32 length;
  90. u32 value[];
  91. } __packed;
  92. enum avs_module_msg_type {
  93. AVS_MOD_INIT_INSTANCE = 0,
  94. AVS_MOD_LARGE_CONFIG_GET = 3,
  95. AVS_MOD_LARGE_CONFIG_SET = 4,
  96. AVS_MOD_BIND = 5,
  97. AVS_MOD_UNBIND = 6,
  98. AVS_MOD_SET_DX = 7,
  99. AVS_MOD_SET_D0IX = 8,
  100. AVS_MOD_DELETE_INSTANCE = 11,
  101. };
  102. union avs_module_msg {
  103. u64 val;
  104. struct {
  105. union {
  106. u32 primary;
  107. struct {
  108. u32 module_id:16;
  109. u32 instance_id:8;
  110. u32 module_msg_type:5;
  111. u32 msg_direction:1;
  112. u32 msg_target:1;
  113. };
  114. };
  115. union {
  116. u32 val;
  117. struct {
  118. u32 param_block_size:16;
  119. u32 ppl_instance_id:8;
  120. u32 core_id:4;
  121. u32 proc_domain:1;
  122. } init_instance;
  123. struct {
  124. u32 data_off_size:20;
  125. u32 large_param_id:8;
  126. u32 final_block:1;
  127. u32 init_block:1;
  128. } large_config;
  129. struct {
  130. u32 dst_module_id:16;
  131. u32 dst_instance_id:8;
  132. u32 dst_queue:3;
  133. u32 src_queue:3;
  134. } bind_unbind;
  135. struct {
  136. u32 wake:1;
  137. u32 streaming:1;
  138. } set_d0ix;
  139. } ext;
  140. };
  141. } __packed;
  142. union avs_reply_msg {
  143. u64 val;
  144. struct {
  145. union {
  146. u32 primary;
  147. struct {
  148. u32 status:24;
  149. u32 global_msg_type:5;
  150. u32 msg_direction:1;
  151. u32 msg_target:1;
  152. };
  153. };
  154. union {
  155. u32 val;
  156. /* module loading */
  157. struct {
  158. u32 err_mod_id:16;
  159. } load_multi_mods;
  160. /* pipeline management */
  161. struct {
  162. u32 state:5;
  163. } get_ppl_state;
  164. /* module management */
  165. struct {
  166. u32 data_off_size:20;
  167. u32 large_param_id:8;
  168. u32 final_block:1;
  169. u32 init_block:1;
  170. } large_config;
  171. } ext;
  172. };
  173. } __packed;
  174. enum avs_notify_msg_type {
  175. AVS_NOTIFY_PHRASE_DETECTED = 4,
  176. AVS_NOTIFY_RESOURCE_EVENT = 5,
  177. AVS_NOTIFY_LOG_BUFFER_STATUS = 6,
  178. AVS_NOTIFY_FW_READY = 8,
  179. AVS_NOTIFY_EXCEPTION_CAUGHT = 10,
  180. AVS_NOTIFY_MODULE_EVENT = 12,
  181. };
  182. union avs_notify_msg {
  183. u64 val;
  184. struct {
  185. union {
  186. u32 primary;
  187. struct {
  188. u32 rsvd:16;
  189. u32 notify_msg_type:8;
  190. u32 global_msg_type:5;
  191. u32 msg_direction:1;
  192. u32 msg_target:1;
  193. };
  194. struct {
  195. u16 rsvd:12;
  196. u16 core:4;
  197. } log;
  198. };
  199. union {
  200. u32 val;
  201. struct {
  202. u32 core_id:2;
  203. u32 stack_dump_size:16;
  204. } coredump;
  205. } ext;
  206. };
  207. } __packed;
  208. #define AVS_MSG(hdr) { .val = hdr }
  209. #define AVS_GLOBAL_REQUEST(msg_type) \
  210. { \
  211. .global_msg_type = AVS_GLB_##msg_type, \
  212. .msg_direction = AVS_MSG_REQUEST, \
  213. .msg_target = AVS_FW_GEN_MSG, \
  214. }
  215. #define AVS_MODULE_REQUEST(msg_type) \
  216. { \
  217. .module_msg_type = AVS_MOD_##msg_type, \
  218. .msg_direction = AVS_MSG_REQUEST, \
  219. .msg_target = AVS_MOD_MSG, \
  220. }
  221. #define AVS_NOTIFICATION(msg_type) \
  222. { \
  223. .notify_msg_type = AVS_NOTIFY_##msg_type,\
  224. .global_msg_type = AVS_GLB_NOTIFICATION,\
  225. .msg_direction = AVS_MSG_REPLY, \
  226. .msg_target = AVS_FW_GEN_MSG, \
  227. }
  228. #define avs_msg_is_reply(hdr) \
  229. ({ \
  230. union avs_reply_msg __msg = AVS_MSG(hdr); \
  231. __msg.msg_direction == AVS_MSG_REPLY && \
  232. __msg.global_msg_type != AVS_GLB_NOTIFICATION; \
  233. })
  234. /* Notification types */
  235. struct avs_notify_voice_data {
  236. u16 kpd_score;
  237. u16 reserved;
  238. } __packed;
  239. struct avs_notify_res_data {
  240. u32 resource_type;
  241. u32 resource_id;
  242. u32 event_type;
  243. u32 reserved;
  244. u32 data[6];
  245. } __packed;
  246. struct avs_notify_mod_data {
  247. u32 module_instance_id;
  248. u32 event_id;
  249. u32 data_size;
  250. u32 data[];
  251. } __packed;
  252. /* ROM messages */
  253. enum avs_rom_control_msg_type {
  254. AVS_ROM_SET_BOOT_CONFIG = 0,
  255. };
  256. int avs_ipc_set_boot_config(struct avs_dev *adev, u32 dma_id, u32 purge);
  257. /* Code loading messages */
  258. int avs_ipc_load_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids);
  259. int avs_ipc_unload_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids);
  260. int avs_ipc_load_library(struct avs_dev *adev, u32 dma_id, u32 lib_id);
  261. /* Pipeline management messages */
  262. enum avs_pipeline_state {
  263. AVS_PPL_STATE_INVALID,
  264. AVS_PPL_STATE_UNINITIALIZED,
  265. AVS_PPL_STATE_RESET,
  266. AVS_PPL_STATE_PAUSED,
  267. AVS_PPL_STATE_RUNNING,
  268. };
  269. int avs_ipc_create_pipeline(struct avs_dev *adev, u16 req_size, u8 priority,
  270. u8 instance_id, bool lp, u16 attributes);
  271. int avs_ipc_delete_pipeline(struct avs_dev *adev, u8 instance_id);
  272. int avs_ipc_set_pipeline_state(struct avs_dev *adev, u8 instance_id,
  273. enum avs_pipeline_state state);
  274. int avs_ipc_get_pipeline_state(struct avs_dev *adev, u8 instance_id,
  275. enum avs_pipeline_state *state);
  276. /* Module management messages */
  277. int avs_ipc_init_instance(struct avs_dev *adev, u16 module_id, u8 instance_id,
  278. u8 ppl_id, u8 core_id, u8 domain,
  279. void *param, u32 param_size);
  280. int avs_ipc_delete_instance(struct avs_dev *adev, u16 module_id, u8 instance_id);
  281. int avs_ipc_bind(struct avs_dev *adev, u16 module_id, u8 instance_id,
  282. u16 dst_module_id, u8 dst_instance_id,
  283. u8 dst_queue, u8 src_queue);
  284. int avs_ipc_unbind(struct avs_dev *adev, u16 module_id, u8 instance_id,
  285. u16 dst_module_id, u8 dst_instance_id,
  286. u8 dst_queue, u8 src_queue);
  287. int avs_ipc_set_large_config(struct avs_dev *adev, u16 module_id,
  288. u8 instance_id, u8 param_id,
  289. u8 *request, size_t request_size);
  290. int avs_ipc_get_large_config(struct avs_dev *adev, u16 module_id, u8 instance_id,
  291. u8 param_id, u8 *request_data, size_t request_size,
  292. u8 **reply_data, size_t *reply_size);
  293. /* DSP cores and domains power management messages */
  294. struct avs_dxstate_info {
  295. u32 core_mask; /* which cores are subject for power transition */
  296. u32 dx_mask; /* bit[n]=1 core n goes to D0, bit[n]=0 it goes to D3 */
  297. } __packed;
  298. int avs_ipc_set_dx(struct avs_dev *adev, u32 core_mask, bool powerup);
  299. int avs_ipc_set_d0ix(struct avs_dev *adev, bool enable_pg, bool streaming);
  300. /* Base-firmware runtime parameters */
  301. #define AVS_BASEFW_MOD_ID 0
  302. #define AVS_BASEFW_INST_ID 0
  303. enum avs_basefw_runtime_param {
  304. AVS_BASEFW_ENABLE_LOGS = 6,
  305. AVS_BASEFW_FIRMWARE_CONFIG = 7,
  306. AVS_BASEFW_HARDWARE_CONFIG = 8,
  307. AVS_BASEFW_MODULES_INFO = 9,
  308. AVS_BASEFW_LIBRARIES_INFO = 16,
  309. AVS_BASEFW_SYSTEM_TIME = 20,
  310. };
  311. enum avs_log_enable {
  312. AVS_LOG_DISABLE = 0,
  313. AVS_LOG_ENABLE = 1
  314. };
  315. enum avs_skl_log_priority {
  316. AVS_SKL_LOG_CRITICAL = 1,
  317. AVS_SKL_LOG_HIGH,
  318. AVS_SKL_LOG_MEDIUM,
  319. AVS_SKL_LOG_LOW,
  320. AVS_SKL_LOG_VERBOSE,
  321. };
  322. struct skl_log_state {
  323. u32 enable;
  324. u32 min_priority;
  325. } __packed;
  326. struct skl_log_state_info {
  327. u32 core_mask;
  328. struct skl_log_state logs_core[];
  329. } __packed;
  330. struct apl_log_state_info {
  331. u32 aging_timer_period;
  332. u32 fifo_full_timer_period;
  333. u32 core_mask;
  334. struct skl_log_state logs_core[];
  335. } __packed;
  336. int avs_ipc_set_enable_logs(struct avs_dev *adev, u8 *log_info, size_t size);
  337. struct avs_fw_version {
  338. u16 major;
  339. u16 minor;
  340. u16 hotfix;
  341. u16 build;
  342. };
  343. enum avs_fw_cfg_params {
  344. AVS_FW_CFG_FW_VERSION = 0,
  345. AVS_FW_CFG_MEMORY_RECLAIMED,
  346. AVS_FW_CFG_SLOW_CLOCK_FREQ_HZ,
  347. AVS_FW_CFG_FAST_CLOCK_FREQ_HZ,
  348. AVS_FW_CFG_DMA_BUFFER_CONFIG,
  349. AVS_FW_CFG_ALH_SUPPORT_LEVEL,
  350. AVS_FW_CFG_IPC_DL_MAILBOX_BYTES,
  351. AVS_FW_CFG_IPC_UL_MAILBOX_BYTES,
  352. AVS_FW_CFG_TRACE_LOG_BYTES,
  353. AVS_FW_CFG_MAX_PPL_COUNT,
  354. AVS_FW_CFG_MAX_ASTATE_COUNT,
  355. AVS_FW_CFG_MAX_MODULE_PIN_COUNT,
  356. AVS_FW_CFG_MODULES_COUNT,
  357. AVS_FW_CFG_MAX_MOD_INST_COUNT,
  358. AVS_FW_CFG_MAX_LL_TASKS_PER_PRI_COUNT,
  359. AVS_FW_CFG_LL_PRI_COUNT,
  360. AVS_FW_CFG_MAX_DP_TASKS_COUNT,
  361. AVS_FW_CFG_MAX_LIBS_COUNT,
  362. AVS_FW_CFG_SCHEDULER_CONFIG,
  363. AVS_FW_CFG_XTAL_FREQ_HZ,
  364. AVS_FW_CFG_CLOCKS_CONFIG,
  365. AVS_FW_CFG_RESERVED,
  366. AVS_FW_CFG_POWER_GATING_POLICY,
  367. AVS_FW_CFG_ASSERT_MODE,
  368. };
  369. struct avs_fw_cfg {
  370. struct avs_fw_version fw_version;
  371. u32 memory_reclaimed;
  372. u32 slow_clock_freq_hz;
  373. u32 fast_clock_freq_hz;
  374. u32 alh_support;
  375. u32 ipc_dl_mailbox_bytes;
  376. u32 ipc_ul_mailbox_bytes;
  377. u32 trace_log_bytes;
  378. u32 max_ppl_count;
  379. u32 max_astate_count;
  380. u32 max_module_pin_count;
  381. u32 modules_count;
  382. u32 max_mod_inst_count;
  383. u32 max_ll_tasks_per_pri_count;
  384. u32 ll_pri_count;
  385. u32 max_dp_tasks_count;
  386. u32 max_libs_count;
  387. u32 xtal_freq_hz;
  388. u32 power_gating_policy;
  389. };
  390. int avs_ipc_get_fw_config(struct avs_dev *adev, struct avs_fw_cfg *cfg);
  391. enum avs_hw_cfg_params {
  392. AVS_HW_CFG_AVS_VER,
  393. AVS_HW_CFG_DSP_CORES,
  394. AVS_HW_CFG_MEM_PAGE_BYTES,
  395. AVS_HW_CFG_TOTAL_PHYS_MEM_PAGES,
  396. AVS_HW_CFG_I2S_CAPS,
  397. AVS_HW_CFG_GPDMA_CAPS,
  398. AVS_HW_CFG_GATEWAY_COUNT,
  399. AVS_HW_CFG_HP_EBB_COUNT,
  400. AVS_HW_CFG_LP_EBB_COUNT,
  401. AVS_HW_CFG_EBB_SIZE_BYTES,
  402. };
  403. enum avs_iface_version {
  404. AVS_AVS_VER_1_5 = 0x10005,
  405. AVS_AVS_VER_1_8 = 0x10008,
  406. };
  407. enum avs_i2s_version {
  408. AVS_I2S_VER_15_SKYLAKE = 0x00000,
  409. AVS_I2S_VER_15_BROXTON = 0x10000,
  410. AVS_I2S_VER_15_BROXTON_P = 0x20000,
  411. AVS_I2S_VER_18_KBL_CNL = 0x30000,
  412. };
  413. struct avs_i2s_caps {
  414. u32 i2s_version;
  415. u32 ctrl_count;
  416. u32 *ctrl_base_addr;
  417. };
  418. struct avs_hw_cfg {
  419. u32 avs_version;
  420. u32 dsp_cores;
  421. u32 mem_page_bytes;
  422. u32 total_phys_mem_pages;
  423. struct avs_i2s_caps i2s_caps;
  424. u32 gateway_count;
  425. u32 hp_ebb_count;
  426. u32 lp_ebb_count;
  427. u32 ebb_size_bytes;
  428. };
  429. int avs_ipc_get_hw_config(struct avs_dev *adev, struct avs_hw_cfg *cfg);
  430. #define AVS_MODULE_LOAD_TYPE_BUILTIN 0
  431. #define AVS_MODULE_LOAD_TYPE_LOADABLE 1
  432. #define AVS_MODULE_STATE_LOADED BIT(0)
  433. struct avs_module_type {
  434. u32 load_type:4;
  435. u32 auto_start:1;
  436. u32 domain_ll:1;
  437. u32 domain_dp:1;
  438. u32 lib_code:1;
  439. u32 rsvd:24;
  440. } __packed;
  441. union avs_segment_flags {
  442. u32 ul;
  443. struct {
  444. u32 contents:1;
  445. u32 alloc:1;
  446. u32 load:1;
  447. u32 readonly:1;
  448. u32 code:1;
  449. u32 data:1;
  450. u32 rsvd_1:2;
  451. u32 type:4;
  452. u32 rsvd_2:4;
  453. u32 length:16;
  454. };
  455. } __packed;
  456. struct avs_segment_desc {
  457. union avs_segment_flags flags;
  458. u32 v_base_addr;
  459. u32 file_offset;
  460. } __packed;
  461. struct avs_module_entry {
  462. u16 module_id;
  463. u16 state_flags;
  464. u8 name[8];
  465. guid_t uuid;
  466. struct avs_module_type type;
  467. u8 hash[32];
  468. u32 entry_point;
  469. u16 cfg_offset;
  470. u16 cfg_count;
  471. u32 affinity_mask;
  472. u16 instance_max_count;
  473. u16 instance_bss_size;
  474. struct avs_segment_desc segments[3];
  475. } __packed;
  476. struct avs_mods_info {
  477. u32 count;
  478. struct avs_module_entry entries[];
  479. } __packed;
  480. static inline bool avs_module_entry_is_loaded(struct avs_module_entry *mentry)
  481. {
  482. return mentry->type.load_type == AVS_MODULE_LOAD_TYPE_BUILTIN ||
  483. mentry->state_flags & AVS_MODULE_STATE_LOADED;
  484. }
  485. int avs_ipc_get_modules_info(struct avs_dev *adev, struct avs_mods_info **info);
  486. struct avs_sys_time {
  487. u32 val_l;
  488. u32 val_u;
  489. } __packed;
  490. int avs_ipc_set_system_time(struct avs_dev *adev);
  491. /* Module configuration */
  492. #define AVS_MIXIN_MOD_UUID \
  493. GUID_INIT(0x39656EB2, 0x3B71, 0x4049, 0x8D, 0x3F, 0xF9, 0x2C, 0xD5, 0xC4, 0x3C, 0x09)
  494. #define AVS_MIXOUT_MOD_UUID \
  495. GUID_INIT(0x3C56505A, 0x24D7, 0x418F, 0xBD, 0xDC, 0xC1, 0xF5, 0xA3, 0xAC, 0x2A, 0xE0)
  496. #define AVS_COPIER_MOD_UUID \
  497. GUID_INIT(0x9BA00C83, 0xCA12, 0x4A83, 0x94, 0x3C, 0x1F, 0xA2, 0xE8, 0x2F, 0x9D, 0xDA)
  498. #define AVS_KPBUFF_MOD_UUID \
  499. GUID_INIT(0xA8A0CB32, 0x4A77, 0x4DB1, 0x85, 0xC7, 0x53, 0xD7, 0xEE, 0x07, 0xBC, 0xE6)
  500. #define AVS_MICSEL_MOD_UUID \
  501. GUID_INIT(0x32FE92C1, 0x1E17, 0x4FC2, 0x97, 0x58, 0xC7, 0xF3, 0x54, 0x2E, 0x98, 0x0A)
  502. #define AVS_MUX_MOD_UUID \
  503. GUID_INIT(0x64CE6E35, 0x857A, 0x4878, 0xAC, 0xE8, 0xE2, 0xA2, 0xF4, 0x2e, 0x30, 0x69)
  504. #define AVS_UPDWMIX_MOD_UUID \
  505. GUID_INIT(0x42F8060C, 0x832F, 0x4DBF, 0xB2, 0x47, 0x51, 0xE9, 0x61, 0x99, 0x7b, 0x35)
  506. #define AVS_SRCINTC_MOD_UUID \
  507. GUID_INIT(0xE61BB28D, 0x149A, 0x4C1F, 0xB7, 0x09, 0x46, 0x82, 0x3E, 0xF5, 0xF5, 0xAE)
  508. #define AVS_PROBE_MOD_UUID \
  509. GUID_INIT(0x7CAD0808, 0xAB10, 0xCD23, 0xEF, 0x45, 0x12, 0xAB, 0x34, 0xCD, 0x56, 0xEF)
  510. #define AVS_AEC_MOD_UUID \
  511. GUID_INIT(0x46CB87FB, 0xD2C9, 0x4970, 0x96, 0xD2, 0x6D, 0x7E, 0x61, 0x4B, 0xB6, 0x05)
  512. #define AVS_ASRC_MOD_UUID \
  513. GUID_INIT(0x66B4402D, 0xB468, 0x42F2, 0x81, 0xA7, 0xB3, 0x71, 0x21, 0x86, 0x3D, 0xD4)
  514. #define AVS_INTELWOV_MOD_UUID \
  515. GUID_INIT(0xEC774FA9, 0x28D3, 0x424A, 0x90, 0xE4, 0x69, 0xF9, 0x84, 0xF1, 0xEE, 0xB7)
  516. /* channel map */
  517. enum avs_channel_index {
  518. AVS_CHANNEL_LEFT = 0,
  519. AVS_CHANNEL_RIGHT = 1,
  520. AVS_CHANNEL_CENTER = 2,
  521. AVS_CHANNEL_LEFT_SURROUND = 3,
  522. AVS_CHANNEL_CENTER_SURROUND = 3,
  523. AVS_CHANNEL_RIGHT_SURROUND = 4,
  524. AVS_CHANNEL_LFE = 7,
  525. AVS_CHANNEL_INVALID = 0xF,
  526. };
  527. enum avs_channel_config {
  528. AVS_CHANNEL_CONFIG_MONO = 0,
  529. AVS_CHANNEL_CONFIG_STEREO = 1,
  530. AVS_CHANNEL_CONFIG_2_1 = 2,
  531. AVS_CHANNEL_CONFIG_3_0 = 3,
  532. AVS_CHANNEL_CONFIG_3_1 = 4,
  533. AVS_CHANNEL_CONFIG_QUATRO = 5,
  534. AVS_CHANNEL_CONFIG_4_0 = 6,
  535. AVS_CHANNEL_CONFIG_5_0 = 7,
  536. AVS_CHANNEL_CONFIG_5_1 = 8,
  537. AVS_CHANNEL_CONFIG_DUAL_MONO = 9,
  538. AVS_CHANNEL_CONFIG_I2S_DUAL_STEREO_0 = 10,
  539. AVS_CHANNEL_CONFIG_I2S_DUAL_STEREO_1 = 11,
  540. AVS_CHANNEL_CONFIG_7_1 = 12,
  541. AVS_CHANNEL_CONFIG_INVALID
  542. };
  543. enum avs_interleaving {
  544. AVS_INTERLEAVING_PER_CHANNEL = 0,
  545. AVS_INTERLEAVING_PER_SAMPLE = 1,
  546. };
  547. enum avs_sample_type {
  548. AVS_SAMPLE_TYPE_INT_MSB = 0,
  549. AVS_SAMPLE_TYPE_INT_LSB = 1,
  550. AVS_SAMPLE_TYPE_INT_SIGNED = 2,
  551. AVS_SAMPLE_TYPE_INT_UNSIGNED = 3,
  552. AVS_SAMPLE_TYPE_FLOAT = 4,
  553. };
  554. #define AVS_CHANNELS_MAX 8
  555. #define AVS_ALL_CHANNELS_MASK UINT_MAX
  556. struct avs_audio_format {
  557. u32 sampling_freq;
  558. u32 bit_depth;
  559. u32 channel_map;
  560. u32 channel_config;
  561. u32 interleaving;
  562. u32 num_channels:8;
  563. u32 valid_bit_depth:8;
  564. u32 sample_type:8;
  565. u32 reserved:8;
  566. } __packed;
  567. struct avs_modcfg_base {
  568. u32 cpc;
  569. u32 ibs;
  570. u32 obs;
  571. u32 is_pages;
  572. struct avs_audio_format audio_fmt;
  573. } __packed;
  574. struct avs_pin_format {
  575. u32 pin_index;
  576. u32 iobs;
  577. struct avs_audio_format audio_fmt;
  578. } __packed;
  579. struct avs_modcfg_ext {
  580. struct avs_modcfg_base base;
  581. u16 num_input_pins;
  582. u16 num_output_pins;
  583. u8 reserved[12];
  584. /* input pin formats followed by output ones */
  585. struct avs_pin_format pin_fmts[];
  586. } __packed;
  587. enum avs_dma_type {
  588. AVS_DMA_HDA_HOST_OUTPUT = 0,
  589. AVS_DMA_HDA_HOST_INPUT = 1,
  590. AVS_DMA_HDA_LINK_OUTPUT = 8,
  591. AVS_DMA_HDA_LINK_INPUT = 9,
  592. AVS_DMA_DMIC_LINK_INPUT = 11,
  593. AVS_DMA_I2S_LINK_OUTPUT = 12,
  594. AVS_DMA_I2S_LINK_INPUT = 13,
  595. };
  596. union avs_virtual_index {
  597. u8 val;
  598. struct {
  599. u8 time_slot:4;
  600. u8 instance:4;
  601. } i2s;
  602. struct {
  603. u8 queue_id:3;
  604. u8 time_slot:2;
  605. u8 instance:3;
  606. } dmic;
  607. } __packed;
  608. union avs_connector_node_id {
  609. u32 val;
  610. struct {
  611. u32 vindex:8;
  612. u32 dma_type:5;
  613. u32 rsvd:19;
  614. };
  615. } __packed;
  616. #define INVALID_PIPELINE_ID 0xFF
  617. #define INVALID_NODE_ID \
  618. ((union avs_connector_node_id) { UINT_MAX })
  619. union avs_gtw_attributes {
  620. u32 val;
  621. struct {
  622. u32 lp_buffer_alloc:1;
  623. u32 rsvd:31;
  624. };
  625. } __packed;
  626. struct avs_copier_gtw_cfg {
  627. union avs_connector_node_id node_id;
  628. u32 dma_buffer_size;
  629. u32 config_length;
  630. struct {
  631. union avs_gtw_attributes attrs;
  632. u32 blob[];
  633. } config;
  634. } __packed;
  635. struct avs_copier_cfg {
  636. struct avs_modcfg_base base;
  637. struct avs_audio_format out_fmt;
  638. u32 feature_mask;
  639. struct avs_copier_gtw_cfg gtw_cfg;
  640. } __packed;
  641. struct avs_micsel_cfg {
  642. struct avs_modcfg_base base;
  643. struct avs_audio_format out_fmt;
  644. } __packed;
  645. struct avs_mux_cfg {
  646. struct avs_modcfg_base base;
  647. struct avs_audio_format ref_fmt;
  648. struct avs_audio_format out_fmt;
  649. } __packed;
  650. struct avs_updown_mixer_cfg {
  651. struct avs_modcfg_base base;
  652. u32 out_channel_config;
  653. u32 coefficients_select;
  654. s32 coefficients[AVS_CHANNELS_MAX];
  655. u32 channel_map;
  656. } __packed;
  657. struct avs_src_cfg {
  658. struct avs_modcfg_base base;
  659. u32 out_freq;
  660. } __packed;
  661. struct avs_probe_gtw_cfg {
  662. union avs_connector_node_id node_id;
  663. u32 dma_buffer_size;
  664. } __packed;
  665. struct avs_probe_cfg {
  666. struct avs_modcfg_base base;
  667. struct avs_probe_gtw_cfg gtw_cfg;
  668. } __packed;
  669. struct avs_aec_cfg {
  670. struct avs_modcfg_base base;
  671. struct avs_audio_format ref_fmt;
  672. struct avs_audio_format out_fmt;
  673. u32 cpc_lp_mode;
  674. } __packed;
  675. struct avs_asrc_cfg {
  676. struct avs_modcfg_base base;
  677. u32 out_freq;
  678. u32 rsvd0:1;
  679. u32 mode:1;
  680. u32 rsvd2:2;
  681. u32 disable_jitter_buffer:1;
  682. u32 rsvd3:27;
  683. } __packed;
  684. struct avs_wov_cfg {
  685. struct avs_modcfg_base base;
  686. u32 cpc_lp_mode;
  687. } __packed;
  688. /* Module runtime parameters */
  689. enum avs_copier_runtime_param {
  690. AVS_COPIER_SET_SINK_FORMAT = 2,
  691. };
  692. struct avs_copier_sink_format {
  693. u32 sink_id;
  694. struct avs_audio_format src_fmt;
  695. struct avs_audio_format sink_fmt;
  696. } __packed;
  697. int avs_ipc_copier_set_sink_format(struct avs_dev *adev, u16 module_id,
  698. u8 instance_id, u32 sink_id,
  699. const struct avs_audio_format *src_fmt,
  700. const struct avs_audio_format *sink_fmt);
  701. #endif /* __SOUND_SOC_INTEL_AVS_MSGS_H */