0%

显示器接口修正及自定义FrameBuffer参数驱动黑苹果AMD显卡的新方式

作者: 左右流之

通过对AMD驱动的仔细研究,发现之前人们在解决AMD显卡问题上出现了盲区,也可以说是思路被固定住了。这个盲区在于,人们没有完全理解FrameBuffer的机制,现在我提出一种新的解决思路和方案,可以灵活地运用FrameBuffer的参数,而不被FBName所制约。本文分为两个部分,第一部分介绍脱离FBName制约的显示器接口修正的方式;第二部分介绍FrameBuffer的参数的使用,达到调整显卡工作状态的目的。通过几个网友的测试,结果显示Vega显卡运行FCPX时火力全开,在这里特别感谢QQ好友Mace协助测试。

一、显示接口修正的connectors方法

如果你需要开核显并且必须用WateverGreen驱动,您可以跳过此节继续阅读。
在对AMD10000等驱动的仔细阅读之后,发现和显示器相关的参数是 connectors ,黑果们说的给FBName打补丁其实是给connectors打补丁,概念上应该有些差池和误导。AMD驱动里指定了一些FBName,每个特定的FBName里面又定义了自己的connectors。系统驱动连接显示器主要就是通过connectors定义的数据,所以黑果大概率不能完全对应显示接口。

如果我们不指定FBName,就可以直接在设备属性中定义connectors,达到修正显示器接口的目的。这种方式类似于WhateverGreen.kext的做法,WhateverGreen.kext默认就不指定FBName,一旦指定FBName,就会有个别或全部显示接口无法正常工作。
简单地说,在设备属性中注入connectors,就不能指定FBName了。这似乎是个缺陷,但却是自由度很高的方法。

下面举例说明:
我们先准备好显卡的connectors数据(用ATI_FrameBuffers_Edition.php提取后修正):

1
2
3
4
000400000403000000010101000000002205020200000000
000400000403000000010201000000001204010100000000
000400000403000000010300000000001000050500000000
000800000402000000010400000000002001060600000000

上面的数据是4个接口的,认为修正差不多了可以试验了。注意一定要从零号索引开始按照顺序写全接口。然后我们有两种方式把connectors注入到设备属性中。

  1. 写入OpenCore的DeviceProperties项目中
    就像下图这样:

    点击放大
  2. 写到显卡SSDT中
    操作稍微麻烦一点,要把数据整理成字节的形式(你要是手动拆分我也无话可说)。然后写入SSDT中,编译完之后就是这样:

    ssdt注入 图中绿色的字符是ASL编译后自动添加的注释。

再强调一遍,这种方式不能指定FBName。

需要特别说明,指定connectors的方式对Navi系列显卡不适用。通过查看AMDRadeonX6000Framebuffer驱动,初步得出的结论是,此系列显卡驱动直接读取显卡Bios的设置来进行显示器连接的。
由此本人对白苹果Vega显卡很短小的VBIOS有了进一步的认知,白苹果的Vega显卡Bios中的信息仅有有显卡版本信息、基本的config,剩下的字节都是用FF占位。白果显卡的显示器连接等一些列工作机制都是驱动里定义的,比如显示连接器。

使用connectors的意义是为了摆脱FBName的制约,如果你对如何获得connectors不是很清楚或者你打算偷懒,其实我们可以直接用WhateverGreen来替代这部分工作
就是说,点亮显示器是下一步工作的前提。

二、自定义工作参数

通过对驱动的研究,现在知道了FBName包含aty_config、aty_properties和connectors这几个部分。这就是我们自定义工作参数的基础。connectors部分通过自己注入或者使用WhateverGreen来解决。
在AMD10000Controller驱动info.plist文件里,定义了aty_config、aty_properties两个集合,里面一项一项的参数就是默认配置。摆脱了FBName的制约之后,显卡驱动就使用默认配置了,工作效率会打折扣。
那么有没有办法提升工作效率呢?有,就是自定义参数。

aty_config

默认的aty_config的参数比较多,但不存在于FBName中。
以下几个参数是FBName使用的aty_config参数,在此特别提示出来。
CFG_NVV
CFG_PTPL2_TBL
CFG_PTPL2_CNT
CFG_PTPL2_MAX
CFG_PTPL2_MIN
CFG_TPS1S
CFG_USE_FBC

