/* * Minimalist ACPI DSDT table for EPIA-N / NL * Basic description of PCI Interrupt Assignments. * This is expected to be included into _SB.PCI0 namespace * (C) Copyright 2009 Jon Harrison * */ /* PCI PnP Routing Links */ /* Define how interrupt Link A is plumbed in */ Device (LNKA) { Name (_HID, EisaId ("PNP0C0F")) Name (_UID, 0x01) /* Status - always return ready */ Method (_STA, 0, NotSerialized) { /* See if coreboot has allocated INTA# */ And (PIRA, 0xF0, Local0) If (LEqual (Local0, 0x00)) { Return (0x09) } Else { Return (0x0B) } } Method (_PRS, 0, NotSerialized) { Name (BUFA, ResourceTemplate () { IRQ (Level, ActiveLow, Shared, ) {3,4,6,7,10,11,12} }) Return (BUFA) } Method (_CRS, 0, NotSerialized) { Name (BUFA, ResourceTemplate () { IRQ (Level, ActiveLow, Shared, _Y07) {} }) /* Read the Binary Encoded Field and Map this */ /* onto the bitwise _INT field in the IRQ descriptor */ /* See ACPI Spec for detail of _IRQ Descriptor */ CreateByteField (BUFA, \_SB.PCI0.LNKA._CRS._Y07._INT, IRA1) CreateByteField (BUFA, 0x02, IRA2) Store (0x00, Local3) Store (0x00, Local4) And (PIRA, 0xF0, Local1) ShiftRight (Local1, 0x04, Local1) If (LNotEqual (Local1, 0x00)) { If (LGreater (Local1, 0x07)) { Subtract (Local1, 0x08, Local2) ShiftLeft (One, Local2, Local4) } Else { If (LGreater (Local1, 0x00)) { ShiftLeft (One, Local1, Local3) } } Store (Local3, IRA1) Store (Local4, IRA2) } Return (BUFA) } /* Set Resources - dummy function to keep Linux ACPI happy * Linux is more than happy not to tinker with irq * assignments as long as the CRS and STA functions * return good values */ Method (_SRS, 1, NotSerialized) {} /* Disable - Set PnP Routing Reg to 0 */ Method (_DIS, 0, NotSerialized ) { And (PIRA, 0x0F, PIRA) } } // End of LNKA Device (LNKB) { Name (_HID, EisaId ("PNP0C0F")) Name (_UID, 0x02) Method (_STA, 0, NotSerialized) { /* See if coreboot has allocated INTB# */ And (PIBC, 0x0F, Local0) If (LEqual (Local0, 0x00)) { Return (0x09) } Else { Return (0x0B) } } Method (_PRS, 0, NotSerialized) { Name (BUFB, ResourceTemplate () { IRQ (Level, ActiveLow, Shared, ) {3,4,6,7,10,11,12} }) Return (BUFB) } Method (_CRS, 0, NotSerialized) { Name (BUFB, ResourceTemplate () { IRQ (Level, ActiveLow, Shared, _Y08) {} }) /* Read the Binary Encoded Field and Map this */ /* onto the bitwise _INT field in the IRQ descriptor */ /* See ACPI Spec for detail of _IRQ Descriptor */ CreateByteField (BUFB, \_SB.PCI0.LNKB._CRS._Y08._INT, IRB1) CreateByteField (BUFB, 0x02, IRB2) Store (0x00, Local3) Store (0x00, Local4) And (PIBC, 0x0F, Local1) If (LNotEqual (Local1, 0x00)) { If (LGreater (Local1, 0x07)) { Subtract (Local1, 0x08, Local2) ShiftLeft (One, Local2, Local4) } Else { If (LGreater (Local1, 0x00)) { ShiftLeft (One, Local1, Local3) } } Store (Local3, IRB1) Store (Local4, IRB2) } Return (BUFB) } /* Set Resources - dummy function to keep Linux ACPI happy * Linux is more than happy not to tinker with irq * assignments as long as the CRS and STA functions * return good values */ Method (_SRS, 1, NotSerialized) {} /* Disable - Set PnP Routing Reg to 0 */ Method (_DIS, 0, NotSerialized ) { And (PIBC, 0xF0, PIBC) } } // End of LNKB Device (LNKC) { Name (_HID, EisaId ("PNP0C0F")) Name (_UID, 0x03) Method (_STA, 0, NotSerialized) { /* See if coreboot has allocated INTC# */ And (PIBC, 0xF0, Local0) If (LEqual (Local0, 0x00)) { Return (0x09) } Else { Return (0x0B) } } Method (_PRS, 0, NotSerialized) { Name (BUFC, ResourceTemplate () { IRQ (Level, ActiveLow, Shared, ) {3,4,6,7,10,11,12} }) Return (BUFC) } Method (_CRS, 0, NotSerialized) { Name (BUFC, ResourceTemplate () { IRQ (Level, ActiveLow, Shared, _Y09) {} }) /* Read the Binary Encoded Field and Map this */ /* onto the bitwise _INT field in the IRQ descriptor */ /* See ACPI Spec for detail of _IRQ Descriptor */ CreateByteField (BUFC, \_SB.PCI0.LNKC._CRS._Y09._INT, IRC1) CreateByteField (BUFC, 0x02, IRC2) Store (0x00, Local3) Store (0x00, Local4) And (PIBC, 0xF0, Local1) ShiftRight (Local1, 0x04, Local1) If (LNotEqual (Local1, 0x00)) { If (LGreater (Local1, 0x07)) { Subtract (Local1, 0x08, Local2) ShiftLeft (One, Local2, Local4) } Else { If (LGreater (Local1, 0x00)) { ShiftLeft (One, Local1, Local3) } } Store (Local3, IRC1) Store (Local4, IRC2) } Return (BUFC) } /* Set Resources - dummy function to keep Linux ACPI happy * Linux is more than happy not to tinker with irq * assignments as long as the CRS and STA functions * return good values */ Method (_SRS, 1, NotSerialized) {} /* Disable - Set PnP Routing Reg to 0 */ Method (_DIS, 0, NotSerialized ) { And (PIBC, 0x0F, PIBC) } } // End of LNKC Device (LNKD) { Name (_HID, EisaId ("PNP0C0F")) Name (_UID, 0x04) Method (_STA, 0, NotSerialized) { /* See if coreboot has allocated INTD# */ And (PIRD, 0xF0, Local0) If (LEqual (Local0, 0x00)) { Return (0x09) } Else { Return (0x0B) } } Method (_PRS, 0, NotSerialized) { Name (BUFD, ResourceTemplate () { IRQ (Level, ActiveLow, Shared, ) {3,4,6,7,10,11,12} }) Return (BUFD) } Method (_CRS, 0, NotSerialized) { Name (BUFD, ResourceTemplate () { IRQ (Level, ActiveLow, Shared, _Y0A) {} }) /* Read the Binary Encoded Field and Map this */ /* onto the bitwise _INT field in the IRQ descriptor */ /* See ACPI Spec for detail of _IRQ Descriptor */ CreateByteField (BUFD, \_SB.PCI0.LNKD._CRS._Y0A._INT, IRD1) CreateByteField (BUFD, 0x02, IRD2) Store (0x00, Local3) Store (0x00, Local4) And (PIRD, 0xF0, Local1) ShiftRight (Local1, 0x04, Local1) If (LNotEqual (Local1, 0x00)) { If (LGreater (Local1, 0x07)) { Subtract (Local1, 0x08, Local2) ShiftLeft (One, Local2, Local4) } Else { If (LGreater (Local1, 0x00)) { ShiftLeft (One, Local1, Local3) } } Store (Local3, IRD1) Store (Local4, IRD2) } Return (BUFD) } /* Set Resources - dummy function to keep Linux ACPI happy * Linux is more than happy not to tinker with irq * assignments as long as the CRS and STA functions * return good values */ Method (_SRS, 1, NotSerialized) {} /* Disable - Set PnP Routing Reg to 0 */ Method (_DIS, 0, NotSerialized ) { And (PIRD, 0x0F, PIRD) } } // End of LNKD /* APIC IRQ Links */ Device (ATAI) { Name (_HID, EisaId ("PNP0C0F")) Name (_UID, 0x05) Method (_STA, 0, NotSerialized) { /* ATFL == 0x02 if SATA Enabled */ If (LNotEqual (ATFL, 0x02)) { /* Double Check By Reading SATA VID */ /* Otherwise Compatibility Mode */ If (LNotEqual (\_SB.PCI0.SATA.VID, 0x1106)) { Return (0x09) } Else { Return (0x0B) } } Else { /* Serial ATA Enabled Check if PATA is in */ /* Compatibility Mode */ If (LEqual (\_SB.PCI0.PATA.ENAT, 0x0A)) { Return (0x09) } Else { Return (0x0B) } } } Method (_PRS, 0, NotSerialized) { Name (ATAN, ResourceTemplate () { Interrupt (ResourceConsumer, Level, ActiveLow, Shared, ,, ) { 0x00000014, } }) Return (ATAN) } Method (_CRS, 0, NotSerialized) { Name (ATAB, ResourceTemplate () { Interrupt (ResourceConsumer, Level, ActiveLow, Shared, ,, _Y10) { 0x00000000, } }) CreateByteField (ATAB, \_SB.PCI0.ATAI._CRS._Y10._INT, IRAI) Store (0x14, IRAI) Return (ATAB) } /* Set Resources - dummy function to keep Linux ACPI happy * Linux is more than happy not to tinker with irq * assignments as long as the CRS and STA functions * return good values */ Method (_SRS, 1, NotSerialized) {} /* Disable - dummy function to keep Linux ACPI happy */ Method (_DIS, 0, NotSerialized ) {} } // End of ATA Interface Link Device (USBI) { Name (_HID, EisaId ("PNP0C0F")) Name (_UID, 0x0A) Method (_STA, 0, NotSerialized) { /* Check that at least one of the USB */ /* functions is enabled */ And (IDEB, 0x37, Local0) If (LEqual (Local0, 0x37)) { Return (0x09) } Else { Return (0x0B) } } Method (_PRS, 0, NotSerialized) { Name (USBB, ResourceTemplate () { Interrupt (ResourceConsumer, Level, ActiveLow, Shared, ,, ) { 0x00000015, } }) Return(USBB) } Method (_CRS, 0, NotSerialized) { Name (USBB, ResourceTemplate () { Interrupt (ResourceConsumer, Level, ActiveLow, Shared, ,, _Y12) { 0x00000000, } }) CreateByteField (USBB, \_SB.PCI0.USBI._CRS._Y12._INT, IRBI) Store (0x15, IRBI) Return (USBB) } /* Set Resources - dummy function to keep Linux ACPI happy * Linux is more than happy not to tinker with irq * assignments as long as the CRS and STA functions * return good values */ Method (_SRS, 1, NotSerialized) {} /* Disable - dummy function to keep Linux ACPI happy */ Method (_DIS, 0, NotSerialized ) {} } Device (VT8I) { Name (_HID, EisaId ("PNP0C0F")) Name (_UID, 0x0B) Method (_STA, 0, NotSerialized) { /* Check Whether Sound and/or Modem are Activated */ If (LEqual (EAMC, 0x03)) { Return (0x09) } Else { Return (0x0B) } } Method (_PRS, 0, NotSerialized) { Name (A97C, ResourceTemplate () { Interrupt (ResourceConsumer, Level, ActiveLow, Shared, ,, ) { 0x00000016, } }) Return (A97C) } Method (_CRS, 0, NotSerialized) { Name (A97B, ResourceTemplate () { Interrupt (ResourceConsumer, Level, ActiveLow, Shared, ,, _Y14) { 0x00000000, } }) CreateByteField (A97B, \_SB.PCI0.VT8I._CRS._Y14._INT, IRCI) Store (0x16, IRCI) Return (A97B) } /* Set Resources - dummy function to keep Linux ACPI happy * Linux is more than happy not to tinker with irq * assignments as long as the CRS and STA functions * return good values */ Method (_SRS, 1, NotSerialized) {} /* Disable - dummy function to keep Linux ACPI happy */ Method (_DIS, 0, NotSerialized ) {} } Device (NICI) { Name (_HID, EisaId ("PNP0C0F")) Name (_UID, 0x0C) Method (_STA, 0, NotSerialized) { /* Check if LAN Function is Enabled */ /* Note that LAN Enable Polarity is different */ /* from other functions in VT8237R !? */ If (LEqual (ELAN, 0x00)) { Return (0x09) } Else { Return (0x0B) } } Method (_PRS, 0, NotSerialized) { Name (NICB, ResourceTemplate () { Interrupt (ResourceConsumer, Level, ActiveLow, Shared, ,, ) { 0x00000017, } }) Return (NICB) } Method (_CRS, 0, NotSerialized) { Name (NICD, ResourceTemplate () { Interrupt (ResourceConsumer, Level, ActiveLow, Shared, ,, _Y16) { 0x00000000, } }) CreateByteField (NICD, \_SB.PCI0.NICI._CRS._Y16._INT, IRDI) Store (0x17, IRDI) Return (NICD) } /* Set Resources - dummy function to keep Linux ACPI happy * Linux is more than happy not to tinker with irq * assignments as long as the CRS and STA functions * return good values */ Method (_SRS, 1, NotSerialized) {} /* Disable - dummy function to keep Linux ACPI happy */ Method (_DIS, 0, NotSerialized ) {} }