xref: /aosp_15_r20/external/crosvm/devices/src/pci/acpi.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2022 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 use acpi_tables::aml;
6*bb4ee6a4SAndroid Build Coastguard Worker use acpi_tables::aml::Aml;
7*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::anyhow;
8*bb4ee6a4SAndroid Build Coastguard Worker use anyhow::Result;
9*bb4ee6a4SAndroid Build Coastguard Worker use base::MemoryMapping;
10*bb4ee6a4SAndroid Build Coastguard Worker use base::MemoryMappingBuilder;
11*bb4ee6a4SAndroid Build Coastguard Worker use base::Protection;
12*bb4ee6a4SAndroid Build Coastguard Worker use base::SharedMemory;
13*bb4ee6a4SAndroid Build Coastguard Worker 
14*bb4ee6a4SAndroid Build Coastguard Worker pub const SHM_OFFSET: u32 = 0x1000;
15*bb4ee6a4SAndroid Build Coastguard Worker pub const SHM_SIZE: u32 = 0x1000;
16*bb4ee6a4SAndroid Build Coastguard Worker 
17*bb4ee6a4SAndroid Build Coastguard Worker pub struct DeviceVcfgRegister {
18*bb4ee6a4SAndroid Build Coastguard Worker     offset: u32,
19*bb4ee6a4SAndroid Build Coastguard Worker     shm: SharedMemory,
20*bb4ee6a4SAndroid Build Coastguard Worker }
21*bb4ee6a4SAndroid Build Coastguard Worker 
22*bb4ee6a4SAndroid Build Coastguard Worker impl DeviceVcfgRegister {
new(offset: u32) -> Result<DeviceVcfgRegister>23*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(offset: u32) -> Result<DeviceVcfgRegister> {
24*bb4ee6a4SAndroid Build Coastguard Worker         let shm = SharedMemory::new("VCFG register", SHM_SIZE as u64)
25*bb4ee6a4SAndroid Build Coastguard Worker             .map_err(|_| anyhow!("failed to create shared memory"))?;
26*bb4ee6a4SAndroid Build Coastguard Worker         Ok(DeviceVcfgRegister { offset, shm })
27*bb4ee6a4SAndroid Build Coastguard Worker     }
28*bb4ee6a4SAndroid Build Coastguard Worker 
create_shm_mmap(&self) -> Option<MemoryMapping>29*bb4ee6a4SAndroid Build Coastguard Worker     pub fn create_shm_mmap(&self) -> Option<MemoryMapping> {
30*bb4ee6a4SAndroid Build Coastguard Worker         MemoryMappingBuilder::new(SHM_SIZE as usize)
31*bb4ee6a4SAndroid Build Coastguard Worker             .from_shared_memory(&self.shm)
32*bb4ee6a4SAndroid Build Coastguard Worker             .offset(0)
33*bb4ee6a4SAndroid Build Coastguard Worker             .protection(Protection::read_write())
34*bb4ee6a4SAndroid Build Coastguard Worker             .build()
35*bb4ee6a4SAndroid Build Coastguard Worker             .ok()
36*bb4ee6a4SAndroid Build Coastguard Worker     }
37*bb4ee6a4SAndroid Build Coastguard Worker }
38*bb4ee6a4SAndroid Build Coastguard Worker 
39*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for DeviceVcfgRegister {
to_aml_bytes(&self, bytes: &mut Vec<u8>)40*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, bytes: &mut Vec<u8>) {
41*bb4ee6a4SAndroid Build Coastguard Worker         aml::OpRegion::new(
42*bb4ee6a4SAndroid Build Coastguard Worker             "VREG".into(),
43*bb4ee6a4SAndroid Build Coastguard Worker             aml::OpRegionSpace::SystemMemory,
44*bb4ee6a4SAndroid Build Coastguard Worker             &aml::Add::new(&aml::ZERO, &aml::Name::new_field_name("VCFG"), &self.offset),
45*bb4ee6a4SAndroid Build Coastguard Worker             &4096_usize,
46*bb4ee6a4SAndroid Build Coastguard Worker         )
47*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(bytes);
48*bb4ee6a4SAndroid Build Coastguard Worker         aml::Field::new(
49*bb4ee6a4SAndroid Build Coastguard Worker             "VREG".into(),
50*bb4ee6a4SAndroid Build Coastguard Worker             aml::FieldAccessType::DWord,
51*bb4ee6a4SAndroid Build Coastguard Worker             aml::FieldLockRule::Lock,
52*bb4ee6a4SAndroid Build Coastguard Worker             aml::FieldUpdateRule::Preserve,
53*bb4ee6a4SAndroid Build Coastguard Worker             vec![
54*bb4ee6a4SAndroid Build Coastguard Worker                 aml::FieldEntry::Named(*b"PFPM", 32),
55*bb4ee6a4SAndroid Build Coastguard Worker                 aml::FieldEntry::Named(*b"PDSM", 32),
56*bb4ee6a4SAndroid Build Coastguard Worker                 aml::FieldEntry::Named(*b"NOTY", 32),
57*bb4ee6a4SAndroid Build Coastguard Worker             ],
58*bb4ee6a4SAndroid Build Coastguard Worker         )
59*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(bytes);
60*bb4ee6a4SAndroid Build Coastguard Worker         aml::OpRegion::new(
61*bb4ee6a4SAndroid Build Coastguard Worker             "SHAM".into(),
62*bb4ee6a4SAndroid Build Coastguard Worker             aml::OpRegionSpace::SystemMemory,
63*bb4ee6a4SAndroid Build Coastguard Worker             &aml::Add::new(
64*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::ZERO,
65*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Name::new_field_name("VCFG"),
66*bb4ee6a4SAndroid Build Coastguard Worker                 &(self.offset + SHM_OFFSET),
67*bb4ee6a4SAndroid Build Coastguard Worker             ),
68*bb4ee6a4SAndroid Build Coastguard Worker             &SHM_SIZE,
69*bb4ee6a4SAndroid Build Coastguard Worker         )
70*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(bytes);
71*bb4ee6a4SAndroid Build Coastguard Worker         aml::Field::new(
72*bb4ee6a4SAndroid Build Coastguard Worker             "SHAM".into(),
73*bb4ee6a4SAndroid Build Coastguard Worker             aml::FieldAccessType::Any,
74*bb4ee6a4SAndroid Build Coastguard Worker             aml::FieldLockRule::Lock,
75*bb4ee6a4SAndroid Build Coastguard Worker             aml::FieldUpdateRule::Preserve,
76*bb4ee6a4SAndroid Build Coastguard Worker             vec![
77*bb4ee6a4SAndroid Build Coastguard Worker                 aml::FieldEntry::Named(*b"DSM0", 128),
78*bb4ee6a4SAndroid Build Coastguard Worker                 aml::FieldEntry::Named(*b"DSM1", 64),
79*bb4ee6a4SAndroid Build Coastguard Worker                 aml::FieldEntry::Named(*b"DSM2", 64),
80*bb4ee6a4SAndroid Build Coastguard Worker                 aml::FieldEntry::Named(*b"DSM3", 16384),
81*bb4ee6a4SAndroid Build Coastguard Worker             ],
82*bb4ee6a4SAndroid Build Coastguard Worker         )
83*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(bytes);
84*bb4ee6a4SAndroid Build Coastguard Worker         aml::Field::new(
85*bb4ee6a4SAndroid Build Coastguard Worker             "SHAM".into(),
86*bb4ee6a4SAndroid Build Coastguard Worker             aml::FieldAccessType::DWord,
87*bb4ee6a4SAndroid Build Coastguard Worker             aml::FieldLockRule::Lock,
88*bb4ee6a4SAndroid Build Coastguard Worker             aml::FieldUpdateRule::Preserve,
89*bb4ee6a4SAndroid Build Coastguard Worker             vec![
90*bb4ee6a4SAndroid Build Coastguard Worker                 aml::FieldEntry::Reserved(256),
91*bb4ee6a4SAndroid Build Coastguard Worker                 aml::FieldEntry::Named(*b"RTTP", 32),
92*bb4ee6a4SAndroid Build Coastguard Worker                 aml::FieldEntry::Named(*b"RTSZ", 32),
93*bb4ee6a4SAndroid Build Coastguard Worker                 aml::FieldEntry::Named(*b"RTDT", 16576),
94*bb4ee6a4SAndroid Build Coastguard Worker             ],
95*bb4ee6a4SAndroid Build Coastguard Worker         )
96*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(bytes);
97*bb4ee6a4SAndroid Build Coastguard Worker     }
98*bb4ee6a4SAndroid Build Coastguard Worker }
99*bb4ee6a4SAndroid Build Coastguard Worker 
100*bb4ee6a4SAndroid Build Coastguard Worker pub struct DsmMethod {}
101*bb4ee6a4SAndroid Build Coastguard Worker 
102*bb4ee6a4SAndroid Build Coastguard Worker const ACPI_TYPE_INT: &dyn Aml = &1_usize;
103*bb4ee6a4SAndroid Build Coastguard Worker const ACPI_TYPE_STRING: &dyn Aml = &2_usize;
104*bb4ee6a4SAndroid Build Coastguard Worker const ACPI_TYPE_BUFFER: &dyn Aml = &3_usize;
105*bb4ee6a4SAndroid Build Coastguard Worker const ACPI_TYPE_PACKAGE: &dyn Aml = &4_usize;
106*bb4ee6a4SAndroid Build Coastguard Worker 
107*bb4ee6a4SAndroid Build Coastguard Worker // The ACPI _DSM methods are described under:
108*bb4ee6a4SAndroid Build Coastguard Worker // https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/09_ACPI-Defined_Devices_and_Device-Specific_Objects/ACPIdefined_Devices_and_DeviceSpecificObjects.html?highlight=_dsm#dsm-device-specific-method
109*bb4ee6a4SAndroid Build Coastguard Worker //
110*bb4ee6a4SAndroid Build Coastguard Worker // Since the guest does not have access to native ACPI tables, whenever native driver for the
111*bb4ee6a4SAndroid Build Coastguard Worker // pass-through device, which resides in guest, evaluates _DSM methods, such evaluation needs to be
112*bb4ee6a4SAndroid Build Coastguard Worker // propagated to the host which can do the actual job.
113*bb4ee6a4SAndroid Build Coastguard Worker //
114*bb4ee6a4SAndroid Build Coastguard Worker // Below snippet generates AML code, which implements virtual _DSM method in guest ACPI tables.
115*bb4ee6a4SAndroid Build Coastguard Worker // Its role is to collect and pass guest _DSM arguments into host (through shared memory). When all
116*bb4ee6a4SAndroid Build Coastguard Worker // arguments are saved in shared memory, access to PDSM is issued which causes a trap to VMM. As a
117*bb4ee6a4SAndroid Build Coastguard Worker // consequence VMM can read passed _DSM arguments and pass them further (through dedicated IOCTL)
118*bb4ee6a4SAndroid Build Coastguard Worker // to the host kernel, which can actually evaluate the ACPI _DSM method using native tables. The
119*bb4ee6a4SAndroid Build Coastguard Worker // results are passed back from ioctl to VMM and further to the guest through shared memory.
120*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for DsmMethod {
to_aml_bytes(&self, aml: &mut Vec<u8>)121*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
122*bb4ee6a4SAndroid Build Coastguard Worker         aml::Method::new(
123*bb4ee6a4SAndroid Build Coastguard Worker             "_DSM".into(),
124*bb4ee6a4SAndroid Build Coastguard Worker             4,
125*bb4ee6a4SAndroid Build Coastguard Worker             true,
126*bb4ee6a4SAndroid Build Coastguard Worker             vec![
127*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Store::new(&aml::Name::new_field_name("DSM0"), &aml::Arg(0)),
128*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Store::new(&aml::Name::new_field_name("DSM1"), &aml::Arg(1)),
129*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Store::new(&aml::Name::new_field_name("DSM2"), &aml::Arg(2)),
130*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Store::new(&aml::Local(2), &aml::ObjectType::new(&aml::Arg(3))),
131*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Store::new(&aml::Local(1), &aml::SizeOf::new(&aml::Arg(3))),
132*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Store::new(&aml::Local(0), &aml::BufferTerm::new(&16384_usize)),
133*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::If::new(
134*bb4ee6a4SAndroid Build Coastguard Worker                     &aml::Equal::new(&aml::Local(2), ACPI_TYPE_BUFFER),
135*bb4ee6a4SAndroid Build Coastguard Worker                     vec![
136*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::CreateDWordField::new(
137*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Name::new_field_name("BFTP"),
138*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Local(0),
139*bb4ee6a4SAndroid Build Coastguard Worker                             &0_usize,
140*bb4ee6a4SAndroid Build Coastguard Worker                         ),
141*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::CreateDWordField::new(
142*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Name::new_field_name("BFSZ"),
143*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Local(0),
144*bb4ee6a4SAndroid Build Coastguard Worker                             &4_usize,
145*bb4ee6a4SAndroid Build Coastguard Worker                         ),
146*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::CreateField::new(
147*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Name::new_field_name("BFDT"),
148*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Local(0),
149*bb4ee6a4SAndroid Build Coastguard Worker                             &(8_usize * 8_usize),
150*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Multiply::new(&aml::ZERO, &aml::Local(1), &8_usize),
151*bb4ee6a4SAndroid Build Coastguard Worker                         ),
152*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::Store::new(&aml::Name::new_field_name("BFTP"), ACPI_TYPE_BUFFER),
153*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::Store::new(&aml::Name::new_field_name("BFSZ"), &aml::Local(1)),
154*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::Store::new(&aml::Name::new_field_name("BFDT"), &aml::Arg(3)),
155*bb4ee6a4SAndroid Build Coastguard Worker                     ],
156*bb4ee6a4SAndroid Build Coastguard Worker                 ),
157*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Else::new(vec![
158*bb4ee6a4SAndroid Build Coastguard Worker                     &aml::If::new(
159*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::Equal::new(&aml::Local(2), ACPI_TYPE_PACKAGE),
160*bb4ee6a4SAndroid Build Coastguard Worker                         vec![
161*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Store::new(&aml::Local(5), &aml::ZERO),
162*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::CreateDWordField::new(
163*bb4ee6a4SAndroid Build Coastguard Worker                                 &aml::Name::new_field_name("PKTP"),
164*bb4ee6a4SAndroid Build Coastguard Worker                                 &aml::Local(0),
165*bb4ee6a4SAndroid Build Coastguard Worker                                 &aml::Local(5),
166*bb4ee6a4SAndroid Build Coastguard Worker                             ),
167*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Store::new(&aml::Name::new_field_name("PKTP"), ACPI_TYPE_PACKAGE),
168*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Add::new(&aml::Local(5), &aml::Local(5), &4_usize),
169*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::CreateDWordField::new(
170*bb4ee6a4SAndroid Build Coastguard Worker                                 &aml::Name::new_field_name("PKSZ"),
171*bb4ee6a4SAndroid Build Coastguard Worker                                 &aml::Local(0),
172*bb4ee6a4SAndroid Build Coastguard Worker                                 &aml::Local(5),
173*bb4ee6a4SAndroid Build Coastguard Worker                             ),
174*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Store::new(&aml::Name::new_field_name("PKSZ"), &aml::Local(1)),
175*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Add::new(&aml::Local(5), &aml::Local(5), &4_usize),
176*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Store::new(&aml::Local(2), &aml::ZERO),
177*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::While::new(
178*bb4ee6a4SAndroid Build Coastguard Worker                                 &aml::LessThan::new(&aml::Local(2), &aml::Local(1)),
179*bb4ee6a4SAndroid Build Coastguard Worker                                 vec![
180*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Store::new(
181*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Local(3),
182*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::DeRefOf::new(&aml::Index::new(
183*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::ZERO,
184*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Arg(3),
185*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Local(2),
186*bb4ee6a4SAndroid Build Coastguard Worker                                         )),
187*bb4ee6a4SAndroid Build Coastguard Worker                                     ),
188*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Store::new(
189*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Local(4),
190*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::ObjectType::new(&aml::Local(3)),
191*bb4ee6a4SAndroid Build Coastguard Worker                                     ),
192*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Store::new(
193*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Local(6),
194*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::SizeOf::new(&aml::Local(3)),
195*bb4ee6a4SAndroid Build Coastguard Worker                                     ),
196*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::CreateDWordField::new(
197*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Name::new_field_name("OUTP"),
198*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Local(0),
199*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Local(5),
200*bb4ee6a4SAndroid Build Coastguard Worker                                     ),
201*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Store::new(
202*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Name::new_field_name("OUTP"),
203*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Local(4),
204*bb4ee6a4SAndroid Build Coastguard Worker                                     ),
205*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Add::new(&aml::Local(5), &aml::Local(5), &4_usize),
206*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::CreateDWordField::new(
207*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Name::new_field_name("OUSZ"),
208*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Local(0),
209*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Local(5),
210*bb4ee6a4SAndroid Build Coastguard Worker                                     ),
211*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Store::new(
212*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Name::new_field_name("OUSZ"),
213*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Local(6),
214*bb4ee6a4SAndroid Build Coastguard Worker                                     ),
215*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Add::new(&aml::Local(5), &aml::Local(5), &4_usize),
216*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::If::new(
217*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Equal::new(&aml::Local(4), ACPI_TYPE_INT),
218*bb4ee6a4SAndroid Build Coastguard Worker                                         vec![
219*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::CreateQWordField::new(
220*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Name::new_field_name("OUDT"),
221*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(0),
222*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(5),
223*bb4ee6a4SAndroid Build Coastguard Worker                                             ),
224*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Store::new(
225*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Name::new_field_name("OUDT"),
226*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(3),
227*bb4ee6a4SAndroid Build Coastguard Worker                                             ),
228*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Add::new(
229*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(5),
230*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(5),
231*bb4ee6a4SAndroid Build Coastguard Worker                                                 &8_usize,
232*bb4ee6a4SAndroid Build Coastguard Worker                                             ),
233*bb4ee6a4SAndroid Build Coastguard Worker                                         ],
234*bb4ee6a4SAndroid Build Coastguard Worker                                     ),
235*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Else::new(vec![
236*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::If::new(
237*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Equal::new(&aml::Local(4), ACPI_TYPE_STRING),
238*bb4ee6a4SAndroid Build Coastguard Worker                                             vec![
239*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::CreateField::new(
240*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Name::new_field_name("OSDT"),
241*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(0),
242*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Multiply::new(
243*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::ZERO,
244*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Local(5),
245*bb4ee6a4SAndroid Build Coastguard Worker                                                         &8_usize,
246*bb4ee6a4SAndroid Build Coastguard Worker                                                     ),
247*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Multiply::new(
248*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::ZERO,
249*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Local(6),
250*bb4ee6a4SAndroid Build Coastguard Worker                                                         &8_usize,
251*bb4ee6a4SAndroid Build Coastguard Worker                                                     ),
252*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
253*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Store::new(
254*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Name::new_field_name("OSDT"),
255*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(3),
256*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
257*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::And::new(
258*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(7),
259*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(6),
260*bb4ee6a4SAndroid Build Coastguard Worker                                                     &7_usize,
261*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
262*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::If::new(
263*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::NotEqual::new(&aml::Local(7), &aml::ZERO),
264*bb4ee6a4SAndroid Build Coastguard Worker                                                     vec![&aml::Add::new(
265*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Local(6),
266*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Local(6),
267*bb4ee6a4SAndroid Build Coastguard Worker                                                         &8_usize,
268*bb4ee6a4SAndroid Build Coastguard Worker                                                     )],
269*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
270*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Subtract::new(
271*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(6),
272*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(6),
273*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(7),
274*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
275*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Add::new(
276*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(5),
277*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(5),
278*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(6),
279*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
280*bb4ee6a4SAndroid Build Coastguard Worker                                             ],
281*bb4ee6a4SAndroid Build Coastguard Worker                                         ),
282*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Else::new(vec![&aml::If::new(
283*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Equal::new(&aml::Local(4), ACPI_TYPE_BUFFER),
284*bb4ee6a4SAndroid Build Coastguard Worker                                             vec![
285*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::CreateField::new(
286*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Name::new_field_name("OBDT"),
287*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(0),
288*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Multiply::new(
289*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::ZERO,
290*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Local(5),
291*bb4ee6a4SAndroid Build Coastguard Worker                                                         &8_usize,
292*bb4ee6a4SAndroid Build Coastguard Worker                                                     ),
293*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Multiply::new(
294*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::ZERO,
295*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Local(6),
296*bb4ee6a4SAndroid Build Coastguard Worker                                                         &8_usize,
297*bb4ee6a4SAndroid Build Coastguard Worker                                                     ),
298*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
299*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Store::new(
300*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Name::new_field_name("OBDT"),
301*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(3),
302*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
303*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::And::new(
304*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(7),
305*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(6),
306*bb4ee6a4SAndroid Build Coastguard Worker                                                     &7_usize,
307*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
308*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::If::new(
309*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::NotEqual::new(&aml::Local(7), &aml::ZERO),
310*bb4ee6a4SAndroid Build Coastguard Worker                                                     vec![&aml::Add::new(
311*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Local(6),
312*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Local(6),
313*bb4ee6a4SAndroid Build Coastguard Worker                                                         &8_usize,
314*bb4ee6a4SAndroid Build Coastguard Worker                                                     )],
315*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
316*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Subtract::new(
317*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(6),
318*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(6),
319*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(7),
320*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
321*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Add::new(
322*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(5),
323*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(5),
324*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(6),
325*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
326*bb4ee6a4SAndroid Build Coastguard Worker                                             ],
327*bb4ee6a4SAndroid Build Coastguard Worker                                         )]),
328*bb4ee6a4SAndroid Build Coastguard Worker                                     ]),
329*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Add::new(&aml::Local(2), &aml::Local(2), &aml::ONE),
330*bb4ee6a4SAndroid Build Coastguard Worker                                 ],
331*bb4ee6a4SAndroid Build Coastguard Worker                             ),
332*bb4ee6a4SAndroid Build Coastguard Worker                         ],
333*bb4ee6a4SAndroid Build Coastguard Worker                     ),
334*bb4ee6a4SAndroid Build Coastguard Worker                     &aml::Else::new(vec![&aml::Return::new(&aml::ZERO)]),
335*bb4ee6a4SAndroid Build Coastguard Worker                 ]),
336*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Store::new(&aml::Name::new_field_name("DSM3"), &aml::Local(0)),
337*bb4ee6a4SAndroid Build Coastguard Worker                 // All DSM arguments are written to shared memory, lets access PDSM which will trap
338*bb4ee6a4SAndroid Build Coastguard Worker                 // to VMM which can process it further. The result will be stored in shared memory.
339*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Store::new(&aml::Name::new_field_name("PDSM"), &aml::ZERO),
340*bb4ee6a4SAndroid Build Coastguard Worker                 // Lets start converting the _DSM result stored in shared memory into proper format
341*bb4ee6a4SAndroid Build Coastguard Worker                 // which will allow to return result in desired format to the guest caller.
342*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Store::new(
343*bb4ee6a4SAndroid Build Coastguard Worker                     &aml::Local(0),
344*bb4ee6a4SAndroid Build Coastguard Worker                     &aml::ToInteger::new(&aml::ZERO, &aml::Name::new_field_name("RTTP")),
345*bb4ee6a4SAndroid Build Coastguard Worker                 ),
346*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::If::new(
347*bb4ee6a4SAndroid Build Coastguard Worker                     &aml::Equal::new(&aml::Local(0), ACPI_TYPE_INT),
348*bb4ee6a4SAndroid Build Coastguard Worker                     vec![&aml::Return::new(&aml::ToInteger::new(
349*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::ZERO,
350*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::Name::new_field_name("RTDT"),
351*bb4ee6a4SAndroid Build Coastguard Worker                     ))],
352*bb4ee6a4SAndroid Build Coastguard Worker                 ),
353*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Else::new(vec![
354*bb4ee6a4SAndroid Build Coastguard Worker                     &aml::If::new(
355*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::Equal::new(&aml::Local(0), ACPI_TYPE_STRING),
356*bb4ee6a4SAndroid Build Coastguard Worker                         vec![&aml::Return::new(&aml::ToString::new(
357*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::ZERO,
358*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Name::new_field_name("RTDT"),
359*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::ONES,
360*bb4ee6a4SAndroid Build Coastguard Worker                         ))],
361*bb4ee6a4SAndroid Build Coastguard Worker                     ),
362*bb4ee6a4SAndroid Build Coastguard Worker                     &aml::Else::new(vec![
363*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::If::new(
364*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Equal::new(&aml::Local(0), ACPI_TYPE_BUFFER),
365*bb4ee6a4SAndroid Build Coastguard Worker                             vec![&aml::Return::new(&aml::Mid::new(
366*bb4ee6a4SAndroid Build Coastguard Worker                                 &aml::Name::new_field_name("RTDT"),
367*bb4ee6a4SAndroid Build Coastguard Worker                                 &0_usize,
368*bb4ee6a4SAndroid Build Coastguard Worker                                 &aml::ToInteger::new(
369*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::ZERO,
370*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Name::new_field_name("RTSZ"),
371*bb4ee6a4SAndroid Build Coastguard Worker                                 ),
372*bb4ee6a4SAndroid Build Coastguard Worker                                 &aml::ZERO,
373*bb4ee6a4SAndroid Build Coastguard Worker                             ))],
374*bb4ee6a4SAndroid Build Coastguard Worker                         ),
375*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::Else::new(vec![
376*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::If::new(
377*bb4ee6a4SAndroid Build Coastguard Worker                                 &aml::Equal::new(&aml::Local(0), ACPI_TYPE_PACKAGE),
378*bb4ee6a4SAndroid Build Coastguard Worker                                 vec![
379*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Store::new(&aml::Local(0), &aml::ZERO),
380*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Store::new(
381*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Local(1),
382*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::ToInteger::new(
383*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::ZERO,
384*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Name::new_field_name("RTSZ"),
385*bb4ee6a4SAndroid Build Coastguard Worker                                         ),
386*bb4ee6a4SAndroid Build Coastguard Worker                                     ),
387*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Store::new(
388*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::Local(2),
389*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::VarPackageTerm::new(&aml::Local(1)),
390*bb4ee6a4SAndroid Build Coastguard Worker                                     ),
391*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Store::new(&aml::Local(3), &aml::ZERO),
392*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::While::new(
393*bb4ee6a4SAndroid Build Coastguard Worker                                         &aml::LessThan::new(&aml::Local(0), &aml::Local(1)),
394*bb4ee6a4SAndroid Build Coastguard Worker                                         vec![
395*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Store::new(
396*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(4),
397*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::ToInteger::new(
398*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::ZERO,
399*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Mid::new(
400*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Name::new_field_name("RTDT"),
401*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Local(3),
402*bb4ee6a4SAndroid Build Coastguard Worker                                                         &4_usize,
403*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::ZERO,
404*bb4ee6a4SAndroid Build Coastguard Worker                                                     ),
405*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
406*bb4ee6a4SAndroid Build Coastguard Worker                                             ),
407*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Add::new(
408*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(3),
409*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(3),
410*bb4ee6a4SAndroid Build Coastguard Worker                                                 &4_usize,
411*bb4ee6a4SAndroid Build Coastguard Worker                                             ),
412*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Store::new(
413*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(5),
414*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::ToInteger::new(
415*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::ZERO,
416*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Mid::new(
417*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Name::new_field_name("RTDT"),
418*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Local(3),
419*bb4ee6a4SAndroid Build Coastguard Worker                                                         &4_usize,
420*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::ZERO,
421*bb4ee6a4SAndroid Build Coastguard Worker                                                     ),
422*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
423*bb4ee6a4SAndroid Build Coastguard Worker                                             ),
424*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Add::new(
425*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(3),
426*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(3),
427*bb4ee6a4SAndroid Build Coastguard Worker                                                 &4_usize,
428*bb4ee6a4SAndroid Build Coastguard Worker                                             ),
429*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Store::new(
430*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(6),
431*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Mid::new(
432*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Name::new_field_name("RTDT"),
433*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(3),
434*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(5),
435*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::ZERO,
436*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
437*bb4ee6a4SAndroid Build Coastguard Worker                                             ),
438*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Add::new(
439*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(3),
440*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(3),
441*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(5),
442*bb4ee6a4SAndroid Build Coastguard Worker                                             ),
443*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::If::new(
444*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Equal::new(&aml::Local(4), ACPI_TYPE_INT),
445*bb4ee6a4SAndroid Build Coastguard Worker                                                 vec![&aml::Store::new(
446*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(6),
447*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::ToInteger::new(
448*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::ZERO,
449*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Local(6),
450*bb4ee6a4SAndroid Build Coastguard Worker                                                     ),
451*bb4ee6a4SAndroid Build Coastguard Worker                                                 )],
452*bb4ee6a4SAndroid Build Coastguard Worker                                             ),
453*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Else::new(vec![&aml::If::new(
454*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Equal::new(&aml::Local(4), ACPI_TYPE_STRING),
455*bb4ee6a4SAndroid Build Coastguard Worker                                                 vec![&aml::Store::new(
456*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(6),
457*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::ToString::new(
458*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::ZERO,
459*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::Local(6),
460*bb4ee6a4SAndroid Build Coastguard Worker                                                         &aml::ONES,
461*bb4ee6a4SAndroid Build Coastguard Worker                                                     ),
462*bb4ee6a4SAndroid Build Coastguard Worker                                                 )],
463*bb4ee6a4SAndroid Build Coastguard Worker                                             )]),
464*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Store::new(
465*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Index::new(
466*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::ZERO,
467*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(2),
468*bb4ee6a4SAndroid Build Coastguard Worker                                                     &aml::Local(0),
469*bb4ee6a4SAndroid Build Coastguard Worker                                                 ),
470*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(6),
471*bb4ee6a4SAndroid Build Coastguard Worker                                             ),
472*bb4ee6a4SAndroid Build Coastguard Worker                                             &aml::Add::new(
473*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(0),
474*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::Local(0),
475*bb4ee6a4SAndroid Build Coastguard Worker                                                 &aml::ONE,
476*bb4ee6a4SAndroid Build Coastguard Worker                                             ),
477*bb4ee6a4SAndroid Build Coastguard Worker                                         ],
478*bb4ee6a4SAndroid Build Coastguard Worker                                     ),
479*bb4ee6a4SAndroid Build Coastguard Worker                                     &aml::Return::new(&aml::Local(2)),
480*bb4ee6a4SAndroid Build Coastguard Worker                                 ],
481*bb4ee6a4SAndroid Build Coastguard Worker                             ),
482*bb4ee6a4SAndroid Build Coastguard Worker                             &aml::Else::new(vec![&aml::Return::new(&aml::ZERO)]),
483*bb4ee6a4SAndroid Build Coastguard Worker                         ]),
484*bb4ee6a4SAndroid Build Coastguard Worker                     ]),
485*bb4ee6a4SAndroid Build Coastguard Worker                 ]),
486*bb4ee6a4SAndroid Build Coastguard Worker             ],
487*bb4ee6a4SAndroid Build Coastguard Worker         )
488*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(aml);
489*bb4ee6a4SAndroid Build Coastguard Worker     }
490*bb4ee6a4SAndroid Build Coastguard Worker }
491*bb4ee6a4SAndroid Build Coastguard Worker 
492*bb4ee6a4SAndroid Build Coastguard Worker pub struct PowerResourceMethod {}
493*bb4ee6a4SAndroid Build Coastguard Worker 
494*bb4ee6a4SAndroid Build Coastguard Worker impl Aml for PowerResourceMethod {
to_aml_bytes(&self, aml: &mut Vec<u8>)495*bb4ee6a4SAndroid Build Coastguard Worker     fn to_aml_bytes(&self, aml: &mut Vec<u8>) {
496*bb4ee6a4SAndroid Build Coastguard Worker         aml::PowerResource::new(
497*bb4ee6a4SAndroid Build Coastguard Worker             "PRIC".into(),
498*bb4ee6a4SAndroid Build Coastguard Worker             0u8,
499*bb4ee6a4SAndroid Build Coastguard Worker             0u16,
500*bb4ee6a4SAndroid Build Coastguard Worker             vec![
501*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Name::new("_STA".into(), &aml::ONE),
502*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Method::new(
503*bb4ee6a4SAndroid Build Coastguard Worker                     "_ON_".into(),
504*bb4ee6a4SAndroid Build Coastguard Worker                     0,
505*bb4ee6a4SAndroid Build Coastguard Worker                     true,
506*bb4ee6a4SAndroid Build Coastguard Worker                     vec![
507*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::Store::new(&aml::Name::new_field_name("PFPM"), &aml::ONE),
508*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::Store::new(&aml::Name::new_field_name("_STA"), &aml::ONE),
509*bb4ee6a4SAndroid Build Coastguard Worker                     ],
510*bb4ee6a4SAndroid Build Coastguard Worker                 ),
511*bb4ee6a4SAndroid Build Coastguard Worker                 &aml::Method::new(
512*bb4ee6a4SAndroid Build Coastguard Worker                     "_OFF".into(),
513*bb4ee6a4SAndroid Build Coastguard Worker                     0,
514*bb4ee6a4SAndroid Build Coastguard Worker                     true,
515*bb4ee6a4SAndroid Build Coastguard Worker                     vec![
516*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::Store::new(&aml::Name::new_field_name("_STA"), &aml::ZERO),
517*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::Store::new(&aml::Name::new_field_name("PFPM"), &aml::ZERO),
518*bb4ee6a4SAndroid Build Coastguard Worker                     ],
519*bb4ee6a4SAndroid Build Coastguard Worker                 ),
520*bb4ee6a4SAndroid Build Coastguard Worker             ],
521*bb4ee6a4SAndroid Build Coastguard Worker         )
522*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(aml);
523*bb4ee6a4SAndroid Build Coastguard Worker         aml::Name::new(
524*bb4ee6a4SAndroid Build Coastguard Worker             "_PR0".into(),
525*bb4ee6a4SAndroid Build Coastguard Worker             &aml::Package::new(vec![&aml::Name::new_field_name("PRIC")]),
526*bb4ee6a4SAndroid Build Coastguard Worker         )
527*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(aml);
528*bb4ee6a4SAndroid Build Coastguard Worker         aml::Name::new(
529*bb4ee6a4SAndroid Build Coastguard Worker             "_PR3".into(),
530*bb4ee6a4SAndroid Build Coastguard Worker             &aml::Package::new(vec![&aml::Name::new_field_name("PRIC")]),
531*bb4ee6a4SAndroid Build Coastguard Worker         )
532*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(aml);
533*bb4ee6a4SAndroid Build Coastguard Worker     }
534*bb4ee6a4SAndroid Build Coastguard Worker }
535*bb4ee6a4SAndroid Build Coastguard Worker 
536*bb4ee6a4SAndroid Build Coastguard Worker pub struct GpeScope {}
537*bb4ee6a4SAndroid Build Coastguard Worker 
538*bb4ee6a4SAndroid Build Coastguard Worker impl GpeScope {
cast_to_aml_bytes(&self, aml: &mut Vec<u8>, gpe_nr: u32, notification_path: &str)539*bb4ee6a4SAndroid Build Coastguard Worker     pub fn cast_to_aml_bytes(&self, aml: &mut Vec<u8>, gpe_nr: u32, notification_path: &str) {
540*bb4ee6a4SAndroid Build Coastguard Worker         aml::Scope::new(
541*bb4ee6a4SAndroid Build Coastguard Worker             "_GPE".into(),
542*bb4ee6a4SAndroid Build Coastguard Worker             vec![&aml::Method::new(
543*bb4ee6a4SAndroid Build Coastguard Worker                 format!("_E{:02X}", gpe_nr).as_str().into(),
544*bb4ee6a4SAndroid Build Coastguard Worker                 0,
545*bb4ee6a4SAndroid Build Coastguard Worker                 false,
546*bb4ee6a4SAndroid Build Coastguard Worker                 vec![
547*bb4ee6a4SAndroid Build Coastguard Worker                     &aml::Store::new(
548*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::Local(0),
549*bb4ee6a4SAndroid Build Coastguard Worker                         &aml::Path::new(format!("{}.NOTY", notification_path).as_str()),
550*bb4ee6a4SAndroid Build Coastguard Worker                     ),
551*bb4ee6a4SAndroid Build Coastguard Worker                     &aml::Notify::new(&aml::Path::new(notification_path), &aml::Local(0)),
552*bb4ee6a4SAndroid Build Coastguard Worker                 ],
553*bb4ee6a4SAndroid Build Coastguard Worker             )],
554*bb4ee6a4SAndroid Build Coastguard Worker         )
555*bb4ee6a4SAndroid Build Coastguard Worker         .to_aml_bytes(aml);
556*bb4ee6a4SAndroid Build Coastguard Worker     }
557*bb4ee6a4SAndroid Build Coastguard Worker }
558