/* SPDX-License-Identifier: GPL-2.0-only */

	Field(PCFG, ByteAcc, NoLock, Preserve) {
		/* Byte offsets are computed using the following technique:
		 * ((bus number + 1) * ((device number * 8) * 4096)) + register offset
		 * The 8 comes from 8 functions per device, and 4096 bytes per function config space
		*/
		Offset(0x00088024),	/* Byte offset to SATA register 24h - Bus 0, Device 17, 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(SB5, SystemMemory, STB5, 0x1000)
		Field(SB5, 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,
	}

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

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

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

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

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

		Method(_DIS ,0) {
			/* DBGO("\\_SB\\LNKA\\_DIS\n") */
		} /* End Method(_SB.INTA._DIS) */

		Method(_PRS ,0) {
			/* DBGO("\\_SB\\LNKA\\_PRS\n") */
			Return (IRQP)
		} /* Method(_SB.INTA._PRS) */

		Method(_CRS ,0) {
			/* DBGO("\\_SB\\LNKA\\_CRS\n") */
			CreateWordField(IRQB, 0x1, IRQN)
			IRQN = 1 << PIRA
			Return (IRQB)
		} /* Method(_SB.INTA._CRS) */

		Method(_SRS, 1) {
			/* DBGO("\\_SB\\LNKA\\_SRS\n") */
			CreateWordField(ARG0, 1, IRQM)

			/* Use lowest available IRQ */
			FindSetRightBit(IRQM, Local0)
			if (Local0) {
				Local0--
			}
			PIRA = Local0
		} /* End Method(_SB.INTA._SRS) */
	} /* End Device(INTA) */

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

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

		Method(_DIS ,0) {
			/* DBGO("\\_SB\\LNKB\\_DIS\n") */
		} /* End Method(_SB.INTB._DIS) */

		Method(_PRS ,0) {
			/* DBGO("\\_SB\\LNKB\\_PRS\n") */
			Return (IRQP)
		} /* Method(_SB.INTB._PRS) */

		Method(_CRS ,0) {
			/* DBGO("\\_SB\\LNKB\\_CRS\n") */
			CreateWordField(IRQB, 0x1, IRQN)
			IRQN = 1 << PIRB
			Return (IRQB)
		} /* Method(_SB.INTB._CRS) */

		Method(_SRS, 1) {
			/* DBGO("\\_SB\\LNKB\\_CRS\n") */
			CreateWordField(ARG0, 1, IRQM)

			/* Use lowest available IRQ */
			FindSetRightBit(IRQM, Local0)
			if (Local0) {
				Local0--
			}
			PIRB = Local0
		} /* End Method(_SB.INTB._SRS) */
	} /* End Device(INTB)  */

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

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

		Method(_DIS ,0) {
			/* DBGO("\\_SB\\LNKC\\_DIS\n") */
		} /* End Method(_SB.INTC._DIS) */

		Method(_PRS ,0) {
			/* DBGO("\\_SB\\LNKC\\_PRS\n") */
			Return (IRQP)
		} /* Method(_SB.INTC._PRS) */

		Method(_CRS ,0) {
			/* DBGO("\\_SB\\LNKC\\_CRS\n") */
			CreateWordField(IRQB, 0x1, IRQN)
			IRQN = 1 << PIRC
			Return (IRQB)
		} /* Method(_SB.INTC._CRS) */

		Method(_SRS, 1) {
			/* DBGO("\\_SB\\LNKC\\_CRS\n") */
			CreateWordField(ARG0, 1, IRQM)

			/* Use lowest available IRQ */
			FindSetRightBit(IRQM, Local0)
			if (Local0) {
				Local0--
			}
			PIRC = Local0
		} /* End Method(_SB.INTC._SRS) */
	} /* End Device(INTC)  */

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

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

		Method(_DIS ,0) {
			/* DBGO("\\_SB\\LNKD\\_DIS\n") */
		} /* End Method(_SB.INTD._DIS) */

		Method(_PRS ,0) {
			/* DBGO("\\_SB\\LNKD\\_PRS\n") */
			Return (IRQP)
		} /* Method(_SB.INTD._PRS) */

		Method(_CRS ,0) {
			/* DBGO("\\_SB\\LNKD\\_CRS\n") */
			CreateWordField(IRQB, 0x1, IRQN)
			IRQN = 1 << PIRD
			Return (IRQB)
		} /* Method(_SB.INTD._CRS) */

		Method(_SRS, 1) {
			/* DBGO("\\_SB\\LNKD\\_CRS\n") */
			CreateWordField(ARG0, 1, IRQM)

			/* Use lowest available IRQ */
			FindSetRightBit(IRQM, Local0)
			if (Local0) {
				Local0--
			}
			PIRD = Local0
		} /* End Method(_SB.INTD._SRS) */
	} /* End Device(INTD)  */

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

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

		Method(_DIS ,0) {
			/* DBGO("\\_SB\\LNKE\\_DIS\n") */
		} /* End Method(_SB.INTE._DIS) */

		Method(_PRS ,0) {
			/* DBGO("\\_SB\\LNKE\\_PRS\n") */
			Return (IRQP)
		} /* Method(_SB.INTE._PRS) */

		Method(_CRS ,0) {
			/* DBGO("\\_SB\\LNKE\\_CRS\n") */
			CreateWordField(IRQB, 0x1, IRQN)
			IRQN = 1 << PIRE
			Return (IRQB)
		} /* Method(_SB.INTE._CRS) */

		Method(_SRS, 1) {
			/* DBGO("\\_SB\\LNKE\\_CRS\n") */
			CreateWordField(ARG0, 1, IRQM)

			/* Use lowest available IRQ */
			FindSetRightBit(IRQM, Local0)
			if (Local0) {
				Local0--
			}
			PIRE = Local0
		} /* End Method(_SB.INTE._SRS) */
	} /* End Device(INTE)  */

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

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

		Method(_DIS ,0) {
			/* DBGO("\\_SB\\LNKF\\_DIS\n") */
		} /* End Method(_SB.INTF._DIS) */

		Method(_PRS ,0) {
			/* DBGO("\\_SB\\LNKF\\_PRS\n") */
			Return (PITF)
		} /* Method(_SB.INTF._PRS) */

		Method(_CRS ,0) {
			/* DBGO("\\_SB\\LNKF\\_CRS\n") */
			CreateWordField(IRQB, 0x1, IRQN)
			IRQN = 1 << PIRF
			Return (IRQB)
		} /* Method(_SB.INTF._CRS) */

		Method(_SRS, 1) {
			/* DBGO("\\_SB\\LNKF\\_CRS\n") */
			CreateWordField(ARG0, 1, IRQM)

			/* Use lowest available IRQ */
			FindSetRightBit(IRQM, Local0)
			if (Local0) {
				Local0--
			}
			PIRF = Local0
		} /*  End Method(_SB.INTF._SRS) */
	} /* End Device(INTF)  */

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

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

		Method(_DIS ,0) {
			/* DBGO("\\_SB\\LNKG\\_DIS\n") */
		} /* End Method(_SB.INTG._DIS)  */

		Method(_PRS ,0) {
			/* DBGO("\\_SB\\LNKG\\_PRS\n") */
			Return (IRQP)
		} /* Method(_SB.INTG._CRS)  */

		Method(_CRS ,0) {
			/* DBGO("\\_SB\\LNKG\\_CRS\n") */
			CreateWordField(IRQB, 0x1, IRQN)
			IRQN = 1 << PIRG
			Return (IRQB)
		} /* Method(_SB.INTG._CRS)  */

		Method(_SRS, 1) {
			/* DBGO("\\_SB\\LNKG\\_CRS\n") */
			CreateWordField(ARG0, 1, IRQM)

			/* Use lowest available IRQ */
			FindSetRightBit(IRQM, Local0)
			if (Local0) {
				Local0--
			}
			PIRG= Local0
		} /* End Method(_SB.INTG._SRS)  */
	} /* End Device(INTG)  */

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

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

		Method(_DIS ,0) {
			/* DBGO("\\_SB\\LNKH\\_DIS\n") */
		} /* End Method(_SB.INTH._DIS)  */

		Method(_PRS ,0) {
			/* DBGO("\\_SB\\LNKH\\_PRS\n") */
			Return (IRQP)
		} /* Method(_SB.INTH._CRS)  */

		Method(_CRS ,0) {
			/* DBGO("\\_SB\\LNKH\\_CRS\n") */
			CreateWordField(IRQB, 0x1, IRQN)
			IRQN = 1 << PIRH
			Return (IRQB)
		} /* Method(_SB.INTH._CRS)  */

		Method(_SRS, 1) {
			/* DBGO("\\_SB\\LNKH\\_CRS\n") */
			CreateWordField(ARG0, 1, IRQM)

			/* Use lowest available IRQ */
			FindSetRightBit(IRQM, Local0)
			if (Local0) {
				Local0--
			}
			PIRH = Local0
		} /* End Method(_SB.INTH._SRS)  */
	} /* End Device(INTH)   */