1ed85a6e6SPeter Ujfalusi /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 2ed85a6e6SPeter Ujfalusi /* 3ed85a6e6SPeter Ujfalusi * This file is provided under a dual BSD/GPLv2 license. When using or 4ed85a6e6SPeter Ujfalusi * redistributing this file, you may do so under either license. 5ed85a6e6SPeter Ujfalusi * 6ea89a742SPierre-Louis Bossart * Copyright(c) 2022 Intel Corporation 7ed85a6e6SPeter Ujfalusi */ 8ed85a6e6SPeter Ujfalusi 9ed85a6e6SPeter Ujfalusi #ifndef __INCLUDE_SOUND_SOF_IPC4_HEADER_H__ 10ed85a6e6SPeter Ujfalusi #define __INCLUDE_SOUND_SOF_IPC4_HEADER_H__ 11ed85a6e6SPeter Ujfalusi 12ed85a6e6SPeter Ujfalusi #include <linux/types.h> 13ed85a6e6SPeter Ujfalusi #include <uapi/sound/sof/abi.h> 14ed85a6e6SPeter Ujfalusi 15ed85a6e6SPeter Ujfalusi /* maximum message size for mailbox Tx/Rx */ 16ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MSG_MAX_SIZE 4096 17ed85a6e6SPeter Ujfalusi 18ed85a6e6SPeter Ujfalusi /** \addtogroup sof_uapi uAPI 19ed85a6e6SPeter Ujfalusi * SOF uAPI specification. 20ed85a6e6SPeter Ujfalusi * @{ 21ed85a6e6SPeter Ujfalusi */ 22ed85a6e6SPeter Ujfalusi 23ed85a6e6SPeter Ujfalusi /** 24ed85a6e6SPeter Ujfalusi * struct sof_ipc4_msg - Placeholder of an IPC4 message 25ed85a6e6SPeter Ujfalusi * @header_u64: IPC4 header as single u64 number 26ed85a6e6SPeter Ujfalusi * @primary: Primary, mandatory part of the header 27ed85a6e6SPeter Ujfalusi * @extension: Extended part of the header, if not used it should be 28ed85a6e6SPeter Ujfalusi * set to 0 29ed85a6e6SPeter Ujfalusi * @data_size: Size of data in bytes pointed by @data_ptr 30ed85a6e6SPeter Ujfalusi * @data_ptr: Pointer to the optional payload of a message 31ed85a6e6SPeter Ujfalusi */ 32ed85a6e6SPeter Ujfalusi struct sof_ipc4_msg { 33ed85a6e6SPeter Ujfalusi union { 34ed85a6e6SPeter Ujfalusi u64 header_u64; 35ed85a6e6SPeter Ujfalusi struct { 36ed85a6e6SPeter Ujfalusi u32 primary; 37ed85a6e6SPeter Ujfalusi u32 extension; 38ed85a6e6SPeter Ujfalusi }; 39ed85a6e6SPeter Ujfalusi }; 40ed85a6e6SPeter Ujfalusi 41ed85a6e6SPeter Ujfalusi size_t data_size; 42ed85a6e6SPeter Ujfalusi void *data_ptr; 43ed85a6e6SPeter Ujfalusi }; 44ed85a6e6SPeter Ujfalusi 45ed85a6e6SPeter Ujfalusi /** 46ed85a6e6SPeter Ujfalusi * struct sof_ipc4_tuple - Generic type/ID and parameter tuple 47ed85a6e6SPeter Ujfalusi * @type: type/ID 48ed85a6e6SPeter Ujfalusi * @size: size of the @value array in bytes 49ed85a6e6SPeter Ujfalusi * @value: value for the given type 50ed85a6e6SPeter Ujfalusi */ 51ed85a6e6SPeter Ujfalusi struct sof_ipc4_tuple { 52ed85a6e6SPeter Ujfalusi uint32_t type; 53ed85a6e6SPeter Ujfalusi uint32_t size; 54ed85a6e6SPeter Ujfalusi uint32_t value[]; 55ed85a6e6SPeter Ujfalusi } __packed; 56ed85a6e6SPeter Ujfalusi 57ed85a6e6SPeter Ujfalusi /* 58ed85a6e6SPeter Ujfalusi * IPC4 messages have two 32 bit identifier made up as follows :- 59ed85a6e6SPeter Ujfalusi * 60ed85a6e6SPeter Ujfalusi * header - msg type, msg id, msg direction ... 61ed85a6e6SPeter Ujfalusi * extension - extra params such as msg data size in mailbox 62ed85a6e6SPeter Ujfalusi * 63ed85a6e6SPeter Ujfalusi * These are sent at the start of the IPC message in the mailbox. Messages 64ed85a6e6SPeter Ujfalusi * should not be sent in the doorbell (special exceptions for firmware). 65ed85a6e6SPeter Ujfalusi */ 66ed85a6e6SPeter Ujfalusi 67ed85a6e6SPeter Ujfalusi /* 68ed85a6e6SPeter Ujfalusi * IPC4 primary header bit allocation for messages 69ed85a6e6SPeter Ujfalusi * bit 0-23: message type specific 70ed85a6e6SPeter Ujfalusi * bit 24-28: type: enum sof_ipc4_global_msg if target is SOF_IPC4_FW_GEN_MSG 71ed85a6e6SPeter Ujfalusi * enum sof_ipc4_module_type if target is SOF_IPC4_MODULE_MSG 72ed85a6e6SPeter Ujfalusi * bit 29: response - sof_ipc4_msg_dir 73ed85a6e6SPeter Ujfalusi * bit 30: target - enum sof_ipc4_msg_target 74ed85a6e6SPeter Ujfalusi * bit 31: reserved, unused 75ed85a6e6SPeter Ujfalusi */ 76ed85a6e6SPeter Ujfalusi 77ed85a6e6SPeter Ujfalusi /* Value of target field - must fit into 1 bit */ 78ed85a6e6SPeter Ujfalusi enum sof_ipc4_msg_target { 79ed85a6e6SPeter Ujfalusi /* Global FW message */ 80ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_GEN_MSG, 81ed85a6e6SPeter Ujfalusi 82ed85a6e6SPeter Ujfalusi /* Module message */ 83ed85a6e6SPeter Ujfalusi SOF_IPC4_MODULE_MSG 84ed85a6e6SPeter Ujfalusi }; 85ed85a6e6SPeter Ujfalusi 86ed85a6e6SPeter Ujfalusi /* Value of type field - must fit into 5 bits */ 87ed85a6e6SPeter Ujfalusi enum sof_ipc4_global_msg { 88ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_BOOT_CONFIG, 89ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_ROM_CONTROL, 90ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_IPCGATEWAY_CMD, 91ed85a6e6SPeter Ujfalusi 92ed85a6e6SPeter Ujfalusi /* 3 .. 12: RESERVED - do not use */ 93ed85a6e6SPeter Ujfalusi 94ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_PERF_MEASUREMENTS_CMD = 13, 95ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_CHAIN_DMA, 96ed85a6e6SPeter Ujfalusi 97ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_LOAD_MULTIPLE_MODULES, 98ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_UNLOAD_MULTIPLE_MODULES, 99ed85a6e6SPeter Ujfalusi 100ed85a6e6SPeter Ujfalusi /* pipeline settings */ 101ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_CREATE_PIPELINE, 102ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_DELETE_PIPELINE, 103ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_SET_PIPELINE_STATE, 104ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_GET_PIPELINE_STATE, 105ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_GET_PIPELINE_CONTEXT_SIZE, 106ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_SAVE_PIPELINE, 107ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_RESTORE_PIPELINE, 108ed85a6e6SPeter Ujfalusi 1094f0f3c77SPeter Ujfalusi /* 1104f0f3c77SPeter Ujfalusi * library loading 1114f0f3c77SPeter Ujfalusi * 1124f0f3c77SPeter Ujfalusi * Loads library (using Code Load or HD/A Host Output DMA) 1134f0f3c77SPeter Ujfalusi */ 114ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_LOAD_LIBRARY, 1154f0f3c77SPeter Ujfalusi /* 1164f0f3c77SPeter Ujfalusi * Prepare the host DMA channel for library loading, must be followed by 1174f0f3c77SPeter Ujfalusi * a SOF_IPC4_GLB_LOAD_LIBRARY message as the library loading step 1184f0f3c77SPeter Ujfalusi */ 1194f0f3c77SPeter Ujfalusi SOF_IPC4_GLB_LOAD_LIBRARY_PREPARE, 120ed85a6e6SPeter Ujfalusi 1214f0f3c77SPeter Ujfalusi SOF_IPC4_GLB_INTERNAL_MESSAGE, 122ed85a6e6SPeter Ujfalusi 123ed85a6e6SPeter Ujfalusi /* Notification (FW to SW driver) */ 124ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_NOTIFICATION, 125ed85a6e6SPeter Ujfalusi 126ed85a6e6SPeter Ujfalusi /* 28 .. 31: RESERVED - do not use */ 127ed85a6e6SPeter Ujfalusi 128ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_TYPE_LAST, 129ed85a6e6SPeter Ujfalusi }; 130ed85a6e6SPeter Ujfalusi 131ed85a6e6SPeter Ujfalusi /* Value of response field - must fit into 1 bit */ 132ed85a6e6SPeter Ujfalusi enum sof_ipc4_msg_dir { 133ed85a6e6SPeter Ujfalusi SOF_IPC4_MSG_REQUEST, 134ed85a6e6SPeter Ujfalusi SOF_IPC4_MSG_REPLY, 135ed85a6e6SPeter Ujfalusi }; 136ed85a6e6SPeter Ujfalusi 137ed85a6e6SPeter Ujfalusi enum sof_ipc4_pipeline_state { 138ed85a6e6SPeter Ujfalusi SOF_IPC4_PIPE_INVALID_STATE, 139ed85a6e6SPeter Ujfalusi SOF_IPC4_PIPE_UNINITIALIZED, 140ed85a6e6SPeter Ujfalusi SOF_IPC4_PIPE_RESET, 141ed85a6e6SPeter Ujfalusi SOF_IPC4_PIPE_PAUSED, 142ed85a6e6SPeter Ujfalusi SOF_IPC4_PIPE_RUNNING, 143ed85a6e6SPeter Ujfalusi SOF_IPC4_PIPE_EOS 144ed85a6e6SPeter Ujfalusi }; 145ed85a6e6SPeter Ujfalusi 146ed85a6e6SPeter Ujfalusi /* Generic message fields (bit 24-30) */ 147ed85a6e6SPeter Ujfalusi 148ed85a6e6SPeter Ujfalusi /* encoded to header's msg_tgt field */ 149ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MSG_TARGET_SHIFT 30 150ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MSG_TARGET_MASK BIT(30) 151ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MSG_TARGET(x) ((x) << SOF_IPC4_MSG_TARGET_SHIFT) 152ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MSG_IS_MODULE_MSG(x) ((x) & SOF_IPC4_MSG_TARGET_MASK ? 1 : 0) 153ed85a6e6SPeter Ujfalusi 154ed85a6e6SPeter Ujfalusi /* encoded to header's rsp field */ 155ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MSG_DIR_SHIFT 29 156ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MSG_DIR_MASK BIT(29) 157ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MSG_DIR(x) ((x) << SOF_IPC4_MSG_DIR_SHIFT) 158ed85a6e6SPeter Ujfalusi 159ed85a6e6SPeter Ujfalusi /* encoded to header's type field */ 160ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MSG_TYPE_SHIFT 24 161ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MSG_TYPE_MASK GENMASK(28, 24) 162ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MSG_TYPE_SET(x) (((x) << SOF_IPC4_MSG_TYPE_SHIFT) & \ 163ed85a6e6SPeter Ujfalusi SOF_IPC4_MSG_TYPE_MASK) 164ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MSG_TYPE_GET(x) (((x) & SOF_IPC4_MSG_TYPE_MASK) >> \ 165ed85a6e6SPeter Ujfalusi SOF_IPC4_MSG_TYPE_SHIFT) 166ed85a6e6SPeter Ujfalusi 167ed85a6e6SPeter Ujfalusi /* Global message type specific field definitions */ 168ed85a6e6SPeter Ujfalusi 169ed85a6e6SPeter Ujfalusi /* pipeline creation ipc msg */ 170ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_INSTANCE_SHIFT 16 171ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_INSTANCE_MASK GENMASK(23, 16) 172ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_INSTANCE_ID(x) ((x) << SOF_IPC4_GLB_PIPE_INSTANCE_SHIFT) 173ed85a6e6SPeter Ujfalusi 174ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_PRIORITY_SHIFT 11 175ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_PRIORITY_MASK GENMASK(15, 11) 176ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_PRIORITY(x) ((x) << SOF_IPC4_GLB_PIPE_PRIORITY_SHIFT) 177ed85a6e6SPeter Ujfalusi 178ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_MEM_SIZE_SHIFT 0 179ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_MEM_SIZE_MASK GENMASK(10, 0) 180ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_MEM_SIZE(x) ((x) << SOF_IPC4_GLB_PIPE_MEM_SIZE_SHIFT) 181ed85a6e6SPeter Ujfalusi 182ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_EXT_LP_SHIFT 0 183ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_EXT_LP_MASK BIT(0) 184ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_EXT_LP(x) ((x) << SOF_IPC4_GLB_PIPE_EXT_LP_SHIFT) 185ed85a6e6SPeter Ujfalusi 18611f45690SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_EXT_CORE_ID_SHIFT 20 18711f45690SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_EXT_CORE_ID_MASK GENMASK(23, 20) 18811f45690SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_EXT_CORE_ID(x) ((x) << SOF_IPC4_GLB_PIPE_EXT_CORE_ID_SHIFT) 18911f45690SPeter Ujfalusi 190ed85a6e6SPeter Ujfalusi /* pipeline set state ipc msg */ 191ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_STATE_ID_SHIFT 16 192ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_STATE_ID_MASK GENMASK(23, 16) 193ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_STATE_ID(x) ((x) << SOF_IPC4_GLB_PIPE_STATE_ID_SHIFT) 194ed85a6e6SPeter Ujfalusi 195ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_STATE_SHIFT 0 196ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_STATE_MASK GENMASK(15, 0) 197ed85a6e6SPeter Ujfalusi #define SOF_IPC4_GLB_PIPE_STATE(x) ((x) << SOF_IPC4_GLB_PIPE_STATE_SHIFT) 198ed85a6e6SPeter Ujfalusi 1992d271af1SRanjani Sridharan /* pipeline set state IPC msg extension */ 2002d271af1SRanjani Sridharan #define SOF_IPC4_GLB_PIPE_STATE_EXT_MULTI BIT(0) 2012d271af1SRanjani Sridharan 2023ab2c21eSPeter Ujfalusi /* load library ipc msg */ 2033ab2c21eSPeter Ujfalusi #define SOF_IPC4_GLB_LOAD_LIBRARY_LIB_ID_SHIFT 16 2043ab2c21eSPeter Ujfalusi #define SOF_IPC4_GLB_LOAD_LIBRARY_LIB_ID(x) ((x) << SOF_IPC4_GLB_LOAD_LIBRARY_LIB_ID_SHIFT) 2053ab2c21eSPeter Ujfalusi 206cb3cdef3SJyri Sarha /* chain dma ipc message */ 207cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_HOST_ID_SHIFT 0 208cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_HOST_ID_MASK GENMASK(4, 0) 209cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_HOST_ID(x) (((x) << SOF_IPC4_GLB_CHAIN_DMA_HOST_ID_SHIFT) & \ 210cb3cdef3SJyri Sarha SOF_IPC4_GLB_CHAIN_DMA_HOST_ID_MASK) 211cb3cdef3SJyri Sarha 212cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_LINK_ID_SHIFT 8 213cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_LINK_ID_MASK GENMASK(12, 8) 214cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_LINK_ID(x) (((x) << SOF_IPC4_GLB_CHAIN_DMA_LINK_ID_SHIFT) & \ 215cb3cdef3SJyri Sarha SOF_IPC4_GLB_CHAIN_DMA_LINK_ID_MASK) 216cb3cdef3SJyri Sarha 217cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_ALLOCATE_SHIFT 16 218cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_ALLOCATE_MASK BIT(16) 219cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_ALLOCATE(x) (((x) & 1) << SOF_IPC4_GLB_CHAIN_DMA_ALLOCATE_SHIFT) 220cb3cdef3SJyri Sarha 221cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_ENABLE_SHIFT 17 222cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_ENABLE_MASK BIT(17) 223cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_ENABLE(x) (((x) & 1) << SOF_IPC4_GLB_CHAIN_DMA_ENABLE_SHIFT) 224cb3cdef3SJyri Sarha 225cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_SCS_SHIFT 18 226cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_SCS_MASK BIT(18) 227cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_CHAIN_DMA_SCS(x) (((x) & 1) << SOF_IPC4_GLB_CHAIN_DMA_SCS_SHIFT) 228cb3cdef3SJyri Sarha 229cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_EXT_CHAIN_DMA_FIFO_SIZE_SHIFT 0 230cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_EXT_CHAIN_DMA_FIFO_SIZE_MASK GENMASK(24, 0) 231cb3cdef3SJyri Sarha #define SOF_IPC4_GLB_EXT_CHAIN_DMA_FIFO_SIZE(x) (((x) << \ 232cb3cdef3SJyri Sarha SOF_IPC4_GLB_EXT_CHAIN_DMA_FIFO_SIZE_SHIFT) & \ 233cb3cdef3SJyri Sarha SOF_IPC4_GLB_EXT_CHAIN_DMA_FIFO_SIZE_MASK) 234cb3cdef3SJyri Sarha 235ed85a6e6SPeter Ujfalusi enum sof_ipc4_channel_config { 236ed85a6e6SPeter Ujfalusi /* one channel only. */ 237ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNEL_CONFIG_MONO, 238ed85a6e6SPeter Ujfalusi /* L & R. */ 239ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNEL_CONFIG_STEREO, 240ed85a6e6SPeter Ujfalusi /* L, R & LFE; PCM only. */ 241ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNEL_CONFIG_2_POINT_1, 242ed85a6e6SPeter Ujfalusi /* L, C & R; MP3 & AAC only. */ 243ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNEL_CONFIG_3_POINT_0, 244ed85a6e6SPeter Ujfalusi /* L, C, R & LFE; PCM only. */ 245ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNEL_CONFIG_3_POINT_1, 246ed85a6e6SPeter Ujfalusi /* L, R, Ls & Rs; PCM only. */ 247ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNEL_CONFIG_QUATRO, 248ed85a6e6SPeter Ujfalusi /* L, C, R & Cs; MP3 & AAC only. */ 249ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNEL_CONFIG_4_POINT_0, 250ed85a6e6SPeter Ujfalusi /* L, C, R, Ls & Rs. */ 251ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNEL_CONFIG_5_POINT_0, 252ed85a6e6SPeter Ujfalusi /* L, C, R, Ls, Rs & LFE. */ 253ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNEL_CONFIG_5_POINT_1, 254ed85a6e6SPeter Ujfalusi /* one channel replicated in two. */ 255ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNEL_CONFIG_DUAL_MONO, 256ed85a6e6SPeter Ujfalusi /* Stereo (L,R) in 4 slots, 1st stream: [ L, R, -, - ] */ 257ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNEL_CONFIG_I2S_DUAL_STEREO_0, 258ed85a6e6SPeter Ujfalusi /* Stereo (L,R) in 4 slots, 2nd stream: [ -, -, L, R ] */ 259ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNEL_CONFIG_I2S_DUAL_STEREO_1, 260ed85a6e6SPeter Ujfalusi /* L, C, R, Ls, Rs & LFE., LS, RS */ 261ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNEL_CONFIG_7_POINT_1, 262ed85a6e6SPeter Ujfalusi }; 263ed85a6e6SPeter Ujfalusi 264ed85a6e6SPeter Ujfalusi enum sof_ipc4_interleaved_style { 265ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNELS_INTERLEAVED, 266ed85a6e6SPeter Ujfalusi SOF_IPC4_CHANNELS_NONINTERLEAVED, 267ed85a6e6SPeter Ujfalusi }; 268ed85a6e6SPeter Ujfalusi 269ed85a6e6SPeter Ujfalusi enum sof_ipc4_sample_type { 270ed85a6e6SPeter Ujfalusi SOF_IPC4_MSB_INTEGER, /* integer with Most Significant Byte first */ 271ed85a6e6SPeter Ujfalusi SOF_IPC4_LSB_INTEGER, /* integer with Least Significant Byte first */ 272ed85a6e6SPeter Ujfalusi }; 273ed85a6e6SPeter Ujfalusi 274ed85a6e6SPeter Ujfalusi struct sof_ipc4_audio_format { 275ed85a6e6SPeter Ujfalusi uint32_t sampling_frequency; 276ed85a6e6SPeter Ujfalusi uint32_t bit_depth; 277ed85a6e6SPeter Ujfalusi uint32_t ch_map; 278ed85a6e6SPeter Ujfalusi uint32_t ch_cfg; /* sof_ipc4_channel_config */ 279ed85a6e6SPeter Ujfalusi uint32_t interleaving_style; 280ed85a6e6SPeter Ujfalusi uint32_t fmt_cfg; /* channels_count valid_bit_depth s_type */ 281ed85a6e6SPeter Ujfalusi } __packed __aligned(4); 282ed85a6e6SPeter Ujfalusi 283ed85a6e6SPeter Ujfalusi #define SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT_SHIFT 0 284ed85a6e6SPeter Ujfalusi #define SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT_MASK GENMASK(7, 0) 285ed85a6e6SPeter Ujfalusi #define SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(x) \ 286ed85a6e6SPeter Ujfalusi ((x) & SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT_MASK) 287ed85a6e6SPeter Ujfalusi #define SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH_SHIFT 8 288ed85a6e6SPeter Ujfalusi #define SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH_MASK GENMASK(15, 8) 289ed85a6e6SPeter Ujfalusi #define SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(x) \ 290ed85a6e6SPeter Ujfalusi (((x) & SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH_MASK) >> \ 291ed85a6e6SPeter Ujfalusi SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH_SHIFT) 292ed85a6e6SPeter Ujfalusi #define SOF_IPC4_AUDIO_FORMAT_CFG_SAMPLE_TYPE_SHIFT 16 293ed85a6e6SPeter Ujfalusi #define SOF_IPC4_AUDIO_FORMAT_CFG_SAMPLE_TYPE_MASK GENMASK(23, 16) 294ed85a6e6SPeter Ujfalusi #define SOF_IPC4_AUDIO_FORMAT_CFG_SAMPLE_TYPE(x) \ 295ed85a6e6SPeter Ujfalusi (((x) & SOF_IPC4_AUDIO_FORMAT_CFG_SAMPLE_TYPE_MASK) >> \ 296ed85a6e6SPeter Ujfalusi SOF_IPC4_AUDIO_FORMAT_CFG_SAMPLE_TYPE_SHIFT) 297ed85a6e6SPeter Ujfalusi 298ed85a6e6SPeter Ujfalusi /* Module message type specific field definitions */ 299ed85a6e6SPeter Ujfalusi 300ed85a6e6SPeter Ujfalusi enum sof_ipc4_module_type { 301ed85a6e6SPeter Ujfalusi SOF_IPC4_MOD_INIT_INSTANCE, 302ed85a6e6SPeter Ujfalusi SOF_IPC4_MOD_CONFIG_GET, 303ed85a6e6SPeter Ujfalusi SOF_IPC4_MOD_CONFIG_SET, 304ed85a6e6SPeter Ujfalusi SOF_IPC4_MOD_LARGE_CONFIG_GET, 305ed85a6e6SPeter Ujfalusi SOF_IPC4_MOD_LARGE_CONFIG_SET, 306ed85a6e6SPeter Ujfalusi SOF_IPC4_MOD_BIND, 307ed85a6e6SPeter Ujfalusi SOF_IPC4_MOD_UNBIND, 308ed85a6e6SPeter Ujfalusi SOF_IPC4_MOD_SET_DX, 309ed85a6e6SPeter Ujfalusi SOF_IPC4_MOD_SET_D0IX, 310ed85a6e6SPeter Ujfalusi SOF_IPC4_MOD_ENTER_MODULE_RESTORE, 311ed85a6e6SPeter Ujfalusi SOF_IPC4_MOD_EXIT_MODULE_RESTORE, 312ed85a6e6SPeter Ujfalusi SOF_IPC4_MOD_DELETE_INSTANCE, 313ed85a6e6SPeter Ujfalusi 314ed85a6e6SPeter Ujfalusi SOF_IPC4_MOD_TYPE_LAST, 315ed85a6e6SPeter Ujfalusi }; 316ed85a6e6SPeter Ujfalusi 317ed85a6e6SPeter Ujfalusi struct sof_ipc4_base_module_cfg { 318ed85a6e6SPeter Ujfalusi uint32_t cpc; /* the max count of Cycles Per Chunk processing */ 319ed85a6e6SPeter Ujfalusi uint32_t ibs; /* input Buffer Size (in bytes) */ 320ed85a6e6SPeter Ujfalusi uint32_t obs; /* output Buffer Size (in bytes) */ 321ed85a6e6SPeter Ujfalusi uint32_t is_pages; /* number of physical pages used */ 322ed85a6e6SPeter Ujfalusi struct sof_ipc4_audio_format audio_fmt; 323ed85a6e6SPeter Ujfalusi } __packed __aligned(4); 324ed85a6e6SPeter Ujfalusi 325ed85a6e6SPeter Ujfalusi /* common module ipc msg */ 326ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_INSTANCE_SHIFT 16 327ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_INSTANCE_MASK GENMASK(23, 16) 328ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_INSTANCE(x) ((x) << SOF_IPC4_MOD_INSTANCE_SHIFT) 329ed85a6e6SPeter Ujfalusi 330ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_ID_SHIFT 0 331ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_ID_MASK GENMASK(15, 0) 332ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_ID(x) ((x) << SOF_IPC4_MOD_ID_SHIFT) 333ed85a6e6SPeter Ujfalusi 334ed85a6e6SPeter Ujfalusi /* init module ipc msg */ 335ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_PARAM_SIZE_SHIFT 0 336ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_PARAM_SIZE_MASK GENMASK(15, 0) 337ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_PARAM_SIZE(x) ((x) << SOF_IPC4_MOD_EXT_PARAM_SIZE_SHIFT) 338ed85a6e6SPeter Ujfalusi 339ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_PPL_ID_SHIFT 16 340ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_PPL_ID_MASK GENMASK(23, 16) 341ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_PPL_ID(x) ((x) << SOF_IPC4_MOD_EXT_PPL_ID_SHIFT) 342ed85a6e6SPeter Ujfalusi 343ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_CORE_ID_SHIFT 24 344ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_CORE_ID_MASK GENMASK(27, 24) 345ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_CORE_ID(x) ((x) << SOF_IPC4_MOD_EXT_CORE_ID_SHIFT) 346ed85a6e6SPeter Ujfalusi 347ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_DOMAIN_SHIFT 28 348ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_DOMAIN_MASK BIT(28) 349ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_DOMAIN(x) ((x) << SOF_IPC4_MOD_EXT_DOMAIN_SHIFT) 350ed85a6e6SPeter Ujfalusi 351ed85a6e6SPeter Ujfalusi /* bind/unbind module ipc msg */ 352ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_DST_MOD_ID_SHIFT 0 353ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_DST_MOD_ID_MASK GENMASK(15, 0) 354ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_DST_MOD_ID(x) ((x) << SOF_IPC4_MOD_EXT_DST_MOD_ID_SHIFT) 355ed85a6e6SPeter Ujfalusi 356ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_DST_MOD_INSTANCE_SHIFT 16 357ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_DST_MOD_INSTANCE_MASK GENMASK(23, 16) 358ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_DST_MOD_INSTANCE(x) ((x) << SOF_IPC4_MOD_EXT_DST_MOD_INSTANCE_SHIFT) 359ed85a6e6SPeter Ujfalusi 360ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_DST_MOD_QUEUE_ID_SHIFT 24 361ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_DST_MOD_QUEUE_ID_MASK GENMASK(26, 24) 362ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_DST_MOD_QUEUE_ID(x) ((x) << SOF_IPC4_MOD_EXT_DST_MOD_QUEUE_ID_SHIFT) 363ed85a6e6SPeter Ujfalusi 364ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_SRC_MOD_QUEUE_ID_SHIFT 27 365ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_SRC_MOD_QUEUE_ID_MASK GENMASK(29, 27) 366ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_SRC_MOD_QUEUE_ID(x) ((x) << SOF_IPC4_MOD_EXT_SRC_MOD_QUEUE_ID_SHIFT) 367ed85a6e6SPeter Ujfalusi 368ed85a6e6SPeter Ujfalusi #define MOD_ENABLE_LOG 6 369ed85a6e6SPeter Ujfalusi #define MOD_SYSTEM_TIME 20 370ed85a6e6SPeter Ujfalusi 371ed85a6e6SPeter Ujfalusi /* set module large config */ 372ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_MSG_SIZE_SHIFT 0 373ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_MSG_SIZE_MASK GENMASK(19, 0) 374ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_MSG_SIZE(x) ((x) << SOF_IPC4_MOD_EXT_MSG_SIZE_SHIFT) 375ed85a6e6SPeter Ujfalusi 376ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_MSG_PARAM_ID_SHIFT 20 377ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_MSG_PARAM_ID_MASK GENMASK(27, 20) 378ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_MSG_PARAM_ID(x) ((x) << SOF_IPC4_MOD_EXT_MSG_PARAM_ID_SHIFT) 379ed85a6e6SPeter Ujfalusi 380ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_MSG_LAST_BLOCK_SHIFT 28 381ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_MSG_LAST_BLOCK_MASK BIT(28) 382ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_MSG_LAST_BLOCK(x) ((x) << SOF_IPC4_MOD_EXT_MSG_LAST_BLOCK_SHIFT) 383ed85a6e6SPeter Ujfalusi 384ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_MSG_FIRST_BLOCK_SHIFT 29 385ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_MSG_FIRST_BLOCK_MASK BIT(29) 386ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_EXT_MSG_FIRST_BLOCK(x) ((x) << SOF_IPC4_MOD_EXT_MSG_FIRST_BLOCK_SHIFT) 387ed85a6e6SPeter Ujfalusi 388ed85a6e6SPeter Ujfalusi /* Init instance messagees */ 389ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_INIT_BASEFW_MOD_ID 0 390ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MOD_INIT_BASEFW_INSTANCE_ID 0 391ed85a6e6SPeter Ujfalusi 392ed85a6e6SPeter Ujfalusi enum sof_ipc4_base_fw_params { 393ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_PARAM_ENABLE_LOGS = 6, 394ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_PARAM_FW_CONFIG, 395ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_PARAM_HW_CONFIG_GET, 396ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_PARAM_MODULES_INFO_GET, 397ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_PARAM_LIBRARIES_INFO_GET = 16, 398ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_PARAM_SYSTEM_TIME = 20, 399*eea84a7fSPeter Ujfalusi SOF_IPC4_FW_PARAM_MIC_PRIVACY_STATE_CHANGE = 35, 400ed85a6e6SPeter Ujfalusi }; 401ed85a6e6SPeter Ujfalusi 402ed85a6e6SPeter Ujfalusi enum sof_ipc4_fw_config_params { 403ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_FW_VERSION, 404ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_MEMORY_RECLAIMED, 405ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_SLOW_CLOCK_FREQ_HZ, 406ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_FAST_CLOCK_FREQ_HZ, 407ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_DMA_BUFFER_CONFIG, 408ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_ALH_SUPPORT_LEVEL, 409ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_DL_MAILBOX_BYTES, 410ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_UL_MAILBOX_BYTES, 411ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_TRACE_LOG_BYTES, 412ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_MAX_PPL_COUNT, 413ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_MAX_ASTATE_COUNT, 414ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_MAX_MODULE_PIN_COUNT, 415ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_MODULES_COUNT, 416ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_MAX_MOD_INST_COUNT, 417ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_MAX_LL_TASKS_PER_PRI_COUNT, 418ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_LL_PRI_COUNT, 419ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_MAX_DP_TASKS_COUNT, 420ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_MAX_LIBS_COUNT, 421ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_SCHEDULER_CONFIG, 422ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_XTAL_FREQ_HZ, 423ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_CLOCKS_CONFIG, 424ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_RESERVED, 425ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_POWER_GATING_POLICY, 426ed85a6e6SPeter Ujfalusi SOF_IPC4_FW_CFG_ASSERT_MODE, 42757cd29a8SRander Wang SOF_IPC4_FW_RESERVED1, 42857cd29a8SRander Wang SOF_IPC4_FW_RESERVED2, 42957cd29a8SRander Wang SOF_IPC4_FW_RESERVED3, 43057cd29a8SRander Wang SOF_IPC4_FW_RESERVED4, 43157cd29a8SRander Wang SOF_IPC4_FW_RESERVED5, 43257cd29a8SRander Wang SOF_IPC4_FW_CONTEXT_SAVE 433ed85a6e6SPeter Ujfalusi }; 434ed85a6e6SPeter Ujfalusi 435ed85a6e6SPeter Ujfalusi struct sof_ipc4_fw_version { 436ed85a6e6SPeter Ujfalusi uint16_t major; 437ed85a6e6SPeter Ujfalusi uint16_t minor; 438ed85a6e6SPeter Ujfalusi uint16_t hotfix; 439ed85a6e6SPeter Ujfalusi uint16_t build; 440ed85a6e6SPeter Ujfalusi } __packed; 441ed85a6e6SPeter Ujfalusi 442bd3df9ffSPeter Ujfalusi /* Payload data for SOF_IPC4_MOD_SET_DX */ 443bd3df9ffSPeter Ujfalusi struct sof_ipc4_dx_state_info { 444bd3df9ffSPeter Ujfalusi /* core(s) to apply the change */ 445bd3df9ffSPeter Ujfalusi uint32_t core_mask; 446bd3df9ffSPeter Ujfalusi /* core state: 0: put core_id to D3; 1: put core_id to D0 */ 447bd3df9ffSPeter Ujfalusi uint32_t dx_mask; 448bd3df9ffSPeter Ujfalusi } __packed __aligned(4); 449bd3df9ffSPeter Ujfalusi 450*eea84a7fSPeter Ujfalusi enum sof_ipc4_hw_config_params { 451*eea84a7fSPeter Ujfalusi SOF_IPC4_HW_CFG_INTEL_MIC_PRIVACY_CAPS = 11, 452*eea84a7fSPeter Ujfalusi }; 453*eea84a7fSPeter Ujfalusi 454*eea84a7fSPeter Ujfalusi #define SOF_IPC_INTEL_MIC_PRIVACY_VERSION_PTL 1 455*eea84a7fSPeter Ujfalusi 456*eea84a7fSPeter Ujfalusi struct sof_ipc4_intel_mic_privacy_cap { 457*eea84a7fSPeter Ujfalusi uint32_t version; 458*eea84a7fSPeter Ujfalusi uint32_t capabilities_length; 459*eea84a7fSPeter Ujfalusi uint32_t capabilities[]; 460*eea84a7fSPeter Ujfalusi } __packed; 461*eea84a7fSPeter Ujfalusi 462ed85a6e6SPeter Ujfalusi /* Reply messages */ 463ed85a6e6SPeter Ujfalusi 464ed85a6e6SPeter Ujfalusi /* 465ed85a6e6SPeter Ujfalusi * IPC4 primary header bit allocation for replies 466ed85a6e6SPeter Ujfalusi * bit 0-23: status 467ed85a6e6SPeter Ujfalusi * bit 24-28: type: enum sof_ipc4_global_msg if target is SOF_IPC4_FW_GEN_MSG 468ed85a6e6SPeter Ujfalusi * enum sof_ipc4_module_type if target is SOF_IPC4_MODULE_MSG 469ed85a6e6SPeter Ujfalusi * bit 29: response - sof_ipc4_msg_dir 470ed85a6e6SPeter Ujfalusi * bit 30: target - enum sof_ipc4_msg_target 471ed85a6e6SPeter Ujfalusi * bit 31: reserved, unused 472ed85a6e6SPeter Ujfalusi */ 473ed85a6e6SPeter Ujfalusi 474ed85a6e6SPeter Ujfalusi #define SOF_IPC4_REPLY_STATUS GENMASK(23, 0) 475ed85a6e6SPeter Ujfalusi 476ed85a6e6SPeter Ujfalusi /* Notification messages */ 477ed85a6e6SPeter Ujfalusi 478ed85a6e6SPeter Ujfalusi /* 479ed85a6e6SPeter Ujfalusi * IPC4 primary header bit allocation for notifications 480ed85a6e6SPeter Ujfalusi * bit 0-15: notification type specific 481ed85a6e6SPeter Ujfalusi * bit 16-23: enum sof_ipc4_notification_type 482ed85a6e6SPeter Ujfalusi * bit 24-28: SOF_IPC4_GLB_NOTIFICATION 483ed85a6e6SPeter Ujfalusi * bit 29: response - sof_ipc4_msg_dir 484ed85a6e6SPeter Ujfalusi * bit 30: target - enum sof_ipc4_msg_target 485ed85a6e6SPeter Ujfalusi * bit 31: reserved, unused 486ed85a6e6SPeter Ujfalusi */ 487ed85a6e6SPeter Ujfalusi 488ed85a6e6SPeter Ujfalusi #define SOF_IPC4_MSG_IS_NOTIFICATION(x) (SOF_IPC4_MSG_TYPE_GET(x) == \ 489ed85a6e6SPeter Ujfalusi SOF_IPC4_GLB_NOTIFICATION) 490ed85a6e6SPeter Ujfalusi 491ed85a6e6SPeter Ujfalusi #define SOF_IPC4_NOTIFICATION_TYPE_SHIFT 16 492ed85a6e6SPeter Ujfalusi #define SOF_IPC4_NOTIFICATION_TYPE_MASK GENMASK(23, 16) 493ed85a6e6SPeter Ujfalusi #define SOF_IPC4_NOTIFICATION_TYPE_GET(x) (((x) & SOF_IPC4_NOTIFICATION_TYPE_MASK) >> \ 494ed85a6e6SPeter Ujfalusi SOF_IPC4_NOTIFICATION_TYPE_SHIFT) 495ed85a6e6SPeter Ujfalusi 496e9bcfea1SPeter Ujfalusi #define SOF_IPC4_LOG_CORE_SHIFT 12 497e9bcfea1SPeter Ujfalusi #define SOF_IPC4_LOG_CORE_MASK GENMASK(15, 12) 498e9bcfea1SPeter Ujfalusi #define SOF_IPC4_LOG_CORE_GET(x) (((x) & SOF_IPC4_LOG_CORE_MASK) >> \ 499e9bcfea1SPeter Ujfalusi SOF_IPC4_LOG_CORE_SHIFT) 500e9bcfea1SPeter Ujfalusi 501ed85a6e6SPeter Ujfalusi /* Value of notification type field - must fit into 8 bits */ 502ed85a6e6SPeter Ujfalusi enum sof_ipc4_notification_type { 503ed85a6e6SPeter Ujfalusi /* Phrase detected (notification from WoV module) */ 504ed85a6e6SPeter Ujfalusi SOF_IPC4_NOTIFY_PHRASE_DETECTED = 4, 505ed85a6e6SPeter Ujfalusi /* Event from a resource (pipeline or module instance) */ 506ed85a6e6SPeter Ujfalusi SOF_IPC4_NOTIFY_RESOURCE_EVENT, 507ed85a6e6SPeter Ujfalusi /* Debug log buffer status changed */ 508ed85a6e6SPeter Ujfalusi SOF_IPC4_NOTIFY_LOG_BUFFER_STATUS, 509ed85a6e6SPeter Ujfalusi /* Timestamp captured at the link */ 510ed85a6e6SPeter Ujfalusi SOF_IPC4_NOTIFY_TIMESTAMP_CAPTURED, 511ed85a6e6SPeter Ujfalusi /* FW complete initialization */ 512ed85a6e6SPeter Ujfalusi SOF_IPC4_NOTIFY_FW_READY, 513ed85a6e6SPeter Ujfalusi /* Audio classifier result (ACA) */ 514ed85a6e6SPeter Ujfalusi SOF_IPC4_NOTIFY_FW_AUD_CLASS_RESULT, 515ed85a6e6SPeter Ujfalusi /* Exception caught by DSP FW */ 516ed85a6e6SPeter Ujfalusi SOF_IPC4_NOTIFY_EXCEPTION_CAUGHT, 517ed85a6e6SPeter Ujfalusi /* 11 is skipped by the existing cavs firmware */ 518ed85a6e6SPeter Ujfalusi /* Custom module notification */ 519ed85a6e6SPeter Ujfalusi SOF_IPC4_NOTIFY_MODULE_NOTIFICATION = 12, 520ed85a6e6SPeter Ujfalusi /* 13 is reserved - do not use */ 521ed85a6e6SPeter Ujfalusi /* Probe notify data available */ 522ed85a6e6SPeter Ujfalusi SOF_IPC4_NOTIFY_PROBE_DATA_AVAILABLE = 14, 523ed85a6e6SPeter Ujfalusi /* AM module notifications */ 524ed85a6e6SPeter Ujfalusi SOF_IPC4_NOTIFY_ASYNC_MSG_SRVC_MESSAGE, 525ed85a6e6SPeter Ujfalusi 526ed85a6e6SPeter Ujfalusi SOF_IPC4_NOTIFY_TYPE_LAST, 527ed85a6e6SPeter Ujfalusi }; 528ed85a6e6SPeter Ujfalusi 529ed85a6e6SPeter Ujfalusi struct sof_ipc4_notify_resource_data { 530ed85a6e6SPeter Ujfalusi uint32_t resource_type; 531ed85a6e6SPeter Ujfalusi uint32_t resource_id; 532ed85a6e6SPeter Ujfalusi uint32_t event_type; 533ed85a6e6SPeter Ujfalusi uint32_t reserved; 534ed85a6e6SPeter Ujfalusi uint32_t data[6]; 535ed85a6e6SPeter Ujfalusi } __packed __aligned(4); 536ed85a6e6SPeter Ujfalusi 53742872050SRander Wang #define SOF_IPC4_DEBUG_DESCRIPTOR_SIZE 12 /* 3 x u32 */ 53842872050SRander Wang 53942872050SRander Wang /* 54042872050SRander Wang * The debug memory window is divided into 16 slots, and the 54142872050SRander Wang * first slot is used as a recorder for the other 15 slots. 54242872050SRander Wang */ 54342872050SRander Wang #define SOF_IPC4_MAX_DEBUG_SLOTS 15 54442872050SRander Wang #define SOF_IPC4_DEBUG_SLOT_SIZE 0x1000 54542872050SRander Wang 54642872050SRander Wang /* debug log slot types */ 54742872050SRander Wang #define SOF_IPC4_DEBUG_SLOT_UNUSED 0x00000000 54842872050SRander Wang #define SOF_IPC4_DEBUG_SLOT_CRITICAL_LOG 0x54524300 /* byte 0: core ID */ 54942872050SRander Wang #define SOF_IPC4_DEBUG_SLOT_DEBUG_LOG 0x474f4c00 /* byte 0: core ID */ 55042872050SRander Wang #define SOF_IPC4_DEBUG_SLOT_GDB_STUB 0x42444700 55142872050SRander Wang #define SOF_IPC4_DEBUG_SLOT_TELEMETRY 0x4c455400 55242872050SRander Wang #define SOF_IPC4_DEBUG_SLOT_BROKEN 0x44414544 55342872050SRander Wang 5541a307538SPeter Ujfalusi /** 5551a307538SPeter Ujfalusi * struct sof_ipc4_notify_module_data - payload for module notification 5561a307538SPeter Ujfalusi * @instance_id: instance ID of the originator module of the notification 5571a307538SPeter Ujfalusi * @module_id: module ID of the originator of the notification 5581a307538SPeter Ujfalusi * @event_id: module specific event id 5591a307538SPeter Ujfalusi * @event_data_size: Size of the @event_data (if any) in bytes 5601a307538SPeter Ujfalusi * @event_data: Optional notification data, module and notification dependent 5611a307538SPeter Ujfalusi */ 5621a307538SPeter Ujfalusi struct sof_ipc4_notify_module_data { 5631a307538SPeter Ujfalusi uint16_t instance_id; 5641a307538SPeter Ujfalusi uint16_t module_id; 5651a307538SPeter Ujfalusi uint32_t event_id; 5661a307538SPeter Ujfalusi uint32_t event_data_size; 5671a307538SPeter Ujfalusi uint8_t event_data[]; 5681a307538SPeter Ujfalusi } __packed __aligned(4); 5691a307538SPeter Ujfalusi 5701a307538SPeter Ujfalusi /* 5711a307538SPeter Ujfalusi * ALSA kcontrol change notification 5721a307538SPeter Ujfalusi * 5731a307538SPeter Ujfalusi * The event_id of struct sof_ipc4_notify_module_data is divided into two u16: 5741a307538SPeter Ujfalusi * upper u16: magic number for ALSA kcontrol types: 0xA15A 5751a307538SPeter Ujfalusi * lower u16: param_id of the control, which is the type of the control 5761a307538SPeter Ujfalusi * The event_data contains the struct sof_ipc4_control_msg_payload of the control 5771a307538SPeter Ujfalusi * which sent the notification. 5781a307538SPeter Ujfalusi */ 5791a307538SPeter Ujfalusi #define SOF_IPC4_NOTIFY_MODULE_EVENTID_ALSA_MAGIC_MASK GENMASK(31, 16) 5801a307538SPeter Ujfalusi #define SOF_IPC4_NOTIFY_MODULE_EVENTID_ALSA_MAGIC_VAL 0xA15A0000 5811a307538SPeter Ujfalusi #define SOF_IPC4_NOTIFY_MODULE_EVENTID_ALSA_PARAMID_MASK GENMASK(15, 0) 5821a307538SPeter Ujfalusi 583ed85a6e6SPeter Ujfalusi /** @}*/ 584ed85a6e6SPeter Ujfalusi 585ed85a6e6SPeter Ujfalusi #endif 586