First post. Huzzah.
Anyhoo... I've got an Asus P8P67 Pro. There's an issue with the onboard eSATA ports (Jmicron JMB362 powered), whereby the Asus BIOS/UEFI only allows "enabled" or "disabled" for that particular controller, and unfortunately "enabled" really means "legacy IDE". There is no BIOS option to start it in true AHCI mode.
I have been successful using the controller in Snow Leopard by getting Apple's AHCI driver to attach itself to the controller even though it is in legacy IDE mode, and then switching the controller to AHCI mode by brute force, by setting the PCI registers with setpci.
Once done, the eSATA ports work like a charm, including hot-swapping and all AHCI eSATA goodness.
What I'd like to do now is get this change done in DSDT, and I need some help if you've got the time! :-)
Here is the relevant code from my stock clean DSDT:
Device (JMB0)
{
Name (_ADR, 0x00020000)
OperationRegion (CF40, PCI_Config, 0x40, 0x04)
Field (CF40, ByteAcc, NoLock, Preserve)
{
CHE0, 1,
MULT, 1,
, 1,
CAB0, 1,
CHE1, 1,
Offset (0x01),
AHEN, 1,
, 3,
PRT0, 1,
AHM0, 1,
PRT1, 1,
AHM1, 1,
CF42, 6,
SWAP, 1,
PATA, 1,
, 6,
WTEN, 1,
Offset (0x04)
}
Name (PIOT, Package (0x05)
{
0x0258,
0x0186,
0x014A,
0xB4,
0x78
})
Name (UDMA, Package (0x07)
{
0x78,
0x50,
0x3C,
0x28,
0x1E,
0x14,
0x0F
})
Name (MDMA, Package (0x03)
{
0x01E0,
0x96,
0x78
})
Name (IDEB, Buffer (0x14) {})
CreateDWordField (IDEB, Zero, GTM0)
CreateDWordField (IDEB, 0x04, GTM1)
CreateDWordField (IDEB, 0x08, GTM2)
CreateDWordField (IDEB, 0x0C, GTM3)
CreateDWordField (IDEB, 0x10, GTM4)
Name (PIO0, 0x04)
Name (DMA0, 0x06)
Name (MDA0, 0x02)
Name (PIO1, 0x04)
Name (DMA1, 0x06)
Name (MDA1, 0x02)
Name (PIO2, 0x04)
Name (DMA2, 0x06)
Name (MDA2, 0x02)
Name (PIO3, 0x04)
Name (DMA3, 0x06)
Name (MDA3, 0x02)
Name (FLGP, 0x1F)
Name (FLGS, 0x1F)
Device (IDE0)
{
Name (_ADR, Zero)
Method (_GTM, 0, NotSerialized)
{
Store (DerefOf (Index (PIOT, PIO0)), Local0)
Store (DerefOf (Index (PIOT, PIO1)), Local2)
Store (0x1A, Local4)
If (LAnd (FLGP, One))
{
If (LNot (MULT))
{
If (LAnd (CAB0, SWAP))
{
Store (0x02, DMA0)
}
}
Store (DerefOf (Index (UDMA, DMA0)), Local1)
Or (Local4, One, Local4)
}
Else
{
Store (DerefOf (Index (MDMA, MDA0)), Local1)
}
If (LAnd (FLGP, 0x04))
{
If (LAnd (CAB0, SWAP))
{
Store (0x02, DMA1)
}
Store (DerefOf (Index (UDMA, DMA1)), Local3)
Or (Local4, 0x04, Local4)
}
Else
{
Store (DerefOf (Index (MDMA, MDA1)), Local3)
}
Store (Local0, GTM0)
Store (Local1, GTM1)
Store (Local2, GTM2)
Store (Local3, GTM3)
Store (Local4, GTM4)
Return (IDEB)
}
Method (_STM, 3, NotSerialized)
{
Store (Arg0, IDEB)
Store (GTM0, Local0)
Store (GTM1, Local1)
Store (GTM2, Local2)
Store (GTM3, Local3)
Store (GTM4, Local4)
Store (Local4, FLGP)
If (LAnd (LNotEqual (Local0, 0xFFFFFFFF), LNotEqual (Local0, Zero)))
{
Store (Match (PIOT, MEQ, Local0, MTR, Zero, Zero), PIO0)
}
If (LAnd (LNotEqual (Local1, 0xFFFFFFFF), LNotEqual (Local1, Zero)))
{
If (LAnd (FLGP, One))
{
Store (Match (UDMA, MEQ, Local1, MTR, Zero, Zero), DMA0)
}
Else
{
Store (Match (MDMA, MEQ, Local1, MTR, Zero, Zero), MDA0)
}
}
If (LAnd (LNotEqual (Local2, 0xFFFFFFFF), LNotEqual (Local2, Zero)))
{
Store (Match (PIOT, MEQ, Local2, MTR, Zero, Zero), PIO1)
}
If (LAnd (LNotEqual (Local3, 0xFFFFFFFF), LNotEqual (Local3, Zero)))
{
If (LAnd (FLGP, 0x04))
{
Store (Match (UDMA, MEQ, Local3, MTR, Zero, Zero), DMA1)
}
Else
{
Store (Match (MDMA, MEQ, Local3, MTR, Zero, Zero), MDA1)
}
}
}
Device (DRV0)
{
Name (_ADR, Zero)
Method (_GTF, 0, NotSerialized)
{
Store (Buffer (0x07)
{
0x03, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xEF
}, Local0)
Store (Buffer (0x07)
{
0x03, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xEF
}, Local1)
CreateByteField (Local0, One, PIOM)
CreateByteField (Local1, One, DMAM)
Store (PIO0, PIOM)
Or (PIOM, 0x08, PIOM)
If (LAnd (FLGP, One))
{
Store (DMA0, DMAM)
Or (DMAM, 0x40, DMAM)
}
Else
{
Store (MDA0, DMAM)
Or (DMAM, 0x20, DMAM)
}
Concatenate (Local0, Local1, Local2)
Return (Local2)
}
}
Device (DRV1)
{
Name (_ADR, One)
Method (_GTF, 0, NotSerialized)
{
Store (Buffer (0x07)
{
0x03, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xEF
}, Local0)
Store (Buffer (0x07)
{
0x03, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xEF
}, Local1)
CreateByteField (Local0, One, PIOM)
CreateByteField (Local1, One, DMAM)
Store (PIO1, PIOM)
Or (PIOM, 0x08, PIOM)
If (LAnd (FLGP, 0x04))
{
Store (DMA1, DMAM)
Or (DMAM, 0x40, DMAM)
}
Else
{
Store (MDA1, DMAM)
Or (DMAM, 0x20, DMAM)
}
Concatenate (Local0, Local1, Local2)
Return (Local2)
}
}
}
Device (IDE1)
{
Name (_ADR, One)
Method (_GTM, 0, NotSerialized)
{
Store (DerefOf (Index (PIOT, PIO2)), Local0)
Store (DerefOf (Index (PIOT, PIO3)), Local2)
Store (0x1A, Local4)
If (LAnd (FLGS, One))
{
If (LNot (MULT))
{
If (LAnd (CAB0, LNot (SWAP)))
{
Store (0x02, DMA2)
}
}
Store (DerefOf (Index (UDMA, DMA2)), Local1)
Or (Local4, One, Local4)
}
Else
{
Store (DerefOf (Index (MDMA, MDA2)), Local1)
}
If (LAnd (FLGS, 0x04))
{
If (LAnd (CAB0, LNot (SWAP)))
{
Store (0x02, DMA3)
}
Store (DerefOf (Index (UDMA, DMA3)), Local3)
Or (Local4, 0x04, Local4)
}
Else
{
Store (DerefOf (Index (MDMA, MDA3)), Local3)
}
Store (Local0, GTM0)
Store (Local1, GTM1)
Store (Local2, GTM2)
Store (Local3, GTM3)
Store (Local4, GTM4)
Return (IDEB)
}
Method (_STM, 3, NotSerialized)
{
Store (Arg0, IDEB)
Store (GTM0, Local0)
Store (GTM1, Local1)
Store (GTM2, Local2)
Store (GTM3, Local3)
Store (GTM4, Local4)
Store (Local4, FLGS)
If (LAnd (LNotEqual (Local0, 0xFFFFFFFF), LNotEqual (Local0, Zero)))
{
Store (Match (PIOT, MEQ, Local0, MTR, Zero, Zero), PIO2)
}
If (LAnd (LNotEqual (Local1, 0xFFFFFFFF), LNotEqual (Local1, Zero)))
{
If (LAnd (FLGS, One))
{
Store (Match (UDMA, MEQ, Local1, MTR, Zero, Zero), DMA2)
}
Else
{
Store (Match (MDMA, MEQ, Local1, MTR, Zero, Zero), MDA2)
}
}
If (LAnd (LNotEqual (Local2, 0xFFFFFFFF), LNotEqual (Local2, Zero)))
{
Store (Match (PIOT, MEQ, Local2, MTR, Zero, Zero), PIO3)
}
If (LAnd (LNotEqual (Local3, 0xFFFFFFFF), LNotEqual (Local3, Zero)))
{
If (LAnd (FLGS, 0x04))
{
Store (Match (UDMA, MEQ, Local3, MTR, Zero, Zero), DMA3)
}
Else
{
Store (Match (MDMA, MEQ, Local3, MTR, Zero, Zero), MDA3)
}
}
}
Device (DRV0)
{
Name (_ADR, Zero)
Method (_GTF, 0, NotSerialized)
{
Store (Buffer (0x07)
{
0x03, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xEF
}, Local0)
Store (Buffer (0x07)
{
0x03, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xEF
}, Local1)
CreateByteField (Local0, One, PIOM)
CreateByteField (Local1, One, DMAM)
Store (PIO2, PIOM)
Or (PIOM, 0x08, PIOM)
If (LAnd (FLGS, One))
{
Store (DMA2, DMAM)
Or (DMAM, 0x40, DMAM)
}
Else
{
Store (MDA2, DMAM)
Or (DMAM, 0x20, DMAM)
}
Concatenate (Local0, Local1, Local2)
Return (Local2)
}
}
Device (DRV1)
{
Name (_ADR, One)
Method (_GTF, 0, NotSerialized)
{
Store (Buffer (0x07)
{
0x03, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xEF
}, Local0)
Store (Buffer (0x07)
{
0x03, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xEF
}, Local1)
CreateByteField (Local0, One, PIOM)
CreateByteField (Local1, One, DMAM)
Store (PIO3, PIOM)
Or (PIOM, 0x08, PIOM)
If (LAnd (FLGS, 0x04))
{
Store (DMA3, DMAM)
Or (DMAM, 0x40, DMAM)
}
Else
{
Store (MDA3, DMAM)
Or (DMAM, 0x20, DMAM)
}
Concatenate (Local0, Local1, Local2)
Return (Local2)
}
}
}
}
There is another identical JMB1 entry, with a slightly different address at the header.
The setpci command once booted up is setpci -s 05:0.0 40.b=b3 41.b=a1 42.b=c2
What should I replace or append/insert into the DSDT code?



Sign In
Create Account











