159 lines · c
1/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */2/*3 * This file is provided under a dual BSD/GPLv2 license. When using or4 * redistributing this file, you may do so under either license.5 *6 * Copyright(c) 2018 Intel Corporation7 */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 Controls17 */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 DECLARE_FLEX_ARRAY(struct sof_ipc_ctrl_value_chan, chanv);121 /* component values used by routing controls like mux, mixer */122 DECLARE_FLEX_ARRAY(struct sof_ipc_ctrl_value_comp, compv);123 /* data can be used by binary controls */124 DECLARE_FLEX_ARRAY(struct sof_abi_hdr, data);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#endif159