/*
 * This file is part of the coreboot project.
 *
 * Copyright (C) 2009 Thomas Jourdan <thomas.jourdan@gmail.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; version 2 of
 * the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
 * MA 02110-1301 USA
 */

DefinitionBlock ("DSDT", "DSDT", 1, "EAGLE", "COREBOOT", 0x0000001)
{
	Scope (\_PR)
	{
		Processor (CPU1, 0x01, 0x00000810, 0x06)
		{
			OperationRegion (STBL, SystemMemory, 0xFFFF0000, 0xFFFF)
			Name (NCPU, 0x80)
			Name (TYPE, 0x80000000)
			Name (HNDL, 0x80000000)
			Name (CFGD, 0x80000000)
			Name (TBLD, 0x80)
			Method (_PDC, 1, NotSerialized)
			{
			}
		}
	}

	Scope (\_PR)
	{
		Processor (CPU2, 0x02, 0x00000000, 0x00)
		{
			OperationRegion (STBL, SystemMemory, 0xFFFF0000, 0xFFFF)
			Name (NCPU, 0x80)
			Name (TYPE, 0x80000000)
			Name (HNDL, 0x80000000)
			Name (CFGD, 0x80000000)
			Name (TBLD, 0x80)
			Method (_PDC, 1, NotSerialized)
			{
			}
		}
	}

	/* For now only define 2 power states:
	*  - S0 which is fully on
	*  - S5 which is soft off
	* Any others would involve declaring the wake up methods.
	*/
	Name (\_S0, Package () { 0x00, 0x00, 0x00, 0x00 })
	Name (\_S5, Package () { 0x02, 0x02, 0x00, 0x00 })

	Name (PICM, 0x00)
	Method (_PIC, 1, NotSerialized)
	{
		Store (Arg0, PICM)
	}

	/* System bus */
	Scope (\_SB)
	{
		/* Routing PCI0 */
		Name (PR00, Package (0x0E)
		{
		Package (0x04){0x0001FFFF,0x00,LNKA,0x00}, /* EDMA INTA# */
		Package (0x04){0x0002FFFF,0x00,LNKA,0x00}, /* PCIe port A */
		Package (0x04){0x0002FFFF,0x01,LNKB,0x00},
		Package (0x04){0x0002FFFF,0x02,LNKC,0x00},
		Package (0x04){0x0002FFFF,0x03,LNKD,0x00},
		Package (0x04){0x0003FFFF,0x00,LNKA,0x00}, /* PCIe port A1 */
		Package (0x04){0x0003FFFF,0x01,LNKB,0x00},
		Package (0x04){0x0003FFFF,0x02,LNKC,0x00},
		Package (0x04){0x0003FFFF,0x03,LNKD,0x00},
		Package (0x04){0x001CFFFF,0x00,LNKE,0x00}, /* PCIe port B */
			Package (0x04){0x001DFFFF,0x00,LNKH,0x00}, /* UHCI/EHCI INTA# */
			Package (0x04){0x001DFFFF,0x01,LNKD,0x00}, /* UHCI INTB# */
		Package (0x04){0x001FFFFF,0x01,LNKD,0x00}, /* SATA/SMBUS INTB# */
			Package (0x04){0x001FFFFF,0x03,LNKA,0x00}  /* CHAP INTD# */
		})
		Name (AR00, Package (0x0E)
		{
		Package (0x04){0x0001FFFF,0x00,0x00,0x10}, /* EDMA INTA# */
		Package (0x04){0x0002FFFF,0x00,0x00,0x10}, /* PCIe port A0 */
		Package (0x04){0x0002FFFF,0x01,0x00,0x11},
		Package (0x04){0x0002FFFF,0x02,0x00,0x12},
		Package (0x04){0x0002FFFF,0x03,0x00,0x13},
		Package (0x04){0x0003FFFF,0x00,0x00,0x10}, /* PCIe port A1 */
		Package (0x04){0x0003FFFF,0x01,0x00,0x11},
		Package (0x04){0x0003FFFF,0x02,0x00,0x12},
		Package (0x04){0x0003FFFF,0x03,0x00,0x13},
		Package (0x04){0x001CFFFF,0x00,0x00,0x14}, /* PCIe port B */
			Package (0x04){0x001DFFFF,0x00,0x00,0x17}, /* UHCI/EHCI INTA# */
			Package (0x04){0x001DFFFF,0x01,0x00,0x13}, /* UHCI INTB# */
		Package (0x04){0x001FFFFF,0x01,0x00,0x13}, /* SATA/SMBUS INTB# */
			Package (0x04){0x001FFFFF,0x0D,0x00,0x10}  /* CHAP INTD# */
		})
	/* Routing PCIe Port A */
		Name (PR0A, Package (0x04)
		{
			Package (0x04){0xFFFF,0x00,LNKA,0x00},
			Package (0x04){0xFFFF,0x01,LNKB,0x00},
			Package (0x04){0xFFFF,0x02,LNKC,0x00},
			Package (0x04){0xFFFF,0x03,LNKD,0x00}
		})
		Name (AR0A, Package (0x04)
		{
			Package (0x04){0xFFFF,0x00,0x00,0x10},
			Package (0x04){0xFFFF,0x01,0x00,0x11},
			Package (0x04){0xFFFF,0x02,0x00,0x12},
			Package (0x04){0xFFFF,0x03,0x00,0x13}
		})
	/* Routing PCIe Port B */
		Name (PR0B, Package (0x04)
		{
			Package (0x04){0xFFFF,0x00,LNKA,0x00},
			Package (0x04){0xFFFF,0x01,LNKB,0x00},
			Package (0x04){0xFFFF,0x02,LNKC,0x00},
			Package (0x04){0xFFFF,0x03,LNKD,0x00}
		})
		Name (AR0B, Package (0x04)
		{
			Package (0x04){0xFFFF,0x00,0x00,0x10},
			Package (0x04){0xFFFF,0x01,0x00,0x11},
			Package (0x04){0xFFFF,0x02,0x00,0x12},
			Package (0x04){0xFFFF,0x03,0x00,0x13}
		})
	/* Routing Bus PCI */
	Name (PR01, Package (0x04)
		{
		Package (0x04){0x0000FFFF,0x00,LNKA,0x00},
		Package (0x04){0x0000FFFF,0x01,LNKB,0x00},
		Package (0x04){0x0000FFFF,0x02,LNKC,0x00},
		Package (0x04){0x0000FFFF,0x03,LNKD,0x00},
	})
	Name (AR01, Package (0x04)
		{
		Package (0x04){0x0000FFFF,0x00,0x00,0x10},
		Package (0x04){0x0000FFFF,0x01,0x00,0x11},
		Package (0x04){0x0000FFFF,0x02,0x00,0x12},
		Package (0x04){0x0000FFFF,0x03,0x00,0x13},
	})

		Name (PRSA, ResourceTemplate ()
		{
			IRQ (Level, ActiveLow, Shared, )
				{3,4,5,6,7,10,11,12,14,15}
		})
		Alias (PRSA, PRSB)
		Alias (PRSA, PRSC)
		Alias (PRSA, PRSD)
		Alias (PRSA, PRSE)
		Alias (PRSA, PRSF)
		Alias (PRSA, PRSG)
		Alias (PRSA, PRSH)

	Device (PCI0)
	{
		Name (_HID, EisaId ("PNP0A08"))
		Name (_CID, EisaId ("PNP0A03"))
		Name (_ADR, 0x00)
		Name (_SEG, 0x00)
		Name (_UID, 0x00)
		Name (_BBN, 0x00)

		Name (SUPP, 0) /* PCI _OSC Support Field Value */
		Name (CTRL, 0) /* PCI _OSC Control Field Value */

		Method (_OSC, 4)
		{
			/* Check for proper GUID */
		If (LEqual (Arg0, ToUUID("33DB4D5B-1FF7-401C-9657-7441C03DD766")))
		{
			/* Create DWORD-adressable field from the Capabilities Buffer */
			CreateDWordField (Arg3, 0, CDW1)
			CreateDWordField (Arg3, 4, CDW2)
			CreateDWordField (Arg3, 8, CDW3)

			/* Save Capabilities DWord 2 & 3 */
			Store (CDW2, SUPP)
			Store (CDW3, CTRL)

			/* Don't care of OS capabilites */
			/* We support nothing (maybe we should add PCIe Capability Structure Control) */
			And (CTRL, 0x00, CTRL)

			/* Query flag clear ? */
			If (Not (And (CDW1, 1)))
			{
				/* Nothing to do */
			}

			/* Unknown revision ? */
			If (LNotEqual (Arg1, One))
			{
				Or (CDW1, 0x08, CDW1)
			}

			/* Capabilities bits masked ? */
			If (LNotEqual (CDW3, CTRL))
			{
				Or (CDW1, 0x10, CDW1)
			}

			/* Update DWORD3 in the buffer */
			Store (CTRL, CDW3)

			Return (Arg3)
		}
		Else
		{
			/* Unrecognized UUID */
			Or (CDW1, 4, CDW1)
			Return (Arg3)
		}
		} /* End _OSC */

			Method (_PRT, 0, NotSerialized)
			{
				If (PICM)
				{
					Return (AR00)
				}

				Return (PR00)
			}

		/* PCI Express Port A */
		Device (EPA0)
			{
				Name (_ADR, 0x00020000)
				Method (_PRT, 0, NotSerialized)
				{
					If (PICM)
					{
						Return (AR0A)
					}

					Return (PR0A)
				}
			}

		/* PCI Express Port A1 */
			Device (EPA1)
			{
				Name (_ADR, 0x00030000)
				Method (_PRT, 0, NotSerialized)
				{
					If (PICM)
					{
						Return (AR0A)
					}

					Return (PR0A)
				}
			}

		/* PCI Express Port B0 */
			Device (EPB0)
			{
				Name (_ADR, 0x001C0000)
				Method (_PRT, 0, NotSerialized)
				{
					If (PICM)
					{
						Return (AR0B)
					}

					Return (PR0B)
				}
			}

		/* PCI Bridge */
			Device (P0P1)
			{
				Name (_ADR, 0x001E0000)

				Method (_PRT, 0, NotSerialized)
				{
					If (PICM)
					{
						Return (AR01)
					}

					Return (PR01)
				}
			}

		/* LPC I/F Bridge */
		Device (ISA) {
			Name (_ADR, 0x001F0000)

				/* MMCONF */
				Device (^PCIE)
				{
					Name (_HID, EisaId ("PNP0C02"))
					Name (_UID, 0x11)
					Name (CRS, ResourceTemplate ()
					{
						Memory32Fixed (ReadOnly,
							0xE0000000,         // Address Base
							0x10000000,         // Address Length
							_Y10)
					})
					Method (_CRS, 0, NotSerialized)
					{
						CreateDWordField (CRS, \_SB.PCI0.PCIE._Y10._BAS, BAS1)
						CreateDWordField (CRS, \_SB.PCI0.PCIE._Y10._LEN, LEN1)
						Store (0xE0000000, BAS1)
						Store (0x10000000, LEN1)
						Return (CRS)
					}
				}

		/* PIC */
				Device (PIC)
				{
			Name (_HID, EisaId ("PNP0000"))
			Name (_CRS, ResourceTemplate()
			{
				IO (Decode16,
				0x0020,
				0x0020,
				0x00,
				0x02,
				)
			IO (Decode16,
				0x00A0,
				0x00A0,
				0x00,
				0x02,
				)
			IRQNoFlags ()
				{2}
			})
				}

		/* Real time clock */
				Device (RTC0)
				{
					Name (_HID, EisaId ("PNP0B00"))
					Name (_CRS, ResourceTemplate ()
					{
						IO (Decode16,
				0x0070,
				0x0070,
				0x00,
				0x02)
						IRQNoFlags ()
				{8}
					})
				}

				Device (UAR1)
				{
					Name (_UID, 0x01)
					Name (_HID, EisaId ("PNP0501"))

					Method (_PRS, 0, NotSerialized)
					{
						Return (CMPR)
					}

					Name (CMPR, ResourceTemplate ()
					{
						StartDependentFn (0x00, 0x00)
						{
							IO (Decode16,0x03F8,0x03F8,0x01,0x08)
							IRQNoFlags () {4}
							DMA (Compatibility, NotBusMaster, Transfer8) {}
						}
						StartDependentFnNoPri ()
						{
							IO (Decode16,0x03F8,0x03F8,0x01,0x08)
							IRQNoFlags () {3,4,5,6,7,10,11,12}
							DMA (Compatibility, NotBusMaster, Transfer8) {}
						}
						StartDependentFnNoPri ()
						{
							IO (Decode16,0x02F8,0x02F8,0x01,0x08)
							IRQNoFlags () {3,4,5,6,7,10,11,12}
				DMA (Compatibility, NotBusMaster, Transfer8) {}
						}
						StartDependentFnNoPri ()
						{
							IO (Decode16,0x03E8,0x03E8,0x01,0x08)
							IRQNoFlags () {3,4,5,6,7,10,11,12}
				DMA (Compatibility, NotBusMaster, Transfer8) {}
						}
						StartDependentFnNoPri ()
						{
							IO (Decode16,0x02E8,0x02E8,0x01,0x08)
							IRQNoFlags () {3,4,5,6,7,10,11,12}
							DMA (Compatibility, NotBusMaster, Transfer8) {}
						}
						EndDependentFn ()
					})
				}

		/* PS/2 keyboard (seems to be important for WinXP install) */
		Device (KBD)
		{
			Name (_HID, EisaId ("PNP0303"))
			Method (_STA, 0, NotSerialized)
			{
				Return (0x0f)
			}
			Method (_CRS, 0, NotSerialized)
			{
				Name (TMP, ResourceTemplate () {
							IO (Decode16, 0x0060, 0x0060, 0x01, 0x01)
				IO (Decode16, 0x0064, 0x0064, 0x01, 0x01)
				IRQNoFlags () {1}
			})
			Return (TMP)
			}
		}

		/* PS/2 mouse */
		Device (MOU)
		{
			Name (_HID, EisaId ("PNP0F13"))
			Method (_STA, 0, NotSerialized)
			{
				Return (0x0f)
			}
			Method (_CRS, 0, NotSerialized)
			{
				Name (TMP, ResourceTemplate () {
				IRQNoFlags () {12}
			})
			Return (TMP)
			}
		}

		/* COM ports of SIO */
		Device(SIO) {
				OperationRegion (PT4E, SystemIO, 0x4E, 0x02)
				Field (PT4E, ByteAcc, NoLock, Preserve)
				{
					PO4E,   8,
					PO4F,   8
				}

				IndexField (PO4E, PO4F, ByteAcc, NoLock, Preserve)
				{
							Offset (0x07),
					ILDN,   8,
							Offset (0x28),
					SIUI,   8,
					SIUC,   8,
							Offset (0x30),
					IACT,   8,
							Offset (0x60),
					IIOH,   8,
					IIOL,   8,
							Offset (0x70),
					IINT,   8
				}

				Method (IENF, 0, NotSerialized)
				{
					Store (0x80, PO4E)
					Store (0x86, PO4E)
				}

				Method (IEXF, 0, NotSerialized)
				{
					Store (0x68, PO4E)
					Store (0x08, PO4E)
				}

				Device (COM1)
				{
					Name (_UID, 0x03)
					Name (_HID, EisaId ("PNP0501"))
					Method (_STA, 0, NotSerialized)
					{
						IENF ()
						Store (0x04, ILDN)
						Store (IACT, Local0)
						IEXF ()
						If (LEqual (Local0, 0xFF))
						{
							Return (0x00)
						}

						If (LEqual (Local0, One))
						{
							Return (0x0F)
						}
						Else
						{
							Return (0x0D)
						}
					}

					Method (_DIS, 0, NotSerialized)
					{
						IENF ()
						Store (0x04, ILDN)
						Store (Zero, IACT)
						IEXF ()
					}

					Method (_CRS, 0, NotSerialized)
					{
						Name (BFU1, ResourceTemplate ()
						{
							IO (Decode16,
								0x03F8,             // Range Minimum
								0x03F8,             // Range Maximum
								0x08,               // Alignment
								0x08,               // Length
								_Y03)
							IRQNoFlags (_Y04)
								{5}
						})
						CreateWordField (BFU1, \_SB.PCI0.ISA.SIO.COM1._CRS._Y03._MIN, IMIN)
						CreateWordField (BFU1, \_SB.PCI0.ISA.SIO.COM1._CRS._Y03._MAX, IMAX)
						CreateWordField (BFU1, \_SB.PCI0.ISA.SIO.COM1._CRS._Y04._INT, IRQ0)
						IENF ()
						Store (0x04, ILDN)
						Store (IIOH, Local0)
						ShiftLeft (Local0, 0x08, Local1)
						Store (IIOL, Local0)
						Add (Local1, Local0, Local0)
						Store (Local0, IMIN)
						Store (Local0, IMAX)
						Store (IINT, Local0)
						IEXF ()
						Store (0x01, Local1)
						ShiftLeft (Local1, Local0, IRQ0)
						Return (BFU1)
					}

					Name (_PRS, ResourceTemplate ()
					{
						StartDependentFnNoPri ()
						{
							IO (Decode16,
								0x03F8,             // Range Minimum
								0x03F8,             // Range Maximum
								0x08,               // Alignment
								0x08,               // Length
								)
							IRQNoFlags ()
								{5}
						}
						StartDependentFnNoPri ()
						{
							IO (Decode16,
								0x02F8,             // Range Minimum
								0x02F8,             // Range Maximum
								0x08,               // Alignment
								0x08,               // Length
								)
							IRQNoFlags ()
								{9}
						}
				EndDependentFn ()
					})
					Method (_SRS, 1, NotSerialized)
					{
						CreateByteField (Arg0, 0x02, IOLO)
						CreateByteField (Arg0, 0x03, IOHI)
						CreateWordField (Arg0, 0x09, IRQ0)
						IENF ()
						Store (0x04, ILDN)
						Store (Zero, IACT)
						Store (IOLO, IIOL)
						Store (IOHI, IIOH)
						FindSetRightBit (IRQ0, Local0)
						If (LGreater (Local0, 0x00))
						{
							Decrement (Local0)
						}

						Store (Local0, IINT)
						Store (One, IACT)
						IEXF ()
					}
				} /* COM1 */

				Device (COM2)
				{
					Name (_UID, 0x04)
					Name (_HID, EisaId ("PNP0501"))
					Method (_STA, 0, NotSerialized)
					{
						IENF ()
						Store (0x05, ILDN)
						Store (IACT, Local0)
						IEXF ()
						If (LEqual (Local0, 0xFF))
						{
							Return (0x00)
						}

						If (LEqual (Local0, One))
						{
							Return (0x0F)
						}
						Else
						{
							Return (0x0D)
						}
					}

					Method (_DIS, 0, NotSerialized)
					{
						IENF ()
						Store (0x05, ILDN)
						Store (Zero, IACT)
						IEXF ()
					}

					Method (_CRS, 0, NotSerialized)
					{
						Name (BFU1, ResourceTemplate ()
						{
							IO (Decode16,
								0x03F8,             // Range Minimum
								0x03F8,             // Range Maximum
								0x08,               // Alignment
								0x08,               // Length
								_Y05)
							IRQNoFlags (_Y06)
								{9}
						})
						CreateWordField (BFU1, \_SB.PCI0.ISA.SIO.COM2._CRS._Y05._MIN, IMIN)
						CreateWordField (BFU1, \_SB.PCI0.ISA.SIO.COM2._CRS._Y05._MAX, IMAX)
						CreateWordField (BFU1, \_SB.PCI0.ISA.SIO.COM2._CRS._Y06._INT, IRQ0)
						IENF ()
						Store (0x05, ILDN)
						Store (IIOH, Local0)
						ShiftLeft (Local0, 0x08, Local1)
						Store (IIOL, Local0)
						Add (Local1, Local0, Local0)
						Store (Local0, IMIN)
						Store (Local0, IMAX)
						Store (IINT, Local0)
						IEXF ()
						Store (0x01, Local1)
						ShiftLeft (Local1, Local0, IRQ0)
						Return (BFU1)
					}

					Name (_PRS, ResourceTemplate ()
					{
						StartDependentFnNoPri ()
						{
							IO (Decode16,
								0x03F8,             // Range Minimum
								0x03F8,             // Range Maximum
								0x08,               // Alignment
								0x08,               // Length
								)
							IRQNoFlags ()
								{5}
						}
						StartDependentFnNoPri ()
						{
							IO (Decode16,
								0x02F8,             // Range Minimum
								0x02F8,             // Range Maximum
								0x08,               // Alignment
								0x08,               // Length
								)
							IRQNoFlags ()
								{9}
						}
						EndDependentFn ()
					})
					Method (_SRS, 1, NotSerialized)
					{
						CreateByteField (Arg0, 0x02, IOLO)
						CreateByteField (Arg0, 0x03, IOHI)
						CreateWordField (Arg0, 0x09, IRQ0)
						IENF ()
						Store (0x05, ILDN)
						Store (Zero, IACT)
						Store (IOLO, IIOL)
						Store (IOHI, IIOH)
						FindSetRightBit (IRQ0, Local0)
						If (LGreater (Local0, 0x00))
						{
							Decrement (Local0)
						}

						Store (Local0, IINT)
						Store (One, IACT)
						IEXF ()
					}
				} /* COM2 */
		} /* Device SIO */
		} /* Device ISA */
	} /* Device PCI 0*/
	} /* Scope SB */

	OperationRegion (_SB.PCI0.ISA.PIX0, PCI_Config, 0x60, 0x0C)
	Field (\_SB.PCI0.ISA.PIX0, ByteAcc, NoLock, Preserve)
	{
		PIRA,   8,
		PIRB,   8,
		PIRC,   8,
		PIRD,   8,
				Offset (0x08),
		PIRE,   8,
		PIRF,   8,
		PIRG,   8,
		PIRH,   8
	}

	Scope (_SB)
	{
		Name (BUFA, ResourceTemplate ()
		{
			IRQ (Level, ActiveLow, Shared, _Y1C)
				{15}
		})
		CreateWordField (BUFA, \_SB._Y1C._INT, IRA0)
		Device (LNKA)
		{
			Name (_HID, EisaId ("PNP0C0F"))
			Name (_UID, 0x01)
			Method (_STA, 0, NotSerialized)
			{
				And (PIRA, 0x80, Local0)
				If (Local0)
				{
					Return (0x09)
				}
				Else
				{
					Return (0x0B)
				}
			}

			Method (_PRS, 0, NotSerialized)
			{
				Return (PRSA)
			}

			Method (_DIS, 0, NotSerialized)
			{
				Or (PIRA, 0x80, PIRA)
			}

			Method (_CRS, 0, NotSerialized)
			{
				And (PIRA, 0x0F, Local0)
				ShiftLeft (0x01, Local0, IRA0)
				Return (BUFA)
			}

			Method (_SRS, 1, NotSerialized)
			{
				CreateWordField (Arg0, 0x01, IRA)
				FindSetRightBit (IRA, Local0)
				Decrement (Local0)
				Store (Local0, PIRA)
			}
		}

		Device (LNKB)
		{
			Name (_HID, EisaId ("PNP0C0F"))
			Name (_UID, 0x02)
			Method (_STA, 0, NotSerialized)
			{
				And (PIRB, 0x80, Local0)
				If (Local0)
				{
					Return (0x09)
				}
				Else
				{
					Return (0x0B)
				}
			}

			Method (_PRS, 0, NotSerialized)
			{
				Return (PRSB)
			}

			Method (_DIS, 0, NotSerialized)
			{
				Or (PIRB, 0x80, PIRB)
			}

			Method (_CRS, 0, NotSerialized)
			{
				And (PIRB, 0x0F, Local0)
				ShiftLeft (0x01, Local0, IRA0)
				Return (BUFA)
			}

			Method (_SRS, 1, NotSerialized)
			{
				CreateWordField (Arg0, 0x01, IRA)
				FindSetRightBit (IRA, Local0)
				Decrement (Local0)
				Store (Local0, PIRB)
			}
		}

		Device (LNKC)
		{
			Name (_HID, EisaId ("PNP0C0F"))
			Name (_UID, 0x03)
			Method (_STA, 0, NotSerialized)
			{
				And (PIRC, 0x80, Local0)
				If (Local0)
				{
					Return (0x09)
				}
				Else
				{
					Return (0x0B)
				}
			}

			Method (_PRS, 0, NotSerialized)
			{
				Return (PRSC)
			}

			Method (_DIS, 0, NotSerialized)
			{
				Or (PIRC, 0x80, PIRC)
			}

			Method (_CRS, 0, NotSerialized)
			{
				And (PIRC, 0x0F, Local0)
				ShiftLeft (0x01, Local0, IRA0)
				Return (BUFA)
			}

			Method (_SRS, 1, NotSerialized)
			{
				CreateWordField (Arg0, 0x01, IRA)
				FindSetRightBit (IRA, Local0)
				Decrement (Local0)
				Store (Local0, PIRC)
			}
		}

		Device (LNKD)
		{
			Name (_HID, EisaId ("PNP0C0F"))
			Name (_UID, 0x04)
			Method (_STA, 0, NotSerialized)
			{
				And (PIRD, 0x80, Local0)
				If (Local0)
				{
					Return (0x09)
				}
				Else
				{
					Return (0x0B)
				}
			}

			Method (_PRS, 0, NotSerialized)
			{
				Return (PRSD)
			}

			Method (_DIS, 0, NotSerialized)
			{
				Or (PIRD, 0x80, PIRD)
			}

			Method (_CRS, 0, NotSerialized)
			{
				And (PIRD, 0x0F, Local0)
				ShiftLeft (0x01, Local0, IRA0)
				Return (BUFA)
			}

			Method (_SRS, 1, NotSerialized)
			{
				CreateWordField (Arg0, 0x01, IRA)
				FindSetRightBit (IRA, Local0)
				Decrement (Local0)
				Store (Local0, PIRD)
			}
		}

		Device (LNKE)
		{
			Name (_HID, EisaId ("PNP0C0F"))
			Name (_UID, 0x05)
			Method (_STA, 0, NotSerialized)
			{
				And (PIRE, 0x80, Local0)
				If (Local0)
				{
					Return (0x09)
				}
				Else
				{
					Return (0x0B)
				}
			}

			Method (_PRS, 0, NotSerialized)
			{
				Return (PRSE)
			}

			Method (_DIS, 0, NotSerialized)
			{
				Or (PIRE, 0x80, PIRE)
			}

			Method (_CRS, 0, NotSerialized)
			{
				And (PIRE, 0x0F, Local0)
				ShiftLeft (0x01, Local0, IRA0)
				Return (BUFA)
			}

			Method (_SRS, 1, NotSerialized)
			{
				CreateWordField (Arg0, 0x01, IRA)
				FindSetRightBit (IRA, Local0)
				Decrement (Local0)
				Store (Local0, PIRE)
			}
		}

		Device (LNKF)
		{
			Name (_HID, EisaId ("PNP0C0F"))
			Name (_UID, 0x06)
			Method (_STA, 0, NotSerialized)
			{
				And (PIRF, 0x80, Local0)
				If (Local0)
				{
					Return (0x09)
				}
				Else
				{
					Return (0x0B)
				}
			}

			Method (_PRS, 0, NotSerialized)
			{
				Return (PRSF)
			}

			Method (_DIS, 0, NotSerialized)
			{
				Or (PIRF, 0x80, PIRF)
			}

			Method (_CRS, 0, NotSerialized)
			{
				And (PIRF, 0x0F, Local0)
				ShiftLeft (0x01, Local0, IRA0)
				Return (BUFA)
			}

			Method (_SRS, 1, NotSerialized)
			{
				CreateWordField (Arg0, 0x01, IRA)
				FindSetRightBit (IRA, Local0)
				Decrement (Local0)
				Store (Local0, PIRF)
			}
		}

		Device (LNKG)
		{
			Name (_HID, EisaId ("PNP0C0F"))
			Name (_UID, 0x07)
			Method (_STA, 0, NotSerialized)
			{
				And (PIRG, 0x80, Local0)
				If (Local0)
				{
					Return (0x09)
				}
				Else
				{
					Return (0x0B)
				}
			}

			Method (_PRS, 0, NotSerialized)
			{
				Return (PRSG)
			}

			Method (_DIS, 0, NotSerialized)
			{
				Or (PIRG, 0x80, PIRG)
			}

			Method (_CRS, 0, NotSerialized)
			{
				And (PIRG, 0x0F, Local0)
				ShiftLeft (0x01, Local0, IRA0)
				Return (BUFA)
			}

			Method (_SRS, 1, NotSerialized)
			{
				CreateWordField (Arg0, 0x01, IRA)
				FindSetRightBit (IRA, Local0)
				Decrement (Local0)
				Store (Local0, PIRG)
			}
		}

		Device (LNKH)
		{
			Name (_HID, EisaId ("PNP0C0F"))
			Name (_UID, 0x08)
			Method (_STA, 0, NotSerialized)
			{
				And (PIRH, 0x80, Local0)
				If (Local0)
				{
					Return (0x09)
				}
				Else
				{
					Return (0x0B)
				}
			}

			Method (_PRS, 0, NotSerialized)
			{
				Return (PRSH)
			}

			Method (_DIS, 0, NotSerialized)
			{
				Or (PIRH, 0x80, PIRH)
			}

			Method (_CRS, 0, NotSerialized)
			{
				And (PIRH, 0x0F, Local0)
				ShiftLeft (0x01, Local0, IRA0)
				Return (BUFA)
			}

			Method (_SRS, 1, NotSerialized)
			{
				CreateWordField (Arg0, 0x01, IRA)
				FindSetRightBit (IRA, Local0)
				Decrement (Local0)
				Store (Local0, PIRH)
			}
		}
	}
}


