如何仿冒显卡设备ID以驱动显卡?

前言

开篇要明确的第一点:macOS 的驱动是系统内置驱动,理论上,运行 macOS 的电脑只有苹果公司的 Mac 系列电脑,因此苹果公司不会为他们不使用的硬件开发驱动,没有特别原因也不会更新驱动。虽然也有第三方公司为它们的产品开发 macOS 专用的驱动,但这种情况仅常见于 WiFi/蓝牙/采集卡 等功能较为细分或其它专业设备,显卡是明确不在此列的。

所以,在 OpenCore/Clover 的设备属性(DeviceProperties)中,它们提供了仿冒设备 ID 的功能(Spoof Device ID)。设备ID(device-id)属性主要用于仿冒设备 id 从而驱动 macOS 原本不支持的设备,例如 HD4400 仿冒 HD4600;RX550 512SP 仿冒 RX550 640SP;再比如不支持的 ALC 声卡或英特尔网卡型号。

其原理是,macOS 的 IOKit 通过检测设备 ID 来决定哪些设备可以连接到哪个驱动文件,这些存放驱动的 kext 本身能支持的设备是很多的,但是苹果自己的驱动里包含的设备 ID 是有限的,因此指定 device-id 即可欺骗 IOKit ,让它加载对应的文件以驱动设备。「提示」可以这么做的前提就是存放驱动的 kext 本身能够支持设备,所以给 RTX3090 指定 RX 6900XT 的设备 ID 是没有用的。显卡设备 ID 有案例可以参考,比如黑苹果星球一直在整理的

如何仿冒显卡设备ID以驱动显卡?

上图中,0x67FF1002 就是 macOS 原生支持的 RX 550 640SP 的设备 ID,它位于 S/L/E 目录下的 kext 文件中。

 

原因

这部分和解决方法无关,晕字的可以跳过这个部分。

接着用 RX550 举例,苹果内置的驱动仅包括 Baffin 和 Polaris 核心 RX550 640SP 版的设备 ID:0x67FF1002,但同时 AMD 还用 Lexa 核心推出了 RX 550 512SP 的 0x699F1002 版本。由于设备 ID 和 macOS 内置的 ID 对不上号,导致无法驱动。

如何仿冒显卡设备ID以驱动显卡?

那为什么同一个显卡型号存在两种甚至三种不同的芯片型号?这里涉及一个 AMD 营销套路的小知识点,顺便说一下。

  • 随着工艺制程和设计水平的提升,芯片集成的晶体管规模越来越大;
  • 芯片制造存在良品率,晶体管规模越大工艺越新,良品率就越低,这是客观现实;
  • 现在的 GPU 芯片动不动就上百亿晶体管规模,所以在制造的过程一部分晶体管造出来就是坏的,无法工作的;

完整的 Polaris21 和 Baffin 核心(主要对应 RX560)应该具有 1024 个流处理器(Stream Processor,SP),但在芯片制造的过程中,因良品率的关系产生了部分晶体管损坏的芯片,AMD 决定屏蔽损坏的部分,削减规格推出减配版本,于是 RX560D(896SP)和 RX550(640SP)就这么做出来了,AMD 历史上的很多产品都采用了这种操作。由于 RX560D 和 RX560 共用同一款 GPU 芯片(Polaris21/Baffin),所以部分 RX560D 可以通过“开核”来解锁本应被屏蔽的那部分晶体管,免费提升性能,也因此开核有一定的失败率。这个骚操作让 AMD 收回了成本,玩家得到了开盲盒的快乐,“开核”成功就是免费升级,大家都 Happy。

市面上的 RX550 有 Lexa,Baffin 和 Polaris 三种核心。其中 Polaris 是最少见的,笔者仅见过蓝宝石的一款;其次是 Baffin,这个比 Polaris 多,但也比较少见;到 2021 年以后,市面上日常出售的 RX550 有九成是 Lexa 核心,这款核心满血状态是 640SP,但目前常见款只有 512SP,整体规格也是入门级(128bit 带宽 + 2GB 显存)。

各个核心的技术规格,可以到 TechPowerUP 网站查看,信息非常全:

  • Polaris 21
  • Baffin
  • Lexa

在矿潮的今天,有很多玩家卖掉了手里的中高端显卡(矿老板给的实在太多了.jpg),也有很多配了新机器苦等几月买不到心水显卡的玩家。这种情形下购买一款因无法挖矿而价格上涨不多,也能轻松买到的入门级显卡成为很多人的选择。

那么问题来了,AMD 不单单削减了上述变种卡的规格,还顺手赋予了它们一个全新的设备 ID。使用新设备 ID 在 Windows 中没有任何影响,因为 Windows 的显卡驱动由 AMD 控制和发布,而 macOS 驱动由苹果公司控制,AMD 不需要向苹果提交新设备的驱动,因为苹果自家的产品集成度非常高,并且除 Mac Pro 产品线之外的型号,显卡通常不能更换,是直接焊在主板上的,在整个产品生命周期中,基本没有更新驱动的理由。

