162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * This file is provided under a dual BSD/GPLv2 license. When using or 462306a36Sopenharmony_ci * redistributing this file, you may do so under either license. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright(c) 2018 Intel Corporation. All rights reserved. 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef __INCLUDE_SOUND_SOF_STREAM_H__ 1062306a36Sopenharmony_ci#define __INCLUDE_SOUND_SOF_STREAM_H__ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <sound/sof/header.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* 1562306a36Sopenharmony_ci * Stream configuration. 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define SOF_IPC_MAX_CHANNELS 8 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* common sample rates for use in masks */ 2162306a36Sopenharmony_ci#define SOF_RATE_8000 (1 << 0) /**< 8000Hz */ 2262306a36Sopenharmony_ci#define SOF_RATE_11025 (1 << 1) /**< 11025Hz */ 2362306a36Sopenharmony_ci#define SOF_RATE_12000 (1 << 2) /**< 12000Hz */ 2462306a36Sopenharmony_ci#define SOF_RATE_16000 (1 << 3) /**< 16000Hz */ 2562306a36Sopenharmony_ci#define SOF_RATE_22050 (1 << 4) /**< 22050Hz */ 2662306a36Sopenharmony_ci#define SOF_RATE_24000 (1 << 5) /**< 24000Hz */ 2762306a36Sopenharmony_ci#define SOF_RATE_32000 (1 << 6) /**< 32000Hz */ 2862306a36Sopenharmony_ci#define SOF_RATE_44100 (1 << 7) /**< 44100Hz */ 2962306a36Sopenharmony_ci#define SOF_RATE_48000 (1 << 8) /**< 48000Hz */ 3062306a36Sopenharmony_ci#define SOF_RATE_64000 (1 << 9) /**< 64000Hz */ 3162306a36Sopenharmony_ci#define SOF_RATE_88200 (1 << 10) /**< 88200Hz */ 3262306a36Sopenharmony_ci#define SOF_RATE_96000 (1 << 11) /**< 96000Hz */ 3362306a36Sopenharmony_ci#define SOF_RATE_176400 (1 << 12) /**< 176400Hz */ 3462306a36Sopenharmony_ci#define SOF_RATE_192000 (1 << 13) /**< 192000Hz */ 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* continuous and non-standard rates for flexibility */ 3762306a36Sopenharmony_ci#define SOF_RATE_CONTINUOUS (1 << 30) /**< range */ 3862306a36Sopenharmony_ci#define SOF_RATE_KNOT (1 << 31) /**< non-continuous */ 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci/* generic PCM flags for runtime settings */ 4162306a36Sopenharmony_ci#define SOF_PCM_FLAG_XRUN_STOP (1 << 0) /**< Stop on any XRUN */ 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/* stream PCM frame format */ 4462306a36Sopenharmony_cienum sof_ipc_frame { 4562306a36Sopenharmony_ci SOF_IPC_FRAME_S16_LE = 0, 4662306a36Sopenharmony_ci SOF_IPC_FRAME_S24_4LE, 4762306a36Sopenharmony_ci SOF_IPC_FRAME_S32_LE, 4862306a36Sopenharmony_ci SOF_IPC_FRAME_FLOAT, 4962306a36Sopenharmony_ci /* other formats here */ 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/* stream buffer format */ 5362306a36Sopenharmony_cienum sof_ipc_buffer_format { 5462306a36Sopenharmony_ci SOF_IPC_BUFFER_INTERLEAVED, 5562306a36Sopenharmony_ci SOF_IPC_BUFFER_NONINTERLEAVED, 5662306a36Sopenharmony_ci /* other formats here */ 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* stream direction */ 6062306a36Sopenharmony_cienum sof_ipc_stream_direction { 6162306a36Sopenharmony_ci SOF_IPC_STREAM_PLAYBACK = 0, 6262306a36Sopenharmony_ci SOF_IPC_STREAM_CAPTURE, 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/* stream ring info */ 6662306a36Sopenharmony_cistruct sof_ipc_host_buffer { 6762306a36Sopenharmony_ci struct sof_ipc_hdr hdr; 6862306a36Sopenharmony_ci uint32_t phy_addr; 6962306a36Sopenharmony_ci uint32_t pages; 7062306a36Sopenharmony_ci uint32_t size; 7162306a36Sopenharmony_ci uint32_t reserved[3]; 7262306a36Sopenharmony_ci} __packed; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistruct sof_ipc_stream_params { 7562306a36Sopenharmony_ci struct sof_ipc_hdr hdr; 7662306a36Sopenharmony_ci struct sof_ipc_host_buffer buffer; 7762306a36Sopenharmony_ci uint32_t direction; /**< enum sof_ipc_stream_direction */ 7862306a36Sopenharmony_ci uint32_t frame_fmt; /**< enum sof_ipc_frame */ 7962306a36Sopenharmony_ci uint32_t buffer_fmt; /**< enum sof_ipc_buffer_format */ 8062306a36Sopenharmony_ci uint32_t rate; 8162306a36Sopenharmony_ci uint16_t stream_tag; 8262306a36Sopenharmony_ci uint16_t channels; 8362306a36Sopenharmony_ci uint16_t sample_valid_bytes; 8462306a36Sopenharmony_ci uint16_t sample_container_bytes; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci uint32_t host_period_bytes; 8762306a36Sopenharmony_ci uint16_t no_stream_position; /**< 1 means don't send stream position */ 8862306a36Sopenharmony_ci uint8_t cont_update_posn; /**< 1 means continuous update stream position */ 8962306a36Sopenharmony_ci uint8_t reserved0; 9062306a36Sopenharmony_ci int16_t ext_data_length; /**< 0, means no extended data */ 9162306a36Sopenharmony_ci uint8_t reserved[2]; 9262306a36Sopenharmony_ci uint16_t chmap[SOF_IPC_MAX_CHANNELS]; /**< channel map - SOF_CHMAP_ */ 9362306a36Sopenharmony_ci uint8_t ext_data[]; /**< extended data */ 9462306a36Sopenharmony_ci} __packed; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci/* PCM params info - SOF_IPC_STREAM_PCM_PARAMS */ 9762306a36Sopenharmony_cistruct sof_ipc_pcm_params { 9862306a36Sopenharmony_ci struct sof_ipc_cmd_hdr hdr; 9962306a36Sopenharmony_ci uint32_t comp_id; 10062306a36Sopenharmony_ci uint32_t flags; /**< generic PCM flags - SOF_PCM_FLAG_ */ 10162306a36Sopenharmony_ci uint32_t reserved[2]; 10262306a36Sopenharmony_ci struct sof_ipc_stream_params params; 10362306a36Sopenharmony_ci} __packed; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci/* PCM params info reply - SOF_IPC_STREAM_PCM_PARAMS_REPLY */ 10662306a36Sopenharmony_cistruct sof_ipc_pcm_params_reply { 10762306a36Sopenharmony_ci struct sof_ipc_reply rhdr; 10862306a36Sopenharmony_ci uint32_t comp_id; 10962306a36Sopenharmony_ci uint32_t posn_offset; 11062306a36Sopenharmony_ci} __packed; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci/* free stream - SOF_IPC_STREAM_PCM_PARAMS */ 11362306a36Sopenharmony_cistruct sof_ipc_stream { 11462306a36Sopenharmony_ci struct sof_ipc_cmd_hdr hdr; 11562306a36Sopenharmony_ci uint32_t comp_id; 11662306a36Sopenharmony_ci} __packed; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci/* flags indicating which time stamps are in sync with each other */ 11962306a36Sopenharmony_ci#define SOF_TIME_HOST_SYNC (1 << 0) 12062306a36Sopenharmony_ci#define SOF_TIME_DAI_SYNC (1 << 1) 12162306a36Sopenharmony_ci#define SOF_TIME_WALL_SYNC (1 << 2) 12262306a36Sopenharmony_ci#define SOF_TIME_STAMP_SYNC (1 << 3) 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci/* flags indicating which time stamps are valid */ 12562306a36Sopenharmony_ci#define SOF_TIME_HOST_VALID (1 << 8) 12662306a36Sopenharmony_ci#define SOF_TIME_DAI_VALID (1 << 9) 12762306a36Sopenharmony_ci#define SOF_TIME_WALL_VALID (1 << 10) 12862306a36Sopenharmony_ci#define SOF_TIME_STAMP_VALID (1 << 11) 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci/* flags indicating time stamps are 64bit else 3use low 32bit */ 13162306a36Sopenharmony_ci#define SOF_TIME_HOST_64 (1 << 16) 13262306a36Sopenharmony_ci#define SOF_TIME_DAI_64 (1 << 17) 13362306a36Sopenharmony_ci#define SOF_TIME_WALL_64 (1 << 18) 13462306a36Sopenharmony_ci#define SOF_TIME_STAMP_64 (1 << 19) 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistruct sof_ipc_stream_posn { 13762306a36Sopenharmony_ci struct sof_ipc_reply rhdr; 13862306a36Sopenharmony_ci uint32_t comp_id; /**< host component ID */ 13962306a36Sopenharmony_ci uint32_t flags; /**< SOF_TIME_ */ 14062306a36Sopenharmony_ci uint32_t wallclock_hz; /**< frequency of wallclock in Hz */ 14162306a36Sopenharmony_ci uint32_t timestamp_ns; /**< resolution of timestamp in ns */ 14262306a36Sopenharmony_ci uint64_t host_posn; /**< host DMA position in bytes */ 14362306a36Sopenharmony_ci uint64_t dai_posn; /**< DAI DMA position in bytes */ 14462306a36Sopenharmony_ci uint64_t comp_posn; /**< comp position in bytes */ 14562306a36Sopenharmony_ci uint64_t wallclock; /**< audio wall clock */ 14662306a36Sopenharmony_ci uint64_t timestamp; /**< system time stamp */ 14762306a36Sopenharmony_ci uint32_t xrun_comp_id; /**< comp ID of XRUN component */ 14862306a36Sopenharmony_ci int32_t xrun_size; /**< XRUN size in bytes */ 14962306a36Sopenharmony_ci} __packed; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci#endif 152