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 设备连接与信号检查
当你选好板子、插好设备,别急着开机。按我的习惯,先做两步检查:
- 物理连接:确认卡插入到位,锁扣扣紧。PCIe卡的金手指边缘有缺口,插反是插不进的,但有人硬掰——别这样。
- 辅助供电:高端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卡的金手指是否氧化,重新插拔一般能解决。我遇到过因为机箱挡板没对齐导致卡没插到底,折腾了两小时。
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不是玄学,每一步都有据可查。