[PATCH RFC v3 00/12] Add support for the NXP S32G SerDes subsystem

From: Jan Petrous via B4 Relay

Date: Sat Sep 19 2026 - 02:56:26 EST


This series continues the S32G SerDes/XPCS upstreaming started by Vincent
Guittot. The effort has moved in-house at NXP and I am carrying it
forward from his v2 [v2] below, rather than restarting from scratch.
Authorship of the patches originating from his series is preserved
through Co-developed-by and his Signed-off-by; the rest builds on top.
Thanks to Vincent for the v1 -> v2 groundwork.

The S32G SoC family integrates two SerDes subsystems. Each one is built
from a DesignWare PCIe controller, two DesignWare Ethernet XPCS
instances and a shared two-lane combo PHY (PMA). The two lanes are
multiplexed between the PCIe controller and the XPCS instances, so a
given SerDes instance can run PCIe only, SGMII only, or a combination of
both, depending on the selected subsystem working mode.

This series adds the device tree bindings, the SerDes subsystem PHY
driver that owns the shared PMA and sequences the bring-up, a
transport-agnostic XPCS PCS core shared with i.MX, the S32G XPCS glue,
the SGMII support in the dwmac-s32 MAC glue, and the device tree nodes
for S32G2 and S32G3 including two routing variants for the
S32G3-VNP-RDB3 board.

The lane multiplexing is the reason the XPCS is not a self-contained PCS
platform device: in the mixed PCIe+SGMII modes both XPCS instances share
the PMA with the PCIe lane, so the reset and bring-up ordering has to be
driven by the SerDes PHY driver, which owns the shared resources. The
MAC obtains its phylink PCS from the SerDes subsystem through the
standard pcs-handle property.

Only the 1.25 Gbit/s (1000BASE-X / SGMII) working modes are wired up
here. The 2500BASE-X register paths are present in the PCS but are not
enabled, as there is no in-tree consumer yet; they are added by a
follow-up series together with the per-lane capability the binding would
need to describe them.

Tested on an S32G3-VNP-RDB3 board, in SerDes mode 1 (SGMII alongside two
active PCIe root complexes) and in SerDes mode 3.

Compared to v2 this series is rebased onto current mainline master
(see base-commit at the end of this cover letter) instead of the tree
the previous revision was generated against.

Changes since v2:
- Restructured the series: the single "serdes subsystem" driver has been
split into the SerDes PHY driver (drivers/phy/freescale) and the PCS
side (drivers/net/pcs), and the PCS side is further split into a
transport-agnostic XPCS core shared with i.MX plus the S32G-specific
glue. The core operates on regmaps supplied by the platform glue, so
the S32G indirect memory-mapped transport and the i.MX Clause 45 MDIO
transport can share it.
- Binding: dropped the vendor nxp,sys-mode property. The
SS_RW_REG_0[SUBSYS_MODE] value is now derived from the lane child
nodes and the nxp,xpcs-instance routing, since each described working
mode has a unique lane mux. The reference-clock rate is validated
against the derived mode instead of selecting it.
- Binding: S32G2 and S32G3 now use distinct compatibles without
fallback, because the reference-manual mode tables differ per SoC and
per SerDes instance.
- Binding: only the PCIe lane child carries '#phy-cells'; an XPCS lane
is referenced by the MAC through pcs-handle rather than as a generic
PHY provider.
- Documented pcs-handle for nxp,s32-dwmac and fixed the SerDes PHY
phandle in the nxp,s32g-pcie example.
- Added SGMII support to the dwmac-s32 glue (pcs_init / select_pcs) and
fixed the PHY interface selector to handle SGMII, RGMII, RMII and MII.
- Converted the vendor driver busy-waits to read_poll_timeout().
- Added the S32G2/S32G3 SerDes, PCIe and SCMI reset controller DT nodes
and the S32G3-RDB3 SerDes routing overlays.

Link: https://lore.kernel.org/all/20260203161917.1666696-1-vincent.guittot@xxxxxxxxxx/ [v2]

Signed-off-by: Jan Petrous (OSS) <jan.petrous@xxxxxxxxxxx>
---
Clark Wang (1):
net: pcs: add NXP SerDes XPCS shared core

Jan Petrous (OSS) (8):
dt-bindings: phy: Add NXP S32G SerDes subsystem
dt-bindings: net: nxp,s32-dwmac: Document pcs-handle
dt-bindings: PCI: nxp,s32g-pcie: Fix SerDes PHY phandle in example
net: stmmac: dwmac-s32: Add SGMII support
arm64: dts: s32g: Add SCMI reset controller
arm64: dts: s32g: Add SerDes controller nodes
arm64: dts: s32g: Add PCIe controller nodes
arm64: dts: s32g: Add S32G3-RDB3 SerDes routing variants

Vincent Guittot (3):
net: pcs: Add NXP S32G XPCS driver
phy: freescale: s32g: Add SerDes subsystem PHY
MAINTAINERS: Add NXP S32G SerDes and SerDes xPCS core entries

.../devicetree/bindings/net/nxp,s32-dwmac.yaml | 11 +-
.../devicetree/bindings/pci/nxp,s32g-pcie.yaml | 3 +-
.../devicetree/bindings/phy/nxp,s32g-serdes.yaml | 258 +++++
MAINTAINERS | 23 +
arch/arm64/boot/dts/freescale/Makefile | 6 +
arch/arm64/boot/dts/freescale/s32g2.dtsi | 118 +++
arch/arm64/boot/dts/freescale/s32g3.dtsi | 118 +++
.../dts/freescale/s32g399a-rdb3-serdes-mode1.dtso | 111 ++
.../dts/freescale/s32g399a-rdb3-serdes-mode3.dtso | 60 ++
drivers/net/ethernet/stmicro/stmmac/Kconfig | 6 +
drivers/net/ethernet/stmicro/stmmac/dwmac-s32.c | 74 +-
drivers/net/pcs/Kconfig | 25 +
drivers/net/pcs/Makefile | 2 +
drivers/net/pcs/pcs-nxp-s32g-xpcs.c | 947 ++++++++++++++++++
drivers/net/pcs/pcs-nxp-serdes-xpcs.c | 853 ++++++++++++++++
drivers/phy/freescale/Kconfig | 9 +
drivers/phy/freescale/Makefile | 1 +
drivers/phy/freescale/phy-nxp-s32g-serdes.c | 1057 ++++++++++++++++++++
include/linux/pcs/pcs-nxp-s32g-xpcs.h | 48 +
include/linux/pcs/pcs-nxp-serdes-xpcs.h | 100 ++
include/linux/phy/nxp-s32g-serdes.h | 25 +
21 files changed, 3850 insertions(+), 5 deletions(-)
---
base-commit: 5dd1818b15d98d4a20806cd00b1b40320b06004f
change-id: 20260918-s32g_serdes-7807070de807

Best regards,
--
Jan Petrous (OSS) <jan.petrous@xxxxxxxxxxx>