//
// This file is part of the coreboot project.
//
// Copyright (C) 2007 Advanced Micro Devices, 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
//
DefinitionBlock ("SSDT4.aml", "SSDT", 1, "AMD-FAM10", "AMDACPI", 100925440)
{
	Scope (_SB)
	{
		External (DADD, MethodObj)
		External (GHCE, MethodObj)
		External (GHCN, MethodObj)
		External (GHCL, MethodObj)
		External (GHCD, MethodObj)
		External (GNUS, MethodObj)
		External (GIOR, MethodObj)
		External (GMEM, MethodObj)
		External (GWBN, MethodObj)
		External (GBUS, MethodObj)

		External (PICF)

		External (\_SB.PCI0.LNKA, DeviceObj)
		External (\_SB.PCI0.LNKB, DeviceObj)
		External (\_SB.PCI0.LNKC, DeviceObj)
		External (\_SB.PCI0.LNKD, DeviceObj)

		Device (PCIX)
		{

			// BUS ? Second HT Chain
			Name (HCIN, 0xcc)  // HC2 0x01

			Name (_UID,	 0xdd)	// HC 0x03

			Name (_HID, "PNP0A03")

			Method (_ADR, 0, NotSerialized) //Fake bus should be 0
			{
				Return (DADD(GHCN(HCIN), 0x00000000))
			}

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

			Method (_STA, 0, NotSerialized)
			{
				Return (\_SB.GHCE(HCIN))
			}

			Method (_CRS, 0, NotSerialized)
			{
				Name (BUF0, ResourceTemplate () { })
				Store( GHCN(HCIN), Local4)
				Store( GHCL(HCIN), Local5)

				Concatenate (\_SB.GIOR (Local4, Local5), BUF0, Local1)
				Concatenate (\_SB.GMEM (Local4, Local5), Local1, Local2)
				Concatenate (\_SB.GWBN (Local4, Local5), Local2, Local3)
				Return (Local3)
			}

			#include "acpi/pci4_hc.asl"
		}
	}

}

