Dell T5820通过ReBarUEFI工具强制修改BAR
Dell T5820这款早期工作站的主板有一个巨大缺陷是不支持 NVIDIA Tesla A2 GPU运算卡 和 AMD Radeon Instinct MI50 这样的服务器GPU计算卡的大规格BAR,导致无法启动主机。我在反复折腾 修订AMD MI50 VBIOS的BAR size 失败之后,gemini终于推荐了使用开源工具 xCuri0/ReBarUEFI 来为主板BIOS注入一个 UEFI 驱动(DXE Driver),这样可以将显卡的 BAR 强制限制在 256MB、512MB 或 1GB,即使显卡固件请求32GB,主板也只会给他分配一个小窗口,从而允许顺利开机。
备注
和AI对话就像即时战略游戏中的无尽地图,通过不断的排列组合试探,才能在某一个瞬间触发发现新大陆!!!
警告
由于 Dell Precision T5820 工作站 对BIOS写入有签名保护,所以自制的BIOS是无法直接刷入主机BIOS的,需要采用 外部EEPROM烧录器 绕过主板上的PRR(写保护寄存器)
分析
为何我的 AMD Radeon Instinct MI50 一直无法在 Dell Precision T5820 工作站 上启用,我经过各种尝试后推测如下:
evilJazz/MI50_32GB_VBIOS.md 列出了 AMD Radeon Instinct MI50 原生的VBIOS 113-D1631711-100 是一个Legacy only VBIOS(不支持UEFI),同时不支持ReBAR。既然GPU不支持ReBAR,那么 Dell Precision T5820 工作站 不支持ReBAR也没关系。但是这里有一个关键点就是这款MI50数据中心计算卡,由于不支持ReBAR,就会强制要求主机提供一个32GB的大型BAR。
这种大型BAR的要求,对于 HPE ProLiant DL380 Gen9服务器 这样的标准数据中心服务器是能够满足的,但是对于 Dell Precision T5820 工作站 则无法做到。虽然T5820也支持工作站系列的NVIDIA RTX,并且支持高达48GB的显存,但是工作站显卡显然不会采用数据中心这种申请整块巨大BAR的方式,而是采用传统的Small BAR,所以在T5820上大规格显存的工作站显卡可以使用。
我后来刷新了 AMD Radeon Instinct MI50 的VBIOS,采用了V420的VBIOS,此时由于V420的VBIOS是UEFI格式,并且支持ReBAR协商,理论上应该更好地适应工作站主板或者兼容台式机(在2017年以后的台式机主板普遍支持ReBAR)。此时就凸显出了T5820的短板: 不支持ReBAR协商,这导致它无法和MI50握手协商一个双方都能够支持的BAR Size。
目前最佳的用于工作站的 AMD Radeon Instinct MI50 VBIOS是用于V420的VBIOS,兼顾了UEFI和ReBAR,这意味着能够用于无法直接支持32GB大BAR的普通工作站。现在需要解决的就是如何让 Dell Precision T5820 工作站 也支持ReBAR协商,以便能够和 AMD Radeon Instinct MI50 握手确定一个最佳BAR。
准备工作
ReBarUEFI需要修订原厂的BIOS,这个步骤结合 Dell T5820刷入修改过的BIOS 来完成。因为之前我尝试 配置Dell T5820 Aperture Size变量 采用直接从Dell官网下载的BIOS更新执行程序中提取BIOS的bin文件失败,经过探索, Dell T5820刷入修改过的BIOS 能够提取完整原生的BIOS bin文件,所以在执行 ReBarUEFI 之前,先采用该方法(使用外接的EEPROM编程器获取BIOS bin)
通过 flashrom 获取主机BIOS bin:
# 执行2次备份,生成2分BIOS bin文件,两次备份时不要移动夹子,确保物理电气连接环境完全一致
# 每次备份需要3-5分钟,务必确保电脑不要进入休眠状态
sudo flashrom -p ch341a_spi -c "W25Q256JV_Q" -r backup1.bin
sudo flashrom -p ch341a_spi -c "W25Q256JV_Q" -r backup2.bin
# 校验2个BIOS bin文件的哈希值
sha256sum backup1.bin backup2.bin
复制其中一个BIOS bin文件准备进行后续修订:
t5820_bios_rebaruefi.bin 待修订cp backup1.bin t5820_bios_rebaruefi.bin
ReBarUEFI
xCuri0/ReBarUEFI 提供了 ReBarUEFI 为官方不支持Resiable BAR的系统提供了一个UEFI DXE驱动,来实现ReBAR支持。这样就为陈旧的老主机带来了支持最新ReBAR协议的能力,可以安装类似 Intel GPU Arc 系列这样必须使用ReBAR的显卡。
准备
(可选)激活
4G Decoding: 在BIOS中激活 Above 4G Decoding BIOS设置 ,没有激活这个选项那么就会被限制在1GB BAR甚至512MB BAR,这种情况下最多可以设置为2GB BAR(可选)BIOS 支持Large BARs : ReBarUEFI 能够修复和这个相关的大多数问题
添加FFS模块
修订 t5820_bios_rebaruefi.bin 需要使用 LongSoft/UEFITool ,这是一个图形程序,在Linux环境下需要使用Qt,所以运行环境安装还是比较繁重的,并且在 Alpine Linux 下(musl libc)安装比较折腾,需要安装 gcompat 来运行为glibc编译的Linux预编译包:
apk add gcompat
为了方便完成,更为简单的方法是在 macOS 或 Windows 环境使用UEFITool
备注
不要下载最新的 UEFITool_NE 版本,最新的UEFITool只支持查看不支持修改!!!
只有 UEFITool non-NE (0.28) 支持添加模块: 别问我为什么,ReBarUEFI文档是这么写的,我头铁尝试了最新版本, Insert after 等菜单都是灰色不可用,最后还是乖乖按照文档下载了指定的 0.28 版本
注意,这个 0.28 版本没有签名,所以需要在 System Preferences >> Security & Privacy 中设置允许运行这个程序才能使用!
在UEFITool中使用
Search功能,搜索Header only GUID:
搜索 Header only GUID
搜索的结果是 GUID pattern "3C1DE39F-D207-408A-AACC-731CFB7F1DD7" found as "9FE31D3C07D28A40AACC731CFB7F1DD7" in 9E21FD93-9C72-4C15-8C4B-E77F1DB2D792/.../PciBus at header-offset 00h ,此时可以看到在一个 PciBus 下找到这个GUID
找到PciBus
在这个PciBus所在的Volume的最后就是需要插入 ReBarDxe.ffs (<=需要下载该文件)的地方,所以滚动到搜索这个 Header only GUID 的卷的末尾,选择最后一个 module 并右击鼠标,选择 Insert after 菜单:
在该卷的最后一个模块后面插入 ReBarDxe.ffs
插入 ReBarDxe.ffs 之后,就可以看到最后增加了一个名为 ReBarDxe 的模块:
可以看到卷末尾增加了一个 ReBarDxe 模块
最后使用
File -> Save image file保存修改后的BIOS文件,我命名为t5820_bios_rebaruefi_fixed.bin
UEFIPatch
由于大多数消费级主板在处理64位BAR存在问题,而 Resiable BAR功能 需要64位BAR才能正常工作,所以需要使用 UEFIPatch (UEFITool的一部分)来修补UEFI,使其兼容64位BAR并解决各种问题。
前面插入了 ReBarDxe.ffs 只是将功能放入了BIOS,但是许多主板(尤其是 Dell、HP 这种商业大厂)的 BIOS 固件中存在硬编码限制,会限制 PCIe BAR 的大小,或者在启用 Above 4G Decoding 时依然存在内存对齐 Bug。 UEFIPatch 的作用就是 “暴力拆除” 这些限制:
解除 4GB 限制 :许多老款 BIOS 即便开启了
Above 4G,也会将单个 PCIe 设备的显存分配限制在2GB或4GB以内。 AMD Radeon Instinct MI50 有 32GB,不打补丁几乎肯定会报错。修复权限/校验 :补丁可以自动修改 BIOS 中的汇编指令,允许系统分配更大的内存地址空间(
mmio)给 GPU。下载 UEFITool non-NE (0.28) 中的
UEFIPatch(我在macOS平台执行,所以下载的是UEFIPatch_0.28.0_mac.zip下载 patches.txt 并存放到
UEFIPatch执行程序和t5820_bios_rebaruefi_fixed.bin(BIOS文件)所在的目录下
按照 Using UEFIPatch 文档,对于不同系列的CPU 对应的主板芯片 需要添加不同的补丁内容。我的 Dell Precision T5820 工作站 使用的 Intel Xeon W-2225 属于 Cascadelake 架构,主机 Dell Precision T5820 工作站 的芯片集是 Intel C422系列主板芯片 ,文档中没有要求再修订 patches.txt
另外,我检查了下载的 patches.txt 内容,其中的注释说明了patches补丁是针对哪种处理器架构的,我没有找到 Cascadelake 架构(intel第10代处理器)对应的配置(最高的配置是针对 Remove <64GB BAR size limit (Skylake/Kaby Lake/Coffee Lake) ): 这说明 Cascade Lake这代处理器架构已经足够先进,已经避开了4GB寻址的硬编码陷阱。
所以我决定先采用 不执行UEFIPatch 的 t5820_bios_rebaruefi_fixed.bin 刷入 Dell Precision T5820 工作站 ,然后观察 AMD Radeon Instinct MI50 的 Large Memory Range 是否成功分配生效。如果出现 Code 12 错误,提示"该设备找不到足够的可用资源",则表明BIOS 的 MMIO 窗口确实被限制了,无法容纳 32GB 的 BAR。或者出现即使开启了 Above 4G 依然强行将BAR压缩在小容量范围(例如256MB),则在回过头来使用 UEFIPatch 。
sudo flashrom -p ch341a_spi -c "W25Q256JV_Q" -w t5820_bios_rebaruefi_fixed.bin
备注
经过尝试,我发现即使 patches.txt 没有列出 Cascadelake 架构,这个 UEFIPatch 还是 要执行的
我尝试了没有执行 UEFIPatch 的 t5820_bios_rebaruefi_fixed.bin ,刷入 Dell Precision T5820 工作站 之后主机无法启动,电源指示灯会闪烁 3次琥珀色 ,表明内存(RAM)检测失败 或 BIOS 损坏(校验和错误)。由于我修订了BIOS,这通常意味着BIOS 模块插入后的校验和(Checksum)不匹配,导致主板的安全启动逻辑拦截了引导。
实践证明不执行 UEFIPatch 无法启动,所以我执行如下命令进行补丁:
UEFIPatch./UEFIPatch t5820_bios_rebaruefi_fixed.bin
执行上述命令显示确实有patch效果:
UEFIPatchparseVolume: non-UEFI data found in volume's free space
parseVolume: non-UEFI data found in volume's free space
parseFile: non-empty pad-file contents will be destroyed after volume modifications
patch: replaced 11 bytes at offset 6CE5h B800000000100000004C3B -> B8FFFFFFFFFFFFFF004C3B
Image patched
可以看到 UEFIPatch 对插入过 ReBar.ffs 的BIOS文件做了补丁,补丁以后生成了一个文件 t5820_bios_rebaruefi_fixed.bin.patched
我将该 t5820_bios_rebaruefi_fixed.bin.patched 重命名为 t5820_bios_rebaruefi_fixed_patched.bin ,然后重新刷入 Dell Precision T5820 工作站
sudo flashrom -p ch341a_spi -c "W25Q256JV_Q" -w t5820_bios_rebaruefi_fixed_patched.bin
警告
很不幸,我尝试了 UEFIPatch 之后的 ReBarUEIF 的BIOS,依然没有解决启动问题,电源指示灯还是会闪烁 3次琥珀色
继续: Checking for pad file issue
按照文档提及 "UEFITool/UEFIPatch have a bug which results in pad file corruption that affects mostly ASUS motherboards. Pad file corruption will cause boot failure which can only be fixed by flashing a proper BIOS."
ReBarState
接下来使用