Guys,
I'm done with CoolBook which has not been updated for a while and the latest version 2.14 doesn't support my Mac Mini 2.26. So I decided to look around to see if there is any open source SpeedStep driver.
And I found xnu-speedstep.
It was stated that undervolt function was implemented but I find that the kext has some problem remembering the user defined voltage.
I decided to modify the kext FOR MY OWN CPU.
I ran CPUTest to load up the CPUs and undervolted from 1.175V to 0.975V and let it run for a while.
0.95V would give kernel panic immediately.
Then I rewrote the Auto-throttle section to disable frequency stepping and fix the frequency at the highest and undervolt. Basically everytime the timer runs it checks if the voltage and frequency is correct and recorrect if neccesary.
The compiled kext would
1) fix the CPU at the highest frequency
2) fix the voltage at 0.975V
At full load the power consumption is lowered from 14W to just 9W.
If you are certain your CPU can run at 0.975V, try using it at your own risk.
The kext doesn't give consistent readings via sysctl. The debugger message loads the register directly from the CPU and confirms the buggy sysctl interface.
Here is how the hex digits are read:
815 in binary is 1000 0001 0101
First 4 bits represent the frequency ID (multiplier). You would notice that the kext truncates the half multiplier.
FID = 8
8 X 266 = 2128
Next 8 bit represent the voltage ID
VID = 21
Voltage = 21 X 125 + 7125 = 10000 --> 1000mV
This is basically it. I could not think of anything else to post here at the moment.
I'm done with CoolBook which has not been updated for a while and the latest version 2.14 doesn't support my Mac Mini 2.26. So I decided to look around to see if there is any open source SpeedStep driver.
And I found xnu-speedstep.
It was stated that undervolt function was implemented but I find that the kext has some problem remembering the user defined voltage.
I decided to modify the kext FOR MY OWN CPU.
I ran CPUTest to load up the CPUs and undervolted from 1.175V to 0.975V and let it run for a while.
0.95V would give kernel panic immediately.
Then I rewrote the Auto-throttle section to disable frequency stepping and fix the frequency at the highest and undervolt. Basically everytime the timer runs it checks if the voltage and frequency is correct and recorrect if neccesary.
The compiled kext would
1) fix the CPU at the highest frequency
2) fix the voltage at 0.975V
At full load the power consumption is lowered from 14W to just 9W.
If you are certain your CPU can run at 0.975V, try using it at your own risk.
If not, edit the attached XCode project.Copy kext to /System/Library/Extensions/
Run the following in terminal to change permissions and load kext
chown -R root /System/Library/Extensions/IntelEnhancedSpeedStep.kext
chmod -R 755 /System/Library/Extensions/IntelEnhancedSpeedStep.kext
kextunload /System/Library/Extensions/IntelEnhancedSpeedStep.kext
kextload /System/Library/Extensions/IntelEnhancedSpeedStep.kext
dmesg | grep IntelEnhancedSpeedStep
sysctl -a | grep throttle
The kext doesn't give consistent readings via sysctl. The debugger message loads the register directly from the CPU and confirms the buggy sysctl interface.
dmesg | grep IntelEnhancedSpeedStep
IntelEnhancedSpeedStep: DBG Autothrottle: CPU load 1000 /10 pc
IntelEnhancedSpeedStep: DBG Starting throttle with CTL 0x815
IntelEnhancedSpeedStep: DBG Throttle done.
IntelEnhancedSpeedStep: DBG Autothrottle: CPU load 1000 /10 pc
IntelEnhancedSpeedStep: DBG Starting throttle with CTL 0x815
IntelEnhancedSpeedStep: DBG Throttle done.
IntelEnhancedSpeedStep: DBG Autothrottle: CPU load 1000 /10 pc
IntelEnhancedSpeedStep: DBG Starting throttle with CTL 0x815
IntelEnhancedSpeedStep: DBG Throttle done.
IntelEnhancedSpeedStep: DBG Autothrottle: CPU load 1000 /10 pc
IntelEnhancedSpeedStep: DBG Starting throttle with CTL 0x815
IntelEnhancedSpeedStep: DBG Throttle done.
IntelEnhancedSpeedStep: DBG Autothrottle: CPU load 1000 /10 pc
IntelEnhancedSpeedStep: DBG Starting throttle with CTL 0x815
Here is how the hex digits are read:
815 in binary is 1000 0001 0101
First 4 bits represent the frequency ID (multiplier). You would notice that the kext truncates the half multiplier.
FID = 8
8 X 266 = 2128
Next 8 bit represent the voltage ID
VID = 21
Voltage = 21 X 125 + 7125 = 10000 --> 1000mV
This is basically it. I could not think of anything else to post here at the moment.