xref: /aosp_15_r20/external/crosvm/acpi_tables/src/aml.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2020 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker /// The trait Aml can be implemented by the ACPI objects to translate itself
6*bb4ee6a4SAndroid Build Coastguard Worker /// into the AML raw data. So that these AML raw data can be added into the
7*bb4ee6a4SAndroid Build Coastguard Worker /// ACPI DSDT for guest.
8*bb4ee6a4SAndroid Build Coastguard Worker pub trait Aml {
9*bb4ee6a4SAndroid Build Coastguard Worker     /// Translate an ACPI object into AML code and append to the vector
10*bb4ee6a4SAndroid Build Coastguard Worker     /// buffer.
11*bb4ee6a4SAndroid Build Coastguard Worker     /// * `bytes` - The vector used to append the AML code.
to_aml_bytes(&self, bytes: &mut Vec<u8>)12*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>);
13*bb4ee6a4SAndroid Build Coastguard Worker }
14*bb4ee6a4SAndroid Build Coastguard Worker 
15*bb4ee6a4SAndroid Build Coastguard Worker // AML byte stream defines
16*bb4ee6a4SAndroid Build Coastguard Worker const ZEROOP: u8 = 0x00;
17*bb4ee6a4SAndroid Build Coastguard Worker const ONEOP: u8 = 0x01;
18*bb4ee6a4SAndroid Build Coastguard Worker const NAMEOP: u8 = 0x08;
19*bb4ee6a4SAndroid Build Coastguard Worker const BYTEPREFIX: u8 = 0x0a;
20*bb4ee6a4SAndroid Build Coastguard Worker const WORDPREFIX: u8 = 0x0b;
21*bb4ee6a4SAndroid Build Coastguard Worker const DWORDPREFIX: u8 = 0x0c;
22*bb4ee6a4SAndroid Build Coastguard Worker const STRINGOP: u8 = 0x0d;
23*bb4ee6a4SAndroid Build Coastguard Worker const QWORDPREFIX: u8 = 0x0e;
24*bb4ee6a4SAndroid Build Coastguard Worker const SCOPEOP: u8 = 0x10;
25*bb4ee6a4SAndroid Build Coastguard Worker const BUFFEROP: u8 = 0x11;
26*bb4ee6a4SAndroid Build Coastguard Worker const PACKAGEOP: u8 = 0x12;
27*bb4ee6a4SAndroid Build Coastguard Worker const VARPACKAGEOP: u8 = 0x13;
28*bb4ee6a4SAndroid Build Coastguard Worker const METHODOP: u8 = 0x14;
29*bb4ee6a4SAndroid Build Coastguard Worker const DUALNAMEPREFIX: u8 = 0x2e;
30*bb4ee6a4SAndroid Build Coastguard Worker const MULTINAMEPREFIX: u8 = 0x2f;
31*bb4ee6a4SAndroid Build Coastguard Worker const NAMECHARBASE: u8 = 0x40;
32*bb4ee6a4SAndroid Build Coastguard Worker 
33*bb4ee6a4SAndroid Build Coastguard Worker const EXTOPPREFIX: u8 = 0x5b;
34*bb4ee6a4SAndroid Build Coastguard Worker const MUTEXOP: u8 = 0x01;
35*bb4ee6a4SAndroid Build Coastguard Worker const CREATEFIELDOP: u8 = 0x13;
36*bb4ee6a4SAndroid Build Coastguard Worker const ACQUIREOP: u8 = 0x23;
37*bb4ee6a4SAndroid Build Coastguard Worker const RELEASEOP: u8 = 0x27;
38*bb4ee6a4SAndroid Build Coastguard Worker const OPREGIONOP: u8 = 0x80;
39*bb4ee6a4SAndroid Build Coastguard Worker const FIELDOP: u8 = 0x81;
40*bb4ee6a4SAndroid Build Coastguard Worker const DEVICEOP: u8 = 0x82;
41*bb4ee6a4SAndroid Build Coastguard Worker const POWERRESOURCEOP: u8 = 0x84;
42*bb4ee6a4SAndroid Build Coastguard Worker 
43*bb4ee6a4SAndroid Build Coastguard Worker const LOCAL0OP: u8 = 0x60;
44*bb4ee6a4SAndroid Build Coastguard Worker const ARG0OP: u8 = 0x68;
45*bb4ee6a4SAndroid Build Coastguard Worker const STOREOP: u8 = 0x70;
46*bb4ee6a4SAndroid Build Coastguard Worker const ADDOP: u8 = 0x72;
47*bb4ee6a4SAndroid Build Coastguard Worker const CONCATOP: u8 = 0x73;
48*bb4ee6a4SAndroid Build Coastguard Worker const SUBTRACTOP: u8 = 0x74;
49*bb4ee6a4SAndroid Build Coastguard Worker const MULTIPLYOP: u8 = 0x77;
50*bb4ee6a4SAndroid Build Coastguard Worker const SHIFTLEFTOP: u8 = 0x79;
51*bb4ee6a4SAndroid Build Coastguard Worker const SHIFTRIGHTOP: u8 = 0x7a;
52*bb4ee6a4SAndroid Build Coastguard Worker const ANDOP: u8 = 0x7b;
53*bb4ee6a4SAndroid Build Coastguard Worker const NANDOP: u8 = 0x7c;
54*bb4ee6a4SAndroid Build Coastguard Worker const OROP: u8 = 0x7d;
55*bb4ee6a4SAndroid Build Coastguard Worker const NOROP: u8 = 0x7e;
56*bb4ee6a4SAndroid Build Coastguard Worker const XOROP: u8 = 0x7f;
57*bb4ee6a4SAndroid Build Coastguard Worker const DEREFOFOP: u8 = 0x83;
58*bb4ee6a4SAndroid Build Coastguard Worker const CONCATRESOP: u8 = 0x84;
59*bb4ee6a4SAndroid Build Coastguard Worker const MODOP: u8 = 0x85;
60*bb4ee6a4SAndroid Build Coastguard Worker const NOTIFYOP: u8 = 0x86;
61*bb4ee6a4SAndroid Build Coastguard Worker const SIZEOFOP: u8 = 0x87;
62*bb4ee6a4SAndroid Build Coastguard Worker const INDEXOP: u8 = 0x88;
63*bb4ee6a4SAndroid Build Coastguard Worker const CREATEDWFIELDOP: u8 = 0x8a;
64*bb4ee6a4SAndroid Build Coastguard Worker const OBJECTTYPEOP: u8 = 0x8e;
65*bb4ee6a4SAndroid Build Coastguard Worker const CREATEQWFIELDOP: u8 = 0x8f;
66*bb4ee6a4SAndroid Build Coastguard Worker const LNOTOP: u8 = 0x92;
67*bb4ee6a4SAndroid Build Coastguard Worker const LEQUALOP: u8 = 0x93;
68*bb4ee6a4SAndroid Build Coastguard Worker const LGREATEROP: u8 = 0x94;
69*bb4ee6a4SAndroid Build Coastguard Worker const LLESSOP: u8 = 0x95;
70*bb4ee6a4SAndroid Build Coastguard Worker const TOBUFFEROP: u8 = 0x96;
71*bb4ee6a4SAndroid Build Coastguard Worker const TOINTEGEROP: u8 = 0x99;
72*bb4ee6a4SAndroid Build Coastguard Worker const TOSTRINGOP: u8 = 0x9c;
73*bb4ee6a4SAndroid Build Coastguard Worker const MIDOP: u8 = 0x9e;
74*bb4ee6a4SAndroid Build Coastguard Worker const IFOP: u8 = 0xa0;
75*bb4ee6a4SAndroid Build Coastguard Worker const ELSEOP: u8 = 0xa1;
76*bb4ee6a4SAndroid Build Coastguard Worker const WHILEOP: u8 = 0xa2;
77*bb4ee6a4SAndroid Build Coastguard Worker const RETURNOP: u8 = 0xa4;
78*bb4ee6a4SAndroid Build Coastguard Worker const ONESOP: u8 = 0xff;
79*bb4ee6a4SAndroid Build Coastguard Worker 
80*bb4ee6a4SAndroid Build Coastguard Worker // AML resouce data fields
81*bb4ee6a4SAndroid Build Coastguard Worker const IOPORTDESC: u8 = 0x47;
82*bb4ee6a4SAndroid Build Coastguard Worker const ENDTAG: u8 = 0x79;
83*bb4ee6a4SAndroid Build Coastguard Worker const MEMORY32FIXEDDESC: u8 = 0x86;
84*bb4ee6a4SAndroid Build Coastguard Worker const DWORDADDRSPACEDESC: u8 = 0x87;
85*bb4ee6a4SAndroid Build Coastguard Worker const WORDADDRSPACEDESC: u8 = 0x88;
86*bb4ee6a4SAndroid Build Coastguard Worker const EXTIRQDESC: u8 = 0x89;
87*bb4ee6a4SAndroid Build Coastguard Worker const QWORDADDRSPACEDESC: u8 = 0x8A;
88*bb4ee6a4SAndroid Build Coastguard Worker 
89*bb4ee6a4SAndroid Build Coastguard Worker /// Zero object in ASL.
90*bb4ee6a4SAndroid Build Coastguard Worker pub const ZERO: Zero = Zero {};
91*bb4ee6a4SAndroid Build Coastguard Worker pub struct Zero {}
92*bb4ee6a4SAndroid Build Coastguard Worker 
93*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Zero {
to_aml_bytes(&self, bytes: &mut Vec<u8>)94*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
95*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(ZEROOP);
96*bb4ee6a4SAndroid Build Coastguard Worker     }
97*bb4ee6a4SAndroid Build Coastguard Worker }
98*bb4ee6a4SAndroid Build Coastguard Worker 
99*bb4ee6a4SAndroid Build Coastguard Worker /// One object in ASL.
100*bb4ee6a4SAndroid Build Coastguard Worker pub const ONE: One = One {};
101*bb4ee6a4SAndroid Build Coastguard Worker pub struct One {}
102*bb4ee6a4SAndroid Build Coastguard Worker 
103*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for One {
to_aml_bytes(&self, bytes: &mut Vec<u8>)104*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
105*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(ONEOP);
106*bb4ee6a4SAndroid Build Coastguard Worker     }
107*bb4ee6a4SAndroid Build Coastguard Worker }
108*bb4ee6a4SAndroid Build Coastguard Worker 
109*bb4ee6a4SAndroid Build Coastguard Worker /// Ones object represents all bits 1.
110*bb4ee6a4SAndroid Build Coastguard Worker pub const ONES: Ones = Ones {};
111*bb4ee6a4SAndroid Build Coastguard Worker pub struct Ones {}
112*bb4ee6a4SAndroid Build Coastguard Worker 
113*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Ones {
to_aml_bytes(&self, bytes: &mut Vec<u8>)114*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
115*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(ONESOP);
116*bb4ee6a4SAndroid Build Coastguard Worker     }
117*bb4ee6a4SAndroid Build Coastguard Worker }
118*bb4ee6a4SAndroid Build Coastguard Worker 
119*bb4ee6a4SAndroid Build Coastguard Worker /// Represents Namestring to construct ACPI objects like
120*bb4ee6a4SAndroid Build Coastguard Worker /// Name/Device/Method/Scope and so on...
121*bb4ee6a4SAndroid Build Coastguard Worker pub struct Path {
122*bb4ee6a4SAndroid Build Coastguard Worker     root: bool,
123*bb4ee6a4SAndroid Build Coastguard Worker     name_parts: Vec<[u8; 4]>,
124*bb4ee6a4SAndroid Build Coastguard Worker }
125*bb4ee6a4SAndroid Build Coastguard Worker 
126*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Path {
to_aml_bytes(&self, bytes: &mut Vec<u8>)127*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
128*bb4ee6a4SAndroid Build Coastguard Worker         if self.root {
129*bb4ee6a4SAndroid Build Coastguard Worker             bytes.push(b'\\');
130*bb4ee6a4SAndroid Build Coastguard Worker         }
131*bb4ee6a4SAndroid Build Coastguard Worker 
132*bb4ee6a4SAndroid Build Coastguard Worker         match self.name_parts.len() {
133*bb4ee6a4SAndroid Build Coastguard Worker             0 => panic!("Name cannot be empty"),
134*bb4ee6a4SAndroid Build Coastguard Worker             1 => {}
135*bb4ee6a4SAndroid Build Coastguard Worker             2 => {
136*bb4ee6a4SAndroid Build Coastguard Worker                 bytes.push(DUALNAMEPREFIX);
137*bb4ee6a4SAndroid Build Coastguard Worker             }
138*bb4ee6a4SAndroid Build Coastguard Worker             n => {
139*bb4ee6a4SAndroid Build Coastguard Worker                 bytes.push(MULTINAMEPREFIX);
140*bb4ee6a4SAndroid Build Coastguard Worker                 bytes.push(n as u8);
141*bb4ee6a4SAndroid Build Coastguard Worker             }
142*bb4ee6a4SAndroid Build Coastguard Worker         };
143*bb4ee6a4SAndroid Build Coastguard Worker 
144*bb4ee6a4SAndroid Build Coastguard Worker         for part in &self.name_parts {
145*bb4ee6a4SAndroid Build Coastguard Worker             bytes.extend_from_slice(part);
146*bb4ee6a4SAndroid Build Coastguard Worker         }
147*bb4ee6a4SAndroid Build Coastguard Worker     }
148*bb4ee6a4SAndroid Build Coastguard Worker }
149*bb4ee6a4SAndroid Build Coastguard Worker 
150*bb4ee6a4SAndroid Build Coastguard Worker impl Path {
151*bb4ee6a4SAndroid Build Coastguard Worker     /// Per ACPI Spec, the Namestring split by "." has 4 bytes long. So any name
152*bb4ee6a4SAndroid Build Coastguard Worker     /// not has 4 bytes will not be accepted.
new(name: &str) -> Self153*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(name: &str) -> Self {
154*bb4ee6a4SAndroid Build Coastguard Worker         let root = name.starts_with('\\');
155*bb4ee6a4SAndroid Build Coastguard Worker         let offset = root as usize;
156*bb4ee6a4SAndroid Build Coastguard Worker         let mut name_parts = Vec::new();
157*bb4ee6a4SAndroid Build Coastguard Worker         for part in name[offset..].split('.') {
158*bb4ee6a4SAndroid Build Coastguard Worker             assert_eq!(part.len(), 4);
159*bb4ee6a4SAndroid Build Coastguard Worker             let mut name_part = [0u8; 4];
160*bb4ee6a4SAndroid Build Coastguard Worker             name_part.copy_from_slice(part.as_bytes());
161*bb4ee6a4SAndroid Build Coastguard Worker             name_parts.push(name_part);
162*bb4ee6a4SAndroid Build Coastguard Worker         }
163*bb4ee6a4SAndroid Build Coastguard Worker 
164*bb4ee6a4SAndroid Build Coastguard Worker         Path { root, name_parts }
165*bb4ee6a4SAndroid Build Coastguard Worker     }
166*bb4ee6a4SAndroid Build Coastguard Worker }
167*bb4ee6a4SAndroid Build Coastguard Worker 
168*bb4ee6a4SAndroid Build Coastguard Worker impl From<&str> for Path {
from(s: &str) -> Self169*bb4ee6a4SAndroid Build Coastguard Worker     fn from(s: &str) -> Self {
170*bb4ee6a4SAndroid Build Coastguard Worker         Path::new(s)
171*bb4ee6a4SAndroid Build Coastguard Worker     }
172*bb4ee6a4SAndroid Build Coastguard Worker }
173*bb4ee6a4SAndroid Build Coastguard Worker 
174*bb4ee6a4SAndroid Build Coastguard Worker pub type Byte = u8;
175*bb4ee6a4SAndroid Build Coastguard Worker 
176*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Byte {
to_aml_bytes(&self, bytes: &mut Vec<u8>)177*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
178*bb4ee6a4SAndroid Build Coastguard Worker         match *self {
179*bb4ee6a4SAndroid Build Coastguard Worker             0 => ZERO.to_aml_bytes(bytes),
180*bb4ee6a4SAndroid Build Coastguard Worker             1 => ONE.to_aml_bytes(bytes),
181*bb4ee6a4SAndroid Build Coastguard Worker             _ => {
182*bb4ee6a4SAndroid Build Coastguard Worker                 bytes.push(BYTEPREFIX);
183*bb4ee6a4SAndroid Build Coastguard Worker                 bytes.push(*self);
184*bb4ee6a4SAndroid Build Coastguard Worker             }
185*bb4ee6a4SAndroid Build Coastguard Worker         }
186*bb4ee6a4SAndroid Build Coastguard Worker     }
187*bb4ee6a4SAndroid Build Coastguard Worker }
188*bb4ee6a4SAndroid Build Coastguard Worker 
189*bb4ee6a4SAndroid Build Coastguard Worker pub type Word = u16;
190*bb4ee6a4SAndroid Build Coastguard Worker 
191*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Word {
to_aml_bytes(&self, bytes: &mut Vec<u8>)192*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
193*bb4ee6a4SAndroid Build Coastguard Worker         if *self <= Byte::MAX.into() {
194*bb4ee6a4SAndroid Build Coastguard Worker             (*self as Byte).to_aml_bytes(bytes);
195*bb4ee6a4SAndroid Build Coastguard Worker         } else {
196*bb4ee6a4SAndroid Build Coastguard Worker             bytes.push(WORDPREFIX);
197*bb4ee6a4SAndroid Build Coastguard Worker             bytes.extend_from_slice(&self.to_le_bytes());
198*bb4ee6a4SAndroid Build Coastguard Worker         }
199*bb4ee6a4SAndroid Build Coastguard Worker     }
200*bb4ee6a4SAndroid Build Coastguard Worker }
201*bb4ee6a4SAndroid Build Coastguard Worker 
202*bb4ee6a4SAndroid Build Coastguard Worker pub type DWord = u32;
203*bb4ee6a4SAndroid Build Coastguard Worker 
204*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for DWord {
to_aml_bytes(&self, bytes: &mut Vec<u8>)205*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
206*bb4ee6a4SAndroid Build Coastguard Worker         if *self <= Word::MAX.into() {
207*bb4ee6a4SAndroid Build Coastguard Worker             (*self as Word).to_aml_bytes(bytes);
208*bb4ee6a4SAndroid Build Coastguard Worker         } else {
209*bb4ee6a4SAndroid Build Coastguard Worker             bytes.push(DWORDPREFIX);
210*bb4ee6a4SAndroid Build Coastguard Worker             bytes.extend_from_slice(&self.to_le_bytes());
211*bb4ee6a4SAndroid Build Coastguard Worker         }
212*bb4ee6a4SAndroid Build Coastguard Worker     }
213*bb4ee6a4SAndroid Build Coastguard Worker }
214*bb4ee6a4SAndroid Build Coastguard Worker 
215*bb4ee6a4SAndroid Build Coastguard Worker pub type QWord = u64;
216*bb4ee6a4SAndroid Build Coastguard Worker 
217*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for QWord {
to_aml_bytes(&self, bytes: &mut Vec<u8>)218*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
219*bb4ee6a4SAndroid Build Coastguard Worker         if *self <= DWord::MAX.into() {
220*bb4ee6a4SAndroid Build Coastguard Worker             (*self as DWord).to_aml_bytes(bytes);
221*bb4ee6a4SAndroid Build Coastguard Worker         } else {
222*bb4ee6a4SAndroid Build Coastguard Worker             bytes.push(QWORDPREFIX);
223*bb4ee6a4SAndroid Build Coastguard Worker             bytes.extend_from_slice(&self.to_le_bytes());
224*bb4ee6a4SAndroid Build Coastguard Worker         }
225*bb4ee6a4SAndroid Build Coastguard Worker     }
226*bb4ee6a4SAndroid Build Coastguard Worker }
227*bb4ee6a4SAndroid Build Coastguard Worker 
228*bb4ee6a4SAndroid Build Coastguard Worker /// Name object. bytes represents the raw AML data for it.
229*bb4ee6a4SAndroid Build Coastguard Worker pub struct Name {
230*bb4ee6a4SAndroid Build Coastguard Worker     bytes: Vec<u8>,
231*bb4ee6a4SAndroid Build Coastguard Worker }
232*bb4ee6a4SAndroid Build Coastguard Worker 
233*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Name {
to_aml_bytes(&self, bytes: &mut Vec<u8>)234*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
235*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&self.bytes);
236*bb4ee6a4SAndroid Build Coastguard Worker     }
237*bb4ee6a4SAndroid Build Coastguard Worker }
238*bb4ee6a4SAndroid Build Coastguard Worker 
239*bb4ee6a4SAndroid Build Coastguard Worker impl Name {
240*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Name object:
241*bb4ee6a4SAndroid Build Coastguard Worker     ///
242*bb4ee6a4SAndroid Build Coastguard Worker     /// * `path` - The namestring.
243*bb4ee6a4SAndroid Build Coastguard Worker     /// * `inner` - AML objects contained in this namespace.
new(path: Path, inner: &dyn Aml) -> Self244*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(path: Path, inner: &dyn Aml) -> Self {
245*bb4ee6a4SAndroid Build Coastguard Worker         let mut bytes = vec![NAMEOP];
246*bb4ee6a4SAndroid Build Coastguard Worker         path.to_aml_bytes(&mut bytes);
247*bb4ee6a4SAndroid Build Coastguard Worker         inner.to_aml_bytes(&mut bytes);
248*bb4ee6a4SAndroid Build Coastguard Worker         Name { bytes }
249*bb4ee6a4SAndroid Build Coastguard Worker     }
250*bb4ee6a4SAndroid Build Coastguard Worker 
251*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Field name object
252*bb4ee6a4SAndroid Build Coastguard Worker     ///
253*bb4ee6a4SAndroid Build Coastguard Worker     /// * 'field_name' - name string
new_field_name(field_name: &str) -> Self254*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new_field_name(field_name: &str) -> Self {
255*bb4ee6a4SAndroid Build Coastguard Worker         let bytes = field_name.as_bytes().to_vec();
256*bb4ee6a4SAndroid Build Coastguard Worker         Name { bytes }
257*bb4ee6a4SAndroid Build Coastguard Worker     }
258*bb4ee6a4SAndroid Build Coastguard Worker }
259*bb4ee6a4SAndroid Build Coastguard Worker 
260*bb4ee6a4SAndroid Build Coastguard Worker /// Package object. 'children' represents the ACPI objects contained in this package.
261*bb4ee6a4SAndroid Build Coastguard Worker pub struct Package {
262*bb4ee6a4SAndroid Build Coastguard Worker     children_bytes: Vec<u8>,
263*bb4ee6a4SAndroid Build Coastguard Worker }
264*bb4ee6a4SAndroid Build Coastguard Worker 
265*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Package {
to_aml_bytes(&self, aml: &mut Vec<u8>)266*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
267*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(PACKAGEOP);
268*bb4ee6a4SAndroid Build Coastguard Worker         append_pkg_length(aml, self.children_bytes.len());
269*bb4ee6a4SAndroid Build Coastguard Worker         aml.extend_from_slice(&self.children_bytes);
270*bb4ee6a4SAndroid Build Coastguard Worker     }
271*bb4ee6a4SAndroid Build Coastguard Worker }
272*bb4ee6a4SAndroid Build Coastguard Worker 
273*bb4ee6a4SAndroid Build Coastguard Worker impl Package {
274*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Package object:
new(children: Vec<&dyn Aml>) -> Package275*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(children: Vec<&dyn Aml>) -> Package {
276*bb4ee6a4SAndroid Build Coastguard Worker         let mut bytes = vec![children.len() as u8];
277*bb4ee6a4SAndroid Build Coastguard Worker         for child in &children {
278*bb4ee6a4SAndroid Build Coastguard Worker             child.to_aml_bytes(&mut bytes);
279*bb4ee6a4SAndroid Build Coastguard Worker         }
280*bb4ee6a4SAndroid Build Coastguard Worker         Package {
281*bb4ee6a4SAndroid Build Coastguard Worker             children_bytes: bytes,
282*bb4ee6a4SAndroid Build Coastguard Worker         }
283*bb4ee6a4SAndroid Build Coastguard Worker     }
284*bb4ee6a4SAndroid Build Coastguard Worker }
285*bb4ee6a4SAndroid Build Coastguard Worker 
286*bb4ee6a4SAndroid Build Coastguard Worker /// Variable Package Term
287*bb4ee6a4SAndroid Build Coastguard Worker pub struct VarPackageTerm<'a> {
288*bb4ee6a4SAndroid Build Coastguard Worker     data: &'a dyn Aml,
289*bb4ee6a4SAndroid Build Coastguard Worker }
290*bb4ee6a4SAndroid Build Coastguard Worker 
291*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for VarPackageTerm<'a> {
to_aml_bytes(&self, aml: &mut Vec<u8>)292*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
293*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(VARPACKAGEOP);
294*bb4ee6a4SAndroid Build Coastguard Worker 
295*bb4ee6a4SAndroid Build Coastguard Worker         let start = aml.len();
296*bb4ee6a4SAndroid Build Coastguard Worker         self.data.to_aml_bytes(aml);
297*bb4ee6a4SAndroid Build Coastguard Worker         let data_len = aml.len() - start;
298*bb4ee6a4SAndroid Build Coastguard Worker 
299*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(aml, start, data_len);
300*bb4ee6a4SAndroid Build Coastguard Worker     }
301*bb4ee6a4SAndroid Build Coastguard Worker }
302*bb4ee6a4SAndroid Build Coastguard Worker 
303*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> VarPackageTerm<'a> {
304*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Variable Package Term
new(data: &'a dyn Aml) -> Self305*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(data: &'a dyn Aml) -> Self {
306*bb4ee6a4SAndroid Build Coastguard Worker         VarPackageTerm { data }
307*bb4ee6a4SAndroid Build Coastguard Worker     }
308*bb4ee6a4SAndroid Build Coastguard Worker }
309*bb4ee6a4SAndroid Build Coastguard Worker 
310*bb4ee6a4SAndroid Build Coastguard Worker /*
311*bb4ee6a4SAndroid Build Coastguard Worker 
312*bb4ee6a4SAndroid Build Coastguard Worker From the ACPI spec for PkgLength:
313*bb4ee6a4SAndroid Build Coastguard Worker 
314*bb4ee6a4SAndroid Build Coastguard Worker "The high 2 bits of the first byte reveal how many follow bytes are in the PkgLength. If the
315*bb4ee6a4SAndroid Build Coastguard Worker PkgLength has only one byte, bit 0 through 5 are used to encode the package length (in other
316*bb4ee6a4SAndroid Build Coastguard Worker words, values 0-63). If the package length value is more than 63, more than one byte must be
317*bb4ee6a4SAndroid Build Coastguard Worker used for the encoding in which case bit 4 and 5 of the PkgLeadByte are reserved and must be zero.
318*bb4ee6a4SAndroid Build Coastguard Worker If the multiple bytes encoding is used, bits 0-3 of the PkgLeadByte become the least significant 4
319*bb4ee6a4SAndroid Build Coastguard Worker bits of the resulting package length value. The next ByteData will become the next least
320*bb4ee6a4SAndroid Build Coastguard Worker significant 8 bits of the resulting value and so on, up to 3 ByteData bytes. Thus, the maximum
321*bb4ee6a4SAndroid Build Coastguard Worker package length is 2**28."
322*bb4ee6a4SAndroid Build Coastguard Worker 
323*bb4ee6a4SAndroid Build Coastguard Worker */
324*bb4ee6a4SAndroid Build Coastguard Worker 
325*bb4ee6a4SAndroid Build Coastguard Worker /* Also used for NamedField but in that case the length is not included in itself */
insert_length(aml: &mut Vec<u8>, position: usize, len: usize, include_self: bool)326*bb4ee6a4SAndroid Build Coastguard Worker fn insert_length(aml: &mut Vec<u8>, position: usize, len: usize, include_self: bool) {
327*bb4ee6a4SAndroid Build Coastguard Worker     /* PkgLength is inclusive and includes the length bytes */
328*bb4ee6a4SAndroid Build Coastguard Worker     let length_length = if len < (2usize.pow(6) - 1) {
329*bb4ee6a4SAndroid Build Coastguard Worker         1
330*bb4ee6a4SAndroid Build Coastguard Worker     } else if len < (2usize.pow(12) - 2) {
331*bb4ee6a4SAndroid Build Coastguard Worker         2
332*bb4ee6a4SAndroid Build Coastguard Worker     } else if len < (2usize.pow(20) - 3) {
333*bb4ee6a4SAndroid Build Coastguard Worker         3
334*bb4ee6a4SAndroid Build Coastguard Worker     } else {
335*bb4ee6a4SAndroid Build Coastguard Worker         4
336*bb4ee6a4SAndroid Build Coastguard Worker     };
337*bb4ee6a4SAndroid Build Coastguard Worker 
338*bb4ee6a4SAndroid Build Coastguard Worker     let length = len + if include_self { length_length } else { 0 };
339*bb4ee6a4SAndroid Build Coastguard Worker 
340*bb4ee6a4SAndroid Build Coastguard Worker     match length_length {
341*bb4ee6a4SAndroid Build Coastguard Worker         1 => aml.insert(position, length as u8),
342*bb4ee6a4SAndroid Build Coastguard Worker         2 => {
343*bb4ee6a4SAndroid Build Coastguard Worker             aml.splice(
344*bb4ee6a4SAndroid Build Coastguard Worker                 position..position,
345*bb4ee6a4SAndroid Build Coastguard Worker                 [(1u8 << 6) | (length & 0xf) as u8, (length >> 4) as u8],
346*bb4ee6a4SAndroid Build Coastguard Worker             );
347*bb4ee6a4SAndroid Build Coastguard Worker         }
348*bb4ee6a4SAndroid Build Coastguard Worker         3 => {
349*bb4ee6a4SAndroid Build Coastguard Worker             aml.splice(
350*bb4ee6a4SAndroid Build Coastguard Worker                 position..position,
351*bb4ee6a4SAndroid Build Coastguard Worker                 [
352*bb4ee6a4SAndroid Build Coastguard Worker                     (2u8 << 6) | (length & 0xf) as u8,
353*bb4ee6a4SAndroid Build Coastguard Worker                     (length >> 4) as u8,
354*bb4ee6a4SAndroid Build Coastguard Worker                     (length >> 12) as u8,
355*bb4ee6a4SAndroid Build Coastguard Worker                 ],
356*bb4ee6a4SAndroid Build Coastguard Worker             );
357*bb4ee6a4SAndroid Build Coastguard Worker         }
358*bb4ee6a4SAndroid Build Coastguard Worker         _ => {
359*bb4ee6a4SAndroid Build Coastguard Worker             aml.splice(
360*bb4ee6a4SAndroid Build Coastguard Worker                 position..position,
361*bb4ee6a4SAndroid Build Coastguard Worker                 [
362*bb4ee6a4SAndroid Build Coastguard Worker                     (3u8 << 6) | (length & 0xf) as u8,
363*bb4ee6a4SAndroid Build Coastguard Worker                     (length >> 4) as u8,
364*bb4ee6a4SAndroid Build Coastguard Worker                     (length >> 12) as u8,
365*bb4ee6a4SAndroid Build Coastguard Worker                     (length >> 20) as u8,
366*bb4ee6a4SAndroid Build Coastguard Worker                 ],
367*bb4ee6a4SAndroid Build Coastguard Worker             );
368*bb4ee6a4SAndroid Build Coastguard Worker         }
369*bb4ee6a4SAndroid Build Coastguard Worker     }
370*bb4ee6a4SAndroid Build Coastguard Worker }
371*bb4ee6a4SAndroid Build Coastguard Worker 
insert_pkg_length(aml: &mut Vec<u8>, position: usize, len: usize)372*bb4ee6a4SAndroid Build Coastguard Worker fn insert_pkg_length(aml: &mut Vec<u8>, position: usize, len: usize) {
373*bb4ee6a4SAndroid Build Coastguard Worker     insert_length(aml, position, len, true);
374*bb4ee6a4SAndroid Build Coastguard Worker }
375*bb4ee6a4SAndroid Build Coastguard Worker 
append_pkg_length(aml: &mut Vec<u8>, len: usize)376*bb4ee6a4SAndroid Build Coastguard Worker fn append_pkg_length(aml: &mut Vec<u8>, len: usize) {
377*bb4ee6a4SAndroid Build Coastguard Worker     insert_length(aml, aml.len(), len, true);
378*bb4ee6a4SAndroid Build Coastguard Worker }
379*bb4ee6a4SAndroid Build Coastguard Worker 
380*bb4ee6a4SAndroid Build Coastguard Worker // Append a NamedField length, which does not count the size of the encoded length itself.
append_named_field_length(aml: &mut Vec<u8>, len: usize)381*bb4ee6a4SAndroid Build Coastguard Worker fn append_named_field_length(aml: &mut Vec<u8>, len: usize) {
382*bb4ee6a4SAndroid Build Coastguard Worker     insert_length(aml, aml.len(), len, false);
383*bb4ee6a4SAndroid Build Coastguard Worker }
384*bb4ee6a4SAndroid Build Coastguard Worker 
385*bb4ee6a4SAndroid Build Coastguard Worker /// EISAName object. 'value' means the encoded u32 EisaIdString.
386*bb4ee6a4SAndroid Build Coastguard Worker pub struct EISAName {
387*bb4ee6a4SAndroid Build Coastguard Worker     value: DWord,
388*bb4ee6a4SAndroid Build Coastguard Worker }
389*bb4ee6a4SAndroid Build Coastguard Worker 
390*bb4ee6a4SAndroid Build Coastguard Worker impl EISAName {
391*bb4ee6a4SAndroid Build Coastguard Worker     /// Per ACPI Spec, the EisaIdString must be a String
392*bb4ee6a4SAndroid Build Coastguard Worker     /// object of the form UUUNNNN, where U is an uppercase letter
393*bb4ee6a4SAndroid Build Coastguard Worker     /// and N is a hexadecimal digit. No asterisks or other characters
394*bb4ee6a4SAndroid Build Coastguard Worker     /// are allowed in the string.
new(name: &str) -> Self395*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(name: &str) -> Self {
396*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(name.len(), 7);
397*bb4ee6a4SAndroid Build Coastguard Worker 
398*bb4ee6a4SAndroid Build Coastguard Worker         let data = name.as_bytes();
399*bb4ee6a4SAndroid Build Coastguard Worker 
400*bb4ee6a4SAndroid Build Coastguard Worker         let value: u32 = (u32::from(data[0].checked_sub(NAMECHARBASE).unwrap()) << 26
401*bb4ee6a4SAndroid Build Coastguard Worker             | u32::from(data[1].checked_sub(NAMECHARBASE).unwrap()) << 21
402*bb4ee6a4SAndroid Build Coastguard Worker             | u32::from(data[2].checked_sub(NAMECHARBASE).unwrap()) << 16
403*bb4ee6a4SAndroid Build Coastguard Worker             | name.chars().nth(3).unwrap().to_digit(16).unwrap() << 12
404*bb4ee6a4SAndroid Build Coastguard Worker             | name.chars().nth(4).unwrap().to_digit(16).unwrap() << 8
405*bb4ee6a4SAndroid Build Coastguard Worker             | name.chars().nth(5).unwrap().to_digit(16).unwrap() << 4
406*bb4ee6a4SAndroid Build Coastguard Worker             | name.chars().nth(6).unwrap().to_digit(16).unwrap())
407*bb4ee6a4SAndroid Build Coastguard Worker         .swap_bytes();
408*bb4ee6a4SAndroid Build Coastguard Worker 
409*bb4ee6a4SAndroid Build Coastguard Worker         EISAName { value }
410*bb4ee6a4SAndroid Build Coastguard Worker     }
411*bb4ee6a4SAndroid Build Coastguard Worker }
412*bb4ee6a4SAndroid Build Coastguard Worker 
413*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for EISAName {
to_aml_bytes(&self, bytes: &mut Vec<u8>)414*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
415*bb4ee6a4SAndroid Build Coastguard Worker         self.value.to_aml_bytes(bytes);
416*bb4ee6a4SAndroid Build Coastguard Worker     }
417*bb4ee6a4SAndroid Build Coastguard Worker }
418*bb4ee6a4SAndroid Build Coastguard Worker 
419*bb4ee6a4SAndroid Build Coastguard Worker pub type Usize = usize;
420*bb4ee6a4SAndroid Build Coastguard Worker 
421*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Usize {
to_aml_bytes(&self, bytes: &mut Vec<u8>)422*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
423*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(target_pointer_width = "16")]
424*bb4ee6a4SAndroid Build Coastguard Worker         (*self as u16).to_aml_bytes(bytes);
425*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(target_pointer_width = "32")]
426*bb4ee6a4SAndroid Build Coastguard Worker         (*self as u32).to_aml_bytes(bytes);
427*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(target_pointer_width = "64")]
428*bb4ee6a4SAndroid Build Coastguard Worker         (*self as u64).to_aml_bytes(bytes);
429*bb4ee6a4SAndroid Build Coastguard Worker     }
430*bb4ee6a4SAndroid Build Coastguard Worker }
431*bb4ee6a4SAndroid Build Coastguard Worker 
append_aml_string(data: &mut Vec<u8>, v: &str)432*bb4ee6a4SAndroid Build Coastguard Worker fn append_aml_string(data: &mut Vec<u8>, v: &str) {
433*bb4ee6a4SAndroid Build Coastguard Worker     data.push(STRINGOP);
434*bb4ee6a4SAndroid Build Coastguard Worker     data.extend_from_slice(v.as_bytes());
435*bb4ee6a4SAndroid Build Coastguard Worker     data.push(0x0); /* NullChar */
436*bb4ee6a4SAndroid Build Coastguard Worker }
437*bb4ee6a4SAndroid Build Coastguard Worker 
438*bb4ee6a4SAndroid Build Coastguard Worker /// implement Aml trait for 'str' so that 'str' can be directly append to the aml vector
439*bb4ee6a4SAndroid Build Coastguard Worker pub type AmlStr = &'static str;
440*bb4ee6a4SAndroid Build Coastguard Worker 
441*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for AmlStr {
to_aml_bytes(&self, bytes: &mut Vec<u8>)442*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
443*bb4ee6a4SAndroid Build Coastguard Worker         append_aml_string(bytes, self);
444*bb4ee6a4SAndroid Build Coastguard Worker     }
445*bb4ee6a4SAndroid Build Coastguard Worker }
446*bb4ee6a4SAndroid Build Coastguard Worker 
447*bb4ee6a4SAndroid Build Coastguard Worker /// implement Aml trait for 'String'. So purpose with str.
448*bb4ee6a4SAndroid Build Coastguard Worker pub type AmlString = String;
449*bb4ee6a4SAndroid Build Coastguard Worker 
450*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for AmlString {
to_aml_bytes(&self, bytes: &mut Vec<u8>)451*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
452*bb4ee6a4SAndroid Build Coastguard Worker         append_aml_string(bytes, self);
453*bb4ee6a4SAndroid Build Coastguard Worker     }
454*bb4ee6a4SAndroid Build Coastguard Worker }
455*bb4ee6a4SAndroid Build Coastguard Worker 
456*bb4ee6a4SAndroid Build Coastguard Worker /// ResouceTemplate object. 'children' represents the ACPI objects in it.
457*bb4ee6a4SAndroid Build Coastguard Worker pub struct ResourceTemplate<'a> {
458*bb4ee6a4SAndroid Build Coastguard Worker     children: Vec<&'a dyn Aml>,
459*bb4ee6a4SAndroid Build Coastguard Worker }
460*bb4ee6a4SAndroid Build Coastguard Worker 
461*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for ResourceTemplate<'a> {
to_aml_bytes(&self, aml: &mut Vec<u8>)462*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
463*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(BUFFEROP);
464*bb4ee6a4SAndroid Build Coastguard Worker 
465*bb4ee6a4SAndroid Build Coastguard Worker         let pos = aml.len();
466*bb4ee6a4SAndroid Build Coastguard Worker 
467*bb4ee6a4SAndroid Build Coastguard Worker         // Add buffer data
468*bb4ee6a4SAndroid Build Coastguard Worker         for child in &self.children {
469*bb4ee6a4SAndroid Build Coastguard Worker             child.to_aml_bytes(aml);
470*bb4ee6a4SAndroid Build Coastguard Worker         }
471*bb4ee6a4SAndroid Build Coastguard Worker 
472*bb4ee6a4SAndroid Build Coastguard Worker         // Mark with end and mark checksum as as always valid
473*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(ENDTAG);
474*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(0); /* zero checksum byte */
475*bb4ee6a4SAndroid Build Coastguard Worker 
476*bb4ee6a4SAndroid Build Coastguard Worker         // Buffer length is an encoded integer including buffer data
477*bb4ee6a4SAndroid Build Coastguard Worker         // and EndTag and checksum byte
478*bb4ee6a4SAndroid Build Coastguard Worker         let buffer_length = aml.len() - pos;
479*bb4ee6a4SAndroid Build Coastguard Worker         let mut buffer_length_bytes = Vec::new();
480*bb4ee6a4SAndroid Build Coastguard Worker         buffer_length.to_aml_bytes(&mut buffer_length_bytes);
481*bb4ee6a4SAndroid Build Coastguard Worker         aml.splice(pos..pos, buffer_length_bytes);
482*bb4ee6a4SAndroid Build Coastguard Worker 
483*bb4ee6a4SAndroid Build Coastguard Worker         // PkgLength is everything else
484*bb4ee6a4SAndroid Build Coastguard Worker         let len = aml.len() - pos;
485*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(aml, pos, len);
486*bb4ee6a4SAndroid Build Coastguard Worker     }
487*bb4ee6a4SAndroid Build Coastguard Worker }
488*bb4ee6a4SAndroid Build Coastguard Worker 
489*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> ResourceTemplate<'a> {
490*bb4ee6a4SAndroid Build Coastguard Worker     /// Create ResouceTemplate object
new(children: Vec<&'a dyn Aml>) -> Self491*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(children: Vec<&'a dyn Aml>) -> Self {
492*bb4ee6a4SAndroid Build Coastguard Worker         ResourceTemplate { children }
493*bb4ee6a4SAndroid Build Coastguard Worker     }
494*bb4ee6a4SAndroid Build Coastguard Worker }
495*bb4ee6a4SAndroid Build Coastguard Worker 
496*bb4ee6a4SAndroid Build Coastguard Worker /// Memory32Fixed object with read_write accessing type, and the base address/length.
497*bb4ee6a4SAndroid Build Coastguard Worker pub struct Memory32Fixed {
498*bb4ee6a4SAndroid Build Coastguard Worker     read_write: bool, /* true for read & write, false for read only */
499*bb4ee6a4SAndroid Build Coastguard Worker     base: u32,
500*bb4ee6a4SAndroid Build Coastguard Worker     length: u32,
501*bb4ee6a4SAndroid Build Coastguard Worker }
502*bb4ee6a4SAndroid Build Coastguard Worker 
503*bb4ee6a4SAndroid Build Coastguard Worker impl Memory32Fixed {
504*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Memory32Fixed object.
new(read_write: bool, base: u32, length: u32) -> Self505*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(read_write: bool, base: u32, length: u32) -> Self {
506*bb4ee6a4SAndroid Build Coastguard Worker         Memory32Fixed {
507*bb4ee6a4SAndroid Build Coastguard Worker             read_write,
508*bb4ee6a4SAndroid Build Coastguard Worker             base,
509*bb4ee6a4SAndroid Build Coastguard Worker             length,
510*bb4ee6a4SAndroid Build Coastguard Worker         }
511*bb4ee6a4SAndroid Build Coastguard Worker     }
512*bb4ee6a4SAndroid Build Coastguard Worker }
513*bb4ee6a4SAndroid Build Coastguard Worker 
514*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Memory32Fixed {
to_aml_bytes(&self, bytes: &mut Vec<u8>)515*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
516*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(MEMORY32FIXEDDESC); /* 32bit Fixed Memory Range Descriptor */
517*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&9u16.to_le_bytes());
518*bb4ee6a4SAndroid Build Coastguard Worker 
519*bb4ee6a4SAndroid Build Coastguard Worker         // 9 bytes of payload
520*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(self.read_write as u8);
521*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&self.base.to_le_bytes());
522*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&self.length.to_le_bytes());
523*bb4ee6a4SAndroid Build Coastguard Worker     }
524*bb4ee6a4SAndroid Build Coastguard Worker }
525*bb4ee6a4SAndroid Build Coastguard Worker 
526*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone)]
527*bb4ee6a4SAndroid Build Coastguard Worker enum AddressSpaceType {
528*bb4ee6a4SAndroid Build Coastguard Worker     Memory,
529*bb4ee6a4SAndroid Build Coastguard Worker     IO,
530*bb4ee6a4SAndroid Build Coastguard Worker     BusNumber,
531*bb4ee6a4SAndroid Build Coastguard Worker }
532*bb4ee6a4SAndroid Build Coastguard Worker 
533*bb4ee6a4SAndroid Build Coastguard Worker /// AddressSpaceCachable represent cache types for AddressSpace object
534*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone)]
535*bb4ee6a4SAndroid Build Coastguard Worker pub enum AddressSpaceCachable {
536*bb4ee6a4SAndroid Build Coastguard Worker     NotCacheable,
537*bb4ee6a4SAndroid Build Coastguard Worker     Cacheable,
538*bb4ee6a4SAndroid Build Coastguard Worker     WriteCombining,
539*bb4ee6a4SAndroid Build Coastguard Worker     PreFetchable,
540*bb4ee6a4SAndroid Build Coastguard Worker }
541*bb4ee6a4SAndroid Build Coastguard Worker 
542*bb4ee6a4SAndroid Build Coastguard Worker /// AddressSpace structure with type, resouce range and flags to
543*bb4ee6a4SAndroid Build Coastguard Worker /// construct Memory/IO/BusNumber objects
544*bb4ee6a4SAndroid Build Coastguard Worker pub struct AddressSpace<T> {
545*bb4ee6a4SAndroid Build Coastguard Worker     type_: AddressSpaceType,
546*bb4ee6a4SAndroid Build Coastguard Worker     min: T,
547*bb4ee6a4SAndroid Build Coastguard Worker     max: T,
548*bb4ee6a4SAndroid Build Coastguard Worker     type_flags: u8,
549*bb4ee6a4SAndroid Build Coastguard Worker }
550*bb4ee6a4SAndroid Build Coastguard Worker 
551*bb4ee6a4SAndroid Build Coastguard Worker impl<T> AddressSpace<T> {
552*bb4ee6a4SAndroid Build Coastguard Worker     /// Create DWordMemory/QWordMemory object
new_memory(cacheable: AddressSpaceCachable, read_write: bool, min: T, max: T) -> Self553*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new_memory(cacheable: AddressSpaceCachable, read_write: bool, min: T, max: T) -> Self {
554*bb4ee6a4SAndroid Build Coastguard Worker         AddressSpace {
555*bb4ee6a4SAndroid Build Coastguard Worker             type_: AddressSpaceType::Memory,
556*bb4ee6a4SAndroid Build Coastguard Worker             min,
557*bb4ee6a4SAndroid Build Coastguard Worker             max,
558*bb4ee6a4SAndroid Build Coastguard Worker             type_flags: (cacheable as u8) << 1 | read_write as u8,
559*bb4ee6a4SAndroid Build Coastguard Worker         }
560*bb4ee6a4SAndroid Build Coastguard Worker     }
561*bb4ee6a4SAndroid Build Coastguard Worker 
562*bb4ee6a4SAndroid Build Coastguard Worker     /// Create WordIO/DWordIO/QWordIO object
new_io(min: T, max: T) -> Self563*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new_io(min: T, max: T) -> Self {
564*bb4ee6a4SAndroid Build Coastguard Worker         AddressSpace {
565*bb4ee6a4SAndroid Build Coastguard Worker             type_: AddressSpaceType::IO,
566*bb4ee6a4SAndroid Build Coastguard Worker             min,
567*bb4ee6a4SAndroid Build Coastguard Worker             max,
568*bb4ee6a4SAndroid Build Coastguard Worker             type_flags: 3, /* EntireRange */
569*bb4ee6a4SAndroid Build Coastguard Worker         }
570*bb4ee6a4SAndroid Build Coastguard Worker     }
571*bb4ee6a4SAndroid Build Coastguard Worker 
572*bb4ee6a4SAndroid Build Coastguard Worker     /// Create WordBusNumber object
new_bus_number(min: T, max: T) -> Self573*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new_bus_number(min: T, max: T) -> Self {
574*bb4ee6a4SAndroid Build Coastguard Worker         AddressSpace {
575*bb4ee6a4SAndroid Build Coastguard Worker             type_: AddressSpaceType::BusNumber,
576*bb4ee6a4SAndroid Build Coastguard Worker             min,
577*bb4ee6a4SAndroid Build Coastguard Worker             max,
578*bb4ee6a4SAndroid Build Coastguard Worker             type_flags: 0,
579*bb4ee6a4SAndroid Build Coastguard Worker         }
580*bb4ee6a4SAndroid Build Coastguard Worker     }
581*bb4ee6a4SAndroid Build Coastguard Worker 
push_header(&self, bytes: &mut Vec<u8>, descriptor: u8, length: usize)582*bb4ee6a4SAndroid Build Coastguard Worker     fn push_header(&self, bytes: &mut Vec<u8>, descriptor: u8, length: usize) {
583*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(descriptor); /* Word Address Space Descriptor */
584*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&(length as u16).to_le_bytes());
585*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(self.type_ as u8); /* type */
586*bb4ee6a4SAndroid Build Coastguard Worker         let generic_flags = 1 << 2 /* Min Fixed */ | 1 << 3; /* Max Fixed */
587*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(generic_flags);
588*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(self.type_flags);
589*bb4ee6a4SAndroid Build Coastguard Worker     }
590*bb4ee6a4SAndroid Build Coastguard Worker }
591*bb4ee6a4SAndroid Build Coastguard Worker 
592*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for AddressSpace<u16> {
to_aml_bytes(&self, bytes: &mut Vec<u8>)593*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
594*bb4ee6a4SAndroid Build Coastguard Worker         self.push_header(
595*bb4ee6a4SAndroid Build Coastguard Worker             bytes,
596*bb4ee6a4SAndroid Build Coastguard Worker             WORDADDRSPACEDESC,                  /* Word Address Space Descriptor */
597*bb4ee6a4SAndroid Build Coastguard Worker             3 + 5 * std::mem::size_of::<u16>(), /* 3 bytes of header + 5 u16 fields */
598*bb4ee6a4SAndroid Build Coastguard Worker         );
599*bb4ee6a4SAndroid Build Coastguard Worker 
600*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&0u16.to_le_bytes()); /* Granularity */
601*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&self.min.to_le_bytes()); /* Min */
602*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&self.max.to_le_bytes()); /* Max */
603*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&0u16.to_le_bytes()); /* Translation */
604*bb4ee6a4SAndroid Build Coastguard Worker         let len = self.max - self.min + 1;
605*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&len.to_le_bytes()); /* Length */
606*bb4ee6a4SAndroid Build Coastguard Worker     }
607*bb4ee6a4SAndroid Build Coastguard Worker }
608*bb4ee6a4SAndroid Build Coastguard Worker 
609*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for AddressSpace<u32> {
to_aml_bytes(&self, bytes: &mut Vec<u8>)610*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
611*bb4ee6a4SAndroid Build Coastguard Worker         self.push_header(
612*bb4ee6a4SAndroid Build Coastguard Worker             bytes,
613*bb4ee6a4SAndroid Build Coastguard Worker             DWORDADDRSPACEDESC, /* DWord Address Space Descriptor */
614*bb4ee6a4SAndroid Build Coastguard Worker             3 + 5 * std::mem::size_of::<u32>(), /* 3 bytes of header + 5 u32 fields */
615*bb4ee6a4SAndroid Build Coastguard Worker         );
616*bb4ee6a4SAndroid Build Coastguard Worker 
617*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&0u32.to_le_bytes()); /* Granularity */
618*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&self.min.to_le_bytes()); /* Min */
619*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&self.max.to_le_bytes()); /* Max */
620*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&0u32.to_le_bytes()); /* Translation */
621*bb4ee6a4SAndroid Build Coastguard Worker         let len = self.max - self.min + 1;
622*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&len.to_le_bytes()); /* Length */
623*bb4ee6a4SAndroid Build Coastguard Worker     }
624*bb4ee6a4SAndroid Build Coastguard Worker }
625*bb4ee6a4SAndroid Build Coastguard Worker 
626*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for AddressSpace<u64> {
to_aml_bytes(&self, bytes: &mut Vec<u8>)627*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
628*bb4ee6a4SAndroid Build Coastguard Worker         self.push_header(
629*bb4ee6a4SAndroid Build Coastguard Worker             bytes,
630*bb4ee6a4SAndroid Build Coastguard Worker             QWORDADDRSPACEDESC, /* QWord Address Space Descriptor */
631*bb4ee6a4SAndroid Build Coastguard Worker             3 + 5 * std::mem::size_of::<u64>(), /* 3 bytes of header + 5 u64 fields */
632*bb4ee6a4SAndroid Build Coastguard Worker         );
633*bb4ee6a4SAndroid Build Coastguard Worker 
634*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&0u64.to_le_bytes()); /* Granularity */
635*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&self.min.to_le_bytes()); /* Min */
636*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&self.max.to_le_bytes()); /* Max */
637*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&0u64.to_le_bytes()); /* Translation */
638*bb4ee6a4SAndroid Build Coastguard Worker         let len = self.max - self.min + 1;
639*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&len.to_le_bytes()); /* Length */
640*bb4ee6a4SAndroid Build Coastguard Worker     }
641*bb4ee6a4SAndroid Build Coastguard Worker }
642*bb4ee6a4SAndroid Build Coastguard Worker 
643*bb4ee6a4SAndroid Build Coastguard Worker /// IO resouce object with the IO range, alignment and length
644*bb4ee6a4SAndroid Build Coastguard Worker pub struct IO {
645*bb4ee6a4SAndroid Build Coastguard Worker     min: u16,
646*bb4ee6a4SAndroid Build Coastguard Worker     max: u16,
647*bb4ee6a4SAndroid Build Coastguard Worker     alignment: u8,
648*bb4ee6a4SAndroid Build Coastguard Worker     length: u8,
649*bb4ee6a4SAndroid Build Coastguard Worker }
650*bb4ee6a4SAndroid Build Coastguard Worker 
651*bb4ee6a4SAndroid Build Coastguard Worker impl IO {
652*bb4ee6a4SAndroid Build Coastguard Worker     /// Create IO object
new(min: u16, max: u16, alignment: u8, length: u8) -> Self653*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(min: u16, max: u16, alignment: u8, length: u8) -> Self {
654*bb4ee6a4SAndroid Build Coastguard Worker         IO {
655*bb4ee6a4SAndroid Build Coastguard Worker             min,
656*bb4ee6a4SAndroid Build Coastguard Worker             max,
657*bb4ee6a4SAndroid Build Coastguard Worker             alignment,
658*bb4ee6a4SAndroid Build Coastguard Worker             length,
659*bb4ee6a4SAndroid Build Coastguard Worker         }
660*bb4ee6a4SAndroid Build Coastguard Worker     }
661*bb4ee6a4SAndroid Build Coastguard Worker }
662*bb4ee6a4SAndroid Build Coastguard Worker 
663*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for IO {
to_aml_bytes(&self, bytes: &mut Vec<u8>)664*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
665*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(IOPORTDESC); /* IO Port Descriptor */
666*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(1); /* IODecode16 */
667*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&self.min.to_le_bytes());
668*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&self.max.to_le_bytes());
669*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(self.alignment);
670*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(self.length);
671*bb4ee6a4SAndroid Build Coastguard Worker     }
672*bb4ee6a4SAndroid Build Coastguard Worker }
673*bb4ee6a4SAndroid Build Coastguard Worker 
674*bb4ee6a4SAndroid Build Coastguard Worker /// Interrupt resouce object with the interrupt characters.
675*bb4ee6a4SAndroid Build Coastguard Worker pub struct Interrupt {
676*bb4ee6a4SAndroid Build Coastguard Worker     consumer: bool,
677*bb4ee6a4SAndroid Build Coastguard Worker     edge_triggered: bool,
678*bb4ee6a4SAndroid Build Coastguard Worker     active_low: bool,
679*bb4ee6a4SAndroid Build Coastguard Worker     shared: bool,
680*bb4ee6a4SAndroid Build Coastguard Worker     number: u32,
681*bb4ee6a4SAndroid Build Coastguard Worker }
682*bb4ee6a4SAndroid Build Coastguard Worker 
683*bb4ee6a4SAndroid Build Coastguard Worker impl Interrupt {
684*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Interrupt object
new( consumer: bool, edge_triggered: bool, active_low: bool, shared: bool, number: u32, ) -> Self685*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(
686*bb4ee6a4SAndroid Build Coastguard Worker         consumer: bool,
687*bb4ee6a4SAndroid Build Coastguard Worker         edge_triggered: bool,
688*bb4ee6a4SAndroid Build Coastguard Worker         active_low: bool,
689*bb4ee6a4SAndroid Build Coastguard Worker         shared: bool,
690*bb4ee6a4SAndroid Build Coastguard Worker         number: u32,
691*bb4ee6a4SAndroid Build Coastguard Worker     ) -> Self {
692*bb4ee6a4SAndroid Build Coastguard Worker         Interrupt {
693*bb4ee6a4SAndroid Build Coastguard Worker             consumer,
694*bb4ee6a4SAndroid Build Coastguard Worker             edge_triggered,
695*bb4ee6a4SAndroid Build Coastguard Worker             active_low,
696*bb4ee6a4SAndroid Build Coastguard Worker             shared,
697*bb4ee6a4SAndroid Build Coastguard Worker             number,
698*bb4ee6a4SAndroid Build Coastguard Worker         }
699*bb4ee6a4SAndroid Build Coastguard Worker     }
700*bb4ee6a4SAndroid Build Coastguard Worker }
701*bb4ee6a4SAndroid Build Coastguard Worker 
702*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Interrupt {
to_aml_bytes(&self, bytes: &mut Vec<u8>)703*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
704*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(EXTIRQDESC); /* Extended IRQ Descriptor */
705*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&6u16.to_le_bytes());
706*bb4ee6a4SAndroid Build Coastguard Worker         let flags = (self.shared as u8) << 3
707*bb4ee6a4SAndroid Build Coastguard Worker             | (self.active_low as u8) << 2
708*bb4ee6a4SAndroid Build Coastguard Worker             | (self.edge_triggered as u8) << 1
709*bb4ee6a4SAndroid Build Coastguard Worker             | self.consumer as u8;
710*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(flags);
711*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(1u8); /* count */
712*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&self.number.to_le_bytes());
713*bb4ee6a4SAndroid Build Coastguard Worker     }
714*bb4ee6a4SAndroid Build Coastguard Worker }
715*bb4ee6a4SAndroid Build Coastguard Worker 
716*bb4ee6a4SAndroid Build Coastguard Worker /// Device object with its device name and children objects in it.
717*bb4ee6a4SAndroid Build Coastguard Worker pub struct Device<'a> {
718*bb4ee6a4SAndroid Build Coastguard Worker     path: Path,
719*bb4ee6a4SAndroid Build Coastguard Worker     children: Vec<&'a dyn Aml>,
720*bb4ee6a4SAndroid Build Coastguard Worker }
721*bb4ee6a4SAndroid Build Coastguard Worker 
722*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for Device<'a> {
to_aml_bytes(&self, aml: &mut Vec<u8>)723*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
724*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(EXTOPPREFIX); /* ExtOpPrefix */
725*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(DEVICEOP); /* DeviceOp */
726*bb4ee6a4SAndroid Build Coastguard Worker 
727*bb4ee6a4SAndroid Build Coastguard Worker         let start = aml.len();
728*bb4ee6a4SAndroid Build Coastguard Worker         self.path.to_aml_bytes(aml);
729*bb4ee6a4SAndroid Build Coastguard Worker         for child in &self.children {
730*bb4ee6a4SAndroid Build Coastguard Worker             child.to_aml_bytes(aml);
731*bb4ee6a4SAndroid Build Coastguard Worker         }
732*bb4ee6a4SAndroid Build Coastguard Worker         let len = aml.len() - start;
733*bb4ee6a4SAndroid Build Coastguard Worker 
734*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(aml, start, len);
735*bb4ee6a4SAndroid Build Coastguard Worker     }
736*bb4ee6a4SAndroid Build Coastguard Worker }
737*bb4ee6a4SAndroid Build Coastguard Worker 
738*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Device<'a> {
739*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Device object
new(path: Path, children: Vec<&'a dyn Aml>) -> Self740*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(path: Path, children: Vec<&'a dyn Aml>) -> Self {
741*bb4ee6a4SAndroid Build Coastguard Worker         Device { path, children }
742*bb4ee6a4SAndroid Build Coastguard Worker     }
743*bb4ee6a4SAndroid Build Coastguard Worker }
744*bb4ee6a4SAndroid Build Coastguard Worker 
745*bb4ee6a4SAndroid Build Coastguard Worker /// Scope object with its name and children objects in it.
746*bb4ee6a4SAndroid Build Coastguard Worker pub struct Scope<'a> {
747*bb4ee6a4SAndroid Build Coastguard Worker     path: Path,
748*bb4ee6a4SAndroid Build Coastguard Worker     children: Vec<&'a dyn Aml>,
749*bb4ee6a4SAndroid Build Coastguard Worker }
750*bb4ee6a4SAndroid Build Coastguard Worker 
751*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for Scope<'a> {
to_aml_bytes(&self, aml: &mut Vec<u8>)752*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
753*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(SCOPEOP);
754*bb4ee6a4SAndroid Build Coastguard Worker 
755*bb4ee6a4SAndroid Build Coastguard Worker         let start = aml.len();
756*bb4ee6a4SAndroid Build Coastguard Worker         self.path.to_aml_bytes(aml);
757*bb4ee6a4SAndroid Build Coastguard Worker         for child in &self.children {
758*bb4ee6a4SAndroid Build Coastguard Worker             child.to_aml_bytes(aml);
759*bb4ee6a4SAndroid Build Coastguard Worker         }
760*bb4ee6a4SAndroid Build Coastguard Worker         let len = aml.len() - start;
761*bb4ee6a4SAndroid Build Coastguard Worker 
762*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(aml, start, len);
763*bb4ee6a4SAndroid Build Coastguard Worker     }
764*bb4ee6a4SAndroid Build Coastguard Worker }
765*bb4ee6a4SAndroid Build Coastguard Worker 
766*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Scope<'a> {
767*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Scope object
new(path: Path, children: Vec<&'a dyn Aml>) -> Self768*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(path: Path, children: Vec<&'a dyn Aml>) -> Self {
769*bb4ee6a4SAndroid Build Coastguard Worker         Scope { path, children }
770*bb4ee6a4SAndroid Build Coastguard Worker     }
771*bb4ee6a4SAndroid Build Coastguard Worker 
772*bb4ee6a4SAndroid Build Coastguard Worker     /// Create raw bytes representing a Scope from its children in raw bytes
raw(path: Path, mut children: Vec<u8>) -> Vec<u8>773*bb4ee6a4SAndroid Build Coastguard Worker     pub fn raw(path: Path, mut children: Vec<u8>) -> Vec<u8> {
774*bb4ee6a4SAndroid Build Coastguard Worker         let mut bytes = Vec::new();
775*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(SCOPEOP);
776*bb4ee6a4SAndroid Build Coastguard Worker 
777*bb4ee6a4SAndroid Build Coastguard Worker         let start = bytes.len();
778*bb4ee6a4SAndroid Build Coastguard Worker         path.to_aml_bytes(&mut bytes);
779*bb4ee6a4SAndroid Build Coastguard Worker         bytes.append(&mut children);
780*bb4ee6a4SAndroid Build Coastguard Worker         let len = bytes.len() - start;
781*bb4ee6a4SAndroid Build Coastguard Worker 
782*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(&mut bytes, start, len);
783*bb4ee6a4SAndroid Build Coastguard Worker 
784*bb4ee6a4SAndroid Build Coastguard Worker         bytes
785*bb4ee6a4SAndroid Build Coastguard Worker     }
786*bb4ee6a4SAndroid Build Coastguard Worker }
787*bb4ee6a4SAndroid Build Coastguard Worker 
788*bb4ee6a4SAndroid Build Coastguard Worker /// Method object with its name, children objects, arguments and serialized character.
789*bb4ee6a4SAndroid Build Coastguard Worker pub struct Method<'a> {
790*bb4ee6a4SAndroid Build Coastguard Worker     path: Path,
791*bb4ee6a4SAndroid Build Coastguard Worker     children: Vec<&'a dyn Aml>,
792*bb4ee6a4SAndroid Build Coastguard Worker     args: u8,
793*bb4ee6a4SAndroid Build Coastguard Worker     serialized: bool,
794*bb4ee6a4SAndroid Build Coastguard Worker }
795*bb4ee6a4SAndroid Build Coastguard Worker 
796*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Method<'a> {
797*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Method object.
new(path: Path, args: u8, serialized: bool, children: Vec<&'a dyn Aml>) -> Self798*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(path: Path, args: u8, serialized: bool, children: Vec<&'a dyn Aml>) -> Self {
799*bb4ee6a4SAndroid Build Coastguard Worker         Method {
800*bb4ee6a4SAndroid Build Coastguard Worker             path,
801*bb4ee6a4SAndroid Build Coastguard Worker             children,
802*bb4ee6a4SAndroid Build Coastguard Worker             args,
803*bb4ee6a4SAndroid Build Coastguard Worker             serialized,
804*bb4ee6a4SAndroid Build Coastguard Worker         }
805*bb4ee6a4SAndroid Build Coastguard Worker     }
806*bb4ee6a4SAndroid Build Coastguard Worker }
807*bb4ee6a4SAndroid Build Coastguard Worker 
808*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for Method<'a> {
to_aml_bytes(&self, aml: &mut Vec<u8>)809*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
810*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(METHODOP);
811*bb4ee6a4SAndroid Build Coastguard Worker 
812*bb4ee6a4SAndroid Build Coastguard Worker         let start = aml.len();
813*bb4ee6a4SAndroid Build Coastguard Worker         self.path.to_aml_bytes(aml);
814*bb4ee6a4SAndroid Build Coastguard Worker         let flags: u8 = (self.args & 0x7) | (self.serialized as u8) << 3;
815*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(flags);
816*bb4ee6a4SAndroid Build Coastguard Worker         for child in &self.children {
817*bb4ee6a4SAndroid Build Coastguard Worker             child.to_aml_bytes(aml);
818*bb4ee6a4SAndroid Build Coastguard Worker         }
819*bb4ee6a4SAndroid Build Coastguard Worker         let len = aml.len() - start;
820*bb4ee6a4SAndroid Build Coastguard Worker 
821*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(aml, start, len);
822*bb4ee6a4SAndroid Build Coastguard Worker     }
823*bb4ee6a4SAndroid Build Coastguard Worker }
824*bb4ee6a4SAndroid Build Coastguard Worker 
825*bb4ee6a4SAndroid Build Coastguard Worker /// FieldAccessType defines the field accessing types.
826*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone, Copy)]
827*bb4ee6a4SAndroid Build Coastguard Worker pub enum FieldAccessType {
828*bb4ee6a4SAndroid Build Coastguard Worker     Any,
829*bb4ee6a4SAndroid Build Coastguard Worker     Byte,
830*bb4ee6a4SAndroid Build Coastguard Worker     Word,
831*bb4ee6a4SAndroid Build Coastguard Worker     DWord,
832*bb4ee6a4SAndroid Build Coastguard Worker     QWord,
833*bb4ee6a4SAndroid Build Coastguard Worker     Buffer,
834*bb4ee6a4SAndroid Build Coastguard Worker }
835*bb4ee6a4SAndroid Build Coastguard Worker 
836*bb4ee6a4SAndroid Build Coastguard Worker /// FieldLockRule defines the rules whether to use the Global Lock.
837*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone, Copy)]
838*bb4ee6a4SAndroid Build Coastguard Worker pub enum FieldLockRule {
839*bb4ee6a4SAndroid Build Coastguard Worker     NoLock = 0,
840*bb4ee6a4SAndroid Build Coastguard Worker     Lock = 1,
841*bb4ee6a4SAndroid Build Coastguard Worker }
842*bb4ee6a4SAndroid Build Coastguard Worker 
843*bb4ee6a4SAndroid Build Coastguard Worker /// FieldUpdateRule defines the rules to update the field.
844*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone, Copy)]
845*bb4ee6a4SAndroid Build Coastguard Worker pub enum FieldUpdateRule {
846*bb4ee6a4SAndroid Build Coastguard Worker     Preserve = 0,
847*bb4ee6a4SAndroid Build Coastguard Worker     WriteAsOnes = 1,
848*bb4ee6a4SAndroid Build Coastguard Worker     WriteAsZeroes = 2,
849*bb4ee6a4SAndroid Build Coastguard Worker }
850*bb4ee6a4SAndroid Build Coastguard Worker 
851*bb4ee6a4SAndroid Build Coastguard Worker /// FieldEntry defines the field entry.
852*bb4ee6a4SAndroid Build Coastguard Worker pub enum FieldEntry {
853*bb4ee6a4SAndroid Build Coastguard Worker     Named([u8; 4], usize),
854*bb4ee6a4SAndroid Build Coastguard Worker     Reserved(usize),
855*bb4ee6a4SAndroid Build Coastguard Worker }
856*bb4ee6a4SAndroid Build Coastguard Worker 
857*bb4ee6a4SAndroid Build Coastguard Worker /// Field object with the region name, field entries, access type and update rules.
858*bb4ee6a4SAndroid Build Coastguard Worker pub struct Field {
859*bb4ee6a4SAndroid Build Coastguard Worker     path: Path,
860*bb4ee6a4SAndroid Build Coastguard Worker 
861*bb4ee6a4SAndroid Build Coastguard Worker     fields: Vec<FieldEntry>,
862*bb4ee6a4SAndroid Build Coastguard Worker     access_type: FieldAccessType,
863*bb4ee6a4SAndroid Build Coastguard Worker     lock_rule: FieldLockRule,
864*bb4ee6a4SAndroid Build Coastguard Worker     update_rule: FieldUpdateRule,
865*bb4ee6a4SAndroid Build Coastguard Worker }
866*bb4ee6a4SAndroid Build Coastguard Worker 
867*bb4ee6a4SAndroid Build Coastguard Worker impl Field {
868*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Field object
new( path: Path, access_type: FieldAccessType, lock_rule: FieldLockRule, update_rule: FieldUpdateRule, fields: Vec<FieldEntry>, ) -> Self869*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(
870*bb4ee6a4SAndroid Build Coastguard Worker         path: Path,
871*bb4ee6a4SAndroid Build Coastguard Worker         access_type: FieldAccessType,
872*bb4ee6a4SAndroid Build Coastguard Worker         lock_rule: FieldLockRule,
873*bb4ee6a4SAndroid Build Coastguard Worker         update_rule: FieldUpdateRule,
874*bb4ee6a4SAndroid Build Coastguard Worker         fields: Vec<FieldEntry>,
875*bb4ee6a4SAndroid Build Coastguard Worker     ) -> Self {
876*bb4ee6a4SAndroid Build Coastguard Worker         Field {
877*bb4ee6a4SAndroid Build Coastguard Worker             path,
878*bb4ee6a4SAndroid Build Coastguard Worker             access_type,
879*bb4ee6a4SAndroid Build Coastguard Worker             lock_rule,
880*bb4ee6a4SAndroid Build Coastguard Worker             update_rule,
881*bb4ee6a4SAndroid Build Coastguard Worker             fields,
882*bb4ee6a4SAndroid Build Coastguard Worker         }
883*bb4ee6a4SAndroid Build Coastguard Worker     }
884*bb4ee6a4SAndroid Build Coastguard Worker }
885*bb4ee6a4SAndroid Build Coastguard Worker 
886*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Field {
to_aml_bytes(&self, aml: &mut Vec<u8>)887*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
888*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(EXTOPPREFIX);
889*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(FIELDOP);
890*bb4ee6a4SAndroid Build Coastguard Worker 
891*bb4ee6a4SAndroid Build Coastguard Worker         let start = aml.len();
892*bb4ee6a4SAndroid Build Coastguard Worker         self.path.to_aml_bytes(aml);
893*bb4ee6a4SAndroid Build Coastguard Worker 
894*bb4ee6a4SAndroid Build Coastguard Worker         let flags: u8 =
895*bb4ee6a4SAndroid Build Coastguard Worker             self.access_type as u8 | (self.lock_rule as u8) << 4 | (self.update_rule as u8) << 5;
896*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(flags);
897*bb4ee6a4SAndroid Build Coastguard Worker 
898*bb4ee6a4SAndroid Build Coastguard Worker         for field in self.fields.iter() {
899*bb4ee6a4SAndroid Build Coastguard Worker             match field {
900*bb4ee6a4SAndroid Build Coastguard Worker                 FieldEntry::Named(name, length) => {
901*bb4ee6a4SAndroid Build Coastguard Worker                     aml.extend_from_slice(name);
902*bb4ee6a4SAndroid Build Coastguard Worker                     append_named_field_length(aml, *length);
903*bb4ee6a4SAndroid Build Coastguard Worker                 }
904*bb4ee6a4SAndroid Build Coastguard Worker                 FieldEntry::Reserved(length) => {
905*bb4ee6a4SAndroid Build Coastguard Worker                     aml.push(0x0);
906*bb4ee6a4SAndroid Build Coastguard Worker                     append_named_field_length(aml, *length);
907*bb4ee6a4SAndroid Build Coastguard Worker                 }
908*bb4ee6a4SAndroid Build Coastguard Worker             }
909*bb4ee6a4SAndroid Build Coastguard Worker         }
910*bb4ee6a4SAndroid Build Coastguard Worker 
911*bb4ee6a4SAndroid Build Coastguard Worker         let len = aml.len() - start;
912*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(aml, start, len);
913*bb4ee6a4SAndroid Build Coastguard Worker     }
914*bb4ee6a4SAndroid Build Coastguard Worker }
915*bb4ee6a4SAndroid Build Coastguard Worker 
916*bb4ee6a4SAndroid Build Coastguard Worker /// The space type for OperationRegion object
917*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone, Copy)]
918*bb4ee6a4SAndroid Build Coastguard Worker pub enum OpRegionSpace {
919*bb4ee6a4SAndroid Build Coastguard Worker     SystemMemory,
920*bb4ee6a4SAndroid Build Coastguard Worker     SystemIO,
921*bb4ee6a4SAndroid Build Coastguard Worker     PCIConfig,
922*bb4ee6a4SAndroid Build Coastguard Worker     EmbeddedControl,
923*bb4ee6a4SAndroid Build Coastguard Worker     SMBus,
924*bb4ee6a4SAndroid Build Coastguard Worker     SystemCMOS,
925*bb4ee6a4SAndroid Build Coastguard Worker     PciBarTarget,
926*bb4ee6a4SAndroid Build Coastguard Worker     IPMI,
927*bb4ee6a4SAndroid Build Coastguard Worker     GeneralPurposeIO,
928*bb4ee6a4SAndroid Build Coastguard Worker     GenericSerialBus,
929*bb4ee6a4SAndroid Build Coastguard Worker }
930*bb4ee6a4SAndroid Build Coastguard Worker 
931*bb4ee6a4SAndroid Build Coastguard Worker /// OperationRegion object with region name, region space type, its offset and length.
932*bb4ee6a4SAndroid Build Coastguard Worker pub struct OpRegion<'a> {
933*bb4ee6a4SAndroid Build Coastguard Worker     path: Path,
934*bb4ee6a4SAndroid Build Coastguard Worker     space: OpRegionSpace,
935*bb4ee6a4SAndroid Build Coastguard Worker     offset: &'a dyn Aml,
936*bb4ee6a4SAndroid Build Coastguard Worker     length: &'a dyn Aml,
937*bb4ee6a4SAndroid Build Coastguard Worker }
938*bb4ee6a4SAndroid Build Coastguard Worker 
939*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> OpRegion<'a> {
940*bb4ee6a4SAndroid Build Coastguard Worker     /// Create OperationRegion object.
new(path: Path, space: OpRegionSpace, offset: &'a dyn Aml, length: &'a dyn Aml) -> Self941*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(path: Path, space: OpRegionSpace, offset: &'a dyn Aml, length: &'a dyn Aml) -> Self {
942*bb4ee6a4SAndroid Build Coastguard Worker         OpRegion {
943*bb4ee6a4SAndroid Build Coastguard Worker             path,
944*bb4ee6a4SAndroid Build Coastguard Worker             space,
945*bb4ee6a4SAndroid Build Coastguard Worker             offset,
946*bb4ee6a4SAndroid Build Coastguard Worker             length,
947*bb4ee6a4SAndroid Build Coastguard Worker         }
948*bb4ee6a4SAndroid Build Coastguard Worker     }
949*bb4ee6a4SAndroid Build Coastguard Worker }
950*bb4ee6a4SAndroid Build Coastguard Worker 
951*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for OpRegion<'a> {
to_aml_bytes(&self, aml: &mut Vec<u8>)952*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
953*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(EXTOPPREFIX);
954*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(OPREGIONOP);
955*bb4ee6a4SAndroid Build Coastguard Worker 
956*bb4ee6a4SAndroid Build Coastguard Worker         self.path.to_aml_bytes(aml);
957*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(self.space as u8);
958*bb4ee6a4SAndroid Build Coastguard Worker         self.offset.to_aml_bytes(aml); /* RegionOffset */
959*bb4ee6a4SAndroid Build Coastguard Worker         self.length.to_aml_bytes(aml); /* RegionLen */
960*bb4ee6a4SAndroid Build Coastguard Worker     }
961*bb4ee6a4SAndroid Build Coastguard Worker }
962*bb4ee6a4SAndroid Build Coastguard Worker 
963*bb4ee6a4SAndroid Build Coastguard Worker /// If object with the if condition(predicate) and the body presented by the if_children objects.
964*bb4ee6a4SAndroid Build Coastguard Worker pub struct If<'a> {
965*bb4ee6a4SAndroid Build Coastguard Worker     predicate: &'a dyn Aml,
966*bb4ee6a4SAndroid Build Coastguard Worker     if_children: Vec<&'a dyn Aml>,
967*bb4ee6a4SAndroid Build Coastguard Worker }
968*bb4ee6a4SAndroid Build Coastguard Worker 
969*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> If<'a> {
970*bb4ee6a4SAndroid Build Coastguard Worker     /// Create If object.
new(predicate: &'a dyn Aml, if_children: Vec<&'a dyn Aml>) -> Self971*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(predicate: &'a dyn Aml, if_children: Vec<&'a dyn Aml>) -> Self {
972*bb4ee6a4SAndroid Build Coastguard Worker         If {
973*bb4ee6a4SAndroid Build Coastguard Worker             predicate,
974*bb4ee6a4SAndroid Build Coastguard Worker             if_children,
975*bb4ee6a4SAndroid Build Coastguard Worker         }
976*bb4ee6a4SAndroid Build Coastguard Worker     }
977*bb4ee6a4SAndroid Build Coastguard Worker }
978*bb4ee6a4SAndroid Build Coastguard Worker 
979*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for If<'a> {
to_aml_bytes(&self, aml: &mut Vec<u8>)980*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
981*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(IFOP);
982*bb4ee6a4SAndroid Build Coastguard Worker 
983*bb4ee6a4SAndroid Build Coastguard Worker         let start = aml.len();
984*bb4ee6a4SAndroid Build Coastguard Worker         self.predicate.to_aml_bytes(aml);
985*bb4ee6a4SAndroid Build Coastguard Worker         for child in self.if_children.iter() {
986*bb4ee6a4SAndroid Build Coastguard Worker             child.to_aml_bytes(aml);
987*bb4ee6a4SAndroid Build Coastguard Worker         }
988*bb4ee6a4SAndroid Build Coastguard Worker         let len = aml.len() - start;
989*bb4ee6a4SAndroid Build Coastguard Worker 
990*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(aml, start, len);
991*bb4ee6a4SAndroid Build Coastguard Worker     }
992*bb4ee6a4SAndroid Build Coastguard Worker }
993*bb4ee6a4SAndroid Build Coastguard Worker 
994*bb4ee6a4SAndroid Build Coastguard Worker /// Else object
995*bb4ee6a4SAndroid Build Coastguard Worker pub struct Else<'a> {
996*bb4ee6a4SAndroid Build Coastguard Worker     body: Vec<&'a dyn Aml>,
997*bb4ee6a4SAndroid Build Coastguard Worker }
998*bb4ee6a4SAndroid Build Coastguard Worker 
999*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Else<'a> {
1000*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Else object.
new(body: Vec<&'a dyn Aml>) -> Self1001*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(body: Vec<&'a dyn Aml>) -> Self {
1002*bb4ee6a4SAndroid Build Coastguard Worker         Else { body }
1003*bb4ee6a4SAndroid Build Coastguard Worker     }
1004*bb4ee6a4SAndroid Build Coastguard Worker }
1005*bb4ee6a4SAndroid Build Coastguard Worker 
1006*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for Else<'a> {
to_aml_bytes(&self, aml: &mut Vec<u8>)1007*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
1008*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(ELSEOP);
1009*bb4ee6a4SAndroid Build Coastguard Worker 
1010*bb4ee6a4SAndroid Build Coastguard Worker         let start = aml.len();
1011*bb4ee6a4SAndroid Build Coastguard Worker         for child in self.body.iter() {
1012*bb4ee6a4SAndroid Build Coastguard Worker             child.to_aml_bytes(aml);
1013*bb4ee6a4SAndroid Build Coastguard Worker         }
1014*bb4ee6a4SAndroid Build Coastguard Worker         let len = aml.len() - start;
1015*bb4ee6a4SAndroid Build Coastguard Worker 
1016*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(aml, start, len);
1017*bb4ee6a4SAndroid Build Coastguard Worker     }
1018*bb4ee6a4SAndroid Build Coastguard Worker }
1019*bb4ee6a4SAndroid Build Coastguard Worker 
1020*bb4ee6a4SAndroid Build Coastguard Worker macro_rules! compare_op {
1021*bb4ee6a4SAndroid Build Coastguard Worker     ($name:ident, $opcode:expr, $invert:expr) => {
1022*bb4ee6a4SAndroid Build Coastguard Worker         /// Compare object with its right part and left part, which are both ACPI Object.
1023*bb4ee6a4SAndroid Build Coastguard Worker         pub struct $name<'a> {
1024*bb4ee6a4SAndroid Build Coastguard Worker             right: &'a dyn Aml,
1025*bb4ee6a4SAndroid Build Coastguard Worker             left: &'a dyn Aml,
1026*bb4ee6a4SAndroid Build Coastguard Worker         }
1027*bb4ee6a4SAndroid Build Coastguard Worker 
1028*bb4ee6a4SAndroid Build Coastguard Worker         impl<'a> $name<'a> {
1029*bb4ee6a4SAndroid Build Coastguard Worker             /// Create the compare object method.
1030*bb4ee6a4SAndroid Build Coastguard Worker             pub fn new(left: &'a dyn Aml, right: &'a dyn Aml) -> Self {
1031*bb4ee6a4SAndroid Build Coastguard Worker                 $name { left, right }
1032*bb4ee6a4SAndroid Build Coastguard Worker             }
1033*bb4ee6a4SAndroid Build Coastguard Worker         }
1034*bb4ee6a4SAndroid Build Coastguard Worker 
1035*bb4ee6a4SAndroid Build Coastguard Worker         impl<'a> Aml for $name<'a> {
1036*bb4ee6a4SAndroid Build Coastguard Worker             fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1037*bb4ee6a4SAndroid Build Coastguard Worker                 if $invert {
1038*bb4ee6a4SAndroid Build Coastguard Worker                     bytes.push(LNOTOP);
1039*bb4ee6a4SAndroid Build Coastguard Worker                 }
1040*bb4ee6a4SAndroid Build Coastguard Worker                 bytes.push($opcode);
1041*bb4ee6a4SAndroid Build Coastguard Worker                 self.left.to_aml_bytes(bytes);
1042*bb4ee6a4SAndroid Build Coastguard Worker                 self.right.to_aml_bytes(bytes);
1043*bb4ee6a4SAndroid Build Coastguard Worker             }
1044*bb4ee6a4SAndroid Build Coastguard Worker         }
1045*bb4ee6a4SAndroid Build Coastguard Worker     };
1046*bb4ee6a4SAndroid Build Coastguard Worker }
1047*bb4ee6a4SAndroid Build Coastguard Worker 
1048*bb4ee6a4SAndroid Build Coastguard Worker compare_op!(Equal, LEQUALOP, false);
1049*bb4ee6a4SAndroid Build Coastguard Worker compare_op!(LessThan, LLESSOP, false);
1050*bb4ee6a4SAndroid Build Coastguard Worker compare_op!(GreaterThan, LGREATEROP, false);
1051*bb4ee6a4SAndroid Build Coastguard Worker compare_op!(NotEqual, LEQUALOP, true);
1052*bb4ee6a4SAndroid Build Coastguard Worker compare_op!(GreaterEqual, LLESSOP, true);
1053*bb4ee6a4SAndroid Build Coastguard Worker compare_op!(LessEqual, LGREATEROP, true);
1054*bb4ee6a4SAndroid Build Coastguard Worker 
1055*bb4ee6a4SAndroid Build Coastguard Worker /// Argx object.
1056*bb4ee6a4SAndroid Build Coastguard Worker pub struct Arg(pub u8);
1057*bb4ee6a4SAndroid Build Coastguard Worker 
1058*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Arg {
1059*bb4ee6a4SAndroid Build Coastguard Worker     /// Per ACPI spec, there is maximum 7 Argx objects from
1060*bb4ee6a4SAndroid Build Coastguard Worker     /// Arg0 ~ Arg6. Any other Arg object will not be accepted.
to_aml_bytes(&self, bytes: &mut Vec<u8>)1061*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1062*bb4ee6a4SAndroid Build Coastguard Worker         assert!(self.0 <= 6);
1063*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(ARG0OP + self.0);
1064*bb4ee6a4SAndroid Build Coastguard Worker     }
1065*bb4ee6a4SAndroid Build Coastguard Worker }
1066*bb4ee6a4SAndroid Build Coastguard Worker 
1067*bb4ee6a4SAndroid Build Coastguard Worker /// Localx object.
1068*bb4ee6a4SAndroid Build Coastguard Worker pub struct Local(pub u8);
1069*bb4ee6a4SAndroid Build Coastguard Worker 
1070*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Local {
1071*bb4ee6a4SAndroid Build Coastguard Worker     /// Per ACPI spec, there is maximum 8 Localx objects from
1072*bb4ee6a4SAndroid Build Coastguard Worker     /// Local0 ~ Local7. Any other Local object will not be accepted.
to_aml_bytes(&self, bytes: &mut Vec<u8>)1073*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1074*bb4ee6a4SAndroid Build Coastguard Worker         assert!(self.0 <= 7);
1075*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(LOCAL0OP + self.0);
1076*bb4ee6a4SAndroid Build Coastguard Worker     }
1077*bb4ee6a4SAndroid Build Coastguard Worker }
1078*bb4ee6a4SAndroid Build Coastguard Worker 
1079*bb4ee6a4SAndroid Build Coastguard Worker /// Store object with the ACPI object name which can be stored to and
1080*bb4ee6a4SAndroid Build Coastguard Worker /// the ACPI object value which is to store.
1081*bb4ee6a4SAndroid Build Coastguard Worker pub struct Store<'a> {
1082*bb4ee6a4SAndroid Build Coastguard Worker     name: &'a dyn Aml,
1083*bb4ee6a4SAndroid Build Coastguard Worker     value: &'a dyn Aml,
1084*bb4ee6a4SAndroid Build Coastguard Worker }
1085*bb4ee6a4SAndroid Build Coastguard Worker 
1086*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Store<'a> {
1087*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Store object.
new(name: &'a dyn Aml, value: &'a dyn Aml) -> Self1088*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(name: &'a dyn Aml, value: &'a dyn Aml) -> Self {
1089*bb4ee6a4SAndroid Build Coastguard Worker         Store { name, value }
1090*bb4ee6a4SAndroid Build Coastguard Worker     }
1091*bb4ee6a4SAndroid Build Coastguard Worker }
1092*bb4ee6a4SAndroid Build Coastguard Worker 
1093*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for Store<'a> {
to_aml_bytes(&self, bytes: &mut Vec<u8>)1094*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1095*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(STOREOP);
1096*bb4ee6a4SAndroid Build Coastguard Worker         self.value.to_aml_bytes(bytes);
1097*bb4ee6a4SAndroid Build Coastguard Worker         self.name.to_aml_bytes(bytes);
1098*bb4ee6a4SAndroid Build Coastguard Worker     }
1099*bb4ee6a4SAndroid Build Coastguard Worker }
1100*bb4ee6a4SAndroid Build Coastguard Worker 
1101*bb4ee6a4SAndroid Build Coastguard Worker /// Mutex object with a mutex name and a synchronization level.
1102*bb4ee6a4SAndroid Build Coastguard Worker pub struct Mutex {
1103*bb4ee6a4SAndroid Build Coastguard Worker     path: Path,
1104*bb4ee6a4SAndroid Build Coastguard Worker     sync_level: u8,
1105*bb4ee6a4SAndroid Build Coastguard Worker }
1106*bb4ee6a4SAndroid Build Coastguard Worker 
1107*bb4ee6a4SAndroid Build Coastguard Worker impl Mutex {
1108*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Mutex object.
new(path: Path, sync_level: u8) -> Self1109*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(path: Path, sync_level: u8) -> Self {
1110*bb4ee6a4SAndroid Build Coastguard Worker         Self { path, sync_level }
1111*bb4ee6a4SAndroid Build Coastguard Worker     }
1112*bb4ee6a4SAndroid Build Coastguard Worker }
1113*bb4ee6a4SAndroid Build Coastguard Worker 
1114*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Mutex {
to_aml_bytes(&self, bytes: &mut Vec<u8>)1115*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1116*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(EXTOPPREFIX);
1117*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(MUTEXOP);
1118*bb4ee6a4SAndroid Build Coastguard Worker         self.path.to_aml_bytes(bytes);
1119*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(self.sync_level);
1120*bb4ee6a4SAndroid Build Coastguard Worker     }
1121*bb4ee6a4SAndroid Build Coastguard Worker }
1122*bb4ee6a4SAndroid Build Coastguard Worker 
1123*bb4ee6a4SAndroid Build Coastguard Worker /// Acquire object with a Mutex object and timeout value.
1124*bb4ee6a4SAndroid Build Coastguard Worker pub struct Acquire {
1125*bb4ee6a4SAndroid Build Coastguard Worker     mutex: Path,
1126*bb4ee6a4SAndroid Build Coastguard Worker     timeout: u16,
1127*bb4ee6a4SAndroid Build Coastguard Worker }
1128*bb4ee6a4SAndroid Build Coastguard Worker 
1129*bb4ee6a4SAndroid Build Coastguard Worker impl Acquire {
1130*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Acquire object.
new(mutex: Path, timeout: u16) -> Self1131*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(mutex: Path, timeout: u16) -> Self {
1132*bb4ee6a4SAndroid Build Coastguard Worker         Acquire { mutex, timeout }
1133*bb4ee6a4SAndroid Build Coastguard Worker     }
1134*bb4ee6a4SAndroid Build Coastguard Worker }
1135*bb4ee6a4SAndroid Build Coastguard Worker 
1136*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Acquire {
to_aml_bytes(&self, bytes: &mut Vec<u8>)1137*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1138*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(EXTOPPREFIX);
1139*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(ACQUIREOP);
1140*bb4ee6a4SAndroid Build Coastguard Worker         self.mutex.to_aml_bytes(bytes);
1141*bb4ee6a4SAndroid Build Coastguard Worker         bytes.extend_from_slice(&self.timeout.to_le_bytes());
1142*bb4ee6a4SAndroid Build Coastguard Worker     }
1143*bb4ee6a4SAndroid Build Coastguard Worker }
1144*bb4ee6a4SAndroid Build Coastguard Worker 
1145*bb4ee6a4SAndroid Build Coastguard Worker /// Release object with a Mutex object to release.
1146*bb4ee6a4SAndroid Build Coastguard Worker pub struct Release {
1147*bb4ee6a4SAndroid Build Coastguard Worker     mutex: Path,
1148*bb4ee6a4SAndroid Build Coastguard Worker }
1149*bb4ee6a4SAndroid Build Coastguard Worker 
1150*bb4ee6a4SAndroid Build Coastguard Worker impl Release {
1151*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Release object.
new(mutex: Path) -> Self1152*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(mutex: Path) -> Self {
1153*bb4ee6a4SAndroid Build Coastguard Worker         Release { mutex }
1154*bb4ee6a4SAndroid Build Coastguard Worker     }
1155*bb4ee6a4SAndroid Build Coastguard Worker }
1156*bb4ee6a4SAndroid Build Coastguard Worker 
1157*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Release {
to_aml_bytes(&self, bytes: &mut Vec<u8>)1158*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1159*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(EXTOPPREFIX);
1160*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(RELEASEOP);
1161*bb4ee6a4SAndroid Build Coastguard Worker         self.mutex.to_aml_bytes(bytes);
1162*bb4ee6a4SAndroid Build Coastguard Worker     }
1163*bb4ee6a4SAndroid Build Coastguard Worker }
1164*bb4ee6a4SAndroid Build Coastguard Worker 
1165*bb4ee6a4SAndroid Build Coastguard Worker /// Notify object with an object which is to be notified with the value.
1166*bb4ee6a4SAndroid Build Coastguard Worker pub struct Notify<'a> {
1167*bb4ee6a4SAndroid Build Coastguard Worker     object: &'a dyn Aml,
1168*bb4ee6a4SAndroid Build Coastguard Worker     value: &'a dyn Aml,
1169*bb4ee6a4SAndroid Build Coastguard Worker }
1170*bb4ee6a4SAndroid Build Coastguard Worker 
1171*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Notify<'a> {
1172*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Notify object.
new(object: &'a dyn Aml, value: &'a dyn Aml) -> Self1173*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(object: &'a dyn Aml, value: &'a dyn Aml) -> Self {
1174*bb4ee6a4SAndroid Build Coastguard Worker         Notify { object, value }
1175*bb4ee6a4SAndroid Build Coastguard Worker     }
1176*bb4ee6a4SAndroid Build Coastguard Worker }
1177*bb4ee6a4SAndroid Build Coastguard Worker 
1178*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for Notify<'a> {
to_aml_bytes(&self, bytes: &mut Vec<u8>)1179*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1180*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(NOTIFYOP);
1181*bb4ee6a4SAndroid Build Coastguard Worker         self.object.to_aml_bytes(bytes);
1182*bb4ee6a4SAndroid Build Coastguard Worker         self.value.to_aml_bytes(bytes);
1183*bb4ee6a4SAndroid Build Coastguard Worker     }
1184*bb4ee6a4SAndroid Build Coastguard Worker }
1185*bb4ee6a4SAndroid Build Coastguard Worker 
1186*bb4ee6a4SAndroid Build Coastguard Worker /// While object with the while condition objects(predicate) and
1187*bb4ee6a4SAndroid Build Coastguard Worker /// the while body objects(while_children).
1188*bb4ee6a4SAndroid Build Coastguard Worker pub struct While<'a> {
1189*bb4ee6a4SAndroid Build Coastguard Worker     predicate: &'a dyn Aml,
1190*bb4ee6a4SAndroid Build Coastguard Worker     while_children: Vec<&'a dyn Aml>,
1191*bb4ee6a4SAndroid Build Coastguard Worker }
1192*bb4ee6a4SAndroid Build Coastguard Worker 
1193*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> While<'a> {
1194*bb4ee6a4SAndroid Build Coastguard Worker     /// Create While object.
new(predicate: &'a dyn Aml, while_children: Vec<&'a dyn Aml>) -> Self1195*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(predicate: &'a dyn Aml, while_children: Vec<&'a dyn Aml>) -> Self {
1196*bb4ee6a4SAndroid Build Coastguard Worker         While {
1197*bb4ee6a4SAndroid Build Coastguard Worker             predicate,
1198*bb4ee6a4SAndroid Build Coastguard Worker             while_children,
1199*bb4ee6a4SAndroid Build Coastguard Worker         }
1200*bb4ee6a4SAndroid Build Coastguard Worker     }
1201*bb4ee6a4SAndroid Build Coastguard Worker }
1202*bb4ee6a4SAndroid Build Coastguard Worker 
1203*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for While<'a> {
to_aml_bytes(&self, aml: &mut Vec<u8>)1204*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
1205*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(WHILEOP);
1206*bb4ee6a4SAndroid Build Coastguard Worker 
1207*bb4ee6a4SAndroid Build Coastguard Worker         let start = aml.len();
1208*bb4ee6a4SAndroid Build Coastguard Worker         self.predicate.to_aml_bytes(aml);
1209*bb4ee6a4SAndroid Build Coastguard Worker         for child in self.while_children.iter() {
1210*bb4ee6a4SAndroid Build Coastguard Worker             child.to_aml_bytes(aml);
1211*bb4ee6a4SAndroid Build Coastguard Worker         }
1212*bb4ee6a4SAndroid Build Coastguard Worker         let len = aml.len() - start;
1213*bb4ee6a4SAndroid Build Coastguard Worker 
1214*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(aml, start, len);
1215*bb4ee6a4SAndroid Build Coastguard Worker     }
1216*bb4ee6a4SAndroid Build Coastguard Worker }
1217*bb4ee6a4SAndroid Build Coastguard Worker 
1218*bb4ee6a4SAndroid Build Coastguard Worker macro_rules! object_op {
1219*bb4ee6a4SAndroid Build Coastguard Worker     ($name:ident, $opcode:expr) => {
1220*bb4ee6a4SAndroid Build Coastguard Worker         /// General operation on a object.
1221*bb4ee6a4SAndroid Build Coastguard Worker         pub struct $name<'a> {
1222*bb4ee6a4SAndroid Build Coastguard Worker             a: &'a dyn Aml,
1223*bb4ee6a4SAndroid Build Coastguard Worker         }
1224*bb4ee6a4SAndroid Build Coastguard Worker 
1225*bb4ee6a4SAndroid Build Coastguard Worker         impl<'a> $name<'a> {
1226*bb4ee6a4SAndroid Build Coastguard Worker             /// Create the object method.
1227*bb4ee6a4SAndroid Build Coastguard Worker             pub fn new(a: &'a dyn Aml) -> Self {
1228*bb4ee6a4SAndroid Build Coastguard Worker                 $name { a }
1229*bb4ee6a4SAndroid Build Coastguard Worker             }
1230*bb4ee6a4SAndroid Build Coastguard Worker         }
1231*bb4ee6a4SAndroid Build Coastguard Worker 
1232*bb4ee6a4SAndroid Build Coastguard Worker         impl<'a> Aml for $name<'a> {
1233*bb4ee6a4SAndroid Build Coastguard Worker             fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1234*bb4ee6a4SAndroid Build Coastguard Worker                 bytes.push($opcode);
1235*bb4ee6a4SAndroid Build Coastguard Worker                 self.a.to_aml_bytes(bytes);
1236*bb4ee6a4SAndroid Build Coastguard Worker             }
1237*bb4ee6a4SAndroid Build Coastguard Worker         }
1238*bb4ee6a4SAndroid Build Coastguard Worker     };
1239*bb4ee6a4SAndroid Build Coastguard Worker }
1240*bb4ee6a4SAndroid Build Coastguard Worker 
1241*bb4ee6a4SAndroid Build Coastguard Worker object_op!(ObjectType, OBJECTTYPEOP);
1242*bb4ee6a4SAndroid Build Coastguard Worker object_op!(SizeOf, SIZEOFOP);
1243*bb4ee6a4SAndroid Build Coastguard Worker object_op!(Return, RETURNOP);
1244*bb4ee6a4SAndroid Build Coastguard Worker object_op!(DeRefOf, DEREFOFOP);
1245*bb4ee6a4SAndroid Build Coastguard Worker 
1246*bb4ee6a4SAndroid Build Coastguard Worker macro_rules! binary_op {
1247*bb4ee6a4SAndroid Build Coastguard Worker     ($name:ident, $opcode:expr) => {
1248*bb4ee6a4SAndroid Build Coastguard Worker         /// General operation object with the operator a/b and a target.
1249*bb4ee6a4SAndroid Build Coastguard Worker         pub struct $name<'a> {
1250*bb4ee6a4SAndroid Build Coastguard Worker             a: &'a dyn Aml,
1251*bb4ee6a4SAndroid Build Coastguard Worker             b: &'a dyn Aml,
1252*bb4ee6a4SAndroid Build Coastguard Worker             target: &'a dyn Aml,
1253*bb4ee6a4SAndroid Build Coastguard Worker         }
1254*bb4ee6a4SAndroid Build Coastguard Worker 
1255*bb4ee6a4SAndroid Build Coastguard Worker         impl<'a> $name<'a> {
1256*bb4ee6a4SAndroid Build Coastguard Worker             /// Create the object.
1257*bb4ee6a4SAndroid Build Coastguard Worker             pub fn new(target: &'a dyn Aml, a: &'a dyn Aml, b: &'a dyn Aml) -> Self {
1258*bb4ee6a4SAndroid Build Coastguard Worker                 $name { target, a, b }
1259*bb4ee6a4SAndroid Build Coastguard Worker             }
1260*bb4ee6a4SAndroid Build Coastguard Worker         }
1261*bb4ee6a4SAndroid Build Coastguard Worker 
1262*bb4ee6a4SAndroid Build Coastguard Worker         impl<'a> Aml for $name<'a> {
1263*bb4ee6a4SAndroid Build Coastguard Worker             fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1264*bb4ee6a4SAndroid Build Coastguard Worker                 bytes.push($opcode); /* Op for the binary operator */
1265*bb4ee6a4SAndroid Build Coastguard Worker                 self.a.to_aml_bytes(bytes);
1266*bb4ee6a4SAndroid Build Coastguard Worker                 self.b.to_aml_bytes(bytes);
1267*bb4ee6a4SAndroid Build Coastguard Worker                 self.target.to_aml_bytes(bytes);
1268*bb4ee6a4SAndroid Build Coastguard Worker             }
1269*bb4ee6a4SAndroid Build Coastguard Worker         }
1270*bb4ee6a4SAndroid Build Coastguard Worker     };
1271*bb4ee6a4SAndroid Build Coastguard Worker }
1272*bb4ee6a4SAndroid Build Coastguard Worker 
1273*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(Add, ADDOP);
1274*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(Concat, CONCATOP);
1275*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(Subtract, SUBTRACTOP);
1276*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(Multiply, MULTIPLYOP);
1277*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(ShiftLeft, SHIFTLEFTOP);
1278*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(ShiftRight, SHIFTRIGHTOP);
1279*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(And, ANDOP);
1280*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(Nand, NANDOP);
1281*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(Or, OROP);
1282*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(Nor, NOROP);
1283*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(Xor, XOROP);
1284*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(ConcatRes, CONCATRESOP);
1285*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(Mod, MODOP);
1286*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(Index, INDEXOP);
1287*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(ToString, TOSTRINGOP);
1288*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(CreateDWordField, CREATEDWFIELDOP);
1289*bb4ee6a4SAndroid Build Coastguard Worker binary_op!(CreateQWordField, CREATEQWFIELDOP);
1290*bb4ee6a4SAndroid Build Coastguard Worker 
1291*bb4ee6a4SAndroid Build Coastguard Worker macro_rules! convert_op {
1292*bb4ee6a4SAndroid Build Coastguard Worker     ($name:ident, $opcode:expr) => {
1293*bb4ee6a4SAndroid Build Coastguard Worker         /// General operation object with the operator a/b and a target.
1294*bb4ee6a4SAndroid Build Coastguard Worker         pub struct $name<'a> {
1295*bb4ee6a4SAndroid Build Coastguard Worker             a: &'a dyn Aml,
1296*bb4ee6a4SAndroid Build Coastguard Worker             target: &'a dyn Aml,
1297*bb4ee6a4SAndroid Build Coastguard Worker         }
1298*bb4ee6a4SAndroid Build Coastguard Worker 
1299*bb4ee6a4SAndroid Build Coastguard Worker         impl<'a> $name<'a> {
1300*bb4ee6a4SAndroid Build Coastguard Worker             /// Create the object.
1301*bb4ee6a4SAndroid Build Coastguard Worker             pub fn new(target: &'a dyn Aml, a: &'a dyn Aml) -> Self {
1302*bb4ee6a4SAndroid Build Coastguard Worker                 $name { target, a }
1303*bb4ee6a4SAndroid Build Coastguard Worker             }
1304*bb4ee6a4SAndroid Build Coastguard Worker         }
1305*bb4ee6a4SAndroid Build Coastguard Worker 
1306*bb4ee6a4SAndroid Build Coastguard Worker         impl<'a> Aml for $name<'a> {
1307*bb4ee6a4SAndroid Build Coastguard Worker             fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1308*bb4ee6a4SAndroid Build Coastguard Worker                 bytes.push($opcode); /* Op for the binary operator */
1309*bb4ee6a4SAndroid Build Coastguard Worker                 self.a.to_aml_bytes(bytes);
1310*bb4ee6a4SAndroid Build Coastguard Worker                 self.target.to_aml_bytes(bytes);
1311*bb4ee6a4SAndroid Build Coastguard Worker             }
1312*bb4ee6a4SAndroid Build Coastguard Worker         }
1313*bb4ee6a4SAndroid Build Coastguard Worker     };
1314*bb4ee6a4SAndroid Build Coastguard Worker }
1315*bb4ee6a4SAndroid Build Coastguard Worker 
1316*bb4ee6a4SAndroid Build Coastguard Worker convert_op!(ToBuffer, TOBUFFEROP);
1317*bb4ee6a4SAndroid Build Coastguard Worker convert_op!(ToInteger, TOINTEGEROP);
1318*bb4ee6a4SAndroid Build Coastguard Worker 
1319*bb4ee6a4SAndroid Build Coastguard Worker /// Create Field Object.
1320*bb4ee6a4SAndroid Build Coastguard Worker pub struct CreateField<'a> {
1321*bb4ee6a4SAndroid Build Coastguard Worker     name_string: &'a dyn Aml,
1322*bb4ee6a4SAndroid Build Coastguard Worker     source: &'a dyn Aml,
1323*bb4ee6a4SAndroid Build Coastguard Worker     bit_index: &'a dyn Aml,
1324*bb4ee6a4SAndroid Build Coastguard Worker     bit_num: &'a dyn Aml,
1325*bb4ee6a4SAndroid Build Coastguard Worker }
1326*bb4ee6a4SAndroid Build Coastguard Worker 
1327*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> CreateField<'a> {
new( name_string: &'a dyn Aml, source: &'a dyn Aml, bit_index: &'a dyn Aml, bit_num: &'a dyn Aml, ) -> Self1328*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(
1329*bb4ee6a4SAndroid Build Coastguard Worker         name_string: &'a dyn Aml,
1330*bb4ee6a4SAndroid Build Coastguard Worker         source: &'a dyn Aml,
1331*bb4ee6a4SAndroid Build Coastguard Worker         bit_index: &'a dyn Aml,
1332*bb4ee6a4SAndroid Build Coastguard Worker         bit_num: &'a dyn Aml,
1333*bb4ee6a4SAndroid Build Coastguard Worker     ) -> Self {
1334*bb4ee6a4SAndroid Build Coastguard Worker         CreateField {
1335*bb4ee6a4SAndroid Build Coastguard Worker             name_string,
1336*bb4ee6a4SAndroid Build Coastguard Worker             source,
1337*bb4ee6a4SAndroid Build Coastguard Worker             bit_index,
1338*bb4ee6a4SAndroid Build Coastguard Worker             bit_num,
1339*bb4ee6a4SAndroid Build Coastguard Worker         }
1340*bb4ee6a4SAndroid Build Coastguard Worker     }
1341*bb4ee6a4SAndroid Build Coastguard Worker }
1342*bb4ee6a4SAndroid Build Coastguard Worker 
1343*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for CreateField<'a> {
to_aml_bytes(&self, bytes: &mut Vec<u8>)1344*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1345*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(EXTOPPREFIX);
1346*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(CREATEFIELDOP);
1347*bb4ee6a4SAndroid Build Coastguard Worker         self.source.to_aml_bytes(bytes);
1348*bb4ee6a4SAndroid Build Coastguard Worker         self.bit_index.to_aml_bytes(bytes);
1349*bb4ee6a4SAndroid Build Coastguard Worker         self.bit_num.to_aml_bytes(bytes);
1350*bb4ee6a4SAndroid Build Coastguard Worker         self.name_string.to_aml_bytes(bytes);
1351*bb4ee6a4SAndroid Build Coastguard Worker     }
1352*bb4ee6a4SAndroid Build Coastguard Worker }
1353*bb4ee6a4SAndroid Build Coastguard Worker 
1354*bb4ee6a4SAndroid Build Coastguard Worker /// Mid object with the source, index, length, and result objects.
1355*bb4ee6a4SAndroid Build Coastguard Worker pub struct Mid<'a> {
1356*bb4ee6a4SAndroid Build Coastguard Worker     source: &'a dyn Aml,
1357*bb4ee6a4SAndroid Build Coastguard Worker     index: &'a dyn Aml,
1358*bb4ee6a4SAndroid Build Coastguard Worker     length: &'a dyn Aml,
1359*bb4ee6a4SAndroid Build Coastguard Worker     result: &'a dyn Aml,
1360*bb4ee6a4SAndroid Build Coastguard Worker }
1361*bb4ee6a4SAndroid Build Coastguard Worker 
1362*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Mid<'a> {
new( source: &'a dyn Aml, index: &'a dyn Aml, length: &'a dyn Aml, result: &'a dyn Aml, ) -> Self1363*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(
1364*bb4ee6a4SAndroid Build Coastguard Worker         source: &'a dyn Aml,
1365*bb4ee6a4SAndroid Build Coastguard Worker         index: &'a dyn Aml,
1366*bb4ee6a4SAndroid Build Coastguard Worker         length: &'a dyn Aml,
1367*bb4ee6a4SAndroid Build Coastguard Worker         result: &'a dyn Aml,
1368*bb4ee6a4SAndroid Build Coastguard Worker     ) -> Self {
1369*bb4ee6a4SAndroid Build Coastguard Worker         Mid {
1370*bb4ee6a4SAndroid Build Coastguard Worker             source,
1371*bb4ee6a4SAndroid Build Coastguard Worker             index,
1372*bb4ee6a4SAndroid Build Coastguard Worker             length,
1373*bb4ee6a4SAndroid Build Coastguard Worker             result,
1374*bb4ee6a4SAndroid Build Coastguard Worker         }
1375*bb4ee6a4SAndroid Build Coastguard Worker     }
1376*bb4ee6a4SAndroid Build Coastguard Worker }
1377*bb4ee6a4SAndroid Build Coastguard Worker 
1378*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for Mid<'a> {
to_aml_bytes(&self, bytes: &mut Vec<u8>)1379*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1380*bb4ee6a4SAndroid Build Coastguard Worker         bytes.push(MIDOP);
1381*bb4ee6a4SAndroid Build Coastguard Worker         self.source.to_aml_bytes(bytes);
1382*bb4ee6a4SAndroid Build Coastguard Worker         self.index.to_aml_bytes(bytes);
1383*bb4ee6a4SAndroid Build Coastguard Worker         self.length.to_aml_bytes(bytes);
1384*bb4ee6a4SAndroid Build Coastguard Worker         self.result.to_aml_bytes(bytes);
1385*bb4ee6a4SAndroid Build Coastguard Worker     }
1386*bb4ee6a4SAndroid Build Coastguard Worker }
1387*bb4ee6a4SAndroid Build Coastguard Worker 
1388*bb4ee6a4SAndroid Build Coastguard Worker /// MethodCall object with the method name and parameter objects.
1389*bb4ee6a4SAndroid Build Coastguard Worker pub struct MethodCall<'a> {
1390*bb4ee6a4SAndroid Build Coastguard Worker     name: Path,
1391*bb4ee6a4SAndroid Build Coastguard Worker     args: Vec<&'a dyn Aml>,
1392*bb4ee6a4SAndroid Build Coastguard Worker }
1393*bb4ee6a4SAndroid Build Coastguard Worker 
1394*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> MethodCall<'a> {
1395*bb4ee6a4SAndroid Build Coastguard Worker     /// Create MethodCall object.
new(name: Path, args: Vec<&'a dyn Aml>) -> Self1396*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(name: Path, args: Vec<&'a dyn Aml>) -> Self {
1397*bb4ee6a4SAndroid Build Coastguard Worker         MethodCall { name, args }
1398*bb4ee6a4SAndroid Build Coastguard Worker     }
1399*bb4ee6a4SAndroid Build Coastguard Worker }
1400*bb4ee6a4SAndroid Build Coastguard Worker 
1401*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for MethodCall<'a> {
to_aml_bytes(&self, bytes: &mut Vec<u8>)1402*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1403*bb4ee6a4SAndroid Build Coastguard Worker         self.name.to_aml_bytes(bytes);
1404*bb4ee6a4SAndroid Build Coastguard Worker         for arg in self.args.iter() {
1405*bb4ee6a4SAndroid Build Coastguard Worker             arg.to_aml_bytes(bytes);
1406*bb4ee6a4SAndroid Build Coastguard Worker         }
1407*bb4ee6a4SAndroid Build Coastguard Worker     }
1408*bb4ee6a4SAndroid Build Coastguard Worker }
1409*bb4ee6a4SAndroid Build Coastguard Worker 
1410*bb4ee6a4SAndroid Build Coastguard Worker /// Buffer object with the TermArg in it.
1411*bb4ee6a4SAndroid Build Coastguard Worker pub struct BufferTerm<'a> {
1412*bb4ee6a4SAndroid Build Coastguard Worker     data: &'a dyn Aml,
1413*bb4ee6a4SAndroid Build Coastguard Worker }
1414*bb4ee6a4SAndroid Build Coastguard Worker 
1415*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> BufferTerm<'a> {
1416*bb4ee6a4SAndroid Build Coastguard Worker     /// Create BufferTerm object.
new(data: &'a dyn Aml) -> Self1417*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(data: &'a dyn Aml) -> Self {
1418*bb4ee6a4SAndroid Build Coastguard Worker         BufferTerm { data }
1419*bb4ee6a4SAndroid Build Coastguard Worker     }
1420*bb4ee6a4SAndroid Build Coastguard Worker }
1421*bb4ee6a4SAndroid Build Coastguard Worker 
1422*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for BufferTerm<'a> {
to_aml_bytes(&self, aml: &mut Vec<u8>)1423*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
1424*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(BUFFEROP);
1425*bb4ee6a4SAndroid Build Coastguard Worker 
1426*bb4ee6a4SAndroid Build Coastguard Worker         let start = aml.len();
1427*bb4ee6a4SAndroid Build Coastguard Worker         self.data.to_aml_bytes(aml);
1428*bb4ee6a4SAndroid Build Coastguard Worker         let len = aml.len() - start;
1429*bb4ee6a4SAndroid Build Coastguard Worker 
1430*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(aml, start, len);
1431*bb4ee6a4SAndroid Build Coastguard Worker     }
1432*bb4ee6a4SAndroid Build Coastguard Worker }
1433*bb4ee6a4SAndroid Build Coastguard Worker 
1434*bb4ee6a4SAndroid Build Coastguard Worker /// Buffer object with the data in it.
1435*bb4ee6a4SAndroid Build Coastguard Worker pub struct BufferData {
1436*bb4ee6a4SAndroid Build Coastguard Worker     data: Vec<u8>,
1437*bb4ee6a4SAndroid Build Coastguard Worker }
1438*bb4ee6a4SAndroid Build Coastguard Worker 
1439*bb4ee6a4SAndroid Build Coastguard Worker impl BufferData {
1440*bb4ee6a4SAndroid Build Coastguard Worker     /// Create BufferData object.
new(data: Vec<u8>) -> Self1441*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(data: Vec<u8>) -> Self {
1442*bb4ee6a4SAndroid Build Coastguard Worker         BufferData { data }
1443*bb4ee6a4SAndroid Build Coastguard Worker     }
1444*bb4ee6a4SAndroid Build Coastguard Worker }
1445*bb4ee6a4SAndroid Build Coastguard Worker 
1446*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for BufferData {
to_aml_bytes(&self, aml: &mut Vec<u8>)1447*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
1448*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(BUFFEROP);
1449*bb4ee6a4SAndroid Build Coastguard Worker 
1450*bb4ee6a4SAndroid Build Coastguard Worker         let start = aml.len();
1451*bb4ee6a4SAndroid Build Coastguard Worker         self.data.len().to_aml_bytes(aml);
1452*bb4ee6a4SAndroid Build Coastguard Worker         aml.extend_from_slice(&self.data);
1453*bb4ee6a4SAndroid Build Coastguard Worker         let len = aml.len() - start;
1454*bb4ee6a4SAndroid Build Coastguard Worker 
1455*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(aml, start, len);
1456*bb4ee6a4SAndroid Build Coastguard Worker     }
1457*bb4ee6a4SAndroid Build Coastguard Worker }
1458*bb4ee6a4SAndroid Build Coastguard Worker 
1459*bb4ee6a4SAndroid Build Coastguard Worker pub struct Uuid {
1460*bb4ee6a4SAndroid Build Coastguard Worker     name: BufferData,
1461*bb4ee6a4SAndroid Build Coastguard Worker }
1462*bb4ee6a4SAndroid Build Coastguard Worker 
hex2byte(v1: char, v2: char) -> u81463*bb4ee6a4SAndroid Build Coastguard Worker fn hex2byte(v1: char, v2: char) -> u8 {
1464*bb4ee6a4SAndroid Build Coastguard Worker     let hi = v1.to_digit(16).unwrap() as u8;
1465*bb4ee6a4SAndroid Build Coastguard Worker     assert!(hi <= 15);
1466*bb4ee6a4SAndroid Build Coastguard Worker     let lo = v2.to_digit(16).unwrap() as u8;
1467*bb4ee6a4SAndroid Build Coastguard Worker     assert!(lo <= 15);
1468*bb4ee6a4SAndroid Build Coastguard Worker 
1469*bb4ee6a4SAndroid Build Coastguard Worker     (hi << 4) | lo
1470*bb4ee6a4SAndroid Build Coastguard Worker }
1471*bb4ee6a4SAndroid Build Coastguard Worker 
1472*bb4ee6a4SAndroid Build Coastguard Worker impl Uuid {
1473*bb4ee6a4SAndroid Build Coastguard Worker     // Create Uuid object
1474*bb4ee6a4SAndroid Build Coastguard Worker     // eg. UUID: aabbccdd-eeff-gghh-iijj-kkllmmnnoopp
new(name: &str) -> Self1475*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(name: &str) -> Self {
1476*bb4ee6a4SAndroid Build Coastguard Worker         let name_vec: Vec<char> = name.chars().collect();
1477*bb4ee6a4SAndroid Build Coastguard Worker         let mut data = Vec::new();
1478*bb4ee6a4SAndroid Build Coastguard Worker 
1479*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(name_vec.len(), 36);
1480*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(name_vec[8], '-');
1481*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(name_vec[13], '-');
1482*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(name_vec[18], '-');
1483*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(name_vec[23], '-');
1484*bb4ee6a4SAndroid Build Coastguard Worker 
1485*bb4ee6a4SAndroid Build Coastguard Worker         // dd - at offset 00
1486*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[6], name_vec[7]));
1487*bb4ee6a4SAndroid Build Coastguard Worker         // cc - at offset 01
1488*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[4], name_vec[5]));
1489*bb4ee6a4SAndroid Build Coastguard Worker         // bb - at offset 02
1490*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[2], name_vec[3]));
1491*bb4ee6a4SAndroid Build Coastguard Worker         // aa - at offset 03
1492*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[0], name_vec[1]));
1493*bb4ee6a4SAndroid Build Coastguard Worker 
1494*bb4ee6a4SAndroid Build Coastguard Worker         // ff - at offset 04
1495*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[11], name_vec[12]));
1496*bb4ee6a4SAndroid Build Coastguard Worker         // ee - at offset 05
1497*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[9], name_vec[10]));
1498*bb4ee6a4SAndroid Build Coastguard Worker 
1499*bb4ee6a4SAndroid Build Coastguard Worker         // hh - at offset 06
1500*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[16], name_vec[17]));
1501*bb4ee6a4SAndroid Build Coastguard Worker         // gg - at offset 07
1502*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[14], name_vec[15]));
1503*bb4ee6a4SAndroid Build Coastguard Worker 
1504*bb4ee6a4SAndroid Build Coastguard Worker         // ii - at offset 08
1505*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[19], name_vec[20]));
1506*bb4ee6a4SAndroid Build Coastguard Worker         // jj - at offset 09
1507*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[21], name_vec[22]));
1508*bb4ee6a4SAndroid Build Coastguard Worker 
1509*bb4ee6a4SAndroid Build Coastguard Worker         // kk - at offset 10
1510*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[24], name_vec[25]));
1511*bb4ee6a4SAndroid Build Coastguard Worker         // ll - at offset 11
1512*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[26], name_vec[27]));
1513*bb4ee6a4SAndroid Build Coastguard Worker         // mm - at offset 12
1514*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[28], name_vec[29]));
1515*bb4ee6a4SAndroid Build Coastguard Worker         // nn - at offset 13
1516*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[30], name_vec[31]));
1517*bb4ee6a4SAndroid Build Coastguard Worker         // oo - at offset 14
1518*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[32], name_vec[33]));
1519*bb4ee6a4SAndroid Build Coastguard Worker         // pp - at offset 15
1520*bb4ee6a4SAndroid Build Coastguard Worker         data.push(hex2byte(name_vec[34], name_vec[35]));
1521*bb4ee6a4SAndroid Build Coastguard Worker 
1522*bb4ee6a4SAndroid Build Coastguard Worker         Uuid {
1523*bb4ee6a4SAndroid Build Coastguard Worker             name: BufferData::new(data),
1524*bb4ee6a4SAndroid Build Coastguard Worker         }
1525*bb4ee6a4SAndroid Build Coastguard Worker     }
1526*bb4ee6a4SAndroid Build Coastguard Worker }
1527*bb4ee6a4SAndroid Build Coastguard Worker 
1528*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for Uuid {
to_aml_bytes(&self, bytes: &mut Vec<u8>)1529*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
1530*bb4ee6a4SAndroid Build Coastguard Worker         self.name.to_aml_bytes(bytes)
1531*bb4ee6a4SAndroid Build Coastguard Worker     }
1532*bb4ee6a4SAndroid Build Coastguard Worker }
1533*bb4ee6a4SAndroid Build Coastguard Worker 
1534*bb4ee6a4SAndroid Build Coastguard Worker /// Power Resource object. 'children' represents Power Resource method.
1535*bb4ee6a4SAndroid Build Coastguard Worker pub struct PowerResource<'a> {
1536*bb4ee6a4SAndroid Build Coastguard Worker     name: Path,
1537*bb4ee6a4SAndroid Build Coastguard Worker     level: u8,
1538*bb4ee6a4SAndroid Build Coastguard Worker     order: u16,
1539*bb4ee6a4SAndroid Build Coastguard Worker     children: Vec<&'a dyn Aml>,
1540*bb4ee6a4SAndroid Build Coastguard Worker }
1541*bb4ee6a4SAndroid Build Coastguard Worker 
1542*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> PowerResource<'a> {
1543*bb4ee6a4SAndroid Build Coastguard Worker     /// Create Power Resouce object
new(name: Path, level: u8, order: u16, children: Vec<&'a dyn Aml>) -> Self1544*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(name: Path, level: u8, order: u16, children: Vec<&'a dyn Aml>) -> Self {
1545*bb4ee6a4SAndroid Build Coastguard Worker         PowerResource {
1546*bb4ee6a4SAndroid Build Coastguard Worker             name,
1547*bb4ee6a4SAndroid Build Coastguard Worker             level,
1548*bb4ee6a4SAndroid Build Coastguard Worker             order,
1549*bb4ee6a4SAndroid Build Coastguard Worker             children,
1550*bb4ee6a4SAndroid Build Coastguard Worker         }
1551*bb4ee6a4SAndroid Build Coastguard Worker     }
1552*bb4ee6a4SAndroid Build Coastguard Worker }
1553*bb4ee6a4SAndroid Build Coastguard Worker 
1554*bb4ee6a4SAndroid Build Coastguard Worker impl<'a> Aml for PowerResource<'a> {
to_aml_bytes(&self, aml: &mut Vec<u8>)1555*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
1556*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(EXTOPPREFIX);
1557*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(POWERRESOURCEOP);
1558*bb4ee6a4SAndroid Build Coastguard Worker 
1559*bb4ee6a4SAndroid Build Coastguard Worker         let start = aml.len();
1560*bb4ee6a4SAndroid Build Coastguard Worker 
1561*bb4ee6a4SAndroid Build Coastguard Worker         // Add name string
1562*bb4ee6a4SAndroid Build Coastguard Worker         self.name.to_aml_bytes(aml);
1563*bb4ee6a4SAndroid Build Coastguard Worker         // Add system level
1564*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(self.level);
1565*bb4ee6a4SAndroid Build Coastguard Worker         // Add Resource Order
1566*bb4ee6a4SAndroid Build Coastguard Worker         let orders = self.order.to_le_bytes();
1567*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(orders[0]);
1568*bb4ee6a4SAndroid Build Coastguard Worker         aml.push(orders[1]);
1569*bb4ee6a4SAndroid Build Coastguard Worker         // Add child data
1570*bb4ee6a4SAndroid Build Coastguard Worker         for child in &self.children {
1571*bb4ee6a4SAndroid Build Coastguard Worker             child.to_aml_bytes(aml);
1572*bb4ee6a4SAndroid Build Coastguard Worker         }
1573*bb4ee6a4SAndroid Build Coastguard Worker 
1574*bb4ee6a4SAndroid Build Coastguard Worker         let len = aml.len() - start;
1575*bb4ee6a4SAndroid Build Coastguard Worker 
1576*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(aml, start, len);
1577*bb4ee6a4SAndroid Build Coastguard Worker     }
1578*bb4ee6a4SAndroid Build Coastguard Worker }
1579*bb4ee6a4SAndroid Build Coastguard Worker 
1580*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(test)]
1581*bb4ee6a4SAndroid Build Coastguard Worker mod tests {
1582*bb4ee6a4SAndroid Build Coastguard Worker     use super::*;
1583*bb4ee6a4SAndroid Build Coastguard Worker 
1584*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_device()1585*bb4ee6a4SAndroid Build Coastguard Worker     fn test_device() {
1586*bb4ee6a4SAndroid Build Coastguard Worker         /*
1587*bb4ee6a4SAndroid Build Coastguard Worker         Device (_SB.COM1)
1588*bb4ee6a4SAndroid Build Coastguard Worker         {
1589*bb4ee6a4SAndroid Build Coastguard Worker             Name (_HID, EisaId ("PNP0501") /* 16550A-compatible COM Serial Port */) // _HID: Hardware ID
1590*bb4ee6a4SAndroid Build Coastguard Worker             Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
1591*bb4ee6a4SAndroid Build Coastguard Worker             {
1592*bb4ee6a4SAndroid Build Coastguard Worker                 Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, ,, )
1593*bb4ee6a4SAndroid Build Coastguard Worker                 {
1594*bb4ee6a4SAndroid Build Coastguard Worker                     0x00000004,
1595*bb4ee6a4SAndroid Build Coastguard Worker                 }
1596*bb4ee6a4SAndroid Build Coastguard Worker                 IO (Decode16,
1597*bb4ee6a4SAndroid Build Coastguard Worker                     0x03F8,             // Range Minimum
1598*bb4ee6a4SAndroid Build Coastguard Worker                     0x03F8,             // Range Maximum
1599*bb4ee6a4SAndroid Build Coastguard Worker                     0x00,               // Alignment
1600*bb4ee6a4SAndroid Build Coastguard Worker                     0x08,               // Length
1601*bb4ee6a4SAndroid Build Coastguard Worker                     )
1602*bb4ee6a4SAndroid Build Coastguard Worker             }
1603*bb4ee6a4SAndroid Build Coastguard Worker         }
1604*bb4ee6a4SAndroid Build Coastguard Worker             */
1605*bb4ee6a4SAndroid Build Coastguard Worker         let com1_device = [
1606*bb4ee6a4SAndroid Build Coastguard Worker             0x5B, 0x82, 0x30, 0x2E, 0x5F, 0x53, 0x42, 0x5F, 0x43, 0x4F, 0x4D, 0x31, 0x08, 0x5F,
1607*bb4ee6a4SAndroid Build Coastguard Worker             0x48, 0x49, 0x44, 0x0C, 0x41, 0xD0, 0x05, 0x01, 0x08, 0x5F, 0x43, 0x52, 0x53, 0x11,
1608*bb4ee6a4SAndroid Build Coastguard Worker             0x16, 0x0A, 0x13, 0x89, 0x06, 0x00, 0x03, 0x01, 0x04, 0x00, 0x00, 0x00, 0x47, 0x01,
1609*bb4ee6a4SAndroid Build Coastguard Worker             0xF8, 0x03, 0xF8, 0x03, 0x00, 0x08, 0x79, 0x00,
1610*bb4ee6a4SAndroid Build Coastguard Worker         ];
1611*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
1612*bb4ee6a4SAndroid Build Coastguard Worker 
1613*bb4ee6a4SAndroid Build Coastguard Worker         Device::new(
1614*bb4ee6a4SAndroid Build Coastguard Worker             "_SB_.COM1".into(),
1615*bb4ee6a4SAndroid Build Coastguard Worker             vec![
1616*bb4ee6a4SAndroid Build Coastguard Worker                 &Name::new("_HID".into(), &EISAName::new("PNP0501")),
1617*bb4ee6a4SAndroid Build Coastguard Worker                 &Name::new(
1618*bb4ee6a4SAndroid Build Coastguard Worker                     "_CRS".into(),
1619*bb4ee6a4SAndroid Build Coastguard Worker                     &ResourceTemplate::new(vec![
1620*bb4ee6a4SAndroid Build Coastguard Worker                         &Interrupt::new(true, true, false, false, 4),
1621*bb4ee6a4SAndroid Build Coastguard Worker                         &IO::new(0x3f8, 0x3f8, 0, 0x8),
1622*bb4ee6a4SAndroid Build Coastguard Worker                     ]),
1623*bb4ee6a4SAndroid Build Coastguard Worker                 ),
1624*bb4ee6a4SAndroid Build Coastguard Worker             ],
1625*bb4ee6a4SAndroid Build Coastguard Worker         )
1626*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
1627*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &com1_device[..]);
1628*bb4ee6a4SAndroid Build Coastguard Worker     }
1629*bb4ee6a4SAndroid Build Coastguard Worker 
1630*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_scope()1631*bb4ee6a4SAndroid Build Coastguard Worker     fn test_scope() {
1632*bb4ee6a4SAndroid Build Coastguard Worker         /*
1633*bb4ee6a4SAndroid Build Coastguard Worker         Scope (_SB.MBRD)
1634*bb4ee6a4SAndroid Build Coastguard Worker         {
1635*bb4ee6a4SAndroid Build Coastguard Worker             Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
1636*bb4ee6a4SAndroid Build Coastguard Worker             {
1637*bb4ee6a4SAndroid Build Coastguard Worker                 Memory32Fixed (ReadWrite,
1638*bb4ee6a4SAndroid Build Coastguard Worker                     0xE8000000,         // Address Base
1639*bb4ee6a4SAndroid Build Coastguard Worker                     0x10000000,         // Address Length
1640*bb4ee6a4SAndroid Build Coastguard Worker                     )
1641*bb4ee6a4SAndroid Build Coastguard Worker             })
1642*bb4ee6a4SAndroid Build Coastguard Worker         }
1643*bb4ee6a4SAndroid Build Coastguard Worker         */
1644*bb4ee6a4SAndroid Build Coastguard Worker 
1645*bb4ee6a4SAndroid Build Coastguard Worker         let mbrd_scope = [
1646*bb4ee6a4SAndroid Build Coastguard Worker             0x10, 0x21, 0x2E, 0x5F, 0x53, 0x42, 0x5F, 0x4D, 0x42, 0x52, 0x44, 0x08, 0x5F, 0x43,
1647*bb4ee6a4SAndroid Build Coastguard Worker             0x52, 0x53, 0x11, 0x11, 0x0A, 0x0E, 0x86, 0x09, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE8,
1648*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0x00, 0x00, 0x10, 0x79, 0x00,
1649*bb4ee6a4SAndroid Build Coastguard Worker         ];
1650*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
1651*bb4ee6a4SAndroid Build Coastguard Worker 
1652*bb4ee6a4SAndroid Build Coastguard Worker         Scope::new(
1653*bb4ee6a4SAndroid Build Coastguard Worker             "_SB_.MBRD".into(),
1654*bb4ee6a4SAndroid Build Coastguard Worker             vec![&Name::new(
1655*bb4ee6a4SAndroid Build Coastguard Worker                 "_CRS".into(),
1656*bb4ee6a4SAndroid Build Coastguard Worker                 &ResourceTemplate::new(vec![&Memory32Fixed::new(true, 0xE800_0000, 0x1000_0000)]),
1657*bb4ee6a4SAndroid Build Coastguard Worker             )],
1658*bb4ee6a4SAndroid Build Coastguard Worker         )
1659*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
1660*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &mbrd_scope[..]);
1661*bb4ee6a4SAndroid Build Coastguard Worker     }
1662*bb4ee6a4SAndroid Build Coastguard Worker 
1663*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_resource_template()1664*bb4ee6a4SAndroid Build Coastguard Worker     fn test_resource_template() {
1665*bb4ee6a4SAndroid Build Coastguard Worker         /*
1666*bb4ee6a4SAndroid Build Coastguard Worker         Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
1667*bb4ee6a4SAndroid Build Coastguard Worker         {
1668*bb4ee6a4SAndroid Build Coastguard Worker             Memory32Fixed (ReadWrite,
1669*bb4ee6a4SAndroid Build Coastguard Worker                 0xE8000000,         // Address Base
1670*bb4ee6a4SAndroid Build Coastguard Worker                 0x10000000,         // Address Length
1671*bb4ee6a4SAndroid Build Coastguard Worker                 )
1672*bb4ee6a4SAndroid Build Coastguard Worker         })
1673*bb4ee6a4SAndroid Build Coastguard Worker         */
1674*bb4ee6a4SAndroid Build Coastguard Worker         let crs_memory_32_fixed = [
1675*bb4ee6a4SAndroid Build Coastguard Worker             0x08, 0x5F, 0x43, 0x52, 0x53, 0x11, 0x11, 0x0A, 0x0E, 0x86, 0x09, 0x00, 0x01, 0x00,
1676*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x10, 0x79, 0x00,
1677*bb4ee6a4SAndroid Build Coastguard Worker         ];
1678*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
1679*bb4ee6a4SAndroid Build Coastguard Worker 
1680*bb4ee6a4SAndroid Build Coastguard Worker         Name::new(
1681*bb4ee6a4SAndroid Build Coastguard Worker             "_CRS".into(),
1682*bb4ee6a4SAndroid Build Coastguard Worker             &ResourceTemplate::new(vec![&Memory32Fixed::new(true, 0xE800_0000, 0x1000_0000)]),
1683*bb4ee6a4SAndroid Build Coastguard Worker         )
1684*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
1685*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, crs_memory_32_fixed);
1686*bb4ee6a4SAndroid Build Coastguard Worker 
1687*bb4ee6a4SAndroid Build Coastguard Worker         /*
1688*bb4ee6a4SAndroid Build Coastguard Worker             Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
1689*bb4ee6a4SAndroid Build Coastguard Worker             {
1690*bb4ee6a4SAndroid Build Coastguard Worker                 WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
1691*bb4ee6a4SAndroid Build Coastguard Worker                     0x0000,             // Granularity
1692*bb4ee6a4SAndroid Build Coastguard Worker                     0x0000,             // Range Minimum
1693*bb4ee6a4SAndroid Build Coastguard Worker                     0x00FF,             // Range Maximum
1694*bb4ee6a4SAndroid Build Coastguard Worker                     0x0000,             // Translation Offset
1695*bb4ee6a4SAndroid Build Coastguard Worker                     0x0100,             // Length
1696*bb4ee6a4SAndroid Build Coastguard Worker                     ,, )
1697*bb4ee6a4SAndroid Build Coastguard Worker                 WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
1698*bb4ee6a4SAndroid Build Coastguard Worker                     0x0000,             // Granularity
1699*bb4ee6a4SAndroid Build Coastguard Worker                     0x0000,             // Range Minimum
1700*bb4ee6a4SAndroid Build Coastguard Worker                     0x0CF7,             // Range Maximum
1701*bb4ee6a4SAndroid Build Coastguard Worker                     0x0000,             // Translation Offset
1702*bb4ee6a4SAndroid Build Coastguard Worker                     0x0CF8,             // Length
1703*bb4ee6a4SAndroid Build Coastguard Worker                     ,, , TypeStatic, DenseTranslation)
1704*bb4ee6a4SAndroid Build Coastguard Worker                 WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
1705*bb4ee6a4SAndroid Build Coastguard Worker                     0x0000,             // Granularity
1706*bb4ee6a4SAndroid Build Coastguard Worker                     0x0D00,             // Range Minimum
1707*bb4ee6a4SAndroid Build Coastguard Worker                     0xFFFF,             // Range Maximum
1708*bb4ee6a4SAndroid Build Coastguard Worker                     0x0000,             // Translation Offset
1709*bb4ee6a4SAndroid Build Coastguard Worker                     0xF300,             // Length
1710*bb4ee6a4SAndroid Build Coastguard Worker                     ,, , TypeStatic, DenseTranslation)
1711*bb4ee6a4SAndroid Build Coastguard Worker                 DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
1712*bb4ee6a4SAndroid Build Coastguard Worker                     0x00000000,         // Granularity
1713*bb4ee6a4SAndroid Build Coastguard Worker                     0x000A0000,         // Range Minimum
1714*bb4ee6a4SAndroid Build Coastguard Worker                     0x000BFFFF,         // Range Maximum
1715*bb4ee6a4SAndroid Build Coastguard Worker                     0x00000000,         // Translation Offset
1716*bb4ee6a4SAndroid Build Coastguard Worker                     0x00020000,         // Length
1717*bb4ee6a4SAndroid Build Coastguard Worker                     ,, , AddressRangeMemory, TypeStatic)
1718*bb4ee6a4SAndroid Build Coastguard Worker                 DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
1719*bb4ee6a4SAndroid Build Coastguard Worker                     0x00000000,         // Granularity
1720*bb4ee6a4SAndroid Build Coastguard Worker                     0xC0000000,         // Range Minimum
1721*bb4ee6a4SAndroid Build Coastguard Worker                     0xFEBFFFFF,         // Range Maximum
1722*bb4ee6a4SAndroid Build Coastguard Worker                     0x00000000,         // Translation Offset
1723*bb4ee6a4SAndroid Build Coastguard Worker                     0x3EC00000,         // Length
1724*bb4ee6a4SAndroid Build Coastguard Worker                     ,, , AddressRangeMemory, TypeStatic)
1725*bb4ee6a4SAndroid Build Coastguard Worker                 QWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
1726*bb4ee6a4SAndroid Build Coastguard Worker                     0x0000000000000000, // Granularity
1727*bb4ee6a4SAndroid Build Coastguard Worker                     0x0000000800000000, // Range Minimum
1728*bb4ee6a4SAndroid Build Coastguard Worker                     0x0000000FFFFFFFFF, // Range Maximum
1729*bb4ee6a4SAndroid Build Coastguard Worker                     0x0000000000000000, // Translation Offset
1730*bb4ee6a4SAndroid Build Coastguard Worker                     0x0000000800000000, // Length
1731*bb4ee6a4SAndroid Build Coastguard Worker                     ,, , AddressRangeMemory, TypeStatic)
1732*bb4ee6a4SAndroid Build Coastguard Worker             })
1733*bb4ee6a4SAndroid Build Coastguard Worker         */
1734*bb4ee6a4SAndroid Build Coastguard Worker 
1735*bb4ee6a4SAndroid Build Coastguard Worker         // WordBusNumber from above
1736*bb4ee6a4SAndroid Build Coastguard Worker         let crs_word_bus_number = [
1737*bb4ee6a4SAndroid Build Coastguard Worker             0x08, 0x5F, 0x43, 0x52, 0x53, 0x11, 0x15, 0x0A, 0x12, 0x88, 0x0D, 0x00, 0x02, 0x0C,
1738*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x79, 0x00,
1739*bb4ee6a4SAndroid Build Coastguard Worker         ];
1740*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1741*bb4ee6a4SAndroid Build Coastguard Worker 
1742*bb4ee6a4SAndroid Build Coastguard Worker         Name::new(
1743*bb4ee6a4SAndroid Build Coastguard Worker             "_CRS".into(),
1744*bb4ee6a4SAndroid Build Coastguard Worker             &ResourceTemplate::new(vec![&AddressSpace::new_bus_number(0x0u16, 0xffu16)]),
1745*bb4ee6a4SAndroid Build Coastguard Worker         )
1746*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
1747*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &crs_word_bus_number);
1748*bb4ee6a4SAndroid Build Coastguard Worker 
1749*bb4ee6a4SAndroid Build Coastguard Worker         // WordIO blocks (x 2) from above
1750*bb4ee6a4SAndroid Build Coastguard Worker         let crs_word_io = [
1751*bb4ee6a4SAndroid Build Coastguard Worker             0x08, 0x5F, 0x43, 0x52, 0x53, 0x11, 0x25, 0x0A, 0x22, 0x88, 0x0D, 0x00, 0x01, 0x0C,
1752*bb4ee6a4SAndroid Build Coastguard Worker             0x03, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x0C, 0x00, 0x00, 0xF8, 0x0C, 0x88, 0x0D, 0x00,
1753*bb4ee6a4SAndroid Build Coastguard Worker             0x01, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xF3, 0x79,
1754*bb4ee6a4SAndroid Build Coastguard Worker             0x00,
1755*bb4ee6a4SAndroid Build Coastguard Worker         ];
1756*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1757*bb4ee6a4SAndroid Build Coastguard Worker 
1758*bb4ee6a4SAndroid Build Coastguard Worker         Name::new(
1759*bb4ee6a4SAndroid Build Coastguard Worker             "_CRS".into(),
1760*bb4ee6a4SAndroid Build Coastguard Worker             &ResourceTemplate::new(vec![
1761*bb4ee6a4SAndroid Build Coastguard Worker                 &AddressSpace::new_io(0x0u16, 0xcf7u16),
1762*bb4ee6a4SAndroid Build Coastguard Worker                 &AddressSpace::new_io(0xd00u16, 0xffffu16),
1763*bb4ee6a4SAndroid Build Coastguard Worker             ]),
1764*bb4ee6a4SAndroid Build Coastguard Worker         )
1765*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
1766*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &crs_word_io[..]);
1767*bb4ee6a4SAndroid Build Coastguard Worker 
1768*bb4ee6a4SAndroid Build Coastguard Worker         // DWordMemory blocks (x 2) from above
1769*bb4ee6a4SAndroid Build Coastguard Worker         let crs_dword_memory = [
1770*bb4ee6a4SAndroid Build Coastguard Worker             0x08, 0x5F, 0x43, 0x52, 0x53, 0x11, 0x39, 0x0A, 0x36, 0x87, 0x17, 0x00, 0x00, 0x0C,
1771*bb4ee6a4SAndroid Build Coastguard Worker             0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xFF, 0xFF, 0x0B, 0x00, 0x00,
1772*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x87, 0x17, 0x00, 0x00, 0x0C, 0x01, 0x00,
1773*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xBF, 0xFE, 0x00, 0x00, 0x00,
1774*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0x00, 0x00, 0xC0, 0x3E, 0x79, 0x00,
1775*bb4ee6a4SAndroid Build Coastguard Worker         ];
1776*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1777*bb4ee6a4SAndroid Build Coastguard Worker 
1778*bb4ee6a4SAndroid Build Coastguard Worker         Name::new(
1779*bb4ee6a4SAndroid Build Coastguard Worker             "_CRS".into(),
1780*bb4ee6a4SAndroid Build Coastguard Worker             &ResourceTemplate::new(vec![
1781*bb4ee6a4SAndroid Build Coastguard Worker                 &AddressSpace::new_memory(
1782*bb4ee6a4SAndroid Build Coastguard Worker                     AddressSpaceCachable::Cacheable,
1783*bb4ee6a4SAndroid Build Coastguard Worker                     true,
1784*bb4ee6a4SAndroid Build Coastguard Worker                     0xa_0000u32,
1785*bb4ee6a4SAndroid Build Coastguard Worker                     0xb_ffffu32,
1786*bb4ee6a4SAndroid Build Coastguard Worker                 ),
1787*bb4ee6a4SAndroid Build Coastguard Worker                 &AddressSpace::new_memory(
1788*bb4ee6a4SAndroid Build Coastguard Worker                     AddressSpaceCachable::NotCacheable,
1789*bb4ee6a4SAndroid Build Coastguard Worker                     true,
1790*bb4ee6a4SAndroid Build Coastguard Worker                     0xc000_0000u32,
1791*bb4ee6a4SAndroid Build Coastguard Worker                     0xfebf_ffffu32,
1792*bb4ee6a4SAndroid Build Coastguard Worker                 ),
1793*bb4ee6a4SAndroid Build Coastguard Worker             ]),
1794*bb4ee6a4SAndroid Build Coastguard Worker         )
1795*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
1796*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &crs_dword_memory[..]);
1797*bb4ee6a4SAndroid Build Coastguard Worker 
1798*bb4ee6a4SAndroid Build Coastguard Worker         // QWordMemory from above
1799*bb4ee6a4SAndroid Build Coastguard Worker         let crs_qword_memory = [
1800*bb4ee6a4SAndroid Build Coastguard Worker             0x08, 0x5F, 0x43, 0x52, 0x53, 0x11, 0x33, 0x0A, 0x30, 0x8A, 0x2B, 0x00, 0x00, 0x0C,
1801*bb4ee6a4SAndroid Build Coastguard Worker             0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
1802*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1803*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x79,
1804*bb4ee6a4SAndroid Build Coastguard Worker             0x00,
1805*bb4ee6a4SAndroid Build Coastguard Worker         ];
1806*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1807*bb4ee6a4SAndroid Build Coastguard Worker         Name::new(
1808*bb4ee6a4SAndroid Build Coastguard Worker             "_CRS".into(),
1809*bb4ee6a4SAndroid Build Coastguard Worker             &ResourceTemplate::new(vec![&AddressSpace::new_memory(
1810*bb4ee6a4SAndroid Build Coastguard Worker                 AddressSpaceCachable::Cacheable,
1811*bb4ee6a4SAndroid Build Coastguard Worker                 true,
1812*bb4ee6a4SAndroid Build Coastguard Worker                 0x8_0000_0000u64,
1813*bb4ee6a4SAndroid Build Coastguard Worker                 0xf_ffff_ffffu64,
1814*bb4ee6a4SAndroid Build Coastguard Worker             )]),
1815*bb4ee6a4SAndroid Build Coastguard Worker         )
1816*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
1817*bb4ee6a4SAndroid Build Coastguard Worker 
1818*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &crs_qword_memory[..]);
1819*bb4ee6a4SAndroid Build Coastguard Worker 
1820*bb4ee6a4SAndroid Build Coastguard Worker         /*
1821*bb4ee6a4SAndroid Build Coastguard Worker             Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
1822*bb4ee6a4SAndroid Build Coastguard Worker             {
1823*bb4ee6a4SAndroid Build Coastguard Worker                 Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, ,, )
1824*bb4ee6a4SAndroid Build Coastguard Worker                 {
1825*bb4ee6a4SAndroid Build Coastguard Worker                     0x00000004,
1826*bb4ee6a4SAndroid Build Coastguard Worker                 }
1827*bb4ee6a4SAndroid Build Coastguard Worker                 IO (Decode16,
1828*bb4ee6a4SAndroid Build Coastguard Worker                     0x03F8,             // Range Minimum
1829*bb4ee6a4SAndroid Build Coastguard Worker                     0x03F8,             // Range Maximum
1830*bb4ee6a4SAndroid Build Coastguard Worker                     0x00,               // Alignment
1831*bb4ee6a4SAndroid Build Coastguard Worker                     0x08,               // Length
1832*bb4ee6a4SAndroid Build Coastguard Worker                     )
1833*bb4ee6a4SAndroid Build Coastguard Worker             })
1834*bb4ee6a4SAndroid Build Coastguard Worker 
1835*bb4ee6a4SAndroid Build Coastguard Worker         */
1836*bb4ee6a4SAndroid Build Coastguard Worker         let interrupt_io_data = [
1837*bb4ee6a4SAndroid Build Coastguard Worker             0x08, 0x5F, 0x43, 0x52, 0x53, 0x11, 0x16, 0x0A, 0x13, 0x89, 0x06, 0x00, 0x03, 0x01,
1838*bb4ee6a4SAndroid Build Coastguard Worker             0x04, 0x00, 0x00, 0x00, 0x47, 0x01, 0xF8, 0x03, 0xF8, 0x03, 0x00, 0x08, 0x79, 0x00,
1839*bb4ee6a4SAndroid Build Coastguard Worker         ];
1840*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1841*bb4ee6a4SAndroid Build Coastguard Worker         Name::new(
1842*bb4ee6a4SAndroid Build Coastguard Worker             "_CRS".into(),
1843*bb4ee6a4SAndroid Build Coastguard Worker             &ResourceTemplate::new(vec![
1844*bb4ee6a4SAndroid Build Coastguard Worker                 &Interrupt::new(true, true, false, false, 4),
1845*bb4ee6a4SAndroid Build Coastguard Worker                 &IO::new(0x3f8, 0x3f8, 0, 0x8),
1846*bb4ee6a4SAndroid Build Coastguard Worker             ]),
1847*bb4ee6a4SAndroid Build Coastguard Worker         )
1848*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
1849*bb4ee6a4SAndroid Build Coastguard Worker 
1850*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &interrupt_io_data[..]);
1851*bb4ee6a4SAndroid Build Coastguard Worker     }
1852*bb4ee6a4SAndroid Build Coastguard Worker 
1853*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_pkg_length()1854*bb4ee6a4SAndroid Build Coastguard Worker     fn test_pkg_length() {
1855*bb4ee6a4SAndroid Build Coastguard Worker         let mut pkg_len_62 = Vec::new();
1856*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(&mut pkg_len_62, 0, 62);
1857*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(pkg_len_62, [63]);
1858*bb4ee6a4SAndroid Build Coastguard Worker 
1859*bb4ee6a4SAndroid Build Coastguard Worker         let mut pkg_len_64 = Vec::new();
1860*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(&mut pkg_len_64, 0, 64);
1861*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(pkg_len_64, [1 << 6 | (66 & 0xf), 66 >> 4]);
1862*bb4ee6a4SAndroid Build Coastguard Worker 
1863*bb4ee6a4SAndroid Build Coastguard Worker         let mut pkg_len_4096 = Vec::new();
1864*bb4ee6a4SAndroid Build Coastguard Worker         insert_pkg_length(&mut pkg_len_4096, 0, 4096);
1865*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(
1866*bb4ee6a4SAndroid Build Coastguard Worker             pkg_len_4096,
1867*bb4ee6a4SAndroid Build Coastguard Worker             [
1868*bb4ee6a4SAndroid Build Coastguard Worker                 2 << 6 | (4099 & 0xf) as u8,
1869*bb4ee6a4SAndroid Build Coastguard Worker                 (4099 >> 4) as u8,
1870*bb4ee6a4SAndroid Build Coastguard Worker                 (4099 >> 12) as u8
1871*bb4ee6a4SAndroid Build Coastguard Worker             ]
1872*bb4ee6a4SAndroid Build Coastguard Worker         );
1873*bb4ee6a4SAndroid Build Coastguard Worker     }
1874*bb4ee6a4SAndroid Build Coastguard Worker 
1875*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_package()1876*bb4ee6a4SAndroid Build Coastguard Worker     fn test_package() {
1877*bb4ee6a4SAndroid Build Coastguard Worker         /*
1878*bb4ee6a4SAndroid Build Coastguard Worker         Name (_S5, Package (0x01)  // _S5_: S5 System State
1879*bb4ee6a4SAndroid Build Coastguard Worker         {
1880*bb4ee6a4SAndroid Build Coastguard Worker             0x05
1881*bb4ee6a4SAndroid Build Coastguard Worker         })
1882*bb4ee6a4SAndroid Build Coastguard Worker         */
1883*bb4ee6a4SAndroid Build Coastguard Worker         let s5_sleep_data = [0x08, 0x5F, 0x53, 0x35, 0x5F, 0x12, 0x04, 0x01, 0x0A, 0x05];
1884*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
1885*bb4ee6a4SAndroid Build Coastguard Worker 
1886*bb4ee6a4SAndroid Build Coastguard Worker         Name::new("_S5_".into(), &Package::new(vec![&5u8])).to_aml_bytes(&mut aml);
1887*bb4ee6a4SAndroid Build Coastguard Worker 
1888*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(s5_sleep_data.to_vec(), aml);
1889*bb4ee6a4SAndroid Build Coastguard Worker     }
1890*bb4ee6a4SAndroid Build Coastguard Worker 
1891*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_eisa_name()1892*bb4ee6a4SAndroid Build Coastguard Worker     fn test_eisa_name() {
1893*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
1894*bb4ee6a4SAndroid Build Coastguard Worker         Name::new("_HID".into(), &EISAName::new("PNP0501")).to_aml_bytes(&mut aml);
1895*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(
1896*bb4ee6a4SAndroid Build Coastguard Worker             aml,
1897*bb4ee6a4SAndroid Build Coastguard Worker             [0x08, 0x5F, 0x48, 0x49, 0x44, 0x0C, 0x41, 0xD0, 0x05, 0x01],
1898*bb4ee6a4SAndroid Build Coastguard Worker         )
1899*bb4ee6a4SAndroid Build Coastguard Worker     }
1900*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_name_path()1901*bb4ee6a4SAndroid Build Coastguard Worker     fn test_name_path() {
1902*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
1903*bb4ee6a4SAndroid Build Coastguard Worker         (&"_SB_".into() as &Path).to_aml_bytes(&mut aml);
1904*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x5Fu8, 0x53, 0x42, 0x5F]);
1905*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1906*bb4ee6a4SAndroid Build Coastguard Worker         (&"\\_SB_".into() as &Path).to_aml_bytes(&mut aml);
1907*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x5C, 0x5F, 0x53, 0x42, 0x5F]);
1908*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1909*bb4ee6a4SAndroid Build Coastguard Worker         (&"_SB_.COM1".into() as &Path).to_aml_bytes(&mut aml);
1910*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x2E, 0x5F, 0x53, 0x42, 0x5F, 0x43, 0x4F, 0x4D, 0x31]);
1911*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1912*bb4ee6a4SAndroid Build Coastguard Worker         (&"_SB_.PCI0._HID".into() as &Path).to_aml_bytes(&mut aml);
1913*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(
1914*bb4ee6a4SAndroid Build Coastguard Worker             aml,
1915*bb4ee6a4SAndroid Build Coastguard Worker             [0x2F, 0x03, 0x5F, 0x53, 0x42, 0x5F, 0x50, 0x43, 0x49, 0x30, 0x5F, 0x48, 0x49, 0x44]
1916*bb4ee6a4SAndroid Build Coastguard Worker         );
1917*bb4ee6a4SAndroid Build Coastguard Worker     }
1918*bb4ee6a4SAndroid Build Coastguard Worker 
1919*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_numbers()1920*bb4ee6a4SAndroid Build Coastguard Worker     fn test_numbers() {
1921*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
1922*bb4ee6a4SAndroid Build Coastguard Worker         128u8.to_aml_bytes(&mut aml);
1923*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0a, 0x80]);
1924*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1925*bb4ee6a4SAndroid Build Coastguard Worker         1024u16.to_aml_bytes(&mut aml);
1926*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0b, 0x0, 0x04]);
1927*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1928*bb4ee6a4SAndroid Build Coastguard Worker         (16u32 << 20).to_aml_bytes(&mut aml);
1929*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0c, 0x00, 0x00, 0x0, 0x01]);
1930*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1931*bb4ee6a4SAndroid Build Coastguard Worker         0xdeca_fbad_deca_fbadu64.to_aml_bytes(&mut aml);
1932*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0e, 0xad, 0xfb, 0xca, 0xde, 0xad, 0xfb, 0xca, 0xde]);
1933*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1934*bb4ee6a4SAndroid Build Coastguard Worker 
1935*bb4ee6a4SAndroid Build Coastguard Worker         // u8
1936*bb4ee6a4SAndroid Build Coastguard Worker         0x00_u8.to_aml_bytes(&mut aml);
1937*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x00]);
1938*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1939*bb4ee6a4SAndroid Build Coastguard Worker         0x01_u8.to_aml_bytes(&mut aml);
1940*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x01]);
1941*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1942*bb4ee6a4SAndroid Build Coastguard Worker         0x86_u8.to_aml_bytes(&mut aml);
1943*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0a, 0x86]);
1944*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1945*bb4ee6a4SAndroid Build Coastguard Worker 
1946*bb4ee6a4SAndroid Build Coastguard Worker         // u16
1947*bb4ee6a4SAndroid Build Coastguard Worker         0x00_u16.to_aml_bytes(&mut aml);
1948*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x00]);
1949*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1950*bb4ee6a4SAndroid Build Coastguard Worker         0x01_u16.to_aml_bytes(&mut aml);
1951*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x01]);
1952*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1953*bb4ee6a4SAndroid Build Coastguard Worker         0x86_u16.to_aml_bytes(&mut aml);
1954*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0a, 0x86]);
1955*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1956*bb4ee6a4SAndroid Build Coastguard Worker         0xF00D_u16.to_aml_bytes(&mut aml);
1957*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0b, 0x0d, 0xf0]);
1958*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1959*bb4ee6a4SAndroid Build Coastguard Worker 
1960*bb4ee6a4SAndroid Build Coastguard Worker         // u32
1961*bb4ee6a4SAndroid Build Coastguard Worker         0x00_u32.to_aml_bytes(&mut aml);
1962*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x00]);
1963*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1964*bb4ee6a4SAndroid Build Coastguard Worker         0x01_u32.to_aml_bytes(&mut aml);
1965*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x01]);
1966*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1967*bb4ee6a4SAndroid Build Coastguard Worker         0x86_u32.to_aml_bytes(&mut aml);
1968*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0a, 0x86]);
1969*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1970*bb4ee6a4SAndroid Build Coastguard Worker         0xF00D_u32.to_aml_bytes(&mut aml);
1971*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0b, 0x0d, 0xf0]);
1972*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1973*bb4ee6a4SAndroid Build Coastguard Worker         0xDECAF_u32.to_aml_bytes(&mut aml);
1974*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0c, 0xaf, 0xec, 0x0d, 0x00]);
1975*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1976*bb4ee6a4SAndroid Build Coastguard Worker 
1977*bb4ee6a4SAndroid Build Coastguard Worker         // u64
1978*bb4ee6a4SAndroid Build Coastguard Worker         0x00_u64.to_aml_bytes(&mut aml);
1979*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x00]);
1980*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1981*bb4ee6a4SAndroid Build Coastguard Worker         0x01_u64.to_aml_bytes(&mut aml);
1982*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x01]);
1983*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1984*bb4ee6a4SAndroid Build Coastguard Worker         0x86_u64.to_aml_bytes(&mut aml);
1985*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0a, 0x86]);
1986*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1987*bb4ee6a4SAndroid Build Coastguard Worker         0xF00D_u64.to_aml_bytes(&mut aml);
1988*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0b, 0x0d, 0xf0]);
1989*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1990*bb4ee6a4SAndroid Build Coastguard Worker         0xDECAF_u64.to_aml_bytes(&mut aml);
1991*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0c, 0xaf, 0xec, 0x0d, 0x00]);
1992*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1993*bb4ee6a4SAndroid Build Coastguard Worker         0xDECAFC0FFEE_u64.to_aml_bytes(&mut aml);
1994*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0e, 0xee, 0xff, 0xc0, 0xaf, 0xec, 0x0d, 0x00, 0x00]);
1995*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
1996*bb4ee6a4SAndroid Build Coastguard Worker 
1997*bb4ee6a4SAndroid Build Coastguard Worker         // usize
1998*bb4ee6a4SAndroid Build Coastguard Worker         0x00_usize.to_aml_bytes(&mut aml);
1999*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x00]);
2000*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
2001*bb4ee6a4SAndroid Build Coastguard Worker         0x01_usize.to_aml_bytes(&mut aml);
2002*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x01]);
2003*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
2004*bb4ee6a4SAndroid Build Coastguard Worker         0x86_usize.to_aml_bytes(&mut aml);
2005*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0a, 0x86]);
2006*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
2007*bb4ee6a4SAndroid Build Coastguard Worker         0xF00D_usize.to_aml_bytes(&mut aml);
2008*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0b, 0x0d, 0xf0]);
2009*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
2010*bb4ee6a4SAndroid Build Coastguard Worker         0xDECAF_usize.to_aml_bytes(&mut aml);
2011*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0c, 0xaf, 0xec, 0x0d, 0x00]);
2012*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
2013*bb4ee6a4SAndroid Build Coastguard Worker         #[cfg(target_pointer_width = "64")]
2014*bb4ee6a4SAndroid Build Coastguard Worker         {
2015*bb4ee6a4SAndroid Build Coastguard Worker             0xDECAFC0FFEE_usize.to_aml_bytes(&mut aml);
2016*bb4ee6a4SAndroid Build Coastguard Worker             assert_eq!(aml, [0x0e, 0xee, 0xff, 0xc0, 0xaf, 0xec, 0x0d, 0x00, 0x00]);
2017*bb4ee6a4SAndroid Build Coastguard Worker             aml.clear();
2018*bb4ee6a4SAndroid Build Coastguard Worker         }
2019*bb4ee6a4SAndroid Build Coastguard Worker     }
2020*bb4ee6a4SAndroid Build Coastguard Worker 
2021*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_name()2022*bb4ee6a4SAndroid Build Coastguard Worker     fn test_name() {
2023*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
2024*bb4ee6a4SAndroid Build Coastguard Worker         Name::new("_SB_.PCI0._UID".into(), &0x1234u16).to_aml_bytes(&mut aml);
2025*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(
2026*bb4ee6a4SAndroid Build Coastguard Worker             aml,
2027*bb4ee6a4SAndroid Build Coastguard Worker             [
2028*bb4ee6a4SAndroid Build Coastguard Worker                 0x08, /* NameOp */
2029*bb4ee6a4SAndroid Build Coastguard Worker                 0x2F, /* MultiNamePrefix */
2030*bb4ee6a4SAndroid Build Coastguard Worker                 0x03, /* 3 name parts */
2031*bb4ee6a4SAndroid Build Coastguard Worker                 0x5F, 0x53, 0x42, 0x5F, /* _SB_ */
2032*bb4ee6a4SAndroid Build Coastguard Worker                 0x50, 0x43, 0x49, 0x30, /* PCI0 */
2033*bb4ee6a4SAndroid Build Coastguard Worker                 0x5F, 0x55, 0x49, 0x44, /* _UID */
2034*bb4ee6a4SAndroid Build Coastguard Worker                 0x0b, /* WordPrefix */
2035*bb4ee6a4SAndroid Build Coastguard Worker                 0x34, 0x12
2036*bb4ee6a4SAndroid Build Coastguard Worker             ]
2037*bb4ee6a4SAndroid Build Coastguard Worker         );
2038*bb4ee6a4SAndroid Build Coastguard Worker     }
2039*bb4ee6a4SAndroid Build Coastguard Worker 
2040*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_string()2041*bb4ee6a4SAndroid Build Coastguard Worker     fn test_string() {
2042*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
2043*bb4ee6a4SAndroid Build Coastguard Worker         (&"ACPI" as &dyn Aml).to_aml_bytes(&mut aml);
2044*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0d, b'A', b'C', b'P', b'I', 0]);
2045*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
2046*bb4ee6a4SAndroid Build Coastguard Worker         "ACPI".to_owned().to_aml_bytes(&mut aml);
2047*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, [0x0d, b'A', b'C', b'P', b'I', 0]);
2048*bb4ee6a4SAndroid Build Coastguard Worker     }
2049*bb4ee6a4SAndroid Build Coastguard Worker 
2050*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_method()2051*bb4ee6a4SAndroid Build Coastguard Worker     fn test_method() {
2052*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
2053*bb4ee6a4SAndroid Build Coastguard Worker         Method::new("_STA".into(), 0, false, vec![&Return::new(&0xfu8)]).to_aml_bytes(&mut aml);
2054*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(
2055*bb4ee6a4SAndroid Build Coastguard Worker             aml,
2056*bb4ee6a4SAndroid Build Coastguard Worker             [0x14, 0x09, 0x5F, 0x53, 0x54, 0x41, 0x00, 0xA4, 0x0A, 0x0F]
2057*bb4ee6a4SAndroid Build Coastguard Worker         );
2058*bb4ee6a4SAndroid Build Coastguard Worker     }
2059*bb4ee6a4SAndroid Build Coastguard Worker 
2060*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_field()2061*bb4ee6a4SAndroid Build Coastguard Worker     fn test_field() {
2062*bb4ee6a4SAndroid Build Coastguard Worker         /*
2063*bb4ee6a4SAndroid Build Coastguard Worker             Field (PRST, ByteAcc, NoLock, WriteAsZeros)
2064*bb4ee6a4SAndroid Build Coastguard Worker             {
2065*bb4ee6a4SAndroid Build Coastguard Worker                 Offset (0x04),
2066*bb4ee6a4SAndroid Build Coastguard Worker                 CPEN,   1,
2067*bb4ee6a4SAndroid Build Coastguard Worker                 CINS,   1,
2068*bb4ee6a4SAndroid Build Coastguard Worker                 CRMV,   1,
2069*bb4ee6a4SAndroid Build Coastguard Worker                 CEJ0,   1,
2070*bb4ee6a4SAndroid Build Coastguard Worker                 Offset (0x05),
2071*bb4ee6a4SAndroid Build Coastguard Worker                 CCMD,   8
2072*bb4ee6a4SAndroid Build Coastguard Worker             }
2073*bb4ee6a4SAndroid Build Coastguard Worker 
2074*bb4ee6a4SAndroid Build Coastguard Worker         */
2075*bb4ee6a4SAndroid Build Coastguard Worker 
2076*bb4ee6a4SAndroid Build Coastguard Worker         let field_data = [
2077*bb4ee6a4SAndroid Build Coastguard Worker             0x5Bu8, 0x81, 0x23, 0x50, 0x52, 0x53, 0x54, 0x41, 0x00, 0x20, 0x43, 0x50, 0x45, 0x4E,
2078*bb4ee6a4SAndroid Build Coastguard Worker             0x01, 0x43, 0x49, 0x4E, 0x53, 0x01, 0x43, 0x52, 0x4D, 0x56, 0x01, 0x43, 0x45, 0x4A,
2079*bb4ee6a4SAndroid Build Coastguard Worker             0x30, 0x01, 0x00, 0x04, 0x43, 0x43, 0x4D, 0x44, 0x08,
2080*bb4ee6a4SAndroid Build Coastguard Worker         ];
2081*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
2082*bb4ee6a4SAndroid Build Coastguard Worker 
2083*bb4ee6a4SAndroid Build Coastguard Worker         Field::new(
2084*bb4ee6a4SAndroid Build Coastguard Worker             "PRST".into(),
2085*bb4ee6a4SAndroid Build Coastguard Worker             FieldAccessType::Byte,
2086*bb4ee6a4SAndroid Build Coastguard Worker             FieldLockRule::NoLock,
2087*bb4ee6a4SAndroid Build Coastguard Worker             FieldUpdateRule::WriteAsZeroes,
2088*bb4ee6a4SAndroid Build Coastguard Worker             vec![
2089*bb4ee6a4SAndroid Build Coastguard Worker                 FieldEntry::Reserved(32),
2090*bb4ee6a4SAndroid Build Coastguard Worker                 FieldEntry::Named(*b"CPEN", 1),
2091*bb4ee6a4SAndroid Build Coastguard Worker                 FieldEntry::Named(*b"CINS", 1),
2092*bb4ee6a4SAndroid Build Coastguard Worker                 FieldEntry::Named(*b"CRMV", 1),
2093*bb4ee6a4SAndroid Build Coastguard Worker                 FieldEntry::Named(*b"CEJ0", 1),
2094*bb4ee6a4SAndroid Build Coastguard Worker                 FieldEntry::Reserved(4),
2095*bb4ee6a4SAndroid Build Coastguard Worker                 FieldEntry::Named(*b"CCMD", 8),
2096*bb4ee6a4SAndroid Build Coastguard Worker             ],
2097*bb4ee6a4SAndroid Build Coastguard Worker         )
2098*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
2099*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &field_data[..]);
2100*bb4ee6a4SAndroid Build Coastguard Worker 
2101*bb4ee6a4SAndroid Build Coastguard Worker         /*
2102*bb4ee6a4SAndroid Build Coastguard Worker             Field (PRST, DWordAcc, Lock, Preserve)
2103*bb4ee6a4SAndroid Build Coastguard Worker             {
2104*bb4ee6a4SAndroid Build Coastguard Worker                 CSEL,   32,
2105*bb4ee6a4SAndroid Build Coastguard Worker                 Offset (0x08),
2106*bb4ee6a4SAndroid Build Coastguard Worker                 CDAT,   32
2107*bb4ee6a4SAndroid Build Coastguard Worker             }
2108*bb4ee6a4SAndroid Build Coastguard Worker         */
2109*bb4ee6a4SAndroid Build Coastguard Worker 
2110*bb4ee6a4SAndroid Build Coastguard Worker         let field_data = [
2111*bb4ee6a4SAndroid Build Coastguard Worker             0x5Bu8, 0x81, 0x12, 0x50, 0x52, 0x53, 0x54, 0x13, 0x43, 0x53, 0x45, 0x4C, 0x20, 0x00,
2112*bb4ee6a4SAndroid Build Coastguard Worker             0x20, 0x43, 0x44, 0x41, 0x54, 0x20,
2113*bb4ee6a4SAndroid Build Coastguard Worker         ];
2114*bb4ee6a4SAndroid Build Coastguard Worker         aml.clear();
2115*bb4ee6a4SAndroid Build Coastguard Worker 
2116*bb4ee6a4SAndroid Build Coastguard Worker         Field::new(
2117*bb4ee6a4SAndroid Build Coastguard Worker             "PRST".into(),
2118*bb4ee6a4SAndroid Build Coastguard Worker             FieldAccessType::DWord,
2119*bb4ee6a4SAndroid Build Coastguard Worker             FieldLockRule::Lock,
2120*bb4ee6a4SAndroid Build Coastguard Worker             FieldUpdateRule::Preserve,
2121*bb4ee6a4SAndroid Build Coastguard Worker             vec![
2122*bb4ee6a4SAndroid Build Coastguard Worker                 FieldEntry::Named(*b"CSEL", 32),
2123*bb4ee6a4SAndroid Build Coastguard Worker                 FieldEntry::Reserved(32),
2124*bb4ee6a4SAndroid Build Coastguard Worker                 FieldEntry::Named(*b"CDAT", 32),
2125*bb4ee6a4SAndroid Build Coastguard Worker             ],
2126*bb4ee6a4SAndroid Build Coastguard Worker         )
2127*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
2128*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &field_data[..]);
2129*bb4ee6a4SAndroid Build Coastguard Worker     }
2130*bb4ee6a4SAndroid Build Coastguard Worker 
2131*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_op_region()2132*bb4ee6a4SAndroid Build Coastguard Worker     fn test_op_region() {
2133*bb4ee6a4SAndroid Build Coastguard Worker         /*
2134*bb4ee6a4SAndroid Build Coastguard Worker             OperationRegion (PRST, SystemIO, 0x0CD8, 0x0C)
2135*bb4ee6a4SAndroid Build Coastguard Worker         */
2136*bb4ee6a4SAndroid Build Coastguard Worker         let op_region_data = [
2137*bb4ee6a4SAndroid Build Coastguard Worker             0x5Bu8, 0x80, 0x50, 0x52, 0x53, 0x54, 0x01, 0x0B, 0xD8, 0x0C, 0x0A, 0x0C,
2138*bb4ee6a4SAndroid Build Coastguard Worker         ];
2139*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
2140*bb4ee6a4SAndroid Build Coastguard Worker 
2141*bb4ee6a4SAndroid Build Coastguard Worker         OpRegion::new(
2142*bb4ee6a4SAndroid Build Coastguard Worker             "PRST".into(),
2143*bb4ee6a4SAndroid Build Coastguard Worker             OpRegionSpace::SystemIO,
2144*bb4ee6a4SAndroid Build Coastguard Worker             &0xcd8_usize,
2145*bb4ee6a4SAndroid Build Coastguard Worker             &0xc_usize,
2146*bb4ee6a4SAndroid Build Coastguard Worker         )
2147*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
2148*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &op_region_data[..]);
2149*bb4ee6a4SAndroid Build Coastguard Worker     }
2150*bb4ee6a4SAndroid Build Coastguard Worker 
2151*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_arg_if()2152*bb4ee6a4SAndroid Build Coastguard Worker     fn test_arg_if() {
2153*bb4ee6a4SAndroid Build Coastguard Worker         /*
2154*bb4ee6a4SAndroid Build Coastguard Worker             Method(TEST, 1, NotSerialized) {
2155*bb4ee6a4SAndroid Build Coastguard Worker                 If (Arg0 == Zero) {
2156*bb4ee6a4SAndroid Build Coastguard Worker                         Return(One)
2157*bb4ee6a4SAndroid Build Coastguard Worker                 }
2158*bb4ee6a4SAndroid Build Coastguard Worker                 Return(Zero)
2159*bb4ee6a4SAndroid Build Coastguard Worker             }
2160*bb4ee6a4SAndroid Build Coastguard Worker         */
2161*bb4ee6a4SAndroid Build Coastguard Worker         let arg_if_data = [
2162*bb4ee6a4SAndroid Build Coastguard Worker             0x14, 0x0F, 0x54, 0x45, 0x53, 0x54, 0x01, 0xA0, 0x06, 0x93, 0x68, 0x00, 0xA4, 0x01,
2163*bb4ee6a4SAndroid Build Coastguard Worker             0xA4, 0x00,
2164*bb4ee6a4SAndroid Build Coastguard Worker         ];
2165*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
2166*bb4ee6a4SAndroid Build Coastguard Worker 
2167*bb4ee6a4SAndroid Build Coastguard Worker         Method::new(
2168*bb4ee6a4SAndroid Build Coastguard Worker             "TEST".into(),
2169*bb4ee6a4SAndroid Build Coastguard Worker             1,
2170*bb4ee6a4SAndroid Build Coastguard Worker             false,
2171*bb4ee6a4SAndroid Build Coastguard Worker             vec![
2172*bb4ee6a4SAndroid Build Coastguard Worker                 &If::new(&Equal::new(&Arg(0), &ZERO), vec![&Return::new(&ONE)]),
2173*bb4ee6a4SAndroid Build Coastguard Worker                 &Return::new(&ZERO),
2174*bb4ee6a4SAndroid Build Coastguard Worker             ],
2175*bb4ee6a4SAndroid Build Coastguard Worker         )
2176*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
2177*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &arg_if_data);
2178*bb4ee6a4SAndroid Build Coastguard Worker     }
2179*bb4ee6a4SAndroid Build Coastguard Worker 
2180*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_local_if()2181*bb4ee6a4SAndroid Build Coastguard Worker     fn test_local_if() {
2182*bb4ee6a4SAndroid Build Coastguard Worker         /*
2183*bb4ee6a4SAndroid Build Coastguard Worker             Method(TEST, 0, NotSerialized) {
2184*bb4ee6a4SAndroid Build Coastguard Worker                 Local0 = One
2185*bb4ee6a4SAndroid Build Coastguard Worker                 If (Local0 == Zero) {
2186*bb4ee6a4SAndroid Build Coastguard Worker                         Return(One)
2187*bb4ee6a4SAndroid Build Coastguard Worker                 }
2188*bb4ee6a4SAndroid Build Coastguard Worker                 Return(Zero)
2189*bb4ee6a4SAndroid Build Coastguard Worker             }
2190*bb4ee6a4SAndroid Build Coastguard Worker         */
2191*bb4ee6a4SAndroid Build Coastguard Worker         let local_if_data = [
2192*bb4ee6a4SAndroid Build Coastguard Worker             0x14, 0x12, 0x54, 0x45, 0x53, 0x54, 0x00, 0x70, 0x01, 0x60, 0xA0, 0x06, 0x93, 0x60,
2193*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0xA4, 0x01, 0xA4, 0x00,
2194*bb4ee6a4SAndroid Build Coastguard Worker         ];
2195*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
2196*bb4ee6a4SAndroid Build Coastguard Worker 
2197*bb4ee6a4SAndroid Build Coastguard Worker         Method::new(
2198*bb4ee6a4SAndroid Build Coastguard Worker             "TEST".into(),
2199*bb4ee6a4SAndroid Build Coastguard Worker             0,
2200*bb4ee6a4SAndroid Build Coastguard Worker             false,
2201*bb4ee6a4SAndroid Build Coastguard Worker             vec![
2202*bb4ee6a4SAndroid Build Coastguard Worker                 &Store::new(&Local(0), &ONE),
2203*bb4ee6a4SAndroid Build Coastguard Worker                 &If::new(&Equal::new(&Local(0), &ZERO), vec![&Return::new(&ONE)]),
2204*bb4ee6a4SAndroid Build Coastguard Worker                 &Return::new(&ZERO),
2205*bb4ee6a4SAndroid Build Coastguard Worker             ],
2206*bb4ee6a4SAndroid Build Coastguard Worker         )
2207*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
2208*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &local_if_data);
2209*bb4ee6a4SAndroid Build Coastguard Worker     }
2210*bb4ee6a4SAndroid Build Coastguard Worker 
2211*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_mutex()2212*bb4ee6a4SAndroid Build Coastguard Worker     fn test_mutex() {
2213*bb4ee6a4SAndroid Build Coastguard Worker         /*
2214*bb4ee6a4SAndroid Build Coastguard Worker         Device (_SB_.MHPC)
2215*bb4ee6a4SAndroid Build Coastguard Worker         {
2216*bb4ee6a4SAndroid Build Coastguard Worker                 Name (_HID, EisaId("PNP0A06") /* Generic Container Device */)  // _HID: Hardware ID
2217*bb4ee6a4SAndroid Build Coastguard Worker                 Mutex (MLCK, 0x00)
2218*bb4ee6a4SAndroid Build Coastguard Worker                 Method (TEST, 0, NotSerialized)
2219*bb4ee6a4SAndroid Build Coastguard Worker                 {
2220*bb4ee6a4SAndroid Build Coastguard Worker                     Acquire (MLCK, 0xFFFF)
2221*bb4ee6a4SAndroid Build Coastguard Worker                     Local0 = One
2222*bb4ee6a4SAndroid Build Coastguard Worker                     Release (MLCK)
2223*bb4ee6a4SAndroid Build Coastguard Worker                 }
2224*bb4ee6a4SAndroid Build Coastguard Worker         }
2225*bb4ee6a4SAndroid Build Coastguard Worker         */
2226*bb4ee6a4SAndroid Build Coastguard Worker 
2227*bb4ee6a4SAndroid Build Coastguard Worker         let mutex_data = [
2228*bb4ee6a4SAndroid Build Coastguard Worker             0x5B, 0x82, 0x33, 0x2E, 0x5F, 0x53, 0x42, 0x5F, 0x4D, 0x48, 0x50, 0x43, 0x08, 0x5F,
2229*bb4ee6a4SAndroid Build Coastguard Worker             0x48, 0x49, 0x44, 0x0C, 0x41, 0xD0, 0x0A, 0x06, 0x5B, 0x01, 0x4D, 0x4C, 0x43, 0x4B,
2230*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0x14, 0x17, 0x54, 0x45, 0x53, 0x54, 0x00, 0x5B, 0x23, 0x4D, 0x4C, 0x43, 0x4B,
2231*bb4ee6a4SAndroid Build Coastguard Worker             0xFF, 0xFF, 0x70, 0x01, 0x60, 0x5B, 0x27, 0x4D, 0x4C, 0x43, 0x4B,
2232*bb4ee6a4SAndroid Build Coastguard Worker         ];
2233*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
2234*bb4ee6a4SAndroid Build Coastguard Worker 
2235*bb4ee6a4SAndroid Build Coastguard Worker         let mutex = Mutex::new("MLCK".into(), 0);
2236*bb4ee6a4SAndroid Build Coastguard Worker         Device::new(
2237*bb4ee6a4SAndroid Build Coastguard Worker             "_SB_.MHPC".into(),
2238*bb4ee6a4SAndroid Build Coastguard Worker             vec![
2239*bb4ee6a4SAndroid Build Coastguard Worker                 &Name::new("_HID".into(), &EISAName::new("PNP0A06")),
2240*bb4ee6a4SAndroid Build Coastguard Worker                 &mutex,
2241*bb4ee6a4SAndroid Build Coastguard Worker                 &Method::new(
2242*bb4ee6a4SAndroid Build Coastguard Worker                     "TEST".into(),
2243*bb4ee6a4SAndroid Build Coastguard Worker                     0,
2244*bb4ee6a4SAndroid Build Coastguard Worker                     false,
2245*bb4ee6a4SAndroid Build Coastguard Worker                     vec![
2246*bb4ee6a4SAndroid Build Coastguard Worker                         &Acquire::new("MLCK".into(), 0xffff),
2247*bb4ee6a4SAndroid Build Coastguard Worker                         &Store::new(&Local(0), &ONE),
2248*bb4ee6a4SAndroid Build Coastguard Worker                         &Release::new("MLCK".into()),
2249*bb4ee6a4SAndroid Build Coastguard Worker                     ],
2250*bb4ee6a4SAndroid Build Coastguard Worker                 ),
2251*bb4ee6a4SAndroid Build Coastguard Worker             ],
2252*bb4ee6a4SAndroid Build Coastguard Worker         )
2253*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
2254*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &mutex_data[..]);
2255*bb4ee6a4SAndroid Build Coastguard Worker     }
2256*bb4ee6a4SAndroid Build Coastguard Worker 
2257*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_notify()2258*bb4ee6a4SAndroid Build Coastguard Worker     fn test_notify() {
2259*bb4ee6a4SAndroid Build Coastguard Worker         /*
2260*bb4ee6a4SAndroid Build Coastguard Worker         Device (_SB.MHPC)
2261*bb4ee6a4SAndroid Build Coastguard Worker         {
2262*bb4ee6a4SAndroid Build Coastguard Worker             Name (_HID, EisaId ("PNP0A06") /* Generic Container Device */)  // _HID: Hardware ID
2263*bb4ee6a4SAndroid Build Coastguard Worker             Method (TEST, 0, NotSerialized)
2264*bb4ee6a4SAndroid Build Coastguard Worker             {
2265*bb4ee6a4SAndroid Build Coastguard Worker                 Notify (MHPC, One) // Device Check
2266*bb4ee6a4SAndroid Build Coastguard Worker             }
2267*bb4ee6a4SAndroid Build Coastguard Worker         }
2268*bb4ee6a4SAndroid Build Coastguard Worker         */
2269*bb4ee6a4SAndroid Build Coastguard Worker         let notify_data = [
2270*bb4ee6a4SAndroid Build Coastguard Worker             0x5B, 0x82, 0x21, 0x2E, 0x5F, 0x53, 0x42, 0x5F, 0x4D, 0x48, 0x50, 0x43, 0x08, 0x5F,
2271*bb4ee6a4SAndroid Build Coastguard Worker             0x48, 0x49, 0x44, 0x0C, 0x41, 0xD0, 0x0A, 0x06, 0x14, 0x0C, 0x54, 0x45, 0x53, 0x54,
2272*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0x86, 0x4D, 0x48, 0x50, 0x43, 0x01,
2273*bb4ee6a4SAndroid Build Coastguard Worker         ];
2274*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
2275*bb4ee6a4SAndroid Build Coastguard Worker 
2276*bb4ee6a4SAndroid Build Coastguard Worker         Device::new(
2277*bb4ee6a4SAndroid Build Coastguard Worker             "_SB_.MHPC".into(),
2278*bb4ee6a4SAndroid Build Coastguard Worker             vec![
2279*bb4ee6a4SAndroid Build Coastguard Worker                 &Name::new("_HID".into(), &EISAName::new("PNP0A06")),
2280*bb4ee6a4SAndroid Build Coastguard Worker                 &Method::new(
2281*bb4ee6a4SAndroid Build Coastguard Worker                     "TEST".into(),
2282*bb4ee6a4SAndroid Build Coastguard Worker                     0,
2283*bb4ee6a4SAndroid Build Coastguard Worker                     false,
2284*bb4ee6a4SAndroid Build Coastguard Worker                     vec![&Notify::new(&Path::new("MHPC"), &ONE)],
2285*bb4ee6a4SAndroid Build Coastguard Worker                 ),
2286*bb4ee6a4SAndroid Build Coastguard Worker             ],
2287*bb4ee6a4SAndroid Build Coastguard Worker         )
2288*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
2289*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &notify_data[..]);
2290*bb4ee6a4SAndroid Build Coastguard Worker     }
2291*bb4ee6a4SAndroid Build Coastguard Worker 
2292*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_while()2293*bb4ee6a4SAndroid Build Coastguard Worker     fn test_while() {
2294*bb4ee6a4SAndroid Build Coastguard Worker         /*
2295*bb4ee6a4SAndroid Build Coastguard Worker         Device (_SB.MHPC)
2296*bb4ee6a4SAndroid Build Coastguard Worker         {
2297*bb4ee6a4SAndroid Build Coastguard Worker             Name (_HID, EisaId ("PNP0A06") /* Generic Container Device */)  // _HID: Hardware ID
2298*bb4ee6a4SAndroid Build Coastguard Worker             Method (TEST, 0, NotSerialized)
2299*bb4ee6a4SAndroid Build Coastguard Worker             {
2300*bb4ee6a4SAndroid Build Coastguard Worker                 Local0 = Zero
2301*bb4ee6a4SAndroid Build Coastguard Worker                 While ((Local0 < 0x04))
2302*bb4ee6a4SAndroid Build Coastguard Worker                 {
2303*bb4ee6a4SAndroid Build Coastguard Worker                     Local0 += One
2304*bb4ee6a4SAndroid Build Coastguard Worker                 }
2305*bb4ee6a4SAndroid Build Coastguard Worker             }
2306*bb4ee6a4SAndroid Build Coastguard Worker         }
2307*bb4ee6a4SAndroid Build Coastguard Worker         */
2308*bb4ee6a4SAndroid Build Coastguard Worker 
2309*bb4ee6a4SAndroid Build Coastguard Worker         let while_data = [
2310*bb4ee6a4SAndroid Build Coastguard Worker             0x5B, 0x82, 0x28, 0x2E, 0x5F, 0x53, 0x42, 0x5F, 0x4D, 0x48, 0x50, 0x43, 0x08, 0x5F,
2311*bb4ee6a4SAndroid Build Coastguard Worker             0x48, 0x49, 0x44, 0x0C, 0x41, 0xD0, 0x0A, 0x06, 0x14, 0x13, 0x54, 0x45, 0x53, 0x54,
2312*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0x70, 0x00, 0x60, 0xA2, 0x09, 0x95, 0x60, 0x0A, 0x04, 0x72, 0x60, 0x01, 0x60,
2313*bb4ee6a4SAndroid Build Coastguard Worker         ];
2314*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
2315*bb4ee6a4SAndroid Build Coastguard Worker 
2316*bb4ee6a4SAndroid Build Coastguard Worker         Device::new(
2317*bb4ee6a4SAndroid Build Coastguard Worker             "_SB_.MHPC".into(),
2318*bb4ee6a4SAndroid Build Coastguard Worker             vec![
2319*bb4ee6a4SAndroid Build Coastguard Worker                 &Name::new("_HID".into(), &EISAName::new("PNP0A06")),
2320*bb4ee6a4SAndroid Build Coastguard Worker                 &Method::new(
2321*bb4ee6a4SAndroid Build Coastguard Worker                     "TEST".into(),
2322*bb4ee6a4SAndroid Build Coastguard Worker                     0,
2323*bb4ee6a4SAndroid Build Coastguard Worker                     false,
2324*bb4ee6a4SAndroid Build Coastguard Worker                     vec![
2325*bb4ee6a4SAndroid Build Coastguard Worker                         &Store::new(&Local(0), &ZERO),
2326*bb4ee6a4SAndroid Build Coastguard Worker                         &While::new(
2327*bb4ee6a4SAndroid Build Coastguard Worker                             &LessThan::new(&Local(0), &4usize),
2328*bb4ee6a4SAndroid Build Coastguard Worker                             vec![&Add::new(&Local(0), &Local(0), &ONE)],
2329*bb4ee6a4SAndroid Build Coastguard Worker                         ),
2330*bb4ee6a4SAndroid Build Coastguard Worker                     ],
2331*bb4ee6a4SAndroid Build Coastguard Worker                 ),
2332*bb4ee6a4SAndroid Build Coastguard Worker             ],
2333*bb4ee6a4SAndroid Build Coastguard Worker         )
2334*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
2335*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &while_data[..])
2336*bb4ee6a4SAndroid Build Coastguard Worker     }
2337*bb4ee6a4SAndroid Build Coastguard Worker 
2338*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_method_call()2339*bb4ee6a4SAndroid Build Coastguard Worker     fn test_method_call() {
2340*bb4ee6a4SAndroid Build Coastguard Worker         /*
2341*bb4ee6a4SAndroid Build Coastguard Worker             Method (TST1, 1, NotSerialized)
2342*bb4ee6a4SAndroid Build Coastguard Worker             {
2343*bb4ee6a4SAndroid Build Coastguard Worker                 TST2 (One, One)
2344*bb4ee6a4SAndroid Build Coastguard Worker             }
2345*bb4ee6a4SAndroid Build Coastguard Worker 
2346*bb4ee6a4SAndroid Build Coastguard Worker             Method (TST2, 2, NotSerialized)
2347*bb4ee6a4SAndroid Build Coastguard Worker             {
2348*bb4ee6a4SAndroid Build Coastguard Worker                 TST1 (One)
2349*bb4ee6a4SAndroid Build Coastguard Worker             }
2350*bb4ee6a4SAndroid Build Coastguard Worker         */
2351*bb4ee6a4SAndroid Build Coastguard Worker         let test_data = [
2352*bb4ee6a4SAndroid Build Coastguard Worker             0x14, 0x0C, 0x54, 0x53, 0x54, 0x31, 0x01, 0x54, 0x53, 0x54, 0x32, 0x01, 0x01, 0x14,
2353*bb4ee6a4SAndroid Build Coastguard Worker             0x0B, 0x54, 0x53, 0x54, 0x32, 0x02, 0x54, 0x53, 0x54, 0x31, 0x01,
2354*bb4ee6a4SAndroid Build Coastguard Worker         ];
2355*bb4ee6a4SAndroid Build Coastguard Worker 
2356*bb4ee6a4SAndroid Build Coastguard Worker         let mut methods = Vec::new();
2357*bb4ee6a4SAndroid Build Coastguard Worker         Method::new(
2358*bb4ee6a4SAndroid Build Coastguard Worker             "TST1".into(),
2359*bb4ee6a4SAndroid Build Coastguard Worker             1,
2360*bb4ee6a4SAndroid Build Coastguard Worker             false,
2361*bb4ee6a4SAndroid Build Coastguard Worker             vec![&MethodCall::new("TST2".into(), vec![&ONE, &ONE])],
2362*bb4ee6a4SAndroid Build Coastguard Worker         )
2363*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut methods);
2364*bb4ee6a4SAndroid Build Coastguard Worker         Method::new(
2365*bb4ee6a4SAndroid Build Coastguard Worker             "TST2".into(),
2366*bb4ee6a4SAndroid Build Coastguard Worker             2,
2367*bb4ee6a4SAndroid Build Coastguard Worker             false,
2368*bb4ee6a4SAndroid Build Coastguard Worker             vec![&MethodCall::new("TST1".into(), vec![&ONE])],
2369*bb4ee6a4SAndroid Build Coastguard Worker         )
2370*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut methods);
2371*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(&methods[..], &test_data[..])
2372*bb4ee6a4SAndroid Build Coastguard Worker     }
2373*bb4ee6a4SAndroid Build Coastguard Worker 
2374*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_buffer()2375*bb4ee6a4SAndroid Build Coastguard Worker     fn test_buffer() {
2376*bb4ee6a4SAndroid Build Coastguard Worker         /*
2377*bb4ee6a4SAndroid Build Coastguard Worker         Name (_MAT, Buffer (0x08)  // _MAT: Multiple APIC Table Entry
2378*bb4ee6a4SAndroid Build Coastguard Worker         {
2379*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00   /* ........ */
2380*bb4ee6a4SAndroid Build Coastguard Worker         })
2381*bb4ee6a4SAndroid Build Coastguard Worker         */
2382*bb4ee6a4SAndroid Build Coastguard Worker         let buffer_data = [
2383*bb4ee6a4SAndroid Build Coastguard Worker             0x08, 0x5F, 0x4D, 0x41, 0x54, 0x11, 0x0B, 0x0A, 0x08, 0x00, 0x08, 0x00, 0x00, 0x01,
2384*bb4ee6a4SAndroid Build Coastguard Worker             0x00, 0x00, 0x00,
2385*bb4ee6a4SAndroid Build Coastguard Worker         ];
2386*bb4ee6a4SAndroid Build Coastguard Worker         let mut aml = Vec::new();
2387*bb4ee6a4SAndroid Build Coastguard Worker 
2388*bb4ee6a4SAndroid Build Coastguard Worker         Name::new(
2389*bb4ee6a4SAndroid Build Coastguard Worker             "_MAT".into(),
2390*bb4ee6a4SAndroid Build Coastguard Worker             &BufferData::new(vec![0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00]),
2391*bb4ee6a4SAndroid Build Coastguard Worker         )
2392*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(&mut aml);
2393*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(aml, &buffer_data[..])
2394*bb4ee6a4SAndroid Build Coastguard Worker     }
2395*bb4ee6a4SAndroid Build Coastguard Worker }
2396