* [PATCH net-next v3 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node
[not found] <cover.1793712309.git.claudiu.manoil@nxp.com>
@ 2026-11-03 14:09 ` Claudiu Manoil
2026-11-03 14:09 ` [PATCH net-next v3 2/5] net: enetc: Enable probing of version 4.4 devices Claudiu Manoil
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Claudiu Manoil @ 2026-11-03 14:09 UTC (permalink / raw)
To: netdev
Cc: s32, Vladimir Oltean, Wei Fang, Clark Wang, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Rob Herring, Saravana Kannan, Russell King, imx, linux-kernel,
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, as long as it's a phylink
supported value. Otherwise, PCR[PSPEED] will be updated to the closest
rounded down supported value.
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>
---
v3:
- Fixed the CONFIG_OF_DYNAMIC dependency.
- Refactored enetc4_add_ppm_fixed_link(), as per Wei's feedback.
- Improved the commit message.
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/Kconfig | 1 +
.../net/ethernet/freescale/enetc/enetc4_pf.c | 109 +++++++++++++++++-
.../net/ethernet/freescale/enetc/enetc_pf.h | 2 +
.../freescale/enetc/enetc_pf_common.c | 41 ++++++-
.../freescale/enetc/enetc_pf_common.h | 1 +
5 files changed, 145 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/Kconfig b/drivers/net/ethernet/freescale/enetc/Kconfig
index f425f82a6213a..c51d07db2c869 100644
--- a/drivers/net/ethernet/freescale/enetc/Kconfig
+++ b/drivers/net/ethernet/freescale/enetc/Kconfig
@@ -55,6 +55,7 @@ config NXP_ENETC4
select NXP_NTMP
select PHYLINK
select DIMLIB
+ select OF_DYNAMIC
help
This driver supports NXP ENETC devices with major revision 4. ENETC is
as the NIC functionality in NETC, it supports virtualization/isolation
diff --git a/drivers/net/ethernet/freescale/enetc/enetc4_pf.c b/drivers/net/ethernet/freescale/enetc/enetc4_pf.c
index 71c971618388b..b7e7201e6a71a 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,108 @@ static void enetc4_pci_remove(void *data)
enetc_pci_remove(pdev);
}
+static void enetc4_put_ppm_fixed_link(struct enetc_pf *pf)
+{
+ if (!pf->ppm_ocs)
+ return;
+
+ of_changeset_revert(pf->ppm_ocs);
+ of_changeset_destroy(pf->ppm_ocs);
+ kfree(pf->ppm_ocs);
+ pf->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_pf *pf,
+ struct device_node *np)
+{
+ struct device_node *fixed_link;
+ struct of_changeset *ocs;
+ int speed, err;
+
+ enetc4_get_pcr_speed(&pf->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);
+ pf->ppm_ocs = ocs;
+
+ return 0;
+
+err_put_node:
+ of_node_put(fixed_link);
+err_destroy:
+ of_changeset_destroy(ocs);
+ kfree(ocs);
+
+ return err;
+}
+
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;
+
+ if (!node) {
+ dev_err(dev, "Missing of_node for Pseudo-MAC port\n");
+ return -ENODEV;
+ }
+
+ err = enetc4_add_ppm_fixed_link(pf, node);
+ if (err) {
+ dev_err(dev, "Failed to add fixed-link node\n");
+ return err;
+ }
+ } 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 +1069,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(pf);
return err;
}
@@ -985,6 +1081,7 @@ static void enetc4_link_deinit(struct enetc_ndev_priv *priv)
enetc_phylink_destroy(priv);
enetc_mdiobus_destroy(pf);
+ enetc4_put_ppm_fixed_link(pf);
}
static void enetc4_pf_link_status_task(struct work_struct *work)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.h b/drivers/net/ethernet/freescale/enetc/enetc_pf.h
index 1f92d16d8ca81..ab11e40cfdbbb 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.h
@@ -67,6 +67,8 @@ struct enetc_pf {
bool sriov_enabled;
bool link_up;
u16 link_status_ms_mask;
+
+ struct of_changeset *ppm_ocs; /* pseudo-MAC fixed-link changeset */
};
#define phylink_to_enetc_pf(config) \
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf_common.c b/drivers/net/ethernet/freescale/enetc/enetc_pf_common.c
index 8206884294a47..3ba46c3a7670b 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 c9eed879d5a3f..aede1aad63621 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 [flat|nested] 6+ messages in thread
* [PATCH net-next v3 2/5] net: enetc: Enable probing of version 4.4 devices
[not found] <cover.1793712309.git.claudiu.manoil@nxp.com>
2026-11-03 14:09 ` [PATCH net-next v3 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node Claudiu Manoil
@ 2026-11-03 14:09 ` Claudiu Manoil
2026-11-09 17:37 ` Simon Horman
2026-11-03 14:09 ` [PATCH net-next v3 3/5] arm64: dts: s32n79: add NETC IEP18 ECAM node for ENETC PPM ports Claudiu Manoil
` (2 subsequent siblings)
4 siblings, 1 reply; 6+ messages in thread
From: Claudiu Manoil @ 2026-11-03 14:09 UTC (permalink / raw)
To: netdev
Cc: s32, Vladimir Oltean, Wei Fang, Clark Wang, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, imx,
linux-kernel
The ENETC v4.4 devices are present on S32N79 SoCs and feature only
Pseudo-MAC ENETC ports, whose PFs use either the 0xe101 or the 0xe110
PCI device ID, and the VFs answer to the usual device ID of 0xef00.
While the ENETC PF instances are usually designated by the 0xe101 ID,
in newer IP versions the 0xe110 ID was introduced to indicate the
power-on reset default NETC switch management interface. These IDs
do not indicate any functional difference between the designated
ENETC instances, and can be interchanged and re-assigned at boot time
(i.e. from firmware).
Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com>
---
v3:
- Added sysclk_freq info for the v4.4 ENETC devices.
v2:
- Described why there are two ENETC PF IDs in the commit message, as per
review.
drivers/net/ethernet/freescale/enetc/enetc.c | 26 +++++++++++++++++++
.../net/ethernet/freescale/enetc/enetc_hw.h | 4 ++-
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index c6571b5cc8425..b989823859ff2 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -3832,6 +3832,20 @@ static const struct enetc_drvdata enetc4_vf_data = {
.eth_ops = &enetc_vf_ethtool_ops,
};
+static const struct enetc_drvdata enetc4_s32n79_ppm_data = {
+ .sysclk_freq = ENETC_CLK_500M,
+ .tx_csum = true,
+ .max_frags = ENETC4_MAX_SKB_FRAGS,
+ .eth_ops = &enetc4_ppm_ethtool_ops,
+};
+
+static const struct enetc_drvdata enetc4_s32n79_vf_data = {
+ .sysclk_freq = ENETC_CLK_500M,
+ .tx_csum = true,
+ .max_frags = ENETC4_MAX_SKB_FRAGS,
+ .eth_ops = &enetc_vf_ethtool_ops,
+};
+
static const struct enetc_platform_info enetc_info[] = {
{ .revision = ENETC_REV_1_0,
.dev_id = ENETC_DEV_ID_PF,
@@ -3862,6 +3876,18 @@ static const struct enetc_platform_info enetc_info[] = {
.dev_id = NXP_ENETC_VF_DEV_ID,
.data = &enetc4_vf_data,
},
+ { .revision = ENETC_REV_4_4,
+ .dev_id = NXP_ENETC_PPM_DEV_ID,
+ .data = &enetc4_s32n79_ppm_data,
+ },
+ { .revision = ENETC_REV_4_4,
+ .dev_id = NXP_ENETC_PF_DEV_ID,
+ .data = &enetc4_s32n79_ppm_data,
+ },
+ { .revision = ENETC_REV_4_4,
+ .dev_id = NXP_ENETC_VF_DEV_ID,
+ .data = &enetc4_s32n79_vf_data,
+ },
};
int enetc_get_driver_data(struct enetc_si *si)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_hw.h b/drivers/net/ethernet/freescale/enetc/enetc_hw.h
index 2c9d9042eb0bb..8e6a9d366d404 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_hw.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc_hw.h
@@ -414,6 +414,7 @@ enum enetc_bdr_type {TX, RX};
#define ENETC_REV_1_0 0x0100
#define ENETC_REV_4_1 0X0401
#define ENETC_REV_4_3 0x0403
+#define ENETC_REV_4_4 0x0404
#define ENETC_G_EIPBRR1 0x0bfc
#define ENETC_G_EPFBLPR(n) (0xd00 + 4 * (n))
@@ -1048,8 +1049,9 @@ struct enetc_cbd {
u8 status_flags;
};
-#define ENETC_CLK_400M 400000000ULL
#define ENETC_CLK_333M 333000000ULL
+#define ENETC_CLK_400M 400000000ULL
+#define ENETC_CLK_500M 500000000ULL
static inline u32 enetc_cycles_to_usecs(u32 cycles, u64 clk_freq)
{
--
2.34.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net-next v3 3/5] arm64: dts: s32n79: add NETC IEP18 ECAM node for ENETC PPM ports
[not found] <cover.1793712309.git.claudiu.manoil@nxp.com>
2026-11-03 14:09 ` [PATCH net-next v3 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node Claudiu Manoil
2026-11-03 14:09 ` [PATCH net-next v3 2/5] net: enetc: Enable probing of version 4.4 devices Claudiu Manoil
@ 2026-11-03 14:09 ` Claudiu Manoil
2026-11-03 14:09 ` [PATCH net-next v3 4/5] arm64: dts: s32n79-rdb: enable NETC IEP18 Claudiu Manoil
2026-11-03 14:09 ` [PATCH net-next v3 5/5] PCI: Create OF node for NXP ENETC pseudo-MAC functions Claudiu Manoil
4 siblings, 0 replies; 6+ messages in thread
From: Claudiu Manoil @ 2026-11-03 14:09 UTC (permalink / raw)
To: netdev
Cc: s32, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
Fabio Estevam, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
imx, linux-arm-kernel, devicetree, linux-kernel
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>
---
v3: none
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 94ab58783fdc8..65cf65e828328 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 [flat|nested] 6+ messages in thread
* [PATCH net-next v3 4/5] arm64: dts: s32n79-rdb: enable NETC IEP18
[not found] <cover.1793712309.git.claudiu.manoil@nxp.com>
` (2 preceding siblings ...)
2026-11-03 14:09 ` [PATCH net-next v3 3/5] arm64: dts: s32n79: add NETC IEP18 ECAM node for ENETC PPM ports Claudiu Manoil
@ 2026-11-03 14:09 ` Claudiu Manoil
2026-11-03 14:09 ` [PATCH net-next v3 5/5] PCI: Create OF node for NXP ENETC pseudo-MAC functions Claudiu Manoil
4 siblings, 0 replies; 6+ messages in thread
From: Claudiu Manoil @ 2026-11-03 14:09 UTC (permalink / raw)
To: netdev
Cc: s32, Frank Li, Sascha Hauer, Pengutronix Kernel Team,
Fabio Estevam, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
imx, linux-arm-kernel, devicetree, linux-kernel
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>
---
v3: none
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 1feccd61258ef..897ba24ac03ae 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 [flat|nested] 6+ messages in thread
* [PATCH net-next v3 5/5] PCI: Create OF node for NXP ENETC pseudo-MAC functions
[not found] <cover.1793712309.git.claudiu.manoil@nxp.com>
` (3 preceding siblings ...)
2026-11-03 14:09 ` [PATCH net-next v3 4/5] arm64: dts: s32n79-rdb: enable NETC IEP18 Claudiu Manoil
@ 2026-11-03 14:09 ` Claudiu Manoil
4 siblings, 0 replies; 6+ messages in thread
From: Claudiu Manoil @ 2026-11-03 14:09 UTC (permalink / raw)
To: netdev; +Cc: s32, Bjorn Helgaas, linux-pci, linux-kernel
NXP ENETCv4 pseudo-MAC (PPM) ports can be probed as pure PCI endpoints,
without any "ethernet" node in the static device tree. The ENETC4 driver
describes their fixed link by attaching a fixed-link node to the PCI
function's own OF node, which requires that node to exist.
Request the PCI core to synthesize a per-function OF node for these
devices by registering of_pci_make_dev_node() as a final fixup, following
the existing precedent for the Xilinx, Red Hat and EFAR devices. The
helper is a no-op when the function already has a static OF node, so this
has no effect on platforms that describe ENETC via static DT. It only
takes effect when CONFIG_PCI_DYNAMIC_OF_NODES is enabled.
Both ENETC4 PCI device IDs are covered (0xe101 and 0xe110), since either
can be instantiated as a pseudo-MAC port on S32N79.
Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
---
v3: none
v2: none (reworded the overlay reference to match patch 1's fixed-link
approach; no functional change)
drivers/pci/quirks.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 7f1f47ea2ee41..71f272d8a2965 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -6563,6 +6563,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_XILINX, 0x5021, of_pci_make_dev_node);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_REDHAT, 0x0005, of_pci_make_dev_node);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_EFAR, 0x9660, of_pci_make_dev_node);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_TOSHIBA, 0x0220, of_pci_make_dev_node);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_PHILIPS, 0xe101, of_pci_make_dev_node);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_PHILIPS, 0xe110, of_pci_make_dev_node);
/*
* Devices known to require a longer delay before first config space access
--
2.34.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net-next v3 2/5] net: enetc: Enable probing of version 4.4 devices
2026-11-03 14:09 ` [PATCH net-next v3 2/5] net: enetc: Enable probing of version 4.4 devices Claudiu Manoil
@ 2026-11-09 17:37 ` Simon Horman
0 siblings, 0 replies; 6+ messages in thread
From: Simon Horman @ 2026-11-09 17:37 UTC (permalink / raw)
To: Claudiu Manoil
Cc: netdev, s32, Vladimir Oltean, Wei Fang, Clark Wang, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, imx,
linux-kernel
On Tue, Nov 03, 2026 at 04:09:08PM +0200, Claudiu Manoil wrote:
> The ENETC v4.4 devices are present on S32N79 SoCs and feature only
> Pseudo-MAC ENETC ports, whose PFs use either the 0xe101 or the 0xe110
> PCI device ID, and the VFs answer to the usual device ID of 0xef00.
>
> While the ENETC PF instances are usually designated by the 0xe101 ID,
> in newer IP versions the 0xe110 ID was introduced to indicate the
> power-on reset default NETC switch management interface. These IDs
> do not indicate any functional difference between the designated
> ENETC instances, and can be interchanged and re-assigned at boot time
> (i.e. from firmware).
>
> Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com>
> ---
> v3:
> - Added sysclk_freq info for the v4.4 ENETC devices.
>
> v2:
> - Described why there are two ENETC PF IDs in the commit message, as per
> review.
I realise this was forwarded somewhere by an automation, but it seems not
to the full CC list, so I'm reproducing it here:
commit 6de2e15f2fb313f3ab9a84d0bfd5a867de11c72c
Author: Claudiu Manoil <claudiu.manoil@nxp.com>
net: enetc: Enable probing of version 4.4 devices
This commit adds driver data and platform info entries for ENETC v4.4 PF and
VF devices on S32N79 SoCs with a 500 MHz system clock frequency.
> diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
> index c6571b5cc8425..b989823859ff2 100644
> --- a/drivers/net/ethernet/freescale/enetc/enetc.c
> +++ b/drivers/net/ethernet/freescale/enetc/enetc.c
> @@ -3832,6 +3832,20 @@ static const struct enetc_drvdata enetc4_vf_data = {
> .eth_ops = &enetc_vf_ethtool_ops,
> };
>
> +static const struct enetc_drvdata enetc4_s32n79_ppm_data = {
> + .sysclk_freq = ENETC_CLK_500M,
> + .tx_csum = true,
> + .max_frags = ENETC4_MAX_SKB_FRAGS,
> + .eth_ops = &enetc4_ppm_ethtool_ops,
> +};
> +
> +static const struct enetc_drvdata enetc4_s32n79_vf_data = {
> + .sysclk_freq = ENETC_CLK_500M,
> + .tx_csum = true,
> + .max_frags = ENETC4_MAX_SKB_FRAGS,
> + .eth_ops = &enetc_vf_ethtool_ops,
> +};
> +
> static const struct enetc_platform_info enetc_info[] = {
> { .revision = ENETC_REV_1_0,
> .dev_id = ENETC_DEV_ID_PF,
> @@ -3862,6 +3876,18 @@ static const struct enetc_platform_info enetc_info[] = {
> .dev_id = NXP_ENETC_VF_DEV_ID,
> .data = &enetc4_vf_data,
> },
> + { .revision = ENETC_REV_4_4,
> + .dev_id = NXP_ENETC_PPM_DEV_ID,
> + .data = &enetc4_s32n79_ppm_data,
> + },
> + { .revision = ENETC_REV_4_4,
> + .dev_id = NXP_ENETC_PF_DEV_ID,
> + .data = &enetc4_s32n79_ppm_data,
> + },
> + { .revision = ENETC_REV_4_4,
> + .dev_id = NXP_ENETC_VF_DEV_ID,
> + .data = &enetc4_s32n79_vf_data,
> + },
Can probing ENETC v4.4 on an 8-core S32N79 SoC overflow priv->int_vector[] in
enetc_int_vector_init()?
In drivers/net/ethernet/freescale/enetc/enetc.h, ENETC_MAX_BDR_INT is still
defined as 6:
#define ENETC_MAX_BDR_INT 6 /* fixed to max # of available cpus */
...
struct enetc_ndev_priv {
...
int bdr_int_num; /* number of Rx/Tx ring interrupts */
struct enetc_int_vector *int_vector[ENETC_MAX_BDR_INT];
u16 num_rx_rings, num_tx_rings;
u16 rx_bd_count, tx_bd_count;
Previously supported SoCs had at most 6 CPUs, whereas S32N79 has 8 CPUs and
enetc4_default_rings_allocation() allocates up to ENETC_SI_MAX_RING_NUM (8)
RX rings to the PF.
When enetc_init_si_rings_params() runs on an 8-CPU system with 7 or 8 RX
rings:
int cpus = num_online_cpus();
...
priv->num_rx_rings = min_t(int, cpus, si->num_rx_rings);
priv->num_tx_rings = si->num_tx_rings;
priv->bdr_int_num = priv->num_rx_rings;
priv->bdr_int_num becomes 7 or 8 without being clamped to ENETC_MAX_BDR_INT.
Then enetc_alloc_msix() -> enetc_int_vector_init() writes past the end of
priv->int_vector[]:
for (i = 0; i < priv->bdr_int_num; i++) {
...
err = enetc_int_vector_init(priv, i, num_tx_rings);
where enetc_int_vector_init() does:
priv->int_vector[i] = v;
overwriting num_rx_rings, num_tx_rings, rx_bd_count, tx_bd_count, and
subsequent fields in struct enetc_ndev_priv.
Should ENETC_MAX_BDR_INT be increased (and/or priv->bdr_int_num bounded by
ENETC_MAX_BDR_INT)?
Link: https://sashiko.dev/#/patchset/cover.1793712309.git.claudiu.manoil%40nxp.com?part=2
This does seem to be a legitimate concern to me, and I think it warrants a v4.
There is also a review of patch 1/5, here, which I think warrants
investigation too.
Link: https://sashiko.dev/#/patchset/cover.1793712309.git.claudiu.manoil%40nxp.com?part=1
--
pw-bot: changes-requested
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-11-09 17:37 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <cover.1793712309.git.claudiu.manoil@nxp.com>
2026-11-03 14:09 ` [PATCH net-next v3 1/5] net: enetc: Add pseudo-MAC support for ENETCv4 Ports via a fixed-link node Claudiu Manoil
2026-11-03 14:09 ` [PATCH net-next v3 2/5] net: enetc: Enable probing of version 4.4 devices Claudiu Manoil
2026-11-09 17:37 ` Simon Horman
2026-11-03 14:09 ` [PATCH net-next v3 3/5] arm64: dts: s32n79: add NETC IEP18 ECAM node for ENETC PPM ports Claudiu Manoil
2026-11-03 14:09 ` [PATCH net-next v3 4/5] arm64: dts: s32n79-rdb: enable NETC IEP18 Claudiu Manoil
2026-11-03 14:09 ` [PATCH net-next v3 5/5] PCI: Create OF node for NXP ENETC pseudo-MAC functions Claudiu Manoil
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®