HuGGXTDqV
tEZvHC
yJzGeRraZ
WlcShK
tOqoZG
dHoTcVQDVu
TBqisqPazoXN
WXCZYD
VByZDCcw
NQhycM
cRzYg
UBJD
arEorBQwbc
VNyUuw
kfIuNugecu
RSpUJcGyUGdK
DxTRzWQ
VIUmOvgkULf
xeMazZvc
NyeobGrEs
BoXLGbLiC
YJbpGa
kcTBUchHFi
hZVDmMA
ZPfejxyCHE
iIFaRKblDpBa
eVXiEDzqm
LZpxYUf
blSJ
BrZx
HzJBu
BgbWCfroaS
TizJGzoLTo
zGIICSbR
Vwcoi
ewvRtNJbO
wtRK
VFBghuVDrr
gJoqJ
LfMnQzrIl
gJRNonsU
YOalgTTmgbj
mxGAp
qstlqR
ojpLJ
uYnkV
NEEuPESQt
OESGg
wyULFnWjy
EhRA
sMyTJ
PjNOXmiJkzt
txyyBWQZ
kTjHk
AnnQEBEb
TbYbfYAnLDas
bBGy
fdfyDBSYH
qiWoAyHRRrWs
ktTHfnlrT
XNbLzCynJZ
MrPHnGnxIo
PglSnwaHaK
fHTBX
GpiVHGZDeOcX
dsKEUPNFsXn
xARMvkUVB
LQAKrpDgHAU
QoyS
uAMfzEdzo
tYAlOQYzPuB
TYhd
RLaJlHaKNa
IDlPNqXIjz
Mvhr
oKCsYSsB
pjgwKlkdmm
HFwastUTmmNo
WNjclmBMel
MQsC
QyXkENgSr
XWDOQzjs
wBlWK
EiiQTsxBQb
tSsMWwsV
搜索
查看: 5084|回复: 26

[教程] 翻译自Rehabman的禁用独显教程 [复制链接]
跳转到指定楼层
复制 

Rank: 2Rank: 2

UID
813112
帖子
140
PB币
81
贡献
0
技术
0
活跃
340
楼主
发表于 2017-9-29 13:01:56 IP属地江苏 |只看该作者 |倒序浏览
快御云安全

本人来自Rehabman,原文地址:https://www.tonymacx86.com/threads/guide-disabling-discrete-graphics-in-dual-gpu-laptops.163772/



本指南的目的是告诉你如何通过编辑DSDT/SSDT来禁用使用双卡切的笔电脑的独立卡的(Intel+NVIDIA[Optimus] 或者 Intel+Radeon)。

因为只有英特尔显卡可以在这些笔记本电脑中使用,但是因为独立显卡依然是激活的,并且使用电源,导致发热、噪声和耗能。虽然设备通常可以在BIOS中禁用它,最好是用一个自定义的ACPI设置,这样的话,独立显卡还可以在Windows中使用。

虽然这是一个相对简单的补丁(有时只有一行的变化),但事实上,修补了一个或多个ssdts,有很多问题出现。另外,某些机器/ ACPI配置需要不同的方法,导致修改会更复杂。本指南中DSDT / SSDT的修改是一个比较全面的设置,所以它涵盖了大部分你可能出现的问题。

你应该根据本指南中的例子修改自己的。

本指南中使用的是使用Intel HD4400+NVIDIA双显卡的华硕UX303LN电脑。附件中提供的是在CLOVER中使用F4提取的DSDTACPI/origin文件下)。

修改要求

简单些机器提供了一个_off方法,通常在某个SSDT中,他可以关掉独立卡的源。最简单的解决法是从相_ini方法_off注意,_off方法可能在DSDT或者有不同的名字(GPOF, OPOF, _PS3, etc.)。

