JetPack 7.2 (L4T r37.x, kernel 6.8) 下 PCIe C7 (M.2 WiFi 槽) 的 RTL8822CE 无法识别:UEFI 能枚举,Linux 下报 "Phy link never came up"

内容:

环境信息

  • 板卡:Jetson AGX Orin Developer Kit (p3737-0000 + p3701-0000, 32GB) + 定制载板

  • 出问题版本:JetPack 7.2 (L4T r37.x),内核 6.8.12-1021-tegra

  • 正常基线版本:JetPack 6.2 (L4T r36.4),内核 5.15.148-tegra(同硬件同载板 WiFi 工作正常)

  • WiFi 卡:Realtek RTL8822CE(PCI ID 10ec:c822),M.2 Key E,位于 PCIe C7 控制器 pcie@141e0000(linux,pci-domain=<7>,8 lanes)

问题描述

  1. UEFI 阶段正常:UEFI Shell 中执行 pci 可以枚举到 07:01:00 Vendor 10EC Device C822,链路训练成功。

  2. Linux 启动后失败:lspci 中 bus 0007 域只有 Root Port 0007:00:00.0 [10de:229a],没有任何 downstream 设备。

  3. dmesg 关键日志:

tegra194-pcie 141e0000.pcie: supply vddio-pex-ctl not found, using dummy regulator
tegra194-pcie 141e0000.pcie: Phy link never came up   (出现两次)

Root Port 枚举正常,但下游链路始终起不来。

已排查项(全部与工作正常的 r3644 逐项对比)

  1. 设备树已 100% 排除:C7 节点 pcie@141e0000 与 r3644 逐属性一致——status="okay"、num-lanes=<8>、linux,pci-domain=<7>、8 个 p2u_gbe PHY 引用(phy@3f20000 起)、reg/ranges/interrupt-map/iommu-map 全同。

  2. SERDES lane 互斥已处理:确认 ethernet@6800000 (MGBE0, 10G) 与 C7 共用 p2u_gbe_0~7 lane,已在设备树中设为 disabled(r3644 当年同样做法,且 r3644 下 C7 正常)。

  3. PHY 驱动无差异:p2u PHY 驱动两版本之间 diff 为空。

  4. 时钟/供电无报错:dmesg 中无任何 regulator/clk/reset 错误;vddio-pex-ctl 走 dummy regulator(与 r3644 相同路径)。

  5. 实验 1(失败):patch 内核 6.8 dwc 核心 dw_pcie_link_set_max_link_width,恢复为按 num-lanes 写链路宽度寄存器(MODE=8/WIDTH=8,与 5.15 行为完全一致)→ 仍 “Phy link never came up”。

  6. 实验 2(失败):添加/删除 vddio-pex-ctl-supply 属性 → 行为无任何变化。

  7. devmem 读 C7 寄存器返回全 0xFFFFFFFF(被 SMMU 拦截),无法做寄存器级调试。

想请教 NVIDIA 官方

  • 6.8 内核 dwc 核心 / tegra194-pcie 驱动的 link 训练流程相对 5.15 是否有已知变更或已知问题?

  • 为什么 UEFI(同样硬件、同样冷启动)可以 link,而 Linux 下无法 link?是否存在 PHY power_on 与 LTSSM 使能的时序差异?

  • 是否需要为 C7 补充特定的 p2u PHY / iATU 配置?

Hi,
這邊先澄清一下問題好了.

  1. 想問一下現在到底是在用devkit還是custom board? 看不太懂 Jetson AGX Orin Developer Kit (p3737-0000 + p3701-0000, 32GB) + 定制载板 是什麼意思. 是指說你兩種底板都測了還是其他意思? 聽起來應該只有測你們自己的底板吧?

  2. 這邊更正一下, Jetpack7.2 裡面用的是r39.2. 沒有任何一版是r37.

1.是 custom board + Jetson AGX Orin的核心板

2.确实是r39.2 ,此处是笔误

請問除了DT之外你有改動pinmux嗎?

是的,我已经修改了 pinmux(MB1 BCT pinmux,不是内核 DT)。

在 Linux_for_Tegra/bootloader/generic/BCT/tegra234-mb1-bct-pinmux-p3701-0000-a04.dtsi 中,将 PCIe controller 7 的两个引脚从 rsvd1(高阻)改为 pe7 + PERST 输出驱动:

引脚 r39.2 原始(异常) 修改后
pex_l7_clkreq_n_pag0(C7 CLKREQ) rsvd1, tristate ENABLE, input ENABLE pe7, tristate ENABLE, input ENABLE
pex_l7_rst_n_pag1(C7 PERST) rsvd1, tristate ENABLE, input ENABLE pe7, tristate DISABLE, input DISABLE

重新完整跑 flash.sh 刷写后,已在板子上验证修改确实生效(devmem 读取 pinmux 寄存器,funcsel=PE7,与 r36.4 逐位一致;debugfs 显示 MUX UNCLAIMED,内核未覆盖):

$ busybox devmem 0x02449010 32   # PEX_L7_CLKREQ_N_PAG0
0x00000070
$ busybox devmem 0x02449018 32   # PEX_L7_RST_N_PAG1
0x00000020

但问题仍然存在:lspci 中 bus 0007 仍只有 Root Port(0007:00:00.0 [10de:229a]),dmesg 仍报 Phy link never came up。内核 DT 未做任何修改(C7 节点与 pex_rst_c7_in_state 在 r39.2 与 r36.4 之间本就一致)。

既然 pinmux 已确认正确且生效,能否请官方确认 5.15(r36.4)到 6.8(r39.2)之间 PCIe 链路训练流程(tegra194-pcie / dwc)是否有已知变更,或该控制器是否需要额外的 p2u PHY / LTSSM 配置?还有别的排查建议吗?

Did you remember to modify tegra234-mb1-bct-gpio-p3701-0000-a04.dtsi?