黑苹果DSDT屏蔽独显方法教程整理

文章前言

此文来自zsy6271投稿整理发布到黑苹果乐园,文章介绍了如何通过DSDT屏蔽你的独显,比如在安装使用黑苹果的时候独显不被支持,或被定义为无解等原因而无法使用,BIOS又不能屏蔽,那就需要使用DSDT或者SSDT等进行屏蔽。

基本原理

在电脑开机时(对应_INI method)和睡眠唤醒时(对应_WAK method)调用关闭Nvidia独显的Method。

这个网站http://hybrid-graphics-linux.tuxfamily.org/index.php?title=ACPI_calls总结了关闭Nvidia显卡的常见methods,还列举了一些机型的具体情况,大家可以去看看,弄清楚自己电脑关闭显卡的method究竟是哪个,然后结合这个帖子来修改DSDT.

正如上面那个网站所示,关闭Nvidia独显一般有两种方法:一、使用 _DSM + _PS3;二、直接用_OFF(或者DOFF,SGOF等等,有些机型是不同的);

虽然上面那个网站一般都是直接调用OFF()函数来关闭独显的,但个人觉得如果有_DSM和_PS3的话,先使用方法一比较好,因为方法二可能会有一些影响,比如CPU变频的问题。(具体请看参考帖子[教程] 解决Optimus 和CPU Turbo 变频冲突)。

具体方法

很多人喜欢把SSDT的显卡部分移到DSDT中然后添加关闭独显的代码,并且开机DropOEMSSDT只用DSDT。但是我个人觉得这样子很麻烦,首先在移动过程中可能会产生错误,而且Drop掉SSDT后,DSDT中的那些External variables,methods就无法access了,因此DSDT中用到这些Objects,Methods的地方就会产生问题。如果Drop SSDT的目的是为了使用clover和变色龙的Generate P-States和C-States的话,clover可以只Drop掉有CPU信息的SSDT,变色龙可以把除有CPU信息的其他SSDT放在Extra目录下再DropSSDT,所以我认为完全没有必要花时间来移动显卡部分或者其他东西。如果DSDT和SSDT要相互调用对方的函数,那就在definition block那里加上External就好了。(如果新人看不懂这一段就跳过吧)说了那么多废话,终于开始了。

注意,在修改DSDT和SSDT之前,可以用这个帖子介绍的方法先生成dsl文件,可以减少错误,还有其他错误自己爬帖解决。不过如果你某个DSDT或SSDT有错误不能解决但你不需要再把它编译成AML文件的话,可以不用管它。

方法一:搜索函数

首先在DSDT和SSDT中搜索找到要用的函数_WAK,_INI,_PS3,_DSM。_WAK一般只有一个。_INI可能有很多个,最好用\_SB.PCI0下或\_SB.PCI0.PEG0.PEGP的。_PS3只有一个,如果没有的话看方法二。_DSM会有很多个,一定要用\_SB.PCI0.PEG0.PEGP下的,如果\_SB.PCI0.PEG0.PEGP下没有,搜索看看Device(GFX0)下有没有,如果都没有就看方法二.(注意,以下步骤是默认你DSDT的相关methods为一般情况,若有不同需根据你自己的DSDT做相应更改)

方法一:在_WAK之前新建一个Method PINI()

  1. Method (PINI, 0, NotSerialized)
  2.         {
  3.                 \_SB.PCI0.PEG0.PEGP._DSM (Buffer (0x10)
  4.             {
  5.                 /* 0000 */    0xF8, 0xD8, 0x86, 0xA4, 0xDA, 0x0B, 0x1B, 0x47,
  6.                 /* 0008 */    0xA7, 0x2B, 0x60, 0x42, 0xA6, 0xB5, 0xBE, 0xE0
  7.             }, 0x0100, 0x1A, Buffer (0x04)
  8.             {
  9.                 0x01, 0x00, 0x00, 0x03
  10.             })
  11.         \_SB.PCI0.PEG0.PEGP._PS3 ()
  12.         }

方法一:在_WAK和适当的_INI中调用PINI()

_WAK和_INI可能不在同一个DSDT或SSDT中,没有关系

  1. Method (_WAK, 1, Serialized)
  2.            {
  3.               PINI ()
  4.         ......
  5.           }
  6. [。。。省略。。。]
  7. Method (_INI, 0, NotSerialized)
  8.           {
  9.         PINI ()
  10.         .......
  11.           }