以上,就是问题的前因后果。

 

确定设备 ID

查找和确定设备 ID 分为两个部分,第一个部分是确定你自己的设备 ID,第二个部分是确认 macOS 最接近的设备 ID。

 

你的设备 ID

Windows 平台使用 GPU-Z,或在设备管理器中查看;macOS 平台下,点击系统信息报告即可

如何仿冒显卡设备ID以驱动显卡?

设备 ID 一般以以下的形式出现:

  • 0x3E9B8086
  • 0x67DF1002
  • 0x13C010DE

0x 指的是十六进制;最后四位是供应商 ID(Vendor ID),Intel 是 8086;AMD/ATI 是 1002;NVIDIA 是 10DE;中间四位是确切的设备 ID,是我们需要的信息。

各家供应商的 PCI 设备 ID 信息可以通过以下几个数据库网站查询:

  • Device Hunt
  • PCI Lookup
  • PCI Devices(推荐)

经过查询和确认,我们得到 RX550 512SP 的设备 ID 是 0x699F1002 ,这个设备 ID 对应的是 Radeon RX 540/540X/550/550X 。

 

macOS 支持的设备 ID

macOS 支持的设备 ID 可以从 macOS 的 /System/Library/Extensions/ 目录以下系统文件中查找:

  • AMD7000Controller.kext: HD7XX0、R7 2XX、R9 2XX
  • AMD8000Controller.kext: HD7XX0、R9 2XX、R7 3XX
  • AMD9000Controller.kext: R9 2XX、R9 3XX
  • AMD9500Controller.kext: WX4100/5100/7100、RX 460/470/480/550/560/570/580/590
  • AMD10000Controller.kext: WX8100/9100、RX Vega 56/64
  • AMDRadeonX5000.kext: Radeon VII
  • AMDRadeonX6000.kext: W5500/5700、RX5500/5600/5700/XT、RX6800/6800XT/6900XT

经过查询和确认,我们得到最接近 RX 550 512SP 的设备 ID 是 0x67FF1002,这个设备 ID 对应的是 Radeon RX550 640SP / RX560/560X 。

 

设备属性注入法

确定了设备 ID,下一步就是如何注入。方法一是通过 OpenCore/Clover 的注入设备属性(DeviceProperties)功能来仿冒,通过向指定的 PCI 路径为设备注入一些属性,达到仿冒设备 ID 以获得驱动的效果。下面是 RX550 512SP 仿冒 RX550 640SP 的例子:

<key>PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)</key>
<dict>
	<key>device-id</key>
	<data>/2cAAA==</data>
	<key>model</key>
	<string>Radeon RX 550</string>
</dict>

注入的方法比较简单,在 config.plist 中添加以上内容就可以,ProperTree 用户确认自己的 Pci 路径后可直接复制粘贴。不明白的,看下面详细步骤:

 

首先从 Hackintool 获取设备的 PCI 路径:

如何仿冒显卡设备ID以驱动显卡?

如图所示复制 Device Path。

然后打开 OpenCore Configurator / Clover Configurator / OpenCoreAuxiliaryTools / ProperTree 编辑器,照图输入:

如何仿冒显卡设备ID以驱动显卡?

如何仿冒显卡设备ID以驱动显卡?

如何仿冒显卡设备ID以驱动显卡?

如何仿冒显卡设备ID以驱动显卡?

「注意」最后说明一下 0x67FF1002 是怎么变为 FF670000 的。具体来说是因为“大小端”(Endianness),解释起来太过复杂,感兴趣的同学可前往百度百科或 Wikipedia 查看。

  • 第一步,0x67FF1002 删除前缀 0x,这部分代表十六进制,没有实际意义;
  • 第二步,将 1002 后缀删除,这部分代表供应商 ID(Vendor-ID),在仿冒设备 ID 时没有实际意义;
  • 第三步,剩余值按 大端 → 小端 的形式转换,具体来说就是两个一组分开,然后按从右到左的顺序重新排列,例如: <67 FF> → <FF 67>
  • 最后,补全 8 位,得到 FF670000 。其它设备 ID 以此类推。

 

保存,重启即可生效。声卡,网卡的仿冒操作也是同理。

 

SSDT 方法

相比设备属性注入方法,SSDT 方法具有更高的执行优先级,整体稳定性和效率也要更高,但是使用起来有一点技术门槛。

首先第一步还是确定设备的路径,这里介绍 Windows 设备管理器和 IORegistryExplorer.app 两种查找方法,哪个对你来说方便,选哪个就行。

 

Windows 设备路径查找方法

进入 Windows 10,按下 Win + X 组合键,在弹出的菜单中打开“设备管理器”。找到你的独显,右键选择“属性”,然后切换到“详细信息”选项卡,在属性框中找到“位置路径”,如下图:

如何仿冒显卡设备ID以驱动显卡?

