Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: BSD-3-Clause */
0002 /*
0003  * Copyright (C) 2021 OpenSynergy GmbH
0004  */
0005 #ifndef VIRTIO_SND_IF_H
0006 #define VIRTIO_SND_IF_H
0007 
0008 #include <linux/virtio_types.h>
0009 
0010 /*******************************************************************************
0011  * CONFIGURATION SPACE
0012  */
0013 struct virtio_snd_config {
0014     /* # of available physical jacks */
0015     __le32 jacks;
0016     /* # of available PCM streams */
0017     __le32 streams;
0018     /* # of available channel maps */
0019     __le32 chmaps;
0020 };
0021 
0022 enum {
0023     /* device virtqueue indexes */
0024     VIRTIO_SND_VQ_CONTROL = 0,
0025     VIRTIO_SND_VQ_EVENT,
0026     VIRTIO_SND_VQ_TX,
0027     VIRTIO_SND_VQ_RX,
0028     /* # of device virtqueues */
0029     VIRTIO_SND_VQ_MAX
0030 };
0031 
0032 /*******************************************************************************
0033  * COMMON DEFINITIONS
0034  */
0035 
0036 /* supported dataflow directions */
0037 enum {
0038     VIRTIO_SND_D_OUTPUT = 0,
0039     VIRTIO_SND_D_INPUT
0040 };
0041 
0042 enum {
0043     /* jack control request types */
0044     VIRTIO_SND_R_JACK_INFO = 1,
0045     VIRTIO_SND_R_JACK_REMAP,
0046 
0047     /* PCM control request types */
0048     VIRTIO_SND_R_PCM_INFO = 0x0100,
0049     VIRTIO_SND_R_PCM_SET_PARAMS,
0050     VIRTIO_SND_R_PCM_PREPARE,
0051     VIRTIO_SND_R_PCM_RELEASE,
0052     VIRTIO_SND_R_PCM_START,
0053     VIRTIO_SND_R_PCM_STOP,
0054 
0055     /* channel map control request types */
0056     VIRTIO_SND_R_CHMAP_INFO = 0x0200,
0057 
0058     /* jack event types */
0059     VIRTIO_SND_EVT_JACK_CONNECTED = 0x1000,
0060     VIRTIO_SND_EVT_JACK_DISCONNECTED,
0061 
0062     /* PCM event types */
0063     VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED = 0x1100,
0064     VIRTIO_SND_EVT_PCM_XRUN,
0065 
0066     /* common status codes */
0067     VIRTIO_SND_S_OK = 0x8000,
0068     VIRTIO_SND_S_BAD_MSG,
0069     VIRTIO_SND_S_NOT_SUPP,
0070     VIRTIO_SND_S_IO_ERR
0071 };
0072 
0073 /* common header */
0074 struct virtio_snd_hdr {
0075     __le32 code;
0076 };
0077 
0078 /* event notification */
0079 struct virtio_snd_event {
0080     /* VIRTIO_SND_EVT_XXX */
0081     struct virtio_snd_hdr hdr;
0082     /* optional event data */
0083     __le32 data;
0084 };
0085 
0086 /* common control request to query an item information */
0087 struct virtio_snd_query_info {
0088     /* VIRTIO_SND_R_XXX_INFO */
0089     struct virtio_snd_hdr hdr;
0090     /* item start identifier */
0091     __le32 start_id;
0092     /* item count to query */
0093     __le32 count;
0094     /* item information size in bytes */
0095     __le32 size;
0096 };
0097 
0098 /* common item information header */
0099 struct virtio_snd_info {
0100     /* function group node id (High Definition Audio Specification 7.1.2) */
0101     __le32 hda_fn_nid;
0102 };
0103 
0104 /*******************************************************************************
0105  * JACK CONTROL MESSAGES
0106  */
0107 struct virtio_snd_jack_hdr {
0108     /* VIRTIO_SND_R_JACK_XXX */
0109     struct virtio_snd_hdr hdr;
0110     /* 0 ... virtio_snd_config::jacks - 1 */
0111     __le32 jack_id;
0112 };
0113 
0114 /* supported jack features */
0115 enum {
0116     VIRTIO_SND_JACK_F_REMAP = 0
0117 };
0118 
0119 struct virtio_snd_jack_info {
0120     /* common header */
0121     struct virtio_snd_info hdr;
0122     /* supported feature bit map (1 << VIRTIO_SND_JACK_F_XXX) */
0123     __le32 features;
0124     /* pin configuration (High Definition Audio Specification 7.3.3.31) */
0125     __le32 hda_reg_defconf;
0126     /* pin capabilities (High Definition Audio Specification 7.3.4.9) */
0127     __le32 hda_reg_caps;
0128     /* current jack connection status (0: disconnected, 1: connected) */
0129     __u8 connected;
0130 
0131     __u8 padding[7];
0132 };
0133 
0134 /* jack remapping control request */
0135 struct virtio_snd_jack_remap {
0136     /* .code = VIRTIO_SND_R_JACK_REMAP */
0137     struct virtio_snd_jack_hdr hdr;
0138     /* selected association number */
0139     __le32 association;
0140     /* selected sequence number */
0141     __le32 sequence;
0142 };
0143 
0144 /*******************************************************************************
0145  * PCM CONTROL MESSAGES
0146  */
0147 struct virtio_snd_pcm_hdr {
0148     /* VIRTIO_SND_R_PCM_XXX */
0149     struct virtio_snd_hdr hdr;
0150     /* 0 ... virtio_snd_config::streams - 1 */
0151     __le32 stream_id;
0152 };
0153 
0154 /* supported PCM stream features */
0155 enum {
0156     VIRTIO_SND_PCM_F_SHMEM_HOST = 0,
0157     VIRTIO_SND_PCM_F_SHMEM_GUEST,
0158     VIRTIO_SND_PCM_F_MSG_POLLING,
0159     VIRTIO_SND_PCM_F_EVT_SHMEM_PERIODS,
0160     VIRTIO_SND_PCM_F_EVT_XRUNS
0161 };
0162 
0163 /* supported PCM sample formats */
0164 enum {
0165     /* analog formats (width / physical width) */
0166     VIRTIO_SND_PCM_FMT_IMA_ADPCM = 0,   /*  4 /  4 bits */
0167     VIRTIO_SND_PCM_FMT_MU_LAW,      /*  8 /  8 bits */
0168     VIRTIO_SND_PCM_FMT_A_LAW,       /*  8 /  8 bits */
0169     VIRTIO_SND_PCM_FMT_S8,          /*  8 /  8 bits */
0170     VIRTIO_SND_PCM_FMT_U8,          /*  8 /  8 bits */
0171     VIRTIO_SND_PCM_FMT_S16,         /* 16 / 16 bits */
0172     VIRTIO_SND_PCM_FMT_U16,         /* 16 / 16 bits */
0173     VIRTIO_SND_PCM_FMT_S18_3,       /* 18 / 24 bits */
0174     VIRTIO_SND_PCM_FMT_U18_3,       /* 18 / 24 bits */
0175     VIRTIO_SND_PCM_FMT_S20_3,       /* 20 / 24 bits */
0176     VIRTIO_SND_PCM_FMT_U20_3,       /* 20 / 24 bits */
0177     VIRTIO_SND_PCM_FMT_S24_3,       /* 24 / 24 bits */
0178     VIRTIO_SND_PCM_FMT_U24_3,       /* 24 / 24 bits */
0179     VIRTIO_SND_PCM_FMT_S20,         /* 20 / 32 bits */
0180     VIRTIO_SND_PCM_FMT_U20,         /* 20 / 32 bits */
0181     VIRTIO_SND_PCM_FMT_S24,         /* 24 / 32 bits */
0182     VIRTIO_SND_PCM_FMT_U24,         /* 24 / 32 bits */
0183     VIRTIO_SND_PCM_FMT_S32,         /* 32 / 32 bits */
0184     VIRTIO_SND_PCM_FMT_U32,         /* 32 / 32 bits */
0185     VIRTIO_SND_PCM_FMT_FLOAT,       /* 32 / 32 bits */
0186     VIRTIO_SND_PCM_FMT_FLOAT64,     /* 64 / 64 bits */
0187     /* digital formats (width / physical width) */
0188     VIRTIO_SND_PCM_FMT_DSD_U8,      /*  8 /  8 bits */
0189     VIRTIO_SND_PCM_FMT_DSD_U16,     /* 16 / 16 bits */
0190     VIRTIO_SND_PCM_FMT_DSD_U32,     /* 32 / 32 bits */
0191     VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME  /* 32 / 32 bits */
0192 };
0193 
0194 /* supported PCM frame rates */
0195 enum {
0196     VIRTIO_SND_PCM_RATE_5512 = 0,
0197     VIRTIO_SND_PCM_RATE_8000,
0198     VIRTIO_SND_PCM_RATE_11025,
0199     VIRTIO_SND_PCM_RATE_16000,
0200     VIRTIO_SND_PCM_RATE_22050,
0201     VIRTIO_SND_PCM_RATE_32000,
0202     VIRTIO_SND_PCM_RATE_44100,
0203     VIRTIO_SND_PCM_RATE_48000,
0204     VIRTIO_SND_PCM_RATE_64000,
0205     VIRTIO_SND_PCM_RATE_88200,
0206     VIRTIO_SND_PCM_RATE_96000,
0207     VIRTIO_SND_PCM_RATE_176400,
0208     VIRTIO_SND_PCM_RATE_192000,
0209     VIRTIO_SND_PCM_RATE_384000
0210 };
0211 
0212 struct virtio_snd_pcm_info {
0213     /* common header */
0214     struct virtio_snd_info hdr;
0215     /* supported feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */
0216     __le32 features;
0217     /* supported sample format bit map (1 << VIRTIO_SND_PCM_FMT_XXX) */
0218     __le64 formats;
0219     /* supported frame rate bit map (1 << VIRTIO_SND_PCM_RATE_XXX) */
0220     __le64 rates;
0221     /* dataflow direction (VIRTIO_SND_D_XXX) */
0222     __u8 direction;
0223     /* minimum # of supported channels */
0224     __u8 channels_min;
0225     /* maximum # of supported channels */
0226     __u8 channels_max;
0227 
0228     __u8 padding[5];
0229 };
0230 
0231 /* set PCM stream format */
0232 struct virtio_snd_pcm_set_params {
0233     /* .code = VIRTIO_SND_R_PCM_SET_PARAMS */
0234     struct virtio_snd_pcm_hdr hdr;
0235     /* size of the hardware buffer */
0236     __le32 buffer_bytes;
0237     /* size of the hardware period */
0238     __le32 period_bytes;
0239     /* selected feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */
0240     __le32 features;
0241     /* selected # of channels */
0242     __u8 channels;
0243     /* selected sample format (VIRTIO_SND_PCM_FMT_XXX) */
0244     __u8 format;
0245     /* selected frame rate (VIRTIO_SND_PCM_RATE_XXX) */
0246     __u8 rate;
0247 
0248     __u8 padding;
0249 };
0250 
0251 /*******************************************************************************
0252  * PCM I/O MESSAGES
0253  */
0254 
0255 /* I/O request header */
0256 struct virtio_snd_pcm_xfer {
0257     /* 0 ... virtio_snd_config::streams - 1 */
0258     __le32 stream_id;
0259 };
0260 
0261 /* I/O request status */
0262 struct virtio_snd_pcm_status {
0263     /* VIRTIO_SND_S_XXX */
0264     __le32 status;
0265     /* current device latency */
0266     __le32 latency_bytes;
0267 };
0268 
0269 /*******************************************************************************
0270  * CHANNEL MAP CONTROL MESSAGES
0271  */
0272 struct virtio_snd_chmap_hdr {
0273     /* VIRTIO_SND_R_CHMAP_XXX */
0274     struct virtio_snd_hdr hdr;
0275     /* 0 ... virtio_snd_config::chmaps - 1 */
0276     __le32 chmap_id;
0277 };
0278 
0279 /* standard channel position definition */
0280 enum {
0281     VIRTIO_SND_CHMAP_NONE = 0,  /* undefined */
0282     VIRTIO_SND_CHMAP_NA,        /* silent */
0283     VIRTIO_SND_CHMAP_MONO,      /* mono stream */
0284     VIRTIO_SND_CHMAP_FL,        /* front left */
0285     VIRTIO_SND_CHMAP_FR,        /* front right */
0286     VIRTIO_SND_CHMAP_RL,        /* rear left */
0287     VIRTIO_SND_CHMAP_RR,        /* rear right */
0288     VIRTIO_SND_CHMAP_FC,        /* front center */
0289     VIRTIO_SND_CHMAP_LFE,       /* low frequency (LFE) */
0290     VIRTIO_SND_CHMAP_SL,        /* side left */
0291     VIRTIO_SND_CHMAP_SR,        /* side right */
0292     VIRTIO_SND_CHMAP_RC,        /* rear center */
0293     VIRTIO_SND_CHMAP_FLC,       /* front left center */
0294     VIRTIO_SND_CHMAP_FRC,       /* front right center */
0295     VIRTIO_SND_CHMAP_RLC,       /* rear left center */
0296     VIRTIO_SND_CHMAP_RRC,       /* rear right center */
0297     VIRTIO_SND_CHMAP_FLW,       /* front left wide */
0298     VIRTIO_SND_CHMAP_FRW,       /* front right wide */
0299     VIRTIO_SND_CHMAP_FLH,       /* front left high */
0300     VIRTIO_SND_CHMAP_FCH,       /* front center high */
0301     VIRTIO_SND_CHMAP_FRH,       /* front right high */
0302     VIRTIO_SND_CHMAP_TC,        /* top center */
0303     VIRTIO_SND_CHMAP_TFL,       /* top front left */
0304     VIRTIO_SND_CHMAP_TFR,       /* top front right */
0305     VIRTIO_SND_CHMAP_TFC,       /* top front center */
0306     VIRTIO_SND_CHMAP_TRL,       /* top rear left */
0307     VIRTIO_SND_CHMAP_TRR,       /* top rear right */
0308     VIRTIO_SND_CHMAP_TRC,       /* top rear center */
0309     VIRTIO_SND_CHMAP_TFLC,      /* top front left center */
0310     VIRTIO_SND_CHMAP_TFRC,      /* top front right center */
0311     VIRTIO_SND_CHMAP_TSL,       /* top side left */
0312     VIRTIO_SND_CHMAP_TSR,       /* top side right */
0313     VIRTIO_SND_CHMAP_LLFE,      /* left LFE */
0314     VIRTIO_SND_CHMAP_RLFE,      /* right LFE */
0315     VIRTIO_SND_CHMAP_BC,        /* bottom center */
0316     VIRTIO_SND_CHMAP_BLC,       /* bottom left center */
0317     VIRTIO_SND_CHMAP_BRC        /* bottom right center */
0318 };
0319 
0320 /* maximum possible number of channels */
0321 #define VIRTIO_SND_CHMAP_MAX_SIZE   18
0322 
0323 struct virtio_snd_chmap_info {
0324     /* common header */
0325     struct virtio_snd_info hdr;
0326     /* dataflow direction (VIRTIO_SND_D_XXX) */
0327     __u8 direction;
0328     /* # of valid channel position values */
0329     __u8 channels;
0330     /* channel position values (VIRTIO_SND_CHMAP_XXX) */
0331     __u8 positions[VIRTIO_SND_CHMAP_MAX_SIZE];
0332 };
0333 
0334 #endif /* VIRTIO_SND_IF_H */