0D/6D 补丁
概述
_PRW定义了一个部件的唤醒方法。其Return2 个或者 2 个以上字节组成的数据包。有关_PRW详细的内容参见 ACPI 规范。- 有这么一些部件,由于他们的
_PRW和 macOS 发生了冲突从而导致机器刚刚睡眠成功就被立即唤醒。为了解决问题,必须对这些部件实施补丁。这些部件_PRW数据包的第 1 个字节是0D或者6D。因此,这种补丁被称为0D/6D补丁,也叫秒醒补丁,也叫睡了即醒补丁。为了描述方便,以下统一称之为0D/6D补丁。 _PRW数据包的第 2 个字节多为03或者04,将这个字节修正为0即完成了0D/6D补丁。- 不同的机器对
_PRW定义的方法可能不同,其数据包的内容、形式也可能多样化。实际的0D/6D补丁应视具体情况而定。见后文的描述。 - 我们期待 OpenCore 后续版本能够解决
0D/6D问题。
可能需要 0D/6D补丁 的部件
USB 类设备
ADR地址:0x001D0000, 部件名称:EHC1。ADR地址:0x001A0000, 部件名称:EHC2。ADR地址:0x00140000, 部件名称:XHC,XHCI,XHC1等。ADR地址:0x00140001, 部件名称:XDCI。ADR地址:0x00140003, 部件名称:CNVW。
以太网
- 6 代以前,
ADR地址:0x00190000, 部件名称:GLAN,IGBE等。 - 6 代及 6 代以后,
ADR地址:0x001F0006, 部件名称:GLAN,IGBE等。
- 6 代以前,
声卡
- 6 代以前,
ADR地址:0x001B0000, 部件名称:HDEF,AZAL等。 - 6 代及 6 代以后,
ADR地址:0x001F0003, 部件名称:HDAS,AZAL等。
注意1:通过查找名称确认上述部件的方法并不可靠。可靠的方法是搜索
ADR 地址,_PRW。注意2:新发布的机器可能会有新的部件需要
0D/6D补丁。- 6 代以前,
_PRW 的多样性和对应的补丁方法
Name 类型Name (_PRW, Package (0x02) { 0x0D, /* 可能是0x6D */ 0x03,/* 可能是0x04 */ ... })这种类型的
0D/6D补丁适合用二进制更名方法修正0x03(或0x04)为0x00。文件包提供了:- Name-0D 更名 .plist
Name0D-03to00Name0D-04to00
- Name-6D 更名 .plist
Name6D-03to00Name6D-04to00
- Name-0D 更名 .plist
Method 类型之一:GPRW(UPRW)Method (_PRW, 0, NotSerialized) { Return (GPRW (0x6D, 0x04)) /* 或者Return (UPRW (0x6D, 0x04)) */ }较新的机器大多数属于这种情况。按常规方法(更名-补丁)即可。文件包提供了:
- SSDT-GPRW(补丁文件内有二进制更名数据)
- SSDT-UPRW(补丁文件内有二进制更名数据)
Method 类型之二:ScopeScope (_SB.PCI0.XHC) { Method (_PRW, 0, NotSerialized) { ... If ((Local0 == 0x03)) { Return (Package (0x02) { 0x6D, 0x03 }) } If ((Local0 == One)) { Return (Package (0x02) { 0x6D, One }) } Return (Package (0x02) { 0x6D, Zero }) } }这种情况并不常见。对于示例的情况,使用二进制更名 Name6D-03 to 00 即可。其他形式内容自行尝试。
Name 类型,Method 类型混合方式对于多数 TP 机器,涉及
0D/6D补丁的部件既有Name 类型,也有Method 类型。采用各自类型的补丁即可。需要注意的是二进制更名补丁不可滥用,有些不需要0D/6D补丁的部件_PRW也可能是0D或6D。为防止这种错误,应提取System DSDT文件加以验证、核实。
注意事项
- 本文描述的方法适用于Hotpatch。
- 凡是用到了二进制更名,应提取
System DSDT文件加以验证。