Files
linux-stable-mirror/include/linux/fsl/ntmp.h
T
Wei FangandPaolo Abeni 123db6a275 net: enetc: add support for "Add" and "Delete" operations to IPFT
The ingress port filter table (IPFT )contains a set of filters each
capable of classifying incoming traffic using a mix of L2, L3, and L4
parsed and arbitrary field data. As a result of a filter match, several
actions can be specified such as on whether to deny or allow a frame,
overriding internal QoS attributes associated with the frame and setting
parameters for the subsequent frame processing functions, such as stream
identification, policing, ingress mirroring. Each entry corresponds to a
filter. The ingress port filter entries are added using a precedence
value. If a frame matches multiple entries, the entry with the higher
precedence is used. Currently, this patch only adds "Add" and "Delete"
operations to the ingress port filter table. These two interfaces will
be used by both ENETC driver and NETC switch driver.

Signed-off-by: Wei Fang <wei.fang@nxp.com>
Link: https://patch.msgid.link/20260518082506.1318236-8-wei.fang@nxp.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
2026-05-21 13:04:42 +02:00

313 lines
7.1 KiB
C

/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
/* Copyright 2025-2026 NXP */
#ifndef __NETC_NTMP_H
#define __NETC_NTMP_H
#include <linux/bitops.h>
#include <linux/if_ether.h>
#define NTMP_NULL_ENTRY_ID 0xffffffffU
#define IPFT_MAX_PLD_LEN 24
struct maft_keye_data {
u8 mac_addr[ETH_ALEN];
__le16 resv;
};
struct maft_cfge_data {
__le16 si_bitmap;
__le16 resv;
};
struct netc_cbdr_regs {
void __iomem *pir;
void __iomem *cir;
void __iomem *mr;
void __iomem *bar0;
void __iomem *bar1;
void __iomem *lenr;
};
struct netc_tbl_vers {
u8 maft_ver;
u8 rsst_ver;
u8 fdbt_ver;
u8 vft_ver;
u8 bpt_ver;
u8 ipft_ver;
};
struct netc_swcbd {
void *buf;
dma_addr_t dma;
size_t size;
};
struct netc_cbdr {
struct device *dev;
struct netc_cbdr_regs regs;
int bd_num;
int next_to_use;
int next_to_clean;
int dma_size;
void *addr_base;
void *addr_base_align;
dma_addr_t dma_base;
dma_addr_t dma_base_align;
struct netc_swcbd *swcbd;
/* Serialize the order of command BD ring */
struct mutex ring_lock;
};
struct ntmp_user {
int cbdr_num; /* number of control BD ring */
struct device *dev;
struct netc_cbdr *ring;
struct netc_tbl_vers tbl;
};
struct maft_entry_data {
struct maft_keye_data keye;
struct maft_cfge_data cfge;
};
struct ipft_pld_byte {
u8 data;
u8 mask;
};
struct ipft_keye_data {
__le16 precedence;
__le16 resv0[3];
__le16 frm_attr_flags;
#define IPFT_FAF_OVLAN BIT(2)
#define IPFT_FAF_IVLAN BIT(3)
#define IPFT_FAF_IP_HDR BIT(7)
#define IPFT_FAF_IP_VER6 BIT(8)
#define IPFT_FAF_L4_CODE GENMASK(11, 10)
#define IPFT_FAF_TCP_HDR 1
#define IPFT_FAF_UDP_HDR 2
#define IPFT_FAF_SCTP_HDR 3
#define IPFT_FAF_WOL_MAGIC BIT(12)
__le16 frm_attr_flags_mask;
__le16 dscp;
#define IPFT_DSCP GENMASK(5, 0)
#define IPFT_DSCP_MASK GENMASK(11, 6)
#define IPFT_DSCP_MASK_ALL 0x3f
__le16 src_port; /* This field is reserved for ENETC */
#define IPFT_SRC_PORT GENMASK(4, 0)
#define IPFT_SRC_PORT_MASK GENMASK(9, 5)
#define IPFT_SRC_PORT_MASK_ALL 0x1f
__be16 outer_vlan_tci;
__be16 outer_vlan_tci_mask;
u8 dmac[ETH_ALEN];
u8 dmac_mask[ETH_ALEN];
u8 smac[ETH_ALEN];
u8 smac_mask[ETH_ALEN];
__be16 inner_vlan_tci;
__be16 inner_vlan_tci_mask;
__be16 ethertype;
__be16 ethertype_mask;
u8 ip_protocol;
u8 ip_protocol_mask;
__le16 resv1[7];
__be32 ip_src[4];
__le32 resv2[2];
__be32 ip_src_mask[4];
__be16 l4_src_port;
__be16 l4_src_port_mask;
__le32 resv3;
__be32 ip_dst[4];
__le32 resv4[2];
__be32 ip_dst_mask[4];
__be16 l4_dst_port;
__be16 l4_dst_port_mask;
__le32 resv5;
struct ipft_pld_byte byte[IPFT_MAX_PLD_LEN];
};
struct ipft_cfge_data {
__le32 cfg;
#define IPFT_IPV GENMASK(3, 0)
#define IPFT_OIPV BIT(4)
#define IPFT_DR GENMASK(6, 5)
#define IPFT_ODR BIT(7)
#define IPFT_FLTFA GENMASK(10, 8)
#define IPFT_FLTFA_DISCARD 0
#define IPFT_FLTFA_PERMIT 1
/* Redirect is only for switch */
#define IPFT_FLTFA_REDIRECT 2
#define IPFT_IMIRE BIT(11)
#define IPFT_WOLTE BIT(12)
#define IPFT_FLTA GENMASK(14, 13)
#define IPFT_FLTA_RP 1
#define IPFT_FLTA_IS 2
#define IPFT_FLTA_SI_BITMAP 3
#define IPFT_RPR GENMASK(16, 15)
#define IPFT_CTD BIT(17)
#define IPFT_HR GENMASK(21, 18)
#define IPFT_TIMECAPE BIT(22)
#define IPFT_RRT BIT(23)
#define IPFT_BL2F BIT(24)
#define IPFT_EVMEID GENMASK(31, 28)
__le32 flta_tgt;
};
struct ipft_entry_data {
u32 entry_id; /* hardware assigns entry ID */
struct ipft_keye_data keye;
struct ipft_cfge_data cfge;
};
struct fdbt_keye_data {
u8 mac_addr[ETH_ALEN]; /* big-endian */
__le16 resv0;
__le16 fid;
#define FDBT_FID GENMASK(11, 0)
__le16 resv1;
};
struct fdbt_cfge_data {
__le32 port_bitmap;
#define FDBT_PORT_BITMAP GENMASK(23, 0)
__le32 cfg;
#define FDBT_OETEID GENMASK(1, 0)
#define FDBT_EPORT GENMASK(6, 2)
#define FDBT_IMIRE BIT(7)
#define FDBT_CTD GENMASK(10, 9)
#define FDBT_DYNAMIC BIT(11)
#define FDBT_TIMECAPE BIT(12)
__le32 et_eid;
};
struct fdbt_entry_data {
u32 entry_id;
struct fdbt_keye_data keye;
struct fdbt_cfge_data cfge;
u8 acte;
#define FDBT_ACT_CNT GENMASK(6, 0)
#define FDBT_ACT_FLAG BIT(7)
};
struct vft_cfge_data {
__le32 bitmap_stg;
#define VFT_PORT_MEMBERSHIP GENMASK(23, 0)
#define VFT_STG_ID_MASK GENMASK(27, 24)
#define VFT_STG_ID(g) FIELD_PREP(VFT_STG_ID_MASK, (g))
__le16 fid;
#define VFT_FID GENMASK(11, 0)
__le16 cfg;
#define VFT_MLO GENMASK(2, 0)
#define VFT_MFO GENMASK(4, 3)
#define VFT_IPMFE BIT(6)
#define VFT_IPMFLE BIT(7)
#define VFT_PGA BIT(8)
#define VFT_SFDA BIT(10)
#define VFT_OSFDA BIT(11)
#define VFT_FDBAFSS BIT(12)
__le32 eta_port_bitmap;
#define VFT_ETA_PORT_BITMAP GENMASK(23, 0)
__le32 et_eid;
};
struct bpt_bpse_data {
__le32 amount_used;
__le32 amount_used_hwm;
u8 bpd_fc_state;
#define BPT_FC_STATE BIT(0)
#define BPT_BPD BIT(1)
} __packed;
struct bpt_cfge_data {
u8 fccfg_sbpen;
#define BPT_FC_CFG GENMASK(2, 1)
#define BPT_FC_CFG_EN_BPFC 1
u8 pfc_vector;
__le16 max_thresh;
__le16 fc_on_thresh;
__le16 fc_off_thresh;
__le16 sbp_thresh;
__le16 resv;
__le32 sbp_eid;
__le32 fc_ports;
};
#if IS_ENABLED(CONFIG_NXP_NETC_LIB)
int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct device *dev,
const struct netc_cbdr_regs *regs);
void ntmp_free_cbdr(struct netc_cbdr *cbdr);
/* NTMP APIs */
int ntmp_maft_add_entry(struct ntmp_user *user, u32 entry_id,
struct maft_entry_data *maft);
int ntmp_maft_query_entry(struct ntmp_user *user, u32 entry_id,
struct maft_entry_data *maft);
int ntmp_maft_delete_entry(struct ntmp_user *user, u32 entry_id);
int ntmp_rsst_update_entry(struct ntmp_user *user, const u32 *table,
int count);
int ntmp_rsst_query_entry(struct ntmp_user *user,
u32 *table, int count);
int ntmp_ipft_add_entry(struct ntmp_user *user,
struct ipft_entry_data *entry);
int ntmp_ipft_delete_entry(struct ntmp_user *user, u32 entry_id);
int ntmp_fdbt_add_entry(struct ntmp_user *user, u32 *entry_id,
const struct fdbt_keye_data *keye,
const struct fdbt_cfge_data *cfge);
int ntmp_fdbt_update_entry(struct ntmp_user *user, u32 entry_id,
const struct fdbt_cfge_data *cfge);
int ntmp_fdbt_delete_entry(struct ntmp_user *user, u32 entry_id);
int ntmp_fdbt_search_port_entry(struct ntmp_user *user, int port,
u32 *resume_entry_id,
struct fdbt_entry_data *entry);
int ntmp_vft_add_entry(struct ntmp_user *user, u16 vid,
const struct vft_cfge_data *cfge);
int ntmp_bpt_update_entry(struct ntmp_user *user, u32 entry_id,
const struct bpt_cfge_data *cfge);
#else
static inline int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct device *dev,
const struct netc_cbdr_regs *regs)
{
return 0;
}
static inline void ntmp_free_cbdr(struct netc_cbdr *cbdr)
{
}
static inline int ntmp_maft_add_entry(struct ntmp_user *user, u32 entry_id,
struct maft_entry_data *maft)
{
return 0;
}
static inline int ntmp_maft_query_entry(struct ntmp_user *user, u32 entry_id,
struct maft_entry_data *maft)
{
return 0;
}
static inline int ntmp_maft_delete_entry(struct ntmp_user *user, u32 entry_id)
{
return 0;
}
static inline int ntmp_rsst_update_entry(struct ntmp_user *user,
const u32 *table, int count)
{
return 0;
}
static inline int ntmp_rsst_query_entry(struct ntmp_user *user,
u32 *table, int count)
{
return 0;
}
#endif
#endif