1/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ 2/* 3 * This file is provided under a dual BSD/GPLv2 license. When using or 4 * redistributing this file, you may do so under either license. 5 * 6 * Copyright(c) 2018 Intel Corporation. All rights reserved. 7 */ 8 9#ifndef __INCLUDE_SOUND_SOF_CONTROL_H__ 10#define __INCLUDE_SOUND_SOF_CONTROL_H__ 11 12#include <uapi/sound/sof/header.h> 13#include <sound/sof/header.h> 14 15/* 16 * Component Mixers and Controls 17 */ 18 19/* channel positions - uses same values as ALSA */ 20enum sof_ipc_chmap { 21 SOF_CHMAP_UNKNOWN = 0, 22 SOF_CHMAP_NA, /**< N/A, silent */ 23 SOF_CHMAP_MONO, /**< mono stream */ 24 SOF_CHMAP_FL, /**< front left */ 25 SOF_CHMAP_FR, /**< front right */ 26 SOF_CHMAP_RL, /**< rear left */ 27 SOF_CHMAP_RR, /**< rear right */ 28 SOF_CHMAP_FC, /**< front centre */ 29 SOF_CHMAP_LFE, /**< LFE */ 30 SOF_CHMAP_SL, /**< side left */ 31 SOF_CHMAP_SR, /**< side right */ 32 SOF_CHMAP_RC, /**< rear centre */ 33 SOF_CHMAP_FLC, /**< front left centre */ 34 SOF_CHMAP_FRC, /**< front right centre */ 35 SOF_CHMAP_RLC, /**< rear left centre */ 36 SOF_CHMAP_RRC, /**< rear right centre */ 37 SOF_CHMAP_FLW, /**< front left wide */ 38 SOF_CHMAP_FRW, /**< front right wide */ 39 SOF_CHMAP_FLH, /**< front left high */ 40 SOF_CHMAP_FCH, /**< front centre high */ 41 SOF_CHMAP_FRH, /**< front right high */ 42 SOF_CHMAP_TC, /**< top centre */ 43 SOF_CHMAP_TFL, /**< top front left */ 44 SOF_CHMAP_TFR, /**< top front right */ 45 SOF_CHMAP_TFC, /**< top front centre */ 46 SOF_CHMAP_TRL, /**< top rear left */ 47 SOF_CHMAP_TRR, /**< top rear right */ 48 SOF_CHMAP_TRC, /**< top rear centre */ 49 SOF_CHMAP_TFLC, /**< top front left centre */ 50 SOF_CHMAP_TFRC, /**< top front right centre */ 51 SOF_CHMAP_TSL, /**< top side left */ 52 SOF_CHMAP_TSR, /**< top side right */ 53 SOF_CHMAP_LLFE, /**< left LFE */ 54 SOF_CHMAP_RLFE, /**< right LFE */ 55 SOF_CHMAP_BC, /**< bottom centre */ 56 SOF_CHMAP_BLC, /**< bottom left centre */ 57 SOF_CHMAP_BRC, /**< bottom right centre */ 58 SOF_CHMAP_LAST = SOF_CHMAP_BRC, 59}; 60 61/* control data type and direction */ 62enum sof_ipc_ctrl_type { 63 /* per channel data - uses struct sof_ipc_ctrl_value_chan */ 64 SOF_CTRL_TYPE_VALUE_CHAN_GET = 0, 65 SOF_CTRL_TYPE_VALUE_CHAN_SET, 66 /* component data - uses struct sof_ipc_ctrl_value_comp */ 67 SOF_CTRL_TYPE_VALUE_COMP_GET, 68 SOF_CTRL_TYPE_VALUE_COMP_SET, 69 /* bespoke data - uses struct sof_abi_hdr */ 70 SOF_CTRL_TYPE_DATA_GET, 71 SOF_CTRL_TYPE_DATA_SET, 72}; 73 74/* control command type */ 75enum sof_ipc_ctrl_cmd { 76 SOF_CTRL_CMD_VOLUME = 0, /**< maps to ALSA volume style controls */ 77 SOF_CTRL_CMD_ENUM, /**< maps to ALSA enum style controls */ 78 SOF_CTRL_CMD_SWITCH, /**< maps to ALSA switch style controls */ 79 SOF_CTRL_CMD_BINARY, /**< maps to ALSA binary style controls */ 80}; 81 82/* generic channel mapped value data */ 83struct sof_ipc_ctrl_value_chan { 84 uint32_t channel; /**< channel map - enum sof_ipc_chmap */ 85 uint32_t value; 86} __packed; 87 88/* generic component mapped value data */ 89struct sof_ipc_ctrl_value_comp { 90 uint32_t index; /**< component source/sink/control index in control */ 91 union { 92 uint32_t uvalue; 93 int32_t svalue; 94 }; 95} __packed; 96 97/* generic control data */ 98struct sof_ipc_ctrl_data { 99 struct sof_ipc_reply rhdr; 100 uint32_t comp_id; 101 102 /* control access and data type */ 103 uint32_t type; /**< enum sof_ipc_ctrl_type */ 104 uint32_t cmd; /**< enum sof_ipc_ctrl_cmd */ 105 uint32_t index; /**< control index for comps > 1 control */ 106 107 /* control data - can either be appended or DMAed from host */ 108 struct sof_ipc_host_buffer buffer; 109 uint32_t num_elems; /**< in array elems or bytes for data type */ 110 uint32_t elems_remaining; /**< elems remaining if sent in parts */ 111 112 uint32_t msg_index; /**< for large messages sent in parts */ 113 114 /* reserved for future use */ 115 uint32_t reserved[6]; 116 117 /* control data - add new types if needed */ 118 union { 119 /* channel values can be used by volume type controls */ 120 struct sof_ipc_ctrl_value_chan chanv[0]; 121 /* component values used by routing controls like mux, mixer */ 122 struct sof_ipc_ctrl_value_comp compv[0]; 123 /* data can be used by binary controls */ 124 struct sof_abi_hdr data[0]; 125 }; 126} __packed; 127 128/** Event type */ 129enum sof_ipc_ctrl_event_type { 130 SOF_CTRL_EVENT_GENERIC = 0, /**< generic event */ 131 SOF_CTRL_EVENT_GENERIC_METADATA, /**< generic event with metadata */ 132 SOF_CTRL_EVENT_KD, /**< keyword detection event */ 133 SOF_CTRL_EVENT_VAD, /**< voice activity detection event */ 134}; 135 136/** 137 * Generic notification data. 138 */ 139struct sof_ipc_comp_event { 140 struct sof_ipc_reply rhdr; 141 uint16_t src_comp_type; /**< COMP_TYPE_ */ 142 uint32_t src_comp_id; /**< source component id */ 143 uint32_t event_type; /**< event type - SOF_CTRL_EVENT_* */ 144 uint32_t num_elems; /**< in array elems or bytes for data type */ 145 146 /* reserved for future use */ 147 uint32_t reserved[8]; 148 149 /* control data - add new types if needed */ 150 union { 151 /* data can be used by binary controls */ 152 struct sof_abi_hdr data[0]; 153 /* event specific values */ 154 uint32_t event_value; 155 }; 156} __packed; 157 158#endif 159