/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ /* Copyright 2025-2026 NXP */ #ifndef __NETC_NTMP_H #define __NETC_NTMP_H #include #include #include #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); #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