RK3588 PCIe 配置、DTS 与故障排查

RK3588 PCIe 配置、DTS 与故障排查

1. 内核配置

本树rockchip_linux_defconfig主要启用:

1
2
3
4
5
6
7
8
9
10
CONFIG_PCI=y
CONFIG_PCIEPORTBUS=y
CONFIG_PCIEASPM_POWERSAVE=y
CONFIG_PCIEASPM_EXT=y
CONFIG_HOTPLUG_PCI=y
CONFIG_HOTPLUG_PCI_GPIO=y
CONFIG_PCIE_ROCKCHIP_HOST=y
CONFIG_PCIE_DW_ROCKCHIP=y
CONFIG_PCIE_DW_DMATEST=y
CONFIG_PCIE_DW_ROCKCHIP_EP=y

不同产品 defconfig 有差异。rockchip_electric_defconfig未启用全部热插拔/EP 测试,rockchip_cpcem_linux_defconfig还启用厂商 Endpoint Function。最终判断必须查看构建生成的.config

2. DTS 控制器

RK3588 SoC DTS包含:

节点 典型能力
pcie3x4@fe150000 Gen3 x4
pcie3x2@fe160000 Gen3 x2
pcie2x1l0@fe170000 Gen2 x1
pcie2x1l1@fe180000 Gen2 x1
pcie2x1l2@fe190000 Gen2 x1

节点 compatible 为rockchip,rk3588-pciesnps,dw-pcie。板级 DTS 通过&pcie...选择实际端口并补充供电、GPIO、pinctrl 和 PHY。

3. 关键 DTS 属性

应结合 binding 核对:

  • regreg-names:DBI/APB/config 等窗口;
  • ranges:CPU→PCI I/O/MEM 地址;
  • bus-range
  • interruptsinterrupt-names
  • interrupt-map:legacy INTA~INTD;
  • msi-mapmsi-parent
  • clocksclock-names
  • resetsreset-names
  • physphy-names
  • num-lanes、最大链路速率;
  • reset-gpios
  • vpcie regulator/supply;
  • status = "okay"

属性名称应以本树 binding 和驱动实际devm_*_get()为准,不能直接照搬其它 BSP。

4. PHY 与 Lane 复用

RK3588 PCIe 3.0 lane 由共享 PHY 和 GRF 控制,x4/x2/多个 x1 组合受硬件 mode、板级走线和 DTS 约束。若 lane mode 错误:

  • PHY 可能 probe 成功;
  • 控制器寄存器可读;
  • 但 LTSSM 无法稳定进入 L0。

还应检查 refclk 方向、100 MHz 时钟质量、SSC、AC coupling 和 lane polarity。

5. 上电时序

推荐观测顺序:

1
2
3
4
5
6
7
8
9
Endpoint 电源稳定
-> refclk 稳定
-> PHY 初始化
-> RC reset 释放
-> Endpoint PERST# 释放
-> LTSSM Enable
-> Link L0
-> 等待设备完成内部初始化
-> 配置空间读取

NVMe、Wi-Fi、PCIe Switch 的稳定时间不同。GPIO 极性或 regulator enable 错误会表现为永久 Detect/Polling。

6. 分层故障树

A. 控制器不 probe

检查:

  • DTS status/compatible;
  • 驱动是否编入;
  • clock/reset/regulator/PHY 获取错误;
  • deferred probe 依赖;
  • threaded init 是否延后日志。

检查:

  • Endpoint 电源;
  • PERST#极性和时序;
  • refclk;
  • PHY lane mode;
  • LTSSM 状态;
  • Gen1 强制降速能否建立链路;
  • SI、连接器和走线。

检查:

  • CFG0 outbound iATU;
  • bus-range;
  • 首次 VID/DID 读结果;
  • Endpoint 是否仍返回 CRS;
  • Device 0/Function 0 路由;
  • 控制器系统错误状态。

D. 能枚举但 BAR 分配失败

检查:

  • DTS ranges容量;
  • bridge MEM/prefetch window;
  • 32/64 位 BAR;
  • 资源冲突;
  • SR-IOV VF BAR;
  • 是否需要pci=realloc=on进行验证。

E. BAR 可访问但业务中断失败

检查:

  • MSI/MSI-X Enable;
  • IRQ domain 与 parent;
  • DWC MSI status/mask;
  • /proc/interrupts计数;
  • handler 是否清设备状态;
  • INTx interrupt-map

F. 中断正常但 DMA 失败

检查:

  • pci_set_master()
  • DMA mask;
  • IOMMU/SMMU stream ID;
  • cache coherency;
  • descriptor 地址和 endian;
  • 设备是否报告 Completion Timeout/AER。

7. 常用证据

1
2
3
4
5
6
dmesg | 关注 rockchip-dw-pcie、link、AER、BAR、MSI
lspci -nn -t
lspci -vv -s <BDF>
cat /sys/bus/pci/devices/<BDF>/resource
cat /proc/iomem
cat /proc/interrupts

厂商树的pcie-dw-rockchip.c已包含额外[PCIe DEBUG]日志;量产前应控制日志级别,避免在热路径持续打印。

8. 内核参数的定位用途

  • pci=nomsi:验证 MSI 路径;
  • pcie_aspm=off:验证 ASPM/CLKREQ#;
  • pci=realloc=on:验证资源窗口;
  • pci=pcie_bus_safe等:验证 MPS/MRRS;
  • pcie_port_pm=off:部分版本用于端口 PM 隔离。

参数能改变现象不等于根因已修复,应回到 DTS、电气、资源或驱动状态机。

9. 安全注意

  • 不对正在 DMA 的设备执行 sysfs remove/reset;
  • 不用devmem修改 DWC/GRF 寄存器作为长期方案;
  • IOMMU 未隔离前不把 Endpoint 交给不可信用户;
  • 热拔前停止业务、解绑驱动并确认供电控制;
  • 自动恢复应限制重试次数,防止坏链路造成无限 reset 风暴。

文章互动

阅读 --

留言

0 条留言

正在加载留言…