xref: /aosp_15_r20/external/crosvm/devices/src/virtio/snd/layout.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1 // Copyright 2020 The ChromiumOS Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 use data_model::Le32;
6 use data_model::Le64;
7 use serde::Deserialize;
8 use serde::Serialize;
9 use zerocopy::AsBytes;
10 use zerocopy::FromBytes;
11 use zerocopy::FromZeroes;
12 
13 use crate::virtio::snd::constants::StatusCode;
14 use crate::virtio::snd::constants::VIRTIO_SND_CHMAP_MAX_SIZE;
15 
16 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes, Serialize, Deserialize)]
17 #[repr(C)]
18 pub struct virtio_snd_hdr {
19     pub code: Le32,
20 }
21 
22 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes)]
23 #[repr(C)]
24 pub struct virtio_snd_jack_hdr {
25     pub hdr: virtio_snd_hdr,
26     pub jack_id: Le32,
27 }
28 
29 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes)]
30 #[repr(C)]
31 pub struct virtio_snd_event {
32     pub hdr: virtio_snd_hdr,
33     pub data: Le32,
34 }
35 
36 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes)]
37 #[repr(C)]
38 pub struct virtio_snd_query_info {
39     pub hdr: virtio_snd_hdr,
40     pub start_id: Le32,
41     pub count: Le32,
42     pub size: Le32,
43 }
44 
45 #[derive(
46     Copy,
47     Clone,
48     Default,
49     AsBytes,
50     FromZeroes,
51     FromBytes,
52     Serialize,
53     Deserialize,
54     PartialEq,
55     Eq,
56     Debug,
57 )]
58 #[repr(C)]
59 pub struct virtio_snd_info {
60     pub hda_fn_nid: Le32,
61 }
62 
63 #[derive(
64     Copy,
65     Clone,
66     Default,
67     AsBytes,
68     FromZeroes,
69     FromBytes,
70     Serialize,
71     Deserialize,
72     PartialEq,
73     Eq,
74     Debug,
75 )]
76 #[repr(C)]
77 pub struct virtio_snd_pcm_info {
78     pub hdr: virtio_snd_info,
79     pub features: Le32, /* 1 << VIRTIO_SND_PCM_F_XXX */
80     pub formats: Le64,  /* 1 << VIRTIO_SND_PCM_FMT_XXX */
81     pub rates: Le64,    /* 1 << VIRTIO_SND_PCM_RATE_XXX */
82     pub direction: u8,
83     pub channels_min: u8,
84     pub channels_max: u8,
85 
86     pub padding: [u8; 5],
87 }
88 
89 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes, Serialize, Deserialize)]
90 #[repr(C)]
91 pub struct virtio_snd_pcm_hdr {
92     pub hdr: virtio_snd_hdr,
93     pub stream_id: Le32,
94 }
95 
96 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes, Serialize, Deserialize)]
97 #[repr(C)]
98 pub struct virtio_snd_pcm_set_params {
99     pub hdr: virtio_snd_pcm_hdr,
100     pub buffer_bytes: Le32,
101     pub period_bytes: Le32,
102     pub features: Le32, /* 1 << VIRTIO_SND_PCM_F_XXX */
103     pub channels: u8,
104     pub format: u8,
105     pub rate: u8,
106     pub padding: u8,
107 }
108 
109 #[derive(Copy, Clone, AsBytes, FromZeroes, FromBytes)]
110 #[repr(C)]
111 pub struct virtio_snd_pcm_xfer {
112     pub stream_id: Le32,
113 }
114 
115 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes)]
116 #[repr(C)]
117 pub struct virtio_snd_pcm_status {
118     pub status: Le32,
119     pub latency_bytes: Le32,
120 }
121 
122 impl virtio_snd_pcm_status {
new(status: StatusCode, latency_bytes: u32) -> Self123     pub fn new(status: StatusCode, latency_bytes: u32) -> Self {
124         Self {
125             status: Le32::from(status as u32),
126             latency_bytes: Le32::from(latency_bytes),
127         }
128     }
129 }
130 
131 #[derive(
132     Copy,
133     Clone,
134     Default,
135     AsBytes,
136     FromZeroes,
137     FromBytes,
138     Serialize,
139     Deserialize,
140     PartialEq,
141     Eq,
142     Debug,
143 )]
144 #[repr(C)]
145 pub struct virtio_snd_jack_info {
146     pub hdr: virtio_snd_info,
147     pub features: Le32, /* 1 << VIRTIO_SND_JACK_F_XXX */
148     pub hda_reg_defconf: Le32,
149     pub hda_reg_caps: Le32,
150     pub connected: u8,
151     pub padding: [u8; 7],
152 }
153 
154 #[derive(Copy, Clone, Default, AsBytes, FromZeroes, FromBytes)]
155 #[repr(C)]
156 pub struct virtio_snd_jack_remap {
157     pub hdr: virtio_snd_jack_hdr, /* .code = VIRTIO_SND_R_JACK_REMAP */
158     pub association: Le32,
159     pub sequence: Le32,
160 }
161 
162 #[derive(
163     Copy,
164     Clone,
165     Default,
166     AsBytes,
167     FromZeroes,
168     FromBytes,
169     Serialize,
170     Deserialize,
171     PartialEq,
172     Eq,
173     Debug,
174 )]
175 #[repr(C)]
176 pub struct virtio_snd_chmap_info {
177     pub hdr: virtio_snd_info,
178     pub direction: u8,
179     pub channels: u8,
180     pub positions: [u8; VIRTIO_SND_CHMAP_MAX_SIZE],
181 }
182