This guide assumes you are already experienced in editing DSDT files.
Please DO NOT post full DSDT files in a code box. Please Post DSDT.dsl.zip files
Once you have extracted your DSDT.aml file you must decompile the file using IASLME. mitch_de has the most up to date version available here.
Now looking at your DSDT.dsl file we're going to edit the CPU part of 'Scope (PR)' which, unedited should look something like:
{
Scope (_PR)
{
Processor (CPU0, 0x00, 0x00000[color="#000000"]410[/color], 0x06) {}
Processor (CPU1, 0x01, 0x00000[color="#000000"]410[/color], 0x06) {}
Processor (CPU2, 0x02, 0x00000[color="#000000"]410[/color], 0x06) {}
Processor (CPU3, 0x03, 0x00000[color="#000000"]410[/color], 0x06) {}
}
/////// below removed
Note this is not a simple cut and paste job you are going to have to spend some time working out some of the data that's to be includeded in the P and C state code.
Ok - to the above code we will add this:
Note: Do Not copy and paste from the code box. This code is attached as a text file at the end of the post.
Scope (_PR.CPU0)
{
Method (_PSS, 0, NotSerialized)
{
Return (Package (0x0[b][color="#ff0000"]R[/color][/b])
{
Package (0x06)
{
Zero,
Zero,
0x10,
0x10,
0x[b][color="#ff0000"]SSSS[/color][/b], //FId/VID of p-state 0 (HIGHEST P-state)
Zero // p-state 0
},
Package (0x06)
{
Zero,
Zero,
0x10,
0x10,
0x[b][color="#ff0000"]SSSS[/color][/b], // FID/VID for p-state 1
One // p-state 1
},
Package (0x06)
{
Zero,
Zero,
0x10,
0x10,
0x[b][color="#ff0000"]SSSS[/color][/b], // FID/VID
0x02 //p-state 2
}
})
}
Method (_PSD, 0, NotSerialized)
{
Return (Package (0x05)
{
0x05,
Zero,
Zero,
0xFC,
0x04
})
}
Method (_CST, 0, NotSerialized)
{
Return (Package (0x02)
{
One,
Package (0x04)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x01, // Bit Width
0x02, // Bit Offset
0x0000000000000000, // Address
0x01, // Access Size
)
},
One,
0x9D,
0x03E8
}
})
}
}
Scope (_PR.CPU1)
{
Method (_PSS, 0, NotSerialized)
{
Return (^^CPU0._PSS ())
}
Method (_PSD, 0, NotSerialized)
{
Return (^^CPU0._PSD ())
}
Method (_CST, 0, NotSerialized)
{
Return (Package (0x04)
{
0x03,
Package (0x04)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x01, // Bit Width
0x02, // Bit Offset
0x0000000000000000, // Address
,)
},
One,
Zero,
0x03E8
},
Package (0x04)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x08, // Bit Width
0x00, // Bit Offset
0x0000000000000414, // Address
,)
},
0x02,
One,
0x01F4
},
Package (0x04)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x08, // Bit Width
0x00, // Bit Offset
0x0000000000000415, // Address
,)
},
0x03,
0x55,
0xFA
}
})
}
}
[color="#00ff00"]Scope (_PR.CPU2)
{
Method (_PSS, 0, NotSerialized)
{
Return (^^CPU0._PSS ())
}
Method (_PSD, 0, NotSerialized)
{
Return (^^CPU0._PSD ())
}
Method (_CST, 0, NotSerialized)
{
Return (^^CPU1._CST ())
}
}
Scope (_PR.CPU3)
{
Method (_PSS, 0, NotSerialized)
{
Return (^^CPU0._PSS ())
}
Method (_PSD, 0, NotSerialized)
{
Return (^^CPU0._PSD ())
}
Method (_CST, 0, NotSerialized)
{
Return (^^CPU1._CST ())
}
}[/color]
Obviously the above is for a quad core CPU with 3 p-states defined.
For a Dual core CPu you would need to remove the section highlighted in green.
You may also have to define more than 3 p-states but we'll get to that shortly.
You will see there are various values highlighted in red.
Firstly - R
R needs to be replaced with the number of p-states you have defined so in this case 3 p-states are defined so R would be replaced with 3, with 4 p-states defined R is repaced with 4 and so on.
The values represented above by S are a combination of FID and VID. There is a good explanation of FID and VID values here .
For ease we'll find these values using voodoopstate.kext and pstatechanger both linked at the end of this post.
Install the kext reboot and run pstatechanger,
changer.png 16K
1622 downloadsYou can see I have 3 p-states, you may have more. So from this you can see for my 0 p-state I should have a FID of 08 and a VID of 20.
Adding this to the Mehtod _PSS partf of the code like so:
Scope (_PR.CPU0)
{
Method (_PSS, 0, NotSerialized)
{
Return (Package (0x03)
{
Package (0x06)
{
Zero,
Zero,
0x0A,
0x0A,
0x0820,
Zero
},
Repeat for each p-state, so again in my case I end up with:
Scope (_PR.CPU0)
{
Method (_PSS, 0, NotSerialized)
{
Return (Package (0x03)
{
Package (0x06)
{
Zero,
Zero,
0x0A,
0x0A,
0x0820,
Zero
},
Package (0x06)
{
Zero,
Zero,
0x0A,
0x0A,
0x071B,
One
},
Package (0x06)
{
Zero,
Zero,
0x0A,
0x0A,
0x0616,
0x02
}
})
}
Method (_PSD, 0, NotSerialized)
{
Return (Package (0x05)
{
0x05,
Zero,
Zero,
0xFC,
0x04
})
}
Method (_CST, 0, NotSerialized)
{
Return (Package (0x02)
{
One,
Package (0x04)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x01, // Bit Width
0x02, // Bit Offset
0x0000000000000000, // Address
0x01, // Access Size
)
},
One,
0x9D,
0x03E8
}
})
}
}
Scope (_PR.CPU1)
{
Method (_PSS, 0, NotSerialized)
{
Return (^^CPU0._PSS ())
}
Method (_PSD, 0, NotSerialized)
{
Return (^^CPU0._PSD ())
}
Method (_CST, 0, NotSerialized)
{
Return (Package (0x04)
{
0x03,
Package (0x04)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x01, // Bit Width
0x02, // Bit Offset
0x0000000000000000, // Address
,)
},
One,
Zero,
0x03E8
},
Package (0x04)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x08, // Bit Width
0x00, // Bit Offset
0x0000000000000414, // Address
,)
},
0x02,
One,
0x01F4
},
Package (0x04)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x08, // Bit Width
0x00, // Bit Offset
0x0000000000000415, // Address
,)
},
0x03,
0x55,
0xFA
}
})
}
}
Scope (_PR.CPU2)
{
Method (_PSS, 0, NotSerialized)
{
Return (^^CPU0._PSS ())
}
Method (_PSD, 0, NotSerialized)
{
Return (^^CPU0._PSD ())
}
Method (_CST, 0, NotSerialized)
{
Return (^^CPU1._CST ())
}
}
Scope (_PR.CPU3)
{
Method (_PSS, 0, NotSerialized)
{
Return (^^CPU0._PSS ())
}
Method (_PSD, 0, NotSerialized)
{
Return (^^CPU0._PSD ())
}
Method (_CST, 0, NotSerialized)
{
Return (^^CPU1._CST ())
}
}
This code can now be added to your DSDT.dsl file, placed under your CPU part of Scope (_PR) like so:
* Compiler Version 0x20091112 (537465106)
*/
DefinitionBlock ("/Users/Dave/Desktop/DSDT.aml", "DSDT", 1, "GBT ", "GBTUACPI", 0x00001000)
{
Scope (_PR)
{
Processor (CPU0, 0x00, 0x00000410, 0x06) {}
Processor (CPU1, 0x01, 0x00000410, 0x06) {}
Processor (CPU2, 0x02, 0x00000410, 0x06) {}
Processor (CPU3, 0x03, 0x00000410, 0x06) {}
}
Scope (_PR.CPU0)
{
Method (_PSS, 0, NotSerialized)
{
Return (Package (0x03)
{
Package (0x06)
{
Zero,
Zero,
0x0A,
0x0A,
0x0820,
Zero
},
Package (0x06)
{
Zero,
Zero,
0x0A,
0x0A,
0x071B,
One
},
Package (0x06)
{
Zero,
Zero,
0x0A,
0x0A,
0x0616,
0x02
}
})
}
Method (_PSD, 0, NotSerialized)
{
Return (Package (0x05)
{
0x05,
Zero,
Zero,
0xFC,
0x04
})
}
Method (_CST, 0, NotSerialized)
{
Return (Package (0x02)
{
One,
Package (0x04)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x01, // Bit Width
0x02, // Bit Offset
0x0000000000000000, // Address
0x01, // Access Size
)
},
One,
0x9D,
0x03E8
}
})
}
}
Scope (_PR.CPU1)
{
Method (_PSS, 0, NotSerialized)
{
Return (^^CPU0._PSS ())
}
Method (_PSD, 0, NotSerialized)
{
Return (^^CPU0._PSD ())
}
Method (_CST, 0, NotSerialized)
{
Return (Package (0x04)
{
0x03,
Package (0x04)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x01, // Bit Width
0x02, // Bit Offset
0x0000000000000000, // Address
,)
},
One,
Zero,
0x03E8
},
Package (0x04)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x08, // Bit Width
0x00, // Bit Offset
0x0000000000000414, // Address
,)
},
0x02,
One,
0x01F4
},
Package (0x04)
{
ResourceTemplate ()
{
Register (FFixedHW,
0x08, // Bit Width
0x00, // Bit Offset
0x0000000000000415, // Address
,)
},
0x03,
0x55,
0xFA
}
})
}
}
Scope (_PR.CPU2)
{
Method (_PSS, 0, NotSerialized)
{
Return (^^CPU0._PSS ())
}
Method (_PSD, 0, NotSerialized)
{
Return (^^CPU0._PSD ())
}
Method (_CST, 0, NotSerialized)
{
Return (^^CPU1._CST ())
}
}
Scope (_PR.CPU3)
{
Method (_PSS, 0, NotSerialized)
{
Return (^^CPU0._PSS ())
}
Method (_PSD, 0, NotSerialized)
{
Return (^^CPU0._PSD ())
}
Method (_CST, 0, NotSerialized)
{
Return (^^CPU1._CST ())
}
}
Name (_S0, Package (0x04)
{
Zero,
Zero,
Zero,
Zero
})
Name (SS1, Package (0x04)
// rest of DSDT removed
Now if in ioreg you DO NOT see AppleLPC then you will nedd to also patch this decive.
Run lspci Tools and look for ISA device - something like:
00:1f.0 ISA bridge [0601]: Intel Corporation Unknown device [8086:3a16]
You can see in red the memory address in this case (and I think most cases.) is 001F0000.
Search your DSDT for 001F0000 to find the device. For my GigaByte MB this is a device PX40. For ease I have renamed the device LPCB - remember to change all instances of PX40 to LPCB.
So using zhell's DSDT device id trick you can add any device id that exists in the AppleLPC.kext plist. Probably best to go for an id closest to you actual device id. (in this case MB device id is [8086:3a16] so form the AppleLPC.kext there is device id 3A18 so my Device (LPCB) formerly PX40 now looks like this:
Device (LPCB)
{
Name (_ADR, 0x001F0000)
Method (_DSM, 4, NotSerialized)
{
Store (Package (0x02)
{
"device-id",
Buffer (0x04)
{
0x18, 0x3A, 0x00, 0x00
}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
}
OperationRegion (PREV, PCI_Config, 0x08, One)
Scope (\)
{
Field (\_SB.PCI0.LPCB.PREV, ByteAcc, NoLock, Preserve)
{
REV0, 8
}
}
OperationRegion (PIRQ, PCI_Config, 0x60, 0x04)
Scope (\)
{
// remainder removed
Recomplile the DSDT.dsl to DSDT.aml using IASLME - fingers crossed no errors - and your done!
Please NOTE: AppleLPC.kext will give you the 'Automatic restart after power failure' option in power savings. This option needs to be checked for sleep!
This works for me with the model identifyer set to MacPro3,1 and MacPro4,1. If you want to use a none native model identifyer then you'll need to use Master Chiefs Legacy SMC kext that can be found in post #381 here You will need to edit the plist adding your custom model identifyer.
You DO NOT need to add dropSSDT=y as boot argument and or change acpi_smc_platformplugin.kext
No need for disabler and don't forget to remove the voodoopstate.kext.
This will give vanilla stepping and remove any _cst evaluation errors at boot. and may (if you're lucky.) enable c-states
Here is the generic Scope (_PR)
GenericScopePR.zip 590bytes
2879 downloadsAnd here is my
DSDT17_11_09.zip 12.69K
1903 downloads for reference.
PStateChangerv1.0.3__1_.zip 60.31K
4191 downloads
voodoopstate.v4.zip 45.07K
3730 downloadsVoodoomonitor
Further reading:
zhell's DSDT Trick
mackerintel chameleon with DSDT override
fassl DSDT patcher
koalala ACPI patcher
ab__73's chameleon bootloader SSDT and DSDT override
EVO's DSDT - Very useful nOOb DSDT tool !
www.acpi.info/DOWNLOADS/ACPIspec40.pdf
Credit to mm67 and Master Chief for the generic Scope (_PR)
bcc9 and hnak for Voodoopstate.kext
and to kdawg, beerkex'd, keeza, THe KiNG ... ALL who've help out on this in one way or another - too many to mention.
Enjoy
D.



Sign In
Create Account










