]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/contrib/ncsw/inc/flib/fsl_fman_port.h
MFV r328323,328324:
[FreeBSD/FreeBSD.git] / sys / contrib / ncsw / inc / flib / fsl_fman_port.h
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 */
151 struct 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 */
211 struct 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 */
248 struct 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 */
299 union 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 */
306 struct 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
322 enum 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 */
331 enum 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 */
339 enum 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 */
349 enum 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 */
356 struct 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 */
365 struct 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
407 enum 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
421 struct 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 */
431 struct 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 */
442 struct 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
462 enum 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 */
470 struct 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 */
484 enum 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 */
520 enum 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 */
534 enum 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 */
544 void fman_port_defconfig(struct fman_port_cfg *cfg, enum fman_port_type type);
545 int fman_port_init(struct fman_port *port,
546                 struct fman_port_cfg *cfg,
547                 struct fman_port_params *params);
548 int fman_port_enable(struct fman_port *port);
549 int fman_port_disable(const struct fman_port *port);
550 int fman_port_set_bpools(const struct fman_port *port,
551                 const struct fman_port_bpools *bp);
552 int fman_port_set_rate_limiter(struct fman_port *port,
553                 struct fman_port_rate_limiter *rate_limiter);
554 int fman_port_delete_rate_limiter(struct fman_port *port);
555 int fman_port_set_err_mask(struct fman_port *port, uint32_t err_mask);
556 int fman_port_set_discard_mask(struct fman_port *port, uint32_t discard_mask);
557 int fman_port_modify_rx_fd_bits(struct fman_port *port,
558                 uint8_t rx_fd_bits,
559                 bool add);
560 int fman_port_set_perf_cnt_params(struct fman_port *port,
561                 struct fman_port_perf_cnt_params *params);
562 int fman_port_set_stats_cnt_mode(struct fman_port *port, bool enable);
563 int fman_port_set_perf_cnt_mode(struct fman_port *port, bool enable);
564 int fman_port_set_queue_cnt_mode(struct fman_port *port, bool enable);
565 int fman_port_set_bpool_cnt_mode(struct fman_port *port,
566                 uint8_t bpid,
567                 bool enable);
568 uint32_t fman_port_get_stats_counter(struct fman_port *port,
569                 enum fman_port_stats_counters counter);
570 void fman_port_set_stats_counter(struct fman_port *port,
571                 enum fman_port_stats_counters counter,
572                 uint32_t value);
573 uint32_t fman_port_get_perf_counter(struct fman_port *port,
574                 enum fman_port_perf_counters counter);
575 void fman_port_set_perf_counter(struct fman_port *port,
576                 enum fman_port_perf_counters counter,
577                 uint32_t value);
578 uint32_t fman_port_get_qmi_counter(struct fman_port *port,
579                 enum fman_port_qmi_counters counter);
580 void fman_port_set_qmi_counter(struct fman_port *port,
581                 enum fman_port_qmi_counters counter,
582                 uint32_t value);
583 uint32_t fman_port_get_bpool_counter(struct fman_port *port, uint8_t bpid);
584 void fman_port_set_bpool_counter(struct fman_port *port,
585                 uint8_t bpid,
586                 uint32_t value);
587 int fman_port_add_congestion_grps(struct fman_port *port,
588                 uint32_t grps_map[FMAN_PORT_CG_MAP_NUM]);
589 int 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 */