brintos

brintos / linux-shallow public Read only

0
0
Text · 12.9 KiB · 5f4100c Raw
489 lines · c
1/* SPDX-License-Identifier: BSD-3-Clause */2/*3 * Copyright (C) 2021 OpenSynergy GmbH4 */5#ifndef VIRTIO_SND_IF_H6#define VIRTIO_SND_IF_H7 8#include <linux/virtio_types.h>9 10/*******************************************************************************11 * FEATURE BITS12 */13enum {14	/* device supports control elements */15	VIRTIO_SND_F_CTLS = 016};17 18/*******************************************************************************19 * CONFIGURATION SPACE20 */21struct virtio_snd_config {22	/* # of available physical jacks */23	__le32 jacks;24	/* # of available PCM streams */25	__le32 streams;26	/* # of available channel maps */27	__le32 chmaps;28	/* # of available control elements */29	__le32 controls;30};31 32enum {33	/* device virtqueue indexes */34	VIRTIO_SND_VQ_CONTROL = 0,35	VIRTIO_SND_VQ_EVENT,36	VIRTIO_SND_VQ_TX,37	VIRTIO_SND_VQ_RX,38	/* # of device virtqueues */39	VIRTIO_SND_VQ_MAX40};41 42/*******************************************************************************43 * COMMON DEFINITIONS44 */45 46/* supported dataflow directions */47enum {48	VIRTIO_SND_D_OUTPUT = 0,49	VIRTIO_SND_D_INPUT50};51 52enum {53	/* jack control request types */54	VIRTIO_SND_R_JACK_INFO = 1,55	VIRTIO_SND_R_JACK_REMAP,56 57	/* PCM control request types */58	VIRTIO_SND_R_PCM_INFO = 0x0100,59	VIRTIO_SND_R_PCM_SET_PARAMS,60	VIRTIO_SND_R_PCM_PREPARE,61	VIRTIO_SND_R_PCM_RELEASE,62	VIRTIO_SND_R_PCM_START,63	VIRTIO_SND_R_PCM_STOP,64 65	/* channel map control request types */66	VIRTIO_SND_R_CHMAP_INFO = 0x0200,67 68	/* control element request types */69	VIRTIO_SND_R_CTL_INFO = 0x0300,70	VIRTIO_SND_R_CTL_ENUM_ITEMS,71	VIRTIO_SND_R_CTL_READ,72	VIRTIO_SND_R_CTL_WRITE,73	VIRTIO_SND_R_CTL_TLV_READ,74	VIRTIO_SND_R_CTL_TLV_WRITE,75	VIRTIO_SND_R_CTL_TLV_COMMAND,76 77	/* jack event types */78	VIRTIO_SND_EVT_JACK_CONNECTED = 0x1000,79	VIRTIO_SND_EVT_JACK_DISCONNECTED,80 81	/* PCM event types */82	VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED = 0x1100,83	VIRTIO_SND_EVT_PCM_XRUN,84 85	/* control element event types */86	VIRTIO_SND_EVT_CTL_NOTIFY = 0x1200,87 88	/* common status codes */89	VIRTIO_SND_S_OK = 0x8000,90	VIRTIO_SND_S_BAD_MSG,91	VIRTIO_SND_S_NOT_SUPP,92	VIRTIO_SND_S_IO_ERR93};94 95/* common header */96struct virtio_snd_hdr {97	__le32 code;98};99 100/* event notification */101struct virtio_snd_event {102	/* VIRTIO_SND_EVT_XXX */103	struct virtio_snd_hdr hdr;104	/* optional event data */105	__le32 data;106};107 108/* common control request to query an item information */109struct virtio_snd_query_info {110	/* VIRTIO_SND_R_XXX_INFO */111	struct virtio_snd_hdr hdr;112	/* item start identifier */113	__le32 start_id;114	/* item count to query */115	__le32 count;116	/* item information size in bytes */117	__le32 size;118};119 120/* common item information header */121struct virtio_snd_info {122	/* function group node id (High Definition Audio Specification 7.1.2) */123	__le32 hda_fn_nid;124};125 126/*******************************************************************************127 * JACK CONTROL MESSAGES128 */129struct virtio_snd_jack_hdr {130	/* VIRTIO_SND_R_JACK_XXX */131	struct virtio_snd_hdr hdr;132	/* 0 ... virtio_snd_config::jacks - 1 */133	__le32 jack_id;134};135 136/* supported jack features */137enum {138	VIRTIO_SND_JACK_F_REMAP = 0139};140 141struct virtio_snd_jack_info {142	/* common header */143	struct virtio_snd_info hdr;144	/* supported feature bit map (1 << VIRTIO_SND_JACK_F_XXX) */145	__le32 features;146	/* pin configuration (High Definition Audio Specification 7.3.3.31) */147	__le32 hda_reg_defconf;148	/* pin capabilities (High Definition Audio Specification 7.3.4.9) */149	__le32 hda_reg_caps;150	/* current jack connection status (0: disconnected, 1: connected) */151	__u8 connected;152 153	__u8 padding[7];154};155 156/* jack remapping control request */157struct virtio_snd_jack_remap {158	/* .code = VIRTIO_SND_R_JACK_REMAP */159	struct virtio_snd_jack_hdr hdr;160	/* selected association number */161	__le32 association;162	/* selected sequence number */163	__le32 sequence;164};165 166/*******************************************************************************167 * PCM CONTROL MESSAGES168 */169struct virtio_snd_pcm_hdr {170	/* VIRTIO_SND_R_PCM_XXX */171	struct virtio_snd_hdr hdr;172	/* 0 ... virtio_snd_config::streams - 1 */173	__le32 stream_id;174};175 176/* supported PCM stream features */177enum {178	VIRTIO_SND_PCM_F_SHMEM_HOST = 0,179	VIRTIO_SND_PCM_F_SHMEM_GUEST,180	VIRTIO_SND_PCM_F_MSG_POLLING,181	VIRTIO_SND_PCM_F_EVT_SHMEM_PERIODS,182	VIRTIO_SND_PCM_F_EVT_XRUNS183};184 185/* supported PCM sample formats */186enum {187	/* analog formats (width / physical width) */188	VIRTIO_SND_PCM_FMT_IMA_ADPCM = 0,	/*  4 /  4 bits */189	VIRTIO_SND_PCM_FMT_MU_LAW,		/*  8 /  8 bits */190	VIRTIO_SND_PCM_FMT_A_LAW,		/*  8 /  8 bits */191	VIRTIO_SND_PCM_FMT_S8,			/*  8 /  8 bits */192	VIRTIO_SND_PCM_FMT_U8,			/*  8 /  8 bits */193	VIRTIO_SND_PCM_FMT_S16,			/* 16 / 16 bits */194	VIRTIO_SND_PCM_FMT_U16,			/* 16 / 16 bits */195	VIRTIO_SND_PCM_FMT_S18_3,		/* 18 / 24 bits */196	VIRTIO_SND_PCM_FMT_U18_3,		/* 18 / 24 bits */197	VIRTIO_SND_PCM_FMT_S20_3,		/* 20 / 24 bits */198	VIRTIO_SND_PCM_FMT_U20_3,		/* 20 / 24 bits */199	VIRTIO_SND_PCM_FMT_S24_3,		/* 24 / 24 bits */200	VIRTIO_SND_PCM_FMT_U24_3,		/* 24 / 24 bits */201	VIRTIO_SND_PCM_FMT_S20,			/* 20 / 32 bits */202	VIRTIO_SND_PCM_FMT_U20,			/* 20 / 32 bits */203	VIRTIO_SND_PCM_FMT_S24,			/* 24 / 32 bits */204	VIRTIO_SND_PCM_FMT_U24,			/* 24 / 32 bits */205	VIRTIO_SND_PCM_FMT_S32,			/* 32 / 32 bits */206	VIRTIO_SND_PCM_FMT_U32,			/* 32 / 32 bits */207	VIRTIO_SND_PCM_FMT_FLOAT,		/* 32 / 32 bits */208	VIRTIO_SND_PCM_FMT_FLOAT64,		/* 64 / 64 bits */209	/* digital formats (width / physical width) */210	VIRTIO_SND_PCM_FMT_DSD_U8,		/*  8 /  8 bits */211	VIRTIO_SND_PCM_FMT_DSD_U16,		/* 16 / 16 bits */212	VIRTIO_SND_PCM_FMT_DSD_U32,		/* 32 / 32 bits */213	VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME	/* 32 / 32 bits */214};215 216/* supported PCM frame rates */217enum {218	VIRTIO_SND_PCM_RATE_5512 = 0,219	VIRTIO_SND_PCM_RATE_8000,220	VIRTIO_SND_PCM_RATE_11025,221	VIRTIO_SND_PCM_RATE_16000,222	VIRTIO_SND_PCM_RATE_22050,223	VIRTIO_SND_PCM_RATE_32000,224	VIRTIO_SND_PCM_RATE_44100,225	VIRTIO_SND_PCM_RATE_48000,226	VIRTIO_SND_PCM_RATE_64000,227	VIRTIO_SND_PCM_RATE_88200,228	VIRTIO_SND_PCM_RATE_96000,229	VIRTIO_SND_PCM_RATE_176400,230	VIRTIO_SND_PCM_RATE_192000,231	VIRTIO_SND_PCM_RATE_384000232};233 234struct virtio_snd_pcm_info {235	/* common header */236	struct virtio_snd_info hdr;237	/* supported feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */238	__le32 features;239	/* supported sample format bit map (1 << VIRTIO_SND_PCM_FMT_XXX) */240	__le64 formats;241	/* supported frame rate bit map (1 << VIRTIO_SND_PCM_RATE_XXX) */242	__le64 rates;243	/* dataflow direction (VIRTIO_SND_D_XXX) */244	__u8 direction;245	/* minimum # of supported channels */246	__u8 channels_min;247	/* maximum # of supported channels */248	__u8 channels_max;249 250	__u8 padding[5];251};252 253/* set PCM stream format */254struct virtio_snd_pcm_set_params {255	/* .code = VIRTIO_SND_R_PCM_SET_PARAMS */256	struct virtio_snd_pcm_hdr hdr;257	/* size of the hardware buffer */258	__le32 buffer_bytes;259	/* size of the hardware period */260	__le32 period_bytes;261	/* selected feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */262	__le32 features;263	/* selected # of channels */264	__u8 channels;265	/* selected sample format (VIRTIO_SND_PCM_FMT_XXX) */266	__u8 format;267	/* selected frame rate (VIRTIO_SND_PCM_RATE_XXX) */268	__u8 rate;269 270	__u8 padding;271};272 273/*******************************************************************************274 * PCM I/O MESSAGES275 */276 277/* I/O request header */278struct virtio_snd_pcm_xfer {279	/* 0 ... virtio_snd_config::streams - 1 */280	__le32 stream_id;281};282 283/* I/O request status */284struct virtio_snd_pcm_status {285	/* VIRTIO_SND_S_XXX */286	__le32 status;287	/* current device latency */288	__le32 latency_bytes;289};290 291/*******************************************************************************292 * CHANNEL MAP CONTROL MESSAGES293 */294struct virtio_snd_chmap_hdr {295	/* VIRTIO_SND_R_CHMAP_XXX */296	struct virtio_snd_hdr hdr;297	/* 0 ... virtio_snd_config::chmaps - 1 */298	__le32 chmap_id;299};300 301/* standard channel position definition */302enum {303	VIRTIO_SND_CHMAP_NONE = 0,	/* undefined */304	VIRTIO_SND_CHMAP_NA,		/* silent */305	VIRTIO_SND_CHMAP_MONO,		/* mono stream */306	VIRTIO_SND_CHMAP_FL,		/* front left */307	VIRTIO_SND_CHMAP_FR,		/* front right */308	VIRTIO_SND_CHMAP_RL,		/* rear left */309	VIRTIO_SND_CHMAP_RR,		/* rear right */310	VIRTIO_SND_CHMAP_FC,		/* front center */311	VIRTIO_SND_CHMAP_LFE,		/* low frequency (LFE) */312	VIRTIO_SND_CHMAP_SL,		/* side left */313	VIRTIO_SND_CHMAP_SR,		/* side right */314	VIRTIO_SND_CHMAP_RC,		/* rear center */315	VIRTIO_SND_CHMAP_FLC,		/* front left center */316	VIRTIO_SND_CHMAP_FRC,		/* front right center */317	VIRTIO_SND_CHMAP_RLC,		/* rear left center */318	VIRTIO_SND_CHMAP_RRC,		/* rear right center */319	VIRTIO_SND_CHMAP_FLW,		/* front left wide */320	VIRTIO_SND_CHMAP_FRW,		/* front right wide */321	VIRTIO_SND_CHMAP_FLH,		/* front left high */322	VIRTIO_SND_CHMAP_FCH,		/* front center high */323	VIRTIO_SND_CHMAP_FRH,		/* front right high */324	VIRTIO_SND_CHMAP_TC,		/* top center */325	VIRTIO_SND_CHMAP_TFL,		/* top front left */326	VIRTIO_SND_CHMAP_TFR,		/* top front right */327	VIRTIO_SND_CHMAP_TFC,		/* top front center */328	VIRTIO_SND_CHMAP_TRL,		/* top rear left */329	VIRTIO_SND_CHMAP_TRR,		/* top rear right */330	VIRTIO_SND_CHMAP_TRC,		/* top rear center */331	VIRTIO_SND_CHMAP_TFLC,		/* top front left center */332	VIRTIO_SND_CHMAP_TFRC,		/* top front right center */333	VIRTIO_SND_CHMAP_TSL,		/* top side left */334	VIRTIO_SND_CHMAP_TSR,		/* top side right */335	VIRTIO_SND_CHMAP_LLFE,		/* left LFE */336	VIRTIO_SND_CHMAP_RLFE,		/* right LFE */337	VIRTIO_SND_CHMAP_BC,		/* bottom center */338	VIRTIO_SND_CHMAP_BLC,		/* bottom left center */339	VIRTIO_SND_CHMAP_BRC		/* bottom right center */340};341 342/* maximum possible number of channels */343#define VIRTIO_SND_CHMAP_MAX_SIZE	18344 345struct virtio_snd_chmap_info {346	/* common header */347	struct virtio_snd_info hdr;348	/* dataflow direction (VIRTIO_SND_D_XXX) */349	__u8 direction;350	/* # of valid channel position values */351	__u8 channels;352	/* channel position values (VIRTIO_SND_CHMAP_XXX) */353	__u8 positions[VIRTIO_SND_CHMAP_MAX_SIZE];354};355 356/*******************************************************************************357 * CONTROL ELEMENTS MESSAGES358 */359struct virtio_snd_ctl_hdr {360	/* VIRTIO_SND_R_CTL_XXX */361	struct virtio_snd_hdr hdr;362	/* 0 ... virtio_snd_config::controls - 1 */363	__le32 control_id;364};365 366/* supported roles for control elements */367enum {368	VIRTIO_SND_CTL_ROLE_UNDEFINED = 0,369	VIRTIO_SND_CTL_ROLE_VOLUME,370	VIRTIO_SND_CTL_ROLE_MUTE,371	VIRTIO_SND_CTL_ROLE_GAIN372};373 374/* supported value types for control elements */375enum {376	VIRTIO_SND_CTL_TYPE_BOOLEAN = 0,377	VIRTIO_SND_CTL_TYPE_INTEGER,378	VIRTIO_SND_CTL_TYPE_INTEGER64,379	VIRTIO_SND_CTL_TYPE_ENUMERATED,380	VIRTIO_SND_CTL_TYPE_BYTES,381	VIRTIO_SND_CTL_TYPE_IEC958382};383 384/* supported access rights for control elements */385enum {386	VIRTIO_SND_CTL_ACCESS_READ = 0,387	VIRTIO_SND_CTL_ACCESS_WRITE,388	VIRTIO_SND_CTL_ACCESS_VOLATILE,389	VIRTIO_SND_CTL_ACCESS_INACTIVE,390	VIRTIO_SND_CTL_ACCESS_TLV_READ,391	VIRTIO_SND_CTL_ACCESS_TLV_WRITE,392	VIRTIO_SND_CTL_ACCESS_TLV_COMMAND393};394 395struct virtio_snd_ctl_info {396	/* common header */397	struct virtio_snd_info hdr;398	/* element role (VIRTIO_SND_CTL_ROLE_XXX) */399	__le32 role;400	/* element value type (VIRTIO_SND_CTL_TYPE_XXX) */401	__le32 type;402	/* element access right bit map (1 << VIRTIO_SND_CTL_ACCESS_XXX) */403	__le32 access;404	/* # of members in the element value */405	__le32 count;406	/* index for an element with a non-unique name */407	__le32 index;408	/* name identifier string for the element */409	__u8 name[44];410	/* additional information about the element's value */411	union {412		/* VIRTIO_SND_CTL_TYPE_INTEGER */413		struct {414			/* minimum supported value */415			__le32 min;416			/* maximum supported value */417			__le32 max;418			/* fixed step size for value (0 = variable size) */419			__le32 step;420		} integer;421		/* VIRTIO_SND_CTL_TYPE_INTEGER64 */422		struct {423			/* minimum supported value */424			__le64 min;425			/* maximum supported value */426			__le64 max;427			/* fixed step size for value (0 = variable size) */428			__le64 step;429		} integer64;430		/* VIRTIO_SND_CTL_TYPE_ENUMERATED */431		struct {432			/* # of options supported for value */433			__le32 items;434		} enumerated;435	} value;436};437 438struct virtio_snd_ctl_enum_item {439	/* option name */440	__u8 item[64];441};442 443struct virtio_snd_ctl_iec958 {444	/* AES/IEC958 channel status bits */445	__u8 status[24];446	/* AES/IEC958 subcode bits */447	__u8 subcode[147];448	/* nothing */449	__u8 pad;450	/* AES/IEC958 subframe bits */451	__u8 dig_subframe[4];452};453 454struct virtio_snd_ctl_value {455	union {456		/* VIRTIO_SND_CTL_TYPE_BOOLEAN|INTEGER value */457		__le32 integer[128];458		/* VIRTIO_SND_CTL_TYPE_INTEGER64 value */459		__le64 integer64[64];460		/* VIRTIO_SND_CTL_TYPE_ENUMERATED value (option indexes) */461		__le32 enumerated[128];462		/* VIRTIO_SND_CTL_TYPE_BYTES value */463		__u8 bytes[512];464		/* VIRTIO_SND_CTL_TYPE_IEC958 value */465		struct virtio_snd_ctl_iec958 iec958;466	} value;467};468 469/* supported event reason types */470enum {471	/* element's value has changed */472	VIRTIO_SND_CTL_EVT_MASK_VALUE = 0,473	/* element's information has changed */474	VIRTIO_SND_CTL_EVT_MASK_INFO,475	/* element's metadata has changed */476	VIRTIO_SND_CTL_EVT_MASK_TLV477};478 479struct virtio_snd_ctl_event {480	/* VIRTIO_SND_EVT_CTL_NOTIFY */481	struct virtio_snd_hdr hdr;482	/* 0 ... virtio_snd_config::controls - 1 */483	__le16 control_id;484	/* event reason bit map (1 << VIRTIO_SND_CTL_EVT_MASK_XXX) */485	__le16 mask;486};487 488#endif /* VIRTIO_SND_IF_H */489