153e0c72dSLiam Girdwood /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ 253e0c72dSLiam Girdwood /* 353e0c72dSLiam Girdwood * This file is provided under a dual BSD/GPLv2 license. When using or 453e0c72dSLiam Girdwood * redistributing this file, you may do so under either license. 553e0c72dSLiam Girdwood * 653e0c72dSLiam Girdwood * Copyright(c) 2018 Intel Corporation. All rights reserved. 753e0c72dSLiam Girdwood */ 853e0c72dSLiam Girdwood 953e0c72dSLiam Girdwood #ifndef __INCLUDE_SOUND_SOF_CONTROL_H__ 1053e0c72dSLiam Girdwood #define __INCLUDE_SOUND_SOF_CONTROL_H__ 1153e0c72dSLiam Girdwood 1253e0c72dSLiam Girdwood #include <uapi/sound/sof/header.h> 1353e0c72dSLiam Girdwood #include <sound/sof/header.h> 1453e0c72dSLiam Girdwood 1553e0c72dSLiam Girdwood /* 1653e0c72dSLiam Girdwood * Component Mixers and Controls 1753e0c72dSLiam Girdwood */ 1853e0c72dSLiam Girdwood 1953e0c72dSLiam Girdwood /* channel positions - uses same values as ALSA */ 2053e0c72dSLiam Girdwood enum sof_ipc_chmap { 2153e0c72dSLiam Girdwood SOF_CHMAP_UNKNOWN = 0, 2253e0c72dSLiam Girdwood SOF_CHMAP_NA, /**< N/A, silent */ 2353e0c72dSLiam Girdwood SOF_CHMAP_MONO, /**< mono stream */ 2453e0c72dSLiam Girdwood SOF_CHMAP_FL, /**< front left */ 2553e0c72dSLiam Girdwood SOF_CHMAP_FR, /**< front right */ 2653e0c72dSLiam Girdwood SOF_CHMAP_RL, /**< rear left */ 2753e0c72dSLiam Girdwood SOF_CHMAP_RR, /**< rear right */ 2853e0c72dSLiam Girdwood SOF_CHMAP_FC, /**< front centre */ 2953e0c72dSLiam Girdwood SOF_CHMAP_LFE, /**< LFE */ 3053e0c72dSLiam Girdwood SOF_CHMAP_SL, /**< side left */ 3153e0c72dSLiam Girdwood SOF_CHMAP_SR, /**< side right */ 3253e0c72dSLiam Girdwood SOF_CHMAP_RC, /**< rear centre */ 3353e0c72dSLiam Girdwood SOF_CHMAP_FLC, /**< front left centre */ 3453e0c72dSLiam Girdwood SOF_CHMAP_FRC, /**< front right centre */ 3553e0c72dSLiam Girdwood SOF_CHMAP_RLC, /**< rear left centre */ 3653e0c72dSLiam Girdwood SOF_CHMAP_RRC, /**< rear right centre */ 3753e0c72dSLiam Girdwood SOF_CHMAP_FLW, /**< front left wide */ 3853e0c72dSLiam Girdwood SOF_CHMAP_FRW, /**< front right wide */ 3953e0c72dSLiam Girdwood SOF_CHMAP_FLH, /**< front left high */ 4053e0c72dSLiam Girdwood SOF_CHMAP_FCH, /**< front centre high */ 4153e0c72dSLiam Girdwood SOF_CHMAP_FRH, /**< front right high */ 4253e0c72dSLiam Girdwood SOF_CHMAP_TC, /**< top centre */ 4353e0c72dSLiam Girdwood SOF_CHMAP_TFL, /**< top front left */ 4453e0c72dSLiam Girdwood SOF_CHMAP_TFR, /**< top front right */ 4553e0c72dSLiam Girdwood SOF_CHMAP_TFC, /**< top front centre */ 4653e0c72dSLiam Girdwood SOF_CHMAP_TRL, /**< top rear left */ 4753e0c72dSLiam Girdwood SOF_CHMAP_TRR, /**< top rear right */ 4853e0c72dSLiam Girdwood SOF_CHMAP_TRC, /**< top rear centre */ 4953e0c72dSLiam Girdwood SOF_CHMAP_TFLC, /**< top front left centre */ 5053e0c72dSLiam Girdwood SOF_CHMAP_TFRC, /**< top front right centre */ 5153e0c72dSLiam Girdwood SOF_CHMAP_TSL, /**< top side left */ 5253e0c72dSLiam Girdwood SOF_CHMAP_TSR, /**< top side right */ 5353e0c72dSLiam Girdwood SOF_CHMAP_LLFE, /**< left LFE */ 5453e0c72dSLiam Girdwood SOF_CHMAP_RLFE, /**< right LFE */ 5553e0c72dSLiam Girdwood SOF_CHMAP_BC, /**< bottom centre */ 5653e0c72dSLiam Girdwood SOF_CHMAP_BLC, /**< bottom left centre */ 5753e0c72dSLiam Girdwood SOF_CHMAP_BRC, /**< bottom right centre */ 5853e0c72dSLiam Girdwood SOF_CHMAP_LAST = SOF_CHMAP_BRC, 5953e0c72dSLiam Girdwood }; 6053e0c72dSLiam Girdwood 6153e0c72dSLiam Girdwood /* control data type and direction */ 6253e0c72dSLiam Girdwood enum sof_ipc_ctrl_type { 6353e0c72dSLiam Girdwood /* per channel data - uses struct sof_ipc_ctrl_value_chan */ 6453e0c72dSLiam Girdwood SOF_CTRL_TYPE_VALUE_CHAN_GET = 0, 6553e0c72dSLiam Girdwood SOF_CTRL_TYPE_VALUE_CHAN_SET, 6653e0c72dSLiam Girdwood /* component data - uses struct sof_ipc_ctrl_value_comp */ 6753e0c72dSLiam Girdwood SOF_CTRL_TYPE_VALUE_COMP_GET, 6853e0c72dSLiam Girdwood SOF_CTRL_TYPE_VALUE_COMP_SET, 6953e0c72dSLiam Girdwood /* bespoke data - uses struct sof_abi_hdr */ 7053e0c72dSLiam Girdwood SOF_CTRL_TYPE_DATA_GET, 7153e0c72dSLiam Girdwood SOF_CTRL_TYPE_DATA_SET, 7253e0c72dSLiam Girdwood }; 7353e0c72dSLiam Girdwood 7453e0c72dSLiam Girdwood /* control command type */ 7553e0c72dSLiam Girdwood enum sof_ipc_ctrl_cmd { 7653e0c72dSLiam Girdwood SOF_CTRL_CMD_VOLUME = 0, /**< maps to ALSA volume style controls */ 7753e0c72dSLiam Girdwood SOF_CTRL_CMD_ENUM, /**< maps to ALSA enum style controls */ 7853e0c72dSLiam Girdwood SOF_CTRL_CMD_SWITCH, /**< maps to ALSA switch style controls */ 7953e0c72dSLiam Girdwood SOF_CTRL_CMD_BINARY, /**< maps to ALSA binary style controls */ 8053e0c72dSLiam Girdwood }; 8153e0c72dSLiam Girdwood 8253e0c72dSLiam Girdwood /* generic channel mapped value data */ 8353e0c72dSLiam Girdwood struct sof_ipc_ctrl_value_chan { 8453e0c72dSLiam Girdwood uint32_t channel; /**< channel map - enum sof_ipc_chmap */ 8553e0c72dSLiam Girdwood uint32_t value; 8653e0c72dSLiam Girdwood } __packed; 8753e0c72dSLiam Girdwood 8853e0c72dSLiam Girdwood /* generic component mapped value data */ 8953e0c72dSLiam Girdwood struct sof_ipc_ctrl_value_comp { 9053e0c72dSLiam Girdwood uint32_t index; /**< component source/sink/control index in control */ 9153e0c72dSLiam Girdwood union { 9253e0c72dSLiam Girdwood uint32_t uvalue; 9353e0c72dSLiam Girdwood int32_t svalue; 9453e0c72dSLiam Girdwood }; 9553e0c72dSLiam Girdwood } __packed; 9653e0c72dSLiam Girdwood 9753e0c72dSLiam Girdwood /* generic control data */ 9853e0c72dSLiam Girdwood struct sof_ipc_ctrl_data { 9953e0c72dSLiam Girdwood struct sof_ipc_reply rhdr; 10053e0c72dSLiam Girdwood uint32_t comp_id; 10153e0c72dSLiam Girdwood 10253e0c72dSLiam Girdwood /* control access and data type */ 10353e0c72dSLiam Girdwood uint32_t type; /**< enum sof_ipc_ctrl_type */ 10453e0c72dSLiam Girdwood uint32_t cmd; /**< enum sof_ipc_ctrl_cmd */ 10553e0c72dSLiam Girdwood uint32_t index; /**< control index for comps > 1 control */ 10653e0c72dSLiam Girdwood 10753e0c72dSLiam Girdwood /* control data - can either be appended or DMAed from host */ 10853e0c72dSLiam Girdwood struct sof_ipc_host_buffer buffer; 10953e0c72dSLiam Girdwood uint32_t num_elems; /**< in array elems or bytes for data type */ 11053e0c72dSLiam Girdwood uint32_t elems_remaining; /**< elems remaining if sent in parts */ 11153e0c72dSLiam Girdwood 11253e0c72dSLiam Girdwood uint32_t msg_index; /**< for large messages sent in parts */ 11353e0c72dSLiam Girdwood 11453e0c72dSLiam Girdwood /* reserved for future use */ 11553e0c72dSLiam Girdwood uint32_t reserved[6]; 11653e0c72dSLiam Girdwood 11753e0c72dSLiam Girdwood /* control data - add new types if needed */ 11853e0c72dSLiam Girdwood union { 11953e0c72dSLiam Girdwood /* channel values can be used by volume type controls */ 12053e0c72dSLiam Girdwood struct sof_ipc_ctrl_value_chan chanv[0]; 12153e0c72dSLiam Girdwood /* component values used by routing controls like mux, mixer */ 12253e0c72dSLiam Girdwood struct sof_ipc_ctrl_value_comp compv[0]; 12353e0c72dSLiam Girdwood /* data can be used by binary controls */ 12453e0c72dSLiam Girdwood struct sof_abi_hdr data[0]; 12553e0c72dSLiam Girdwood }; 12653e0c72dSLiam Girdwood } __packed; 12753e0c72dSLiam Girdwood 12853e0c72dSLiam Girdwood /** Event type */ 12953e0c72dSLiam Girdwood enum sof_ipc_ctrl_event_type { 13053e0c72dSLiam Girdwood SOF_CTRL_EVENT_GENERIC = 0, /**< generic event */ 13153e0c72dSLiam Girdwood SOF_CTRL_EVENT_GENERIC_METADATA, /**< generic event with metadata */ 13253e0c72dSLiam Girdwood SOF_CTRL_EVENT_KD, /**< keyword detection event */ 13353e0c72dSLiam Girdwood SOF_CTRL_EVENT_VAD, /**< voice activity detection event */ 13453e0c72dSLiam Girdwood }; 13553e0c72dSLiam Girdwood 13653e0c72dSLiam Girdwood /** 13753e0c72dSLiam Girdwood * Generic notification data. 13853e0c72dSLiam Girdwood */ 13953e0c72dSLiam Girdwood struct sof_ipc_comp_event { 14053e0c72dSLiam Girdwood struct sof_ipc_reply rhdr; 14153e0c72dSLiam Girdwood uint16_t src_comp_type; /**< COMP_TYPE_ */ 14253e0c72dSLiam Girdwood uint32_t src_comp_id; /**< source component id */ 14353e0c72dSLiam Girdwood uint32_t event_type; /**< event type - SOF_CTRL_EVENT_* */ 14453e0c72dSLiam Girdwood uint32_t num_elems; /**< in array elems or bytes for data type */ 14553e0c72dSLiam Girdwood 14653e0c72dSLiam Girdwood /* reserved for future use */ 14753e0c72dSLiam Girdwood uint32_t reserved[8]; 14853e0c72dSLiam Girdwood 14953e0c72dSLiam Girdwood /* control data - add new types if needed */ 15053e0c72dSLiam Girdwood union { 15153e0c72dSLiam Girdwood /* data can be used by binary controls */ 15253e0c72dSLiam Girdwood struct sof_abi_hdr data[0]; 15353e0c72dSLiam Girdwood /* event specific values */ 15453e0c72dSLiam Girdwood uint32_t event_value; 15553e0c72dSLiam Girdwood }; 15653e0c72dSLiam Girdwood } __packed; 15753e0c72dSLiam Girdwood 15853e0c72dSLiam Girdwood #endif 159