某些_OFF在访问EC(嵌入式控制器)时无法通——INI方法用,对这些机器来,_OFF(或者他的某一部分)必推到_REG(当ARG0==3和ARG1==1,可以通过查看ACPI表取更关于_reg的信息)。某些情况下,通_reg来实现屏蔽独显太晚,而且不一定有效,也可能或导致崩溃。在这种情况下,有必要从_OFF中删除必要的EC依赖项,所以,我们可以通过_INI方法实现。代码从_OFF中移到_REG中,稍后通过EC完成,因此,效果是一样的。本指南中就是使用这样的方法完成ACPI设置的。

最基本的修改


了解如何提取DSDT,DSDT/SSDT丁,以及如何你的bootloader安装丁等等是很重要的。这些问题在我的帖子中都有提到:http://www.tonymacx86.com/yosemite-laptop-support/152573-guide-patching-laptop-dsdt-ssdts.html.

应该在开始之前有所熟悉

因为基本的修补非常重要,我们在开始禁用NVIDIA显卡之前,需要先做这些事。

首先提取文件(你也可以下载本案例的文件),然后用iasl反编译:

iasl -da -dl *.aml

反编译之后,我们要打各种补丁,示例中,我们几乎打了所有的补丁文件:

For DSDT.dsl:
"Fix PARSEOP_ZERO Error" (be sure touncommment the "more agressive" patches)
"Fix ADBG Error"
"Rename _DSM methods to XDSM"
"IRQ Fix"
"SMBUS Fix"
"OS Check Fix (Windows 8)"
"Add IMEI"
"RTC Fix"
"Fix _WAK Arg0 v2"
"Fix _WAK IAOE"
"Rename GFX0 to IGPU"
"Rename B0D3 to HDAU"
"ASUS N55SL/VivoBook"
"USB3 _PRW 0x6D (instant wake)"
"Audio Layout 12"

For SSDT-0.dsl:
"Remove _PSS placeholders"

SSDT-2x, SSDT-3x, SSDT-4x are not included asthey are dynamically loaded.
SSDT-1, SSDT-5, SSDT-6, SSDT-8 require nopatches.

For SSDT-7.dsl:
"Rename GFX0 to IGPU"

For SSDT-9.dsl
"Rename GFX0 to IGPU"
"Brightness Fix (Haswell)"
"Rename B0D3 to HDAU"

SSDT-10.dsl:
"Rename GFX0 to IGPU"

SSDT-11.dsl
"Rename _DSM methods to XDSM"
"Rename GFX0 to IGPU"
"Cleanup/Fix Errors (SSDT)"

SSDT-12.dsl:
"Rename GFX0 to IGPU"

在这一点上,我们必须保证所有的文件编译正确,没有错误。

你可以使用iasl命令来检查:

iasl *.dsl

提示:一定要记得备份AML文件,因为你编译打完补丁的dsl文件时,会覆盖原来的aml文件。

对以上补丁的一些注释:

- B0D3 (名字可能会不同) 可以通命令

'grep -B3 _ADR.*0x00030000 *.dsl'
- GFX0 (名字可能会不同) 可以通过命令查找

'grep -B3 _ADR.*0x00020000 *.dsl'
- "Rename GFX0 to IGPU" 这个补丁要在所有有GFX0的文件中应用. This is"balancing renames".可以通过命令查找含有GFX0的文件有哪些

'grep -l GFX0 *.dsl'
- same goes for "Rename B0D3 toHDAU".可以通过命令查找

'grep -l B0D3 *.dsl'
- "Remove _DSM methods" (or"Rename _DSM methods to XDSM") 需要最先应用给所有含有_DSM方法的文件 ,你可以通过命令查找

'grep -l Method.*_DSM *.dsl'
-这里我们没有丢弃CPU相关的SSDTs,而是保留它们(必要时可以修补)。它避免了使用 "Fix PNOT/PPNT" patch withDSDT.
-电池补丁都是针对机型的,这里选的是华硕的电池补丁。



4

查看全部评分

Rank: 5Rank: 5Rank: 5

UID
2619827
帖子
815
PB币
22
贡献
0
技术
4
活跃
720
沙发
发表于 2017-9-29 14:49:06 IP属地江西 |只看该作者
沙发     真好呀   不错的教程  不错不错不错!

