/*
 * This file is part of the coreboot project.
 *
 * Copyright (C) 2008 Advanced Micro Devices, Inc.
 * Copyright (C) 2010 Siemens AG, Inc.
 * (Written by Josef Kellermann <joseph.kellermann@heitec.de> for Siemens AG, Inc.)
 *
 * 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
 */
#include <arch/ioapic.h>
#include <cpu/x86/lapic_def.h>

DefinitionBlock ("DSDT.aml", "DSDT", 2, "SIEMENS", "SITEMP ", 0x20101005)
{
	/* Data to be patched by the BIOS during POST */
	/* Memory related values */
	Name(LOMH, 0x0)	/* Start of unused memory in C0000-E0000 range */
	Name(HPBA, 0xFED00000)	/* Base address of HPET table */

	/* USB overcurrent mapping pins.   */
	Name(UOM0, 0)
	Name(UOM1, 2)
	Name(UOM2, 0)
	Name(UOM3, 7)
	Name(UOM4, 2)
	Name(UOM5, 2)
	Name(UOM6, 6)
	Name(UOM7, 2)
	Name(UOM8, 6)
	Name(UOM9, 6)

	Name(DSEN, 1)		// Display Output Switching Enable
	// Power notification

	/* PIC IRQ mapping registers, C00h-C01h */
	OperationRegion(PRQM, SystemIO, 0x00000C00, 0x00000002)
		Field(PRQM, ByteAcc, NoLock, Preserve) {
		PRQI, 0x00000008,
		PRQD, 0x00000008,  /* Offset: 1h */
	}
	IndexField(PRQI, PRQD, ByteAcc, NoLock, Preserve) {
		PINA, 0x00000008,	/* Index 0  */
		PINB, 0x00000008,	/* Index 1 */
		PINC, 0x00000008,	/* Index 2 */
		PIND, 0x00000008,	/* Index 3 */
		SINT, 0x00000008,	/*  Index 4 */
		Offset(0x09),
		PINE, 0x00000008,	/* Index 9 */
		PINF, 0x00000008,	/* Index A */
		PING, 0x00000008,	/* Index B */
		PINH, 0x00000008,	/* Index C */
	}

	/* PCI Error control register */
	OperationRegion(PERC, SystemIO, 0x00000C14, 0x00000001)
		Field(PERC, ByteAcc, NoLock, Preserve) {
		SENS, 0x00000001,
		PENS, 0x00000001,
		SENE, 0x00000001,
		PENE, 0x00000001,
	}

	/* Client Management index/data registers */
	OperationRegion(CMT, SystemIO, 0x00000C50, 0x00000002)
		Field(CMT, ByteAcc, NoLock, Preserve) {
		CMTI,      8,
		/* Client Management Data register */
		G64E,   1,
		G64O,      1,
		G32O,      2,
		,       2,
		GPSL,     2,
	}

	/* GPM Port register */
	OperationRegion(GPT, SystemIO, 0x00000C52, 0x00000001)
		Field(GPT, ByteAcc, NoLock, Preserve) {
		GPB0,1,
		GPB1,1,
		GPB2,1,
		GPB3,1,
		GPB4,1,
		GPB5,1,
		GPB6,1,
		GPB7,1,
	}

	/* Flash ROM program enable register */
	OperationRegion(FRE, SystemIO, 0x00000C6F, 0x00000001)
		Field(FRE, ByteAcc, NoLock, Preserve) {
		,     0x00000006,
		FLRE, 0x00000001,
	}

	/* PM2 index/data registers */
	OperationRegion(PM2R, SystemIO, 0x00000CD0, 0x00000002)
		Field(PM2R, ByteAcc, NoLock, Preserve) {
		PM2I, 0x00000008,
		PM2D, 0x00000008,
	}

	/* Power Management I/O registers */
	OperationRegion(PIOR, SystemIO, 0x00000CD6, 0x00000002)
		Field(PIOR, ByteAcc, NoLock, Preserve) {
		PIOI, 0x00000008,
		PIOD, 0x00000008,
	}
	IndexField (PIOI, PIOD, ByteAcc, NoLock, Preserve) {
		Offset(0x00),	/* MiscControl */
		, 1,
		T1EE, 1,
		T2EE, 1,
		Offset(0x01),	/* MiscStatus */
		, 1,
		T1E, 1,
		T2E, 1,
		Offset(0x04),	/* SmiWakeUpEventEnable3 */
		, 7,
		SSEN, 1,
		Offset(0x07),	/* SmiWakeUpEventStatus3 */
		, 7,
		CSSM, 1,
		Offset(0x10),	/* AcpiEnable */
		, 6,
		PWDE, 1,
		Offset(0x1C),	/* ProgramIoEnable */
		, 3,
		MKME, 1,
		IO3E, 1,
		IO2E, 1,
		IO1E, 1,
		IO0E, 1,
		Offset(0x1D),	/* IOMonitorStatus */
		, 3,
		MKMS, 1,
		IO3S, 1,
		IO2S, 1,
		IO1S, 1,
		IO0S,1,
		Offset(0x20),	/* AcpiPmEvtBlk */
		APEB, 16,
		Offset(0x36),	/* GEvtLevelConfig */
		, 6,
		ELC6, 1,
		ELC7, 1,
		Offset(0x37),	/* GPMLevelConfig0 */
		, 3,
		PLC0, 1,
		PLC1, 1,
		PLC2, 1,
		PLC3, 1,
		PLC8, 1,
		Offset(0x38),	/* GPMLevelConfig1 */
		, 1,
		 PLC4, 1,
		 PLC5, 1,
		, 1,
		 PLC6, 1,
		 PLC7, 1,
		Offset(0x3B),	/* PMEStatus1 */
		GP0S, 1,
		GM4S, 1,
		GM5S, 1,
		APS, 1,
		GM6S, 1,
		GM7S, 1,
		GP2S, 1,
		STSS, 1,
		Offset(0x55),	/* SoftPciRst */
		SPRE, 1,
		, 1,
		, 1,
		PNAT, 1,
		PWMK, 1,
		PWNS, 1,

		/* 	Offset(0x61), */	/*  Options_1 */
		/* 		,7,  */
		/* 		R617,1, */

		Offset(0x65),	/* UsbPMControl */
		, 4,
		URRE, 1,
		Offset(0x68),	/* MiscEnable68 */
		, 3,
		TMTE, 1,
		, 1,
		Offset(0x92),	/* GEVENTIN */
		, 7,
		E7IS, 1,
		Offset(0x96),	/* GPM98IN */
		G8IS, 1,
		G9IS, 1,
		Offset(0x9A),	/* EnhanceControl */
		,7,
		HPDE, 1,
		Offset(0xA8),	/* PIO7654Enable */
		IO4E, 1,
		IO5E, 1,
		IO6E, 1,
		IO7E, 1,
		Offset(0xA9),	/* PIO7654Status */
		IO4S, 1,
		IO5S, 1,
		IO6S, 1,
		IO7S, 1,
	}

	/* PM1 Event Block
	* First word is PM1_Status, Second word is PM1_Enable
	*/
	OperationRegion(P1EB, SystemIO, APEB, 0x04)
		Field(P1EB, ByteAcc, NoLock, Preserve) {
		TMST, 1,
		,    3,
		BMST,    1,
		GBST,   1,
		Offset(0x01),
		PBST, 1,
		, 1,
		RTST, 1,
		, 3,
		PWST, 1,
		SPWS, 1,
		Offset(0x02),
		TMEN, 1,
		, 4,
		GBEN, 1,
		Offset(0x03),
		PBEN, 1,
		, 1,
		RTEN, 1,
		, 3,
		PWDA, 1,
	}

	OperationRegion (GVAR, SystemMemory, 0xBADEAFFE, 0x100)
	Field (GVAR, ByteAcc, NoLock, Preserve)
	{
		Offset (0x00),
		OSYS,	16,
		LINX,	16,
		PCBA,   32,
		MPEN,	8
	}

	Name (IOLM,0xe0000000)

#include "acpi/platform.asl"

	Scope(\_SB) {

		/* PCIe Configuration Space for 16 busses */
		OperationRegion(PCFG, SystemMemory, PCBA, 0x2000000) /* PCIe reserved space for 31 busses */
			Field(PCFG, ByteAcc, NoLock, Preserve) {
			Offset(0x00090024),	/* Byte offset to SATA BAR5 register 24h - Bus 0, Device 18, Function 0 */
			STB5, 32,
			Offset(0x00098042),	/* Byte offset to OHCI0 register 42h - Bus 0, Device 19, Function 0 */
			PT0D, 1,
			PT1D, 1,
			PT2D, 1,
			PT3D, 1,
			PT4D, 1,
			PT5D, 1,
			PT6D, 1,
			PT7D, 1,
			PT8D, 1,
			PT9D, 1,
			Offset(0x000A0004),	/* Byte offset to SMBUS	register 4h - Bus 0, Device 20, Function 0 */
			SBIE, 1,
			SBME, 1,
			Offset(0x000A0008),	/* Byte offset to SMBUS	register 8h - Bus 0, Device 20, Function 0 */
			SBRI, 8,
			Offset(0x000A0014),	/* Byte offset to SMBUS	register 14h - Bus 0, Device 20, Function 0 */
			SBB1, 32,
			Offset(0x000A0078),	/* Byte offset to SMBUS	register 78h - Bus 0, Device 20, Function 0 */
			,14,
			P92E, 1,		/* Port92 decode enable */
		}

		OperationRegion(BAR5, SystemMemory, STB5, 0x1000)
			Field(BAR5, AnyAcc, NoLock, Preserve)
			{
			/* Port 0 */
			Offset(0x120),		/* Port 0 Task file status */
			P0ER, 1,
			, 2,
			P0DQ, 1,
			, 3,
			P0BY, 1,
			Offset(0x128),		/* Port 0 Serial ATA status */
			P0DD, 4,
			, 4,
			P0IS, 4,
			Offset(0x12C),		/* Port 0 Serial ATA control */
			P0DI, 4,
			Offset(0x130),		/* Port 0 Serial ATA error */
			, 16,
			P0PR, 1,

			/* Port 1 */
			offset(0x1A0),		/* Port 1 Task file status */
			P1ER, 1,
			, 2,
			P1DQ, 1,
			, 3,
			P1BY, 1,
			Offset(0x1A8),		/* Port 1 Serial ATA status */
			P1DD, 4,
			, 4,
			P1IS, 4,
			Offset(0x1AC),		/* Port 1 Serial ATA control */
			P1DI, 4,
			Offset(0x1B0),		/* Port 1 Serial ATA error */
			, 16,
			P1PR, 1,

			/* Port 2 */
			Offset(0x220),		/* Port 2 Task file status */
			P2ER, 1,
			, 2,
			P2DQ, 1,
			, 3,
			P2BY, 1,
			Offset(0x228),		/* Port 2 Serial ATA status */
			P2DD, 4,
			, 4,
			P2IS, 4,
			Offset(0x22C),		/* Port 2 Serial ATA control */
			P2DI, 4,
			Offset(0x230),		/* Port 2 Serial ATA error */
			, 16,
			P2PR, 1,

			/* Port 3 */
			Offset(0x2A0),		/* Port 3 Task file status */
			P3ER, 1,
			, 2,
			P3DQ, 1,
			, 3,
			P3BY, 1,
			Offset(0x2A8),		/* Port 3 Serial ATA status */
			P3DD, 4,
			, 4,
			P3IS, 4,
			Offset(0x2AC),		/* Port 3 Serial ATA control */
			P3DI, 4,
			Offset(0x2B0),		/* Port 3 Serial ATA error */
			, 16,
			P3PR, 1,
		}
	}
#include "acpi/event.asl"
#include "acpi/routing.asl"
#include "acpi/usb.asl"

	/* South Bridge */
	Scope(\_SB)
	{
		/* Start \_SB scope */

#include "acpi/globutil.asl"

		Device(PWRB) {	/* Start Power button device */
			Name(_HID, EISAID("PNP0C0C"))
			Name(_UID, 0xAA)
			Name(_PRW, Package () {3, 0x04})	/* wake from S1-S4 */
			Name(_STA, 0x0B) /* sata is invisible */
		}
		/*  _SB.PCI0 */
		/* Note: Only need HID on Primary Bus */
		Device(PCI0)
		{
			External (MMIO)
			External (TOM1)
			External (TOM2)

			Name(_HID, EISAID("PNP0A03"))
			Name(_ADR, 0x00180000)	/* Dev# = BSP Dev#, Func# = 0 */

			Method(_BBN, 0) { /* Bus number = 0 */
				Return(0)
			}

			Method(_STA, 0) {
				/* DBGO("\\_SB\\PCI0\\_STA\n") */
				Return(0x0B)     /* Status is visible */
			}

            Device (MEMR)
            {
                Name (_HID, EisaId ("PNP0C02"))
                Name (MEM1, ResourceTemplate ()
                {
                    Memory32Fixed (ReadWrite,
                        0x00000000,         // Address Base
                        0x00000000,         // Address Length
                        _Y1A)
                    Memory32Fixed (ReadWrite,
                        0x00000000,         // Address Base
                        0x00000000,         // Address Length
                        _Y1B)
                })
                Method (_CRS, 0, NotSerialized)
                {
                    CreateDWordField (MEM1, \_SB.PCI0.MEMR._Y1A._BAS, MB01)
                    CreateDWordField (MEM1, \_SB.PCI0.MEMR._Y1A._LEN, ML01)
                    CreateDWordField (MEM1, \_SB.PCI0.MEMR._Y1B._BAS, MB02)
                    CreateDWordField (MEM1, \_SB.PCI0.MEMR._Y1B._LEN, ML02)
                    If (PCIF)
                    {
                        Store (IO_APIC_ADDR, MB01)
                        Store (LOCAL_APIC_ADDR, MB02)
                        Store (0x1000, ML01)
                        Store (0x1000, ML02)
                    }

                    Return (MEM1)
                }
            }

			Method(_PRT,0) {
				If(PCIF){ Return(APR0) }   /* APIC mode */
				Return (PR0)                  /* PIC Mode */
			} /* end _PRT */

            OperationRegion (BAR1, PCI_Config, 0x14, 0x04)
            Field (BAR1, ByteAcc, NoLock, Preserve)
            {
                Z009,   32
            }

			/* Describe the Northbridge devices */
			Device(AMRT) {
				Name(_ADR, 0x00000000)
			} /* end AMRT */

			/* The internal GFX bridge */
			Device(AGPB) {
				Name(_ADR, 0x00010000)
				Name(_PRW, Package() {0x18, 4})
				Method(_PRT,0) { Return (APR1) }

				Device (VGA)
                {
                    Name (_ADR, 0x00050000)
					Method (_DOS, 1)
					{
						/* Windows 2000 and Windows XP call _DOS to enable/disable
						 * Display Output Switching during init and while a switch
						 * is already active
						*/
						Store (And(Arg0, 7), DSEN)
					}
                    Method (_STA, 0, NotSerialized)
                    {
                        Return (0x0F)
                    }
                }
			}  /* end AGPB */

			/* The external GFX bridge */
			Device(PBR2) {
				Name(_ADR, 0x00020000)
				Name(_PRW, Package() {0x18, 4})
				Method(_PRT,0) {
					If(PCIF){ Return(APS2) }   /* APIC mode */
					Return (PS2)                  /* PIC Mode */
				} /* end _PRT */
			} /* end PBR2 */

			/* Dev3 is also an external GFX bridge */

			Device(PBR4) {
				Name(_ADR, 0x00040000)
				Name(_PRW, Package() {0x18, 4})
				Method(_PRT,0) {
					If(PCIF){ Return(APS4) }   /* APIC mode */
					Return (PS4)                  /* PIC Mode */
				} /* end _PRT */
			} /* end PBR4 */

			Device(PBR5) {
				Name(_ADR, 0x00050000)
				Name(_PRW, Package() {0x18, 4})
				Method(_PRT,0) {
					If(PCIF){ Return(APS5) }   /* APIC mode */
					Return (PS5)                  /* PIC Mode */
				} /* end _PRT */
			} /* end PBR5 */

			Device(PBR6) {
				Name(_ADR, 0x00060000)
				Name(_PRW, Package() {0x18, 4})
				Method(_PRT,0) {
					If(PCIF){ Return(APS6) }   /* APIC mode */
					Return (PS6)                  /* PIC Mode */
				} /* end _PRT */
			} /* end PBR6 */

			/* The onboard EtherNet chip */
			Device(PBR7) {
				Name(_ADR, 0x00070000)
				Name(_PRW, Package() {0x18, 4})
				Method(_PRT,0) {
					If(PCIF){ Return(APS7) }   /* APIC mode */
					Return (PS7)               /* PIC Mode */
				} /* end _PRT */
			} /* end PBR7 */

			/* PCI slot 1 */
			Device(PIBR) {
				Name(_ADR, 0x00140004)
				Name(_PRW, Package() {4, 5}) //  Phoenix doeas it so
				Method(_PRT, 0) {
					If(PCIF){ Return(AP2P) }  /* APIC Mode */
					Return (PCIB)             /* PIC Mode */
				}
			}

			/* Describe the Southbridge devices */
			Device(SATA) {
				Name(_ADR, 0x00120000)
#include "acpi/sata.asl"
			} /* end SATA */

			Device(UOH1) {
				Name(_ADR, 0x00130000)
				Name(_PRW, Package() {0x0B, 3})
			} /* end UOH1 */

			Device(UOH2) {
				Name(_ADR, 0x00130001)
				Name(_PRW, Package() {0x0B, 3})
			} /* end UOH2 */

			Device(UOH3) {
				Name(_ADR, 0x00130002)
				Name(_PRW, Package() {0x0B, 3})
			} /* end UOH3 */

			Device(UOH4) {
				Name(_ADR, 0x00130003)
				Name(_PRW, Package() {0x0B, 3})
			} /* end UOH4 */

			Device(UOH5) {
				Name(_ADR, 0x00130004)
				Name(_PRW, Package() {0x0B, 3})
			} /* end UOH5 */

			Device(UEH1) {
				Name(_ADR, 0x00130005)
				Name(_PRW, Package() {0x0B, 3})
			} /* end UEH1 */

			Device(SBUS) {
				Name(_ADR, 0x00140000)
			} /* end SBUS */

			/* Primary (and only) IDE channel */
			Device(IDEC) {
				Name(_ADR, 0x00140001)
				#include "acpi/ide.asl"
			} /* end IDEC */

			Device(AZHD) {
				Name(_ADR, 0x00140002)
				OperationRegion(AZPD, PCI_Config, 0x00, 0x100)
					Field(AZPD, AnyAcc, NoLock, Preserve) {
					offset (0x42),
					NSDI, 1,
					NSDO, 1,
					NSEN, 1,
					offset (0x44),
					IPCR, 4,
					offset (0x54),
					PWST, 2,
					, 6,
					PMEB, 1,
					, 6,
					PMST, 1,
					offset (0x62),
					MMCR, 1,
					offset (0x64),
					MMLA, 32,
					offset (0x68),
					MMHA, 32,
					offset (0x6C),
					MMDT, 16,
				}

				Method(_INI) {
					If(LEqual(LINX,1)){   /* If we are running Linux */
						Store(zero, NSEN)
						Store(one, NSDO)
						Store(one, NSDI)
					}
				}
			} /* end AZHD */

			Device(LPC0)
			{
                Name (_ADR, 0x00140003)
                Mutex (PSMX, 0x00)

				/* PIC IRQ mapping registers, C00h-C01h */
				OperationRegion(PRQM, SystemIO, 0x00000C00, 0x00000002)
				Field(PRQM, ByteAcc, NoLock, Preserve) {
					PRQI, 0x00000008,
					PRQD, 0x00000008,  /* Offset: 1h */
				}

				IndexField(PRQI, PRQD, ByteAcc, NoLock, Preserve) {
					PINA, 0x00000008,	/* Index 0  */
					PINB, 0x00000008,	/* Index 1 */
					PINC, 0x00000008,	/* Index 2 */
					PIND, 0x00000008,	/* Index 3 */
					SINT, 0x00000008,	/*  Index 4 */
					Offset(0x09),
					PINE, 0x00000008,	/* Index 9 */
					PINF, 0x00000008,	/* Index A */
					PING, 0x00000008,	/* Index B */
					PINH, 0x00000008,	/* Index C */
				}

				Method(CIRQ, 0x00, NotSerialized)
				{
					Store(0, PINA)
					Store(0, PINB)
					Store(0, PINC)
					Store(0, PIND)
					Store(0, SINT)
					Store(0, PINE)
					Store(0, PINF)
					Store(0, PING)
					Store(0, PINH)
				}

				Name(IRQB, ResourceTemplate(){
					IRQ(Level,ActiveLow,Shared){10,11}
				})

				Name(IRQP, ResourceTemplate(){
					IRQ(Level,ActiveLow,Exclusive){3, 4, 5, 7}
				})

				Name(PITF, ResourceTemplate(){
					IRQ(Level,ActiveLow,Exclusive){9}
				})

				Device(INTA) {
					Name(_HID, EISAID("PNP0C0F"))
					Name(_UID, 1)

					Method(_STA, 0) {
						if (PINA) {
							Return(0x0B) /* sata is invisible */
						} else {
							Return(0x09) /* sata is disabled */
						}
					} /* End Method(_SB.INTA._STA) */

					Method(_DIS ,0) {
						Store(0, PINA)
					} /* End Method(_SB.INTA._DIS) */

					Method(_PRS ,0) {
						Return(IRQB) // Return(IRQP)
					} /* Method(_SB.INTA._PRS) */

					Method(_CRS ,0) {
						Store (IRQB, Local0) //
						CreateWordField(Local0, 0x1, IRQ0)
						ShiftLeft(1, PINA, IRQ0)
						Return(Local0)
					} /* Method(_SB.INTA._CRS) */
					Method(_SRS, 1) {
						CreateWordField(ARG0, 1, IRQ0)
						/* Use lowest available IRQ */
						FindSetRightBit(IRQ0, Local0)
						Decrement (Local0)
						Store(Local0, PINA)
					} /* End Method(_SB.INTA._SRS) */
				} /* End Device(INTA) */

				Device(INTB) {
					Name(_HID, EISAID("PNP0C0F"))
					Name(_UID, 2)

					Method(_STA, 0) {
						if (PINB) {
							Return(0x0B) /* sata is invisible */
						} else {
							Return(0x09) /* sata is disabled */
						}
					} /* End Method(_SB.INTB._STA) */

					Method(_DIS ,0) {
						Store(0, PINB)
					} /* End Method(_SB.INTB._DIS) */

					Method(_PRS ,0) {
						Return(IRQB) // Return(IRQP)
					} /* Method(_SB.INTB._PRS) */

					Method(_CRS ,0) {
						Store (IRQB, Local0) // {10,11}
						CreateWordField(Local0, 0x1, IRQ0)
						ShiftLeft(1, PINB, IRQ0)
						Return(Local0)
					} /* Method(_SB.INTB._CRS) */

					Method(_SRS, 1) {
						CreateWordField(ARG0, 1, IRQ0)
						/* Use lowest available IRQ */
						FindSetRightBit(IRQ0, Local0)
						Decrement(Local0)
						Store(Local0, PINB)
					} /* End Method(_SB.INTB._SRS) */
				} /* End Device(INTB)  */

				Device(INTC) {
					Name(_HID, EISAID("PNP0C0F"))
					Name(_UID, 3)

					Method(_STA, 0) {
						if (PINC) {
							Return(0x0B) /* sata is invisible */
						} else {
							Return(0x09) /* sata is disabled */
						}
					} /* End Method(_SB.INTC._STA) */

					Method(_DIS ,0) {
						Store(0, PINC)
					} /* End Method(_SB.INTC._DIS) */

					Method(_PRS ,0) {
						Return(IRQB) // Return(IRQP)
					} /* Method(_SB.INTC._PRS) */

					Method(_CRS ,0) {
						Store (IRQB, Local0) // {10,11}
						CreateWordField(Local0, 0x1, IRQ0)
						ShiftLeft(1, PINC, IRQ0)
						Return(Local0)
					} /* Method(_SB.INTC._CRS) */

					Method(_SRS, 1) {
						CreateWordField(ARG0, 1, IRQ0)
						/* Use lowest available IRQ */
						FindSetRightBit(IRQ0, Local0)
						Decrement(Local0)
						Store(Local0, PINC)
					} /* End Method(_SB.INTC._SRS) */
				} /* End Device(INTC)  */

				Device(INTD) {
					Name(_HID, EISAID("PNP0C0F"))
					Name(_UID, 4)

					Method(_STA, 0) {
						if (PIND) {
							Return(0x0B) /* sata is invisible */
						} else {
							Return(0x09) /* sata is disabled */
						}
					} /* End Method(_SB.INTD._STA) */

					Method(_DIS ,0) {
						Store(0, PIND)
					} /* End Method(_SB.INTD._DIS) */

					Method(_PRS ,0) {
						Return(IRQB) // Return(IRQP)
					} /* Method(_SB.INTD._PRS) */

					Method(_CRS ,0) {
						Store (IRQB, Local0) // {10,11}
						CreateWordField(Local0, 0x1, IRQ0)
						ShiftLeft(1, PIND, IRQ0)
						Return(Local0)
					} /* Method(_SB.INTD._CRS) */

					Method(_SRS, 1) {
						CreateWordField(ARG0, 1, IRQ0)
						/* Use lowest available IRQ */
						FindSetRightBit(IRQ0, Local0)
						Decrement(Local0)
						Store(Local0, PIND)
					} /* End Method(_SB.INTD._SRS) */
				} /* End Device(INTD)  */

				Device(INTE) {
					Name(_HID, EISAID("PNP0C0F"))
					Name(_UID, 5)

					Method(_STA, 0) {
						if (PINE) {
							Return(0x0B) /* sata is invisible */
						} else {
							Return(0x09) /* sata is disabled */
						}
					} /* End Method(_SB.INTE._STA) */

					Method(_DIS ,0) {
						Store(0, PINE)
					} /* End Method(_SB.INTE._DIS) */

					Method(_PRS ,0) {
						Return(IRQB) // Return(IRQP)
					}

					Method(_CRS ,0) {
						Store (IRQB, Local0) // {10,11}
						CreateWordField(Local0, 0x1, IRQ0)
						ShiftLeft(1, PINE, IRQ0)
						Return(Local0)
					} /* Method(_SB.INTE._CRS) */

					Method(_SRS, 1) {
						CreateWordField(ARG0, 1, IRQ0)
						/* Use lowest available IRQ */
						FindSetRightBit(IRQ0, Local0)
						Decrement(Local0)
						Store(Local0, PINE)
					} /* End Method(_SB.INTE._SRS) */
				} /* End Device(INTE)  */

				Device(INTF) {
					Name(_HID, EISAID("PNP0C0F"))
					Name(_UID, 6)

					Method(_STA, 0) {
						if (PINF) {
							Return(0x0B) /* sata is invisible */
						} else {
							Return(0x09) /* sata is disabled */
						}
					} /* End Method(_SB.INTF._STA) */

					Method(_DIS ,0) {
						Store(0, PINF)
					} /* End Method(_SB.INTF._DIS) */

					Method(_PRS ,0) {
						Return(IRQB) // Return(PITF)
					} /* Method(_SB.INTF._PRS) */

					Method(_CRS ,0) {
						Store (IRQB, Local0) // {10,11}
						CreateWordField(Local0, 0x1, IRQ0)
						ShiftLeft(1, PINF, IRQ0)
						Return(Local0)
					} /* Method(_SB.INTF._CRS) */

					Method(_SRS, 1) {
						CreateWordField(ARG0, 1, IRQ0)
						/* Use lowest available IRQ */
						FindSetRightBit(IRQ0, Local0)
						Decrement(Local0)
						Store(Local0, PINF)
					} /*  End Method(_SB.INTF._SRS) */
				} /* End Device(INTF)  */

				Device(INTG) {
					Name(_HID, EISAID("PNP0C0F"))
					Name(_UID, 7)

					Method(_STA, 0) {
						if (PING) {
							Return(0x0B) /* sata is invisible */
						} else {
							Return(0x09) /* sata is disabled */
						}
					} /* End Method(_SB.INTG._STA)  */

					Method(_DIS ,0) {
						Store(0, PING)
					} /* End Method(_SB.INTG._DIS)  */

					Method(_PRS ,0) {
						Return(IRQB) // Return(IRQP)
					} /* Method(_SB.INTG._CRS)  */

					Method(_CRS ,0) {
						Store (IRQB, Local0) // {10,11}
						CreateWordField(Local0, 0x1, IRQ0)
						ShiftLeft(1, PING, IRQ0)
						Return(Local0)
					} /* Method(_SB.INTG._CRS)  */

					Method(_SRS, 1) {
						CreateWordField(ARG0, 1, IRQ0)
						/* Use lowest available IRQ */
						FindSetRightBit(IRQ0, Local0)
						Decrement(Local0)
						Store(Local0, PING)
					} /* End Method(_SB.INTG._SRS)  */
				} /* End Device(INTG)  */

				Device(INTH) {
					Name(_HID, EISAID("PNP0C0F"))
					Name(_UID, 8)

					Method(_STA, 0) {
						if (PINH) {
							Return(0x0B) /* sata is invisible */
						} else {
							Return(0x09) /* sata is disabled */
						}
					} /* End Method(_SB.INTH._STA)  */

					Method(_DIS ,0) {
						Store(0, PINH)
					} /* End Method(_SB.INTH._DIS)  */

					Method(_PRS ,0) {
						Return(IRQB) // Return(IRQP)
					} /* Method(_SB.INTH._CRS)  */

					Method(_CRS ,0) {
						Store (IRQB, Local0) // {10,11}
						CreateWordField(Local0, 0x1, IRQ0)
						ShiftLeft(1, PINH, IRQ0)
						Return(Local0)
					} /* Method(_SB.INTH._CRS)  */

					Method(_SRS, 1) {
						CreateWordField(ARG0, 1, IRQ0)
						/* Use lowest available IRQ */
						FindSetRightBit(IRQ0, Local0)
						Decrement(Local0)
						Store(Local0, PINH)
					} /* End Method(_SB.INTH._SRS)  */
				} /* End Device(INTH)   */


				/* Real Time Clock Device */
				Device(RTC0) {
					Name(_HID, EISAID("PNP0B00"))	/* AT Real Time Clock (not PIIX4 compatible)*/
					Name(_CRS, ResourceTemplate() {
						IRQ (Edge, ActiveHigh, Exclusive, ) {8}
						IO(Decode16,0x0070, 0x0070, 1, 2)
						/* IO(Decode16,0x0070, 0x0070, 0, 4) */
					})
				} /* End Device(_SB.PCI0.LpcIsaBr.RTC0) */

				Device(TMR) {	/* Timer */
					Name(_HID,EISAID("PNP0100"))	/* System Timer */
					Name(_CRS, ResourceTemplate() {
                        IRQ (Edge, ActiveHigh, Exclusive, ) {0}
						IO(Decode16, 0x0040, 0x0040, 1, 4)
						/* IO(Decode16, 0x0048, 0x0048, 0, 4) */
					})
				} /* End Device(_SB.PCI0.LpcIsaBr.TMR) */

				Device(SPKR) {	/* Speaker */
					Name(_HID,EISAID("PNP0800"))	/* AT style speaker */
					Name(_CRS, ResourceTemplate() {
						IO(Decode16, 0x0061, 0x0061, 1, 1)
					})
				} /* End Device(_SB.PCI0.LpcIsaBr.SPKR) */

				Device(PIC) {
					Name(_HID,EISAID("PNP0000"))	/* AT Interrupt Controller */
					Name(_CRS, ResourceTemplate() {
						IRQ (Edge, ActiveHigh, Exclusive, ) {2}
						IO(Decode16,0x0020, 0x0020, 1, 2)
						IO(Decode16,0x00A0, 0x00A0, 0, 2)
						/* IO(Decode16, 0x00D0, 0x00D0, 0x10, 0x02) */
						/* IO(Decode16, 0x04D0, 0x04D0, 0x10, 0x02) */
					})
				} /* End Device(_SB.PCI0.LpcIsaBr.PIC) */

				Device(MAD) { /* 8257 DMA */
					Name(_HID,EISAID("PNP0200"))	/* Hardware Device ID */
					Name(_CRS, ResourceTemplate() {
						DMA(Compatibility,NotBusMaster,Transfer8_16){4}
						IO(Decode16, 0x0000, 0x0000, 0x10, 0x10)
						IO(Decode16, 0x0081, 0x0081, 0x01, 0x03)
						IO(Decode16, 0x0087, 0x0087, 0x01, 0x01)
						IO(Decode16, 0x0089, 0x0089, 0x01, 0x03)
						IO(Decode16, 0x008F, 0x008F, 0x01, 0x01)
						IO(Decode16, 0x00C0, 0x00C0, 0x10, 0x20)
					}) /* End Name(_SB.PCI0.LpcIsaBr.MAD._CRS) */
				} /* End Device(_SB.PCI0.LpcIsaBr.MAD) */

				Device(COPR) {
					Name(_HID,EISAID("PNP0C04"))	/* Math Coprocessor */
					Name(_CRS, ResourceTemplate() {
						IO(Decode16, 0x00F0, 0x00F0, 1, 0x10)
						IRQ (Edge, ActiveHigh, Exclusive, ) {13}
					})
				} /* End Device(_SB.PCI0.LpcIsaBr.COPR) */

				Device(HPET) {
					Name(_HID,EISAID("PNP0103"))
					Name(CRS,ResourceTemplate()	{
						Memory32Fixed(ReadOnly,0xFED00000, 0x00000400, HPT)	/* 1kb reserved space */
					})
					Method(_STA, 0) {
						Return(0x0F) /* sata is visible */
					}
					Method(_CRS, 0)	{
						CreateDwordField(CRS, ^HPT._BAS, HPBA)
						Store(HPBA, HPBA)
						Return(CRS)
					}
                }

                Device (KBC0)
                {
                    Name (_HID, EisaId ("PNP0303"))
                    Name (_CRS, ResourceTemplate ()
                    {
                        IO (Decode16,
                            0x0060,             // Range Minimum
                            0x0060,             // Range Maximum
                            0x01,               // Alignment
                            0x01,               // Length
                            )
                        IO (Decode16,
                            0x0064,             // Range Minimum
                            0x0064,             // Range Maximum
                            0x01,               // Alignment
                            0x01,               // Length
                            )
                        IRQ (Edge, ActiveHigh, Exclusive, ) {1}
                    })
				}

                Device (MSE0)
                {
                    Name (_HID, EisaId ("PNP0F13"))
                    Name (_CRS, ResourceTemplate ()
                    {
                        IRQ (Edge, ActiveHigh, Exclusive, ) {12}
                    })
				}
			} /* end LPC0 */

			Device(ACAD) {
				Name(_ADR, 0x00140005)
				Name (_PRW, Package (0x02)
                {
                    0x0C,
                    0x04
                })
			} /* end Ac97audio */

			Device(ACMD) {
				Name(_ADR, 0x00140006)
				Name (_PRW, Package (0x02)
                {
                    0x0C,
                    0x04
                })
			} /* end Ac97modem */

			/* ITE IT8712F Support */
			OperationRegion (IOID, SystemIO, 0x2E, 0x02)	/* sometimes it is 0x4E */
				Field (IOID, ByteAcc, NoLock, Preserve)
				{
					SIOI,   8,    SIOD,   8		/* 0x2E and 0x2F */
				}

			IndexField (SIOI, SIOD, ByteAcc, NoLock, Preserve)
			{
					Offset (0x07),
				LDN,	8,	/* Logical Device Number */
					Offset (0x20),
				CID1,	8,	/* Chip ID Byte 1, 0x87 */
				CID2,	8,	/* Chip ID Byte 2, 0x12 */
					Offset (0x30),
				ACTR,	8,	/* Function activate */
					Offset (0xF0),
				APC0,	8,	/* APC/PME Event Enable Register */
				APC1,	8,	/* APC/PME Status Register */
				APC2,	8,      /* APC/PME Control Register 1 */
				APC3,	8,	/* Environment Controller Special Configuration Register */
				APC4,	8	/* APC/PME Control Register 2 */
			}

			/* Enter the IT8712F MB PnP Mode */
			Method (EPNP)
			{
				Store(0x87, SIOI)
				Store(0x01, SIOI)
				Store(0x55, SIOI)
				Store(0x55, SIOI) /* IT8712F magic number */
			}
			/* Exit the IT8712F MB PnP Mode */
			Method (XPNP)
			{
				Store (0x02, SIOI)
				Store (0x02, SIOD)
			}

			/*
			 * Keyboard PME is routed to SB600 Gevent3. We can wake
			 * up the system by pressing the key.
			 */
	        Method (SIOS, 1)
			{
				/* We only enable KBD PME for S5. */
				If (LLess (Arg0, 0x05))
				{
					EPNP()
					/* DBGO("IT8712F\n") */

					Store (0x4, LDN)
					Store (One, ACTR)  /* Enable EC */
					/*
					Store (0x4, LDN)
					Store (0x04, APC4)
					*/  /* falling edge. which mode? Not sure. */

					Store (0x4, LDN)
					Store (0x08, APC1) /* clear PME status, Use 0x18 for mouse & KBD */
					Store (0x4, LDN)
					Store (0x08, APC0) /* enable PME, Use 0x18 for mouse & KBD */

					XPNP()
				}
			}
			Method (SIOW, 1)
			{
				EPNP()
				Store (0x4, LDN)
				Store (Zero, APC0) /* disable keyboard PME */
				Store (0x4, LDN)
				Store (0xFF, APC1) /* clear keyboard PME status */
				XPNP()
			}

/* ############################################################################################### */
			Name(CRES, ResourceTemplate() {
				IO(Decode16, 0x0CF8, 0x0CF8, 1,	8)

				WORDIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
					0x0000,			/* address granularity */
					0x0000,			/* range minimum */
					0x0CF7,			/* range maximum */
					0x0000,			/* translation */
					0x0CF8			/* length */
				)

				WORDIO(ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
					0x0000,			/* address granularity */
					0x0D00,			/* range minimum */
					0xFFFF,			/* range maximum */
					0x0000,			/* translation */
					0xF300			/* length */
				)

				Memory32Fixed(READONLY, 0x000A0000, 0x00020000, VGAM) 	/* VGA memory space */
				Memory32Fixed(READONLY, 0x000C0000, 0x00020000, EMM1)	/* Assume C0000-E0000 empty */
				Memory32Fixed(READONLY, 0x000E0000, 0x00020000, RDBS)   /* BIOS ROM area */

				/* DRAM Memory from 1MB to TopMem */
				DWORDMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0, 0, 0, 0x00, 1, ,, EMM2)
				WORDIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, 0x00, 0x0D00, 0xffff, 0x00, 0xf300)
			}) /* End Name(_SB.PCI0.CRES) */

			Method(_CRS, 0) {

				/* DBGO("\\_SB\\PCI0\\_CRS\n") */

				CreateDWordField(CRES, ^EMM1._BAS, EM1B)
				CreateDWordField(CRES, ^EMM1._LEN, EM1L)

				CreateDWordField(CRES, ^EMM2._MIN, EM2B)
				CreateDWordField(CRES, ^EMM2._MAX, EM2E)
				CreateDWordField(CRES, ^EMM2._LEN, EM2L)

				Store(TOM1, EM2B)
				Subtract(IOLM, 1, EM2E)
				Subtract(IOLM, TOM1, EM2L)

				If(LGreater(LOMH, 0xC0000)){
					Store(0xC0000, EM1B)	/* Hole above C0000 and below E0000 */
					Subtract(LOMH, 0xC0000, EM1L)	/* subtract start, assumes allocation from C0000 going up */
				}

				Return(CRES) /* note to change the Name buffer */
			}