这里有一个特别的参数CFG_PTPL2_TBL需要注意,它应该定义的是颜色转换信息,用错了会丢metal功能集并导致RGB三色错乱,你只能看到正常的黑白灰,其他颜色是错误的。查看2017年的iMacPro/Vega56使用的FBName是japura,就有CFG_PTPL2_TBL参数,猜测是为了对接苹果的某种显示器,咱没白果,只能猜猜。

aty_properties

同样,下面列出所有FBName用到的的PP参数

PP参数 数据类型 参考数值
PM_PWR_GEMINI_BGT Number 400
Force_Load_FalconSMUFW boolean YES
PP_ACDCGpioDisabled Number 0
PP_DiDtSQPatternWidthOverride Number 14
PP_DiDtSQStallPatternOverride Number 16383
PP_DisableDIDT Number 0
PP_DisablePCCLimitControl Numberr 1
PP_EnableUploadFirmware Number 1
PP_FclkGfxClkRatio Number 1036831949
PP_GfxOffControl Number 0
PP_PhmUseDummyBackEnd Number 0
PP_VG10TelemetrySlopOverWrite Number 514
PP_WorkLoadPolicyMask Number 1

Enable/Disable为开关性质,参数就两个:0或者1
GfxOffControl这个参数,设置值为1时,为低功耗配置的FBName使用。
另外还可以加入PP_PhmSoftPowerPlayTable参数,来防治风扇暴走。QQ好友Mace 4月10日帮助测试了Vega显卡的风扇控制表,只需要设置风扇参数,可以不用超频。
这些的参数意义,有兴趣的可以自行研究,具体我也不是很明白,用就完了。

比较

我偷懒,直接抄袭了ATY,Japura 、ATY,Araguaia、ATY,Baudo 这三个FBName的配置参数并分别注入到设备属性中做对比。

参数对比 经过测试,初步的认知结论如下:
FBName GeekBench5跑分 FCPX相关 功耗及风扇控制
ATY,Japura 4万7——5万4 8k导出 1分钟 低功耗 风扇控制良好
ATY,Araguaia 6万8——7万2 8k导出30秒,渲染和转码满载 高功耗 风扇启动后不能停止
ATY,Baudo 4万3 8k导出37秒,渲染和转码满载 低功耗 风扇控制较好

@Mace 提供的测试截图
mace提供

对HEVC编码的测试见第四节

注入方式

注入方式同第一节。具体参数也可以自己去查阅/S/L/E/AMD10000Controller.kext驱动包里的info.plist文件。
附上我的一个配置截图
OC配置

具体的调整还需要各位自行钻研。

三、推论

FrameBuffer参数我们可以自己定义,虽然没有了FBName名字,但是有实质。显示器的连接我们也可以自定义。这几乎就是天马行空了。
至此,得到如下推论:
如果你的显卡必须用WhateverGreen驱动来点亮屏幕,那么可以通过注入相关参数来达到使用FBNmae的效果。
进一步,我们可以以一种全新的思路来解决AMD显卡驱动的问题。
通过可用的connectors参数或WhateverGreen驱动来解决显示器连问题,绕过FBName的限制,然后注入FrameBuffer驱动参数提升显卡的工作效率。
额外的收获是不用对内核打补丁了。


四、验证

按照现在这套思路,重新配置z370+8700k+vega56,火力全开,核显、独显、CPU都能很好滴参与工作,导出HEVC格式视频也令人满意。
导出8bit HEVC视频
配合最新的1.3.8版的WhateverGreen驱动,这套方案完美解决了Z370的问题。
从图上看,Vega负责渲染,核显负责HEVC转码,CPU负责数据读写。
不需要什么FBName,也不需要什么EFIVersion。
OC config.plist配置示例

吐槽
关于GeekBench跑分软件,你真的不需要当真,娱乐娱乐就好了。真的的性能体现在运行FCPX等软件上。

福利
10.15.4 FrameBuffers提取脚本

鸣谢
QQ好友 Mace

原创文章,转载请注明出处和作者。