RK3588 kernel-6.1 — drivers/pci/pcie 端口与子系统模块说明
1. 分析范围与源码路径
- 目录:
rk3588/kernel-6.1/drivers/pci/pcie - 关联头文件:同目录
portdrv.h;PCI 公共接口见include/linux/pci*.h、pci_regs.h等。
本文说明该目录在 PCI Express 端口(Root Port / Switch Port 等) 侧实现的子系统:端口服务设备模型、AER、链路电源(ASPM)、PME、DPC、PTM、EDR、RCEC 等,并与 drivers/pci 总线核心(见同目录下《pci总线架构分析》)区分职责边界。
2. 与 PCI 核心层的关系
| 层次 | 典型对象 | 职责 |
|---|---|---|
| PCI 总线核心 | struct pci_dev、pci_bus_type、pci_driver |
枚举端点/桥、资源、设备驱动绑定 |
| 本目录(pcie) | pcie_port_bus_type、struct pcie_device、pcie_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.o ← portdrv_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.o、err.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_PME、AER、HP、DPC、BWNOTIF等。 struct pcie_device:挂在端口上的 逻辑服务设备(含irq、port指针、service掩码、priv_data)。struct pcie_port_service_driver:服务端驱动的 probe/remove、PM、slot_reset等。- 声明:
pcie_port_service_register/unregister、pcie_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_disabled、pcie_ports_native、pcie_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_detected → mmio_enabled → slot_reset → resume 等,并合并各驱动返回的 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. 维护与合并建议
- 合并上游 Linux 时重点比对:
portdrv_pci.c(_OSC/pcie_ports)、edr.c(_DSM编号与语义)、aspm_ext.c(厂商扩展与主线冲突)。 - 寄存器位域与错误类型以 PCIe 规范 与
pci_regs.h为准;本文仅做代码导航。 - 平台为 DT(无 ACPI) 时,
EDR等与 ACPI 强相关的路径通常不参与。
11. 文档修订
| 日期 | 说明 |
|---|---|
| 2026-05-08 | 初版:路径、Makefile/Kconfig、各 .c 职责与 hotplug 关联 |
正在加载留言…