xref: /dpdk/drivers/net/dpaa2/mc/fsl_dpdmux.h (revision 9e991f217fc8719e38a812dc280dba5f84db9f59)
1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2  *
3  * Copyright 2013-2016 Freescale Semiconductor Inc.
4  * Copyright 2018-2019 NXP
5  *
6  */
7 #ifndef __FSL_DPDMUX_H
8 #define __FSL_DPDMUX_H
9 
10 #include <fsl_net.h>
11 
12 struct fsl_mc_io;
13 
14 /** @addtogroup dpdmux Data Path Demux API
15  * Contains API for handling DPDMUX topology and functionality
16  * @{
17  */
18 
19 int dpdmux_open(struct fsl_mc_io *mc_io,
20 		uint32_t  cmd_flags,
21 		int  dpdmux_id,
22 		uint16_t  *token);
23 
24 int dpdmux_close(struct fsl_mc_io *mc_io,
25 		 uint32_t cmd_flags,
26 		 uint16_t token);
27 
28 /**
29  * DPDMUX general options
30  */
31 
32 /**
33  * Enable bridging between internal interfaces
34  */
35 #define DPDMUX_OPT_BRIDGE_EN	0x0000000000000002ULL
36 
37 /**
38  * Mask support for classification
39  */
40 #define DPDMUX_OPT_CLS_MASK_SUPPORT		0x0000000000000020ULL
41 
42 #define DPDMUX_IRQ_INDEX_IF	0x0000
43 #define DPDMUX_IRQ_INDEX	0x0001
44 
45 /**
46  * IRQ event - Indicates that the link state changed
47  */
48 #define DPDMUX_IRQ_EVENT_LINK_CHANGED	0x0001
49 
50 /**
51  * enum dpdmux_manip - DPDMUX manipulation operations
52  * @DPDMUX_MANIP_NONE:	No manipulation on frames
53  * @DPDMUX_MANIP_ADD_REMOVE_S_VLAN: Add S-VLAN on egress, remove it on ingress
54  */
55 enum dpdmux_manip {
56 	DPDMUX_MANIP_NONE = 0x0,
57 	DPDMUX_MANIP_ADD_REMOVE_S_VLAN = 0x1
58 };
59 
60 /**
61  * enum dpdmux_method - DPDMUX method options
62  * @DPDMUX_METHOD_NONE: no DPDMUX method
63  * @DPDMUX_METHOD_C_VLAN_MAC: DPDMUX based on C-VLAN and MAC address
64  * @DPDMUX_METHOD_MAC: DPDMUX based on MAC address
65  * @DPDMUX_METHOD_C_VLAN: DPDMUX based on C-VLAN
66  * @DPDMUX_METHOD_S_VLAN: DPDMUX based on S-VLAN
67  */
68 enum dpdmux_method {
69 	DPDMUX_METHOD_NONE = 0x0,
70 	DPDMUX_METHOD_C_VLAN_MAC = 0x1,
71 	DPDMUX_METHOD_MAC = 0x2,
72 	DPDMUX_METHOD_C_VLAN = 0x3,
73 	DPDMUX_METHOD_S_VLAN = 0x4,
74 	DPDMUX_METHOD_CUSTOM = 0x5,
75 };
76 
77 /**
78  * struct dpdmux_cfg - DPDMUX configuration parameters
79  * @method: Defines the operation method for the DPDMUX address table
80  * @manip: Required manipulation operation
81  * @num_ifs: Number of interfaces (excluding the uplink interface)
82  * @adv: Advanced parameters; default is all zeros;
83  *	use this structure to change default settings
84  * @adv.options: DPDMUX options - combination of 'DPDMUX_OPT_<X>' flags.
85  * @adv.max_dmat_entries: Maximum entries in DPDMUX address table
86  *	0 - indicates default: 64 entries per interface.
87  * @adv.max_mc_groups: Number of multicast groups in DPDMUX table
88  *	0 - indicates default: 32 multicast groups.
89  * @adv.max_vlan_ids: Maximum vlan ids allowed in the system -
90  *	relevant only case of working in mac+vlan method.
91  *	0 - indicates default 16 vlan ids.
92  */
93 struct dpdmux_cfg {
94 	enum dpdmux_method method;
95 	enum dpdmux_manip manip;
96 	uint16_t num_ifs;
97 	struct {
98 		uint64_t options;
99 		uint16_t max_dmat_entries;
100 		uint16_t max_mc_groups;
101 		uint16_t max_vlan_ids;
102 	} adv;
103 };
104 
105 int dpdmux_create(struct fsl_mc_io *mc_io,
106 		  uint16_t dprc_token,
107 		  uint32_t cmd_flags,
108 		  const struct dpdmux_cfg *cfg,
109 		  uint32_t *obj_id);
110 
111 int dpdmux_destroy(struct fsl_mc_io *mc_io,
112 		   uint16_t dprc_token,
113 		   uint32_t cmd_flags,
114 		   uint32_t object_id);
115 
116 int dpdmux_enable(struct fsl_mc_io *mc_io,
117 		  uint32_t cmd_flags,
118 		  uint16_t token);
119 
120 int dpdmux_disable(struct fsl_mc_io *mc_io,
121 		   uint32_t cmd_flags,
122 		   uint16_t token);
123 
124 int dpdmux_is_enabled(struct fsl_mc_io *mc_io,
125 		      uint32_t cmd_flags,
126 		      uint16_t token,
127 		      int *en);
128 
129 int dpdmux_reset(struct fsl_mc_io *mc_io,
130 		 uint32_t cmd_flags,
131 		 uint16_t token);
132 
133 /**
134  * struct dpdmux_attr - Structure representing DPDMUX attributes
135  * @id: DPDMUX object ID
136  * @options: Configuration options (bitmap)
137  * @method: DPDMUX address table method
138  * @manip: DPDMUX manipulation type
139  * @num_ifs: Number of interfaces (excluding the uplink interface)
140  * @mem_size: DPDMUX frame storage memory size
141  */
142 struct dpdmux_attr {
143 	int id;
144 	uint64_t options;
145 	enum dpdmux_method method;
146 	enum dpdmux_manip manip;
147 	uint16_t num_ifs;
148 	uint16_t mem_size;
149 };
150 
151 int dpdmux_get_attributes(struct fsl_mc_io *mc_io,
152 			  uint32_t cmd_flags,
153 			  uint16_t token,
154 			  struct dpdmux_attr *attr);
155 
156 int dpdmux_set_max_frame_length(struct fsl_mc_io *mc_io,
157 				uint32_t cmd_flags,
158 				uint16_t token,
159 				uint16_t max_frame_length);
160 
161 /**
162  * enum dpdmux_counter_type - Counter types
163  * @DPDMUX_CNT_ING_FRAME: Counts ingress frames
164  * @DPDMUX_CNT_ING_BYTE: Counts ingress bytes
165  * @DPDMUX_CNT_ING_FLTR_FRAME: Counts filtered ingress frames
166  * @DPDMUX_CNT_ING_FRAME_DISCARD: Counts discarded ingress frames
167  * @DPDMUX_CNT_ING_MCAST_FRAME: Counts ingress multicast frames
168  * @DPDMUX_CNT_ING_MCAST_BYTE: Counts ingress multicast bytes
169  * @DPDMUX_CNT_ING_BCAST_FRAME: Counts ingress broadcast frames
170  * @DPDMUX_CNT_ING_BCAST_BYTES: Counts ingress broadcast bytes
171  * @DPDMUX_CNT_EGR_FRAME: Counts egress frames
172  * @DPDMUX_CNT_EGR_BYTE: Counts egress bytes
173  * @DPDMUX_CNT_EGR_FRAME_DISCARD: Counts discarded egress frames
174  */
175 enum dpdmux_counter_type {
176 	DPDMUX_CNT_ING_FRAME = 0x0,
177 	DPDMUX_CNT_ING_BYTE = 0x1,
178 	DPDMUX_CNT_ING_FLTR_FRAME = 0x2,
179 	DPDMUX_CNT_ING_FRAME_DISCARD = 0x3,
180 	DPDMUX_CNT_ING_MCAST_FRAME = 0x4,
181 	DPDMUX_CNT_ING_MCAST_BYTE = 0x5,
182 	DPDMUX_CNT_ING_BCAST_FRAME = 0x6,
183 	DPDMUX_CNT_ING_BCAST_BYTES = 0x7,
184 	DPDMUX_CNT_EGR_FRAME = 0x8,
185 	DPDMUX_CNT_EGR_BYTE = 0x9,
186 	DPDMUX_CNT_EGR_FRAME_DISCARD = 0xa
187 };
188 
189 /**
190  * enum dpdmux_accepted_frames_type - DPDMUX frame types
191  * @DPDMUX_ADMIT_ALL: The device accepts VLAN tagged, untagged and
192  *			priority-tagged frames
193  * @DPDMUX_ADMIT_ONLY_VLAN_TAGGED: The device discards untagged frames or
194  *				priority-tagged frames that are received on this
195  *				interface
196  * @DPDMUX_ADMIT_ONLY_UNTAGGED: Untagged frames or priority-tagged frames
197  *				received on this interface are accepted
198  */
199 enum dpdmux_accepted_frames_type {
200 	DPDMUX_ADMIT_ALL = 0,
201 	DPDMUX_ADMIT_ONLY_VLAN_TAGGED = 1,
202 	DPDMUX_ADMIT_ONLY_UNTAGGED = 2
203 };
204 
205 /**
206  * enum dpdmux_action - DPDMUX action for un-accepted frames
207  * @DPDMUX_ACTION_DROP: Drop un-accepted frames
208  * @DPDMUX_ACTION_REDIRECT_TO_CTRL: Redirect un-accepted frames to the
209  *					control interface
210  */
211 enum dpdmux_action {
212 	DPDMUX_ACTION_DROP = 0,
213 	DPDMUX_ACTION_REDIRECT_TO_CTRL = 1
214 };
215 
216 /**
217  * struct dpdmux_accepted_frames - Frame types configuration
218  * @type: Defines ingress accepted frames
219  * @unaccept_act: Defines action on frames not accepted
220  */
221 struct dpdmux_accepted_frames {
222 	enum dpdmux_accepted_frames_type type;
223 	enum dpdmux_action unaccept_act;
224 };
225 
226 int dpdmux_if_set_accepted_frames(struct fsl_mc_io *mc_io,
227 				  uint32_t cmd_flags,
228 				  uint16_t token,
229 				  uint16_t if_id,
230 				  const struct dpdmux_accepted_frames *cfg);
231 
232 /**
233  * struct dpdmux_if_attr - Structure representing frame types configuration
234  * @rate: Configured interface rate (in bits per second)
235  * @enabled: Indicates if interface is enabled
236  * @accept_frame_type: Indicates type of accepted frames for the interface
237  */
238 struct dpdmux_if_attr {
239 	uint32_t rate;
240 	int enabled;
241 	int is_default;
242 	enum dpdmux_accepted_frames_type accept_frame_type;
243 };
244 
245 int dpdmux_if_get_attributes(struct fsl_mc_io *mc_io,
246 			     uint32_t cmd_flags,
247 			     uint16_t token,
248 			     uint16_t if_id,
249 			     struct dpdmux_if_attr *attr);
250 
251 int dpdmux_if_enable(struct fsl_mc_io *mc_io,
252 		     uint32_t cmd_flags,
253 		     uint16_t token,
254 		     uint16_t if_id);
255 
256 int dpdmux_if_disable(struct fsl_mc_io *mc_io,
257 		      uint32_t cmd_flags,
258 		      uint16_t token,
259 		      uint16_t if_id);
260 
261 /**
262  * struct dpdmux_l2_rule - Structure representing L2 rule
263  * @mac_addr: MAC address
264  * @vlan_id: VLAN ID
265  */
266 struct dpdmux_l2_rule {
267 	uint8_t mac_addr[6];
268 	uint16_t vlan_id;
269 };
270 
271 int dpdmux_if_remove_l2_rule(struct fsl_mc_io *mc_io,
272 			     uint32_t cmd_flags,
273 			     uint16_t token,
274 			     uint16_t if_id,
275 			     const struct dpdmux_l2_rule *rule);
276 
277 int dpdmux_if_add_l2_rule(struct fsl_mc_io *mc_io,
278 			  uint32_t cmd_flags,
279 			  uint16_t token,
280 			  uint16_t if_id,
281 			  const struct dpdmux_l2_rule *rule);
282 
283 int dpdmux_if_get_counter(struct fsl_mc_io *mc_io,
284 			  uint32_t cmd_flags,
285 			  uint16_t token,
286 			  uint16_t if_id,
287 			  enum dpdmux_counter_type counter_type,
288 			  uint64_t *counter);
289 
290 int dpdmux_ul_reset_counters(struct fsl_mc_io *mc_io,
291 			     uint32_t cmd_flags,
292 			     uint16_t token);
293 
294 /**
295  * Enable auto-negotiation
296  */
297 #define DPDMUX_LINK_OPT_AUTONEG		0x0000000000000001ULL
298 /**
299  * Enable half-duplex mode
300  */
301 #define DPDMUX_LINK_OPT_HALF_DUPLEX	0x0000000000000002ULL
302 /**
303  * Enable pause frames
304  */
305 #define DPDMUX_LINK_OPT_PAUSE		0x0000000000000004ULL
306 /**
307  * Enable a-symmetric pause frames
308  */
309 #define DPDMUX_LINK_OPT_ASYM_PAUSE	0x0000000000000008ULL
310 
311 /**
312  * struct dpdmux_link_cfg - Structure representing DPDMUX link configuration
313  * @rate: Rate
314  * @options: Mask of available options; use 'DPDMUX_LINK_OPT_<X>' values
315  */
316 struct dpdmux_link_cfg {
317 	uint32_t rate;
318 	uint64_t options;
319 	uint64_t advertising;
320 };
321 
322 int dpdmux_if_set_link_cfg(struct fsl_mc_io *mc_io,
323 			   uint32_t cmd_flags,
324 			   uint16_t token,
325 			   uint16_t if_id,
326 			   struct dpdmux_link_cfg *cfg);
327 /**
328  * struct dpdmux_link_state - Structure representing DPDMUX link state
329  * @rate: Rate
330  * @options: Mask of available options; use 'DPDMUX_LINK_OPT_<X>' values
331  * @up: 0 - down, 1 - up
332  * @state_valid: Ignore/Update the state of the link
333  * @supported: Speeds capability of the phy (bitmap)
334  * @advertising: Speeds that are advertised for autoneg (bitmap)
335  */
336 struct dpdmux_link_state {
337 	uint32_t rate;
338 	uint64_t options;
339 	int      up;
340 	int      state_valid;
341 	uint64_t supported;
342 	uint64_t advertising;
343 };
344 
345 int dpdmux_if_get_link_state(struct fsl_mc_io *mc_io,
346 			     uint32_t cmd_flags,
347 			     uint16_t token,
348 			     uint16_t if_id,
349 			     struct dpdmux_link_state *state);
350 
351 int dpdmux_if_set_default(struct fsl_mc_io *mc_io,
352 		uint32_t cmd_flags,
353 		uint16_t token,
354 		uint16_t if_id);
355 
356 int dpdmux_if_get_default(struct fsl_mc_io *mc_io,
357 		uint32_t cmd_flags,
358 		uint16_t token,
359 		uint16_t *if_id);
360 
361 int dpdmux_set_custom_key(struct fsl_mc_io *mc_io,
362 			uint32_t cmd_flags,
363 			uint16_t token,
364 			uint64_t key_cfg_iova);
365 
366 /**
367  * struct dpdmux_rule_cfg - Custom classification rule.
368  *
369  * @key_iova: DMA address of buffer storing the look-up value
370  * @mask_iova: DMA address of the mask used for TCAM classification
371  * @key_size: size, in bytes, of the look-up value. This must match the size
372  *	of the look-up key defined using dpdmux_set_custom_key, otherwise the
373  *	entry will never be hit
374  */
375 struct dpdmux_rule_cfg {
376 	uint64_t key_iova;
377 	uint64_t mask_iova;
378 	uint8_t key_size;
379 };
380 
381 /**
382  * struct dpdmux_cls_action - Action to execute for frames matching the
383  *	classification entry
384  *
385  * @dest_if: Interface to forward the frames to. Port numbering is similar to
386  *	the one used to connect interfaces:
387  *	- 0 is the uplink port,
388  *	- all others are downlink ports.
389  */
390 struct dpdmux_cls_action {
391 	uint16_t dest_if;
392 };
393 
394 int dpdmux_add_custom_cls_entry(struct fsl_mc_io *mc_io,
395 		uint32_t cmd_flags,
396 		uint16_t token,
397 		struct dpdmux_rule_cfg *rule,
398 		struct dpdmux_cls_action *action);
399 
400 int dpdmux_remove_custom_cls_entry(struct fsl_mc_io *mc_io,
401 		uint32_t cmd_flags,
402 		uint16_t token,
403 		struct dpdmux_rule_cfg *rule);
404 
405 int dpdmux_get_api_version(struct fsl_mc_io *mc_io,
406 			   uint32_t cmd_flags,
407 			   uint16_t *major_ver,
408 			   uint16_t *minor_ver);
409 
410 #endif /* __FSL_DPDMUX_H */
411