Forráskód Böngészése

Use PCI CRS from QEMU ASL & clean up

Michael Melanson 4 éve
szülő
commit
0d3947980d
3 módosított fájl, 2046 hozzáadás és 50 törlés
  1. 3 1
      .gitignore
  2. 144 49
      aml/src/resource.rs
  3. 1899 0
      tests/pc-bios_acpi-dsdt.asl

+ 3 - 1
.gitignore

@@ -1,4 +1,6 @@
 /target
 **/*.rs.bk
 Cargo.lock
-*.aml
+tests/*.aml
+tests/*.lst
+tests/*.txt

+ 144 - 49
aml/src/resource.rs

@@ -1,3 +1,5 @@
+use core::mem;
+
 use crate::{value::AmlValue, AmlError};
 use alloc::vec::Vec;
 use bit_field::BitField;
@@ -81,7 +83,7 @@ fn resource_descriptor_inner(bytes: &[u8]) -> Result<(Option<Resource>, &[u8]),
         * bytes contain the actual data items.
         */
         let descriptor_type = bytes[0].get_bits(0..7);
-        let length = LittleEndian::read_u16(&bytes[1..=2]) as usize;
+        let length = LittleEndian::read_u16(&bytes[1..=2]) as usize + 2;
 
         let descriptor = match descriptor_type {
             0x01 => unimplemented!("24-bit Memory Range Descriptor"),
@@ -89,11 +91,11 @@ fn resource_descriptor_inner(bytes: &[u8]) -> Result<(Option<Resource>, &[u8]),
             0x03 => unimplemented!("0x03 Reserved"),
             0x04 => unimplemented!("Vendor-defined Descriptor"),
             0x05 => unimplemented!("32-bit Memory Range Descriptor"),
-            0x06 => fixed_memory_descriptor(&bytes[0..=length]),
-            0x07 => address_space_descriptor::<u32>(&bytes[0..=length]),
-            0x08 => address_space_descriptor::<u16>(&bytes[0..=length]),
-            0x09 => extended_interrupt_descriptor(&bytes[0..=length]),
-            0x0a => address_space_descriptor::<u64>(&bytes[0..=length]),
+            0x06 => fixed_memory_descriptor(&bytes[0..length+2]),
+            0x07 => address_space_descriptor::<u32>(&bytes[0..length+2]),
+            0x08 => address_space_descriptor::<u16>(&bytes[0..length+2]),
+            0x09 => extended_interrupt_descriptor(&bytes[0..length+2]),
+            0x0a => address_space_descriptor::<u64>(&bytes[0..length+2]),
             0x0b => unimplemented!("Extended Address Space Descriptor"),
             0x0c => unimplemented!("GPIO Connection Descriptor"),
             0x0d => unimplemented!("Pin Function Descriptor"),
@@ -107,7 +109,7 @@ fn resource_descriptor_inner(bytes: &[u8]) -> Result<(Option<Resource>, &[u8]),
             0x80..=0xff => unreachable!(),
         }?;
         
