* [PATCH net-next v2 0/5] net: enetc: S32N79 pseudo-MAC (PPM) networking support
@ 2026-10-13 17:12 Claudiu Manoil
2026-10-13 17:12 ` [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node Claudiu Manoil
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Claudiu Manoil @ 2026-10-13 17:12 UTC (permalink / raw)
To: netdev; +Cc: s32, linux-kernel, Rob Herring, Saravana Kannan, devicetree
This series adds networking support for the ENETCv4.4 pseudo-MAC (PPM)
ports found on the NXP S32N79 SoC. On S32N79, the ENETCv4 ports are
not wired to any external PHY/MII; instead they are internal "pseudo-MAC"
links into the on-chip NETC switch. These links are proprietary, expose
no standard IEEE interface, and run at a speed fixed at boot time by the
Port PCR[PSPEED] register.
A key use case is a port that has no "ethernet" DT node at all: NETC is
reached over PCI from a host that probes the ENETC, while the internal
NETC switch it connects to is not owned by Linux. Such a port must have
its fixed link synthesized at probe time.
The driver synthesizes the fixed link directly in C using an of_changeset:
of_changeset_create_node() adds a "fixed-link" subnode onto the PCI
function's dynamic OF node (CONFIG_PCI_DYNAMIC_OF_NODES), with the "speed"
property read from PCR[PSPEED] at probe time and "full-duplex" set.
phylink then picks up the fixed-link node through dev_fwnode().
The series touches three subsystems:
- net/enetc: pseudo-MAC fixed-link support + probing of 4.4 devices
- arm64 dts: NETC IEP18 ECAM node on S32N79 and its RDB board enable
- PCI: a quirk creating the OF node for the ENETC PMAC functions
Because this is primarily a networking feature and the pieces are
interdependent at runtime, it would be most convenient to merge the
whole series through the netdev tree.
Patch 1 has a runtime (not Kconfig) dependency on
CONFIG_PCI_DYNAMIC_OF_NODES; absent that, the pseudo-MAC probe path
fails gracefully with -ENODEV.
v2:
- Switched patch 1 from a DT overlay blob (of_overlay_fdt_apply() + a
.dtso compiled to .dtbo) to of_changeset_create_node(), per review
feedback. This drops the embedded overlay externs, the Makefile
.dtbo wrapping, and the OF_OVERLAY Kconfig dependency. The operating
speed is now baked directly into the changeset-created fixed-link
node (read once from PCR[PSPEED] at probe time); the phylink
get_fixed_state callback is no longer needed and was removed.
- Patch 2: described why there are two ENETC PF IDs in the commit
message, as per review.
- Patch 3: replaced the 'msi-parent' stub property with 'msi-map', as
per H/W spec.
- Patch 5: reworded the commit message to match patch 1's fixed-link
approach (no functional change); added Bjorn's Acked-by.
v1: initial submission.
Claudiu Manoil (5):
net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link
node
net: enetc: Enable probing of version 4.4 devices
arm64: dts: s32n79: add NETC IEP18 ECAM node for ENETC PPM ports
arm64: dts: s32n79-rdb: enable NETC IEP18
PCI: Create OF node for NXP ENETC pseudo-MAC functions
arch/arm64/boot/dts/freescale/s32n79-rdb.dts | 4 +
arch/arm64/boot/dts/freescale/s32n79.dtsi | 24 ++++
drivers/net/ethernet/freescale/enetc/enetc.c | 12 ++
drivers/net/ethernet/freescale/enetc/enetc.h | 1 +
.../net/ethernet/freescale/enetc/enetc4_pf.c | 113 +++++++++++++++++-
.../net/ethernet/freescale/enetc/enetc_hw.h | 1 +
.../freescale/enetc/enetc_pf_common.c | 41 ++++++-
.../freescale/enetc/enetc_pf_common.h | 1 +
drivers/pci/quirks.c | 2 +
9 files changed, 190 insertions(+), 9 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node 2026-10-13 17:12 [PATCH net-next v2 0/5] net: enetc: S32N79 pseudo-MAC (PPM) networking support Claudiu Manoil @ 2026-10-13 17:12 ` Claudiu Manoil 2026-10-15 2:16 ` Wei Fang 2026-10-15 8:43 ` kernel test robot 2026-10-13 17:12 ` [PATCH net-next v2 3/5] arm64: dts: s32n79: add NETC IEP18 ECAM node for ENETC PPM ports Claudiu Manoil 2026-10-13 17:12 ` [PATCH net-next v2 4/5] arm64: dts: s32n79-rdb: enable NETC IEP18 Claudiu Manoil 2 siblings, 2 replies; 8+ messages in thread From: Claudiu Manoil @ 2026-10-13 17:12 UTC (permalink / raw) To: netdev Cc: s32, linux-kernel, Vladimir Oltean, Wei Fang, Clark Wang, Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring, Saravana Kannan, Russell King, imx, devicetree ENETCv4 has special internal links when connected to the on-chip NETC switch via internal switch ports, called pseudo-MAC links. These pseudo-MACs are proprietary, they don't implement any standard IEEE interface (like MII), and can be modeled as fixed links with the link speed determined at boot time by the Port PCR[PSPEED] register configuration. We also need to be able to probe the ENETCv4 Ports featuring pseudo-MACs as pure PCI devices, i.e. without any "ethernet" DT node representation. The typical use case for this consists in a board with NETC connected via PCI to another host which probes the ENETC. Note that in this scenario, the pseudo-MAC ENETCs are connected internally to a NETC switch that is not owned by Linux. Since such a port has no "ethernet" DT node, its fixed link has to be synthesized at probe time. Build the fixed-link subnode directly in C with an of_changeset: of_changeset_create_node() adds a "fixed-link" node onto the port's own OF node, and of_changeset_add_prop_*() populate its "speed" and "full-duplex" properties. The changeset is applied with of_changeset_apply(), so the fixed-link node is spliced onto the ENETC netdev's fwnode exactly as if it had come from static DT, and phylink picks it up through dev_fwnode(). The operating speed written into the node is read from PCR[PSPEED] at probe time and mapped to a phylink-supported value, so the fixed link reflects the actual boot-time configuration. The pseudo-MAC path is selected when the port has no OF node, or when it only has the empty PCI-synthesized node (OF_DYNAMIC), which carries no fixed-link description. Ports described by static DT take the regular of_get_phy_mode() path instead. The changeset is reverted and destroyed on teardown and on the probe error unwind. The node-less pseudo-MAC path has a runtime dependency on CONFIG_PCI_DYNAMIC_OF_NODES: that is what makes the PCI core synthesize the per-function OF node (of_pci_make_dev_node()) that the fixed-link node is attached onto. This is intentionally not a hard Kconfig dependency, since the ENETC4 driver also serves regular ports described by static DT; when PCI_DYNAMIC_OF_NODES is absent the PCI function has no of_node and the pseudo-MAC probe path fails gracefully with a clear -ENODEV error. Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com> --- v2: - Switched from a DT overlay blob (of_overlay_fdt_apply() + a .dtso compiled to .dtbo) to of_changeset_create_node(), per review feedback. Drops the embedded overlay externs, the Makefile .dtbo wrapping, and the OF_OVERLAY Kconfig dependency. - Baked the operating speed directly into the changeset-created fixed-link node (read once from PCR[PSPEED] at probe time); the phylink get_fixed_state callback is no longer needed and was removed. drivers/net/ethernet/freescale/enetc/enetc.h | 1 + .../net/ethernet/freescale/enetc/enetc4_pf.c | 113 +++++++++++++++++- .../freescale/enetc/enetc_pf_common.c | 41 ++++++- .../freescale/enetc/enetc_pf_common.h | 1 + 4 files changed, 147 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h b/drivers/net/ethernet/freescale/enetc/enetc.h index d9e91832a9c1..ed5402f1b73c 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc.h +++ b/drivers/net/ethernet/freescale/enetc/enetc.h @@ -500,6 +500,7 @@ struct enetc_ndev_priv { struct clk *ref_clk; /* RGMII/RMII reference clock */ u64 sysclk_freq; /* NETC system clock frequency */ + struct of_changeset *ppm_ocs; /* pseudo-MAC fixed-link changeset */ }; #define ENETC_CBD(R, i) (&(((struct enetc_cbd *)((R).bd_base))[i])) diff --git a/drivers/net/ethernet/freescale/enetc/enetc4_pf.c b/drivers/net/ethernet/freescale/enetc/enetc4_pf.c index 71c971618388..70e34ca6ddf8 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc4_pf.c +++ b/drivers/net/ethernet/freescale/enetc/enetc4_pf.c @@ -1,8 +1,9 @@ // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) -/* Copyright 2024 NXP */ +/* Copyright 2024, 2026 NXP */ #include <linux/clk.h> #include <linux/module.h> +#include <linux/of.h> #include <linux/of_net.h> #include <linux/of_platform.h> #include <linux/unaligned.h> @@ -932,6 +933,14 @@ static void enetc4_pl_mac_link_down(struct phylink_config *config, enetc4_mac_tx_graceful_stop(pf); } +static void enetc4_get_pcr_speed(struct enetc_hw *hw, int *speed) +{ + u32 val = enetc_port_rd(hw, ENETC4_PCR); + int pspeed = FIELD_GET(PCR_PSPEED, val); + + *speed = (pspeed + 1) * 10; +} + static const struct phylink_mac_ops enetc_pl_mac_ops = { .mac_select_pcs = enetc4_pl_mac_select_pcs, .mac_config = enetc4_pl_mac_config, @@ -946,23 +955,112 @@ static void enetc4_pci_remove(void *data) enetc_pci_remove(pdev); } +static void enetc4_put_ppm_fixed_link(struct enetc_ndev_priv *priv) +{ + if (!priv->ppm_ocs) + return; + + of_changeset_revert(priv->ppm_ocs); + of_changeset_destroy(priv->ppm_ocs); + kfree(priv->ppm_ocs); + priv->ppm_ocs = NULL; +} + +/* Pseudo-MAC ports have no real PHY; the link is fixed, with the operating + * speed set at probe time from PCR[PSPEED]. Describe this with a fixed-link + * subnode synthesized at runtime onto the port's own OF node, so phylink + * picks it up through dev_fwnode() exactly as if it came from static DT. + */ +static int enetc4_add_ppm_fixed_link(struct enetc_ndev_priv *priv) +{ + struct device_node *np = dev_of_node(priv->dev); + struct device_node *fixed_link; + struct of_changeset *ocs; + int speed, err; + + if (!np) + return dev_err_probe(priv->dev, -ENODEV, + "Missing of_node for Pseudo-MAC port\n"); + + enetc4_get_pcr_speed(&priv->si->hw, &speed); + speed = enetc_phylink_match_pseudo_mac_speed(speed); + + ocs = kzalloc_obj(*ocs); + if (!ocs) + return -ENOMEM; + + of_changeset_init(ocs); + + fixed_link = of_changeset_create_node(ocs, np, "fixed-link"); + if (!fixed_link) { + err = -ENOMEM; + goto err_destroy; + } + + err = of_changeset_add_prop_u32(ocs, fixed_link, "speed", speed); + if (err) + goto err_put_node; + + err = of_changeset_add_prop_bool(ocs, fixed_link, "full-duplex"); + if (err) + goto err_put_node; + + err = of_changeset_apply(ocs); + if (err) + goto err_put_node; + + of_node_put(fixed_link); + priv->ppm_ocs = ocs; + + return 0; + +err_put_node: + of_node_put(fixed_link); +err_destroy: + of_changeset_destroy(ocs); + kfree(ocs); + + return dev_err_probe(priv->dev, err, + "Failed to add fixed-link node\n"); +} + static int enetc4_link_init(struct enetc_ndev_priv *priv, struct device_node *node) { + bool dynamic = node && of_node_check_flag(node, OF_DYNAMIC); struct enetc_pf *pf = enetc_si_priv(priv->si); struct device *dev = priv->dev; int err; - err = of_get_phy_mode(node, &pf->if_mode); - if (err) { - dev_err(dev, "Failed to get PHY mode\n"); - return err; + /* Pseudo-MAC ENETCs are described by a runtime-synthesized fixed-link + * node rather than static DT. This covers both a missing OF node and a + * PCI-synthesized (OF_DYNAMIC) node, which is an empty node created + * by the PCI core and thus carries no fixed-link description. + */ + if (enetc_is_pseudo_mac(priv->si) && (!node || dynamic)) { + pf->if_mode = PHY_INTERFACE_MODE_INTERNAL; + + err = enetc4_add_ppm_fixed_link(priv); + if (err) + return err; + + /* The fixed-link node was spliced onto dev's own of_node, so + * phylink will find it via dev_fwnode(dev). Use that node for + * the subsequent MDIO/phylink setup below. + */ + node = dev_of_node(dev); + } else { + err = of_get_phy_mode(node, &pf->if_mode); + if (err) { + dev_err(dev, "Failed to get PHY mode\n"); + return err; + } } err = enetc_mdiobus_create(pf, node); if (err) { dev_err(dev, "Failed to create MDIO bus\n"); - return err; + goto err_mdiobus_create; } err = enetc_phylink_create(priv, node, &enetc_pl_mac_ops); @@ -975,6 +1073,8 @@ static int enetc4_link_init(struct enetc_ndev_priv *priv, err_phylink_create: enetc_mdiobus_destroy(pf); +err_mdiobus_create: + enetc4_put_ppm_fixed_link(priv); return err; } @@ -985,6 +1085,7 @@ static void enetc4_link_deinit(struct enetc_ndev_priv *priv) enetc_phylink_destroy(priv); enetc_mdiobus_destroy(pf); + enetc4_put_ppm_fixed_link(priv); } static void enetc4_pf_link_status_task(struct work_struct *work) diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf_common.c b/drivers/net/ethernet/freescale/enetc/enetc_pf_common.c index 8206884294a4..3ba46c3a7670 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc_pf_common.c +++ b/drivers/net/ethernet/freescale/enetc/enetc_pf_common.c @@ -436,6 +436,43 @@ void enetc_mdiobus_destroy(struct enetc_pf *pf) } EXPORT_SYMBOL_GPL(enetc_mdiobus_destroy); +static struct { + unsigned long mac_cap; + int speed; /* descending order sorted */ +} enetc_phylink_pseudo_mac_caps[] = { + { MAC_25000FD, SPEED_25000 }, + { MAC_20000FD, SPEED_20000 }, + { MAC_10000FD, SPEED_10000 }, + { MAC_5000FD, SPEED_5000 }, + { MAC_2500FD, SPEED_2500 }, + { MAC_1000FD, SPEED_1000 }, + { MAC_100FD, SPEED_100 }, + { MAC_10FD, SPEED_10 }, +}; + +static unsigned long enetc_phylink_get_pseudo_mac_caps(void) +{ + unsigned long mac_caps = 0; + int i; + + for (i = 0; i < ARRAY_SIZE(enetc_phylink_pseudo_mac_caps); i++) + mac_caps |= enetc_phylink_pseudo_mac_caps[i].mac_cap; + + return mac_caps; +} + +int enetc_phylink_match_pseudo_mac_speed(int speed) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(enetc_phylink_pseudo_mac_caps); i++) + if (enetc_phylink_pseudo_mac_caps[i].speed <= speed) + return enetc_phylink_pseudo_mac_caps[i].speed; + + return SPEED_UNKNOWN; +} +EXPORT_SYMBOL_GPL(enetc_phylink_match_pseudo_mac_speed); + int enetc_phylink_create(struct enetc_ndev_priv *priv, struct device_node *node, const struct phylink_mac_ops *ops) { @@ -471,9 +508,7 @@ int enetc_phylink_create(struct enetc_ndev_priv *priv, struct device_node *node, phy_interface_set_rgmii(pf->phylink_config.supported_interfaces); } else { - mac_caps |= MAC_10FD | MAC_100FD | MAC_1000FD | MAC_2500FD | - MAC_5000FD | MAC_10000FD | MAC_20000FD | - MAC_25000FD; + mac_caps |= enetc_phylink_get_pseudo_mac_caps(); } pf->phylink_config.mac_capabilities = mac_caps; diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf_common.h b/drivers/net/ethernet/freescale/enetc/enetc_pf_common.h index c9eed879d5a3..aede1aad6362 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc_pf_common.h +++ b/drivers/net/ethernet/freescale/enetc/enetc_pf_common.h @@ -13,6 +13,7 @@ void enetc_mdiobus_destroy(struct enetc_pf *pf); int enetc_phylink_create(struct enetc_ndev_priv *priv, struct device_node *node, const struct phylink_mac_ops *ops); void enetc_phylink_destroy(struct enetc_ndev_priv *priv); +int enetc_phylink_match_pseudo_mac_speed(int speed); void enetc_set_default_rss_key(struct enetc_pf *pf); int enetc_vlan_rx_add_vid(struct net_device *ndev, __be16 prot, u16 vid); int enetc_vlan_rx_del_vid(struct net_device *ndev, __be16 prot, u16 vid); -- 2.34.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* RE: [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node 2026-10-13 17:12 ` [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node Claudiu Manoil @ 2026-10-15 2:16 ` Wei Fang 2026-10-15 13:20 ` Claudiu Manoil 2026-10-15 8:43 ` kernel test robot 1 sibling, 1 reply; 8+ messages in thread From: Wei Fang @ 2026-10-15 2:16 UTC (permalink / raw) To: Claudiu Manoil Cc: dl-S32, linux-kernel@vger.kernel.org, Vladimir Oltean, Clark Wang, Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring, Saravana Kannan, Russell King, imx@lists.linux.dev, devicetree@vger.kernel.org, netdev@vger.kernel.org > diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h > b/drivers/net/ethernet/freescale/enetc/enetc.h > index d9e91832a9c1..ed5402f1b73c 100644 > --- a/drivers/net/ethernet/freescale/enetc/enetc.h > +++ b/drivers/net/ethernet/freescale/enetc/enetc.h > @@ -500,6 +500,7 @@ struct enetc_ndev_priv { > > struct clk *ref_clk; /* RGMII/RMII reference clock */ > u64 sysclk_freq; /* NETC system clock frequency */ > + struct of_changeset *ppm_ocs; /* pseudo-MAC fixed-link changeset */ struct enetc_ndev_priv is shared by both PF and VF, but ppm_ocs is only used by PF. Would it be better to move it to struct enetc_pf? > }; > > #define ENETC_CBD(R, i) (&(((struct enetc_cbd *)((R).bd_base))[i])) > diff --git a/drivers/net/ethernet/freescale/enetc/enetc4_pf.c > b/drivers/net/ethernet/freescale/enetc/enetc4_pf.c > index 71c971618388..70e34ca6ddf8 100644 > --- a/drivers/net/ethernet/freescale/enetc/enetc4_pf.c > +++ b/drivers/net/ethernet/freescale/enetc/enetc4_pf.c > @@ -1,8 +1,9 @@ > // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) > -/* Copyright 2024 NXP */ > +/* Copyright 2024, 2026 NXP */ > > #include <linux/clk.h> > #include <linux/module.h> > +#include <linux/of.h> > #include <linux/of_net.h> > #include <linux/of_platform.h> > #include <linux/unaligned.h> > @@ -932,6 +933,14 @@ static void enetc4_pl_mac_link_down(struct > phylink_config *config, > enetc4_mac_tx_graceful_stop(pf); > } > > +static void enetc4_get_pcr_speed(struct enetc_hw *hw, int *speed) > +{ > + u32 val = enetc_port_rd(hw, ENETC4_PCR); > + int pspeed = FIELD_GET(PCR_PSPEED, val); > + > + *speed = (pspeed + 1) * 10; > +} > + > static const struct phylink_mac_ops enetc_pl_mac_ops = { > .mac_select_pcs = enetc4_pl_mac_select_pcs, > .mac_config = enetc4_pl_mac_config, > @@ -946,23 +955,112 @@ static void enetc4_pci_remove(void *data) > enetc_pci_remove(pdev); > } > > +static void enetc4_put_ppm_fixed_link(struct enetc_ndev_priv *priv) > +{ > + if (!priv->ppm_ocs) > + return; > + > + of_changeset_revert(priv->ppm_ocs); > + of_changeset_destroy(priv->ppm_ocs); > + kfree(priv->ppm_ocs); > + priv->ppm_ocs = NULL; > +} > + > +/* Pseudo-MAC ports have no real PHY; the link is fixed, with the operating > + * speed set at probe time from PCR[PSPEED]. Describe this with a fixed-link > + * subnode synthesized at runtime onto the port's own OF node, so phylink > + * picks it up through dev_fwnode() exactly as if it came from static DT. > + */ > +static int enetc4_add_ppm_fixed_link(struct enetc_ndev_priv *priv) > +{ > + struct device_node *np = dev_of_node(priv->dev); > + struct device_node *fixed_link; > + struct of_changeset *ocs; > + int speed, err; > + > + if (!np) > + return dev_err_probe(priv->dev, -ENODEV, > + "Missing of_node for Pseudo-MAC port\n"); > + > + enetc4_get_pcr_speed(&priv->si->hw, &speed); > + speed = enetc_phylink_match_pseudo_mac_speed(speed); > + > + ocs = kzalloc_obj(*ocs); > + if (!ocs) > + return -ENOMEM; > + > + of_changeset_init(ocs); > + > + fixed_link = of_changeset_create_node(ocs, np, "fixed-link"); > + if (!fixed_link) { > + err = -ENOMEM; > + goto err_destroy; > + } > + > + err = of_changeset_add_prop_u32(ocs, fixed_link, "speed", speed); > + if (err) > + goto err_put_node; > + > + err = of_changeset_add_prop_bool(ocs, fixed_link, "full-duplex"); > + if (err) > + goto err_put_node; > + > + err = of_changeset_apply(ocs); > + if (err) > + goto err_put_node; > + > + of_node_put(fixed_link); > + priv->ppm_ocs = ocs; > + > + return 0; > + > +err_put_node: > + of_node_put(fixed_link); > +err_destroy: > + of_changeset_destroy(ocs); > + kfree(ocs); > + > + return dev_err_probe(priv->dev, err, > + "Failed to add fixed-link node\n"); > +} > + > static int enetc4_link_init(struct enetc_ndev_priv *priv, > struct device_node *node) > { > + bool dynamic = node && of_node_check_flag(node, OF_DYNAMIC); > struct enetc_pf *pf = enetc_si_priv(priv->si); > struct device *dev = priv->dev; > int err; > > - err = of_get_phy_mode(node, &pf->if_mode); > - if (err) { > - dev_err(dev, "Failed to get PHY mode\n"); > - return err; > + /* Pseudo-MAC ENETCs are described by a runtime-synthesized fixed-link > + * node rather than static DT. This covers both a missing OF node and a > + * PCI-synthesized (OF_DYNAMIC) node, which is an empty node created > + * by the PCI core and thus carries no fixed-link description. > + */ > + if (enetc_is_pseudo_mac(priv->si) && (!node || dynamic)) { This indicates that the node pointer can be NULL, but enetc4_add_ppm_fixed_link() subsequently does not allow node to be NULL. This is puzzling. > + pf->if_mode = PHY_INTERFACE_MODE_INTERNAL; > + > + err = enetc4_add_ppm_fixed_link(priv); > + if (err) > + return err; > + > + /* The fixed-link node was spliced onto dev's own of_node, so > + * phylink will find it via dev_fwnode(dev). Use that node for > + * the subsequent MDIO/phylink setup below. > + */ > + node = dev_of_node(dev); Based on the implementation of enetc4_add_ppm_fixed_link(), the input parameter dev->of_node cannot be NULL. I'm not familiar with the of_changeset_* APIs. Will enetc4_add_ppm_fixed_link() update this pointer? > + } else { > + err = of_get_phy_mode(node, &pf->if_mode); > + if (err) { > + dev_err(dev, "Failed to get PHY mode\n"); > + return err; > + } > } > > err = enetc_mdiobus_create(pf, node); > if (err) { > dev_err(dev, "Failed to create MDIO bus\n"); > - return err; > + goto err_mdiobus_create; > } > > err = enetc_phylink_create(priv, node, &enetc_pl_mac_ops); ^ permalink raw reply [flat|nested] 8+ messages in thread
* RE: [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node 2026-10-15 2:16 ` Wei Fang @ 2026-10-15 13:20 ` Claudiu Manoil 0 siblings, 0 replies; 8+ messages in thread From: Claudiu Manoil @ 2026-10-15 13:20 UTC (permalink / raw) To: Wei Fang Cc: dl-S32, linux-kernel@vger.kernel.org, Vladimir Oltean, Clark Wang, Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring, Saravana Kannan, Russell King, imx@lists.linux.dev, devicetree@vger.kernel.org, netdev@vger.kernel.org From: Wei Fang <wei.fang@nxp.com> Sent: Thursday, October 15, 2026 5:17 AM [...] > Subject: RE: [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for > ENETCv4 Ports via a fixed-link node > > > diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h > > b/drivers/net/ethernet/freescale/enetc/enetc.h > > index d9e91832a9c1..ed5402f1b73c 100644 > > --- a/drivers/net/ethernet/freescale/enetc/enetc.h > > +++ b/drivers/net/ethernet/freescale/enetc/enetc.h > > @@ -500,6 +500,7 @@ struct enetc_ndev_priv { > > > > struct clk *ref_clk; /* RGMII/RMII reference clock */ > > u64 sysclk_freq; /* NETC system clock frequency */ > > + struct of_changeset *ppm_ocs; /* pseudo-MAC fixed-link changeset > */ > > struct enetc_ndev_priv is shared by both PF and VF, but ppm_ocs is only > used by PF. Would it be better to move it to struct enetc_pf? > Ok, will try this out. > > }; [...] > > +static int enetc4_add_ppm_fixed_link(struct enetc_ndev_priv *priv) > > +{ > > + struct device_node *np = dev_of_node(priv->dev); > > + struct device_node *fixed_link; > > + struct of_changeset *ocs; > > + int speed, err; > > + > > + if (!np) > > + return dev_err_probe(priv->dev, -ENODEV, > > + "Missing of_node for Pseudo-MAC port\n"); > > + > > + enetc4_get_pcr_speed(&priv->si->hw, &speed); > > + speed = enetc_phylink_match_pseudo_mac_speed(speed); > > + > > + ocs = kzalloc_obj(*ocs); > > + if (!ocs) > > + return -ENOMEM; > > + > > + of_changeset_init(ocs); > > + > > + fixed_link = of_changeset_create_node(ocs, np, "fixed-link"); > > + if (!fixed_link) { > > + err = -ENOMEM; > > + goto err_destroy; > > + } > > + > > + err = of_changeset_add_prop_u32(ocs, fixed_link, "speed", speed); > > + if (err) > > + goto err_put_node; > > + > > + err = of_changeset_add_prop_bool(ocs, fixed_link, "full-duplex"); > > + if (err) > > + goto err_put_node; > > + > > + err = of_changeset_apply(ocs); > > + if (err) > > + goto err_put_node; > > + > > + of_node_put(fixed_link); > > + priv->ppm_ocs = ocs; > > + > > + return 0; > > + > > +err_put_node: > > + of_node_put(fixed_link); > > +err_destroy: > > + of_changeset_destroy(ocs); > > + kfree(ocs); > > + > > + return dev_err_probe(priv->dev, err, > > + "Failed to add fixed-link node\n"); > > +} > > + > > static int enetc4_link_init(struct enetc_ndev_priv *priv, > > struct device_node *node) > > { > > + bool dynamic = node && of_node_check_flag(node, OF_DYNAMIC); > > struct enetc_pf *pf = enetc_si_priv(priv->si); > > struct device *dev = priv->dev; > > int err; > > > > - err = of_get_phy_mode(node, &pf->if_mode); > > - if (err) { > > - dev_err(dev, "Failed to get PHY mode\n"); > > - return err; [...] > > + if (enetc_is_pseudo_mac(priv->si) && (!node || dynamic)) { > > This indicates that the node pointer can be NULL, but > enetc4_add_ppm_fixed_link() subsequently does not allow node > to be NULL. This is puzzling. enetc4_add_ppm_fixed_link() checks dev_of_node(priv->dev) and if NULL, it returns error and prints following err message: "Missing of_node for Pseudo-MAC port\n". Which is fine for the enetc_is_pseudo_mac() case. One alternative would be to take the common 'else' branch in case of NULL node for the pseudo-MAC, and let of_get_phy_mode() return with error, but in that case "Failed to get PHY mode\n" is not a good error indication. So, nothing to change here, the 'if' branch check for the pseudo-MAC case is correct as it is. > > > + pf->if_mode = PHY_INTERFACE_MODE_INTERNAL; > > + > > + err = enetc4_add_ppm_fixed_link(priv); > > + if (err) > > + return err; > > + > > + /* The fixed-link node was spliced onto dev's own of_node, so > > + * phylink will find it via dev_fwnode(dev). Use that node for > > + * the subsequent MDIO/phylink setup below. > > + */ > > + node = dev_of_node(dev); > > Based on the implementation of enetc4_add_ppm_fixed_link(), the > input parameter dev->of_node cannot be NULL. I'm not familiar > with the of_changeset_* APIs. Will enetc4_add_ppm_fixed_link() > update this pointer? > Sure, all these functions take 'np' as argument, and 'np' is dev_of_node(priv->dev), which is the same as dev->of_node. > > + } else { > > + err = of_get_phy_mode(node, &pf->if_mode); > > + if (err) { > > + dev_err(dev, "Failed to get PHY mode\n"); > > + return err; > > + } > > } > > > > err = enetc_mdiobus_create(pf, node); > > if (err) { > > dev_err(dev, "Failed to create MDIO bus\n"); > > - return err; > > + goto err_mdiobus_create; > > } > > > > err = enetc_phylink_create(priv, node, &enetc_pl_mac_ops); ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node 2026-10-13 17:12 ` [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node Claudiu Manoil 2026-10-15 2:16 ` Wei Fang @ 2026-10-15 8:43 ` kernel test robot 2026-10-15 13:26 ` Claudiu Manoil 1 sibling, 1 reply; 8+ messages in thread From: kernel test robot @ 2026-10-15 8:43 UTC (permalink / raw) To: Claudiu Manoil, netdev Cc: llvm, oe-kbuild-all, s32, linux-kernel, Vladimir Oltean, Wei Fang, Clark Wang, Andrew Lunn, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring, Saravana Kannan, Russell King, imx, devicetree Hi Claudiu, kernel test robot noticed the following build errors: [auto build test ERROR on net-next/main] url: https://github.com/intel-lab-lkp/linux/commits/Claudiu-Manoil/net-enetc-Add-pseudo-MAC-support-for-ENETCv4-Ports-via-a-fixed-link-node/20261013-201245 base: net-next/main patch link: https://lore.kernel.org/r/d7b51cb29758538a4c68a700dd8cd41b6e7e08b6.1791908694.git.claudiu.manoil%40nxp.com patch subject: [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node config: x86_64-buildonly-randconfig-1004-20261015 (https://download.01.org/0day-ci/archive/20261015/202610151650.UHqL0Sb7-lkp@intel.com/config) compiler: clang version 22.1.8 (https://github.com/llvm/llvm-project ca7933e47d3a3451d81e72ac174dcb5aa28b59d1) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20261015/202610151650.UHqL0Sb7-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202610151650.UHqL0Sb7-lkp@intel.com/ All errors (new ones prefixed by >>): >> drivers/net/ethernet/freescale/enetc/enetc4_pf.c:963:2: error: call to undeclared function 'of_changeset_revert'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 963 | of_changeset_revert(priv->ppm_ocs); | ^ >> drivers/net/ethernet/freescale/enetc/enetc4_pf.c:964:2: error: call to undeclared function 'of_changeset_destroy'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 964 | of_changeset_destroy(priv->ppm_ocs); | ^ >> drivers/net/ethernet/freescale/enetc/enetc4_pf.c:992:2: error: call to undeclared function 'of_changeset_init'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 992 | of_changeset_init(ocs); | ^ >> drivers/net/ethernet/freescale/enetc/enetc4_pf.c:994:15: error: call to undeclared function 'of_changeset_create_node'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 994 | fixed_link = of_changeset_create_node(ocs, np, "fixed-link"); | ^ >> drivers/net/ethernet/freescale/enetc/enetc4_pf.c:994:13: error: incompatible integer to pointer conversion assigning to 'struct device_node *' from 'int' [-Wint-conversion] 994 | fixed_link = of_changeset_create_node(ocs, np, "fixed-link"); | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> drivers/net/ethernet/freescale/enetc/enetc4_pf.c:1000:8: error: call to undeclared function 'of_changeset_add_prop_u32'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 1000 | err = of_changeset_add_prop_u32(ocs, fixed_link, "speed", speed); | ^ >> drivers/net/ethernet/freescale/enetc/enetc4_pf.c:1004:8: error: call to undeclared function 'of_changeset_add_prop_bool'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 1004 | err = of_changeset_add_prop_bool(ocs, fixed_link, "full-duplex"); | ^ >> drivers/net/ethernet/freescale/enetc/enetc4_pf.c:1008:8: error: call to undeclared function 'of_changeset_apply'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 1008 | err = of_changeset_apply(ocs); | ^ drivers/net/ethernet/freescale/enetc/enetc4_pf.c:1020:2: error: call to undeclared function 'of_changeset_destroy'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 1020 | of_changeset_destroy(ocs); | ^ 9 errors generated. vim +/of_changeset_revert +963 drivers/net/ethernet/freescale/enetc/enetc4_pf.c 957 958 static void enetc4_put_ppm_fixed_link(struct enetc_ndev_priv *priv) 959 { 960 if (!priv->ppm_ocs) 961 return; 962 > 963 of_changeset_revert(priv->ppm_ocs); > 964 of_changeset_destroy(priv->ppm_ocs); 965 kfree(priv->ppm_ocs); 966 priv->ppm_ocs = NULL; 967 } 968 969 /* Pseudo-MAC ports have no real PHY; the link is fixed, with the operating 970 * speed set at probe time from PCR[PSPEED]. Describe this with a fixed-link 971 * subnode synthesized at runtime onto the port's own OF node, so phylink 972 * picks it up through dev_fwnode() exactly as if it came from static DT. 973 */ 974 static int enetc4_add_ppm_fixed_link(struct enetc_ndev_priv *priv) 975 { 976 struct device_node *np = dev_of_node(priv->dev); 977 struct device_node *fixed_link; 978 struct of_changeset *ocs; 979 int speed, err; 980 981 if (!np) 982 return dev_err_probe(priv->dev, -ENODEV, 983 "Missing of_node for Pseudo-MAC port\n"); 984 985 enetc4_get_pcr_speed(&priv->si->hw, &speed); 986 speed = enetc_phylink_match_pseudo_mac_speed(speed); 987 988 ocs = kzalloc_obj(*ocs); 989 if (!ocs) 990 return -ENOMEM; 991 > 992 of_changeset_init(ocs); 993 > 994 fixed_link = of_changeset_create_node(ocs, np, "fixed-link"); 995 if (!fixed_link) { 996 err = -ENOMEM; 997 goto err_destroy; 998 } 999 > 1000 err = of_changeset_add_prop_u32(ocs, fixed_link, "speed", speed); 1001 if (err) 1002 goto err_put_node; 1003 > 1004 err = of_changeset_add_prop_bool(ocs, fixed_link, "full-duplex"); 1005 if (err) 1006 goto err_put_node; 1007 > 1008 err = of_changeset_apply(ocs); 1009 if (err) 1010 goto err_put_node; 1011 1012 of_node_put(fixed_link); 1013 priv->ppm_ocs = ocs; 1014 1015 return 0; 1016 1017 err_put_node: 1018 of_node_put(fixed_link); 1019 err_destroy: 1020 of_changeset_destroy(ocs); 1021 kfree(ocs); 1022 1023 return dev_err_probe(priv->dev, err, 1024 "Failed to add fixed-link node\n"); 1025 } 1026 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 8+ messages in thread
* RE: [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node 2026-10-15 8:43 ` kernel test robot @ 2026-10-15 13:26 ` Claudiu Manoil 0 siblings, 0 replies; 8+ messages in thread From: Claudiu Manoil @ 2026-10-15 13:26 UTC (permalink / raw) To: kernel test robot, netdev@vger.kernel.org Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev, dl-S32, linux-kernel@vger.kernel.org, Vladimir Oltean, Wei Fang, Clark Wang, Andrew Lunn, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring, Saravana Kannan, Russell King, imx@lists.linux.dev, devicetree@vger.kernel.org NXP Confidential From: kernel test robot <lkp@intel.com> Sent: Thursday, October 15, 2026 11:44 AM [...] > Subject: Re: [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for > ENETCv4 Ports via a fixed-link node > > Hi Claudiu, > > kernel test robot noticed the following build errors: > > [auto build test ERROR on net-next/main] > > [...] > >> drivers/net/ethernet/freescale/enetc/enetc4_pf.c:963:2: error: call > >> to undeclared function 'of_changeset_revert'; ISO C99 and later do > >> not support implicit function declarations > >> [-Wimplicit-function-declaration] > 963 | of_changeset_revert(priv->ppm_ocs); > | ^ I'm looking into this, probably I need to guard the of_changeset_* calls with #ifdefs inside the driver. ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH net-next v2 3/5] arm64: dts: s32n79: add NETC IEP18 ECAM node for ENETC PPM ports 2026-10-13 17:12 [PATCH net-next v2 0/5] net: enetc: S32N79 pseudo-MAC (PPM) networking support Claudiu Manoil 2026-10-13 17:12 ` [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node Claudiu Manoil @ 2026-10-13 17:12 ` Claudiu Manoil 2026-10-13 17:12 ` [PATCH net-next v2 4/5] arm64: dts: s32n79-rdb: enable NETC IEP18 Claudiu Manoil 2 siblings, 0 replies; 8+ messages in thread From: Claudiu Manoil @ 2026-10-13 17:12 UTC (permalink / raw) To: netdev Cc: s32, linux-kernel, Frank Li, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Rob Herring, Krzysztof Kozlowski, Conor Dooley, imx, linux-arm-kernel, devicetree Add the netc_iep18 PCIe ECAM host node describing the NETC integrated endpoint bus allocated to the first Linux cohort on S32N79. The bus is enumerated via the generic pci-host-ecam-generic driver and hosts the ENETC v4 Pseudo-MAC (PPM) PF and its VFs, which connect internally to the on-chip NETC switch (not owned by Linux). The node is kept disabled at the SoC level; boards that wire up NETC enable it. MSIs are routed through the GIC-v3 ITS (msi-map) and DMA is translated by the SMMUv3 (iommu-map). Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com> --- v2: - Replaced the 'msi-parent' stub property with 'msi-map', as per H/W spec. arch/arm64/boot/dts/freescale/s32n79.dtsi | 24 +++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/arch/arm64/boot/dts/freescale/s32n79.dtsi b/arch/arm64/boot/dts/freescale/s32n79.dtsi index 94ab58783fdc..65cf65e82832 100644 --- a/arch/arm64/boot/dts/freescale/s32n79.dtsi +++ b/arch/arm64/boot/dts/freescale/s32n79.dtsi @@ -122,6 +122,30 @@ irqsteer_coss: interrupt-controller@4ed00000 { }; }; + nwss-bus { + compatible = "simple-bus"; + #address-cells = <2>; + #size-cells = <2>; + ranges = <0x0 0x48800000 0x0 0x48800000 0x0 0x4b0000>, + <0x2 0x40000000 0x2 0x40000000 0x0 0x20000000>; + + netc_iep18: pcie@241200000 { + compatible = "pci-host-ecam-generic"; + reg = <0x2 0x41200000 0x0 0x100000>; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + bus-range = <0x0 0x0>; + iommu-map = <0x0 &smmu 0xc0000 0x100>; + msi-map = <0x0 &its 0xc0000 0x100>; + dma-coherent; + status = "disabled"; + + /* All NETC PCIe functions */ + ranges = <0x82000000 0x0 0x48800000 0x0 0x48800000 0x0 0x4b0000>; + }; + }; + cpus { #address-cells = <1>; #size-cells = <0>; -- 2.34.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next v2 4/5] arm64: dts: s32n79-rdb: enable NETC IEP18 2026-10-13 17:12 [PATCH net-next v2 0/5] net: enetc: S32N79 pseudo-MAC (PPM) networking support Claudiu Manoil 2026-10-13 17:12 ` [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node Claudiu Manoil 2026-10-13 17:12 ` [PATCH net-next v2 3/5] arm64: dts: s32n79: add NETC IEP18 ECAM node for ENETC PPM ports Claudiu Manoil @ 2026-10-13 17:12 ` Claudiu Manoil 2 siblings, 0 replies; 8+ messages in thread From: Claudiu Manoil @ 2026-10-13 17:12 UTC (permalink / raw) To: netdev Cc: s32, linux-kernel, Frank Li, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Rob Herring, Krzysztof Kozlowski, Conor Dooley, imx, linux-arm-kernel, devicetree Enable the NETC v4 ECAM bus #18 on the S32N79-RDB board so that the ENETC v4 Pseudo-MAC port (PPM) PF and VF instances are probed. Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com> --- v2: none arch/arm64/boot/dts/freescale/s32n79-rdb.dts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/arm64/boot/dts/freescale/s32n79-rdb.dts b/arch/arm64/boot/dts/freescale/s32n79-rdb.dts index 1feccd61258e..897ba24ac03a 100644 --- a/arch/arm64/boot/dts/freescale/s32n79-rdb.dts +++ b/arch/arm64/boot/dts/freescale/s32n79-rdb.dts @@ -68,3 +68,7 @@ &usdhc0 { no-sdio; status = "okay"; }; + +&netc_iep18 { + status = "okay"; +}; -- 2.34.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-10-15 13:26 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-10-13 17:12 [PATCH net-next v2 0/5] net: enetc: S32N79 pseudo-MAC (PPM) networking support Claudiu Manoil 2026-10-13 17:12 ` [PATCH net-next v2 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node Claudiu Manoil 2026-10-15 2:16 ` Wei Fang 2026-10-15 13:20 ` Claudiu Manoil 2026-10-15 8:43 ` kernel test robot 2026-10-15 13:26 ` Claudiu Manoil 2026-10-13 17:12 ` [PATCH net-next v2 3/5] arm64: dts: s32n79: add NETC IEP18 ECAM node for ENETC PPM ports Claudiu Manoil 2026-10-13 17:12 ` [PATCH net-next v2 4/5] arm64: dts: s32n79-rdb: enable NETC IEP18 Claudiu Manoil
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox