修改DSDT使用原版SpeedStep降频节能技术
本帖最后由 pippo_choi 于 2009-11-29 16:28 编辑技术组威廉第三提示:
请大家注意一下,这个方法只适合core 2 duo/quad系列,不适合AMD的CPU,也不适合Intel i7系列CPU,i7的CPU可以通过BIOS选项直接开启Speedstep,不需要修改DSDT。
写在前面
今日中午闲来无事,于insanelymac看到篇修改DSDT使用原版SpeedStep的文章(原帖链接),遂粗翻一下,抛砖引玉,希望高手们对此方面加以更多关注。
※你需要符合你的设备的DSDT
※将你的DSDT.aml转换为.dsl格式,可使用iASLMe或其它方式进行双向转换
※你的SL能加载上AppleLPC(具体修改方法本坛会员Farx已发帖说明,链接在此),可使用IORegistryExplorer进行查看
※需要在SMBIOS.plist内修改你的计算机型号为MacPro3,1或MacPro4,1
※需要有手动修改DSDT的经验
所需工具
iASLMe
VoodooPState(包括VoodooPState.kext和PStateChanger)
注意:此贴涉及内容并不是简单复制粘贴即可,将会根据个人情况对部分内容作出修改,请勿直接套用别人的代码,以免造成问题与损害,文中涉及代码与工具可在本帖附件中下载。
修改方法
安装VoodooPState.kext,并确保加载上;
打开你的DSDT.dsl,找到“Scope (PR)”部分,将会看见如下代码
{
Scope (_PR)
{
Processor (CPU0, 0x00, 0x00000410, 0x06) {}
Processor (CPU1, 0x01, 0x00000410, 0x06) {}
Processor (CPU2, 0x02, 0x00000410, 0x06) {}
Processor (CPU3, 0x03, 0x00000410, 0x06) {}
}
/////// below removed 接下来把以下代码置于上述代码后 Scope (_PR.CPU0)
{
Method (_PSS, 0, NotSerialized)
{
Return (Package (0x0R)
{
Package (0x06)
{
Zero,
Zero,
0x10,
0x10,
0xSSSS, //PState 0(CPU最高频率挡)的FID、VID值
Zero //PState序列0
},
Package (0x06)
{
Zero,
Zero,
0x10,
0x10,
0xSSSS,//PState 1的FID、VID值
One // PState序列1
},
Package (0x06)
{
Zero,
Zero,
0x10,
0x10,
0xSSSS, //PState 2的FID、VID值
0x02 //PState序列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
}
})
}
}
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 ())
}
}
说明(对照下图理解):
若你的CPU为双核,则删除上述代码144行以后部分(CPU2、CPU3部分),4核无需;
R(上述代码第5行的0x0R)表示你的CPU可使用PState挡数,打开PStateChanger点击PState项,如图所示,此CPU可使用PState挡数为3挡,则R应改为3,若你的CPU为4挡则改为4,依此类推;
SSSS为该PState挡的FID(倍频)、VID(默认电压)值(不是10进制),如图PState0 FID值为08,VID值为20,则SSSS应为0820;
0xSSSS下面的Zero、One、0x02等表示该PState挡的序列,如PState0为Zero,PState1为One,PState2为0x02,PState3为0x03 ......依此类推自行修改;
你的CPU有几挡PState,则有几份如下代码Package (0x06)
{
Zero,
Zero,
0x10,
0x10,
0xSSSS, //FID、VID值
Zero // PState序列
}, 本文示例CPU的PState共3挡,则有3份,若你的CPU PState共4挡,则有4份,有6挡则为6份,相应的PState序列按照上述方法修改
http://www.insanelymac.com/forum/uploads/monthly_11_2009/post-275122-1258561690_thumb.png
按照此图,示例修改 Scope (_PR.CPU0)
{
Method (_PSS, 0, NotSerialized)
{
Return (Package (0x03)
{
Package (0x06)
{
Zero,
Zero,
0x10,
0x10,
0x0820, //PState 0(CPU最高频率挡)的FID、VID值
Zero // PState序列0
},
Package (0x06)
{
Zero,
Zero,
0x10,
0x10,
0x071B, //PState 1的FID、VID值
One // PState序列1
},
Package (0x06)
{
Zero,
Zero,
0x10,
0x10,
0x0616, //PState 2的FID、VID值
0x02 //PState序列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
}
})
}
}
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 ())
}
}写入.dsl位置示例* 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至此,.dsl文件修改完成,使用iASLMe编译为.aml文件,替换当前使用DSDT.aml,删除VoodooPState.kext,重启就可以使用原版SpeedStep了,使用VoodooMonitor可显示当前频率、可使用PState挡。
附文中使用工具:
我自己修改了dsdt测试了下,可实现与VoodooPState相同的6挡PState,使用VoodooMonitor查看正常变频,但电压值维持第一挡PState电压不变,不知道是VoodooMonitor显示错误,还是我这主板无法加载AppleHPET(修改DSDT HPET补丁无用)造成的,希望其他朋友使用后反馈下。 我在看那几篇英文帖子,看得头大...谢谢楼主 在IM论坛上的那篇原文,英文错别字特别多。。。晕。。。pb25
楼主有没发现? 4# pippo_choi 凑合看呗,意思到了就行 请问:通过修改DSDT的CPU频率部分,是否可以实现超频呢? 明天搞一下试试 感谢分享~~~~~~~~~~~~~~~ VoodooPState.kext加载不了到底是为什么? 恩,今天刚用加了 SSDT的方法改的DSDT,拿monitor一用,测试下 好久没来,一来就发现好东西,收下了,谢谢楼主 路过支持一个了楼主不得了呀 很好的教程。学习一下。 4个附件,就不能压缩成一个? 本帖最后由 轩楝 于 2009-11-27 10:00 编辑
不知道为什么,我总出错/Users/steveshi/Desktop/dsdt.dsl 28: Scope (_PR.CPU0)
Error 4065 - ^ Object not found or not accessible from scope (_PR.CPU0)
/Users/steveshi/Desktop/dsdt.dsl 28: Scope (_PR.CPU0)
Error 4089 - ^ Forward references from Scope operator not allowed (_PR.CPU0)
/Users/steveshi/Desktop/dsdt.dsl 112: Scope (_PR.CPU1)
Error 4065 - ^ Object not found or not accessible from scope (_PR.CPU1)
/Users/steveshi/Desktop/dsdt.dsl 112: Scope (_PR.CPU1)
Error 4089 - ^ Forward references from Scope operator not allowed (_PR.CPU1) 15# 轩楝
意思不是很明白吗?使用了非ASCII字符。
用什么软件来编辑dsl文件的?最好用BBEdit。 那么及时就翻译出来了,谢谢 16# Farx dsdtse,看样子这个软件不能用.. 请问谁能帮我一下吗? 不知道为什么,我总出错/Users/steveshi/Desktop/dsdt.dsl 28: Scope (_PR.CPU0)
Error 4065 - ^ Object not found or not accessible from scope (_PR.CPU0)
...
轩楝 发表于 2009-11-27 08:21 https://bbs.pcbeta.com/images/common/back.gif那个R值设了没?