1/*
2 * Copyright 2008-2013 Freescale Semiconductor Inc.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *     * Redistributions of source code must retain the above copyright
7 *       notice, this list of conditions and the following disclaimer.
8 *     * Redistributions in binary form must reproduce the above copyright
9 *       notice, this list of conditions and the following disclaimer in the
10 *       documentation and/or other materials provided with the distribution.
11 *     * Neither the name of Freescale Semiconductor nor the
12 *       names of its contributors may be used to endorse or promote products
13 *       derived from this software without specific prior written permission.
14 *
15 *
16 * ALTERNATIVELY, this software may be distributed under the terms of the
17 * GNU General Public License ("GPL") as published by the Free Software
18 * Foundation, either version 2 of that License or (at your option) any
19 * later version.
20 *
21 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33#ifndef __FSL_FMAN_PORT_H
34#define __FSL_FMAN_PORT_H
35
36#include "fsl_fman_sp.h"
37
38/** @Collection  Registers bit fields */
39
40/** @Description  BMI defines */
41#define BMI_EBD_EN                              0x80000000
42
43#define BMI_PORT_CFG_EN				0x80000000
44#define BMI_PORT_CFG_FDOVR			0x02000000
45#define BMI_PORT_CFG_IM				0x01000000
46
47#define BMI_PORT_STATUS_BSY			0x80000000
48
49#define BMI_DMA_ATTR_SWP_SHIFT			FMAN_SP_DMA_ATTR_SWP_SHIFT
50#define BMI_DMA_ATTR_IC_STASH_ON		0x10000000
51#define BMI_DMA_ATTR_HDR_STASH_ON		0x04000000
52#define BMI_DMA_ATTR_SG_STASH_ON		0x01000000
53#define BMI_DMA_ATTR_WRITE_OPTIMIZE		FMAN_SP_DMA_ATTR_WRITE_OPTIMIZE
54
55#define BMI_RX_FIFO_PRI_ELEVATION_SHIFT		16
56#define BMI_RX_FIFO_THRESHOLD_ETHE		0x80000000
57
58#define BMI_TX_FRAME_END_CS_IGNORE_SHIFT	24
59#define BMI_RX_FRAME_END_CS_IGNORE_SHIFT	24
60#define BMI_RX_FRAME_END_CUT_SHIFT		16
61
62#define BMI_IC_TO_EXT_SHIFT			FMAN_SP_IC_TO_EXT_SHIFT
63#define BMI_IC_FROM_INT_SHIFT			FMAN_SP_IC_FROM_INT_SHIFT
64
65#define BMI_INT_BUF_MARG_SHIFT			28
66#define BMI_EXT_BUF_MARG_START_SHIFT		FMAN_SP_EXT_BUF_MARG_START_SHIFT
67
68#define BMI_CMD_MR_LEAC				0x00200000
69#define BMI_CMD_MR_SLEAC			0x00100000
70#define BMI_CMD_MR_MA				0x00080000
71#define BMI_CMD_MR_DEAS				0x00040000
72#define BMI_CMD_RX_MR_DEF			(BMI_CMD_MR_LEAC | \
73						BMI_CMD_MR_SLEAC | \
74						BMI_CMD_MR_MA | \
75						BMI_CMD_MR_DEAS)
76#define BMI_CMD_TX_MR_DEF			0
77#define BMI_CMD_OP_MR_DEF			(BMI_CMD_MR_DEAS | \
78						BMI_CMD_MR_MA)
79
80#define BMI_CMD_ATTR_ORDER			0x80000000
81#define BMI_CMD_ATTR_SYNC			0x02000000
82#define BMI_CMD_ATTR_COLOR_SHIFT		26
83
84#define BMI_FIFO_PIPELINE_DEPTH_SHIFT           12
85#define BMI_NEXT_ENG_FD_BITS_SHIFT		24
86#define BMI_FRAME_END_CS_IGNORE_SHIFT           24
87
88#define BMI_COUNTERS_EN				0x80000000
89
90#define BMI_EXT_BUF_POOL_VALID			FMAN_SP_EXT_BUF_POOL_VALID
91#define BMI_EXT_BUF_POOL_EN_COUNTER		FMAN_SP_EXT_BUF_POOL_EN_COUNTER
92#define BMI_EXT_BUF_POOL_BACKUP			FMAN_SP_EXT_BUF_POOL_BACKUP
93#define BMI_EXT_BUF_POOL_ID_SHIFT		16
94#define BMI_EXT_BUF_POOL_ID_MASK		0x003F0000
95#define BMI_POOL_DEP_NUM_OF_POOLS_SHIFT		16
96
97#define BMI_TX_FIFO_MIN_FILL_SHIFT		16
98#define BMI_TX_FIFO_PIPELINE_DEPTH_SHIFT	12
99
100#define MAX_PERFORMANCE_TASK_COMP		64
101#define MAX_PERFORMANCE_RX_QUEUE_COMP		64
102#define MAX_PERFORMANCE_TX_QUEUE_COMP		8
103#define MAX_PERFORMANCE_DMA_COMP		16
104#define MAX_PERFORMANCE_FIFO_COMP		1024
105
106#define BMI_PERFORMANCE_TASK_COMP_SHIFT		24
107#define BMI_PERFORMANCE_QUEUE_COMP_SHIFT	16
108#define BMI_PERFORMANCE_DMA_COMP_SHIFT		12
109
110#define BMI_RATE_LIMIT_GRAN_TX			16000 /* In Kbps */
111#define BMI_RATE_LIMIT_GRAN_OP			10000 /* In frames */
112#define BMI_RATE_LIMIT_MAX_RATE_IN_GRAN_UNITS	1024
113#define BMI_RATE_LIMIT_MAX_BURST_SIZE		1024 /* In KBytes */
114#define BMI_RATE_LIMIT_MAX_BURST_SHIFT		16
115#define BMI_RATE_LIMIT_HIGH_BURST_SIZE_GRAN	0x80000000
116#define BMI_RATE_LIMIT_SCALE_TSBS_SHIFT		16
117#define BMI_RATE_LIMIT_SCALE_EN			0x80000000
118#define BMI_SG_DISABLE                          FMAN_SP_SG_DISABLE
119
120/** @Description  QMI defines */
121#define QMI_PORT_CFG_EN				0x80000000
122#define QMI_PORT_CFG_EN_COUNTERS		0x10000000
123
124#define QMI_PORT_STATUS_DEQ_TNUM_BSY		0x80000000
125#define QMI_PORT_STATUS_DEQ_FD_BSY		0x20000000
126
127#define QMI_DEQ_CFG_PRI				0x80000000
128#define QMI_DEQ_CFG_TYPE1			0x10000000
129#define QMI_DEQ_CFG_TYPE2			0x20000000
130#define QMI_DEQ_CFG_TYPE3			0x30000000
131#define QMI_DEQ_CFG_PREFETCH_PARTIAL		0x01000000
132#define QMI_DEQ_CFG_PREFETCH_FULL		0x03000000
133#define QMI_DEQ_CFG_SP_MASK			0xf
134#define QMI_DEQ_CFG_SP_SHIFT			20
135
136
137/** @Description  General port defines */
138#define FMAN_PORT_EXT_POOLS_NUM(fm_rev_maj) \
139		(((fm_rev_maj) == 4) ? 4 : 8)
140#define FMAN_PORT_MAX_EXT_POOLS_NUM	8
141#define FMAN_PORT_OBS_EXT_POOLS_NUM	2
142#define FMAN_PORT_CG_MAP_NUM		8
143#define FMAN_PORT_PRS_RESULT_WORDS_NUM	8
144#define FMAN_PORT_BMI_FIFO_UNITS	0x100
145#define FMAN_PORT_IC_OFFSET_UNITS	0x10
146
147
148/** @Collection    FM Port Register Map */
149
150/** @Description   BMI Rx port register map */
151struct fman_port_rx_bmi_regs {
152	uint32_t fmbm_rcfg;		/**< Rx Configuration */
153	uint32_t fmbm_rst;		/**< Rx Status */
154	uint32_t fmbm_rda;		/**< Rx DMA attributes*/
155	uint32_t fmbm_rfp;		/**< Rx FIFO Parameters*/
156	uint32_t fmbm_rfed;		/**< Rx Frame End Data*/
157	uint32_t fmbm_ricp;		/**< Rx Internal Context Parameters*/
158	uint32_t fmbm_rim;		/**< Rx Internal Buffer Margins*/
159	uint32_t fmbm_rebm;		/**< Rx External Buffer Margins*/
160	uint32_t fmbm_rfne;		/**< Rx Frame Next Engine*/
161	uint32_t fmbm_rfca;		/**< Rx Frame Command Attributes.*/
162	uint32_t fmbm_rfpne;		/**< Rx Frame Parser Next Engine*/
163	uint32_t fmbm_rpso;		/**< Rx Parse Start Offset*/
164	uint32_t fmbm_rpp;		/**< Rx Policer Profile  */
165	uint32_t fmbm_rccb;		/**< Rx Coarse Classification Base */
166	uint32_t fmbm_reth;		/**< Rx Excessive Threshold */
167	uint32_t reserved003c[1];	/**< (0x03C 0x03F) */
168	uint32_t fmbm_rprai[FMAN_PORT_PRS_RESULT_WORDS_NUM];
169					/**< Rx Parse Results Array Init*/
170	uint32_t fmbm_rfqid;		/**< Rx Frame Queue ID*/
171	uint32_t fmbm_refqid;		/**< Rx Error Frame Queue ID*/
172	uint32_t fmbm_rfsdm;		/**< Rx Frame Status Discard Mask*/
173	uint32_t fmbm_rfsem;		/**< Rx Frame Status Error Mask*/
174	uint32_t fmbm_rfene;		/**< Rx Frame Enqueue Next Engine */
175	uint32_t reserved0074[0x2];	/**< (0x074-0x07C)  */
176	uint32_t fmbm_rcmne;		/**< Rx Frame Continuous Mode Next Engine */
177	uint32_t reserved0080[0x20];/**< (0x080 0x0FF)  */
178	uint32_t fmbm_ebmpi[FMAN_PORT_MAX_EXT_POOLS_NUM];
179					/**< Buffer Manager pool Information-*/
180	uint32_t fmbm_acnt[FMAN_PORT_MAX_EXT_POOLS_NUM];
181					/**< Allocate Counter-*/
182	uint32_t reserved0130[8];
183					/**< 0x130/0x140 - 0x15F reserved -*/
184	uint32_t fmbm_rcgm[FMAN_PORT_CG_MAP_NUM];
185					/**< Congestion Group Map*/
186	uint32_t fmbm_mpd;		/**< BM Pool Depletion  */
187	uint32_t reserved0184[0x1F];	/**< (0x184 0x1FF) */
188	uint32_t fmbm_rstc;		/**< Rx Statistics Counters*/
189	uint32_t fmbm_rfrc;		/**< Rx Frame Counter*/
190	uint32_t fmbm_rfbc;		/**< Rx Bad Frames Counter*/
191	uint32_t fmbm_rlfc;		/**< Rx Large Frames Counter*/
192	uint32_t fmbm_rffc;		/**< Rx Filter Frames Counter*/
193	uint32_t fmbm_rfdc;		/**< Rx Frame Discard Counter*/
194	uint32_t fmbm_rfldec;		/**< Rx Frames List DMA Error Counter*/
195	uint32_t fmbm_rodc;		/**< Rx Out of Buffers Discard nntr*/
196	uint32_t fmbm_rbdc;		/**< Rx Buffers Deallocate Counter*/
197	uint32_t reserved0224[0x17];	/**< (0x224 0x27F) */
198	uint32_t fmbm_rpc;		/**< Rx Performance Counters*/
199	uint32_t fmbm_rpcp;		/**< Rx Performance Count Parameters*/
200	uint32_t fmbm_rccn;		/**< Rx Cycle Counter*/
201	uint32_t fmbm_rtuc;		/**< Rx Tasks Utilization Counter*/
202	uint32_t fmbm_rrquc;		/**< Rx Receive Queue Utilization cntr*/
203	uint32_t fmbm_rduc;		/**< Rx DMA Utilization Counter*/
204	uint32_t fmbm_rfuc;		/**< Rx FIFO Utilization Counter*/
205	uint32_t fmbm_rpac;		/**< Rx Pause Activation Counter*/
206	uint32_t reserved02a0[0x18];	/**< (0x2A0 0x2FF) */
207	uint32_t fmbm_rdbg;		/**< Rx Debug-*/
208};
209
210/** @Description   BMI Tx port register map */
211struct fman_port_tx_bmi_regs {
212	uint32_t fmbm_tcfg;		/**< Tx Configuration */
213	uint32_t fmbm_tst;		/**< Tx Status */
214	uint32_t fmbm_tda;		/**< Tx DMA attributes */
215	uint32_t fmbm_tfp;		/**< Tx FIFO Parameters */
216	uint32_t fmbm_tfed;		/**< Tx Frame End Data */
217	uint32_t fmbm_ticp;		/**< Tx Internal Context Parameters */
218	uint32_t fmbm_tfdne;		/**< Tx Frame Dequeue Next Engine. */
219	uint32_t fmbm_tfca;		/**< Tx Frame Command attribute. */
220	uint32_t fmbm_tcfqid;		/**< Tx Confirmation Frame Queue ID. */
221	uint32_t fmbm_tefqid;		/**< Tx Frame Error Queue ID */
222	uint32_t fmbm_tfene;		/**< Tx Frame Enqueue Next Engine */
223	uint32_t fmbm_trlmts;		/**< Tx Rate Limiter Scale */
224	uint32_t fmbm_trlmt;		/**< Tx Rate Limiter */
225	uint32_t reserved0034[0x0e];	/**< (0x034-0x6c) */
226	uint32_t fmbm_tccb;		/**< Tx Coarse Classification base */
227	uint32_t fmbm_tfne;		/**< Tx Frame Next Engine */
228	uint32_t fmbm_tpfcm[0x02];	/**< Tx Priority based Flow Control (PFC) Mapping */
229	uint32_t fmbm_tcmne;		/**< Tx Frame Continuous Mode Next Engine */
230	uint32_t reserved0080[0x60];	/**< (0x080-0x200) */
231	uint32_t fmbm_tstc;		/**< Tx Statistics Counters */
232	uint32_t fmbm_tfrc;		/**< Tx Frame Counter */
233	uint32_t fmbm_tfdc;		/**< Tx Frames Discard Counter */
234	uint32_t fmbm_tfledc;		/**< Tx Frame len error discard cntr */
235	uint32_t fmbm_tfufdc;		/**< Tx Frame unsprt frmt discard cntr*/
236	uint32_t fmbm_tbdc;		/**< Tx Buffers Deallocate Counter */
237	uint32_t reserved0218[0x1A];	/**< (0x218-0x280) */
238	uint32_t fmbm_tpc;		/**< Tx Performance Counters*/
239	uint32_t fmbm_tpcp;		/**< Tx Performance Count Parameters*/
240	uint32_t fmbm_tccn;		/**< Tx Cycle Counter*/
241	uint32_t fmbm_ttuc;		/**< Tx Tasks Utilization Counter*/
242	uint32_t fmbm_ttcquc;		/**< Tx Transmit conf Q util Counter*/
243	uint32_t fmbm_tduc;		/**< Tx DMA Utilization Counter*/
244	uint32_t fmbm_tfuc;		/**< Tx FIFO Utilization Counter*/
245};
246
247/** @Description   BMI O/H port register map */
248struct fman_port_oh_bmi_regs {
249	uint32_t fmbm_ocfg;		/**< O/H Configuration  */
250	uint32_t fmbm_ost;		/**< O/H Status */
251	uint32_t fmbm_oda;		/**< O/H DMA attributes  */
252	uint32_t fmbm_oicp;		/**< O/H Internal Context Parameters */
253	uint32_t fmbm_ofdne;		/**< O/H Frame Dequeue Next Engine  */
254	uint32_t fmbm_ofne;		/**< O/H Frame Next Engine  */
255	uint32_t fmbm_ofca;		/**< O/H Frame Command Attributes.  */
256	uint32_t fmbm_ofpne;		/**< O/H Frame Parser Next Engine  */
257	uint32_t fmbm_opso;		/**< O/H Parse Start Offset  */
258	uint32_t fmbm_opp;		/**< O/H Policer Profile */
259	uint32_t fmbm_occb;		/**< O/H Coarse Classification base */
260	uint32_t fmbm_oim;		/**< O/H Internal margins*/
261	uint32_t fmbm_ofp;		/**< O/H Fifo Parameters*/
262	uint32_t fmbm_ofed;		/**< O/H Frame End Data*/
263	uint32_t reserved0030[2];	/**< (0x038 - 0x03F) */
264	uint32_t fmbm_oprai[FMAN_PORT_PRS_RESULT_WORDS_NUM];
265				/**< O/H Parse Results Array Initialization  */
266	uint32_t fmbm_ofqid;		/**< O/H Frame Queue ID  */
267	uint32_t fmbm_oefqid;		/**< O/H Error Frame Queue ID  */
268	uint32_t fmbm_ofsdm;		/**< O/H Frame Status Discard Mask  */
269	uint32_t fmbm_ofsem;		/**< O/H Frame Status Error Mask  */
270	uint32_t fmbm_ofene;		/**< O/H Frame Enqueue Next Engine  */
271	uint32_t fmbm_orlmts;		/**< O/H Rate Limiter Scale  */
272	uint32_t fmbm_orlmt;		/**< O/H Rate Limiter  */
273	uint32_t fmbm_ocmne;		/**< O/H Continuous Mode Next Engine  */
274	uint32_t reserved0080[0x20];	/**< 0x080 - 0x0FF Reserved */
275	uint32_t fmbm_oebmpi[2];	/**< Buf Mngr Observed Pool Info */
276	uint32_t reserved0108[0x16];	/**< 0x108 - 0x15F Reserved */
277	uint32_t fmbm_ocgm[FMAN_PORT_CG_MAP_NUM]; /**< Observed Congestion Group Map */
278	uint32_t fmbm_ompd;		/**< Observed BMan Pool Depletion */
279	uint32_t reserved0184[0x1F];	/**< 0x184 - 0x1FF Reserved */
280	uint32_t fmbm_ostc;		/**< O/H Statistics Counters  */
281	uint32_t fmbm_ofrc;		/**< O/H Frame Counter  */
282	uint32_t fmbm_ofdc;		/**< O/H Frames Discard Counter  */
283	uint32_t fmbm_ofledc;		/**< O/H Frames Len Err Discard Cntr */
284	uint32_t fmbm_ofufdc;		/**< O/H Frames Unsprtd Discard Cutr  */
285	uint32_t fmbm_offc;		/**< O/H Filter Frames Counter  */
286	uint32_t fmbm_ofwdc;		/**< Rx Frames WRED Discard Counter  */
287	uint32_t fmbm_ofldec;		/**< O/H Frames List DMA Error Cntr */
288	uint32_t fmbm_obdc;		/**< O/H Buffers Deallocate Counter */
289	uint32_t reserved0218[0x17];	/**< (0x218 - 0x27F) */
290	uint32_t fmbm_opc;		/**< O/H Performance Counters  */
291	uint32_t fmbm_opcp;		/**< O/H Performance Count Parameters */
292	uint32_t fmbm_occn;		/**< O/H Cycle Counter  */
293	uint32_t fmbm_otuc;		/**< O/H Tasks Utilization Counter  */
294	uint32_t fmbm_oduc;		/**< O/H DMA Utilization Counter */
295	uint32_t fmbm_ofuc;		/**< O/H FIFO Utilization Counter */
296};
297
298/** @Description   BMI port register map */
299union fman_port_bmi_regs {
300	struct fman_port_rx_bmi_regs rx;
301	struct fman_port_tx_bmi_regs tx;
302	struct fman_port_oh_bmi_regs oh;
303};
304
305/** @Description   QMI port register map */
306struct fman_port_qmi_regs {
307	uint32_t fmqm_pnc;		/**< PortID n Configuration Register */
308	uint32_t fmqm_pns;		/**< PortID n Status Register */
309	uint32_t fmqm_pnts;		/**< PortID n Task Status Register */
310	uint32_t reserved00c[4];	/**< 0xn00C - 0xn01B */
311	uint32_t fmqm_pnen;		/**< PortID n Enqueue NIA Register */
312	uint32_t fmqm_pnetfc;		/**< PortID n Enq Total Frame Counter */
313	uint32_t reserved024[2];	/**< 0xn024 - 0x02B */
314	uint32_t fmqm_pndn;		/**< PortID n Dequeue NIA Register */
315	uint32_t fmqm_pndc;		/**< PortID n Dequeue Config Register */
316	uint32_t fmqm_pndtfc;		/**< PortID n Dequeue tot Frame cntr */
317	uint32_t fmqm_pndfdc;		/**< PortID n Dequeue FQID Dflt Cntr */
318	uint32_t fmqm_pndcc;		/**< PortID n Dequeue Confirm Counter */
319};
320
321
322enum fman_port_dma_swap {
323	E_FMAN_PORT_DMA_NO_SWAP,	/**< No swap, transfer data as is */
324	E_FMAN_PORT_DMA_SWAP_LE,
325	/**< The transferred data should be swapped in PPC Little Endian mode */
326	E_FMAN_PORT_DMA_SWAP_BE
327	/**< The transferred data should be swapped in Big Endian mode */
328};
329
330/* Default port color */
331enum fman_port_color {
332	E_FMAN_PORT_COLOR_GREEN,	/**< Default port color is green */
333	E_FMAN_PORT_COLOR_YELLOW,	/**< Default port color is yellow */
334	E_FMAN_PORT_COLOR_RED,		/**< Default port color is red */
335	E_FMAN_PORT_COLOR_OVERRIDE	/**< Ignore color */
336};
337
338/* QMI dequeue from the SP channel - types */
339enum fman_port_deq_type {
340	E_FMAN_PORT_DEQ_BY_PRI,
341	/**< Priority precedence and Intra-Class scheduling */
342	E_FMAN_PORT_DEQ_ACTIVE_FQ,
343	/**< Active FQ precedence and Intra-Class scheduling */
344	E_FMAN_PORT_DEQ_ACTIVE_FQ_NO_ICS
345	/**< Active FQ precedence and override Intra-Class scheduling */
346};
347
348/* QMI dequeue prefetch modes */
349enum fman_port_deq_prefetch {
350	E_FMAN_PORT_DEQ_NO_PREFETCH, /**< No prefetch mode */
351	E_FMAN_PORT_DEQ_PART_PREFETCH, /**< Partial prefetch mode */
352	E_FMAN_PORT_DEQ_FULL_PREFETCH /**< Full prefetch mode */
353};
354
355/* Parameters for defining performance counters behavior */
356struct fman_port_perf_cnt_params {
357	uint8_t task_val;	/**< Task compare value */
358	uint8_t queue_val;
359	/**< Rx or Tx conf queue compare value (unused for O/H ports) */
360	uint8_t dma_val;	/**< Dma compare value */
361	uint32_t fifo_val;	/**< Fifo compare value (in bytes) */
362};
363
364/** @Description   FM Port configuration structure, used at init */
365struct fman_port_cfg {
366	struct fman_port_perf_cnt_params perf_cnt_params;
367	/* BMI parameters */
368	enum fman_port_dma_swap		dma_swap_data;
369	bool				dma_ic_stash_on;
370	bool				dma_header_stash_on;
371	bool				dma_sg_stash_on;
372	bool				dma_write_optimize;
373	uint16_t			ic_ext_offset;
374	uint8_t				ic_int_offset;
375	uint16_t			ic_size;
376	enum fman_port_color		color;
377	bool				sync_req;
378	bool				discard_override;
379	uint8_t				checksum_bytes_ignore;
380	uint8_t				rx_cut_end_bytes;
381	uint32_t			rx_pri_elevation;
382	uint32_t			rx_fifo_thr;
383	uint8_t				rx_fd_bits;
384	uint8_t				int_buf_start_margin;
385	uint16_t			ext_buf_start_margin;
386	uint16_t			ext_buf_end_margin;
387	uint32_t			tx_fifo_min_level;
388	uint32_t			tx_fifo_low_comf_level;
389	uint8_t				tx_fifo_deq_pipeline_depth;
390	bool				stats_counters_enable;
391	bool				perf_counters_enable;
392	/* QMI parameters */
393	bool				deq_high_pri;
394	enum fman_port_deq_type		deq_type;
395	enum fman_port_deq_prefetch	deq_prefetch_opt;
396	uint16_t			deq_byte_cnt;
397	bool				queue_counters_enable;
398	bool				no_scatter_gather;
399	int				errata_A006675;
400	int				errata_A006320;
401	int				excessive_threshold_register;
402	int				fmbm_rebm_has_sgd;
403	int				fmbm_tfne_has_features;
404	int				qmi_deq_options_support;
405};
406
407enum fman_port_type {
408	E_FMAN_PORT_TYPE_OP = 0,
409	/**< Offline parsing port, shares id-s with
410	 * host command, so must have exclusive id-s */
411	E_FMAN_PORT_TYPE_RX,        /**< 1G Rx port */
412	E_FMAN_PORT_TYPE_RX_10G,    /**< 10G Rx port */
413	E_FMAN_PORT_TYPE_TX,        /**< 1G Tx port */
414	E_FMAN_PORT_TYPE_TX_10G,     /**< 10G Tx port */
415	E_FMAN_PORT_TYPE_DUMMY,
416	E_FMAN_PORT_TYPE_HC = E_FMAN_PORT_TYPE_DUMMY
417	/**< Host command port, shares id-s with
418	 * offline parsing ports, so must have exclusive id-s */
419};
420
421struct fman_port_params {
422	uint32_t discard_mask;
423	uint32_t err_mask;
424	uint32_t dflt_fqid;
425	uint32_t err_fqid;
426	uint8_t deq_sp;
427	bool dont_release_buf;
428};
429
430/* Port context - used by most API functions */
431struct fman_port {
432	enum fman_port_type type;
433	uint8_t fm_rev_maj;
434	uint8_t fm_rev_min;
435	union fman_port_bmi_regs *bmi_regs;
436	struct fman_port_qmi_regs *qmi_regs;
437	bool im_en;
438	uint8_t ext_pools_num;
439};
440
441/** @Description   External buffer pools configuration */
442struct fman_port_bpools {
443	uint8_t	count;			/**< Num of pools to set up */
444	bool	counters_enable;	/**< Enable allocate counters */
445	uint8_t grp_bp_depleted_num;
446	/**< Number of depleted pools - if reached the BMI indicates
447	 * the MAC to send a pause frame */
448	struct {
449		uint8_t		bpid;	/**< BM pool ID */
450		uint16_t	size;
451		/**< Pool's size - must be in ascending order */
452		bool		is_backup;
453		/**< If this is a backup pool */
454		bool		grp_bp_depleted;
455		/**< Consider this buffer in multiple pools depletion criteria*/
456		bool		single_bp_depleted;
457		/**< Consider this buffer in single pool depletion criteria */
458		bool		pfc_priorities_en;
459	} bpool[FMAN_PORT_MAX_EXT_POOLS_NUM];
460};
461
462enum fman_port_rate_limiter_scale_down {
463	E_FMAN_PORT_RATE_DOWN_NONE,
464	E_FMAN_PORT_RATE_DOWN_BY_2,
465	E_FMAN_PORT_RATE_DOWN_BY_4,
466	E_FMAN_PORT_RATE_DOWN_BY_8
467};
468
469/* Rate limiter configuration */
470struct fman_port_rate_limiter {
471	uint8_t		count_1micro_bit;
472	bool		high_burst_size_gran;
473	/**< Defines burst_size granularity for OP ports; when TRUE,
474	 * burst_size below counts in frames, otherwise in 10^3 frames */
475	uint16_t	burst_size;
476	/**< Max burst size, in KBytes for Tx port, according to
477	 * high_burst_size_gran definition for OP port */
478	uint32_t	rate;
479	/**< In Kbps for Tx port, in frames/sec for OP port */
480	enum fman_port_rate_limiter_scale_down rate_factor;
481};
482
483/* BMI statistics counters */
484enum fman_port_stats_counters {
485	E_FMAN_PORT_STATS_CNT_FRAME,
486	/**< Number of processed frames; valid for all ports */
487	E_FMAN_PORT_STATS_CNT_DISCARD,
488	/**< For Rx ports - frames discarded by QMAN, for Tx or O/H ports -
489	 * frames discarded due to DMA error; valid for all ports */
490	E_FMAN_PORT_STATS_CNT_DEALLOC_BUF,
491	/**< Number of buffer deallocate operations; valid for all ports */
492	E_FMAN_PORT_STATS_CNT_RX_BAD_FRAME,
493	/**< Number of bad Rx frames, like CRC error, Rx FIFO overflow etc;
494	 * valid for Rx ports only */
495	E_FMAN_PORT_STATS_CNT_RX_LARGE_FRAME,
496	/**< Number of Rx oversized frames, that is frames exceeding max frame
497	 * size configured for the corresponding ETH controller;
498	 * valid for Rx ports only */
499	E_FMAN_PORT_STATS_CNT_RX_OUT_OF_BUF,
500	/**< Frames discarded due to lack of external buffers; valid for
501	 * Rx ports only */
502	E_FMAN_PORT_STATS_CNT_LEN_ERR,
503	/**< Frames discarded due to frame length error; valid for Tx and
504	 * O/H ports only */
505	E_FMAN_PORT_STATS_CNT_UNSUPPORTED_FORMAT,
506	/**< Frames discarded due to unsupported FD format; valid for Tx
507	 * and O/H ports only */
508	E_FMAN_PORT_STATS_CNT_FILTERED_FRAME,
509	/**< Number of frames filtered out by PCD module; valid for
510	 * Rx and OP ports only */
511	E_FMAN_PORT_STATS_CNT_DMA_ERR,
512	/**< Frames rejected by QMAN that were not able to release their
513	 * buffers due to DMA error; valid for Rx and O/H ports only */
514	E_FMAN_PORT_STATS_CNT_WRED_DISCARD
515	/**< Frames going through O/H port that were not able to to enter the
516	 * return queue due to WRED algorithm; valid for O/H ports only */
517};
518
519/* BMI performance counters */
520enum fman_port_perf_counters {
521	E_FMAN_PORT_PERF_CNT_CYCLE,	/**< Cycle counter */
522	E_FMAN_PORT_PERF_CNT_TASK_UTIL,	/**< Tasks utilization counter */
523	E_FMAN_PORT_PERF_CNT_QUEUE_UTIL,
524	/**< For Rx ports - Rx queue utilization, for Tx ports - Tx conf queue
525	 * utilization; not valid for O/H ports */
526	E_FMAN_PORT_PERF_CNT_DMA_UTIL,	/**< DMA utilization counter */
527	E_FMAN_PORT_PERF_CNT_FIFO_UTIL,	/**< FIFO utilization counter */
528	E_FMAN_PORT_PERF_CNT_RX_PAUSE
529	/**< Number of cycles in which Rx pause activation control is on;
530	 * valid for Rx ports only */
531};
532
533/* QMI counters */
534enum fman_port_qmi_counters {
535	E_FMAN_PORT_ENQ_TOTAL,	/**< EnQ tot frame cntr */
536	E_FMAN_PORT_DEQ_TOTAL,	/**< DeQ tot frame cntr; invalid for Rx ports */
537	E_FMAN_PORT_DEQ_FROM_DFLT,
538	/**< Dequeue from default FQID counter not valid for Rx ports */
539	E_FMAN_PORT_DEQ_CONFIRM	/**< DeQ confirm cntr invalid for Rx ports */
540};
541
542
543/** @Collection    FM Port API */
544void fman_port_defconfig(struct fman_port_cfg *cfg, enum fman_port_type type);
545int fman_port_init(struct fman_port *port,
546		struct fman_port_cfg *cfg,
547		struct fman_port_params *params);
548int fman_port_enable(struct fman_port *port);
549int fman_port_disable(const struct fman_port *port);
550int fman_port_set_bpools(const struct fman_port *port,
551		const struct fman_port_bpools *bp);
552int fman_port_set_rate_limiter(struct fman_port *port,
553		struct fman_port_rate_limiter *rate_limiter);
554int fman_port_delete_rate_limiter(struct fman_port *port);
555int fman_port_set_err_mask(struct fman_port *port, uint32_t err_mask);
556int fman_port_set_discard_mask(struct fman_port *port, uint32_t discard_mask);
557int fman_port_modify_rx_fd_bits(struct fman_port *port,
558		uint8_t rx_fd_bits,
559		bool add);
560int fman_port_set_perf_cnt_params(struct fman_port *port,
561		struct fman_port_perf_cnt_params *params);
562int fman_port_set_stats_cnt_mode(struct fman_port *port, bool enable);
563int fman_port_set_perf_cnt_mode(struct fman_port *port, bool enable);
564int fman_port_set_queue_cnt_mode(struct fman_port *port, bool enable);
565int fman_port_set_bpool_cnt_mode(struct fman_port *port,
566		uint8_t bpid,
567		bool enable);
568uint32_t fman_port_get_stats_counter(struct fman_port *port,
569		enum fman_port_stats_counters counter);
570void fman_port_set_stats_counter(struct fman_port *port,
571		enum fman_port_stats_counters counter,
572		uint32_t value);
573uint32_t fman_port_get_perf_counter(struct fman_port *port,
574		enum fman_port_perf_counters counter);
575void fman_port_set_perf_counter(struct fman_port *port,
576		enum fman_port_perf_counters counter,
577		uint32_t value);
578uint32_t fman_port_get_qmi_counter(struct fman_port *port,
579		enum fman_port_qmi_counters counter);
580void fman_port_set_qmi_counter(struct fman_port *port,
581		enum fman_port_qmi_counters counter,
582		uint32_t value);
583uint32_t fman_port_get_bpool_counter(struct fman_port *port, uint8_t bpid);
584void fman_port_set_bpool_counter(struct fman_port *port,
585		uint8_t bpid,
586		uint32_t value);
587int fman_port_add_congestion_grps(struct fman_port *port,
588		uint32_t grps_map[FMAN_PORT_CG_MAP_NUM]);
589int fman_port_remove_congestion_grps(struct fman_port  *port,
590		uint32_t grps_map[FMAN_PORT_CG_MAP_NUM]);
591
592
593#endif /* __FSL_FMAN_PORT_H */
594