xref: /linux/include/linux/fsl/ntmp.h (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
1 /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
2 /* Copyright 2025-2026 NXP */
3 #ifndef __NETC_NTMP_H
4 #define __NETC_NTMP_H
5 
6 #include <linux/bitmap.h>
7 #include <linux/bitops.h>
8 #include <linux/if_ether.h>
9 
10 #define NTMP_NULL_ENTRY_ID		0xffffffffU
11 #define IPFT_MAX_PLD_LEN		24
12 
13 struct maft_keye_data {
14 	u8 mac_addr[ETH_ALEN];
15 	__le16 resv;
16 };
17 
18 struct maft_cfge_data {
19 	__le16 si_bitmap;
20 	__le16 resv;
21 };
22 
23 struct netc_cbdr_regs {
24 	void __iomem *pir;
25 	void __iomem *cir;
26 	void __iomem *mr;
27 
28 	void __iomem *bar0;
29 	void __iomem *bar1;
30 	void __iomem *lenr;
31 };
32 
33 struct netc_tbl_vers {
34 	u8 maft_ver;
35 	u8 rsst_ver;
36 	u8 fdbt_ver;
37 	u8 vft_ver;
38 	u8 bpt_ver;
39 	u8 ipft_ver;
40 	u8 ett_ver;
41 	u8 ect_ver;
42 };
43 
44 struct netc_swcbd {
45 	void *buf;
46 	dma_addr_t dma;
47 	size_t size;
48 };
49 
50 struct netc_cbdr {
51 	struct device *dev;
52 	struct netc_cbdr_regs regs;
53 
54 	int bd_num;
55 	int next_to_use;
56 	int next_to_clean;
57 
58 	int dma_size;
59 	void *addr_base;
60 	void *addr_base_align;
61 	dma_addr_t dma_base;
62 	dma_addr_t dma_base_align;
63 	struct netc_swcbd *swcbd;
64 
65 	/* Serialize the order of command BD ring */
66 	struct mutex ring_lock;
67 };
68 
69 struct ntmp_user {
70 	int cbdr_num;	/* number of control BD ring */
71 	struct device *dev;
72 	struct netc_cbdr *ring;
73 	struct netc_tbl_vers tbl;
74 
75 	/* NTMP table bitmaps for resource management */
76 	u32 ett_bitmap_size;
77 	u32 ect_bitmap_size;
78 	u16 maft_num_entries;
79 	unsigned long *ett_gid_bitmap; /* only valid for switch */
80 	unsigned long *ect_gid_bitmap; /* only valid for switch */
81 	unsigned long *maft_eid_bitmap; /* only valid for ENETC */
82 };
83 
84 struct maft_entry_data {
85 	struct maft_keye_data keye;
86 	struct maft_cfge_data cfge;
87 };
88 
89 struct ipft_pld_byte {
90 	u8 data;
91 	u8 mask;
92 };
93 
94 struct ipft_keye_data {
95 	__le16 precedence;
96 	__le16 resv0[3];
97 	__le16 frm_attr_flags;
98 #define IPFT_FAF_OVLAN		BIT(2)
99 #define IPFT_FAF_IVLAN		BIT(3)
100 #define IPFT_FAF_IP_HDR		BIT(7)
101 #define IPFT_FAF_IP_VER6	BIT(8)
102 #define IPFT_FAF_L4_CODE	GENMASK(11, 10)
103 #define  IPFT_FAF_TCP_HDR	1
104 #define  IPFT_FAF_UDP_HDR	2
105 #define  IPFT_FAF_SCTP_HDR	3
106 #define IPFT_FAF_WOL_MAGIC	BIT(12)
107 	__le16 frm_attr_flags_mask;
108 	__le16 dscp;
109 #define IPFT_DSCP		GENMASK(5, 0)
110 #define IPFT_DSCP_MASK		GENMASK(11, 6)
111 #define IPFT_DSCP_MASK_ALL	0x3f
112 	__le16 src_port; /* This field is reserved for ENETC */
113 #define IPFT_SRC_PORT		GENMASK(4, 0)
114 #define IPFT_SRC_PORT_MASK	GENMASK(9, 5)
115 #define IPFT_SRC_PORT_MASK_ALL	0x1f
116 	__be16 outer_vlan_tci;
117 	__be16 outer_vlan_tci_mask;
118 	u8 dmac[ETH_ALEN];
119 	u8 dmac_mask[ETH_ALEN];
120 	u8 smac[ETH_ALEN];
121 	u8 smac_mask[ETH_ALEN];
122 	__be16 inner_vlan_tci;
123 	__be16 inner_vlan_tci_mask;
124 	__be16 ethertype;
125 	__be16 ethertype_mask;
126 	u8 ip_protocol;
127 	u8 ip_protocol_mask;
128 	__le16 resv1[7];
129 	__be32 ip_src[4];
130 	__le32 resv2[2];
131 	__be32 ip_src_mask[4];
132 	__be16 l4_src_port;
133 	__be16 l4_src_port_mask;
134 	__le32 resv3;
135 	__be32 ip_dst[4];
136 	__le32 resv4[2];
137 	__be32 ip_dst_mask[4];
138 	__be16 l4_dst_port;
139 	__be16 l4_dst_port_mask;
140 	__le32 resv5;
141 	struct ipft_pld_byte byte[IPFT_MAX_PLD_LEN];
142 };
143 
144 struct ipft_cfge_data {
145 	__le32 cfg;
146 #define IPFT_IPV		GENMASK(3, 0)
147 #define IPFT_OIPV		BIT(4)
148 #define IPFT_DR			GENMASK(6, 5)
149 #define IPFT_ODR		BIT(7)
150 #define IPFT_FLTFA		GENMASK(10, 8)
151 #define  IPFT_FLTFA_DISCARD	0
152 #define  IPFT_FLTFA_PERMIT	1
153 /* Redirect is only for switch */
154 #define  IPFT_FLTFA_REDIRECT	2
155 #define IPFT_IMIRE		BIT(11)
156 #define IPFT_WOLTE		BIT(12)
157 #define IPFT_FLTA		GENMASK(14, 13)
158 #define  IPFT_FLTA_RP		1
159 #define  IPFT_FLTA_IS		2
160 #define  IPFT_FLTA_SI_BITMAP	3
161 #define IPFT_RPR		GENMASK(16, 15)
162 #define IPFT_CTD		BIT(17)
163 #define IPFT_HR			GENMASK(21, 18)
164 #define IPFT_TIMECAPE		BIT(22)
165 #define IPFT_RRT		BIT(23)
166 #define IPFT_BL2F		BIT(24)
167 #define IPFT_EVMEID		GENMASK(31, 28)
168 	__le32 flta_tgt;
169 };
170 
171 struct ipft_entry_data {
172 	u32 entry_id; /* hardware assigns entry ID */
173 	struct ipft_keye_data keye;
174 	struct ipft_cfge_data cfge;
175 };
176 
177 struct fdbt_keye_data {
178 	u8 mac_addr[ETH_ALEN]; /* big-endian */
179 	__le16 resv0;
180 	__le16 fid;
181 #define FDBT_FID		GENMASK(11, 0)
182 	__le16 resv1;
183 };
184 
185 struct fdbt_cfge_data {
186 	__le32 port_bitmap;
187 #define FDBT_PORT_BITMAP	GENMASK(23, 0)
188 	__le32 cfg;
189 #define FDBT_OETEID		GENMASK(1, 0)
190 #define FDBT_EPORT		GENMASK(6, 2)
191 #define FDBT_IMIRE		BIT(7)
192 #define FDBT_CTD		GENMASK(10, 9)
193 #define FDBT_DYNAMIC		BIT(11)
194 #define FDBT_TIMECAPE		BIT(12)
195 	__le32 et_eid;
196 };
197 
198 struct fdbt_entry_data {
199 	u32 entry_id;
200 	struct fdbt_keye_data keye;
201 	struct fdbt_cfge_data cfge;
202 	u8 acte;
203 #define FDBT_ACT_CNT		GENMASK(6, 0)
204 #define FDBT_ACT_FLAG		BIT(7)
205 };
206 
207 struct vft_cfge_data {
208 	__le32 bitmap_stg;
209 #define VFT_PORT_MEMBERSHIP	GENMASK(23, 0)
210 #define VFT_STG_ID_MASK		GENMASK(27, 24)
211 #define VFT_STG_ID(g)		FIELD_PREP(VFT_STG_ID_MASK, (g))
212 	__le16 fid;
213 #define VFT_FID			GENMASK(11, 0)
214 	__le16 cfg;
215 #define VFT_MLO			GENMASK(2, 0)
216 #define VFT_MFO			GENMASK(4, 3)
217 #define VFT_IPMFE		BIT(6)
218 #define VFT_IPMFLE		BIT(7)
219 #define VFT_PGA			BIT(8)
220 #define VFT_SFDA		BIT(10)
221 #define VFT_OSFDA		BIT(11)
222 #define VFT_FDBAFSS		BIT(12)
223 	__le32 eta_port_bitmap;
224 #define VFT_ETA_PORT_BITMAP	GENMASK(23, 0)
225 	__le32 et_eid;
226 };
227 
228 struct ett_cfge_data {
229 	__le16 efm_cfg;
230 #define ETT_EFM_MODE		GENMASK(1, 0)
231 #define ETT_ESQA		GENMASK(5, 4)
232 #define ETT_ECA			GENMASK(8, 6)
233 #define ETT_ECA_INC		1
234 #define ETT_EFM_LEN_CHANGE	GENMASK(15, 9)
235 #define ETT_FRM_LEN_DEL_VLAN	0x7c
236 #define ETT_FRM_LEN_DEL_RTAG	0x7a
237 #define ETT_FRM_LEN_DEL_VLAN_RTAG	0x76
238 	__le16 efm_data_len;
239 #define ETT_EFM_DATA_LEN	GENMASK(10, 0)
240 	__le32 efm_eid;
241 	__le32 ec_eid;
242 	__le32 esqa_tgt_eid;
243 };
244 
245 struct bpt_bpse_data {
246 	__le32 amount_used;
247 	__le32 amount_used_hwm;
248 	u8 bpd_fc_state;
249 #define BPT_FC_STATE		BIT(0)
250 #define BPT_BPD			BIT(1)
251 } __packed;
252 
253 struct bpt_cfge_data {
254 	u8 fccfg_sbpen;
255 #define BPT_FC_CFG		GENMASK(2, 1)
256 #define  BPT_FC_CFG_EN_BPFC	1
257 	u8 pfc_vector;
258 	__le16 max_thresh;
259 	__le16 fc_on_thresh;
260 	__le16 fc_off_thresh;
261 	__le16 sbp_thresh;
262 	__le16 resv;
263 	__le32 sbp_eid;
264 	__le32 fc_ports;
265 };
266 
267 union ntmp_fmt_eid {
268 	__le32 index;
269 #define	FMTEID_INDEX		GENMASK(12, 0)
270 	__le32 vuda_sqta;
271 #define FMTEID_VUDA		GENMASK(1, 0)
272 #define FMTEID_VUDA_DEL_OTAG	2
273 #define FMTEID_SQTA		GENMASK(4, 2)
274 #define FMTEID_SQTA_DEL		2
275 #define FMTEID_VUDA_SQTA	BIT(13)
276 	__le32 vara_vid;
277 #define FMTEID_VID		GENMASK(11, 0)
278 #define FMTEID_VARA		GENMASK(13, 12)
279 #define FMTEID_VARA_VID		BIT(14)
280 };
281 
282 #if IS_ENABLED(CONFIG_NXP_NETC_LIB)
283 int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct device *dev,
284 		   const struct netc_cbdr_regs *regs);
285 void ntmp_free_cbdr(struct netc_cbdr *cbdr);
286 u32 ntmp_lookup_free_eid(unsigned long *bitmap, u32 size);
287 void ntmp_clear_eid_bitmap(unsigned long *bitmap, u32 entry_id);
288 
289 /* NTMP APIs */
290 int ntmp_maft_add_entry(struct ntmp_user *user, u32 entry_id,
291 			struct maft_entry_data *maft);
292 int ntmp_maft_query_entry(struct ntmp_user *user, u32 entry_id,
293 			  struct maft_entry_data *maft);
294 int ntmp_maft_delete_entry(struct ntmp_user *user, u32 entry_id);
295 int ntmp_rsst_update_entry(struct ntmp_user *user, const u32 *table,
296 			   int count);
297 int ntmp_rsst_query_entry(struct ntmp_user *user,
298 			  u32 *table, int count);
299 int ntmp_ipft_add_entry(struct ntmp_user *user,
300 			struct ipft_entry_data *entry);
301 int ntmp_ipft_delete_entry(struct ntmp_user *user, u32 entry_id);
302 int ntmp_fdbt_add_entry(struct ntmp_user *user, u32 *entry_id,
303 			const struct fdbt_keye_data *keye,
304 			const struct fdbt_cfge_data *cfge);
305 int ntmp_fdbt_update_entry(struct ntmp_user *user, u32 entry_id,
306 			   const struct fdbt_cfge_data *cfge);
307 int ntmp_fdbt_delete_entry(struct ntmp_user *user, u32 entry_id);
308 int ntmp_fdbt_search_port_entry(struct ntmp_user *user, int port,
309 				u32 *resume_entry_id,
310 				struct fdbt_entry_data *entry);
311 int ntmp_fdbt_update_activity_element(struct ntmp_user *user);
312 int ntmp_fdbt_delete_ageing_entries(struct ntmp_user *user, u8 act_cnt);
313 int ntmp_fdbt_delete_port_dynamic_entries(struct ntmp_user *user, int port);
314 int ntmp_vft_add_entry(struct ntmp_user *user, u16 vid,
315 		       const struct vft_cfge_data *cfge);
316 int ntmp_vft_update_entry(struct ntmp_user *user, u16 vid,
317 			  const struct vft_cfge_data *cfge);
318 int ntmp_vft_delete_entry(struct ntmp_user *user, u16 vid);
319 int ntmp_ett_add_entry(struct ntmp_user *user, u32 entry_id,
320 		       const struct ett_cfge_data *cfge);
321 int ntmp_ett_update_entry(struct ntmp_user *user, u32 entry_id,
322 			  const struct ett_cfge_data *cfge);
323 int ntmp_ett_delete_entry(struct ntmp_user *user, u32 entry_id);
324 int ntmp_ect_update_entry(struct ntmp_user *user, u32 entry_id);
325 int ntmp_bpt_update_entry(struct ntmp_user *user, u32 entry_id,
326 			  const struct bpt_cfge_data *cfge);
327 #else
ntmp_init_cbdr(struct netc_cbdr * cbdr,struct device * dev,const struct netc_cbdr_regs * regs)328 static inline int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct device *dev,
329 				 const struct netc_cbdr_regs *regs)
330 {
331 	return 0;
332 }
333 
ntmp_free_cbdr(struct netc_cbdr * cbdr)334 static inline void ntmp_free_cbdr(struct netc_cbdr *cbdr)
335 {
336 }
337 
ntmp_maft_add_entry(struct ntmp_user * user,u32 entry_id,struct maft_entry_data * maft)338 static inline int ntmp_maft_add_entry(struct ntmp_user *user, u32 entry_id,
339 				      struct maft_entry_data *maft)
340 {
341 	return 0;
342 }
343 
ntmp_maft_query_entry(struct ntmp_user * user,u32 entry_id,struct maft_entry_data * maft)344 static inline int ntmp_maft_query_entry(struct ntmp_user *user, u32 entry_id,
345 					struct maft_entry_data *maft)
346 {
347 	return 0;
348 }
349 
ntmp_maft_delete_entry(struct ntmp_user * user,u32 entry_id)350 static inline int ntmp_maft_delete_entry(struct ntmp_user *user, u32 entry_id)
351 {
352 	return 0;
353 }
354 
ntmp_rsst_update_entry(struct ntmp_user * user,const u32 * table,int count)355 static inline int ntmp_rsst_update_entry(struct ntmp_user *user,
356 					 const u32 *table, int count)
357 {
358 	return 0;
359 }
360 
ntmp_rsst_query_entry(struct ntmp_user * user,u32 * table,int count)361 static inline int ntmp_rsst_query_entry(struct ntmp_user *user,
362 					u32 *table, int count)
363 {
364 	return 0;
365 }
366 
367 #endif
368 
369 #endif
370