PCIe Port 服务、错误恢复与高级能力

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
2
3
4
5
6
PCIe port pci_dev
-> pcie_port_device_register()
-> PME service
-> AER service
-> Hotplug service
-> DPC service

每个服务通过pcie_port_service_driver独立绑定和处理 IRQ。PCIe 端口服务与网卡/NVMe 等 Function 驱动不是同一种 driver。

3. AER

pcie/aer.c处理 Root Error Status、Correctable/Uncorrectable Error Status 和 Header Log。典型流程:

1
2
3
4
5
AER interrupt/message
-> 读取并清 Root/AER status
-> 定位错误源 Requester ID
-> 记录 correctable/non-fatal/fatal
-> 非致命/致命错误进入 pcie_do_recovery()

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
2
3
4
5
6
7
pci_doe_submit_task()
-> 专用 ordered workqueue
-> 写 request object
-> GO
-> 等待 READY/ERROR
-> 读取 response object
-> completion callback

pci_doe_submit_task()位于 586 行。DOE 事务可睡眠且有超时/abort,不应在原子上下文同步等待。上层 SPDM/CXL 等协议必须验证响应长度和协议 ID。

8. P2PDMA

p2pdma.c允许一个 PCI 设备的 BAR 内存直接供其它 PCI 设备 DMA:

  1. provider 通过pci_p2pdma_add_resource()发布 BAR 区域;
  2. Core 计算 provider 与 clients 的拓扑距离;
  3. 分配 P2P pages/scatterlist;
  4. 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=noaerpcie_aspm=off适合隔离问题,不是最终修复。

文章互动

阅读 --

留言

0 条留言

正在加载留言…