logo

oasis-root

Compiled tree of Oasis Linux based on own branch at <https://hacktivis.me/git/oasis/> git clone https://anongit.hacktivis.me/git/oasis-root.git

virtio_snd.h (13170B)


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