1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * This file is provided under a dual BSD/GPLv2 license. When using or 4*4882a593Smuzhiyun * redistributing this file, you may do so under either license. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright(c) 2018 Intel Corporation. All rights reserved. 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef __INCLUDE_SOUND_SOF_STREAM_H__ 10*4882a593Smuzhiyun #define __INCLUDE_SOUND_SOF_STREAM_H__ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <sound/sof/header.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /* 15*4882a593Smuzhiyun * Stream configuration. 16*4882a593Smuzhiyun */ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define SOF_IPC_MAX_CHANNELS 8 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /* common sample rates for use in masks */ 21*4882a593Smuzhiyun #define SOF_RATE_8000 (1 << 0) /**< 8000Hz */ 22*4882a593Smuzhiyun #define SOF_RATE_11025 (1 << 1) /**< 11025Hz */ 23*4882a593Smuzhiyun #define SOF_RATE_12000 (1 << 2) /**< 12000Hz */ 24*4882a593Smuzhiyun #define SOF_RATE_16000 (1 << 3) /**< 16000Hz */ 25*4882a593Smuzhiyun #define SOF_RATE_22050 (1 << 4) /**< 22050Hz */ 26*4882a593Smuzhiyun #define SOF_RATE_24000 (1 << 5) /**< 24000Hz */ 27*4882a593Smuzhiyun #define SOF_RATE_32000 (1 << 6) /**< 32000Hz */ 28*4882a593Smuzhiyun #define SOF_RATE_44100 (1 << 7) /**< 44100Hz */ 29*4882a593Smuzhiyun #define SOF_RATE_48000 (1 << 8) /**< 48000Hz */ 30*4882a593Smuzhiyun #define SOF_RATE_64000 (1 << 9) /**< 64000Hz */ 31*4882a593Smuzhiyun #define SOF_RATE_88200 (1 << 10) /**< 88200Hz */ 32*4882a593Smuzhiyun #define SOF_RATE_96000 (1 << 11) /**< 96000Hz */ 33*4882a593Smuzhiyun #define SOF_RATE_176400 (1 << 12) /**< 176400Hz */ 34*4882a593Smuzhiyun #define SOF_RATE_192000 (1 << 13) /**< 192000Hz */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* continuous and non-standard rates for flexibility */ 37*4882a593Smuzhiyun #define SOF_RATE_CONTINUOUS (1 << 30) /**< range */ 38*4882a593Smuzhiyun #define SOF_RATE_KNOT (1 << 31) /**< non-continuous */ 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* generic PCM flags for runtime settings */ 41*4882a593Smuzhiyun #define SOF_PCM_FLAG_XRUN_STOP (1 << 0) /**< Stop on any XRUN */ 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* stream PCM frame format */ 44*4882a593Smuzhiyun enum sof_ipc_frame { 45*4882a593Smuzhiyun SOF_IPC_FRAME_S16_LE = 0, 46*4882a593Smuzhiyun SOF_IPC_FRAME_S24_4LE, 47*4882a593Smuzhiyun SOF_IPC_FRAME_S32_LE, 48*4882a593Smuzhiyun SOF_IPC_FRAME_FLOAT, 49*4882a593Smuzhiyun /* other formats here */ 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* stream buffer format */ 53*4882a593Smuzhiyun enum sof_ipc_buffer_format { 54*4882a593Smuzhiyun SOF_IPC_BUFFER_INTERLEAVED, 55*4882a593Smuzhiyun SOF_IPC_BUFFER_NONINTERLEAVED, 56*4882a593Smuzhiyun /* other formats here */ 57*4882a593Smuzhiyun }; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* stream direction */ 60*4882a593Smuzhiyun enum sof_ipc_stream_direction { 61*4882a593Smuzhiyun SOF_IPC_STREAM_PLAYBACK = 0, 62*4882a593Smuzhiyun SOF_IPC_STREAM_CAPTURE, 63*4882a593Smuzhiyun }; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* stream ring info */ 66*4882a593Smuzhiyun struct sof_ipc_host_buffer { 67*4882a593Smuzhiyun struct sof_ipc_hdr hdr; 68*4882a593Smuzhiyun uint32_t phy_addr; 69*4882a593Smuzhiyun uint32_t pages; 70*4882a593Smuzhiyun uint32_t size; 71*4882a593Smuzhiyun uint32_t reserved[3]; 72*4882a593Smuzhiyun } __packed; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct sof_ipc_stream_params { 75*4882a593Smuzhiyun struct sof_ipc_hdr hdr; 76*4882a593Smuzhiyun struct sof_ipc_host_buffer buffer; 77*4882a593Smuzhiyun uint32_t direction; /**< enum sof_ipc_stream_direction */ 78*4882a593Smuzhiyun uint32_t frame_fmt; /**< enum sof_ipc_frame */ 79*4882a593Smuzhiyun uint32_t buffer_fmt; /**< enum sof_ipc_buffer_format */ 80*4882a593Smuzhiyun uint32_t rate; 81*4882a593Smuzhiyun uint16_t stream_tag; 82*4882a593Smuzhiyun uint16_t channels; 83*4882a593Smuzhiyun uint16_t sample_valid_bytes; 84*4882a593Smuzhiyun uint16_t sample_container_bytes; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun uint32_t host_period_bytes; 87*4882a593Smuzhiyun uint16_t no_stream_position; /**< 1 means don't send stream position */ 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun uint16_t reserved[3]; 90*4882a593Smuzhiyun uint16_t chmap[SOF_IPC_MAX_CHANNELS]; /**< channel map - SOF_CHMAP_ */ 91*4882a593Smuzhiyun } __packed; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* PCM params info - SOF_IPC_STREAM_PCM_PARAMS */ 94*4882a593Smuzhiyun struct sof_ipc_pcm_params { 95*4882a593Smuzhiyun struct sof_ipc_cmd_hdr hdr; 96*4882a593Smuzhiyun uint32_t comp_id; 97*4882a593Smuzhiyun uint32_t flags; /**< generic PCM flags - SOF_PCM_FLAG_ */ 98*4882a593Smuzhiyun uint32_t reserved[2]; 99*4882a593Smuzhiyun struct sof_ipc_stream_params params; 100*4882a593Smuzhiyun } __packed; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /* PCM params info reply - SOF_IPC_STREAM_PCM_PARAMS_REPLY */ 103*4882a593Smuzhiyun struct sof_ipc_pcm_params_reply { 104*4882a593Smuzhiyun struct sof_ipc_reply rhdr; 105*4882a593Smuzhiyun uint32_t comp_id; 106*4882a593Smuzhiyun uint32_t posn_offset; 107*4882a593Smuzhiyun } __packed; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun /* free stream - SOF_IPC_STREAM_PCM_PARAMS */ 110*4882a593Smuzhiyun struct sof_ipc_stream { 111*4882a593Smuzhiyun struct sof_ipc_cmd_hdr hdr; 112*4882a593Smuzhiyun uint32_t comp_id; 113*4882a593Smuzhiyun } __packed; 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun /* flags indicating which time stamps are in sync with each other */ 116*4882a593Smuzhiyun #define SOF_TIME_HOST_SYNC (1 << 0) 117*4882a593Smuzhiyun #define SOF_TIME_DAI_SYNC (1 << 1) 118*4882a593Smuzhiyun #define SOF_TIME_WALL_SYNC (1 << 2) 119*4882a593Smuzhiyun #define SOF_TIME_STAMP_SYNC (1 << 3) 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* flags indicating which time stamps are valid */ 122*4882a593Smuzhiyun #define SOF_TIME_HOST_VALID (1 << 8) 123*4882a593Smuzhiyun #define SOF_TIME_DAI_VALID (1 << 9) 124*4882a593Smuzhiyun #define SOF_TIME_WALL_VALID (1 << 10) 125*4882a593Smuzhiyun #define SOF_TIME_STAMP_VALID (1 << 11) 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun /* flags indicating time stamps are 64bit else 3use low 32bit */ 128*4882a593Smuzhiyun #define SOF_TIME_HOST_64 (1 << 16) 129*4882a593Smuzhiyun #define SOF_TIME_DAI_64 (1 << 17) 130*4882a593Smuzhiyun #define SOF_TIME_WALL_64 (1 << 18) 131*4882a593Smuzhiyun #define SOF_TIME_STAMP_64 (1 << 19) 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun struct sof_ipc_stream_posn { 134*4882a593Smuzhiyun struct sof_ipc_reply rhdr; 135*4882a593Smuzhiyun uint32_t comp_id; /**< host component ID */ 136*4882a593Smuzhiyun uint32_t flags; /**< SOF_TIME_ */ 137*4882a593Smuzhiyun uint32_t wallclock_hz; /**< frequency of wallclock in Hz */ 138*4882a593Smuzhiyun uint32_t timestamp_ns; /**< resolution of timestamp in ns */ 139*4882a593Smuzhiyun uint64_t host_posn; /**< host DMA position in bytes */ 140*4882a593Smuzhiyun uint64_t dai_posn; /**< DAI DMA position in bytes */ 141*4882a593Smuzhiyun uint64_t comp_posn; /**< comp position in bytes */ 142*4882a593Smuzhiyun uint64_t wallclock; /**< audio wall clock */ 143*4882a593Smuzhiyun uint64_t timestamp; /**< system time stamp */ 144*4882a593Smuzhiyun uint32_t xrun_comp_id; /**< comp ID of XRUN component */ 145*4882a593Smuzhiyun int32_t xrun_size; /**< XRUN size in bytes */ 146*4882a593Smuzhiyun } __packed; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #endif 149