[PATCH RFC v3 00/12] Add support for the NXP S32G SerDes subsystem
From: Jan Petrous via B4 Relay <devnull+jan.petrous.oss.nxp.com@kernel.org>
Date: 2026-09-19 06:54:41
Also in:
b4-sent, imx, linux-devicetree, linux-pci, linux-phy, linux-renesas-soc, lkml
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@linaro.org/ (local) [v2] Signed-off-by: Jan Petrous (OSS) <jan.petrous@oss.nxp.com> --- 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) [off-list ref]