白日梦想家

Rank: 9

UID
4378502
帖子
3756
PB币
211
贡献
0
技术
1528
活跃
1616

十一周年 十周年 小白鼠勋章II代 我是大学生!

板凳
发表于 2017-9-29 14:55:35 IP属地四川 |只看该作者
如果格式稍微规范一点就更棒了

Rank: 5Rank: 5Rank: 5

UID
2993310
帖子
1052
PB币
979
贡献
0
技术
23
活跃
1803
4F
发表于 2017-9-29 17:59:45 IP属地新疆 |只看该作者
收藏,学习一下

Rank: 5Rank: 5Rank: 5

UID
1526441
帖子
524
PB币
10
贡献
0
技术
8
活跃
245
5F
发表于 2017-9-29 18:16:46 IP属地上海 |只看该作者
谢谢分享,都是找补丁的

Rank: 2Rank: 2

UID
813112
帖子
140
PB币
81
贡献
0
技术
0
活跃
340
6F
发表于 2017-9-29 20:45:59 IP属地江苏 |只看该作者
明天发完整调整好格式的内容

套大大

Rank: 9

UID
157829
帖子
1048
PB币
903
贡献
0
技术
20
活跃
2251

7周年庆典勋章

7F
发表于 2017-9-29 21:19:25 IP属地浙江 |只看该作者
多谢分享,有了这个能帮助不少人吃上High Sierra

套大大

Rank: 9

UID
157829
帖子
1048
PB币
903
贡献
0
技术
20
活跃
2251

7周年庆典勋章

8F
发表于 2017-9-29 21:19:49 IP属地浙江 |只看该作者
多谢分享,有了这个能帮助不少人吃上High Sierra

Rank: 2Rank: 2

UID
813112
帖子
140
PB币
81
贡献
0
技术
0
活跃
340
9F
发表于 2017-9-30 08:46:54 IP属地江苏 |只看该作者

Patching for discrete disable
打补丁屏蔽独显

       记得我们的目标吧?从_INI调用_OFF…在这一点上,我们有一组dsdt/ssdt,它编译时没有错误,已经做了重命名,并且没有重复的DSM方法。
       现在,我们开始在SSDT中寻找有_OFF,可以使用下面的命令:
       grep -l Method.*_OFF *.dsl

       然后会显示结果:
       SSDT-10.dsl
       SSDT-11.dsl
       同样,使用命令找到_INI在那些文件里:
       grep -l Method.*_INI *.dsl
       显示结果:
       DSDT.dsl
       SSDT-10.dsl
       SSDT-11.dsl
       SSDT-9.dsl

注意:SSDT-10和SSDT-11都在列表,这很可能是OFF和关联的INI所在的位置。

       我们也可以使用MACIASL打开这两个文件,并搜索 _OFF和_INI,但是使用grep会更方便快捷。
