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 { 2725f414fcSCezary Rojewski AVS_GLB_ROM_CONTROL = 1, 28cb1eb6b5SCezary Rojewski AVS_GLB_LOAD_MULTIPLE_MODULES = 15, 29cb1eb6b5SCezary Rojewski AVS_GLB_UNLOAD_MULTIPLE_MODULES = 16, 30b956b27bSCezary Rojewski AVS_GLB_CREATE_PIPELINE = 17, 31b956b27bSCezary Rojewski AVS_GLB_DELETE_PIPELINE = 18, 32b956b27bSCezary Rojewski AVS_GLB_SET_PIPELINE_STATE = 19, 33b956b27bSCezary Rojewski AVS_GLB_GET_PIPELINE_STATE = 20, 34cb1eb6b5SCezary Rojewski AVS_GLB_LOAD_LIBRARY = 24, 352879516fSCezary Rojewski AVS_GLB_NOTIFICATION = 27, 362879516fSCezary Rojewski }; 372879516fSCezary Rojewski 382879516fSCezary Rojewski union avs_global_msg { 392879516fSCezary Rojewski u64 val; 402879516fSCezary Rojewski struct { 412879516fSCezary Rojewski union { 422879516fSCezary Rojewski u32 primary; 432879516fSCezary Rojewski struct { 442879516fSCezary Rojewski u32 rsvd:24; 452879516fSCezary Rojewski u32 global_msg_type:5; 462879516fSCezary Rojewski u32 msg_direction:1; 472879516fSCezary Rojewski u32 msg_target:1; 482879516fSCezary Rojewski }; 4925f414fcSCezary Rojewski /* set boot config */ 5025f414fcSCezary Rojewski struct { 5125f414fcSCezary Rojewski u32 rom_ctrl_msg_type:9; 5225f414fcSCezary Rojewski u32 dma_id:5; 5325f414fcSCezary Rojewski u32 purge_request:1; 5425f414fcSCezary Rojewski } boot_cfg; 55cb1eb6b5SCezary Rojewski /* module loading */ 56cb1eb6b5SCezary Rojewski struct { 57cb1eb6b5SCezary Rojewski u32 mod_cnt:8; 58cb1eb6b5SCezary Rojewski } load_multi_mods; 59b956b27bSCezary Rojewski /* pipeline management */ 60b956b27bSCezary Rojewski struct { 61b956b27bSCezary Rojewski u32 ppl_mem_size:11; 62b956b27bSCezary Rojewski u32 ppl_priority:5; 63b956b27bSCezary Rojewski u32 instance_id:8; 64b956b27bSCezary Rojewski } create_ppl; 65b956b27bSCezary Rojewski struct { 66b956b27bSCezary Rojewski u32 rsvd:16; 67b956b27bSCezary Rojewski u32 instance_id:8; 68b956b27bSCezary Rojewski } ppl; /* generic ppl request */ 69b956b27bSCezary Rojewski struct { 70b956b27bSCezary Rojewski u32 state:16; 71b956b27bSCezary Rojewski u32 ppl_id:8; 72b956b27bSCezary Rojewski } set_ppl_state; 73b956b27bSCezary Rojewski struct { 74b956b27bSCezary Rojewski u32 ppl_id:8; 75b956b27bSCezary Rojewski } get_ppl_state; 76cb1eb6b5SCezary Rojewski /* library loading */ 77cb1eb6b5SCezary Rojewski struct { 78cb1eb6b5SCezary Rojewski u32 dma_id:5; 79cb1eb6b5SCezary Rojewski u32 rsvd:11; 80cb1eb6b5SCezary Rojewski u32 lib_id:4; 81cb1eb6b5SCezary Rojewski } load_lib; 822879516fSCezary Rojewski }; 832879516fSCezary Rojewski union { 842879516fSCezary Rojewski u32 val; 85b956b27bSCezary Rojewski /* pipeline management */ 86b956b27bSCezary Rojewski struct { 87b956b27bSCezary Rojewski u32 lp:1; /* low power flag */ 88b956b27bSCezary Rojewski u32 rsvd:3; 89b956b27bSCezary Rojewski u32 attributes:16; /* additional scheduling flags */ 90b956b27bSCezary Rojewski } create_ppl; 912879516fSCezary Rojewski } ext; 922879516fSCezary Rojewski }; 932879516fSCezary Rojewski } __packed; 942879516fSCezary Rojewski 952879516fSCezary Rojewski struct avs_tlv { 962879516fSCezary Rojewski u32 type; 972879516fSCezary Rojewski u32 length; 982879516fSCezary Rojewski u32 value[]; 992879516fSCezary Rojewski } __packed; 1002879516fSCezary Rojewski 101f14a1c5aSCezary Rojewski enum avs_module_msg_type { 102f14a1c5aSCezary Rojewski AVS_MOD_INIT_INSTANCE = 0, 103f14a1c5aSCezary Rojewski AVS_MOD_LARGE_CONFIG_GET = 3, 104f14a1c5aSCezary Rojewski AVS_MOD_LARGE_CONFIG_SET = 4, 105f14a1c5aSCezary Rojewski AVS_MOD_BIND = 5, 106f14a1c5aSCezary Rojewski AVS_MOD_UNBIND = 6, 107469e87caSCezary Rojewski AVS_MOD_SET_DX = 7, 108469e87caSCezary Rojewski AVS_MOD_SET_D0IX = 8, 109f14a1c5aSCezary Rojewski AVS_MOD_DELETE_INSTANCE = 11, 110f14a1c5aSCezary Rojewski }; 111f14a1c5aSCezary Rojewski 1122879516fSCezary Rojewski union avs_module_msg { 1132879516fSCezary Rojewski u64 val; 1142879516fSCezary Rojewski struct { 1152879516fSCezary Rojewski union { 1162879516fSCezary Rojewski u32 primary; 1172879516fSCezary Rojewski struct { 1182879516fSCezary Rojewski u32 module_id:16; 1192879516fSCezary Rojewski u32 instance_id:8; 1202879516fSCezary Rojewski u32 module_msg_type:5; 1212879516fSCezary Rojewski u32 msg_direction:1; 1222879516fSCezary Rojewski u32 msg_target:1; 1232879516fSCezary Rojewski }; 1242879516fSCezary Rojewski }; 1252879516fSCezary Rojewski union { 1262879516fSCezary Rojewski u32 val; 127f14a1c5aSCezary Rojewski struct { 128f14a1c5aSCezary Rojewski u32 param_block_size:16; 129f14a1c5aSCezary Rojewski u32 ppl_instance_id:8; 130f14a1c5aSCezary Rojewski u32 core_id:4; 131f14a1c5aSCezary Rojewski u32 proc_domain:1; 132f14a1c5aSCezary Rojewski } init_instance; 133f14a1c5aSCezary Rojewski struct { 134f14a1c5aSCezary Rojewski u32 data_off_size:20; 135f14a1c5aSCezary Rojewski u32 large_param_id:8; 136f14a1c5aSCezary Rojewski u32 final_block:1; 137f14a1c5aSCezary Rojewski u32 init_block:1; 138f14a1c5aSCezary Rojewski } large_config; 139f14a1c5aSCezary Rojewski struct { 140f14a1c5aSCezary Rojewski u32 dst_module_id:16; 141f14a1c5aSCezary Rojewski u32 dst_instance_id:8; 142f14a1c5aSCezary Rojewski u32 dst_queue:3; 143f14a1c5aSCezary Rojewski u32 src_queue:3; 144f14a1c5aSCezary Rojewski } bind_unbind; 145469e87caSCezary Rojewski struct { 146469e87caSCezary Rojewski u32 wake:1; 147469e87caSCezary Rojewski u32 streaming:1; 148469e87caSCezary Rojewski } set_d0ix; 1492879516fSCezary Rojewski } ext; 1502879516fSCezary Rojewski }; 1512879516fSCezary Rojewski } __packed; 1522879516fSCezary Rojewski 1532879516fSCezary Rojewski union avs_reply_msg { 1542879516fSCezary Rojewski u64 val; 1552879516fSCezary Rojewski struct { 1562879516fSCezary Rojewski union { 1572879516fSCezary Rojewski u32 primary; 1582879516fSCezary Rojewski struct { 1592879516fSCezary Rojewski u32 status:24; 1602879516fSCezary Rojewski u32 global_msg_type:5; 1612879516fSCezary Rojewski u32 msg_direction:1; 1622879516fSCezary Rojewski u32 msg_target:1; 1632879516fSCezary Rojewski }; 1642879516fSCezary Rojewski }; 1652879516fSCezary Rojewski union { 1662879516fSCezary Rojewski u32 val; 167cb1eb6b5SCezary Rojewski /* module loading */ 168cb1eb6b5SCezary Rojewski struct { 169cb1eb6b5SCezary Rojewski u32 err_mod_id:16; 170cb1eb6b5SCezary Rojewski } load_multi_mods; 171b956b27bSCezary Rojewski /* pipeline management */ 172b956b27bSCezary Rojewski struct { 173b956b27bSCezary Rojewski u32 state:5; 174b956b27bSCezary Rojewski } get_ppl_state; 175f14a1c5aSCezary Rojewski /* module management */ 176f14a1c5aSCezary Rojewski struct { 177f14a1c5aSCezary Rojewski u32 data_off_size:20; 178f14a1c5aSCezary Rojewski u32 large_param_id:8; 179f14a1c5aSCezary Rojewski u32 final_block:1; 180f14a1c5aSCezary Rojewski u32 init_block:1; 181f14a1c5aSCezary Rojewski } large_config; 1822879516fSCezary Rojewski } ext; 1832879516fSCezary Rojewski }; 1842879516fSCezary Rojewski } __packed; 1852879516fSCezary Rojewski 1862879516fSCezary Rojewski enum avs_notify_msg_type { 1872879516fSCezary Rojewski AVS_NOTIFY_PHRASE_DETECTED = 4, 1882879516fSCezary Rojewski AVS_NOTIFY_RESOURCE_EVENT = 5, 1892879516fSCezary Rojewski AVS_NOTIFY_FW_READY = 8, 1902879516fSCezary Rojewski AVS_NOTIFY_MODULE_EVENT = 12, 1912879516fSCezary Rojewski }; 1922879516fSCezary Rojewski 1932879516fSCezary Rojewski union avs_notify_msg { 1942879516fSCezary Rojewski u64 val; 1952879516fSCezary Rojewski struct { 1962879516fSCezary Rojewski union { 1972879516fSCezary Rojewski u32 primary; 1982879516fSCezary Rojewski struct { 1992879516fSCezary Rojewski u32 rsvd:16; 2002879516fSCezary Rojewski u32 notify_msg_type:8; 2012879516fSCezary Rojewski u32 global_msg_type:5; 2022879516fSCezary Rojewski u32 msg_direction:1; 2032879516fSCezary Rojewski u32 msg_target:1; 2042879516fSCezary Rojewski }; 2052879516fSCezary Rojewski }; 2062879516fSCezary Rojewski union { 2072879516fSCezary Rojewski u32 val; 2082879516fSCezary Rojewski } ext; 2092879516fSCezary Rojewski }; 2102879516fSCezary Rojewski } __packed; 2112879516fSCezary Rojewski 2122879516fSCezary Rojewski #define AVS_MSG(hdr) { .val = hdr } 2132879516fSCezary Rojewski 2142879516fSCezary Rojewski #define AVS_GLOBAL_REQUEST(msg_type) \ 2152879516fSCezary Rojewski { \ 2162879516fSCezary Rojewski .global_msg_type = AVS_GLB_##msg_type, \ 2172879516fSCezary Rojewski .msg_direction = AVS_MSG_REQUEST, \ 2182879516fSCezary Rojewski .msg_target = AVS_FW_GEN_MSG, \ 2192879516fSCezary Rojewski } 2202879516fSCezary Rojewski 2212879516fSCezary Rojewski #define AVS_MODULE_REQUEST(msg_type) \ 2222879516fSCezary Rojewski { \ 2232879516fSCezary Rojewski .module_msg_type = AVS_MOD_##msg_type, \ 2242879516fSCezary Rojewski .msg_direction = AVS_MSG_REQUEST, \ 2252879516fSCezary Rojewski .msg_target = AVS_MOD_MSG, \ 2262879516fSCezary Rojewski } 2272879516fSCezary Rojewski 2282879516fSCezary Rojewski #define AVS_NOTIFICATION(msg_type) \ 2292879516fSCezary Rojewski { \ 2302879516fSCezary Rojewski .notify_msg_type = AVS_NOTIFY_##msg_type,\ 2312879516fSCezary Rojewski .global_msg_type = AVS_GLB_NOTIFICATION,\ 2322879516fSCezary Rojewski .msg_direction = AVS_MSG_REPLY, \ 2332879516fSCezary Rojewski .msg_target = AVS_FW_GEN_MSG, \ 2342879516fSCezary Rojewski } 2352879516fSCezary Rojewski 2362879516fSCezary Rojewski #define avs_msg_is_reply(hdr) \ 2372879516fSCezary Rojewski ({ \ 2382879516fSCezary Rojewski union avs_reply_msg __msg = AVS_MSG(hdr); \ 2392879516fSCezary Rojewski __msg.msg_direction == AVS_MSG_REPLY && \ 2402879516fSCezary Rojewski __msg.global_msg_type != AVS_GLB_NOTIFICATION; \ 2412879516fSCezary Rojewski }) 2422879516fSCezary Rojewski 2432879516fSCezary Rojewski /* Notification types */ 2442879516fSCezary Rojewski 2452879516fSCezary Rojewski struct avs_notify_voice_data { 2462879516fSCezary Rojewski u16 kpd_score; 2472879516fSCezary Rojewski u16 reserved; 2482879516fSCezary Rojewski } __packed; 2492879516fSCezary Rojewski 2502879516fSCezary Rojewski struct avs_notify_res_data { 2512879516fSCezary Rojewski u32 resource_type; 2522879516fSCezary Rojewski u32 resource_id; 2532879516fSCezary Rojewski u32 event_type; 2542879516fSCezary Rojewski u32 reserved; 2552879516fSCezary Rojewski u32 data[6]; 2562879516fSCezary Rojewski } __packed; 2572879516fSCezary Rojewski 2582879516fSCezary Rojewski struct avs_notify_mod_data { 2592879516fSCezary Rojewski u32 module_instance_id; 2602879516fSCezary Rojewski u32 event_id; 2612879516fSCezary Rojewski u32 data_size; 2622879516fSCezary Rojewski u32 data[]; 2632879516fSCezary Rojewski } __packed; 2642879516fSCezary Rojewski 26525f414fcSCezary Rojewski /* ROM messages */ 26625f414fcSCezary Rojewski enum avs_rom_control_msg_type { 26725f414fcSCezary Rojewski AVS_ROM_SET_BOOT_CONFIG = 0, 26825f414fcSCezary Rojewski }; 26925f414fcSCezary Rojewski 27025f414fcSCezary Rojewski int avs_ipc_set_boot_config(struct avs_dev *adev, u32 dma_id, u32 purge); 27125f414fcSCezary Rojewski 272cb1eb6b5SCezary Rojewski /* Code loading messages */ 273cb1eb6b5SCezary Rojewski int avs_ipc_load_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids); 274cb1eb6b5SCezary Rojewski int avs_ipc_unload_modules(struct avs_dev *adev, u16 *mod_ids, u32 num_mod_ids); 275cb1eb6b5SCezary Rojewski int avs_ipc_load_library(struct avs_dev *adev, u32 dma_id, u32 lib_id); 276cb1eb6b5SCezary Rojewski 277b956b27bSCezary Rojewski /* Pipeline management messages */ 278b956b27bSCezary Rojewski enum avs_pipeline_state { 279b956b27bSCezary Rojewski AVS_PPL_STATE_INVALID, 280b956b27bSCezary Rojewski AVS_PPL_STATE_UNINITIALIZED, 281b956b27bSCezary Rojewski AVS_PPL_STATE_RESET, 282b956b27bSCezary Rojewski AVS_PPL_STATE_PAUSED, 283b956b27bSCezary Rojewski AVS_PPL_STATE_RUNNING, 284b956b27bSCezary Rojewski }; 285b956b27bSCezary Rojewski 286b956b27bSCezary Rojewski int avs_ipc_create_pipeline(struct avs_dev *adev, u16 req_size, u8 priority, 287b956b27bSCezary Rojewski u8 instance_id, bool lp, u16 attributes); 288b956b27bSCezary Rojewski int avs_ipc_delete_pipeline(struct avs_dev *adev, u8 instance_id); 289b956b27bSCezary Rojewski int avs_ipc_set_pipeline_state(struct avs_dev *adev, u8 instance_id, 290b956b27bSCezary Rojewski enum avs_pipeline_state state); 291b956b27bSCezary Rojewski int avs_ipc_get_pipeline_state(struct avs_dev *adev, u8 instance_id, 292b956b27bSCezary Rojewski enum avs_pipeline_state *state); 293b956b27bSCezary Rojewski 294f14a1c5aSCezary Rojewski /* Module management messages */ 295f14a1c5aSCezary Rojewski int avs_ipc_init_instance(struct avs_dev *adev, u16 module_id, u8 instance_id, 296f14a1c5aSCezary Rojewski u8 ppl_id, u8 core_id, u8 domain, 297f14a1c5aSCezary Rojewski void *param, u32 param_size); 298f14a1c5aSCezary Rojewski int avs_ipc_delete_instance(struct avs_dev *adev, u16 module_id, u8 instance_id); 299f14a1c5aSCezary Rojewski int avs_ipc_bind(struct avs_dev *adev, u16 module_id, u8 instance_id, 300f14a1c5aSCezary Rojewski u16 dst_module_id, u8 dst_instance_id, 301f14a1c5aSCezary Rojewski u8 dst_queue, u8 src_queue); 302f14a1c5aSCezary Rojewski int avs_ipc_unbind(struct avs_dev *adev, u16 module_id, u8 instance_id, 303f14a1c5aSCezary Rojewski u16 dst_module_id, u8 dst_instance_id, 304f14a1c5aSCezary Rojewski u8 dst_queue, u8 src_queue); 305f14a1c5aSCezary Rojewski int avs_ipc_set_large_config(struct avs_dev *adev, u16 module_id, 306f14a1c5aSCezary Rojewski u8 instance_id, u8 param_id, 307f14a1c5aSCezary Rojewski u8 *request, size_t request_size); 308f14a1c5aSCezary Rojewski int avs_ipc_get_large_config(struct avs_dev *adev, u16 module_id, u8 instance_id, 309f14a1c5aSCezary Rojewski u8 param_id, u8 *request_data, size_t request_size, 310f14a1c5aSCezary Rojewski u8 **reply_data, size_t *reply_size); 311f14a1c5aSCezary Rojewski 312469e87caSCezary Rojewski /* DSP cores and domains power management messages */ 313469e87caSCezary Rojewski struct avs_dxstate_info { 314469e87caSCezary Rojewski u32 core_mask; /* which cores are subject for power transition */ 315469e87caSCezary Rojewski u32 dx_mask; /* bit[n]=1 core n goes to D0, bit[n]=0 it goes to D3 */ 316469e87caSCezary Rojewski } __packed; 317469e87caSCezary Rojewski 318469e87caSCezary Rojewski int avs_ipc_set_dx(struct avs_dev *adev, u32 core_mask, bool powerup); 319469e87caSCezary Rojewski int avs_ipc_set_d0ix(struct avs_dev *adev, bool enable_pg, bool streaming); 320469e87caSCezary Rojewski 321*3322e168SCezary Rojewski /* Base-firmware runtime parameters */ 322*3322e168SCezary Rojewski 323*3322e168SCezary Rojewski #define AVS_BASEFW_MOD_ID 0 324*3322e168SCezary Rojewski #define AVS_BASEFW_INST_ID 0 325*3322e168SCezary Rojewski 326*3322e168SCezary Rojewski enum avs_basefw_runtime_param { 327*3322e168SCezary Rojewski AVS_BASEFW_FIRMWARE_CONFIG = 7, 328*3322e168SCezary Rojewski AVS_BASEFW_HARDWARE_CONFIG = 8, 329*3322e168SCezary Rojewski AVS_BASEFW_MODULES_INFO = 9, 330*3322e168SCezary Rojewski AVS_BASEFW_LIBRARIES_INFO = 16, 331*3322e168SCezary Rojewski }; 332*3322e168SCezary Rojewski 333*3322e168SCezary Rojewski struct avs_fw_version { 334*3322e168SCezary Rojewski u16 major; 335*3322e168SCezary Rojewski u16 minor; 336*3322e168SCezary Rojewski u16 hotfix; 337*3322e168SCezary Rojewski u16 build; 338*3322e168SCezary Rojewski }; 339*3322e168SCezary Rojewski 340*3322e168SCezary Rojewski enum avs_fw_cfg_params { 341*3322e168SCezary Rojewski AVS_FW_CFG_FW_VERSION = 0, 342*3322e168SCezary Rojewski AVS_FW_CFG_MEMORY_RECLAIMED, 343*3322e168SCezary Rojewski AVS_FW_CFG_SLOW_CLOCK_FREQ_HZ, 344*3322e168SCezary Rojewski AVS_FW_CFG_FAST_CLOCK_FREQ_HZ, 345*3322e168SCezary Rojewski AVS_FW_CFG_DMA_BUFFER_CONFIG, 346*3322e168SCezary Rojewski AVS_FW_CFG_ALH_SUPPORT_LEVEL, 347*3322e168SCezary Rojewski AVS_FW_CFG_IPC_DL_MAILBOX_BYTES, 348*3322e168SCezary Rojewski AVS_FW_CFG_IPC_UL_MAILBOX_BYTES, 349*3322e168SCezary Rojewski AVS_FW_CFG_TRACE_LOG_BYTES, 350*3322e168SCezary Rojewski AVS_FW_CFG_MAX_PPL_COUNT, 351*3322e168SCezary Rojewski AVS_FW_CFG_MAX_ASTATE_COUNT, 352*3322e168SCezary Rojewski AVS_FW_CFG_MAX_MODULE_PIN_COUNT, 353*3322e168SCezary Rojewski AVS_FW_CFG_MODULES_COUNT, 354*3322e168SCezary Rojewski AVS_FW_CFG_MAX_MOD_INST_COUNT, 355*3322e168SCezary Rojewski AVS_FW_CFG_MAX_LL_TASKS_PER_PRI_COUNT, 356*3322e168SCezary Rojewski AVS_FW_CFG_LL_PRI_COUNT, 357*3322e168SCezary Rojewski AVS_FW_CFG_MAX_DP_TASKS_COUNT, 358*3322e168SCezary Rojewski AVS_FW_CFG_MAX_LIBS_COUNT, 359*3322e168SCezary Rojewski AVS_FW_CFG_SCHEDULER_CONFIG, 360*3322e168SCezary Rojewski AVS_FW_CFG_XTAL_FREQ_HZ, 361*3322e168SCezary Rojewski AVS_FW_CFG_CLOCKS_CONFIG, 362*3322e168SCezary Rojewski AVS_FW_CFG_RESERVED, 363*3322e168SCezary Rojewski AVS_FW_CFG_POWER_GATING_POLICY, 364*3322e168SCezary Rojewski AVS_FW_CFG_ASSERT_MODE, 365*3322e168SCezary Rojewski }; 366*3322e168SCezary Rojewski 367*3322e168SCezary Rojewski struct avs_fw_cfg { 368*3322e168SCezary Rojewski struct avs_fw_version fw_version; 369*3322e168SCezary Rojewski u32 memory_reclaimed; 370*3322e168SCezary Rojewski u32 slow_clock_freq_hz; 371*3322e168SCezary Rojewski u32 fast_clock_freq_hz; 372*3322e168SCezary Rojewski u32 alh_support; 373*3322e168SCezary Rojewski u32 ipc_dl_mailbox_bytes; 374*3322e168SCezary Rojewski u32 ipc_ul_mailbox_bytes; 375*3322e168SCezary Rojewski u32 trace_log_bytes; 376*3322e168SCezary Rojewski u32 max_ppl_count; 377*3322e168SCezary Rojewski u32 max_astate_count; 378*3322e168SCezary Rojewski u32 max_module_pin_count; 379*3322e168SCezary Rojewski u32 modules_count; 380*3322e168SCezary Rojewski u32 max_mod_inst_count; 381*3322e168SCezary Rojewski u32 max_ll_tasks_per_pri_count; 382*3322e168SCezary Rojewski u32 ll_pri_count; 383*3322e168SCezary Rojewski u32 max_dp_tasks_count; 384*3322e168SCezary Rojewski u32 max_libs_count; 385*3322e168SCezary Rojewski u32 xtal_freq_hz; 386*3322e168SCezary Rojewski u32 power_gating_policy; 387*3322e168SCezary Rojewski }; 388*3322e168SCezary Rojewski 389*3322e168SCezary Rojewski int avs_ipc_get_fw_config(struct avs_dev *adev, struct avs_fw_cfg *cfg); 390*3322e168SCezary Rojewski 391*3322e168SCezary Rojewski enum avs_hw_cfg_params { 392*3322e168SCezary Rojewski AVS_HW_CFG_AVS_VER, 393*3322e168SCezary Rojewski AVS_HW_CFG_DSP_CORES, 394*3322e168SCezary Rojewski AVS_HW_CFG_MEM_PAGE_BYTES, 395*3322e168SCezary Rojewski AVS_HW_CFG_TOTAL_PHYS_MEM_PAGES, 396*3322e168SCezary Rojewski AVS_HW_CFG_I2S_CAPS, 397*3322e168SCezary Rojewski AVS_HW_CFG_GPDMA_CAPS, 398*3322e168SCezary Rojewski AVS_HW_CFG_GATEWAY_COUNT, 399*3322e168SCezary Rojewski AVS_HW_CFG_HP_EBB_COUNT, 400*3322e168SCezary Rojewski AVS_HW_CFG_LP_EBB_COUNT, 401*3322e168SCezary Rojewski AVS_HW_CFG_EBB_SIZE_BYTES, 402*3322e168SCezary Rojewski }; 403*3322e168SCezary Rojewski 404*3322e168SCezary Rojewski enum avs_iface_version { 405*3322e168SCezary Rojewski AVS_AVS_VER_1_5 = 0x10005, 406*3322e168SCezary Rojewski AVS_AVS_VER_1_8 = 0x10008, 407*3322e168SCezary Rojewski }; 408*3322e168SCezary Rojewski 409*3322e168SCezary Rojewski enum avs_i2s_version { 410*3322e168SCezary Rojewski AVS_I2S_VER_15_SKYLAKE = 0x00000, 411*3322e168SCezary Rojewski AVS_I2S_VER_15_BROXTON = 0x10000, 412*3322e168SCezary Rojewski AVS_I2S_VER_15_BROXTON_P = 0x20000, 413*3322e168SCezary Rojewski AVS_I2S_VER_18_KBL_CNL = 0x30000, 414*3322e168SCezary Rojewski }; 415*3322e168SCezary Rojewski 416*3322e168SCezary Rojewski struct avs_i2s_caps { 417*3322e168SCezary Rojewski u32 i2s_version; 418*3322e168SCezary Rojewski u32 ctrl_count; 419*3322e168SCezary Rojewski u32 *ctrl_base_addr; 420*3322e168SCezary Rojewski }; 421*3322e168SCezary Rojewski 422*3322e168SCezary Rojewski struct avs_hw_cfg { 423*3322e168SCezary Rojewski u32 avs_version; 424*3322e168SCezary Rojewski u32 dsp_cores; 425*3322e168SCezary Rojewski u32 mem_page_bytes; 426*3322e168SCezary Rojewski u32 total_phys_mem_pages; 427*3322e168SCezary Rojewski struct avs_i2s_caps i2s_caps; 428*3322e168SCezary Rojewski u32 gateway_count; 429*3322e168SCezary Rojewski u32 hp_ebb_count; 430*3322e168SCezary Rojewski u32 lp_ebb_count; 431*3322e168SCezary Rojewski u32 ebb_size_bytes; 432*3322e168SCezary Rojewski }; 433*3322e168SCezary Rojewski 434*3322e168SCezary Rojewski int avs_ipc_get_hw_config(struct avs_dev *adev, struct avs_hw_cfg *cfg); 435*3322e168SCezary Rojewski 436*3322e168SCezary Rojewski #define AVS_MODULE_LOAD_TYPE_BUILTIN 0 437*3322e168SCezary Rojewski #define AVS_MODULE_LOAD_TYPE_LOADABLE 1 438*3322e168SCezary Rojewski #define AVS_MODULE_STATE_LOADED BIT(0) 439*3322e168SCezary Rojewski 440*3322e168SCezary Rojewski struct avs_module_type { 441*3322e168SCezary Rojewski u32 load_type:4; 442*3322e168SCezary Rojewski u32 auto_start:1; 443*3322e168SCezary Rojewski u32 domain_ll:1; 444*3322e168SCezary Rojewski u32 domain_dp:1; 445*3322e168SCezary Rojewski u32 lib_code:1; 446*3322e168SCezary Rojewski u32 rsvd:24; 447*3322e168SCezary Rojewski } __packed; 448*3322e168SCezary Rojewski 449*3322e168SCezary Rojewski union avs_segment_flags { 450*3322e168SCezary Rojewski u32 ul; 451*3322e168SCezary Rojewski struct { 452*3322e168SCezary Rojewski u32 contents:1; 453*3322e168SCezary Rojewski u32 alloc:1; 454*3322e168SCezary Rojewski u32 load:1; 455*3322e168SCezary Rojewski u32 readonly:1; 456*3322e168SCezary Rojewski u32 code:1; 457*3322e168SCezary Rojewski u32 data:1; 458*3322e168SCezary Rojewski u32 rsvd_1:2; 459*3322e168SCezary Rojewski u32 type:4; 460*3322e168SCezary Rojewski u32 rsvd_2:4; 461*3322e168SCezary Rojewski u32 length:16; 462*3322e168SCezary Rojewski }; 463*3322e168SCezary Rojewski } __packed; 464*3322e168SCezary Rojewski 465*3322e168SCezary Rojewski struct avs_segment_desc { 466*3322e168SCezary Rojewski union avs_segment_flags flags; 467*3322e168SCezary Rojewski u32 v_base_addr; 468*3322e168SCezary Rojewski u32 file_offset; 469*3322e168SCezary Rojewski } __packed; 470*3322e168SCezary Rojewski 471*3322e168SCezary Rojewski struct avs_module_entry { 472*3322e168SCezary Rojewski u16 module_id; 473*3322e168SCezary Rojewski u16 state_flags; 474*3322e168SCezary Rojewski u8 name[8]; 475*3322e168SCezary Rojewski guid_t uuid; 476*3322e168SCezary Rojewski struct avs_module_type type; 477*3322e168SCezary Rojewski u8 hash[32]; 478*3322e168SCezary Rojewski u32 entry_point; 479*3322e168SCezary Rojewski u16 cfg_offset; 480*3322e168SCezary Rojewski u16 cfg_count; 481*3322e168SCezary Rojewski u32 affinity_mask; 482*3322e168SCezary Rojewski u16 instance_max_count; 483*3322e168SCezary Rojewski u16 instance_bss_size; 484*3322e168SCezary Rojewski struct avs_segment_desc segments[3]; 485*3322e168SCezary Rojewski } __packed; 486*3322e168SCezary Rojewski 487*3322e168SCezary Rojewski struct avs_mods_info { 488*3322e168SCezary Rojewski u32 count; 489*3322e168SCezary Rojewski struct avs_module_entry entries[]; 490*3322e168SCezary Rojewski } __packed; 491*3322e168SCezary Rojewski 492*3322e168SCezary Rojewski static inline bool avs_module_entry_is_loaded(struct avs_module_entry *mentry) 493*3322e168SCezary Rojewski { 494*3322e168SCezary Rojewski return mentry->type.load_type == AVS_MODULE_LOAD_TYPE_BUILTIN || 495*3322e168SCezary Rojewski mentry->state_flags & AVS_MODULE_STATE_LOADED; 496*3322e168SCezary Rojewski } 497*3322e168SCezary Rojewski 498*3322e168SCezary Rojewski int avs_ipc_get_modules_info(struct avs_dev *adev, struct avs_mods_info **info); 499*3322e168SCezary Rojewski 5002879516fSCezary Rojewski #endif /* __SOUND_SOC_INTEL_AVS_MSGS_H */ 501