RK3588 kernel-6.1 — drivers/pci/pcie 端口与子系统模块说明

RK3588 kernel-6.1drivers/pci/pcie 端口与子系统模块说明

1. 分析范围与源码路径

  • 目录rk3588/kernel-6.1/drivers/pci/pcie
  • 关联头文件:同目录 portdrv.h;PCI 公共接口见 include/linux/pci*.hpci_regs.h 等。

本文说明该目录在 PCI Express 端口(Root Port / Switch Port 等) 侧实现的子系统:端口服务设备模型、AER、链路电源(ASPM)、PME、DPC、PTM、EDR、RCEC 等,并与 drivers/pci 总线核心(见同目录下《pci总线架构分析》)区分职责边界。


2. 与 PCI 核心层的关系

层次 典型对象 职责
PCI 总线核心 struct pci_devpci_bus_typepci_driver 枚举端点/桥、资源、设备驱动绑定
本目录(pcie) pcie_port_bus_typestruct pcie_devicepcie_port_service_driver 端口上的 PCIe 能力 拆成独立 服务(PME、AER、HP、DPC…),各自 probe/中断/电源管理

要点:普通网卡、NVMe 等绑定 pci_driver;根端口上的 AER/PME/DPC 等由 pcie_port_bus_type 上的服务驱动处理,二者并行存在。


3. Makefile 与编译单元

文件:drivers/pci/pcie/Makefile

CONFIG 生成对象 说明
CONFIG_PCIEPORTBUS pcieportdrv.oportdrv_core.o + portdrv_pci.o + rcec.o PCIe 端口总线核心
CONFIG_PCIEASPM aspm.o ASPM(L0s/L1 等)
CONFIG_PCIEASPM_EXT aspm_ext.o ASPM 扩展 API(本树含 Rockchip 面向 Wi‑Fi 等的寄存器路径)
CONFIG_PCIEAER aer.oerr.o AER 服务 + 错误恢复核心
CONFIG_PCIEAER_INJECT aer_inject.o 软件注入 AER(调试)
CONFIG_PCIE_PME pme.o 原生 PME
CONFIG_PCIE_DPC dpc.o Downstream Port Containment
CONFIG_PCIE_PTM ptm.o Precision Time Measurement
CONFIG_PCIE_EDR edr.o Error Disconnect Recover(ACPI + DPC)

4. Kconfig 依赖要点

文件:drivers/pci/pcie/Kconfig

  • PCIEPORTBUS:总开关;启用后才可选原生热插拔、AER、PME、DPC 等端口服务。
  • PCIEAER:依赖 PCIEPORTBUS,并 select RAS
  • PCIE_DPC:依赖 PCIEPORTBUS + PCIEAER
  • PCIE_EDR:依赖 PCIE_DPC + ACPI(固件 _DSM 协作)。
  • PCIEASPM:可选默认策略(BIOS / powersave / performance 等);运行时策略见帮助中的 pcie_aspm.parameters.policy 说明。

5. 端口总线核心文件

5.1 portdrv.h

  • 服务类型位PCIE_PORT_SERVICE_PMEAERHPDPCBWNOTIF 等。
  • struct pcie_device:挂在端口上的 逻辑服务设备(含 irqport 指针、service 掩码、priv_data)。
  • struct pcie_port_service_driver:服务端驱动的 probe/remove、PM、slot_reset 等。
  • 声明:pcie_port_service_register/unregisterpcie_port_device_register/remove、suspend/resume 等。

5.2 portdrv_core.c

  • 根据端口能力与 mask 计算各服务所需的 Interrupt Message Number,汇总 MSI/MSI-X 向量数量。
  • 创建 pcie_device、绑定 IRQ、向 pcie_port_bus_type 注册设备。
  • 与各 pcie_port_service_driver(AER、PME、DPC 等模块注册)对接。

5.3 portdrv_pci.c

  • 模块入口pcie_ports= 等内核参数:pcie_ports_disabledpcie_ports_nativepcie_ports_dpc_native 等。
  • ACPI _OSC 协商平台是否允许 OS 原生接管 PCIe 端口能力(及例外场景)。

5.4 rcec.c

  • Root Complex Event Collector(RCEC):遍历/关联 RCiEP 等与 RCEC 上报路径相关的拓扑,服务于根复合体侧错误收集模型。

6. AER 与错误恢复

文件 职责
aer.c 根端口 AER 服务驱动:中断或消息路径上收集 Root Error Status、调度工作队列、与 RAS/CPER 日志衔接。
err.c 错误恢复流程:在 PCIe 错误上报后,沿 pci_error_handlers 调用链执行 error_detectedmmio_enabledslot_resetresume 等,并合并各驱动返回的 pci_ers_result_t
aer_inject.c 软件注入多种 AER 场景;用户态可配合 aer-inject 工具(Kconfig 中给出的仓库链接)。

调试时日志前缀常见:AER:、与 err.c 合并结果相关的 pci 驱动回调日志。


7. ASPM 与扩展

文件 职责
aspm.c 链路 L0s/L1、时钟电源管理等;模块参数前缀 pcie_aspm.;可对已知缺陷硬件关闭 ASPM。
aspm_ext.c CONFIG_PCIEASPM_EXT:导出扩展控制接口。RK3588 厂商树中注释标明面向 Wi‑Fi 等场景,包含 Rockchip 侧 PCIe RAS/能力寄存器访问封装;与主线合并时需逐项 diff。

8. PME、DPC、PTM、EDR

文件 职责
pme.c 原生 PME:端口 PME 中断与 pm_runtime 协同;可选 pcie_pme_nomsi,缓解部分平台上 MSI 与系统睡眠唤醒的交互问题。
dpc.c DPC:下游端口检测到严重错误时的 遏制,限制故障扩散;常与 AER 日志一起分析。
ptm.c PTM:查找链路伙伴是否支持 PTM、辅助 PTM 上下文初始化(时间同步相关)。
edr.c EDR:通过 ACPI _DSM 启停/定位 DPC,与固件组成 混合 DPC 模型(PCI Firmware Spec 相关章节)。

日志前缀常见:PME:DPC:EDR:


9. 与 drivers/pci/hotplug 的关系

  • 原生 PCIe 热插拔依赖 PCIEPORTBUS,具体 HOTPLUG_PCI_PCIE 实现在 drivers/pci/hotplug/(如 pciehp),通过端口能力与本目录注册的端口设备模型衔接。
  • 排障时需同时看:端口是否暴露 HP 能力_OSC/内核参数是否禁用原生端口hotplug 驱动是否加载

10. 维护与合并建议

  1. 合并上游 Linux 时重点比对:portdrv_pci.c_OSC / pcie_ports)、edr.c_DSM 编号与语义)、aspm_ext.c(厂商扩展与主线冲突)。
  2. 寄存器位域与错误类型以 PCIe 规范pci_regs.h 为准;本文仅做代码导航。
  3. 平台为 DT(无 ACPI) 时,EDR 等与 ACPI 强相关的路径通常不参与。

11. 文档修订

日期 说明
2026-05-08 初版:路径、Makefile/Kconfig、各 .c 职责与 hotplug 关联

文章互动

阅读 --

留言

0 条留言

正在加载留言…