PCIe Port 服务、错误恢复与高级能力
1. Capability 组织
PCI 配置空间有两类链表:
- 传统 Capability:前 256 B,例如 PM、MSI、MSI-X、PCIe;
- Extended Capability:PCIe 扩展空间,例如 AER、DPC、ATS、SR-IOV、DOE、PTM。
pci_find_capability()和pci_find_ext_capability()负责定位。Capability 链来自硬件,内核必须防御循环、非法 offset 和截断配置空间。
2. PCIe Port Bus
pcie/portdrv_pci.c以普通pci_driver绑定 Root Port、Upstream/Downstream Port 或 RCEC;portdrv_core.c再把一个端口拆成逻辑服务设备:
1 | PCIe port pci_dev |
每个服务通过pcie_port_service_driver独立绑定和处理 IRQ。PCIe 端口服务与网卡/NVMe 等 Function 驱动不是同一种 driver。
3. AER
pcie/aer.c处理 Root Error Status、Correctable/Uncorrectable Error Status 和 Header Log。典型流程:
1 | AER interrupt/message |
pcie/err.c沿受影响层级调用功能驱动的pci_error_handlers。Correctable 错误通常只记账,Fatal 错误可能需要 DPC、链路 reset 或移除设备。
4. DPC
Downstream Port Containment 在下游严重错误时快速关闭流量,避免坏事务继续扩散。pcie/dpc.c作为端口服务处理触发原因、RP PIO 日志和恢复。
DPC 与 AER互补:
- AER描述和报告错误;
- DPC隔离故障链路;
- 错误恢复框架决定驱动回调和 reset;
- ACPI EDR 可与固件协作恢复。
5. ASPM
pcie/aspm.c管理:
- L0s;
- L1;
- Clock Power Management;
- L1 Substates(L1.1/L1.2)。
策略通过pcie_aspm.policy和内核参数影响,但实际启用取决于链路两端能力、latency、L1SS、CLKREQ#和 quirk。只看 Endpoint Capability 不够,必须检查上游 Port。
RK3588 厂商树还有aspm_ext.c扩展接口。它并非上游通用 ABI,移植新内核时应单独审查。
6. PME、PTM 与 RCEC
pme.c:处理 PCIe 原生 PME 唤醒;ptm.c:Precision Time Measurement 层级配置;rcec.c:Root Complex Event Collector 与 RCiEP 错误关联;edr.c:ACPI Error Disconnect Recover。
RK3588 常见 DT 启动不使用 ACPI EDR,但 AER/PME 是否可用仍取决于最终配置和端口能力。
7. DOE
doe.c实现 Data Object Exchange mailbox。一个设备可有多个 DOE mailbox,每个 mailbox 缓存支持的 Vendor/Protocol。
1 | pci_doe_submit_task() |
pci_doe_submit_task()位于 586 行。DOE 事务可睡眠且有超时/abort,不应在原子上下文同步等待。上层 SPDM/CXL 等协议必须验证响应长度和协议 ID。
8. P2PDMA
p2pdma.c允许一个 PCI 设备的 BAR 内存直接供其它 PCI 设备 DMA:
- provider 通过
pci_p2pdma_add_resource()发布 BAR 区域; - Core 计算 provider 与 clients 的拓扑距离;
- 分配 P2P pages/scatterlist;
- client DMA 直接访问 provider。
它并不保证跨 Root Port 工作。许多 Root Complex 会阻止或重定向 P2P,安全默认是同一上游桥下使用。启用前还需确认 ACS/IOMMU 路径不会破坏事务。
9. VPD 与 VC
vpd.c通过 VPD Capability 访问只读/可写字段,并处理设备忙和超时;vc.c配置 Virtual Channel 资源;- 两者都依赖设备正确实现 Capability,quirk 可限制损坏或超慢的 VPD。
VPD 写操作可能修改设备持久信息,不应作为普通运行时数据通道。
10. Quirks
quirks.c按阶段运行 fixup:
- EARLY;
- HEADER;
- FINAL;
- ENABLE;
- RESUME/RESUME_EARLY;
- SUSPEND。
匹配可基于 vendor/device/class。Quirk 用于硬件/固件缺陷,不应把板级电源时序或业务驱动逻辑无条件塞入通用 PCI Core。新增 quirk 要限定最小 ID 范围并说明为何标准路径不适用。
11. 安全与诊断
- AER status 多为 W1C,先保存再清;
- 不无限重试 Surprise Down 后的配置访问;
- ASPM 问题先用策略关闭验证,再定位 CLKREQ#/L1SS;
- DPC 后必须等待链路和驱动恢复完成;
- DOE/P2P 输入和地址都按不可信处理;
pci=noaer、pcie_aspm=off适合隔离问题,不是最终修复。
正在加载留言…