-        Ok((Some(descriptor), &bytes[length+3..]))
+        Ok((Some(descriptor), &bytes[length+1..]))
     } else {
         /*
         * We're parsing a small descriptor. Byte 0 has the format:
@@ -187,6 +189,8 @@ pub struct AddressSpaceDescriptor {
 
     granularity: u64,
     address_range: (u64, u64),
+    translation_offset: u64,
+    length: u64
 }
 
 #[derive(Debug, PartialEq)]
@@ -246,7 +250,9 @@ fn fixed_memory_descriptor(bytes: &[u8]) -> Result<Resource, AmlError> {
 }
 
 fn address_space_descriptor<T>(bytes: &[u8]) -> Result<Resource, AmlError> {
-    if bytes.len() < 14 {
+    let size = mem::size_of::<T>();
+
+    if bytes.len() < 6 + size*5 {
         return Err(AmlError::ResourceDescriptorTooShort);
     }
 
@@ -267,15 +273,13 @@ fn address_space_descriptor<T>(bytes: &[u8]) -> Result<Resource, AmlError> {
         AddressSpaceDecodeType::Additive
     };
 
-    let size = core::mem::size_of::<T>();
-    let location = 6;
-
-    let granularity = LittleEndian::read_uint(&bytes[location..], size);
-    let location = location + size;
+    const START: usize = 6;
 
-    let address_range_min = LittleEndian::read_uint(&bytes[location..], size);
-    let address_range_max = LittleEndian::read_uint(&bytes[location+size..], size);
-    let address_range = (address_range_min, address_range_max);
+    let granularity        = LittleEndian::read_uint(&bytes[START+(0*size)..], size);
+    let address_range_min  = LittleEndian::read_uint(&bytes[START+(1*size)..], size);
+    let address_range_max  = LittleEndian::read_uint(&bytes[START+(2*size)..], size);
+    let translation_offset = LittleEndian::read_uint(&bytes[START+(3*size)..], size);
+    let length             = LittleEndian::read_uint(&bytes[START+(4*size)..], size);
 
     Ok(Resource::WordAddressSpace(AddressSpaceDescriptor {
         resource_type,
@@ -283,7 +287,9 @@ fn address_space_descriptor<T>(bytes: &[u8]) -> Result<Resource, AmlError> {
         is_minimum_address_fixed,
         decode_type,
         granularity,
-        address_range
+        address_range: (address_range_min, address_range_max),
+        translation_offset,
+        length
     }))
 }
 
@@ -480,34 +486,36 @@ fn extended_interrupt_descriptor(bytes: &[u8]) -> Result<Resource, AmlError> {
 #[test]
 fn test_parses_keyboard_crs() {
     let bytes: Vec<u8> = [
-    // Generated from `iasl -l pc-bios_acpi-dsdt.asl`
-    //
-    //         315:                   IO (Decode16,
-    //         316:                       0x0060,             // Range Minimum
-    //         317:                       0x0060,             // Range Maximum
-    //         318:                       0x01,               // Alignment
-    //         319:                       0x01,               // Length
-    //         320:                       )
-       
-    //    0000040A:  47 01 60 00 60 00 01 01     "G.`.`..."
+        // Generated from `iasl -l pc-bios_acpi-dsdt.asl`
+        //
+        //         315:                   IO (Decode16,
+        //         316:                       0x0060,             // Range Minimum
+        //         317:                       0x0060,             // Range Maximum
+        //         318:                       0x01,               // Alignment
+        //         319:                       0x01,               // Length
+        //         320:                       )
+        
+        //    0000040A:  47 01 60 00 60 00 01 01     "G.`.`..."
         0x47, 0x01, 0x60, 0x00, 0x60, 0x00, 0x01, 0x01,
 
-    //     321:                   IO (Decode16,
-    //         322:                       0x0064,             // Range Minimum
-    //         323:                       0x0064,             // Range Maximum
-    //         324:                       0x01,               // Alignment
-    //         325:                       0x01,               // Length
-    //         326:                       )
-       
-    //    00000412:  47 01 64 00 64 00 01 01     "G.d.d..."
+        //         321:                   IO (Decode16,
+        //         322:                       0x0064,             // Range Minimum
+        //         323:                       0x0064,             // Range Maximum
+        //         324:                       0x01,               // Alignment
+        //         325:                       0x01,               // Length
+        //         326:                       )
+        
+        //    00000412:  47 01 64 00 64 00 01 01     "G.d.d..."
         0x47, 0x01, 0x64, 0x00, 0x64, 0x00, 0x01, 0x01,
 
-    //         327:                   IRQNoFlags ()
-    //         328:                       {1}
-    
-    //    0000041A:  22 02 00 ...............    "".."
-    //    0000041D:  79 00 ..................    "y."
-        0x22, 0x02, 0x00, 0x79, 0x00,
+        //         327:                   IRQNoFlags ()
+        //         328:                       {1}
+        
+        //    0000041A:  22 02 00 ...............    "".."
+        0x22, 0x02, 0x00, 
+        
+        //    0000041D:  79 00 ..................    "y."
+        0x79, 0x00,
     ].to_vec();
 
     let size: u64 = bytes.len() as u64;
@@ -525,20 +533,107 @@ fn test_parses_keyboard_crs() {
 #[test]
 fn test_pci_crs() {
     let bytes: Vec<u8> = [
-        136, 13, 0, 2, 12, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 1, 71, 1, 248, 12, 248, 12, 1, 8, 136, 13, 0, 1, 12, 3, 0, 0, 0, 0, 247, 12, 0, 0, 248, 12, 136, 13, 0, 1, 12, 3, 0, 0, 0, 13, 255, 255, 0, 0, 0, 243, 135, 23, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0, 10, 0, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 2, 0, 135, 23, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 0, 8, 255, 255, 191, 254, 0, 0, 0, 0, 0, 0, 192, 246, 138, 43, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 255, 255, 255, 127, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 121, 0].to_vec();
+        // Generated from `iasl -l pc-bios_acpi-dsdt.asl`
+        //
+        //      98:               WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
+        //      99:                   0x0000,             // Granularity
+        //     100:                   0x0000,             // Range Minimum
+        //     101:                   0x00FF,             // Range Maximum
+        //     102:                   0x0000,             // Translation Offset
+        //     103:                   0x0100,             // Length
+        //     104:                   ,, )
+        
+        // 000000F3:  88 0D 00 02 0C 00 00 00     "........"
+        // 000000FB:  00 00 FF 00 00 00 00 01     "........"
+        0x88, 0x0D, 0x00, 0x02, 0x0C, 0x00, 0x00, 0x00,
+        0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01,
+
+        //     105:               IO (Decode16,
+        //     106:                   0x0CF8,             // Range Minimum
+        //     107:                   0x0CF8,             // Range Maximum
+        //     108:                   0x01,               // Alignment
+        //     109:                   0x08,               // Length
+        //     110:                   )
+        
+        // 00000103:  47 01 F8 0C F8 0C 01 08     "G......."
+        0x47, 0x01, 0xF8, 0x0C, 0xF8, 0x0C, 0x01, 0x08,
+
+        //     111:               WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
+        //     112:                   0x0000,             // Granularity
+        //     113:                   0x0000,             // Range Minimum
+        //     114:                   0x0CF7,             // Range Maximum
+        //     115:                   0x0000,             // Translation Offset
+        //     116:                   0x0CF8,             // Length
+        //     117:                   ,, , TypeStatic, DenseTranslation)
+        
+        // 0000010B:  88 0D 00 01 0C 03 00 00     "........"
+        // 00000113:  00 00 F7 0C 00 00 F8 0C     "........"
+        0x88, 0x0D, 0x00, 0x01, 0x0C, 0x03, 0x00, 0x00,
+        0x00, 0x00, 0xF7, 0x0C, 0x00, 0x00, 0xF8, 0x0C,
+
+        //     118:               WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
+        //     119:                   0x0000,             // Granularity
+        //     120:                   0x0D00,             // Range Minimum
+        //     121:                   0xFFFF,             // Range Maximum
+        //     122:                   0x0000,             // Translation Offset
+        //     123:                   0xF300,             // Length
+        //     124:                   ,, , TypeStatic, DenseTranslation)
+        
+        // 0000011B:  88 0D 00 01 0C 03 00 00     "........"
+        // 00000123:  00 0D FF FF 00 00 00 F3     "........"
+        0x88, 0x0D, 0x00, 0x01, 0x0C, 0x03, 0x00, 0x00,
+        0x00, 0x0D, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xF3,
+
+        //     125:               DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
+        //     126:                   0x00000000,         // Granularity
+        //     127:                   0x000A0000,         // Range Minimum
+        //     128:                   0x000BFFFF,         // Range Maximum
+        //     129:                   0x00000000,         // Translation Offset
+        //     130:                   0x00020000,         // Length
+        //     131:                   ,, , AddressRangeMemory, TypeStatic)
+        
+        // 0000012B:  87 17 00 00 0C 03 00 00     "........"
+        // 00000133:  00 00 00 00 0A 00 FF FF     "........"
+        // 0000013B:  0B 00 00 00 00 00 00 00     "........"
+        // 00000143:  02 00 ..................    ".."
+        0x87, 0x17, 0x00, 0x00, 0x0C, 0x03, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xFF, 0xFF,
+        0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0x02, 0x00,
+
+        //     132:               DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
+        //     133:                   0x00000000,         // Granularity
+        //     134:                   0xE0000000,         // Range Minimum
+        //     135:                   0xFEBFFFFF,         // Range Maximum
+        //     136:                   0x00000000,         // Translation Offset
+        //     137:                   0x1EC00000,         // Length
+        //     138:                   ,, _Y00, AddressRangeMemory, TypeStatic)
+        
+        // 00000145:  87 17 00 00 0C 01 00 00     "........"
+        // 0000014D:  00 00 00 00 00 E0 FF FF     "........"
+        // 00000155:  BF FE 00 00 00 00 00 00     "........"
+        // 0000015D:  C0 1E ..................    ".."
+        0x87, 0x17, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF,
+        0xBF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        0xC0, 0x1E,
+
+        // 0000015F:  79 00 ..................    "y."
+        0x79, 0x00,
+    ].to_vec();
+
     let size: u64 = bytes.len() as u64;
     let value: AmlValue = AmlValue::Buffer { bytes, size };
 
     let resources = resource_descriptor_list(&value).unwrap();
 
     assert_eq!(resources, Vec::from([
-        Resource::WordAddressSpace(AddressSpaceDescriptor { resource_type: AddressSpaceResourceType::BusNumberRange, is_maximum_address_fixed: true, is_minimum_address_fixed: true, decode_type: AddressSpaceDecodeType::Additive, granularity: 0, address_range: (0, 255) }), 
-        Resource::IOPort(IOPortDescriptor { decodes_full_address: true, memory_range: (3320, 3320), base_alignment: 1, range_length: 8 }), 
-        Resource::WordAddressSpace(AddressSpaceDescriptor { resource_type: AddressSpaceResourceType::IORange, is_maximum_address_fixed: true, is_minimum_address_fixed: true, decode_type: AddressSpaceDecodeType::Additive, granularity: 0, address_range: (0, 3319) }), 
-        Resource::WordAddressSpace(AddressSpaceDescriptor { resource_type: AddressSpaceResourceType::IORange, is_maximum_address_fixed: true, is_minimum_address_fixed: true, decode_type: AddressSpaceDecodeType::Additive, granularity: 0, address_range: (3328, 65535) }), 
-        Resource::WordAddressSpace(AddressSpaceDescriptor { resource_type: AddressSpaceResourceType::MemoryRange, is_maximum_address_fixed: true, is_minimum_address_fixed: true, decode_type: AddressSpaceDecodeType::Additive, granularity: 0, address_range: (655360, 786431) }), 
-        Resource::WordAddressSpace(AddressSpaceDescriptor { resource_type: AddressSpaceResourceType::MemoryRange, is_maximum_address_fixed: true, is_minimum_address_fixed: true, decode_type: AddressSpaceDecodeType::Additive, granularity: 0, address_range: (134217728, 4273995775) }), 
-        Resource::WordAddressSpace(AddressSpaceDescriptor { resource_type: AddressSpaceResourceType::MemoryRange, is_maximum_address_fixed: true, is_minimum_address_fixed: true, decode_type: AddressSpaceDecodeType::Additive, granularity: 0, address_range: (4294967296, 6442450943) })
+        Resource::WordAddressSpace(AddressSpaceDescriptor { resource_type: AddressSpaceResourceType::BusNumberRange, is_maximum_address_fixed: true, is_minimum_address_fixed: true, decode_type: AddressSpaceDecodeType::Additive, granularity: 0, address_range: (0x00, 0xFF), translation_offset: 0, length: 0x100 }), 
+        Resource::IOPort(IOPortDescriptor { decodes_full_address: true, memory_range: (0xCF8, 0xCF8), base_alignment: 1, range_length: 8 }), 
+        Resource::WordAddressSpace(AddressSpaceDescriptor { resource_type: AddressSpaceResourceType::IORange, is_maximum_address_fixed: true, is_minimum_address_fixed: true, decode_type: AddressSpaceDecodeType::Additive, granularity: 0, address_range: (0x0000, 0x0CF7), translation_offset: 0, length: 0xCF8 }), 
+        Resource::WordAddressSpace(AddressSpaceDescriptor { resource_type: AddressSpaceResourceType::IORange, is_maximum_address_fixed: true, is_minimum_address_fixed: true, decode_type: AddressSpaceDecodeType::Additive, granularity: 0, address_range: (0x0D00, 0xFFFF), translation_offset: 0, length: 0xF300 }), 
+        Resource::WordAddressSpace(AddressSpaceDescriptor { resource_type: AddressSpaceResourceType::MemoryRange, is_maximum_address_fixed: true, is_minimum_address_fixed: true, decode_type: AddressSpaceDecodeType::Additive, granularity: 0, address_range: (0xA0000, 0xBFFFF), translation_offset: 0, length: 0x20000 }), 
+        Resource::WordAddressSpace(AddressSpaceDescriptor { resource_type: AddressSpaceResourceType::MemoryRange, is_maximum_address_fixed: true, is_minimum_address_fixed: true, decode_type: AddressSpaceDecodeType::Additive, granularity: 0, address_range: (0xE0000000, 0xFEBFFFFF), translation_offset: 0, length: 0x1EC00000 }), 
     ]));
 }
 

+ 1899 - 0
tests/pc-bios_acpi-dsdt.asl

@@ -0,0 +1,1899 @@
+/*
+ * Intel ACPI Component Architecture
+ * AML/ASL+ Disassembler version 20180427 (64-bit version)(RM)
+ * Copyright (c) 2000 - 2018 Intel Corporation
+ * 
+ * Disassembling to symbolic ASL+ operators
+ *
+ * Disassembly of pc-bios_acpi-dsdt.aml, Wed Sep 23 20:26:45 2020
+ *
+ * Original Table Header:
+ *     Signature        "DSDT"
+ *     Length           0x00001137 (4407)
+ *     Revision         0x01 **** 32-bit table (V1), no 64-bit math support
+ *     Checksum         0xF0
+ *     OEM ID           "BXPC"
+ *     OEM Table ID     "BXDSDT"
+ *     OEM Revision     0x00000001 (1)
+ *     Compiler ID      "INTL"
+ *     Compiler Version 0x20120913 (538052883)
+ */
+ DefinitionBlock ("", "DSDT", 1, "BXPC", "BXDSDT", 0x00000001)
+ {
+     /*
+      * iASL Warning: There were 2 external control methods found during
+      * disassembly, but only 0 were resolved (2 unresolved). Additional
+      * ACPI tables may be required to properly disassemble the code. This
+      * resulting disassembler output file may not compile because the
+      * disassembler did not know how many arguments to assign to the
+      * unresolved methods. Note: SSDTs can be dynamically loaded at
+      * runtime and may or may not be available via the host OS.
+      *
+      * To specify the tables needed to resolve external control method
+      * references, the -e option can be used to specify the filenames.
+      * Example iASL invocations:
+      *     iasl -e ssdt1.aml ssdt2.aml ssdt3.aml -d dsdt.aml
+      *     iasl -e dsdt.aml ssdt2.aml -d ssdt1.aml
+      *     iasl -e ssdt*.aml -d dsdt.aml
+      *
+      * In addition, the -fe option can be used to specify a file containing
+      * control method external declarations with the associated method
+      * argument counts. Each line of the file must be of the form:
+      *     External (<method pathname>, MethodObj, <argument count>)
+      * Invocation:
+      *     iasl -fe refs.txt -d dsdt.aml
+      *
+      * The following methods were unresolved and many not compile properly
+      * because the disassembler had to guess at the number of arguments
+      * required for each:
+      */
+     External (CPON, UnknownObj)    // Warning: Unknown object
+     External (NTFY, MethodObj)    // Warning: Unknown method, guessing 2 arguments
+     External (P0E_, IntObj)    // Warning: Unknown object
+     External (P0S_, IntObj)    // Warning: Unknown object
+     External (P1E_, IntObj)    // Warning: Unknown object
+     External (P1L_, IntObj)    // Warning: Unknown object
+     External (P1S_, IntObj)    // Warning: Unknown object
+     External (P1V_, UnknownObj)    // Warning: Unknown object
+     External (PCNT, MethodObj)    // Warning: Unknown method, guessing 2 arguments
+ 
+     Scope (\)
+     {
+         OperationRegion (DBG, SystemIO, 0x0402, One)
+         Field (DBG, ByteAcc, NoLock, Preserve)
+         {
+             DBGB,   8
+         }
+ 
+         Method (DBUG, 1, NotSerialized)
+         {
+             ToHexString (Arg0, Local0)
+             ToBuffer (Local0, Local0)
+             Local1 = (SizeOf (Local0) - One)
+             Local2 = Zero
+             While ((Local2 < Local1))
+             {
+                 DBGB = DerefOf (Local0 [Local2])
+                 Local2++
+             }
+ 
+             DBGB = 0x0A
+         }
+     }
+ 
+     Scope (_SB)
+     {
+         Device (PCI0)
+         {
+             Name (_HID, EisaId ("PNP0A03"))  // _HID: Hardware ID
+             Name (_ADR, Zero)  // _ADR: Address
+             Name (_UID, One)  // _UID: Unique ID
+         }
+     }
+ 
+     Scope (_SB.PCI0)
+     {
+         Name (CRES, ResourceTemplate ()
+         {
+             WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
+                 0x0000,             // Granularity
+                 0x0000,             // Range Minimum
+                 0x00FF,             // Range Maximum
+                 0x0000,             // Translation Offset
+                 0x0100,             // Length
+                 ,, )
+             IO (Decode16,
+                 0x0CF8,             // Range Minimum
+                 0x0CF8,             // Range Maximum
+                 0x01,               // Alignment
+                 0x08,               // Length
+                 )
+             WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
+                 0x0000,             // Granularity
+                 0x0000,             // Range Minimum
+                 0x0CF7,             // Range Maximum
+                 0x0000,             // Translation Offset
+                 0x0CF8,             // Length
+                 ,, , TypeStatic, DenseTranslation)
+             WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
+                 0x0000,             // Granularity
+                 0x0D00,             // Range Minimum
+                 0xFFFF,             // Range Maximum
+                 0x0000,             // Translation Offset
+                 0xF300,             // Length
+                 ,, , TypeStatic, DenseTranslation)
+             DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
+                 0x00000000,         // Granularity
+                 0x000A0000,         // Range Minimum
+                 0x000BFFFF,         // Range Maximum
+                 0x00000000,         // Translation Offset
+                 0x00020000,         // Length
+                 ,, , AddressRangeMemory, TypeStatic)
+             DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
+                 0x00000000,         // Granularity
+                 0xE0000000,         // Range Minimum
+                 0xFEBFFFFF,         // Range Maximum
+                 0x00000000,         // Translation Offset
+                 0x1EC00000,         // Length
+                 ,, _Y00, AddressRangeMemory, TypeStatic)
+         })
+         Name (CR64, ResourceTemplate ()
+         {
+             QWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
+                 0x0000000000000000, // Granularity
+                 0x0000008000000000, // Range Minimum
+                 0x000000FFFFFFFFFF, // Range Maximum
+                 0x0000000000000000, // Translation Offset
+                 0x0000008000000000, // Length
+                 ,, _Y01, AddressRangeMemory, TypeStatic)
+         })
+         Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
+         {
+             CreateDWordField (CRES, \_SB.PCI0._Y00._MIN, PS32)  // _MIN: Minimum Base Address
+             CreateDWordField (CRES, \_SB.PCI0._Y00._MAX, PE32)  // _MAX: Maximum Base Address
+             CreateDWordField (CRES, \_SB.PCI0._Y00._LEN, PL32)  // _LEN: Length
+             PS32 = P0S
+             PE32 = P0E
+             PL32 = ((P0E - P0S) + One)
+             If ((P1V == Zero))
+             {
+                 Return (CRES)
+             }
+ 
+             CreateQWordField (CR64, \_SB.PCI0._Y01._MIN, PS64)  // _MIN: Minimum Base Address
+             CreateQWordField (CR64, \_SB.PCI0._Y01._MAX, PE64)  // _MAX: Maximum Base Address
+             CreateQWordField (CR64, \_SB.PCI0._Y01._LEN, PL64)  // _LEN: Length
+             PS64 = P1S
+             PE64 = P1E
+             PL64 = P1L
+             ConcatenateResTemplate (CRES, CR64, Local0)
+             Return (Local0)
+         }
+     }
+ 
+     Scope (_SB)
+     {
+         Device (HPET)
+         {
+             Name (_HID, EisaId ("PNP0103"))  // _HID: Hardware ID
+             Name (_UID, Zero)  // _UID: Unique ID
+             OperationRegion (HPTM, SystemMemory, 0xFED00000, 0x0400)
+             Field (HPTM, DWordAcc, Lock, Preserve)
+             {
+                 VEND,   32, 
+                 PRD,    32
+             }
+ 
+             Method (_STA, 0, NotSerialized)  // _STA: Status
+             {
+                 Local0 = VEND
+                 Local1 = PRD
+                 Local0 >>= 0x10
+                 If (((Local0 == Zero) || (Local0 == 0xFFFF)))
+                 {
+                     Return (Zero)
+                 }
+ 
+                 If (((Local1 == Zero) || (Local1 > 0x05F5E100)))
+                 {
+                     Return (Zero)
+                 }
+ 
+                 Return (0x0F)
+             }
+ 
+             Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
+             {
+                 Memory32Fixed (ReadOnly,
+                     0xFED00000,         // Address Base
+                     0x00000400,         // Address Length
+                     )
+             })
+         }
+     }
+ 
+     Scope (_SB.PCI0)
+     {
+         Device (VGA)
+         {
+             Name (_ADR, 0x00020000)  // _ADR: Address
+             OperationRegion (PCIC, PCI_Config, Zero, 0x04)
+             Field (PCIC, DWordAcc, NoLock, Preserve)
+             {
+                 VEND,   32
+             }
+ 
+             Method (_S1D, 0, NotSerialized)  // _S1D: S1 Device State
+             {
+                 Return (Zero)
+             }
+ 
+             Method (_S2D, 0, NotSerialized)  // _S2D: S2 Device State
+             {
+                 Return (Zero)
+             }
+ 
+             Method (_S3D, 0, NotSerialized)  // _S3D: S3 Device State
+             {
+                 If ((VEND == 0x01001B36))
+                 {
+                     Return (0x03)
+                 }
+                 Else
+                 {
+                     Return (Zero)
+                 }
+             }
+         }
+     }
+ 
+     Scope (_SB.PCI0)
+     {
+         Device (PX13)
+         {
+             Name (_ADR, 0x00010003)  // _ADR: Address
+             OperationRegion (P13C, PCI_Config, Zero, 0xFF)
+         }
+     }
+ 
+     Scope (_SB.PCI0)
+     {
+         Device (ISA)
+         {
+             Name (_ADR, 0x00010000)  // _ADR: Address
+             OperationRegion (P40C, PCI_Config, 0x60, 0x04)
+             Field (^PX13.P13C, AnyAcc, NoLock, Preserve)
+             {
+                 Offset (0x5F), 
+                     ,   7, 
+                 LPEN,   1, 
+                 Offset (0x67), 
+                     ,   3, 
+                 CAEN,   1, 
+                     ,   3, 
+                 CBEN,   1
+             }
+ 
+             Name (FDEN, One)
+         }
+     }
+ 
+     Scope (_SB.PCI0.ISA)
+     {
+         Device (RTC)
+         {
+             Name (_HID, EisaId ("PNP0B00"))  // _HID: Hardware ID
+             Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
+             {
+                 IO (Decode16,
+                     0x0070,             // Range Minimum
+                     0x0070,             // Range Maximum
+                     0x10,               // Alignment
+                     0x02,               // Length
+                     )
+                 IRQNoFlags ()
+                     {8}
+                 IO (Decode16,
+                     0x0072,             // Range Minimum
+                     0x0072,             // Range Maximum
+                     0x02,               // Alignment
+                     0x06,               // Length
+                     )
+             })
+         }
+ 
+         Device (KBD)
+         {
+             Name (_HID, EisaId ("PNP0303"))  // _HID: Hardware ID
+             Method (_STA, 0, NotSerialized)  // _STA: Status
+             {
+                 Return (0x0F)
+             }
+ 
+             Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
+             {
+                 IO (Decode16,
+                     0x0060,             // Range Minimum
+                     0x0060,             // Range Maximum
+                     0x01,               // Alignment
+                     0x01,               // Length
+                     )
+                 IO (Decode16,
+                     0x0064,             // Range Minimum
+                     0x0064,             // Range Maximum
+                     0x01,               // Alignment
+                     0x01,               // Length
+                     )
+                 IRQNoFlags ()
+                     {1}
+             })
+         }
+ 
+         Device (MOU)
+         {
+             Name (_HID, EisaId ("PNP0F13"))  // _HID: Hardware ID
+             Method (_STA, 0, NotSerialized)  // _STA: Status
+             {
+                 Return (0x0F)
+             }
+ 
+             Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
+             {
+                 IRQNoFlags ()
+                     {12}
+             })
+         }
+ 
+         Device (FDC0)
+         {
+             Name (_HID, EisaId ("PNP0700"))  // _HID: Hardware ID
+             Method (_STA, 0, NotSerialized)  // _STA: Status
+             {
+                 Local0 = FDEN
+                 If ((Local0 == Zero))
+                 {
+                     Return (Zero)
+                 }
+                 Else
+                 {
+                     Return (0x0F)
+                 }
+             }
+ 
+             Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
+             {
+                 IO (Decode16,
+                     0x03F2,             // Range Minimum
+                     0x03F2,             // Range Maximum
+                     0x00,               // Alignment
+                     0x04,               // Length
+                     )
+                 IO (Decode16,
+                     0x03F7,             // Range Minimum
+                     0x03F7,             // Range Maximum
+                     0x00,               // Alignment
+                     0x01,               // Length
+                     )
+                 IRQNoFlags ()
+                     {6}
+                 DMA (Compatibility, NotBusMaster, Transfer8, )
+                     {2}
+             })
+         }
+ 
+         Device (LPT)
+         {
+             Name (_HID, EisaId ("PNP0400"))  // _HID: Hardware ID
+             Method (_STA, 0, NotSerialized)  // _STA: Status
+             {
+                 Local0 = LPEN
+                 If ((Local0 == Zero))
+                 {
+                     Return (Zero)
+                 }
+                 Else
+                 {
+                     Return (0x0F)
+                 }
+             }
+ 
+             Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
+             {
+                 IO (Decode16,
+                     0x0378,             // Range Minimum
+                     0x0378,             // Range Maximum
+                     0x08,               // Alignment
+                     0x08,               // Length
+                     )
+                 IRQNoFlags ()
+                     {7}
+             })
+         }
+ 
+         Device (COM1)
+         {
+             Name (_HID, EisaId ("PNP0501"))  // _HID: Hardware ID
+             Name (_UID, One)  // _UID: Unique ID
+             Method (_STA, 0, NotSerialized)  // _STA: Status
+             {
+                 Local0 = CAEN
+                 If ((Local0 == Zero))
+                 {
+                     Return (Zero)
+                 }
+                 Else
+                 {
+                     Return (0x0F)
+                 }
+             }
+ 
+             Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
+             {
+                 IO (Decode16,
+                     0x03F8,             // Range Minimum
+                     0x03F8,             // Range Maximum
+                     0x00,               // Alignment
+                     0x08,               // Length
+                     )
+                 IRQNoFlags ()
+                     {4}
+             })
+         }
+ 
+         Device (COM2)
+         {
+             Name (_HID, EisaId ("PNP0501"))  // _HID: Hardware ID
+             Name (_UID, 0x02)  // _UID: Unique ID
+             Method (_STA, 0, NotSerialized)  // _STA: Status
+             {
+                 Local0 = CBEN
+                 If ((Local0 == Zero))
+                 {
+                     Return (Zero)
+                 }
+                 Else
+                 {
+                     Return (0x0F)
+                 }
+             }
+ 
+             Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
+             {
+                 IO (Decode16,
+                     0x02F8,             // Range Minimum
+                     0x02F8,             // Range Maximum
+                     0x00,               // Alignment
+                     0x08,               // Length
+                     )
+                 IRQNoFlags ()
+                     {3}
+             })
+         }
+     }
+ 
+     Scope (_SB.PCI0)
+     {
+         OperationRegion (PCST, SystemIO, 0xAE00, 0x08)
+         Field (PCST, DWordAcc, NoLock, WriteAsZeros)
+         {
+             PCIU,   32, 
+             PCID,   32
+         }
+ 
+         OperationRegion (SEJ, SystemIO, 0xAE08, 0x04)
+         Field (SEJ, DWordAcc, NoLock, WriteAsZeros)
+         {
+             B0EJ,   32
+         }
+ 
+         Method (PCEJ, 1, NotSerialized)
+         {
+             B0EJ = (One << Arg0)
+             Return (Zero)
+         }
+ 
+         Method (PCNF, 0, NotSerialized)
+         {
+             Local0 = Zero
+             While ((Local0 < 0x1F))
+             {
+                 Local0++
+                 If ((PCIU & (One << Local0)))
+                 {
+                     PCNT (Local0, One)
+                 }
+ 
+                 If ((PCID & (One << Local0)))
+                 {
+                     PCNT (Local0, 0x03)
+                 }
+             }
+         }
+     }
+ 
+     Scope (_SB)
+     {
+         Scope (PCI0)
+         {
+             Name (_PRT, Package (0x80)  // _PRT: PCI Routing Table
+             {
+                 Package (0x04)
+                 {
+                     0xFFFF, 
+                     Zero, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0xFFFF, 
+                     One, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0xFFFF, 
+                     0x02, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0xFFFF, 
+                     0x03, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0001FFFF, 
+                     Zero, 
+                     LNKS, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0001FFFF, 
+                     One, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0001FFFF, 
+                     0x02, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0001FFFF, 
+                     0x03, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0002FFFF, 
+                     Zero, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0002FFFF, 
+                     One, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0002FFFF, 
+                     0x02, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0002FFFF, 
+                     0x03, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0003FFFF, 
+                     Zero, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0003FFFF, 
+                     One, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0003FFFF, 
+                     0x02, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0003FFFF, 
+                     0x03, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0004FFFF, 
+                     Zero, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0004FFFF, 
+                     One, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0004FFFF, 
+                     0x02, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0004FFFF, 
+                     0x03, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0005FFFF, 
+                     Zero, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0005FFFF, 
+                     One, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0005FFFF, 
+                     0x02, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0005FFFF, 
+                     0x03, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0006FFFF, 
+                     Zero, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0006FFFF, 
+                     One, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0006FFFF, 
+                     0x02, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0006FFFF, 
+                     0x03, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0007FFFF, 
+                     Zero, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0007FFFF, 
+                     One, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0007FFFF, 
+                     0x02, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0007FFFF, 
+                     0x03, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0008FFFF, 
+                     Zero, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0008FFFF, 
+                     One, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0008FFFF, 
+                     0x02, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0008FFFF, 
+                     0x03, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0009FFFF, 
+                     Zero, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0009FFFF, 
+                     One, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0009FFFF, 
+                     0x02, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0009FFFF, 
+                     0x03, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000AFFFF, 
+                     Zero, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000AFFFF, 
+                     One, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000AFFFF, 
+                     0x02, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000AFFFF, 
+                     0x03, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000BFFFF, 
+                     Zero, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000BFFFF, 
+                     One, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000BFFFF, 
+                     0x02, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000BFFFF, 
+                     0x03, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000CFFFF, 
+                     Zero, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000CFFFF, 
+                     One, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000CFFFF, 
+                     0x02, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000CFFFF, 
+                     0x03, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000DFFFF, 
+                     Zero, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000DFFFF, 
+                     One, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000DFFFF, 
+                     0x02, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000DFFFF, 
+                     0x03, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000EFFFF, 
+                     Zero, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000EFFFF, 
+                     One, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000EFFFF, 
+                     0x02, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000EFFFF, 
+                     0x03, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000FFFFF, 
+                     Zero, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000FFFFF, 
+                     One, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000FFFFF, 
+                     0x02, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x000FFFFF, 
+                     0x03, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0010FFFF, 
+                     Zero, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0010FFFF, 
+                     One, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0010FFFF, 
+                     0x02, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0010FFFF, 
+                     0x03, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0011FFFF, 
+                     Zero, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0011FFFF, 
+                     One, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0011FFFF, 
+                     0x02, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0011FFFF, 
+                     0x03, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0012FFFF, 
+                     Zero, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0012FFFF, 
+                     One, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0012FFFF, 
+                     0x02, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0012FFFF, 
+                     0x03, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0013FFFF, 
+                     Zero, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0013FFFF, 
+                     One, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0013FFFF, 
+                     0x02, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0013FFFF, 
+                     0x03, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0014FFFF, 
+                     Zero, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0014FFFF, 
+                     One, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0014FFFF, 
+                     0x02, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0014FFFF, 
+                     0x03, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0015FFFF, 
+                     Zero, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0015FFFF, 
+                     One, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0015FFFF, 
+                     0x02, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0015FFFF, 
+                     0x03, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0016FFFF, 
+                     Zero, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0016FFFF, 
+                     One, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0016FFFF, 
+                     0x02, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0016FFFF, 
+                     0x03, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0017FFFF, 
+                     Zero, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0017FFFF, 
+                     One, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0017FFFF, 
+                     0x02, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0017FFFF, 
+                     0x03, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0018FFFF, 
+                     Zero, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0018FFFF, 
+                     One, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0018FFFF, 
+                     0x02, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0018FFFF, 
+                     0x03, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0019FFFF, 
+                     Zero, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0019FFFF, 
+                     One, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0019FFFF, 
+                     0x02, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x0019FFFF, 
+                     0x03, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001AFFFF, 
+                     Zero, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001AFFFF, 
+                     One, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001AFFFF, 
+                     0x02, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001AFFFF, 
+                     0x03, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001BFFFF, 
+                     Zero, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001BFFFF, 
+                     One, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001BFFFF, 
+                     0x02, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001BFFFF, 
+                     0x03, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001CFFFF, 
+                     Zero, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001CFFFF, 
+                     One, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001CFFFF, 
+                     0x02, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001CFFFF, 
+                     0x03, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001DFFFF, 
+                     Zero, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001DFFFF, 
+                     One, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001DFFFF, 
+                     0x02, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001DFFFF, 
+                     0x03, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001EFFFF, 
+                     Zero, 
+                     LNKB, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001EFFFF, 
+                     One, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001EFFFF, 
+                     0x02, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001EFFFF, 
+                     0x03, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001FFFFF, 
+                     Zero, 
+                     LNKC, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001FFFFF, 
+                     One, 
+                     LNKD, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001FFFFF, 
+                     0x02, 
+                     LNKA, 
+                     Zero
+                 }, 
+ 
+                 Package (0x04)
+                 {
+                     0x001FFFFF, 
+                     0x03, 
+                     LNKB, 
+                     Zero
+                 }
+             })
+         }
+ 
+         Field (PCI0.ISA.P40C, ByteAcc, NoLock, Preserve)
+         {
+             PRQ0,   8, 
+             PRQ1,   8, 
+             PRQ2,   8, 
+             PRQ3,   8
+         }
+ 
+         Method (IQST, 1, NotSerialized)
+         {
+             If ((0x80 & Arg0))
+             {
+                 Return (0x09)
+             }
+ 
+             Return (0x0B)
+         }
+ 
+         Method (IQCR, 1, NotSerialized)
+         {
+             Name (PRR0, ResourceTemplate ()
+             {
+                 Interrupt (ResourceConsumer, Level, ActiveHigh, Shared, ,, _Y02)
+                 {
+                     0x00000000,
+                 }
+             })
+             CreateDWordField (PRR0, \_SB.IQCR._Y02._INT, PRRI)  // _INT: Interrupts
+             If ((Arg0 < 0x80))
+             {
+                 PRRI = Arg0
+             }
+ 
+             Return (PRR0)
+         }
+ 
+         Device (LNKA)
+         {
+             Name (_HID, EisaId ("PNP0C0F"))  // _HID: Hardware ID
+             Name (_UID, Zero)  // _UID: Unique ID
+             Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
+             {
+                 Interrupt (ResourceConsumer, Level, ActiveHigh, Shared, ,, )
+                 {
+                     0x00000005,
+                     0x0000000A,
+                     0x0000000B,
+                 }
+             })
+             Method (_STA, 0, NotSerialized)  // _STA: Status
+             {
+                 Return (IQST (PRQ0))
+             }
+ 
+             Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
+             {
+                 PRQ0 |= 0x80
+             }
+ 
+             Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
+             {
+                 Return (IQCR (PRQ0))
+             }
+ 
+             Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
+             {
+                 CreateDWordField (Arg0, 0x05, PRRI)
+                 PRQ0 = PRRI
+             }
+         }
+ 
+         Device (LNKB)
+         {
+             Name (_HID, EisaId ("PNP0C0F"))  // _HID: Hardware ID
+             Name (_UID, One)  // _UID: Unique ID
+             Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
+             {
+                 Interrupt (ResourceConsumer, Level, ActiveHigh, Shared, ,, )
+                 {
+                     0x00000005,
+                     0x0000000A,
+                     0x0000000B,
+                 }
+             })
+             Method (_STA, 0, NotSerialized)  // _STA: Status
+             {
+                 Return (IQST (PRQ1))
+             }
+ 
+             Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
+             {
+                 PRQ1 |= 0x80
+             }
+ 
+             Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
+             {
+                 Return (IQCR (PRQ1))
+             }
+ 
+             Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
+             {
+                 CreateDWordField (Arg0, 0x05, PRRI)
+                 PRQ1 = PRRI
+             }
+         }
+ 
+         Device (LNKC)
+         {
+             Name (_HID, EisaId ("PNP0C0F"))  // _HID: Hardware ID
+             Name (_UID, 0x02)  // _UID: Unique ID
+             Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
+             {
+                 Interrupt (ResourceConsumer, Level, ActiveHigh, Shared, ,, )
+                 {
+                     0x00000005,
+                     0x0000000A,
+                     0x0000000B,
+                 }
+             })
+             Method (_STA, 0, NotSerialized)  // _STA: Status
+             {
+                 Return (IQST (PRQ2))
+             }
+ 
+             Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
+             {
+                 PRQ2 |= 0x80
+             }
+ 
+             Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
+             {
+                 Return (IQCR (PRQ2))
+             }
+ 
+             Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
+             {
+                 CreateDWordField (Arg0, 0x05, PRRI)
+                 PRQ2 = PRRI
+             }
+         }
+ 
+         Device (LNKD)
+         {
+             Name (_HID, EisaId ("PNP0C0F"))  // _HID: Hardware ID
+             Name (_UID, 0x03)  // _UID: Unique ID
+             Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
+             {
+                 Interrupt (ResourceConsumer, Level, ActiveHigh, Shared, ,, )
+                 {
+                     0x00000005,
+                     0x0000000A,
+                     0x0000000B,
+                 }
+             })
+             Method (_STA, 0, NotSerialized)  // _STA: Status
+             {
+                 Return (IQST (PRQ3))
+             }
+ 
+             Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
+             {
+                 PRQ3 |= 0x80
+             }
+ 
+             Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
+             {
+                 Return (IQCR (PRQ3))
+             }
+ 
+             Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
+             {
+                 CreateDWordField (Arg0, 0x05, PRRI)
+                 PRQ3 = PRRI
+             }
+         }
+ 
+         Device (LNKS)
+         {
+             Name (_HID, EisaId ("PNP0C0F"))  // _HID: Hardware ID
+             Name (_UID, 0x04)  // _UID: Unique ID
+             Name (_PRS, ResourceTemplate ()  // _PRS: Possible Resource Settings
+             {
+                 Interrupt (ResourceConsumer, Level, ActiveHigh, Shared, ,, )
+                 {
+                     0x00000009,
+                 }
+             })
+             Method (_STA, 0, NotSerialized)  // _STA: Status
+             {
+                 Return (0x0B)
+             }
+ 
+             Method (_DIS, 0, NotSerialized)  // _DIS: Disable Device
+             {
+             }
+ 
+             Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
+             {
+                 Return (_PRS)
+             }
+ 
+             Method (_SRS, 1, NotSerialized)  // _SRS: Set Resource Settings
+             {
+             }
+         }
+     }
+ 
+     Scope (_SB)
+     {
+         Method (CPMA, 1, NotSerialized)
+         {
+             Local0 = DerefOf (CPON [Arg0])
+             Local1 = Buffer (0x08)
+                 {
+                      0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
+                 }
+             Local1 [0x02] = Arg0
+             Local1 [0x03] = Arg0
+             Local1 [0x04] = Local0
+             Return (Local1)
+         }
+ 
+         Method (CPST, 1, NotSerialized)
+         {
+             Local0 = DerefOf (CPON [Arg0])
+             If (Local0)
+             {
+                 Return (0x0F)
+             }
+             Else
+             {
+                 Return (Zero)
+             }
+         }
+ 
+         Method (CPEJ, 2, NotSerialized)
+         {
+             Sleep (0xC8)
+         }
+ 
+         OperationRegion (PRST, SystemIO, 0xAF00, 0x20)
+         Field (PRST, ByteAcc, NoLock, Preserve)
+         {
+             PRS,    256
+         }
+ 
+         Method (PRSC, 0, NotSerialized)
+         {
+             Local5 = PRS
+             Local2 = Zero
+             Local0 = Zero
+             While ((Local0 < SizeOf (CPON)))
+             {
+                 Local1 = DerefOf (CPON [Local0])
+                 If ((Local0 & 0x07))
+                 {
+                     Local2 >>= One
+                 }
+                 Else
+                 {
+                     Local2 = DerefOf (Local5 [(Local0 >> 0x03)])
+                 }
+ 
+                 Local3 = (Local2 & One)
+                 If ((Local1 != Local3))
+                 {
+                     CPON [Local0] = Local3
+                     If ((Local3 == One))
+                     {
+                         NTFY (Local0, One)
+                     }
+                     Else
+                     {
+                         NTFY (Local0, 0x03)
+                     }
+                 }
+ 
+                 Local0++
+             }
+         }
+     }
+ 
+     Scope (_GPE)
+     {
+         Name (_HID, "ACPI0006")  // _HID: Hardware ID
+         Method (_L00, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+ 
+         Method (_E01, 0, NotSerialized)  // _Exx: Edge-Triggered GPE
+         {
+             \_SB.PCI0.PCNF ()
+         }
+ 
+         Method (_E02, 0, NotSerialized)  // _Exx: Edge-Triggered GPE
+         {
+             \_SB.PRSC ()
+         }
+ 
+         Method (_L03, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+ 
+         Method (_L04, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+ 
+         Method (_L05, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+ 
+         Method (_L06, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+ 
+         Method (_L07, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+ 
+         Method (_L08, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+ 
+         Method (_L09, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+ 
+         Method (_L0A, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+ 
+         Method (_L0B, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+ 
+         Method (_L0C, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+ 
+         Method (_L0D, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+ 
+         Method (_L0E, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+ 
+         Method (_L0F, 0, NotSerialized)  // _Lxx: Level-Triggered GPE
+         {
+         }
+     }
+ }
+ 
+