/*
 * This file is part of the coreboot project.
 *
 * Copyright (C) 2007-2009 coresystems GmbH
 * Copyright (C) 2014 Google 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
 */

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

	// Disable method
	Method (_DIS, 0, Serialized)
	{
		Store (0x80, PRTA)
	}

	// Possible Resource Settings for this Link
	Name (_PRS, ResourceTemplate()
	{
		IRQ (Level, ActiveLow, Shared)
			{ 1, 3, 4, 5, 6, 7, 10, 12, 14, 15 }
	})

	// Current Resource Settings for this link
	Method (_CRS, 0, Serialized)
	{
		Name (RTLA, ResourceTemplate()
		{
			IRQ (Level, ActiveLow, Shared) {}
		})
		CreateWordField (RTLA, 1, IRQ0)

		// Clear the WordField
		Store (Zero, IRQ0)

		// Set the bit from PRTA
		ShiftLeft (1, And (PRTA, 0x0f), IRQ0)

		Return (RTLA)
	}

	// Set Resource Setting for this IRQ link
	Method (_SRS, 1, Serialized)
	{
		CreateWordField (Arg0, 1, IRQ0)

		// Which bit is set?
		FindSetRightBit (IRQ0, Local0)

		Decrement(Local0)
		Store (Local0, PRTA)
	}

	// Status
	Method (_STA, 0, Serialized)
	{
		If(And (PRTA, 0x80)) {
			Return (0x9)
		} Else {
			Return (0xb)
		}
	}
}

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

	// Disable method
	Method (_DIS, 0, Serialized)
	{
		Store (0x80, PRTB)
	}

	// Possible Resource Settings for this Link
	Name (_PRS, ResourceTemplate()
	{
		IRQ (Level, ActiveLow, Shared)
			{ 1, 3, 4, 5, 6, 7, 11, 12, 14, 15 }
	})

	// Current Resource Settings for this link
	Method (_CRS, 0, Serialized)
	{
		Name (RTLB, ResourceTemplate()
		{
			IRQ (Level, ActiveLow, Shared) {}
		})
		CreateWordField (RTLB, 1, IRQ0)

		// Clear the WordField
		Store (Zero, IRQ0)

		// Set the bit from PRTB
		ShiftLeft (1, And (PRTB, 0x0f), IRQ0)

		Return (RTLB)
	}

	// Set Resource Setting for this IRQ link
	Method (_SRS, 1, Serialized)
	{
		CreateWordField (Arg0, 1, IRQ0)

		// Which bit is set?
		FindSetRightBit (IRQ0, Local0)

		Decrement(Local0)
		Store (Local0, PRTB)
	}

	// Status
	Method (_STA, 0, Serialized)
	{
		If(And (PRTB, 0x80)) {
			Return (0x9)
		} Else {
			Return (0xb)
		}
	}
}

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

	// Disable method
	Method (_DIS, 0, Serialized)
	{
		Store (0x80, PRTC)
	}

	// Possible Resource Settings for this Link
	Name (_PRS, ResourceTemplate()
	{
		IRQ (Level, ActiveLow, Shared)
			{ 1, 3, 4, 5, 6, 7, 10, 12, 14, 15 }
	})

	// Current Resource Settings for this link
	Method (_CRS, 0, Serialized)
	{
		Name (RTLC, ResourceTemplate()
		{
			IRQ (Level, ActiveLow, Shared) {}
		})
		CreateWordField (RTLC, 1, IRQ0)

		// Clear the WordField
		Store (Zero, IRQ0)

		// Set the bit from PRTC
		ShiftLeft (1, And (PRTC, 0x0f), IRQ0)

		Return (RTLC)
	}

	// Set Resource Setting for this IRQ link
	Method (_SRS, 1, Serialized)
	{
		CreateWordField (Arg0, 1, IRQ0)

		// Which bit is set?
		FindSetRightBit (IRQ0, Local0)

		Decrement(Local0)
		Store (Local0, PRTC)
	}

	// Status
	Method (_STA, 0, Serialized)
	{
		If(And (PRTC, 0x80)) {
			Return (0x9)
		} Else {
			Return (0xb)
		}
	}
}

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

	// Disable method
	Method (_DIS, 0, Serialized)
	{
		Store (0x80, PRTD)
	}

	// Possible Resource Settings for this Link
	Name (_PRS, ResourceTemplate()
	{
		IRQ (Level, ActiveLow, Shared)
			{ 1, 3, 4, 5, 6, 7, 11, 12, 14, 15 }
	})

	// Current Resource Settings for this link
	Method (_CRS, 0, Serialized)
	{
		Name (RTLD, ResourceTemplate()
		{
			IRQ (Level, ActiveLow, Shared) {}
		})
		CreateWordField (RTLD, 1, IRQ0)

		// Clear the WordField
		Store (Zero, IRQ0)

		// Set the bit from PRTD
		ShiftLeft (1, And (PRTD, 0x0f), IRQ0)

		Return (RTLD)
	}

	// Set Resource Setting for this IRQ link
	Method (_SRS, 1, Serialized)
	{
		CreateWordField (Arg0, 1, IRQ0)

		// Which bit is set?
		FindSetRightBit (IRQ0, Local0)

		Decrement(Local0)
		Store (Local0, PRTD)
	}

	// Status
	Method (_STA, 0, Serialized)
	{
		If(And (PRTD, 0x80)) {
			Return (0x9)
		} Else {
			Return (0xb)
		}
	}
}

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

	// Disable method
	Method (_DIS, 0, Serialized)
	{
		Store (0x80, PRTE)
	}

	// Possible Resource Settings for this Link
	Name (_PRS, ResourceTemplate()
	{
		IRQ (Level, ActiveLow, Shared)
			{ 1, 3, 4, 5, 6, 7, 10, 12, 14, 15 }
	})

	// Current Resource Settings for this link
	Method (_CRS, 0, Serialized)
	{
		Name (RTLE, ResourceTemplate()
		{
			IRQ (Level, ActiveLow, Shared) {}
		})
		CreateWordField (RTLE, 1, IRQ0)

		// Clear the WordField
		Store (Zero, IRQ0)

		// Set the bit from PRTE
		ShiftLeft (1, And (PRTE, 0x0f), IRQ0)

		Return (RTLE)
	}

	// Set Resource Setting for this IRQ link
	Method (_SRS, 1, Serialized)
	{
		CreateWordField (Arg0, 1, IRQ0)

		// Which bit is set?
		FindSetRightBit (IRQ0, Local0)

		Decrement(Local0)
		Store (Local0, PRTE)
	}

	// Status
	Method (_STA, 0, Serialized)
	{
		If(And (PRTE, 0x80)) {
			Return (0x9)
		} Else {
			Return (0xb)
		}
	}
}

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

	// Disable method
	Method (_DIS, 0, Serialized)
	{
		Store (0x80, PRTF)
	}

	// Possible Resource Settings for this Link
	Name (_PRS, ResourceTemplate()
	{
		IRQ (Level, ActiveLow, Shared)
			{ 1, 3, 4, 5, 6, 7, 11, 12, 14, 15 }
	})

	// Current Resource Settings for this link
	Method (_CRS, 0, Serialized)
	{
		Name (RTLF, ResourceTemplate()
		{
			IRQ (Level, ActiveLow, Shared) {}
		})
		CreateWordField (RTLF, 1, IRQ0)

		// Clear the WordField
		Store (Zero, IRQ0)

		// Set the bit from PRTF
		ShiftLeft (1, And (PRTF, 0x0f), IRQ0)

		Return (RTLF)
	}

	// Set Resource Setting for this IRQ link
	Method (_SRS, 1, Serialized)
	{
		CreateWordField (Arg0, 1, IRQ0)

		// Which bit is set?
		FindSetRightBit (IRQ0, Local0)

		Decrement(Local0)
		Store (Local0, PRTF)
	}

	// Status
	Method (_STA, 0, Serialized)
	{
		If(And (PRTF, 0x80)) {
			Return (0x9)
		} Else {
			Return (0xb)
		}
	}
}

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

	// Disable method
	Method (_DIS, 0, Serialized)
	{
		Store (0x80, PRTG)
	}

	// Possible Resource Settings for this Link
	Name (_PRS, ResourceTemplate()
	{
		IRQ (Level, ActiveLow, Shared)
			{ 1, 3, 4, 5, 6, 7, 10, 12, 14, 15 }
	})

	// Current Resource Settings for this link
	Method (_CRS, 0, Serialized)
	{
		Name (RTLG, ResourceTemplate()
		{
			IRQ (Level, ActiveLow, Shared) {}
		})
		CreateWordField (RTLG, 1, IRQ0)

		// Clear the WordField
		Store (Zero, IRQ0)

		// Set the bit from PRTG
		ShiftLeft (1, And (PRTG, 0x0f), IRQ0)

		Return (RTLG)
	}

	// Set Resource Setting for this IRQ link
	Method (_SRS, 1, Serialized)
	{
		CreateWordField (Arg0, 1, IRQ0)

		// Which bit is set?
		FindSetRightBit (IRQ0, Local0)

		Decrement(Local0)
		Store (Local0, PRTG)
	}

	// Status
	Method (_STA, 0, Serialized)
	{
		If(And (PRTG, 0x80)) {
			Return (0x9)
		} Else {
			Return (0xb)
		}
	}
}

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

	// Disable method
	Method (_DIS, 0, Serialized)
	{
		Store (0x80, PRTH)
	}

	// Possible Resource Settings for this Link
	Name (_PRS, ResourceTemplate()
	{
		IRQ (Level, ActiveLow, Shared)
			{ 1, 3, 4, 5, 6, 7, 11, 12, 14, 15 }
	})

	// Current Resource Settings for this link
	Method (_CRS, 0, Serialized)
	{
		Name (RTLH, ResourceTemplate()
		{
			IRQ (Level, ActiveLow, Shared) {}
		})
		CreateWordField (RTLH, 1, IRQ0)

		// Clear the WordField
		Store (Zero, IRQ0)

		// Set the bit from PRTH
		ShiftLeft (1, And (PRTH, 0x0f), IRQ0)

		Return (RTLH)
	}

	// Set Resource Setting for this IRQ link
	Method (_SRS, 1, Serialized)
	{
		CreateWordField (Arg0, 1, IRQ0)

		// Which bit is set?
		FindSetRightBit (IRQ0, Local0)

		Decrement(Local0)
		Store (Local0, PRTH)
	}

	// Status
	Method (_STA, 0, Serialized)
	{
		If(And (PRTH, 0x80)) {
			Return (0x9)
		} Else {
			Return (0xb)
		}
	}
}

