屏蔽Optimus技术的Nvidia独显
本帖最后由 liankaohk 于 2014-5-2 21:29 编辑手贱编辑了一次,很多东西都不见了{:9_419:},不想再码那么多字了,就只写一些重点内容吧。
为什么要屏蔽:自己百度或Google
基本原理:在电脑开机时(对应_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文件的话,可以不用管它。
方法一:
1.首先在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做相应更改)
2.在_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 ()
}
3.在_WAK和适当的_INI中调用PINI()。_WAK和_INI可能不在同一个DSDT或SSDT中,没有关系
Method (_WAK, 1, Serialized)
{
PINI ()
......
}
[。。。省略。。。]
Method (_INI, 0, NotSerialized)
{
PINI ()
.......
} 4.编译,如果有类似“Error Object does not exist (PINI)”的错误
若Object does not exist (PINI)
在DefinitionBlock(在DSDT和SSDT的最上面)加上
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)若Object does not exist (\_SB.PCI0.PEG0.PEGP._DSM)
在DefinitionBlock加上
External(_SB_.PCI0.PEG0.PEGP._DSM, MethodObj) 5.没有错误了,编译,save AML,把修改了的DSDT.aml, SSDT.aml和其他所以没有修改的SSDT*.aml放在Extra目录(变色龙),或patched文件夹(Clover),这样的话要DropSSDT。开机,幸运的话,Nvidia显卡应该被屏蔽了。
方法二:
如果没有_PS3函数,或者使用上面的方法没效果,那就试试这个方法吧。
1.在_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()
.......
} 2.编译,如果有错误,像方法一的4中那样解决错误。
3.没有错误了,编译,save AML,把修改了的DSDT.aml, SSDT.aml和其他所以没有修改的SSDT*.aml放在Extra目录(变色龙),或patched文件夹(Clover),这样的话要DropSSDT。开机,幸运的话,Nvidia显卡应该被屏蔽了。
如何查看是否成功屏蔽Nvidia独显:打开“系统信息”→“图形卡/显示器”,若只有Intel显卡的信息就证明屏蔽成功。
若成功了就支持一下吧
如果不成功的话把你的DSDT和SSDT文件发上来,看我能不能帮你。
如果你还是想把显卡部分从SSDT移到DSDT却不知道怎么做,可以参照这个帖子的移动显卡部分的方法
本帖最后由 liankaohk 于 2014-10-19 10:49 编辑
如果成功屏蔽了显卡麻烦大家把自己用的DSDT和SSDT发上来,配上自己的机型,我会集中在这里,这样如果有相同机型的朋友就不用自己再改了,也可以给要改的朋友一些参考
那些说找不到关闭显卡的Method的先看看这个网站http://hybrid-graphics-linux.tuxfamily.org/index.php?title=ACPI_calls,一般就是这些了,仔细找找
有些时候会因为一些未知错误导致SSDT没有载入, 此时External声明就没有效果了,必须把SSDT显卡部分全部移到DSDT中,具体操作此教程帖 ACPI文件处理与屏蔽独显、亮度调节中视频有详细示范,大家可参考
前排支持
如果这楼插楼的话 可以通知我 我删掉此楼。。。 话说屏蔽独显的帖子好久没有看到更新了,支持了!~ 支持一个 添加External (_SB_.PCI0.PEGP0.PEGP._DSM, methodObj)之后出现
syntax error,unexpectedPARSEOP_INTEGER,expecting ')'怎么回事??? 本帖最后由 liankaohk 于 2014-4-8 07:11 编辑
87zrjojo 发表于 2014-4-8 01:03 static/image/common/back.gif
添加External (_SB_.PCI0.PEGP0.PEGP._DSM, methodObj)之后出现
syntax error,unexpectedPARSEOP_INTEGE ...
是PEG0不是PEGP0,你直接复制我帖子里的吧,你要确定自己的独立显卡部分是_SB_.PCI0.PEG0.PEGP哦 支持下,用external 会方便很多。 我的机子很奇怪 不把ssdt移动到dsdt里的话 能看到已经顺利加载了各个ssdt 却没有效果 只有把ssdt移动到dsdt才有效… 顺便说下是ssdt-dropoem 不是dropssdt吧 liankaohk 发表于 2014-4-8 07:10
是PEG0不是PEGP0,你直接复制我帖子里的吧,你要确定自己的独立显卡部分是_SB_.PCI0.PEG0.PEGP哦
十分感谢提示~已修改了错误,试试能不能行! 本帖最后由 liankaohk 于 2014-4-8 08:46 编辑
chenkj918 发表于 2014-4-8 07:56
我的机子很奇怪 不把ssdt移动到dsdt里的话 能看到已经顺利加载了各个ssdt 却没有效果 只有把ssdt移动到dsdt ...
反正是设置drop ssdt的参数,应该看得懂吧,觉得clover比较方便啊,可以选择drop哪些ssdt。
你是按照我的帖子改么?用的是哪个_INI函数 87zrjojo 发表于 2014-4-8 01:03 static/image/common/back.gif
添加External (_SB_.PCI0.PEGP0.PEGP._DSM, methodObj)之后出现
syntax error,unexpectedPARSEOP_INTEGE ...
搞成功了么? 成功了我也试试Z580的 谢谢撸主的教程分享~独显屏蔽一直没成功的说…… 本帖最后由 schumy 于 2014-4-8 09:03 编辑
弱弱的问一句:为啥要屏蔽NV的独显?不要的话直接拆掉不就行了么? 本帖最后由 liankaohk 于 2014-4-8 10:40 编辑
schumy 发表于 2014-4-8 09:00
弱弱的问一句:为啥要屏蔽NV的独显?不要的话直接拆掉不就行了么?
…拆掉不是浪费么…因为windows还要用…屏蔽的是带双显卡笔记本的Optimus技术独显,其他情况不用屏蔽 感谢楼主,我已经成功屏蔽Nvdia显卡啦~~~~? mojelly 发表于 2014-4-8 08:52
搞成功了么? 成功了我也试试Z580的
刚搞成功~~~绝对可行!!完了我把我的dsdt和ssdt传到论坛~~~ 87zrjojo 发表于 2014-4-8 10:52
感谢楼主,我已经成功屏蔽Nvdia显卡啦~~~~?
哈哈,恭喜屏蔽成功 87zrjojo 发表于 2014-4-8 10:55 static/image/common/back.gif
刚搞成功~~~绝对可行!!完了我把我的dsdt和ssdt传到论坛~~~
哈哈 恭喜~ 等你的分享帖啦~能加个Q聊聊Z580的情况么 刚分享出来,不吝赐教!910971268