其中第二行的:

ACPI(_SB)#ACPI(PCI0)#ACPI(PEG1)#ACPI(PEGP)

这个部分就是我们需要的设备路径。另外,如果能直接在“属性”中找到“BIOS 设备名称”就更好了:

如何仿冒显卡设备ID以驱动显卡?

这里的 BIOS 设备路径是可以直接使用的 ACPI 路径。如果你的只有第一种,去掉其中的 #ACPI 和 括号,然后以英文 . 连接起来:

_SB.PCI0.PEG1.PEGP

保存下来,下面介绍如何使用。

 

macOS 设备路径查找方法

通常,我们使用 IORegistryExplorer.app 在 macOS 中来完成查找操作,但这个软件只支持 10.14 及以上的系统,所以使用 10.13.6 的同学只能使用 Windows 方法或自行转换 PCI 路径。

如何仿冒显卡设备ID以驱动显卡?

如图,将路径中带 @ 符号的部分组合起来,即可得到设备路径,但由于 WhateverGreen.kext 会自动将独显修改为 GFX0,导致最终路径会不准确。

将提取到的路径信息保存下来,下面介绍如何使用。

 

修改预编译的 SSDT

接下来需要使用 MaciASL.app ,这是一款用来编译 dsl 和 aml 文件的编译工具。使用软件打开黑苹果星球整理好的 .dsl 文件(注意看文件包说明选择文件)将你在上一步中得到的路径替换下图中所示的位置:

 

下载 SSDT-SPOOF-GPU.aml,提取码:8w3u

如何仿冒显卡设备ID以驱动显卡?

  • 替换的过程中,最重要的一点是一个标点符号都不能错,例如,上图中要替换以下两个位置的路径信息(绿色标注):
    • External (_SB_.PCI0.PEG0.PEGP, DeviceObj)
    • Scope (\_SB.PCI0.PEG0.PEGP)
    • 替换完成后应该如下(仅举例,橙色标注):
    • External (_SB.PCI0.RP17.PXSX, DeviceObj)
    • Scope (\_SB.PCI0.RP17.PXSX)
  • 第二点,关于 0x67FF1002 是怎么变为 FF670000 的。具体来说是因为“大小端”(Endianness),解释起来太过复杂,感兴趣的同学可前往百度百科或 Wikipedia 查看。
    • 第一步,0x67FF1002 删除前缀 0x,这部分代表十六进制,没有实际意义;
    • 第二步,将 1002 后缀删除,这部分代表供应商 ID(Vendor-ID),在仿冒设备 ID 时没有实际意义;
    • 第三步,剩余值按 大端 → 小端 的形式转换,具体来说就是两个一组分开,然后按从右到左的顺序重新排列,例如: <67 FF> → <FF 67>
    • 最后,补全 8 位,得到 FF670000 ,因此 Buffer(0x04) 中的值分别就是 0xFF, 0x67, 0x00, 0x00
    • 其它设备 ID 以此类推。

 

完成后,点击左上角 文件 → 另存为 → 文件格式选择 ACPI Machine Language Binary ,保存到任意位置,如下图:

如何仿冒显卡设备ID以驱动显卡?

 

 

添加到引导工具

「注意」这里只是举例说明,不用照抄文件名。Clover 比较简单,先说 Clover。直接把文件放到以下路径:

  • /EFI/Clover/ACPI/Patched/

重启即可见效。

 

OpenCore 用户把文件放到以下路径:

  • /EFI/OC/ACPI/

然后编辑 config 文件,把文件添加到 ACPI 部分,并启用,见下图:

如何仿冒显卡设备ID以驱动显卡?

如果是 ProperTree,如下图:

如何仿冒显卡设备ID以驱动显卡?

保存重启见效。

 

效果验证

说实话笔者没有亲自验证过 RX550 512SP 经过仿冒后是否完完全全可以正常使用,不过,咱们交流群里给力的群友 @丿木子丶丶 已经亲自测试过,表示一切正常。

如何仿冒显卡设备ID以驱动显卡?

 

需仿冒的显卡和 ID

这里简单整理一下需要仿冒的显卡型号以及要仿冒的设备 ID,并未全部验证过,欢迎反馈。

 

  • R9 290 / R9 390:建议 0x67B01002
  • R9 280:建议 0x679A1002 或 0x67981002
  • R9 380:建议 0x69381002 或 0x69391002
  • R9 270 / R9 370:建议 0x68101002
  • R7 240 / R7 340:建议 0x682B1002 或 0x665D1002
  • RX 550 512SP:建议 0x67FF1002
  • RX 640 Dell OEM:建议 0x67FF1002
  • RX 580 2048SP:建议 0x67DF1002
  • RX 590 GME:建议 0x67DF1002
  • HD Graphics 4400:建议 0x04128086

 

最后,部分显卡也有其它解法,例如 RX580 2048SP 和 RX590 GME,可以刷 VBIOS 变回直接免驱的型号。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注