4. 硬件环境搭建:Intel开发板/服务器选型、PCIe设备连接与识别

做PCIe DMA开发,第一步不是写驱动,也不是画FPGA代码——你得先把硬件环境弄对。说白了,这块搞不定,后面所有功夫都是白搭。

我这些年接触过不少Intel平台,从入门级的Core i7工控板到Xeon Gold服务器,再到官方开发板(像以前的Grantley,后来的Purley)。每个平台在PCIe上的表现都不一样。你想想看,选错了板子,链路只能跑到Gen2,DMA带宽直接砍半,多憋屈。

4.1 Intel平台选型:开发板 vs 服务器

我个人习惯是这样:原型验证阶段用官方开发板,稳定、资料全、PCIe lane数给得足。量产或做性能测试,直接上服务器。

关键决策点

  • CPU型号:Xeon Scalable(如第二代/第三代/第四代)提供最多48条PCIe lane;Core i7/i9通常只有16条。
  • PCH芯片组:C620系列(Purley)或C740系列(Whitley)对PCIe扩展支持更好。
  • 官方开发板:Intel常提供像S2600BPB之类的CRB(Customer Reference Board),带全速x16插槽。

我遇到过一件事:有个项目用了一台旧款Core i5迷你机,主板PCIe插槽是x16物理接口,但电气只连了x1。插上我们自家的DMA加速卡,lspci能看到设备,但链路只能跑到2.5GT/s。后来换成Xeon Silver 4214平台,直接x8 Gen3,带宽翻了N倍。

小建议:采购前先看Intel ARK页面,查CPU的「PCI Express Revision」和「PCI Express Configurations」字段。或者直接问FAE要平台说明书。

4.2 PCIe插槽与链路能力:别被物理接口骗了

即使插槽是x16形状,也不代表它给了你16条lane。很多主板为了省钱,电气上只连了x4甚至x1。怎么确认?

PCIe Generation 每lane带宽 x4总带宽 x8总带宽 x16总带宽
Gen2 (5.0 GT/s) 500 MB/s 2 GB/s 4 GB/s 8 GB/s
Gen3 (8.0 GT/s) 1 GB/s 4 GB/s 8 GB/s 16 GB/s
Gen4 (16.0 GT/s) 2 GB/s 8 GB/s 16 GB/s 32 GB/s
Gen5 (32.0 GT/s) 4 GB/s 16 GB/s 32 GB/s 64 GB/s

我曾经踩过的坑:一块x8的FPGA加速卡,插在PCIe x16插槽上,结果发现系统只报告链路宽度x1。查了主板手册才知道,那个黑色插槽是为显卡预留的,实际只能跑x1。后来换到白色x8插槽才正常。

注意:部分主板拥有「拆分模式」(Bifurcation),可以在BIOS里把x16拆成4个x4。如果你插了x4设备,但主板默认x16模式,设备可能无法识别。记得进BIOS检查「PCIe Slot Configuration」。

4.3 设备连接与信号检查

当你选好板子、插好设备,别急着开机。按我的习惯,先做两步检查:

  1. 物理连接:确认卡插入到位,锁扣扣紧。PCIe卡的金手指边缘有缺口,插反是插不进的,但有人硬掰——别这样。
  2. 辅助供电:高端DMA卡(比如带大量DDR或HBM的)可能需要6pin或8pin供电。不接的话,卡可能点不亮,或者链路只降级到Gen1。

上电后,看板卡上的LED。大部分PCIe设备有「Link Active」指示灯,如果是绿色常亮,说明物理链路已经连接。但别全信指示灯,我见过卡亮了但系统里没枚举到的情况。

4.4 系统识别与验证

开机进Linux,先跑一下 lspci。这是最直接的方式。

实用命令:lspci -vv -s 03:00.0(替换成你的设备BUS号)。重点看 LinkCap 和 LinkSta 字段。

# 查看所有PCIe设备
lspci

# 查看具体设备详细信息
lspci -vv -s 03:00.0 | grep -E "LnkCap|LnkSta"

# 观察内核打印,确认设备被枚举
dmesg | grep pci | grep -i "81"

输出示例(转写为文字):

LnkCap: Port #0, Speed 8GT/s, Width x8, ASPM not supported
LnkSta: Speed 8GT/s (ok), Width x8 (ok)

如果能读到 Speed 8GT/s 就是Gen3,Width x8 就是8条lane。如果显示 Width x1 或 Speed 2.5GT/s,说明链路存在问题。

避坑提醒:如果链路协商为Gen1(2.5GT/s),先别急着换板子。检查一下PCIe卡的金手指是否氧化,重新插拔一般能解决。我遇到过因为机箱挡板没对齐导致卡没插到底,折腾了两小时。

PCIe硬件环境搭建流程 Intel平台选型 检查PCIe插槽规格 安装设备+辅助供电 上电并检查硬件信号 系统识别 (lspci/dmesg) 验证链路宽度与速度 提示:链路协商失败时,检查金手指是否氧化、BIOS拆分设置、辅助供电是否插紧 常见故障:LnkSta显示Speed 2.5GT/s且Width x1 → 重新插拔或更换插槽

4.5 实战检查清单

为了方便你快速定位问题,我总结了几个关键检查项:

检查项 正常标准 异常处理
lspci 能列出设备 能看到 Vendor ID & Device ID 检查RESET信号、BIOS设置
链路宽度 LnkSta Width = 期望值 检查插槽物理连接、Bifurcation
链路速度 LnkSta Speed >= Gen2 检查金手指、重新插拔
BAR空间分配 lspci -vv 有 Memory at 区域 检查BIOS中Above 4G Decoding
MSI/MSI-X中断 中断号非0 检查驱动、ACPI设置

个人经验:最坑的是BIOS里有个「Above 4G Decoding」选项,默认关闭。如果你的DMA卡需要64位BAR地址,不开这个,lspci会显示BAR为全0或者分配失败。我曾在客户现场调了半小时驱动才发现是BIOS没开。

嗯,硬件环境搭好了,你就能踏踏实实地往后走了。PCIe不是玄学,每一步都有据可查。