/*
 * Copyright 2005 AMD
 */
DefinitionBlock ("DSDT.aml", "DSDT", 1, "AMD-K8", "AMDACPI", 100925440)
{
    Scope (_PR)
    {
        Processor (CPU0, 0x00, 0x0000C010, 0x06) {}
        Processor (CPU1, 0x01, 0x00000000, 0x00) {}
        Processor (CPU2, 0x02, 0x00000000, 0x00) {}
        Processor (CPU3, 0x03, 0x00000000, 0x00) {}

    }

    Method (FWSO, 0, NotSerialized) { }

    Name (_S0, Package (0x04) { 0x00, 0x00, 0x00, 0x00 })
    Name (_S1, Package (0x04) { 0x01, 0x01, 0x01, 0x01 })
    Name (_S3, Package (0x04) { 0x05, 0x05, 0x05, 0x05 })
    Name (_S5, Package (0x04) { 0x07, 0x07, 0x07, 0x07 })

    Scope (_SB)
    {
        Device (PCI0)
        {
	    /* BUS0 root bus */

	    External (BUSN)
	    External (MMIO)
	    External (PCIO)
	    External (SBLK)
	    External (TOM1)
	    External (HCLK)
	    External (SBDN)
	    External (HCDN)
	    External (CBST)


            Name (_HID, EisaId ("PNP0A03"))
            Name (_ADR, 0x00180000)
            Name (_UID, 0x01)

            Name (HCIN, 0x00)  // HC1

            Method (_BBN, 0, NotSerialized)
            {
                Return (GBUS (GHCN(HCIN), GHCL(HCIN)))
            }

            Method (_CRS, 0, NotSerialized)
            {
                Name (BUF0, ResourceTemplate ()
                {
                    IO (Decode16, 0x0CF8, 0x0CF8, 0x01, 0x08) //CF8-CFFh
                    IO (Decode16, 0xC000, 0xC000, 0x01, 0x80) //8000h
                    IO (Decode16, 0xC080, 0xC080, 0x01, 0x80) //8080h

                    WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
                        0x0000, // Address Space Granularity
                        0x8100, // Address Range Minimum
                        0xFFFF, // Address Range Maximum
                        0x0000, // Address Translation Offset
                        0x7F00,,,
                        , TypeStatic)    //8100h-FFFFh

                    DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                        0x00000000, // Address Space Granularity
                        0x000C0000, // Address Range Minimum
                        0x000CFFFF, // Address Range Maximum
                        0x00000000, // Address Translation Offset
                        0x00010000,,,
                        , AddressRangeMemory, TypeStatic)   //Video BIOS A0000h-C7FFFh

                    Memory32Fixed (ReadWrite, 0x000D8000, 0x00004000)//USB HC D8000-DBFFF

                    WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
                        0x0000, // Address Space Granularity
                        0x0000, // Address Range Minimum
                        0x03AF, // Address Range Maximum
                        0x0000, // Address Translation Offset
                        0x03B0,,,
                        , TypeStatic)  //0-CF7h

                    WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
                        0x0000, // Address Space Granularity
                        0x03E0, // Address Range Minimum
                        0x0CF7, // Address Range Maximum
                        0x0000, // Address Translation Offset
                        0x0918,,,
                        , TypeStatic)  //0-CF7h
                })
                \_SB.OSTP ()
                CreateDWordField (BUF0, 0x3E, VLEN)
                CreateDWordField (BUF0, 0x36, VMAX)
                CreateDWordField (BUF0, 0x32, VMIN)
                ShiftLeft (VGA1, 0x09, Local0)
                Add (VMIN, Local0, VMAX)
                Decrement (VMAX)
                Store (Local0, VLEN)
                Concatenate (\_SB.GMEM (0x00, \_SB.PCI0.SBLK), BUF0, Local1)
                Concatenate (\_SB.GIOR (0x00, \_SB.PCI0.SBLK), Local1, Local2)
                Concatenate (\_SB.GWBN (0x00, \_SB.PCI0.SBLK), Local2, Local3)
                Return (Local3)
	    }

	    #include "acpi/pci0_hc.asl"

        }
        Device (PCI1)
        {
            Name (_HID, "PNP0A03")
            Name (_ADR, 0x00000000)
            Name (_UID, 0x02)
            Method (_STA, 0, NotSerialized)
            {
                Return (\_SB.PCI0.CBST)
            }
	    Name (_BBN, 0x00)
        }


    }

    Scope (_GPE)
    {
        Method (_L08, 0, NotSerialized)
        {
            Notify (\_SB.PCI0, 0x02) //PME# Wakeup
        }

        Method (_L0F, 0, NotSerialized)
        {
            Notify (\_SB.PCI0.TP2P.USB0, 0x02)  //USB Wakeup
        }

        Method (_L22, 0, NotSerialized) // GPIO18 (LID) - Pogo 0 Bridge B
        {
            Notify (\_SB.PCI0.PG0B, 0x02)
        }

        Method (_L29, 0, NotSerialized) // GPIO25 (Suspend) - Pogo 0 Bridge A
        {
            Notify (\_SB.PCI0.PG0A, 0x02)
        }
    }

    Method (_PTS, 1, NotSerialized)
    {
        Or (Arg0, 0xF0, Local0)
        Store (Local0, DBG1)
    }
/*
    Method (_WAK, 1, NotSerialized)
    {
        Or (Arg0, 0xE0, Local0)
        Store (Local0, DBG1)
    }
*/
    Name (PICF, 0x00) //Flag Variable for PIC vs. I/O APIC Mode
    Method (_PIC, 1, NotSerialized) //PIC Flag and Interface Method
    {
        Store (Arg0, PICF)
    }

    OperationRegion (DEBG, SystemIO, 0x80, 0x01)
    Field (DEBG, ByteAcc, Lock, Preserve)
    {
        DBG1,   8
    }

    OperationRegion (EXTM, SystemMemory, 0x000FF83C, 0x04)
    Field (EXTM, WordAcc, Lock, Preserve)
    {
        AMEM,   32
    }

    OperationRegion (VGAM, SystemMemory, 0x000C0002, 0x01)
    Field (VGAM, ByteAcc, Lock, Preserve)
    {
        VGA1,   8
    }

    OperationRegion (GRAM, SystemMemory, 0x0400, 0x0100)
    Field (GRAM, ByteAcc, Lock, Preserve)
    {
        Offset (0x10),
        FLG0,   8
    }

    OperationRegion (GSTS, SystemIO, 0xC028, 0x02)
    Field (GSTS, ByteAcc, NoLock, Preserve)
    {
            ,   4,
        IRQR,   1
    }

    OperationRegion (Z007, SystemIO, 0x21, 0x01)
    Field (Z007, ByteAcc, NoLock, Preserve)
    {
        Z008,   8
    }

    OperationRegion (Z009, SystemIO, 0xA1, 0x01)
    Field (Z009, ByteAcc, NoLock, Preserve)
    {
        Z00A,   8
    }

    #include "northbridge/amd/amdk8/util.asl"

}

