Something went wrong. Try again.
Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) *//* Copyright 2025-2026 NXP */#ifndef __NETC_NTMP_H#define __NETC_NTMP_H
#include <linux/bitmap.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; u8 ett_ver; u8 ect_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;
/* NTMP table bitmaps for resource management */ u32 ett_bitmap_size; u32 ect_bitmap_size; unsigned long *ett_gid_bitmap; /* only valid for switch */ unsigned long *ect_gid_bitmap; /* only valid for switch */};
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 ett_cfge_data { __le16 efm_cfg;#define ETT_EFM_MODE GENMASK(1, 0)#define ETT_ESQA GENMASK(5, 4)#define ETT_ECA GENMASK(8, 6)#define ETT_ECA_INC 1#define ETT_EFM_LEN_CHANGE GENMASK(15, 9)#define ETT_FRM_LEN_DEL_VLAN 0x7c#define ETT_FRM_LEN_DEL_RTAG 0x7a#define ETT_FRM_LEN_DEL_VLAN_RTAG 0x76 __le16 efm_data_len;#define ETT_EFM_DATA_LEN GENMASK(10, 0) __le32 efm_eid; __le32 ec_eid; __le32 esqa_tgt_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;};
union ntmp_fmt_eid { __le32 index;#define FMTEID_INDEX GENMASK(12, 0) __le32 vuda_sqta;#define FMTEID_VUDA GENMASK(1, 0)#define FMTEID_VUDA_DEL_OTAG 2#define FMTEID_SQTA GENMASK(4, 2)#define FMTEID_SQTA_DEL 2#define FMTEID_VUDA_SQTA BIT(13) __le32 vara_vid;#define FMTEID_VID GENMASK(11, 0)#define FMTEID_VARA GENMASK(13, 12)#define FMTEID_VARA_VID BIT(14)};
#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);u32 ntmp_lookup_free_eid(unsigned long *bitmap, u32 size);void ntmp_clear_eid_bitmap(unsigned long *bitmap, u32 entry_id);
/* 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_fdbt_update_activity_element(struct ntmp_user *user);int ntmp_fdbt_delete_ageing_entries(struct ntmp_user *user, u8 act_cnt);int ntmp_fdbt_delete_port_dynamic_entries(struct ntmp_user *user, int port);int ntmp_vft_add_entry(struct ntmp_user *user, u16 vid, const struct vft_cfge_data *cfge);int ntmp_vft_update_entry(struct ntmp_user *user, u16 vid, const struct vft_cfge_data *cfge);int ntmp_vft_delete_entry(struct ntmp_user *user, u16 vid);int ntmp_ett_add_entry(struct ntmp_user *user, u32 entry_id, const struct ett_cfge_data *cfge);int ntmp_ett_update_entry(struct ntmp_user *user, u32 entry_id, const struct ett_cfge_data *cfge);int ntmp_ett_delete_entry(struct ntmp_user *user, u32 entry_id);int ntmp_ect_update_entry(struct ntmp_user *user, u32 entry_id);int ntmp_bpt_update_entry(struct ntmp_user *user, u32 entry_id, const struct bpt_cfge_data *cfge);#elsestatic 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