通过修改DSDT解决部分AMD显卡唤醒以及R9 280X安装界面黑屏
本帖最后由 kaeserlin 于 2017-10-28 13:09 编辑10.28:更新显卡名称等信息注入以及相对应的整合Hotpatch代码更新(详见4楼)
10.28:实测通过该方法注入下方的代码后,HIS R9 280X在10.13安装界面不会再黑屏,其他A卡可以参考
----------------------------------------------------------------------------------------------------------------------------------------------------
早上看到道格的回帖就弄了一下,发现论坛还没有类似的贴子,所以特意发(shui)一贴。
代码非原创,只是搬运来的,因为我是从道格那看过来的,所以不知道原创在哪......
本帖只讨论修改DSDT,不讨论Hotpatch,这方面还没来得及研究,所以有做好Hotpatch代码的童鞋,可以把代码贴一下。
以下进入正题。
1.通过IORegistryExplorer获取显卡位置。
下载附件双击打开,搜索display,或者AMD应该也可以,记录下方的显卡位置以及名称。
说明一下,这里可能(GFX0)这个位置是显示display(我的就是),所以在查找之前先放入WhateverGreen,确保可以得到正确能用的函数名,如果你的本身显示正常,则不要添加WhateverGreen,以免造成不必要的错误。
2.DSDT查找位置。
类似我的是在NPE3这个位置
DSDT内搜索NPE3
3.然后注入代码。
Device (PEGP)
{
Name (_ADR, Zero)// _ADR: Address
OperationRegion (PCIB, PCI_Config, Zero, 0x0100)
Field (PCIB, AnyAcc, NoLock, Preserve)
{
Offset (0x10),
BAR0, 32,
BAR1, 32,
BAR2, 64,
BAR4, 32,
BAR5, 32
}
Method (_INI, 0, NotSerialized)// _INI: Initialize
{
If (LEqual (BAR5, Zero))
{
Store (BAR2, Local0)
}
Else
{
Store (BAR5, Local0)
}
OperationRegion (GREG, SystemMemory, And (Local0, 0xFFFFFFFFFFFFFFF0), 0x8000)
Field (GREG, AnyAcc, NoLock, Preserve)
{
Offset (0x6800),
GENA, 32,
GCTL, 32,
LTBC, 32,
Offset (0x6810),
PSBL, 32,
SSBL, 32,
PTCH, 32,
PSBH, 32,
SSBH, 32,
Offset (0x6848),
FCTL, 32,
Offset (0x6EF8),
MUMD, 32
}
Store (Zero, FCTL)
Store (Zero, PSBH)
Store (Zero, SSBH)
Store (Zero, LTBC)
Store (One, GENA)
Store (Zero, MUMD)
}
}
上面代码不可以直接使用,因为函数名(PEGP)可能不同(一样的可以直接用),参考上面我在IORegistryExplorer中找到的为GFX0,所以修改之后如下
Device (GFX0)
{
Name (_ADR, Zero) // _ADR: Address
OperationRegion (PCIB, PCI_Config, Zero, 0x0100)
Field (PCIB, AnyAcc, NoLock, Preserve)
{
Offset (0x10),
BAR0, 32,
BAR1, 32,
BAR2, 64,
BAR4, 32,
BAR5, 32
}
Method (_INI, 0, NotSerialized) // _INI: Initialize
{
If (LEqual (BAR5, Zero))
{
Store (BAR2, Local0)
}
Else
{
Store (BAR5, Local0)
}
OperationRegion (GREG, SystemMemory, And (Local0, 0xFFFFFFFFFFFFFFF0), 0x8000)
Field (GREG, AnyAcc, NoLock, Preserve)
{
Offset (0x6800),
GENA, 32,
GCTL, 32,
LTBC, 32,
Offset (0x6810),
PSBL, 32,
SSBL, 32,
PTCH, 32,
PSBH, 32,
SSBH, 32,
Offset (0x6848),
FCTL, 32,
Offset (0x6EF8),
MUMD, 32
}
Store (Zero, FCTL)
Store (Zero, PSBH)
Store (Zero, SSBH)
Store (Zero, LTBC)
Store (One, GENA)
Store (Zero, MUMD)
}
}
插入位置为NPE3内
插入完成后编译无错误保存即可。删掉WhateverGreen后重启试试,无意外应该是解决了。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
因为A卡需要修改FB值才能够显示正确的型号,所以提供一下注入显卡信息部分代码,其实也不是什么新东西了,代码部分修改自34楼,对Hotpatch进行了整合,详细请看代码进行修改,以下为我使用的HIS R9 280X代码部分。
先贴一张效果图,可以看到显卡名称已经由一大串变成了自定义的了,当然你可以尝试改成GTX1080Ti X4 试试,看看会不会有加成。
Method (_DSM, 4, NotSerialized)// _DSM: Device-Specific Method
{
If (LEqual (Arg2, Zero))
{
Return (Buffer (One)
{
0x03
})
}
Return (Package (0x1C)
{
"AAPL,slot-name",
Buffer (0x07)
{
"Slot-4"
},
"@0,name",
Buffer (0x0D)
{
"ATY,Futomaki"
},
"@1,name",
Buffer (0x0D)
{
"ATY,Futomaki"
},
"@2,name",
Buffer (0x0D)
{
"ATY,Futomaki"
},
"@3,name",
Buffer (0x0D)
{
"ATY,Futomaki"
},
"@4,name",
Buffer (0x0D)
{
"ATY,Futomaki"
},
"ATY,Card#",
Buffer (0x0E)
{
"109-B77101-00"
},
"ATY,Copyright",
Buffer (0x25)
{
"(C) 1988-2017, AMD Technologies Inc."
},
"ATY,Rom#",
Buffer (0x41)
{
"TAHITI XTL PCIE 3G/384B GDDR5 DLDVI-I/HDMI/2XMINI-DP 1050E/1500M"
},
"ATY,VendorID",
Buffer (0x02)
{
0x02, 0x10
},
"ATY,DeviceID",
Buffer (0x02)
{
0x98, 0x67
},
"device_type",
Buffer (0x13)
{
"ATY,FutomakiParent"
},
"model",
Buffer (0x17)
{
"AMD Radeon HIS R9 280X"
},
"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
}
})
}
以上代码需要作出修改的信息同样可以通过IORegistryExplorer搜索AMD后获得,进行得到数值后进行16进制字符串转换即可得到。
说一下要改的几个点。
1.Futomaki
全部改成你的FB name,太多,这里就不提供了。
2.VendorID以及DeviceID
修改为你的显卡ID,可在系统报告--图形显示卡内获取,分别为供应商部分和设备ID部分。
3.model
就是显卡型号,瞎乱改估计也没事,不过不会有什么神秘加成就是了。
其他的信息可以通过IORegistryExplorer自行查找,不过我个人觉得其他的改不改貌似也不影响。
以上代码插入位置为
最后进行编译无错误保存即可。
谢谢分享。。。 排版又出问题了......将就着看吧...... 本帖最后由 kaeserlin 于 2017-10-28 14:06 编辑
Hotpatch代码已弄好,这个hotpatch没什么难度,完整的hotpatch代码如下,Config不需要,自己对着修改吧。
不带显卡信息代码:
DefinitionBlock ("", "SSDT", 2, "hack", "Wake", 0x00000000)
{
External (_SB_.PCI0.NPE3.GFX0, DeviceObj) // (from opcode)
Device (_SB.PCI0.NPE3.GFX0)
{
Name (_ADR, Zero)// _ADR: Address
OperationRegion (PCIB, PCI_Config, Zero, 0x0100)
Field (PCIB, AnyAcc, NoLock, Preserve)
{
Offset (0x10),
BAR0, 32,
BAR1, 32,
BAR2, 64,
BAR4, 32,
BAR5, 32
}
Method (_INI, 0, NotSerialized)// _INI: Initialize
{
If (LEqual (BAR5, Zero))
{
Store (BAR2, Local0)
}
Else
{
Store (BAR5, Local0)
}
OperationRegion (GREG, SystemMemory, And (Local0, 0xFFFFFFFFFFFFFFF0), 0x8000)
Field (GREG, AnyAcc, NoLock, Preserve)
{
Offset (0x6800),
GENA, 32,
GCTL, 32,
LTBC, 32,
Offset (0x6810),
PSBL, 32,
SSBL, 32,
PTCH, 32,
PSBH, 32,
SSBH, 32,
Offset (0x6848),
FCTL, 32,
Offset (0x6EF8),
MUMD, 32
}
Store (Zero, FCTL)
Store (Zero, PSBH)
Store (Zero, SSBH)
Store (Zero, LTBC)
Store (One, GENA)
Store (Zero, MUMD)
}
}
}
附带显卡信息代码(具体信息请对照本帖修改):
DefinitionBlock ("", "SSDT", 2, "hack", "Wake", 0x00000000)
{
External (_SB_.PCI0.NPE3.GFX0, DeviceObj) // (from opcode)
Device (_SB.PCI0.NPE3.GFX0)
{
Name (_ADR, Zero)// _ADR: Address
OperationRegion (PCIB, PCI_Config, Zero, 0x0100)
Field (PCIB, AnyAcc, NoLock, Preserve)
{
Offset (0x10),
BAR0, 32,
BAR1, 32,
BAR2, 64,
BAR4, 32,
BAR5, 32
}
Method (_DSM, 4, NotSerialized)// _DSM: Device-Specific Method
{
If (LEqual (Arg2, Zero))
{
Return (Buffer (One)
{
0x03
})
}
Return (Package (0x1C)
{
"AAPL,slot-name",
Buffer (0x07)
{
"Slot-1"
},
"@0,name",
Buffer (0x0D)
{
"ATY,Futomaki"
},
"@1,name",
Buffer (0x0D)
{
"ATY,Futomaki"
},
"@2,name",
Buffer (0x0D)
{
"ATY,Futomaki"
},
"@3,name",
Buffer (0x0D)
{
"ATY,Futomaki"
},
"@4,name",
Buffer (0x0D)
{
"ATY,Futomaki"
},
"ATY,Card#",
Buffer (0x0E)
{
"109-B77101-00"
},
"ATY,Copyright",
Buffer (0x25)
{
"(C) 1988-2017, AMD Technologies Inc."
},
"ATY,Rom#",
Buffer (0x41)
{
"TAHITI XTL PCIE 3G/384B GDDR5 DLDVI-I/HDMI/2XMINI-DP 1050E/1500M"
},
"ATY,VendorID",
Buffer (0x02)
{
0x02, 0x10
},
"ATY,DeviceID",
Buffer (0x02)
{
0x98, 0x67
},
"device_type",
Buffer (0x13)
{
"ATY,FutomakiParent"
},
"model",
Buffer (0x17)
{
"AMD Radeon HIS R9 280X"
},
"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
}
})
}
Method (_INI, 0, NotSerialized)// _INI: Initialize
{
If (LEqual (BAR5, Zero))
{
Store (BAR2, Local0)
}
Else
{
Store (BAR5, Local0)
}
OperationRegion (GREG, SystemMemory, And (Local0, 0xFFFFFFFFFFFFFFF0), 0x8000)
Field (GREG, AnyAcc, NoLock, Preserve)
{
Offset (0x6800),
GENA, 32,
GCTL, 32,
LTBC, 32,
Offset (0x6810),
PSBL, 32,
SSBL, 32,
PTCH, 32,
PSBH, 32,
SSBH, 32,
Offset (0x6848),
FCTL, 32,
Offset (0x6EF8),
MUMD, 32
}
Store (Zero, FCTL)
Store (Zero, PSBH)
Store (Zero, SSBH)
Store (Zero, LTBC)
Store (One, GENA)
Store (Zero, MUMD)
}
}
}
要修改的代码有两行。
External (_SB_.PCI0.NPE3.GFX0, DeviceObj) // (from opcode)
Device (_SB.PCI0.NPE3.GFX0)
以上是我的代码,NPE3和GFX0部分改为自己获取到的地址和相应的函数名保存即可,有空出一个X79的hotpatch,不过这玩意的hotpatch貌似很简单......
你的x79可以唤醒了?10.13? bizongyi 发表于 2017-10-24 17:20 https://www.pcbeta.com/static/image/common/back.gif
你的x79可以唤醒了?10.13?
{:5_265:}不能,这是写给其他人用的 该方法的作者是Mieze大神,就是那位写过很多网卡驱动的德国大姑娘。她是通过Vit9696的whatevergreen得到思路,并且通过研究linux版Radeon驱动才找到问题的根本原因。
问题的根本原因是PCI Base address register(BAR)初始化错误。苹果系统的显卡驱动需要BAR5,但BIOS初始化的是BAR2。
当电脑启动时,如果是Legacy vbios,核显或辅助显卡当主显卡,那么AMD显卡不会初始化。Mac显卡驱动发现有未初始化的显卡,会主动初始化它,这样就是正确的。关显示器大法、改bios黑屏大法也是同一个原理,都是让AMD显卡在开机时不被初始化。如此就能正常使用。
但一旦用uefi vbios,即csm关闭,或者AMD显卡直接当主显卡,那么AMD显卡开机时会初始化。苹果显卡驱动看见AMD显卡已经初始化,就不会在理会,这样AMD显卡就带着错误的参数(BAR2)进系统。这样就导致一些列问题:hd6000、7000无法唤醒;GCN1.1+的显卡(r9 370、Rx 480、580等)开机卡紫条。
Mieze大神通过楼上的代码在dsdt里做了寄存器变换,成功解决了这问题。
Whatevergreen并不是彻底解决问题,只是把错误的参数改对;而Mieze大神的dsdt方法是彻底解决,让Mac系统能直接正确初始化A卡。
Whatevergreen对于有些不大主流的显卡支持得并不好,比如有位同学的r9 370,能解决开机问题,但是睡眠唤不醒。如果你的显卡也是这样,推荐试试dsdt修正大法{:5_264:}
kaeserlin 发表于 2017-10-24 17:22 https://www.pcbeta.com/static/image/common/back.gif
不能,这是写给其他人用的
我也是,帮n多人弄好了,结果我自己的主板在10.13不管用啥显卡都不能唤醒了,n卡也不行。
去insanelymac一看,发现asus x79全灭,没一个能在10.13唤醒。
好不容易等到显卡问题解决了,主板又废了,黑果好难啊{:5_265:}
x79唤醒问题就麻烦了,首先用x79的人已经很少了,大神可能不会重视。其次x79死得非常彻底,唤醒失败时连log都来不及留下就死翘翘了,即使有大神要来排错也会非常难,完全没有一点头绪。现在只能祈祷苹果自己改唤醒机制,毕竟现在很多白果都出唤醒问题了,好多人的Macbook pro唤不醒,外国论坛上一堆白果用户在抱怨。这完全是苹果的锅。。 bizongyi 发表于 2017-10-24 17:53
我也是,帮n多人弄好了,结果我自己的主板在10.13不管用啥显卡都不能唤醒了,n卡也不行。
去insanelymac ...
确实,我昨晚在AppleDiscussion上面看到好多MacPro和MBP都说唤醒黑屏,不过我估计官方修改的可能性不大,X79可能要寿终正寝了,我都在犹豫是不是要买一块华南金牌续一续π_π bizongyi 发表于 2017-10-24 17:43 https://www.pcbeta.com/static/image/common/back.gif
该方法的作者是Mieze大神,就是那位写过很多网卡驱动的德国大姑娘。她是通过Vit9696的whatevergreen得到思路 ...
看完你写的赶紧我跑到insanelymac找到了原帖,RX480可以不用whatevergreen了{:5_264:} tdyso 发表于 2017-10-24 19:06 https://www.pcbeta.com/static/image/common/back.gif
看完你写的赶紧我跑到insanelymac找到了原帖,RX480可以不用whatevergreen了
长达两年的a卡唤醒问题终于彻底解决了
dsdt比whatevergreen唤醒速度快多了,终于能像10.10那样秒唤醒了{:5_285:}
本帖最后由 kailong156 于 2017-10-24 23:16 编辑
4010939[/attac kailong156 发表于 2017-10-24 22:12 https://www.pcbeta.com/static/image/common/back.gif
亲测不行 DSDT搜索无此数值,用了whatevergreen,楼主有无办法
你只需要找gfx0就行了 kailong1562017-10-24 22:12 https://www.pcbeta.com/static/image/common/back.gif
DSDTwhatevergreen
\_SB.PCI0У kailong156 发表于 2017-10-24 22:12
亲测不行 DSDT搜索无此数值,用了whatevergreen,楼主有无办法
只能怪你自己不会找显卡函数,请不要用亲测不行这四个字。
你把\_SB.PCI0点开看看有没有?我看你这截图都看到了。 我的HD7850 2G溢价卖出了,等双十一再搞个A卡,用DSDT试试,话说:能否只使用单独显卡代码 部分DSDT,其余的又没有需要修改的 bizongyi 发表于 2017-10-24 23:09
只能怪你自己不会找显卡函数,请不要用亲测不行这四个字。
你把\_SB.PCI0点开看看有没有?我看你这截图都 ...
多谢指教,小白一个,不好意思 N卡,虽然是个免驱的,明显卡顿。又没有集显,还是玩会A卡吧 bizongyi 发表于 2017-10-24 23:09
只能怪你自己不会找显卡函数,请不要用亲测不行这四个字。
你把\_SB.PCI0点开看看有没有?我看你这截图都 ...
我发的帖子里有,可以帮我看下吗?谢谢 楼主你好,我用你的方法确实唤醒不黑屏了,但是为啥会进入睡眠立马又唤醒了,而且我的显卡型号现实也不正确了(rx480 8g),现在变成了r9 xxx 8g?