venicehuang 发表于 2009-11-26 22:44

修改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挡。

附文中使用工具:


venicehuang 发表于 2009-11-26 22:56

我自己修改了dsdt测试了下,可实现与VoodooPState相同的6挡PState,使用VoodooMonitor查看正常变频,但电压值维持第一挡PState电压不变,不知道是VoodooMonitor显示错误,还是我这主板无法加载AppleHPET(修改DSDT HPET补丁无用)造成的,希望其他朋友使用后反馈下。

轩楝 发表于 2009-11-26 22:58

我在看那几篇英文帖子,看得头大...谢谢楼主

pippo.choi 发表于 2009-11-26 23:05

在IM论坛上的那篇原文,英文错别字特别多。。。晕。。。pb25

楼主有没发现?

venicehuang 发表于 2009-11-26 23:10

4# pippo_choi 凑合看呗,意思到了就行

johnny_sun 发表于 2009-11-26 23:11

请问:通过修改DSDT的CPU频率部分,是否可以实现超频呢?

mlhan 发表于 2009-11-26 23:12

明天搞一下试试

likefeel 发表于 2009-11-26 23:38

感谢分享~~~~~~~~~~~~~~~

xiaoimi 发表于 2009-11-27 01:27

VoodooPState.kext加载不了到底是为什么?

wanghover 发表于 2009-11-27 03:39

恩,今天刚用加了 SSDT的方法改的DSDT,拿monitor一用,测试下

zhangxzhang 发表于 2009-11-27 05:12

好久没来,一来就发现好东西,收下了,谢谢楼主

小哥仔 发表于 2009-11-27 05:15

路过支持一个了楼主不得了呀

Farx 发表于 2009-11-27 06:35

很好的教程。学习一下。

idream 发表于 2009-11-27 08:09

4个附件,就不能压缩成一个?

轩楝 发表于 2009-11-27 08:21

本帖最后由 轩楝 于 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)

Farx 发表于 2009-11-27 08:44

15# 轩楝


意思不是很明白吗?使用了非ASCII字符。
用什么软件来编辑dsl文件的?最好用BBEdit。

leizhihui 发表于 2009-11-27 08:59

那么及时就翻译出来了,谢谢

轩楝 发表于 2009-11-27 09:03

16# Farx dsdtse,看样子这个软件不能用..

轩楝 发表于 2009-11-27 10:01

请问谁能帮我一下吗?

pippo.choi 发表于 2009-11-27 11:53

不知道为什么,我总出错/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值设了没?
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 修改DSDT使用原版SpeedStep降频节能技术