blob: 8de268bd1560f7cbb49c9061d5f6a6f8ababb9b1 [file] [log] [blame]
/*
* Copyright 2005 AMD
* Copyright (C) 2011, 2014 Oskar Enoksson <enok@lysator.liu.se>
*/
//AMD8111
// APIC version of the interrupt routing table
Name (APIC, Package (0x04) {
Package (0x04) { 0x0004FFFF, 0x00, 0x00, 0x10},// 0x0004ffff : assusme 8131 is present
Package (0x04) { 0x0004FFFF, 0x01, 0x00, 0x11},
Package (0x04) { 0x0004FFFF, 0x02, 0x00, 0x12},
Package (0x04) { 0x0004FFFF, 0x03, 0x00, 0x13}
})
// PIC version of the interrupt routing table
Name (PICM, Package (0x04) {
Package (0x04) { 0x0004FFFF, 0x00, \_SB.PCI0.LNKA, 0x00},
Package (0x04) { 0x0004FFFF, 0x01, \_SB.PCI0.LNKB, 0x00},
Package (0x04) { 0x0004FFFF, 0x02, \_SB.PCI0.LNKC, 0x00},
Package (0x04) { 0x0004FFFF, 0x03, \_SB.PCI0.LNKD, 0x00}
})
Name (DNCG, Ones)
Method (_PRT, 0, NotSerialized) {
If (LEqual (^DNCG, Ones)) {
Store (DADD(\_SB.PCI0.SBDN, 0x0001ffff), Local0)
// Update the Device Number according to SBDN
Store(Local0, Index (DeRefOf (Index (PICM, 0)), 0))
Store(Local0, Index (DeRefOf (Index (PICM, 1)), 0))
Store(Local0, Index (DeRefOf (Index (PICM, 2)), 0))
Store(Local0, Index (DeRefOf (Index (PICM, 3)), 0))
Store(Local0, Index (DeRefOf (Index (APIC, 0)), 0))
Store(Local0, Index (DeRefOf (Index (APIC, 1)), 0))
Store(Local0, Index (DeRefOf (Index (APIC, 2)), 0))
Store(Local0, Index (DeRefOf (Index (APIC, 3)), 0))
Store (0x00, ^DNCG)
}
If (LNot (PICF)) {
Return (PICM)
} Else {
Return (APIC)
}
}
// AMD8111 System Management I/O Mapped Registers (PMxx)
OperationRegion (PMIO, SystemIO, PMBS, 0xDF)
Field (PMIO, ByteAcc, NoLock, Preserve) {
Offset (0x1E),
SWSM, 8, // Software SMI Trigger (sets GSTS)
Offset (0x28),
GSTS, 16, // Global STatuS
GNBL, 16, // Global SMI enable
Offset (0x30),
STMC, 5, // Miscellaneous SMI Status
Offset (0x32),
ENMC, 5, // Miscellaneous SMI Enable
Offset (0x44),
STC0, 9, // TCO Status 1
Offset (0x46),
STC1, 4, // TCO Status 2
Offset (0xA8),
STHW, 20 // Device monitor SMI Interrupt Enable
}
Device (HPET) {
Name (HPT, 0x00)
Name (_HID, EisaId ("PNP0103"))
Name (_UID, 0x00)
Method (_STA, 0, NotSerialized) {
Return (0x0F)
}
Method (_CRS, 0, Serialized) {
Name (BUF0, ResourceTemplate () {
Memory32Fixed (ReadWrite, 0xFED00000, 0x00000400)
})
Return (BUF0)
}
}
#include "amd8111_pic.asl"
#include "amd8111_isa.asl"
Device (TP2P) {
// 8111 P2P and it should 0x00030000 when 8131 present
Method (_ADR, 0, NotSerialized) {
Return (DADD(\_SB.PCI0.SBDN, 0x00000000))
}
Method (_PRW, 0, NotSerialized) { // Power Resource for Wake
// result :
// [0] Bit index into GPEx_EN in the GPE block described by FADT.
// [1] The lowest power state from which the system can be awakened.
//If (CondRefOf (\_S3)) {
// Return (Package (0x02) { 0x08, 0x03 })
//} Else {
Return (Package (0x02) { 0x08, 0x01 })
//}
}
Device (ETHR) {
Name (_ADR, 0x00010000)
Method (_PRW, 0, NotSerialized) { // Power Resource for Wake
//If (CondRefOf (\_S3)) {
// Return (Package (0x02) { 0x08, 0x03 })
//} Else {
Return (Package (0x02) { 0x08, 0x01 })
//}
}
}
Device (USB0) {
Name (_ADR, 0x00000000)
Method (_PSW, 1, NotSerialized) { // Power State Wake
And (GNBL, 0x7FFF, GNBL)
}
Method (_PRW, 0, NotSerialized) { // Power Resource for Wake
//If (CondRefOf (\_S3)) {
// Return (Package (0x02) { 0x0F, 0x03 })
//} Else {
Return (Package (0x02) { 0x0F, 0x01 })
//}
}
}
Device (USB1) {
Name (_ADR, 0x00000001)
Method (_PSW, 1, NotSerialized) { // Power State Wake
And (GNBL, 0x7FFF, GNBL)
}
Method (_PRW, 0, NotSerialized) { // Power Resource for Wake
//If (CondRefOf (\_S3)) {
// Return (Package (0x02) { 0x0F, 0x03 })
//} Else {
Return (Package (0x02) { 0x0F, 0x01 })
//}
}
}
Name (APIC, Package (0x0C) {
Package (0x04) { 0x0000FFFF, 0x00, 0x00, 0x10 }, //USB
Package (0x04) { 0x0000FFFF, 0x01, 0x00, 0x11 },
Package (0x04) { 0x0000FFFF, 0x02, 0x00, 0x12 },
Package (0x04) { 0x0000FFFF, 0x03, 0x00, 0x13 },
Package (0x04) { 0x0004FFFF, 0x00, 0x00, 0x10 }, //Slot 6
Package (0x04) { 0x0004FFFF, 0x01, 0x00, 0x11 },
Package (0x04) { 0x0004FFFF, 0x02, 0x00, 0x12 },
Package (0x04) { 0x0004FFFF, 0x03, 0x00, 0x13 },
Package (0x04) { 0x0005FFFF, 0x00, 0x00, 0x11 }, //Slot 5
Package (0x04) { 0x0005FFFF, 0x01, 0x00, 0x12 },
Package (0x04) { 0x0005FFFF, 0x02, 0x00, 0x13 },
Package (0x04) { 0x0005FFFF, 0x03, 0x00, 0x10 }
})
Name (PICM, Package (0x0C) {
Package (0x04) { 0x0000FFFF, 0x00, \_SB.PCI0.LNKA, 0x00 }, //USB
Package (0x04) { 0x0000FFFF, 0x01, \_SB.PCI0.LNKB, 0x00 },
Package (0x04) { 0x0000FFFF, 0x02, \_SB.PCI0.LNKC, 0x00 },
Package (0x04) { 0x0000FFFF, 0x03, \_SB.PCI0.LNKD, 0x00 },
Package (0x04) { 0x0004FFFF, 0x00, \_SB.PCI0.LNKA, 0x00 }, //Slot 6
Package (0x04) { 0x0004FFFF, 0x01, \_SB.PCI0.LNKB, 0x00 },
Package (0x04) { 0x0004FFFF, 0x02, \_SB.PCI0.LNKC, 0x00 },
Package (0x04) { 0x0004FFFF, 0x03, \_SB.PCI0.LNKD, 0x00 },
Package (0x04) { 0x0005FFFF, 0x00, \_SB.PCI0.LNKB, 0x00 }, //Slot 5
Package (0x04) { 0x0005FFFF, 0x01, \_SB.PCI0.LNKC, 0x00 },
Package (0x04) { 0x0005FFFF, 0x02, \_SB.PCI0.LNKD, 0x00 },
Package (0x04) { 0x0005FFFF, 0x03, \_SB.PCI0.LNKA, 0x00 }
})
Method (_PRT, 0, NotSerialized) {
If (LNot (PICF)) { Return (PICM) }
Else { Return (APIC) }
}
}
Device (IDE0) {
Method (_ADR, 0, NotSerialized) {
Return (DADD(\_SB.PCI0.SBDN, 0x00010001))
}
Name (REGF, 0x01)
Method (_REG, 2, NotSerialized) {
If (LEqual (Arg0, 0x02)) {
Store (Arg1, REGF)
}
}
OperationRegion (BAR0, PCI_Config, 0x00, 0x60)
Field (BAR0, ByteAcc, NoLock, Preserve) {
Offset (0x40), // EIDE Controller Configuration Register
SCEN, 1, // Secondary Channel Enable
PCEN, 1, // Primary Channel Enable
, 10,
SPWB, 1, // Secondary Port posted-write buffer for PIO modes enable
SRPB, 1, // RW (controls nothing)
PPWB, 1, // Primary Port posted-write buffer for PIO modes enable
PRPB, 1, // RW (controls nothing)
PM80, 1, // High-speed 80-pin cable enable Primary Master
PS80, 1, // High-speed 80-pin cable enable Primary Slave
SM80, 1, // High-speed 80-pin cable enable Secondary Master
SS80, 1, // High-speed 80-pin cable enable Secondary Slave
, 4, // RW (controls nothing)
Offset (0x48),
SSRT, 4, //
SSPW, 4, //
SMRT, 4, //
SMPW, 4,
PSRT, 4,
PSPW, 4,
PMRT, 4,
PMPW, 4,
SSAD, 2,
SMAD, 2,
PSAD, 2,
PMAD, 2,
Offset (0x4E),
SXRT, 4,
SXPW, 4,
PXRT, 4,
PXPW, 4,
SSUD, 8,
SMUD, 8,
PSUD, 8,
PMUD, 8,
PPDN, 1,
PPDS, 1,
, 2,
SPDN, 1,
SPDS, 1
}
Name (TIM0, Package (0x06) {
Package (0x05) {
0x78,
0xB4,
0xF0,
0x0186,
0x0258
},
Package (0x07) {
0x78,
0x5A,
0x3C,
0x2D,
0x1E,
0x14,
0x0F
},
Package (0x08) {
0x04,
0x03,
0x02,
0x01,
0x00,
0x00,
0x00,
0x00
},
Package (0x03) {
0x02,
0x01,
0x00
},
Package (0x05) {
0x20,
0x22,
0x42,
0x65,
0xA8
},
Package (0x07) {
0xC2,
0xC1,
0xC0,
0xC4,
0xC5,
0xC6,
0xC7
}
})
Name (TMD0, Buffer (0x14) {})
CreateDWordField (TMD0, 0x00, PIO0)
CreateDWordField (TMD0, 0x04, DMA0)
CreateDWordField (TMD0, 0x08, PIO1)
CreateDWordField (TMD0, 0x0C, DMA1)
CreateDWordField (TMD0, 0x10, CHNF)
Device (CHN0) {
Name (_ADR, 0x00)
Method (_STA, 0, NotSerialized) {
If (PCEN) { Return (0x0F) }
Else { Return (0x09) }
}
Method (_GTM, 0, NotSerialized) {
Return (GTM (PMPW, PMRT, PSPW, PSRT, PMUD, PSUD))
}
Method (_STM, 3, NotSerialized) {
Store (Arg0, TMD0)
Store (STM (), Local0)
And (Local0, 0xFF, PSUD)
ShiftRight (Local0, 0x08, Local0)
And (Local0, 0xFF, PMUD)
ShiftRight (Local0, 0x08, Local0)
And (Local0, 0x0F, PSRT)
ShiftRight (Local0, 0x04, Local0)
And (Local0, 0x0F, PSPW)
ShiftRight (Local0, 0x04, Local0)
And (Local0, 0x0F, PMRT)
ShiftRight (Local0, 0x04, Local0)
And (Local0, 0x0F, PMPW)
Store (GTF (0x00, Arg1), ATA0)
Store (GTF (0x01, Arg2), ATA1)
}
Device (DRV0) {
Name (_ADR, 0x00)
Method (_GTF, 0, NotSerialized) {
Return (RATA (ATA0))
}
}
Device (DRV1) {
Name (_ADR, 0x01)
Method (_GTF, 0, NotSerialized) {
Return (RATA (ATA1))
}
}
}
Device (CHN1) {
Name (_ADR, 0x01)
Method (_STA, 0, NotSerialized) {
If (SCEN) { Return (0x0F) }
Else { Return (0x09) }
}
Method (_GTM, 0, NotSerialized) {
Return (GTM (SMPW, SMRT, SSPW, SSRT, SMUD, SSUD))
}
Method (_STM, 3, NotSerialized) {
Store (Arg0, TMD0)
Store (STM (), Local0)
And (Local0, 0xFF, SSUD)
ShiftRight (Local0, 0x08, Local0)
And (Local0, 0xFF, SMUD)
ShiftRight (Local0, 0x08, Local0)
And (Local0, 0x0F, SSRT)
ShiftRight (Local0, 0x04, Local0)
And (Local0, 0x0F, SSPW)
ShiftRight (Local0, 0x04, Local0)
And (Local0, 0x0F, SMRT)
ShiftRight (Local0, 0x04, Local0)
And (Local0, 0x0F, SMPW)
Store (GTF (0x00, Arg1), ATA2)
Store (GTF (0x01, Arg2), ATA3)
}
Device (DRV0) {
Name (_ADR, 0x00)
Method (_GTF, 0, NotSerialized) {
Return (RATA (ATA2))
}
}
Device (DRV1) {
Name (_ADR, 0x01)
Method (_GTF, 0, NotSerialized) {
Return (RATA (ATA3))
}
}
}
Method (GTM, 6, Serialized) {
Store (Ones, PIO0)
Store (Ones, PIO1)
Store (Ones, DMA0)
Store (Ones, DMA1)
Store (0x1A, CHNF)
If (REGF) {}
Else { Return (TMD0) }
Add (Arg0, Arg1, Local0)
Add (Local0, 0x02, Local0)
Multiply (Local0, 0x1E, PIO0)
Add (Arg2, Arg3, Local0)
Add (Local0, 0x02, Local0)
Multiply (Local0, 0x1E, PIO1)
If (And (Arg4, 0x40)) {
Or (CHNF, 0x01, CHNF)
And (Arg4, 0x07, Local0)
If (LLess (Local0, 0x04)) {
Add (Local0, 0x02, Local0)
Multiply (Local0, 0x1E, DMA0)
} Else {
If (LEqual (Local0, 0x04)) {
Store (0x2D, DMA0)
} Else {
If (LEqual (Local0, 0x05)) {
Store (0x1E, DMA0)
} Else {
If (LEqual (Local0, 0x06)) {
Store (0x14, DMA0)
} Else {
If (LEqual (Local0, 0x07)) {
Store (0x0F, DMA0)
} Else {
Store (PIO0, DMA0)
}
}
}
}
}
} Else {
Store (PIO0, DMA0)
}
If (And (Arg5, 0x40)) {
Or (CHNF, 0x04, CHNF)
And (Arg5, 0x07, Local0)
If (LLess (Local0, 0x04)) {
Add (Local0, 0x02, Local0)
Multiply (Local0, 0x1E, DMA1)
} Else {
If (LEqual (Local0, 0x04)) {
Store (0x2D, DMA1)
} Else {
If (LEqual (Local0, 0x05)) {
Store (0x1E, DMA1)
} Else {
If (LEqual (Local0, 0x06)) {
Store (0x14, DMA1)
} Else {
If (LEqual (Local0, 0x07)) {
Store (0x0F, DMA0)
} Else {
Store (PIO1, DMA1)
}
}
}
}
}
} Else {
Store (PIO1, DMA1)
}
Return (TMD0)
}
Method (STM, 0, Serialized) {
If (REGF) {}
Else { Return (0xFFFFFFFF) }
If (LEqual (PIO0, 0xFFFFFFFF)) {
Store (0xA8, Local1)
} Else {
And (Match (DerefOf (Index (TIM0, 0x00)),
MGE, PIO0, MTR,
0x00, 0x00),
0x07, Local0)
Store (DerefOf (Index (DerefOf (Index (TIM0, 0x04)), Local0)),
Local1)
}
ShiftLeft (Local1, 0x08, Local1)
If (LEqual (PIO1, 0xFFFFFFFF)) {
Or (Local1, 0xA8, Local1)
} Else {
And (Match (DerefOf (Index (TIM0, 0x00)), MGE, PIO1, MTR,
0x00, 0x00), 0x07, Local0)
Or (DerefOf (Index (DerefOf (Index (TIM0, 0x04)), Local0)),
Local1, Local1)
}
ShiftLeft (Local1, 0x08, Local1)
If (LEqual (DMA0, 0xFFFFFFFF)) {
Or (Local1, 0x03, Local1)
} Else {
If (And (CHNF, 0x01)) {
And (Match (DerefOf (Index (TIM0, 0x01)), MLE, DMA0, MTR,
0x00, 0x00), 0x07, Local0)
Or (DerefOf (Index (DerefOf (Index (TIM0, 0x05)), Local0)),
Local1, Local1)
} Else {
Or (Local1, 0x03, Local1)
}
}
ShiftLeft (Local1, 0x08, Local1)
If (LEqual (DMA1, 0xFFFFFFFF)) {
Or (Local1, 0x03, Local1)
} Else {
If (And (CHNF, 0x04)) {
And (Match (DerefOf (Index (TIM0, 0x01)), MLE, DMA1, MTR,
0x00, 0x00), 0x07, Local0)
Or (DerefOf (Index (DerefOf (Index (TIM0, 0x05)), Local0)),
Local1, Local1)
} Else {
Or (Local1, 0x03, Local1)
}
}
Return (Local1)
}
Name (AT01, Buffer (0x07) {
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF
})
Name (AT02, Buffer (0x07) {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90
})
Name (AT03, Buffer (0x07) {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6
})
Name (AT04, Buffer (0x07) {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91
})
Name (ATA0, Buffer (0x1D) {})
Name (ATA1, Buffer (0x1D) {})
Name (ATA2, Buffer (0x1D) {})
Name (ATA3, Buffer (0x1D) {})
Name (ATAB, Buffer (0x1D) {})
CreateByteField (ATAB, 0x00, CMDC)
Method (GTFB, 3, Serialized) {
Multiply (CMDC, 0x38, Local0)
Add (Local0, 0x08, Local1)
CreateField (ATAB, Local1, 0x38, CMDX)
Multiply (CMDC, 0x07, Local0)
CreateByteField (ATAB, Add (Local0, 0x02), A001)
CreateByteField (ATAB, Add (Local0, 0x06), A005)
Store (Arg0, CMDX)
Store (Arg1, A001)
Store (Arg2, A005)
Increment (CMDC)
}
Method (GTF, 2, Serialized) {
Store (Arg1, Debug)
Store (0x00, CMDC)
Name (ID49, 0x0C00)
Name (ID59, 0x00)
Name (ID53, 0x04)
Name (ID63, 0x0F00)
Name (ID88, 0x0F00)
Name (IRDY, 0x01)
Name (PIOT, 0x00)
Name (DMAT, 0x00)
If (LEqual (SizeOf (Arg1), 0x0200)) {
CreateWordField (Arg1, 0x62, IW49)
Store (IW49, ID49)
CreateWordField (Arg1, 0x6A, IW53)
Store (IW53, ID53)
CreateWordField (Arg1, 0x7E, IW63)
Store (IW63, ID63)
CreateWordField (Arg1, 0x76, IW59)
Store (IW59, ID59)
CreateWordField (Arg1, 0xB0, IW88)
Store (IW88, ID88)
}
Store (0xA0, Local7)
If (Arg0) {
Store (0xB0, Local7)
And (CHNF, 0x08, IRDY)
If (And (CHNF, 0x10)) {
Store (PIO1, PIOT)
} Else {
Store (PIO0, PIOT)
}
If (And (CHNF, 0x04)) {
If (And (CHNF, 0x10)) {
Store (DMA1, DMAT)
} Else {
Store (DMA0, DMAT)
}
} Else {
Store (PIO1, DMAT)
}
} Else {
And (CHNF, 0x02, IRDY)
Store (PIO0, PIOT)
If (And (CHNF, 0x01)) {
Store (DMA0, DMAT)
}
}
If (LAnd (LAnd (And (ID53, 0x04), And (ID88, 0xFF00)), DMAT)) {
Store (Match (DerefOf (Index (TIM0, 0x01)), MLE, DMAT, MTR,
0x00, 0x00), Local1)
If (LGreater (Local1, 0x06)) {
Store (0x06, Local1)
}
GTFB (AT01, Or (0x40, Local1), Local7)
} Else {
If (LAnd (And (ID63, 0xFF00), PIOT)) {
And (Match (DerefOf (Index (TIM0, 0x00)), MGE, PIOT, MTR,
0x00, 0x00), 0x07, Local0)
If (Local0) {
If (And (Local0, 0x04)) {
Store (0x02, Local0)
} Else {
Store (0x01, Local0)
}
}
Or (0x20, DerefOf (Index (DerefOf (Index (TIM0, 0x03)), Local0
)), Local1)
GTFB (AT01, Local1, Local7)
}
}
If (IRDY) {
And (Match (DerefOf (Index (TIM0, 0x00)), MGE, PIOT, MTR,
0x00, 0x00), 0x07, Local0)
Or (0x08, DerefOf (Index (DerefOf (Index (TIM0, 0x02)), Local0
)), Local1)
GTFB (AT01, Local1, Local7)
} Else {
If (And (ID49, 0x0400)) {
GTFB (AT01, 0x01, Local7)
}
}
If (LAnd (And (ID59, 0x0100), And (ID59, 0xFF))) {
GTFB (AT03, And (ID59, 0xFF), Local7)
}
Store (ATAB, Debug)
Return (ATAB)
}
Method (RATA, 1, NotSerialized) {
CreateByteField (Arg0, 0x00, CMDN)
Multiply (CMDN, 0x38, Local0)
CreateField (Arg0, 0x08, Local0, RETB)
Store (RETB, Debug)
Return (RETB)
}
}
Device (PMF) {
// ACPI smbus it should be 0x00040003 if 8131 present
Method (_ADR, 0, NotSerialized)
{
Return (DADD(\_SB.PCI0.SBDN, 0x00010003))
}
OperationRegion (BAR0, PCI_Config, 0x00, 0xff)
Field (BAR0, ByteAcc, NoLock, Preserve) {
Offset (0x56),
PIRA, 4,
PIRB, 4,
PIRC, 4,
PIRD, 4
}
//OperationRegion (TS3_, PCI_Config, 0xC4, 0x02)
//Field (TS3_, DWordAcc, NoLock, Preserve) {
// PTS3, 16
//}
}