我想使用多 M.2 NVMe PCIe 载卡,例如华硕 Hyper M.2 x16 卡 v2在一个HP Z240 塔式工作站。其C236 PCH和Skylake E3-1200V5 CPU支持PCIe分叉由 CPU 驱动的 x16 PCIe 插槽。 (参考:Intel 100 系列/C230 系列芯片组数据表第 1 卷,p。 22;英特尔至强 E3-1200V5 数据表第 1 卷,p。 24.) 将 CPU PCIe 配置为分叉 1x8 + 2x4 模式将允许在 x16 插槽中使用 3 M.2 NVMe 驱动器。 (E3 CPU 无法进行 4x4 分叉,因此像上述华硕这样的四载卡中的 M.2 插槽之一必须保持为空。)
不幸的是,Z240 的 BIOS 设置不包括配置 PCIe 分叉的选项。更糟糕的是,似乎惠普的确定开始双BIOS防止 BIOS 修改哪个可以实现 PCIe 分叉。
这Intel视频介绍PCIe分叉指出(02:34)
CPU PCI Express 总线的配置由 BIOS 在初始化之前静态确定。 BIOS 通过查看 CPU 上的存在检测引脚(称为 CFG[5] 和 CFG[6])来确定配置。
据推测,即使 BIOS 设置不包含任何配置分叉的选项,这也能起作用。但这种方法需要访问和修改与物理 CPU 板的连接,我希望避免这种情况。
其他包含配置分叉选项的 BIOS 显然会覆盖 CFG[5] 和 CFG[6]。我没有找到关于他们如何做到这一点的文档,并且对于您可能知道的任何链接将不胜感激。
此时我想知道:在机器启动到Linux后,有没有办法覆盖CFG[5]和CFG[6]? (我意识到在这种情况下我可能无法从 M.2 驱动器之一启动,但这不是该系统的要求。)我希望这样的过程可能涉及以下步骤热复位x16、x8 和 x4 PCIe 控制器和/或功能级重置 PEG 根端口 10、11 和 12。(参考:英特尔至强 E3-1200V5 数据表第 2 卷.) 也许后面是执行程序?
非常感谢您提供的任何提示、技巧或指导!
答案1
我不知道这是否可能,但可以建议一些进一步研究的途径:
您链接的视频看起来像是上一代英特尔处理器的视频(视频日期为 2010 年,Skylake 于 2015 年发布),因此 Skylake 处理器的配置很可能不同。话虽如此,这意味着设置是由 BIOS 执行的,并且 BIOS 读取 CFG pad 值,然后设置 PCIe 控制器配置寄存器来实现这一点(意味着它可以完全忽略 CFG pad 值)如果它选择的话)。
通常,这些类型的配置寄存器的详细信息仅记录在 Intel“BIOS 编写者指南”/“UEFI 固件编写者指南”中,而 Intel 并未针对大多数 CPU 公开发布这些配置寄存器。某些 CPU 配置寄存器还包括 BIOS 的“锁定”选项(以便在 CPU 重置之前无法更改(甚至可能读取)其内容。如果是这样,HP 固件可能会这样做以防止进一步发生也有可能您需要的寄存器只能从 CPU 的“系统管理模式”访问。
如果我尝试这样做,那么我会尝试查找 SkyLake 固件的代码(例如来自其他制造商的代码)来执行您需要的配置。您可以反汇编该固件,看看它如何配置 CPU 以启用分叉,然后尝试写入相同的寄存器(从 Linux 内核模式,或者可能使用 GRUB)。
您还可能在开源固件实现(例如 Coreboot)中找到一些有用的代码。
HTH,祝你好运!