Resguardo inicial

This commit is contained in:
lastdragon
2026-09-06 12:53:21 -06:00
parent 662efe3c2a
commit ad2088d178
94853 changed files with 43200404 additions and 0 deletions
+16
View File
@@ -0,0 +1,16 @@
# SPDX-License-Identifier: GPL-2.0-only
config NET_DSA_NETC_SWITCH
tristate "NXP NETC Ethernet switch support"
depends on ARM64 || COMPILE_TEST
depends on NET_DSA && PCI
depends on NET_VENDOR_FREESCALE
select NET_DSA_TAG_NETC
select FSL_ENETC_MDIO
select NXP_NTMP
select NXP_NETC_LIB
help
This driver supports the NXP NETC Ethernet switch, which is embedded
as a PCIe function of the NXP NETC IP. But note that this driver is
only available for NETC v4.3 and later versions.
If compiled as module (M), the module name is nxp-netc-switch.
@@ -0,0 +1,3 @@
# SPDX-License-Identifier: GPL-2.0-only
obj-$(CONFIG_NET_DSA_NETC_SWITCH) += nxp-netc-switch.o
nxp-netc-switch-objs := netc_main.o netc_platform.o netc_ethtool.o
@@ -0,0 +1,291 @@
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/*
* NXP NETC switch driver
* Copyright 2025-2026 NXP
*/
#include <linux/ethtool_netlink.h>
#include "netc_switch.h"
static const struct ethtool_rmon_hist_range netc_rmon_ranges[] = {
{ 64, 64 },
{ 65, 127 },
{ 128, 255 },
{ 256, 511 },
{ 512, 1023 },
{ 1024, 1522 },
{ 1523, NETC_MAX_FRAME_LEN },
{ }
};
static const struct netc_port_stat netc_port_counters[] = {
{ NETC_PTGSLACR, "port gate late arrival frames" },
{ NETC_PSDFTCR, "port SDF transmit frames" },
{ NETC_PSDFDDCR, "port SDF drop duplicate frames" },
{ NETC_PRXDCR, "port rx discard frames" },
{ NETC_PRXDCRRR, "port rx discard read-reset" },
{ NETC_PRXDCRR0, "port rx discard reason 0" },
{ NETC_PRXDCRR1, "port rx discard reason 1" },
{ NETC_PTXDCR, "port tx discard frames" },
{ NETC_BPDCR, "bridge port discard frames" },
};
static const struct netc_port_stat netc_emac_counters[] = {
{ NETC_PM_ROCT(0), "eMAC rx octets" },
{ NETC_PM_RVLAN(0), "eMAC rx VLAN frames" },
{ NETC_PM_RERR(0), "eMAC rx frame errors" },
{ NETC_PM_RUCA(0), "eMAC rx unicast frames" },
{ NETC_PM_RDRP(0), "eMAC rx dropped packets" },
{ NETC_PM_RPKT(0), "eMAC rx packets" },
{ NETC_PM_TOCT(0), "eMAC tx octets" },
{ NETC_PM_TVLAN(0), "eMAC tx VLAN frames" },
{ NETC_PM_TFCS(0), "eMAC tx FCS errors" },
{ NETC_PM_TUCA(0), "eMAC tx unicast frames" },
{ NETC_PM_TPKT(0), "eMAC tx packets" },
{ NETC_PM_TUND(0), "eMAC tx undersized packets" },
{ NETC_PM_TIOCT(0), "eMAC tx invalid octets" },
};
static const struct netc_port_stat netc_pmac_counters[] = {
{ NETC_PM_ROCT(1), "pMAC rx octets" },
{ NETC_PM_RVLAN(1), "pMAC rx VLAN frames" },
{ NETC_PM_RERR(1), "pMAC rx frame errors" },
{ NETC_PM_RUCA(1), "pMAC rx unicast frames" },
{ NETC_PM_RDRP(1), "pMAC rx dropped packets" },
{ NETC_PM_RPKT(1), "pMAC rx packets" },
{ NETC_PM_TOCT(1), "pMAC tx octets" },
{ NETC_PM_TVLAN(1), "pMAC tx VLAN frames" },
{ NETC_PM_TFCS(1), "pMAC tx FCS errors" },
{ NETC_PM_TUCA(1), "pMAC tx unicast frames" },
{ NETC_PM_TPKT(1), "pMAC tx packets" },
{ NETC_PM_TUND(1), "pMAC tx undersized packets" },
{ NETC_PM_TIOCT(1), "pMAC tx invalid octets" },
};
static void netc_port_pause_stats(struct netc_port *np, int mac,
struct ethtool_pause_stats *stats)
{
if (mac && !np->caps.pmac)
return;
stats->tx_pause_frames = netc_port_rd64(np, NETC_PM_TXPF(mac));
stats->rx_pause_frames = netc_port_rd64(np, NETC_PM_RXPF(mac));
}
void netc_port_get_pause_stats(struct dsa_switch *ds, int port,
struct ethtool_pause_stats *pause_stats)
{
struct netc_port *np = NETC_PORT(ds, port);
struct net_device *ndev;
switch (pause_stats->src) {
case ETHTOOL_MAC_STATS_SRC_EMAC:
netc_port_pause_stats(np, 0, pause_stats);
break;
case ETHTOOL_MAC_STATS_SRC_PMAC:
netc_port_pause_stats(np, 1, pause_stats);
break;
case ETHTOOL_MAC_STATS_SRC_AGGREGATE:
ndev = dsa_to_port(ds, port)->user;
ethtool_aggregate_pause_stats(ndev, pause_stats);
break;
}
}
static void netc_port_rmon_stats(struct netc_port *np, int mac,
struct ethtool_rmon_stats *stats)
{
if (mac && !np->caps.pmac)
return;
stats->undersize_pkts = netc_port_rd64(np, NETC_PM_RUND(mac));
stats->oversize_pkts = netc_port_rd64(np, NETC_PM_ROVR(mac));
stats->fragments = netc_port_rd64(np, NETC_PM_RFRG(mac));
stats->jabbers = netc_port_rd64(np, NETC_PM_RJBR(mac));
stats->hist[0] = netc_port_rd64(np, NETC_PM_R64(mac));
stats->hist[1] = netc_port_rd64(np, NETC_PM_R127(mac));
stats->hist[2] = netc_port_rd64(np, NETC_PM_R255(mac));
stats->hist[3] = netc_port_rd64(np, NETC_PM_R511(mac));
stats->hist[4] = netc_port_rd64(np, NETC_PM_R1023(mac));
stats->hist[5] = netc_port_rd64(np, NETC_PM_R1522(mac));
stats->hist[6] = netc_port_rd64(np, NETC_PM_R1523X(mac));
stats->hist_tx[0] = netc_port_rd64(np, NETC_PM_T64(mac));
stats->hist_tx[1] = netc_port_rd64(np, NETC_PM_T127(mac));
stats->hist_tx[2] = netc_port_rd64(np, NETC_PM_T255(mac));
stats->hist_tx[3] = netc_port_rd64(np, NETC_PM_T511(mac));
stats->hist_tx[4] = netc_port_rd64(np, NETC_PM_T1023(mac));
stats->hist_tx[5] = netc_port_rd64(np, NETC_PM_T1522(mac));
stats->hist_tx[6] = netc_port_rd64(np, NETC_PM_T1523X(mac));
}
void netc_port_get_rmon_stats(struct dsa_switch *ds, int port,
struct ethtool_rmon_stats *rmon_stats,
const struct ethtool_rmon_hist_range **ranges)
{
struct netc_port *np = NETC_PORT(ds, port);
struct net_device *ndev;
*ranges = netc_rmon_ranges;
switch (rmon_stats->src) {
case ETHTOOL_MAC_STATS_SRC_EMAC:
netc_port_rmon_stats(np, 0, rmon_stats);
break;
case ETHTOOL_MAC_STATS_SRC_PMAC:
netc_port_rmon_stats(np, 1, rmon_stats);
break;
case ETHTOOL_MAC_STATS_SRC_AGGREGATE:
ndev = dsa_to_port(ds, port)->user;
ethtool_aggregate_rmon_stats(ndev, rmon_stats);
break;
}
}
static void netc_port_ctrl_stats(struct netc_port *np, int mac,
struct ethtool_eth_ctrl_stats *stats)
{
if (mac && !np->caps.pmac)
return;
stats->MACControlFramesTransmitted =
netc_port_rd64(np, NETC_PM_TCNP(mac));
stats->MACControlFramesReceived =
netc_port_rd64(np, NETC_PM_RCNP(mac));
}
void netc_port_get_eth_ctrl_stats(struct dsa_switch *ds, int port,
struct ethtool_eth_ctrl_stats *ctrl_stats)
{
struct netc_port *np = NETC_PORT(ds, port);
struct net_device *ndev;
switch (ctrl_stats->src) {
case ETHTOOL_MAC_STATS_SRC_EMAC:
netc_port_ctrl_stats(np, 0, ctrl_stats);
break;
case ETHTOOL_MAC_STATS_SRC_PMAC:
netc_port_ctrl_stats(np, 1, ctrl_stats);
break;
case ETHTOOL_MAC_STATS_SRC_AGGREGATE:
ndev = dsa_to_port(ds, port)->user;
ethtool_aggregate_ctrl_stats(ndev, ctrl_stats);
break;
}
}
static void netc_port_mac_stats(struct netc_port *np, int mac,
struct ethtool_eth_mac_stats *stats)
{
if (mac && !np->caps.pmac)
return;
stats->FramesTransmittedOK = netc_port_rd64(np, NETC_PM_TFRM(mac));
stats->SingleCollisionFrames = netc_port_rd64(np, NETC_PM_TSCOL(mac));
stats->MultipleCollisionFrames =
netc_port_rd64(np, NETC_PM_TMCOL(mac));
stats->FramesReceivedOK = netc_port_rd64(np, NETC_PM_RFRM(mac));
stats->FrameCheckSequenceErrors =
netc_port_rd64(np, NETC_PM_RFCS(mac));
stats->AlignmentErrors = netc_port_rd64(np, NETC_PM_RALN(mac));
stats->OctetsTransmittedOK = netc_port_rd64(np, NETC_PM_TEOCT(mac));
stats->FramesWithDeferredXmissions =
netc_port_rd64(np, NETC_PM_TDFR(mac));
stats->LateCollisions = netc_port_rd64(np, NETC_PM_TLCOL(mac));
stats->FramesAbortedDueToXSColls =
netc_port_rd64(np, NETC_PM_TECOL(mac));
stats->FramesLostDueToIntMACXmitError =
netc_port_rd64(np, NETC_PM_TERR(mac));
stats->OctetsReceivedOK = netc_port_rd64(np, NETC_PM_REOCT(mac));
stats->FramesLostDueToIntMACRcvError =
netc_port_rd64(np, NETC_PM_RDRNTP(mac));
stats->MulticastFramesXmittedOK =
netc_port_rd64(np, NETC_PM_TMCA(mac));
stats->BroadcastFramesXmittedOK =
netc_port_rd64(np, NETC_PM_TBCA(mac));
stats->MulticastFramesReceivedOK =
netc_port_rd64(np, NETC_PM_RMCA(mac));
stats->BroadcastFramesReceivedOK =
netc_port_rd64(np, NETC_PM_RBCA(mac));
stats->FramesWithExcessiveDeferral =
netc_port_rd64(np, NETC_PM_TEDFR(mac));
}
void netc_port_get_eth_mac_stats(struct dsa_switch *ds, int port,
struct ethtool_eth_mac_stats *mac_stats)
{
struct netc_port *np = NETC_PORT(ds, port);
struct net_device *ndev;
switch (mac_stats->src) {
case ETHTOOL_MAC_STATS_SRC_EMAC:
netc_port_mac_stats(np, 0, mac_stats);
break;
case ETHTOOL_MAC_STATS_SRC_PMAC:
netc_port_mac_stats(np, 1, mac_stats);
break;
case ETHTOOL_MAC_STATS_SRC_AGGREGATE:
ndev = dsa_to_port(ds, port)->user;
ethtool_aggregate_mac_stats(ndev, mac_stats);
break;
}
}
int netc_port_get_sset_count(struct dsa_switch *ds, int port, int sset)
{
struct netc_port *np = NETC_PORT(ds, port);
int size;
if (sset != ETH_SS_STATS)
return -EOPNOTSUPP;
size = ARRAY_SIZE(netc_port_counters) +
ARRAY_SIZE(netc_emac_counters);
if (np->caps.pmac)
size += ARRAY_SIZE(netc_pmac_counters);
return size;
}
void netc_port_get_strings(struct dsa_switch *ds, int port,
u32 sset, u8 *data)
{
struct netc_port *np = NETC_PORT(ds, port);
int i;
if (sset != ETH_SS_STATS)
return;
for (i = 0; i < ARRAY_SIZE(netc_port_counters); i++)
ethtool_cpy(&data, netc_port_counters[i].name);
for (i = 0; i < ARRAY_SIZE(netc_emac_counters); i++)
ethtool_cpy(&data, netc_emac_counters[i].name);
if (!np->caps.pmac)
return;
for (i = 0; i < ARRAY_SIZE(netc_pmac_counters); i++)
ethtool_cpy(&data, netc_pmac_counters[i].name);
}
void netc_port_get_ethtool_stats(struct dsa_switch *ds, int port, u64 *data)
{
struct netc_port *np = NETC_PORT(ds, port);
int i;
for (i = 0; i < ARRAY_SIZE(netc_port_counters); i++)
*data++ = netc_port_rd(np, netc_port_counters[i].reg);
for (i = 0; i < ARRAY_SIZE(netc_emac_counters); i++)
*data++ = netc_port_rd64(np, netc_emac_counters[i].reg);
if (!np->caps.pmac)
return;
for (i = 0; i < ARRAY_SIZE(netc_pmac_counters); i++)
*data++ = netc_port_rd64(np, netc_pmac_counters[i].reg);
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,87 @@
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/*
* NXP NETC switch driver
* Copyright 2025-2026 NXP
*/
#include "netc_switch.h"
struct netc_switch_platform {
u16 revision;
const struct netc_switch_info *info;
};
static void imx94_switch_phylink_get_caps(int port,
struct phylink_config *config)
{
config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | MAC_1000FD;
switch (port) {
case 0 ... 1:
__set_bit(PHY_INTERFACE_MODE_SGMII,
config->supported_interfaces);
__set_bit(PHY_INTERFACE_MODE_2500BASEX,
config->supported_interfaces);
config->mac_capabilities |= MAC_2500FD;
fallthrough;
case 2:
config->mac_capabilities |= MAC_10 | MAC_100;
__set_bit(PHY_INTERFACE_MODE_MII,
config->supported_interfaces);
__set_bit(PHY_INTERFACE_MODE_RMII,
config->supported_interfaces);
/* Port 0 and 1 do not support REVMII */
if (port == 2)
__set_bit(PHY_INTERFACE_MODE_REVMII,
config->supported_interfaces);
phy_interface_set_rgmii(config->supported_interfaces);
break;
case 3: /* CPU port */
__set_bit(PHY_INTERFACE_MODE_INTERNAL,
config->supported_interfaces);
config->mac_capabilities |= MAC_10FD | MAC_100FD |
MAC_2500FD;
break;
default:
break;
}
}
static const struct netc_switch_info imx94_info = {
.num_ports = 4,
.phylink_get_caps = imx94_switch_phylink_get_caps,
};
static const struct netc_switch_platform netc_platforms[] = {
{ .revision = NETC_SWITCH_REV_4_3, .info = &imx94_info, },
{ }
};
static const struct netc_switch_info *
netc_switch_get_info(struct netc_switch *priv)
{
int i;
/* Matching based on IP revision */
for (i = 0; i < ARRAY_SIZE(netc_platforms); i++) {
if (priv->revision == netc_platforms[i].revision)
return netc_platforms[i].info;
}
return NULL;
}
int netc_switch_platform_probe(struct netc_switch *priv)
{
const struct netc_switch_info *info = netc_switch_get_info(priv);
if (!info) {
dev_err(priv->dev, "Cannot find switch platform info\n");
return -EINVAL;
}
priv->info = info;
return 0;
}
@@ -0,0 +1,206 @@
/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
/*
* Copyright 2025-2026 NXP
*/
#ifndef _NETC_SWITCH_H
#define _NETC_SWITCH_H
#include <linux/dsa/tag_netc.h>
#include <linux/fsl/netc_global.h>
#include <linux/fsl/ntmp.h>
#include <linux/of_device.h>
#include <linux/of_net.h>
#include <linux/pci.h>
#include "netc_switch_hw.h"
#define NETC_REGS_BAR 0
#define NETC_REGS_SIZE 0x80000
#define NETC_MSIX_TBL_BAR 2
#define NETC_REGS_PORT_BASE 0x4000
/* register block size per port */
#define NETC_REGS_PORT_SIZE 0x4000
#define PORT_IOBASE(p) (NETC_REGS_PORT_SIZE * (p))
#define NETC_REGS_GLOBAL_BASE 0x70000
#define NETC_SWITCH_REV_4_3 0x0403
#define NETC_TC_NUM 8
#define NETC_CBDR_NUM 2
#define NETC_IPV_NUM 8
#define NETC_MAX_FRAME_LEN 9600
#define NETC_STANDALONE_PVID 0
#define NETC_VLAN_UNAWARE_PVID(br_id) (4096 - (br_id))
/* Threshold format: MANT (bits 11:4) * 2^EXP (bits 3:0)
* Unit: Memory words (average of 20 bytes each)
* NETC_BP_THRESH = 0x8c3, MANT = 0x8c, EXP = 3. Threshold: 1120 words
* NETC_FC_THRESH_ON = 0x733, MANT = 0x73, EXP = 3. Threshold: 920 words
* NETC_FC_THRESH_OFF = 0x263, MANT = 0x26, EXP = 3. Threshold: 304 words
*/
#define NETC_BP_THRESH 0x8c3
#define NETC_FC_THRESH_ON 0x733
#define NETC_FC_THRESH_OFF 0x263
/* PAUSE quanta: 0xFFFF = 65535 quanta (each quanta = 512 bit times) */
#define NETC_PAUSE_QUANTA 0xFFFF
/* PAUSE refresh threshold: send refresh when timer reaches this value */
#define NETC_PAUSE_THRESH 0x7FFF
#define NETC_FDBT_AGEING_DELAY (3 * HZ)
#define NETC_FDBT_AGEING_THRESH 100
struct netc_switch;
struct netc_switch_info {
u32 num_ports;
void (*phylink_get_caps)(int port, struct phylink_config *config);
};
struct netc_port_caps {
u32 half_duplex:1; /* indicates whether the port support half-duplex */
u32 pmac:1; /* indicates whether the port has preemption MAC */
u32 pseudo_link:1;
};
enum netc_host_reason {
/* Software defined host reasons */
NETC_HR_HOST_FLOOD = 8,
};
struct netc_port {
void __iomem *iobase;
struct netc_switch *switch_priv;
struct netc_port_caps caps;
struct dsa_port *dp;
struct clk *ref_clk; /* RGMII/RMII reference clock */
struct mii_bus *emdio;
int ett_offset;
u16 enable:1;
u16 uc:1;
u16 mc:1;
u16 pvid;
struct ipft_entry_data *host_flood;
};
struct netc_switch_regs {
void __iomem *base;
void __iomem *port;
void __iomem *global;
};
struct netc_fdb_entry {
u32 entry_id;
struct fdbt_cfge_data cfge;
struct fdbt_keye_data keye;
struct hlist_node node;
};
struct netc_vlan_entry {
u16 vid;
u32 ect_gid;
u32 untagged_port_bitmap;
struct vft_cfge_data cfge;
struct hlist_node node;
};
struct netc_port_stat {
int reg;
char name[ETH_GSTRING_LEN] __nonstring;
};
struct netc_switch {
struct pci_dev *pdev;
struct device *dev;
struct dsa_switch *ds;
u16 revision;
const struct netc_switch_info *info;
struct netc_switch_regs regs;
struct netc_port **ports;
u32 port_bitmap; /* bitmap of available ports */
struct ntmp_user ntmp;
struct hlist_head fdb_list;
struct mutex fdbt_lock; /* FDB table lock */
struct delayed_work fdbt_ageing_work;
/* (fdbt_ageing_delay * NETC_FDBT_AGEING_THRESH) is ageing time */
unsigned long fdbt_ageing_delay;
atomic_t br_cnt;
struct hlist_head vlan_list;
struct mutex vft_lock; /* VLAN filter table lock */
/* Switch hardware capabilities */
u32 htmcapr_num_words;
u32 num_bp;
struct bpt_cfge_data *bpt_list;
};
#define NETC_PRIV(ds) ((struct netc_switch *)((ds)->priv))
#define NETC_PORT(ds, port_id) (NETC_PRIV(ds)->ports[(port_id)])
/* Write/Read Switch base registers */
#define netc_base_rd(r, o) netc_read((r)->base + (o))
#define netc_base_wr(r, o, v) netc_write((r)->base + (o), v)
/* Write/Read registers of Switch Port (including pseudo MAC port) */
#define netc_port_rd(p, o) netc_read((p)->iobase + (o))
#define netc_port_rd64(p, o) netc_read64((p)->iobase + (o))
#define netc_port_wr(p, o, v) netc_write((p)->iobase + (o), v)
/* Write/Read Switch global registers */
#define netc_glb_rd(r, o) netc_read((r)->global + (o))
#define netc_glb_wr(r, o, v) netc_write((r)->global + (o), v)
static inline bool is_netc_pseudo_port(struct netc_port *np)
{
return np->caps.pseudo_link;
}
static inline void netc_add_fdb_entry(struct netc_switch *priv,
struct netc_fdb_entry *entry)
{
hlist_add_head(&entry->node, &priv->fdb_list);
}
static inline void netc_del_fdb_entry(struct netc_fdb_entry *entry)
{
hlist_del(&entry->node);
kfree(entry);
}
static inline void netc_add_vlan_entry(struct netc_switch *priv,
struct netc_vlan_entry *entry)
{
hlist_add_head(&entry->node, &priv->vlan_list);
}
static inline void netc_del_vlan_entry(struct netc_vlan_entry *entry)
{
hlist_del(&entry->node);
kfree(entry);
}
int netc_switch_platform_probe(struct netc_switch *priv);
/* ethtool APIs */
void netc_port_get_pause_stats(struct dsa_switch *ds, int port,
struct ethtool_pause_stats *pause_stats);
void netc_port_get_rmon_stats(struct dsa_switch *ds, int port,
struct ethtool_rmon_stats *rmon_stats,
const struct ethtool_rmon_hist_range **ranges);
void netc_port_get_eth_ctrl_stats(struct dsa_switch *ds, int port,
struct ethtool_eth_ctrl_stats *ctrl_stats);
void netc_port_get_eth_mac_stats(struct dsa_switch *ds, int port,
struct ethtool_eth_mac_stats *mac_stats);
int netc_port_get_sset_count(struct dsa_switch *ds, int port, int sset);
void netc_port_get_strings(struct dsa_switch *ds, int port,
u32 sset, u8 *data);
void netc_port_get_ethtool_stats(struct dsa_switch *ds, int port, u64 *data);
#endif
@@ -0,0 +1,372 @@
/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
/*
* Copyright 2025-2026 NXP
*/
#ifndef _NETC_SWITCH_HW_H
#define _NETC_SWITCH_HW_H
#include <linux/bitops.h>
#define NETC_SWITCH_VENDOR_ID 0x1131
#define NETC_SWITCH_DEVICE_ID 0xeef2
/* Definition of Switch base registers */
#define NETC_BPCAPR 0x0008
#define BPCAPR_NUM_BP GENMASK(7, 0)
#define NETC_PBPMCR0 0x0400
#define NETC_PBPMCR1 0x0404
#define NETC_CBDRMR(a) (0x0800 + (a) * 0x30)
#define NETC_CBDRBAR0(a) (0x0810 + (a) * 0x30)
#define NETC_CBDRBAR1(a) (0x0814 + (a) * 0x30)
#define NETC_CBDRPIR(a) (0x0818 + (a) * 0x30)
#define NETC_CBDRCIR(a) (0x081c + (a) * 0x30)
#define NETC_CBDRLENR(a) (0x0820 + (a) * 0x30)
#define NETC_SWCR 0x1018
#define SWCR_SWID GENMASK(2, 0)
#define NETC_DOSL2CR 0x1220
#define DOSL2CR_SAMEADDR BIT(0)
#define DOSL2CR_MSAMCC BIT(1)
#define NETC_DOSL3CR 0x1224
#define DOSL3CR_SAMEADDR BIT(0)
#define DOSL3CR_IPSAMCC BIT(1)
#define NETC_ETTCAPR 0x18c4
#define NETC_ECTCAPR 0x18ec
/* Index table NUM_ENTRIES mask */
#define NETC_NUM_ENTRIES GENMASK(15, 0)
#define NETC_GET_NUM_ENTRIES(v) FIELD_GET(NETC_NUM_ENTRIES, (v))
/* Hash table memory capability register, the memory is shared by
* the following tables:
*
* - Ingress Stream Identification table
* - Ingress Stream Filter table
* - VLAN Filter table
* - FDB table
* - L2 IPv4 Multicast Filter table
*
* Each hash table entry is one word in size.
*/
#define NETC_HTMCAPR 0x1900
#define HTMCAPR_NUM_WORDS GENMASK(15, 0)
#define NETC_VFHTDECR1 0x2014
#define NETC_VFHTDECR2 0x2018
#define VFHTDECR2_ET_PORT(a) BIT((a))
#define VFHTDECR2_MLO GENMASK(26, 24)
#define VFHTDECR2_MFO GENMASK(28, 27)
/* Definition of Switch port registers */
#define NETC_PCAPR 0x0000
#define PCAPR_LINK_TYPE BIT(4)
#define PCAPR_NUM_TC GENMASK(15, 12)
#define PCAPR_NUM_Q GENMASK(19, 16)
#define PCAPR_NUM_CG GENMASK(27, 24)
#define PCAPR_TGS BIT(28)
#define PCAPR_CBS BIT(29)
#define NETC_PMCAPR 0x0004
#define PMCAPR_HD BIT(8)
#define PMCAPR_FP GENMASK(10, 9)
#define FP_SUPPORT 2
#define NETC_PCR 0x0010
#define PCR_HDR_FMT BIT(0)
#define PCR_NS_TAG_PORT BIT(3)
#define PCR_L2DOSE BIT(4)
#define PCR_L3DOSE BIT(5)
#define PCR_TIMER_CS BIT(8)
#define PCR_PSPEED GENMASK(29, 16)
#define PSPEED_SET_VAL(s) FIELD_PREP(PCR_PSPEED, ((s) / 10 - 1))
#define NETC_PQOSMR 0x0054
#define PQOSMR_VS BIT(0)
#define PQOSMR_VE BIT(1)
#define PQOSMR_DDR GENMASK(3, 2)
#define PQOSMR_DIPV GENMASK(6, 4)
#define PQOSMR_VQMP GENMASK(19, 16)
#define PQOSMR_QVMP GENMASK(23, 20)
#define NETC_PIPFCR 0x0084
#define PIPFCR_EN BIT(0)
#define NETC_POR 0x100
#define POR_TXDIS BIT(0)
#define POR_RXDIS BIT(1)
#define NETC_PSR 0x104
#define PSR_TX_BUSY BIT(0)
#define PSR_RX_BUSY BIT(1)
#define NETC_PTGSLACR 0x130
#define NETC_PRXDCR 0x1c0
#define NETC_PRXDCRRR 0x1c4
#define NETC_PRXDCRR0 0x1c8
#define NETC_PRXDCRR1 0x1cc
#define NETC_PTXDCR 0x1e0
#define NETC_PTCTMSDUR(a) (0x208 + (a) * 0x20)
#define PTCTMSDUR_MAXSDU GENMASK(15, 0)
#define PTCTMSDUR_SDU_TYPE GENMASK(17, 16)
#define SDU_TYPE_PPDU 0
#define SDU_TYPE_MPDU 1
#define SDU_TYPE_MSDU 2
#define NETC_PSDFTCR 0x4c4
#define NETC_PSDFDDCR 0x4c8
#define NETC_BPCR 0x500
#define BPCR_DYN_LIMIT GENMASK(15, 0)
#define BPCR_MLO GENMASK(22, 20)
#define BPCR_UUCASTE BIT(24)
#define BPCR_UMCASTE BIT(25)
#define BPCR_MCASTE BIT(26)
#define BPCR_BCASTE BIT(27)
#define BPCR_STAMVD BIT(28)
#define BPCR_SRCPRND BIT(29)
/* MAC learning options, see BPCR[MLO], VFHTDECR2[MLO] and
* VLAN Filter Table CFGE_DATA[MLO]
*/
enum netc_mlo {
MLO_NOT_OVERRIDE = 0,
MLO_DISABLE,
MLO_HW,
MLO_SW_SEC,
MLO_SW_UNSEC,
MLO_DISABLE_SMAC,
};
/* MAC forwarding options, see VFHTDECR2[MFO] and VLAN
* Filter Table CFGE_DATA[MFO]
*/
enum netc_mfo {
MFO_NO_FDB_LOOKUP = 1,
MFO_NO_MATCH_FLOOD,
MFO_NO_MATCH_DISCARD,
};
#define NETC_BPDVR 0x510
#define BPDVR_VID GENMASK(11, 0)
#define BPDVR_DEI BIT(12)
#define BPDVR_PCP GENMASK(15, 13)
#define BPDVR_TPID BIT(16)
#define BPDVR_RXTAGA GENMASK(23, 20)
#define BPDVR_RXVAM BIT(24)
#define BPDVR_TXTAGA GENMASK(26, 25)
#define NETC_BPSTGSR 0x520
enum netc_stg_stage {
NETC_STG_STATE_DISABLED = 0,
NETC_STG_STATE_LEARNING,
NETC_STG_STATE_FORWARDING,
};
#define NETC_BPDCR 0x580
/* Definition of Switch ethernet MAC port registers */
#define NETC_PMAC_OFFSET 0x400
#define NETC_PM_CMD_CFG(a) (0x1008 + (a) * 0x400)
#define PM_CMD_CFG_TX_EN BIT(0)
#define PM_CMD_CFG_RX_EN BIT(1)
#define PM_CMD_CFG_PAUSE_IGN BIT(8)
#define NETC_PM_MAXFRM(a) (0x1014 + (a) * 0x400)
#define PM_MAXFRAM GENMASK(15, 0)
#define NETC_PM_IEVENT(a) (0x1040 + (a) * 0x400)
#define PM_IEVENT_TX_EMPTY BIT(5)
#define PM_IEVENT_RX_EMPTY BIT(6)
#define NETC_PM_PAUSE_QUANTA(a) (0x1054 + (a) * 0x400)
#define NETC_PM_PAUSE_THRESH(a) (0x1064 + (a) * 0x400)
#define NETC_PM_IF_MODE(a) (0x1300 + (a) * 0x400)
#define PM_IF_MODE_IFMODE GENMASK(2, 0)
#define IFMODE_MII 1
#define IFMODE_RMII 3
#define IFMODE_RGMII 4
#define IFMODE_SGMII 5
#define PM_IF_MODE_REVMII BIT(3)
#define PM_IF_MODE_M10 BIT(4)
#define PM_IF_MODE_HD BIT(6)
#define PM_IF_MODE_SSP GENMASK(14, 13)
#define SSP_100M 0
#define SSP_10M 1
#define SSP_1G 2
/* Port MAC 0/1 Receive Ethernet Octets Counter */
#define NETC_PM_REOCT(a) (0x1100 + (a) * 0x400)
/* Port MAC 0/1 Receive Octets Counter */
#define NETC_PM_ROCT(a) (0x1108 + (a) * 0x400)
/* Port MAC 0/1 Receive Alignment Error Counter Register */
#define NETC_PM_RALN(a) (0x1110 + (a) * 0x400)
/* Port MAC 0/1 Receive Valid Pause Frame Counter */
#define NETC_PM_RXPF(a) (0x1118 + (a) * 0x400)
/* Port MAC 0/1 Receive Frame Counter */
#define NETC_PM_RFRM(a) (0x1120 + (a) * 0x400)
/* Port MAC 0/1 Receive Frame Check Sequence Error Counter */
#define NETC_PM_RFCS(a) (0x1128 + (a) * 0x400)
/* Port MAC 0/1 Receive VLAN Frame Counter */
#define NETC_PM_RVLAN(a) (0x1130 + (a) * 0x400)
/* Port MAC 0/1 Receive Frame Error Counter */
#define NETC_PM_RERR(a) (0x1138 + (a) * 0x400)
/* Port MAC 0/1 Receive Unicast Frame Counter */
#define NETC_PM_RUCA(a) (0x1140 + (a) * 0x400)
/* Port MAC 0/1 Receive Multicast Frame Counter */
#define NETC_PM_RMCA(a) (0x1148 + (a) * 0x400)
/* Port MAC 0/1 Receive Broadcast Frame Counter */
#define NETC_PM_RBCA(a) (0x1150 + (a) * 0x400)
/* Port MAC 0/1 Receive Dropped Packets Counter */
#define NETC_PM_RDRP(a) (0x1158 + (a) * 0x400)
/* Port MAC 0/1 Receive Packets Counter */
#define NETC_PM_RPKT(a) (0x1160 + (a) * 0x400)
/* Port MAC 0/1 Receive Undersized Packet Counter */
#define NETC_PM_RUND(a) (0x1168 + (a) * 0x400)
/* Port MAC 0/1 Receive 64-Octet Packet Counter */
#define NETC_PM_R64(a) (0x1170 + (a) * 0x400)
/* Port MAC 0/1 Receive 65 to 127-Octet Packet Counter */
#define NETC_PM_R127(a) (0x1178 + (a) * 0x400)
/* Port MAC 0/1 Receive 128 to 255-Octet Packet Counter */
#define NETC_PM_R255(a) (0x1180 + (a) * 0x400)
/* Port MAC 0/1 Receive 256 to 511-Octet Packet Counter */
#define NETC_PM_R511(a) (0x1188 + (a) * 0x400)
/* Port MAC 0/1 Receive 512 to 1023-Octet Packet Counter */
#define NETC_PM_R1023(a) (0x1190 + (a) * 0x400)
/* Port MAC 0/1 Receive 1024 to 1522-Octet Packet Counter */
#define NETC_PM_R1522(a) (0x1198 + (a) * 0x400)
/* Port MAC 0/1 Receive 1523 to Max-Octet Packet Counter */
#define NETC_PM_R1523X(a) (0x11a0 + (a) * 0x400)
/* Port MAC 0/1 Receive Oversized Packet Counter */
#define NETC_PM_ROVR(a) (0x11a8 + (a) * 0x400)
/* Port MAC 0/1 Receive Jabber Packet Counter */
#define NETC_PM_RJBR(a) (0x11b0 + (a) * 0x400)
/* Port MAC 0/1 Receive Fragment Packet Counter */
#define NETC_PM_RFRG(a) (0x11b8 + (a) * 0x400)
/* Port MAC 0/1 Receive Control Packet Counter */
#define NETC_PM_RCNP(a) (0x11c0 + (a) * 0x400)
/* Port MAC 0/1 Receive Dropped Not Truncated Packets Counter */
#define NETC_PM_RDRNTP(a) (0x11c8 + (a) * 0x400)
/* Port MAC 0/1 Transmit Ethernet Octets Counter */
#define NETC_PM_TEOCT(a) (0x1200 + (a) * 0x400)
/* Port MAC 0/1 Transmit Octets Counter */
#define NETC_PM_TOCT(a) (0x1208 + (a) * 0x400)
/* Port MAC 0/1 Transmit Excessive Deferral Packet Counter */
#define NETC_PM_TEDFR(a) (0x1210 + (a) * 0x400)
/* Port MAC 0/1 Transmit Valid Pause Frame Counter */
#define NETC_PM_TXPF(a) (0x1218 + (a) * 0x400)
/* Port MAC 0/1 Transmit Frame Counter */
#define NETC_PM_TFRM(a) (0x1220 + (a) * 0x400)
/* Port MAC 0/1 Transmit Frame Check Sequence Error Counter */
#define NETC_PM_TFCS(a) (0x1228 + (a) * 0x400)
/* Port MAC 0/1 Transmit VLAN Frame Counter */
#define NETC_PM_TVLAN(a) (0x1230 + (a) * 0x400)
/* Port MAC 0/1 Transmit Frame Error Counter */
#define NETC_PM_TERR(a) (0x1238 + (a) * 0x400)
/* Port MAC 0/1 Transmit Unicast Frame Counter */
#define NETC_PM_TUCA(a) (0x1240 + (a) * 0x400)
/* Port MAC 0/1 Transmit Multicast Frame Counter */
#define NETC_PM_TMCA(a) (0x1248 + (a) * 0x400)
/* Port MAC 0/1 Transmit Broadcast Frame Counter */
#define NETC_PM_TBCA(a) (0x1250 + (a) * 0x400)
/* Port MAC 0/1 Transmit Packets Counter */
#define NETC_PM_TPKT(a) (0x1260 + (a) * 0x400)
/* Port MAC 0/1 Transmit Undersized Packet Counter */
#define NETC_PM_TUND(a) (0x1268 + (a) * 0x400)
/* Port MAC 0/1 Transmit 64-Octet Packet Counter */
#define NETC_PM_T64(a) (0x1270 + (a) * 0x400)
/* Port MAC 0/1 Transmit 65 to 127-Octet Packet Counter */
#define NETC_PM_T127(a) (0x1278 + (a) * 0x400)
/* Port MAC 0/1 Transmit 128 to 255-Octet Packet Counter */
#define NETC_PM_T255(a) (0x1280 + (a) * 0x400)
/* Port MAC 0/1 Transmit 256 to 511-Octet Packet Counter */
#define NETC_PM_T511(a) (0x1288 + (a) * 0x400)
/* Port MAC 0/1 Transmit 512 to 1023-Octet Packet Counter */
#define NETC_PM_T1023(a) (0x1290 + (a) * 0x400)
/* Port MAC 0/1 Transmit 1024 to 1522-Octet Packet Counter */
#define NETC_PM_T1522(a) (0x1298 + (a) * 0x400)
/* Port MAC 0/1 Transmit 1523 to TX_MTU-Octet Packet Counter */
#define NETC_PM_T1523X(a) (0x12a0 + (a) * 0x400)
/* Port MAC 0/1 Transmit Control Packet Counter */
#define NETC_PM_TCNP(a) (0x12c0 + (a) * 0x400)
/* Port MAC 0/1 Transmit Deferred Packet Counter */
#define NETC_PM_TDFR(a) (0x12d0 + (a) * 0x400)
/* Port MAC 0/1 Transmit Multiple Collisions Counter */
#define NETC_PM_TMCOL(a) (0x12d8 + (a) * 0x400)
/* Port MAC 0/1 Transmit Single Collision */
#define NETC_PM_TSCOL(a) (0x12e0 + (a) * 0x400)
/* Port MAC 0/1 Transmit Late Collision Counter */
#define NETC_PM_TLCOL(a) (0x12e8 + (a) * 0x400)
/* Port MAC 0/1 Transmit Excessive Collisions Counter */
#define NETC_PM_TECOL(a) (0x12f0 + (a) * 0x400)
/* Port MAC 0/1 Transmit Invalid Octets Counter */
#define NETC_PM_TIOCT(a) (0x12f8 + (a) * 0x400)
#define NETC_PEMDIOCR 0x1c00
#define NETC_EMDIO_BASE NETC_PEMDIOCR
/* Definition of global registers (read only) */
#define NETC_IPBRR0 0x0bf8
#define IPBRR0_IP_REV GENMASK(15, 0)
#endif