/* ########################################################################################## */
		} /* End Device(PCI0)  */
	} /* End \_SB scope */

	Scope(\_SI) {
		Method(_SST, 1) {
			/* DBGO("\\_SI\\_SST\n") */
			/* DBGO("   New Indicator state: ") */
			/* DBGO(Arg0) */
			/* DBGO("\n") */
		}
	} /* End Scope SI */

	Mutex (SBX0, 0x00)
	OperationRegion (SMB0, SystemIO, 0xB00, 0x10)  // 0x0C replace by 0x10
		Field (SMB0, ByteAcc, NoLock, Preserve) {
			HSTS,   8, /* SMBUS status */
			SSTS,   8,  /* SMBUS slave status */
			HCNT,   8,  /* SMBUS control */
			HCMD,   8,  /* SMBUS host cmd */
			HADD,   8,  /* SMBUS address */
			DAT0,   8,  /* SMBUS data0 */
			DAT1,   8,  /* SMBUS data1 */
			BLKD,   8,  /* SMBUS block data */
			SCNT,   8,  /* SMBUS slave control */
			SCMD,   8,  /* SMBUS shaow cmd */
			SEVT,   8,  /* SMBUS slave event */
			SDAT,   8,  /* SMBUS slave data */
			SMK1,   8,
            SLMC,   8,
            RADD,   8,
            SADD,   8
	}

	Method (WCLR, 0, NotSerialized) { /* clear SMBUS status register */
		Store (0x1E, HSTS)
		Store (0xFA, Local0)
		While (LAnd (LNotEqual (And (HSTS, 0x1E), Zero), LGreater (Local0, Zero))) {
			Stall (0x64)
			Decrement (Local0)
		}

		Return (Local0)
	}

	Method (SWTC, 1, NotSerialized) {
		Store (Arg0, Local0)
		Store (0x07, Local2)
		Store (One, Local1)
		While (LEqual (Local1, One)) {
			Store (And (HSTS, 0x1E), Local3)
			If (LNotEqual (Local3, Zero)) { /* read sucess */
				If (LEqual (Local3, 0x02)) {
					Store (Zero, Local2)
				}

				Store (Zero, Local1)
			}
			Else {
				If (LLess (Local0, 0x0A)) { /* read failure */
					Store (0x10, Local2)
					Store (Zero, Local1)
				}
				Else {
					Sleep (0x0A) /* 10 ms, try again */
					Subtract (Local0, 0x0A, Local0)
				}
			}
		}

		Return (Local2)
	}

	Method (SMBR, 3, NotSerialized) {
		Store (0x07, Local0)
		If (LEqual (Acquire (SBX0, 0xFFFF), Zero)) {
			Store (WCLR (), Local0) /* clear SMBUS status register before read data */
			If (LEqual (Local0, Zero)) {
				Release (SBX0)
				Return (0x0)
			}

			Store (0x1F, HSTS)
			Store (Or (ShiftLeft (Arg1, One), One), HADD)
			Store (Arg2, HCMD)
			If (LEqual (Arg0, 0x07)) {
				Store (0x48, HCNT) /* read byte */
			}

			Store (SWTC (0x03E8), Local1) /* 1000 ms */
			If (LEqual (Local1, Zero)) {
				If (LEqual (Arg0, 0x07)) {
					Store (DAT0, Local0)
				}
			}
			Else {
				Store (Local1, Local0)
			}

			Release (SBX0)
		}

		/* DBGO("the value of SMBusData0 register ") */
		/* DBGO(Arg2) */
		/* DBGO(" is ") */
		/* DBGO(Local0) */
		/* DBGO("\n") */

		Return (Local0)
	}
#include "acpi/thermal.asl"
}