方法一:编译错误

如果有类似以下的错误

  1. Error Object does not exist (PINI)

在DefinitionBlock(在DSDT和SSDT的最上面)加上以下代码

  1. External(PINI, MethodObj)

方法一:错误修正示范:

  1. DefinitionBlock ("acpi_dsdt.aml""DSDT"1"LENOVO""CB-01   "0x00000001)
  2. {
  3.     External (_SB_.PCI0.PAUD.PUAM, MethodObj)    // Warning: Unresolved Method, guessing 0 arguments (may be incorrect, see warning above)
  4.     External (_SB_.PCI0.XHC_.DUAM, MethodObj)    // Warning: Unresolved Method, guessing 0 arguments (may be incorrect, see warning above)
  5.     External (_SB_.TPM_.PTS_, MethodObj)    // Warning: Unresolved Method, guessing 1 arguments (may be incorrect, see warning above)
  6.     External (_PR_.CFGD, FieldUnitObj)
  7.     External (_PR_.CPU0._PPC, IntObj)
  8.     External (_PR_.CPU0._PSS, PkgObj)
  9.     External (PINI, MethodObj)

如果错误提示Object does not exist (\_SB.PCI0.PEG0.PEGP._PS3)

在DefinitionBlock加上

  1. External(_SB_.PCI0.PEG0.PEGP._PS3, MethodObj)

如果错误提示Object does not exist (\_SB.PCI0.PEG0.PEGP._DSM)

在DefinitionBlock加上

  1. External(_SB_.PCI0.PEG0.PEGP._DSM, MethodObj)

方法一:保存编译

没有错误了,编译,save AML,把修改了的DSDT.aml, SSDT.aml和其他所以没有修改的SSDT*.aml放在Extra目录(变色龙),或patched文件夹(Clover),这样的话要DropSSDT。开机,幸运的话,Nvidia显卡应该被屏蔽了。

方法二:没有_PS3函数

如果没有_PS3函数,或者使用上面的方法没效果,那就试试这个方法吧。

在_WAK和适当的_INI里面加入\_SB.PCI0.PEG0.PEGP._OFF()

  1. Method (_WAK, 1, Serialized)
  2.            {
  3.               \_SB.PCI0.PEG0.PEGP._OFF()
  4.         ......
  5.           }
  6. [。。。省略。。。]
  7. Method (_INI, 0, NotSerialized)
  8.           {
  9.         \_SB.PCI0.PEG0.PEGP._OFF()
  10.         .......
  11.           }

方法二:编译错误

如果编译时有错误,像方法一的4中那样解决错误即可。

方法二:编译保存

没有错误了,编译,save AML,把修改了的DSDT.aml, SSDT.aml和其他所以没有修改的SSDT*.aml放在Extra目录(变色龙),或patched文件夹(Clover),这样的话要DropSSDT。开机,幸运的话,Nvidia显卡应该被屏蔽了。

查看是否生效

如何查看是否成功屏蔽Nvidia独显:打开“系统信息”→“图形卡/显示器”,若只有Intel显卡的信息就证明屏蔽成功。若成功了就支持一下吧!

文章总结

如果不成功的话把你的DSDT和SSDT文件发上来,看我能不能帮你。如果你还是想把显卡部分从SSDT移到DSDT却不知道怎么做,可以参照这个帖子的移动显卡部分的方法

发表评论

您必须登录才能发表评论!

目前评论:5   其中:访客  5   博主  0

  1. avatar shengdapc 5

    楼主扣扣1003279017 求帮助 告诉我你扣扣号我加你也行

  2. avatar wskypmypm 3

    请楼主帮忙反编译,我编译时出200多个错误
    http://pan.baidu.com/s/1c18KFdQ

  3. avatar p348707356 4

    有好多个Method _INI求教应该修改哪个

  4. avatar RmondJone 4

    太感谢了,这篇文章有用,拯救者I7按照这样改,省了好多事。温度顿时下来10℃

  5. avatar zsc_2015 4

    谢谢楼主分享啊,我的是双显卡,正找着屏蔽独显方法,希望能用上