xref: /dpdk/drivers/net/dpaa/fmlib/fm_ext.h (revision f5057be340e44f3edc0fe90fa875eb89a4c49b4f)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2008-2012 Freescale Semiconductor Inc.
3  * Copyright 2017-2020 NXP
4  */
5 
6 #ifndef __FM_EXT_H
7 #define __FM_EXT_H
8 
9 #include "ncsw_ext.h"
10 #include "dpaa_integration.h"
11 
12 #define FM_IOC_TYPE_BASE	(NCSW_IOC_TYPE_BASE + 1)
13 #define FMT_IOC_TYPE_BASE	(NCSW_IOC_TYPE_BASE + 3)
14 
15 #define MODULE_FM		0x00010000
16 #define __ERR_MODULE__		MODULE_FM
17 
18 /* #define FM_LIB_DBG */
19 
20 #if defined(FM_LIB_DBG)
21 	#define _fml_dbg(fmt, args...) \
22 	rte_log(RTE_LOG_ ## level, dpaa_logtype_pmd, "fmlib:%s(): " fmt "\n", \
23 			__func__, ##args)
24 #else
25 	#define _fml_dbg(arg...)
26 #endif
27 
28 /*#define FM_IOCTL_DBG*/
29 
30 #if defined(FM_IOCTL_DBG)
31 	#define _fm_ioctl_dbg(fmt, args...) \
32 	rte_log(RTE_LOG_ ## level, dpaa_logtype_pmd, "fmioc:%s(): " fmt "\n", \
33 				__func__, ##args)
34 #else
35 	#define _fm_ioctl_dbg(arg...)
36 #endif
37 
38 /*
39  * @Group	lnx_ioctl_ncsw_grp	NetCommSw Linux User-Space (IOCTL) API
40  * @{
41  */
42 
43 #define NCSW_IOC_TYPE_BASE	0xe0
44 	/**< defines the IOCTL type for all the NCSW Linux module commands */
45 
46 /*
47  * @Group	  lnx_usr_FM_grp Frame Manager API
48  *
49  * @Description   FM API functions, definitions and enums.
50  *
51  *	  The FM module is the main driver module and is a mandatory
52  *	  module for FM driver users. This module must be initialized
53  *	  first prior to any other drivers modules.
54  *	  The FM is a "singleton" module. It is responsible of the
55  *	  common HW modules: FPM, DMA, common QMI and common BMI
56  *	  initializations and run-time control routines. This module
57  *	  must be initialized always when working with any of the FM modules.
58  *	  NOTE - We assume that the FM library will be initialized only
59  *	  by core No. 0!
60  *
61  * @{
62  */
63 
64 /*
65  * @Description   Enum for defining port types
66  */
67 typedef enum e_fm_port_type {
68 	e_FM_PORT_TYPE_OH_OFFLINE_PARSING = 0,  /**< Offline parsing port */
69 	e_FM_PORT_TYPE_RX,			/**< 1G Rx port */
70 	e_FM_PORT_TYPE_RX_10G,			/**< 10G Rx port */
71 	e_FM_PORT_TYPE_TX,			/**< 1G Tx port */
72 	e_FM_PORT_TYPE_TX_10G,			/**< 10G Tx port */
73 	e_FM_PORT_TYPE_RX_2_5G,			/**< 2.5G Rx port */
74 	e_FM_PORT_TYPE_TX_2_5G,			/**< 2.5G Tx port */
75 	e_FM_PORT_TYPE_DUMMY
76 } e_fm_port_type;
77 
78 /*
79  * @Description   Parse results memory layout
80  */
81 typedef struct t_fm_prs_result {
82 	volatile uint8_t	lpid;		/**< Logical port id */
83 	volatile uint8_t	shimr;		/**< Shim header result  */
84 	volatile uint16_t	l2r;		/**< Layer 2 result */
85 	volatile uint16_t	l3r;		/**< Layer 3 result */
86 	volatile uint8_t	l4r;		/**< Layer 4 result */
87 	volatile uint8_t	cplan;		/**< Classification plan id */
88 	volatile uint16_t	nxthdr;		/**< Next Header  */
89 	volatile uint16_t	cksum;		/**< Running-sum */
90 	volatile uint16_t	flags_frag_off;
91 			/**<Flags & fragment-offset field of the last IP-header
92 			 */
93 	volatile uint8_t	route_type;
94 			/**< Routing type field of a IPv6 routing extension
95 			 * header
96 			 */
97 	volatile uint8_t	rhp_ip_valid;
98 			/**< Routing Extension Header Present; last bit is IP
99 			 * valid
100 			 */
101 	volatile uint8_t	shim_off[2];	/**< Shim offset */
102 	volatile uint8_t	ip_pid_off;
103 			/**< IP PID (last IP-proto)offset */
104 	volatile uint8_t	eth_off;	/**< ETH offset */
105 	volatile uint8_t	llc_snap_off;	/**< LLC_SNAP offset */
106 	volatile uint8_t	vlan_off[2];	/**< VLAN offset */
107 	volatile uint8_t	etype_off;	/**< ETYPE offset */
108 	volatile uint8_t	pppoe_off;	/**< PPP offset */
109 	volatile uint8_t	mpls_off[2];	/**< MPLS offset */
110 	volatile uint8_t	ip_off[2];	/**< IP offset */
111 	volatile uint8_t	gre_off;	/**< GRE offset */
112 	volatile uint8_t	l4_off;		/**< Layer 4 offset */
113 	volatile uint8_t	nxthdr_off;	/**< Parser end point */
114 } __rte_packed t_fm_prs_result;
115 
116 /*
117  * @Collection   FM Parser results
118  */
119 #define FM_PR_L2_VLAN_STACK	0x00000100  /**< Parse Result: VLAN stack */
120 #define FM_PR_L2_ETHERNET	0x00008000  /**< Parse Result: Ethernet*/
121 #define FM_PR_L2_VLAN		0x00004000  /**< Parse Result: VLAN */
122 #define FM_PR_L2_LLC_SNAP	0x00002000  /**< Parse Result: LLC_SNAP */
123 #define FM_PR_L2_MPLS		0x00001000  /**< Parse Result: MPLS */
124 #define FM_PR_L2_PPPoE		0x00000800  /**< Parse Result: PPPoE */
125 /* @} */
126 
127 /*
128  * @Collection   FM Frame descriptor macros
129  */
130 #define FM_FD_CMD_FCO		0x80000000  /**< Frame queue Context Override */
131 #define FM_FD_CMD_RPD		0x40000000  /**< Read Prepended Data */
132 #define FM_FD_CMD_UPD		0x20000000  /**< Update Prepended Data */
133 #define FM_FD_CMD_DTC		0x10000000  /**< Do L4 Checksum */
134 #define FM_FD_CMD_DCL4C		0x10000000  /**< Didn't calculate L4 Checksum */
135 #define FM_FD_CMD_CFQ		0x00ffffff  /**< Confirmation Frame Queue */
136 
137 #define FM_FD_ERR_UNSUPPORTED_FORMAT	0x04000000
138 					/**< Not for Rx-Port! Unsupported Format
139 					 */
140 #define FM_FD_ERR_LENGTH	0x02000000
141 					/**< Not for Rx-Port! Length Error */
142 #define FM_FD_ERR_DMA		0x01000000  /**< DMA Data error */
143 
144 #define FM_FD_IPR		0x00000001  /**< IPR frame (not error) */
145 
146 #define FM_FD_ERR_IPR_NCSP	(0x00100000 | FM_FD_IPR)
147 						/**< IPR non-consistent-sp */
148 #define FM_FD_ERR_IPR		(0x00200000 | FM_FD_IPR) /**< IPR error */
149 #define FM_FD_ERR_IPR_TO	(0x00300000 | FM_FD_IPR) /**< IPR timeout */
150 
151 #ifdef FM_CAPWAP_SUPPORT
152 #define FM_FD_ERR_CRE		0x00200000
153 #define FM_FD_ERR_CHE		0x00100000
154 #endif /* FM_CAPWAP_SUPPORT */
155 
156 #define FM_FD_ERR_PHYSICAL	0x00080000
157 			/**< Rx FIFO overflow, FCS error, code error, running
158 			 * disparity error (SGMII and TBI modes), FIFO parity
159 			 * error. PHY Sequence error, PHY error control
160 			 * character detected.
161 			 */
162 #define FM_FD_ERR_SIZE		0x00040000
163 		/**< Frame too long OR Frame size exceeds max_length_frame */
164 #define FM_FD_ERR_CLS_DISCARD	0x00020000  /**< classification discard */
165 #define FM_FD_ERR_EXTRACTION	0x00008000  /**< Extract Out of Frame */
166 #define FM_FD_ERR_NO_SCHEME	0x00004000  /**< No Scheme Selected */
167 #define FM_FD_ERR_KEYSIZE_OVERFLOW	0x00002000  /**< Keysize Overflow */
168 #define FM_FD_ERR_COLOR_RED	0x00000800  /**< Frame color is red */
169 #define FM_FD_ERR_COLOR_YELLOW	0x00000400  /**< Frame color is yellow */
170 #define FM_FD_ERR_ILL_PLCR	0x00000200
171 				/**< Illegal Policer Profile selected */
172 #define FM_FD_ERR_PLCR_FRAME_LEN 0x00000100  /**< Policer frame length error */
173 #define FM_FD_ERR_PRS_TIMEOUT	0x00000080  /**< Parser Time out Exceed */
174 #define FM_FD_ERR_PRS_ILL_INSTRUCT 0x00000040
175 					/**< Invalid Soft Parser instruction */
176 #define FM_FD_ERR_PRS_HDR_ERR	0x00000020
177 		/**< Header error was identified during parsing */
178 #define FM_FD_ERR_BLOCK_LIMIT_EXCEEDED  0x00000008
179 			/**< Frame parsed beyind 256 first bytes */
180 
181 #define FM_FD_TX_STATUS_ERR_MASK	(FM_FD_ERR_UNSUPPORTED_FORMAT   | \
182 					FM_FD_ERR_LENGTH		| \
183 					FM_FD_ERR_DMA) /**< TX Error FD bits */
184 
185 #define FM_FD_RX_STATUS_ERR_MASK	(FM_FD_ERR_UNSUPPORTED_FORMAT   | \
186 					FM_FD_ERR_LENGTH		| \
187 					FM_FD_ERR_DMA		| \
188 					FM_FD_ERR_IPR		| \
189 					FM_FD_ERR_IPR_TO		| \
190 					FM_FD_ERR_IPR_NCSP		| \
191 					FM_FD_ERR_PHYSICAL		| \
192 					FM_FD_ERR_SIZE		| \
193 					FM_FD_ERR_CLS_DISCARD	| \
194 					FM_FD_ERR_COLOR_RED		| \
195 					FM_FD_ERR_COLOR_YELLOW	| \
196 					FM_FD_ERR_ILL_PLCR		| \
197 					FM_FD_ERR_PLCR_FRAME_LEN	| \
198 					FM_FD_ERR_EXTRACTION	| \
199 					FM_FD_ERR_NO_SCHEME		| \
200 					FM_FD_ERR_KEYSIZE_OVERFLOW	| \
201 					FM_FD_ERR_PRS_TIMEOUT	| \
202 					FM_FD_ERR_PRS_ILL_INSTRUCT	| \
203 					FM_FD_ERR_PRS_HDR_ERR	| \
204 					FM_FD_ERR_BLOCK_LIMIT_EXCEEDED)
205 					/**< RX Error FD bits */
206 
207 #define FM_FD_RX_STATUS_ERR_NON_FM	0x00400000
208 					/**< non Frame-Manager error */
209 /* @} */
210 
211 /*
212  * @Description   FM Exceptions
213  */
214 typedef enum e_fm_exceptions {
215 	e_FM_EX_DMA_BUS_ERROR = 0,	/**< DMA bus error. */
216 	e_FM_EX_DMA_READ_ECC,
217 		/**< Read Buffer ECC error (Valid for FM rev < 6)*/
218 	e_FM_EX_DMA_SYSTEM_WRITE_ECC,
219 		/**< Write Buffer ECC error on system side
220 		 * (Valid for FM rev < 6)
221 		 */
222 	e_FM_EX_DMA_FM_WRITE_ECC,
223 		/**< Write Buffer ECC error on FM side (Valid for FM rev < 6)*/
224 	e_FM_EX_DMA_SINGLE_PORT_ECC,
225 		/**< Single Port ECC error on FM side (Valid for FM rev > 6)*/
226 	e_FM_EX_FPM_STALL_ON_TASKS,	/**< Stall of tasks on FPM */
227 	e_FM_EX_FPM_SINGLE_ECC,		/**< Single ECC on FPM. */
228 	e_FM_EX_FPM_DOUBLE_ECC,
229 		/**< Double ECC error on FPM ram access */
230 	e_FM_EX_QMI_SINGLE_ECC,		/**< Single ECC on QMI. */
231 	e_FM_EX_QMI_DOUBLE_ECC,		/**< Double bit ECC occurred on QMI */
232 	e_FM_EX_QMI_DEQ_FROM_UNKNOWN_PORTID,/**< Dequeue from unknown port id */
233 	e_FM_EX_BMI_LIST_RAM_ECC,	/**< Linked List RAM ECC error */
234 	e_FM_EX_BMI_STORAGE_PROFILE_ECC,/**< Storage Profile ECC Error */
235 	e_FM_EX_BMI_STATISTICS_RAM_ECC,
236 		/**< Statistics Count RAM ECC Error Enable */
237 	e_FM_EX_BMI_DISPATCH_RAM_ECC,	/**< Dispatch RAM ECC Error Enable */
238 	e_FM_EX_IRAM_ECC,		/**< Double bit ECC occurred on IRAM*/
239 	e_FM_EX_MURAM_ECC		/**< Double bit ECC occurred on MURAM*/
240 } e_fm_exceptions;
241 
242 /*
243  * @Description   Enum for defining port DMA cache attributes
244  */
245 typedef enum e_fm_dma_cache_option {
246 	e_FM_DMA_NO_STASH = 0,	/**< Cacheable, no Allocate (No Stashing) */
247 	e_FM_DMA_STASH = 1	/**< Cacheable and Allocate (Stashing on) */
248 } e_fm_dma_cache_option;
249 /*
250  * @Group	lnx_usr_FM_init_grp FM Initialization Unit
251  *
252  * @Description   FM Initialization Unit
253  *
254  *		  Initialization Flow
255  *		  Initialization of the FM Module will be carried out by the
256  *		  application according to the following sequence:
257  *		  -  Calling the configuration routine with basic parameters.
258  *		  -  Calling the advance initialization routines to change
259  *		     driver's defaults.
260  *		  -  Calling the initialization routine.
261  *
262  * @{
263  */
264 
265 t_handle fm_open(uint8_t id);
266 void	fm_close(t_handle h_fm);
267 
268 /*
269  * @Description   A structure for defining buffer prefix area content.
270  */
271 typedef struct t_fm_buffer_prefix_content {
272 	uint16_t	priv_data_size;
273 		/**< Number of bytes to be left at the beginning of the external
274 		 * buffer Note that the private-area will start from the base of
275 		 * the buffer address.
276 		 */
277 	bool	pass_prs_result;
278 		/**< TRUE to pass the parse result to/from the FM; User may use
279 		 * fm_port_get_buffer_prs_result() in order to get the
280 		 * parser-result from a buffer.
281 		 */
282 	bool	pass_time_stamp;
283 		/**< TRUE to pass the timeStamp to/from the FM User may use
284 		 * fm_port_get_buffer_time_stamp() in order to get the
285 		 * parser-result from a buffer.
286 		 */
287 	bool	pass_hash_result;
288 		/**< TRUE to pass the KG hash result to/from the FM User may use
289 		 * fm_port_get_buffer_hash_result() in order to get the
290 		 * parser-result from a buffer.
291 		 */
292 	bool	pass_all_other_pcdinfo;
293 		/**< Add all other Internal-Context information: AD,
294 		 * hash-result, key, etc.
295 		 */
296 	uint16_t	data_align;
297 		/**< 0 to use driver's default alignment [64], other value for
298 		 * selecting a data alignment (must be a power of 2); if write
299 		 * optimization is used, must be >= 16.
300 		 */
301 	uint8_t	manip_ext_space;
302 		/**< Maximum extra size needed (insertion-size minus
303 		 * removal-size);
304 		 * Note that this field impacts the size of the buffer-prefix
305 		 * (i.e. it pushes the data offset);
306 		 */
307 } t_fm_buffer_prefix_content;
308 
309 /*
310  * @Description   A structure of information about each of the external
311  *		  buffer pools used by a port or storage-profile.
312  */
313 typedef struct t_fm_ext_pool_params {
314 	uint8_t		id;	/**< External buffer pool id */
315 	uint16_t	size;	/**< External buffer pool buffer size */
316 } t_fm_ext_pool_params;
317 
318 /*
319  * @Description   A structure for informing the driver about the external
320  *		  buffer pools allocated in the BM and used by a port or a
321  *		  storage-profile.
322  */
323 typedef struct t_fm_ext_pools {
324 	uint8_t		num_of_pools_used;
325 			/**< Number of pools use by this port*/
326 	t_fm_ext_pool_params	ext_buf_pool[FM_PORT_MAX_NUM_OF_EXT_POOLS];
327 			/**< Parameters for each port */
328 } t_fm_ext_pools;
329 
330 /*
331  * @Description   A structure for defining backup BM Pools.
332  */
333 typedef struct t_fm_backup_bm_pools {
334 	uint8_t	num_bkup_pools;
335 			/**< Number of BM backup pools - must be smaller than
336 			 * the total number of pools defined for the specified
337 			 * port.
338 			 */
339 	uint8_t	pool_ids[FM_PORT_MAX_NUM_OF_EXT_POOLS];
340 			/**< num_bkup_pools pool id's, specifying which pools
341 			 * should be used only as backup. Pool id's specified
342 			 * here must be a subset of the pools used by the
343 			 * specified port.
344 			 */
345 } t_fm_backup_bm_pools;
346 
347 /** @} */ /* end of lnx_usr_FM_init_grp group */
348 
349 /*
350  * @Group	lnx_usr_FM_runtime_control_grp FM Runtime Control Unit
351  *
352  * @Description   FM Runtime control unit API functions, definitions and enums.
353  *
354  *		  The FM driver provides a set of control routines.
355  *		  These routines may only be called after the module was fully
356  *		  initialized (both configuration and initialization routines
357  *		  were called). They are typically used to get information from
358  *		  hardware (status, counters/statistics, revision etc.), to
359  *		  modify a current state or to force/enable a required action.
360  *		  Run-time control may be called whenever necessary and as many
361  *		  times as needed.
362  * @{
363  */
364 
365 /*
366  * @Collection   General FM defines.
367  */
368 #define FM_MAX_NUM_OF_VALID_PORTS   (FM_MAX_NUM_OF_OH_PORTS +	\
369 				FM_MAX_NUM_OF_1G_RX_PORTS +	\
370 				FM_MAX_NUM_OF_10G_RX_PORTS +   \
371 				FM_MAX_NUM_OF_1G_TX_PORTS +	\
372 				FM_MAX_NUM_OF_10G_TX_PORTS)
373 				/**< Number of available FM ports */
374 /* @} */
375 
376 /** @} */ /* end of lnx_usr_FM_runtime_control_grp group */
377 /** @} */ /* end of lnx_usr_FM_lib_grp group */
378 /** @} */ /* end of lnx_usr_FM_grp group */
379 
380 /*
381  * @Description   FM Char device ioctls
382  */
383 
384 /*
385  * @Group	lnx_ioctl_FM_grp Frame Manager Linux IOCTL API
386  *
387  * @Description   FM Linux ioctls definitions and enums
388  *
389  * @{
390  */
391 
392 /*
393  * @Collection	FM IOCTL device ('/dev') definitions
394  */
395 #define DEV_FM_NAME		"fm" /**< Name of the FM chardev */
396 
397 #define DEV_FM_MINOR_BASE	0
398 #define DEV_FM_PCD_MINOR_BASE	(DEV_FM_MINOR_BASE + 1)
399 				/*/dev/fmx-pcd */
400 #define DEV_FM_OH_PORTS_MINOR_BASE  (DEV_FM_PCD_MINOR_BASE + 1)
401 				/*/dev/fmx-port-ohy */
402 #define DEV_FM_RX_PORTS_MINOR_BASE \
403 	(DEV_FM_OH_PORTS_MINOR_BASE + FM_MAX_NUM_OF_OH_PORTS)
404 				/*/dev/fmx-port-rxy */
405 #define DEV_FM_TX_PORTS_MINOR_BASE \
406 	(DEV_FM_RX_PORTS_MINOR_BASE + FM_MAX_NUM_OF_RX_PORTS)
407 				/*/dev/fmx-port-txy */
408 #define DEV_FM_MAX_MINORS \
409 	(DEV_FM_TX_PORTS_MINOR_BASE + FM_MAX_NUM_OF_TX_PORTS)
410 
411 #define FM_IOC_NUM(n)	(n)
412 #define FM_PCD_IOC_NUM(n)   ((n) + 20)
413 #define FM_PORT_IOC_NUM(n)  ((n) + 70)
414 /* @} */
415 
416 #define IOC_FM_MAX_NUM_OF_PORTS	64
417 
418 /*
419  * @Description   Enum for defining port types
420  *		  (must match enum e_fm_port_type defined in fm_ext.h)
421  */
422 typedef enum ioc_fm_port_type {
423 	e_IOC_FM_PORT_TYPE_OH_OFFLINE_PARSING = 0,  /**< Offline parsing port */
424 	e_IOC_FM_PORT_TYPE_RX,			/**< 1G Rx port */
425 	e_IOC_FM_PORT_TYPE_RX_10G,		/**< 10G Rx port */
426 	e_IOC_FM_PORT_TYPE_TX,			/**< 1G Tx port */
427 	e_IOC_FM_PORT_TYPE_TX_10G,		/**< 10G Tx port */
428 	e_IOC_FM_PORT_TYPE_DUMMY
429 } ioc_fm_port_type;
430 
431 typedef struct ioc_fm_obj_t {
432 	void	*obj;
433 } ioc_fm_obj_t;
434 
435 typedef union ioc_fm_api_version_t {
436 	struct {
437 	uint8_t major;
438 	uint8_t minor;
439 	uint8_t respin;
440 	uint8_t reserved;
441 	} version;
442 	uint32_t ver;
443 } ioc_fm_api_version_t;
444 
445 /*
446  * @Function	  FM_IOC_GET_API_VERSION
447  *
448  * @Description   Reads the FMD IOCTL API version.
449  *
450  * @Param[in,out] ioc_fm_api_version_t		The requested counter parameters
451  *
452  * @Return	  Version's value.
453  */
454 #define FM_IOC_GET_API_VERSION	\
455 	_IOR(FM_IOC_TYPE_BASE, FM_IOC_NUM(7), ioc_fm_api_version_t)
456 #define FMD_API_VERSION_MAJOR 21
457 #define FMD_API_VERSION_MINOR 1
458 #define FMD_API_VERSION_RESPIN 0
459 
460 uint32_t fm_get_api_version(t_handle h_fm, ioc_fm_api_version_t *p_version);
461 
462 
463 #endif /* __FM_EXT_H */
464