# [ADL-N] PCH PCIe Root Port 9 (M.2 NVMe) link does not train in coreboot -
works under OEM

 

## Board / environment

- **Board:** new port, ASUS PRIME N100I-D D4 (Intel Processor N100, Alder
Lake-N, CPUID 0x0B06E0).

- **coreboot:** commit d2bd9a4d03a03169b258d08784899adf300d748d
(SOC_INTEL_ALDERLAKE_PCH_N, FSP_TYPE_IOT).

- **FSP:** 3rdparty AlderLakeFspBinPkg/IoT/AlderLakeN, `Fsp.fd` ImageId
`$TWLFSPE`, ImageRevision 0x0CE28A40 (Twin-Lake-merged ADL-N binary;
byte-identical to current intel/FSP upstream).

- **Payload:** SeaBIOS. Flash descriptor + ME preserved byte-for-byte from
the OEM image (only the BIOS region is coreboot).

- Serial console (SuperIO NCT6798D COM1 @ 0x3F8, 115200) and com_debug
(port-80) both work; full boot log available.

 

## Problem

The M.2 NVMe (ASUS spec: single M-key socket, PCIe 3.0 **x2**) is on **PCH
Root Port 9 (00:1d.0)**. Under the OEM AMI BIOS the SSD works perfectly
(that is where the installed Linux lives). Under coreboot the root port
comes up but **no device is ever detected** - the link never trains.

 

coreboot log:

```

PCI: 00:00:1d.0: ASPM enabled L0s and L1 (no endpoint)

```

 

Register dump added in ramstage (BS_WRITE_TABLES) reading 00:1d.0 directly:

```

coreboot:  LnkCap=0x09727c23  LnkSta=0x1001 (DLLActive=0, Width=0, Speed=1)

           SltCap=0xfd00      SltSta=0x0008 (PresDet=0)      bus03:00.0 =
0xffffffff

```

vs the same registers read from the running OEM system (lspci -xxxx):

```

OEM:       LnkCap=0x09724823  LnkSta=0x3023 (DLLActive=1, Width=x2,
Speed=8GT/s)

           SltCap=0xfd00      SltSta=0x0040 (PresDet=1)      NVMe present at
03:00.0 (x2 8GT/s)

```

So in coreboot the PHY never sees the device (PresDet=0, DLLActive=0, width
0); the port is otherwise enabled and responds in config space.

 

## Ruled out (verified, not guessed)

- **Reference clock.** Tried clk_src = 0 and 2 (clk_req matched) with and
without PCIE_RP_CLK_REQ_DETECT. Then forced **all** PCIe clock sources
free-running via `register "pcie_clk_config_flag[0..4]" =
"PCIE_CLK_FREE_RUNNING"` (+ PCIE_RP_CLK_SRC_UNUSED on RP9). No change. OEM
GPIO dump shows the M.2 CLKREQ is SRCCLKREQ2 (GPP_D7); our gpio.h has
GPP_D5-D8 = NF1 (SRCCLKREQ0-3), correct.

- **Reset / power GPIO.** None exists: OEM ACPI (SSDT) RP09 has
RSTG={SSDR,SDRP}/PWRG={SSDP,SDPP}, but the GNVS fields SSDR/SSDP/SDRP/SDPP
are all **0** (read via /dev/mem on the live OEM system). SltCap shows
PwrCtrl-/HotPlug-. So reset is internal (PLTRST), no board GPIO.

- **FSP detect timeout.** Added `.pcie_rp_detect_timeout_ms = 100`. No
change.

- **HSPHY** is CPU-PCIe only (RP9 is PCH); "All HSPHY ports disabled" is
expected and unrelated.

- **Straps/lane mapping** should be identical: the OEM descriptor (with PCH
soft straps) is preserved.

- Device 0x1d exposes only function 0 (RP9) in OEM; RP10-12 absent. OEM
pmc_core shows RP9 is in controller **SPC** (runtime-gated when idle,
normal).

 

## Devicetree (relevant part)

```

device ref pcie_rp9 on

    register "pch_pcie_rp[PCH_RP(9)]" = "{

        .clk_src = 2,

        .clk_req = 2,

        .flags = PCIE_RP_LTR | PCIE_RP_AER | PCIE_RP_CLK_SRC_UNUSED,

        .pcie_rp_detect_timeout_ms = 100,

    }"

end

```

 

## Question

With the same FSP binary and the same (OEM) descriptor/straps, what else
governs PCH PCIe RP9 PHY/lane bring-up that could leave the link untrained
in coreboot while the OEM FSP flow trains it fine? Specifically:

1. Is there a known ADL-N (0xB06E0) PCH PCIe regression in the
Twin-Lake-merged `$TWLFSPE` FSP, i.e. should we use an older ADL-N-only FSP?

2. Are there FSP-M/FSP-S UPDs beyond clk_src/clk_req/detect_timeout/enable
that affect PCH RP link training (e.g. lane reversal, controller/port
mapping, ModPHY/FIA lane ownership) that coreboot does not set?

3. Any mainboard that saw "PCH RP no-endpoint, works in vendor FW" and the
fix?

 

Full serial boot log and OEM lspci -vvv/-xxxx dumps available on request.

 

 

Best Regards

 

 

Erdincca

_______________________________________________
coreboot mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to