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, ¬ify_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