基本原理
在电脑开机时(对应_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()
Method (PINI, 0, NotSerialized) { \_SB.PCI0.PEG0.PEGP._DSM (Buffer (0x10) { /* 0000 */ 0xF8, 0xD8, 0x86, 0xA4, 0xDA, 0x0B, 0x1B, 0x47, /* 0008 */ 0xA7, 0x2B, 0x60, 0x42, 0xA6, 0xB5, 0xBE, 0xE0 }, 0x0100, 0x1A, Buffer (0x04) { 0x01, 0x00, 0x00, 0x03 }) \_SB.PCI0.PEG0.PEGP._PS3 () }
方法一:在_WAK和适当的_INI中调用PINI()
_WAK和_INI可能不在同一个DSDT或SSDT中,没有关系Method (_WAK, 1, Serialized) { PINI () ...... } [。。。省略。。。] Method (_INI, 0, NotSerialized) { PINI () ....... }
方法一:编译错误
如果有类似以下的错误- Error Object does not exist (PINI)
- External(PINI, MethodObj)
方法一:错误修正示范:
DefinitionBlock ("acpi_dsdt.aml", "DSDT", 1, "LENOVO", "CB-01 ", 0x00000001) { External (_SB_.PCI0.PAUD.PUAM, MethodObj) // Warning: Unresolved Method, guessing 0 arguments (may be incorrect, see warning above) External (_SB_.PCI0.XHC_.DUAM, MethodObj) // Warning: Unresolved Method, guessing 0 arguments (may be incorrect, see warning above) External (_SB_.TPM_.PTS_, MethodObj) // Warning: Unresolved Method, guessing 1 arguments (may be incorrect, see warning above) External (_PR_.CFGD, FieldUnitObj) External (_PR_.CPU0._PPC, IntObj) External (_PR_.CPU0._PSS, PkgObj) External (PINI, MethodObj)
如果错误提示Object does not exist (\_SB.PCI0.PEG0.PEGP._PS3)
在DefinitionBlock加上
- External(_SB_.PCI0.PEG0.PEGP._PS3, MethodObj)
在DefinitionBlock加上
- 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()
Method (_WAK, 1, Serialized) { \_SB.PCI0.PEG0.PEGP._OFF() ...... } [。。。省略。。。] Method (_INI, 0, NotSerialized) { \_SB.PCI0.PEG0.PEGP._OFF() ....... }
方法二:编译错误
如果编译时有错误,像方法一的4中那样解决错误即可。方法二:编译保存
没有错误了,编译,save AML,把修改了的DSDT.aml, SSDT.aml和其他所以没有修改的SSDT*.aml放在Extra目录(变色龙),或patched文件夹(Clover),这样的话要DropSSDT。开机,幸运的话,Nvidia显卡应该被屏蔽了。查看是否生效
如何查看是否成功屏蔽Nvidia独显:打开“系统信息”→“图形卡/显示器”,若只有Intel显卡的信息就证明屏蔽成功。若成功了就支持一下吧!文章总结
如果不成功的话把你的DSDT和SSDT文件发上来,看我能不能帮你。如果你还是想把显卡部分从SSDT移到DSDT却不知道怎么做,可以参照这个帖子的移动显卡部分的方法。 收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2305
- 用户1336
- 访客11455538
每日一句
Talent without working hard is nothing.
没有努力,天份不代表什么。
没有努力,天份不代表什么。
MySQL 数据库优化
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de
免ROOT实现模拟点击任意位置
Mobaxterm终端神器
CreateProcessW要注意的细节问题
Autonomous NAT Traversal
【教程】win10 彻底卸载edge浏览器
eclipse工程基于Xposed的一个简单Hook
排名前5的开源在线机器学习
Mac OS最简单及(Karabiner)快捷键设置
发一款C++编写的麻将
VMware NAT端口映射外网访问虚拟机linux
独家发布最新可用My-AutoPost——wordpress 采集器
新会员