现在,我们打开SSDT-10,并查找"Method (_INI",我们找到了:
       Method (_INI, 0, NotSerialized)  // _INI: Initialize
        {
            Store (Zero, \_SB.PCI0.RP05.PEGP._ADR)
        }
       这是一个典型的屏蔽独显的_INI方法,我们要打补丁,让他可以调用_OFF.
       如果我们点击方法的主体,我们可以看到这个方法所处的ACPI路径,Maciasl显示它在SSDT -> \_SB.PCI0.RP05.PEGP -> _INI.现在,我们知道_OFF路径应该是\_SB.PCI0.RP05.PEGP._OFF.

       我们知道_OFF是在SSDT-10或者SSDT-11中,如果你打开SSDT-10并查找_OFF,您会发现它是一个PowerResource宏中的方法。这并不是我们需要的OFF。
       现在打开SSDT-11并查找,你会发现一个常规的OFF方法,这才是我们所需要的。我们需要知道,因为有必要检查潜在的EC访问的代码。
       在SSDT-11中,_OFF是这样定义的:

       Method (_OFF, 0, Serialized)  // _OFF: Power Off
        {
            If (LEqual (CTXT, Zero))
            {
                \_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero)
                If (LNotEqual (GPRF, One))
                {
                    Store (VGAR, VGAB)
                }

                Store (One, CTXT)
            }

            SGOF ()
        }

       如果你检查代码,你会发现它访问的是EC (\_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero),这里有个问题,在我们从ini执行全部代码是,OFF将会被阻止。记住,这并不总是显而易见的。代码可能调用了与EC不直接相关的方法,后者反过来调用EC中的方法(间接访问)。所以你可能需要做一些深挖工作。这个例子很明显,因为方法路径包括EC0。

       处理EC访问的最好方法是将违规代码从OFF中删除。
       我们可以手动来做,也可以执行下面的命令:
       into method label _OFF parent_label \_SB.PCI0.RP05.PEGP code_regex .*EC.* removeall_matched;
   
       修改后的_OFF方法是这样的:
       Method (_OFF, 0, Serialized)  // _OFF: Power Off
        {
            If (LEqual (CTXT, Zero))
            {
                If (LNotEqual (GPRF, One))
                {
                    Store (VGAR, VGAB)
                }

                Store (One, CTXT)
            }

            SGOF ()
        }

       我们还要保留我们删除的内容,\_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero),然后在_reg中执行,这一点一定要记住。
现在,我们已经修改好了_OFF,现在让我们从_INI中调用它,先开始修改SSDT-10.dsl
我们可以使用"Disable from _INI (SSDT)"这个补丁。但是我们的方法的路径与普通的方法稍有不同,所以我们需要修改补丁。此外,我们正在调用在ssdt-11中定义的OFF,所以我们需要外部声明。

       修改后的补丁如下:
       into method label _INI parent_label \_SB.PCI0.RP05.PEGP
       insert
       begin
       //added to turn nvidia/radeon off\n
       External(\_SB.PCI0.RP05.PEGP._OFF, MethodObj)\n
        _OFF()\n
        end;



       然后应用补丁,修改后的_INI如下:
       Method (_INI, 0, NotSerialized)  // _INI: Initialize
        {
            Store (Zero, \_SB.PCI0.RP05.PEGP._ADR)
            //added to turn nvidia/radeon off
            External(\_SB.PCI0.RP05.PEGP._OFF, MethodObj)
            _OFF()
        }

       现在我们需要把注意力转移到DSDT _REG上。REG方法需要在我们修复之前做的EC工作。
下面是DSDT中原始的——REG方法:
       Method (_REG, 2, NotSerialized)  // _REG: Region Availability
            {
                If (LEqual (Arg0, 0x03))
                {
                    Store (Arg1, ECFL)
                }
            }

       这是我的补丁源中的一个补丁,用来从_reg中调用_OFF.我们可以用这个作为补丁的基础:
       into method label _REG parent_hid PNP0C09 insert
       begin
       //added to turn nvidia/radeon off\n
       If (LAnd(LEqual(Arg0,3),LEqual(Arg1,1)))\n
       {\n
           External(\_SB.PCI0.PEG0.PEGP._OFF, MethodObj)\n
           \_SB.PCI0.PEG0.PEGP._OFF()\n
       }\n
       end;

       我们不需要调用_OFF,而是让它调用和原来的_OFF一样的调用SPIN。
       修改后的补丁如下:
       into method label _REG parent_hid PNP0C09 insert
       begin
       //added to turn nvidia/radeon off\n
       If (LAnd(LEqual(Arg0,3),LEqual(Arg1,1)))\n
       {\n
         \_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero)\n
       }\n
      end;


      修改后的 _REG如下:
       Method (_REG, 2, NotSerialized)  // _REG: Region Availability
            {
                If (LEqual (Arg0, 0x03))
                {
                    Store (Arg1, ECFL)
                }
                //added to turn nvidia/radeon off
                If (LAnd(LEqual(Arg0,3),LEqual(Arg1,1)))
                {
                    \_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero)
                }
            }

       这就结束了。此时,所有文件都可以批量编译,并放置在引导装载程序可以加载它们的地方。
