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