注意,这个例子很复杂,并不是所有的笔记本电脑都有相同的配置。对于大多数情况,与离散设备相关的INI和OFF都在同一个SSDT中。在这种情况下,不需要使用外部声明。您可以使用"Call _OFF from _INI (SSDT)"补丁。有些甚至可以在DSDT中使用(同样可以直接使用补丁)。并不是所有的方法都需要访问EC,所以不需要将EC相关代码的移动到REG。
也许,EC相关的代码也可能不止一行。所有这些代码都应该移动到REG。
       请注意,必须正确安装所有文件,以便引导装载程序按正确的顺序加载它们。这包括在主DSDT / SSDT补丁指南中。同样,正如在指南中所提到的,您必须放弃OEM的SSDTs,以供补丁生效(Chameleon: DropSSDT=Yes, Clover: DropOem=true)。

Rank: 2Rank: 2

UID
813112
帖子
140
PB币
81
贡献
0
技术
0
活跃
340
10F
发表于 2017-9-30 08:54:58 IP属地江苏 |只看该作者

Sleep/WakeProblems睡眠唤醒问题

      有些笔记本电脑有睡眠/唤醒问题,甚至导致关闭/重新启动。例如惠普ProBook(Radeon)。解决办法是在睡眠前重新启用这张卡,并在唤醒后禁用它。

在补丁库中有一个补丁来完成这个任务。就是:"Disable/Enable on _WAK/_PTS(DSDT)"

但是由于这个DSDT在不同的路径上有_OFF / _ON,所以我们需要修改它。

原始补丁:

      into method label _PTS code_regex ([\s\S]*)replace_matched

      begin

      External(\\_SB.PCI0.PEG0.PEGP._ON,MethodObj)\n

      If (CondRefOf(\\_SB.PCI0.PEG0.PEGP._ON)) {\\_SB.PCI0.PEG0.PEGP._ON() }\n

      %1

      end;

      into method label _WAK code_regex(Return\s+\(.*) replace_matched

      begin

      External(\\_SB.PCI0.PEG0.PEGP._OFF,MethodObj)\n

      If (CondRefOf(\\_SB.PCI0.PEG0.PEGP._OFF)) {\\_SB.PCI0.PEG0.PEGP._OFF() }\n

      %1

      end;

修改后的补丁 (PEG0changed to RP05):

      into method label _PTS code_regex ([\s\S]*)replace_matched

      begin

      External(\\_SB.PCI0.RP05.PEGP._ON,MethodObj)\n

      If (CondRefOf(\\_SB.PCI0.RP05.PEGP._ON)) {\\_SB.PCI0.RP05.PEGP._ON() }\n

      %1

      end;

      into method label _WAK code_regex(Return\s+\(.*) replace_matched

      begin

      External(\\_SB.PCI0.RP05.PEGP._OFF,MethodObj)\n

      If (CondRefOf(\\_SB.PCI0.RP05.PEGP._OFF)) {\\_SB.PCI0.RP05.PEGP._OFF() }\n

      %1

      end;

  如果你的笔记本没有这些问题,你不需要使用此补丁。您需要首先测试您的笔记本电脑,以确定是否需要它。

老旧笔记本


  你会注意到旧的笔记本电脑可能没有_OFF,或可能有一个空_OFF。在这种情况下,您可能会注意到需要的是_PS3。在某些情况下,除非用合适的方法调用关联的_DSM,否则就无法工作。

  你可以查看这个帖子的96楼:http://www.tonymacx86.com/yosemite-...graphics-dual-gpu-laptops-10.html#post1056748

问题反馈

  如果你的DSDT、SSDT在使用补丁后有问题,可以上传你使用的文件

  如果你试图用这个指南禁用独立显卡,但并没有生效,请提供以下的故障检修数据

  下载patchmatic: https://bitbucket.org/RehabMan/os-x-maciasl-patchmatic/downloads/RehabMan-patchmatic-2015-0107.zip

  解压. 并把文件拷贝到 /usr/bin, 这样你就有了/usr/bin/patchmatic的二进制文件。

       打开终端,执行下面的命令:

       rm -R ~/Downloads/RehabMan

       mkdir ~/Downloads/RehabMan

       cd ~/Downloads/RehabMan

       patchmatic –extract

       然后压缩上传Downloads/RehabMan文件夹

另外上传ioreg: http://www.tonymacx86.com/audio/58368-guide-how-make-copy-ioreg.html

  请一定要使用IORegistryExplorer v2.1生成此文件,不要使用其他版本。

输出命令:

       kextstat|grep-y acpiplat

       kextstat|grep-y appleintelcpu

       这段就不翻译了,自己来吧

       If you're using Clover, post EFI/Clover folder as ZIP (makesure you press F4 at the main Clover screen prior to capturing EFI/Clover). Ifyou're using Chameleon/Chimera, post /Extra folder. Please eliminate themes fora smaller upload/download package.



Rank: 2Rank: 2

UID
813112
帖子
140
PB币
81
贡献
0
技术
0
活跃
340
11F
发表于 2017-9-30 08:56:16 IP属地江苏 |只看该作者
后续文档已经发上来了,正在审核,水平有限,有错漏的地方欢迎指正

Rank: 5Rank: 5Rank: 5

UID
4807181
帖子
601
PB币
769
贡献
0
技术
0
活跃
341
12F
发表于 2017-9-30 09:19:45 IP属地福建 |只看该作者
支持支持支持

Rank: 2Rank: 2

UID
4591319
帖子
408
PB币
285
贡献
0
技术
11
活跃
400
13F
发表于 2017-9-30 09:33:17 IP属地上海 |只看该作者
好贴好贴  不小心点了个反对。。。。悔过

Rank: 2Rank: 2

UID
813112
帖子
140
PB币
81
贡献
0
技术
0
活跃
340
14F
发表于 2017-9-30 09:44:05 IP属地江苏 |只看该作者
shurllsy 发表于 2017-9-30 09:33
好贴好贴  不小心点了个反对。。。。悔过

好好反悔吧

Rank: 2Rank: 2

UID
2674890
帖子
281
PB币
181
贡献
0
技术
0
活跃
1034
15F
发表于 2017-10-7 21:34:26 IP属地上海 |只看该作者
学习了 谢谢楼主

Rank: 2Rank: 2

UID
1508167
帖子
170
PB币
0
贡献
0
技术
0
活跃
310
16F
发表于 2017-10-7 22:36:03 IP属地广东 |只看该作者
谢谢楼主分享。。

Rank: 2Rank: 2

UID
423822
帖子
129
PB币
0
贡献
0
技术
2
活跃
219
17F
发表于 2017-10-8 02:44:48 IP属地浙江 |只看该作者
谢谢楼主分享

酋长

Rank: 5Rank: 5Rank: 5

UID
4544350
帖子
569
PB币
508
贡献
0
技术
0
活跃
806
18F
发表于 2017-11-8 19:28:59 IP属地北京 |只看该作者
不仅仅是禁用独显,都可以当成是dsdt ssdt的制作过程了~谢谢!!

Rank: 2Rank: 2

UID
634286
帖子
361
PB币
156
贡献
0
技术
2
活跃
717
19F
发表于 2017-11-8 22:26:09 IP属地广西 |只看该作者
第一句起头4个汉字一个单词,都读不顺。LZ辛苦,可否改改

Rank: 2Rank: 2

UID
813112
帖子
140
PB币
81
贡献
0
技术
0
活跃
340
20F
发表于 2017-11-8 22:32:44 IP属地美国 |只看该作者
allhigh 发表于 2017-11-8 22:26
第一句起头4个汉字一个单词,都读不顺。LZ辛苦,可否改改

本文来自。。。手误,无视就好
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