source: rtems-libbsd/linux/drivers/net/ethernet/freescale/fman/fman.c @ cf40770

55-freebsd-126-freebsd-12
Last change on this file since cf40770 was cf40770, checked in by Sebastian Huber <sebastian.huber@…>, on 05/18/17 at 05:27:33

Linux update to 4.12-rc1+

Linux baseline b23afd384801711ab6dbccd259cc14cb09a1dcaf.

  • Property mode set to 100644
File size: 89.8 KB
Line 
1#include <machine/rtems-bsd-kernel-space.h>
2
3#include <rtems/bsd/local/opt_dpaa.h>
4
5/*
6 * Copyright 2008-2015 Freescale Semiconductor Inc.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 *     * Redistributions of source code must retain the above copyright
11 *       notice, this list of conditions and the following disclaimer.
12 *     * Redistributions in binary form must reproduce the above copyright
13 *       notice, this list of conditions and the following disclaimer in the
14 *       documentation and/or other materials provided with the distribution.
15 *     * Neither the name of Freescale Semiconductor nor the
16 *       names of its contributors may be used to endorse or promote products
17 *       derived from this software without specific prior written permission.
18 *
19 *
20 * ALTERNATIVELY, this software may be distributed under the terms of the
21 * GNU General Public License ("GPL") as published by the Free Software
22 * Foundation, either version 2 of that License or (at your option) any
23 * later version.
24 *
25 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
26 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
27 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
29 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
32 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 */
36
37#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
38
39#include "fman.h"
40#include "fman_muram.h"
41
42#include <linux/fsl/guts.h>
43#include <linux/slab.h>
44#include <linux/delay.h>
45#include <linux/module.h>
46#include <linux/of_platform.h>
47#include <linux/clk.h>
48#include <linux/of_address.h>
49#include <linux/of_irq.h>
50#include <linux/interrupt.h>
51#include <linux/libfdt_env.h>
52#ifdef __rtems__
53#include <bsp/fdt.h>
54#include <bsp/qoriq.h>
55#endif /* __rtems__ */
56
57/* General defines */
58#define FMAN_LIODN_TBL                  64      /* size of LIODN table */
59#define MAX_NUM_OF_MACS                 10
60#define FM_NUM_OF_FMAN_CTRL_EVENT_REGS  4
61#define BASE_RX_PORTID                  0x08
62#define BASE_TX_PORTID                  0x28
63
64/* Modules registers offsets */
65#define BMI_OFFSET              0x00080000
66#define QMI_OFFSET              0x00080400
67#define DMA_OFFSET              0x000C2000
68#define FPM_OFFSET              0x000C3000
69#define IMEM_OFFSET             0x000C4000
70#define HWP_OFFSET              0x000C7000
71#define CGP_OFFSET              0x000DB000
72
73/* Exceptions bit map */
74#define EX_DMA_BUS_ERROR                0x80000000
75#define EX_DMA_READ_ECC                 0x40000000
76#define EX_DMA_SYSTEM_WRITE_ECC 0x20000000
77#define EX_DMA_FM_WRITE_ECC             0x10000000
78#define EX_FPM_STALL_ON_TASKS           0x08000000
79#define EX_FPM_SINGLE_ECC               0x04000000
80#define EX_FPM_DOUBLE_ECC               0x02000000
81#define EX_QMI_SINGLE_ECC               0x01000000
82#define EX_QMI_DEQ_FROM_UNKNOWN_PORTID  0x00800000
83#define EX_QMI_DOUBLE_ECC               0x00400000
84#define EX_BMI_LIST_RAM_ECC             0x00200000
85#define EX_BMI_STORAGE_PROFILE_ECC      0x00100000
86#define EX_BMI_STATISTICS_RAM_ECC       0x00080000
87#define EX_IRAM_ECC                     0x00040000
88#define EX_MURAM_ECC                    0x00020000
89#define EX_BMI_DISPATCH_RAM_ECC 0x00010000
90#define EX_DMA_SINGLE_PORT_ECC          0x00008000
91
92/* DMA defines */
93/* masks */
94#define DMA_MODE_BER                    0x00200000
95#define DMA_MODE_ECC                    0x00000020
96#define DMA_MODE_SECURE_PROT            0x00000800
97#define DMA_MODE_AXI_DBG_MASK           0x0F000000
98
99#define DMA_TRANSFER_PORTID_MASK        0xFF000000
100#define DMA_TRANSFER_TNUM_MASK          0x00FF0000
101#define DMA_TRANSFER_LIODN_MASK 0x00000FFF
102
103#define DMA_STATUS_BUS_ERR              0x08000000
104#define DMA_STATUS_READ_ECC             0x04000000
105#define DMA_STATUS_SYSTEM_WRITE_ECC     0x02000000
106#define DMA_STATUS_FM_WRITE_ECC 0x01000000
107#define DMA_STATUS_FM_SPDAT_ECC 0x00080000
108
109#define DMA_MODE_CACHE_OR_SHIFT         30
110#define DMA_MODE_AXI_DBG_SHIFT                  24
111#define DMA_MODE_CEN_SHIFT                      13
112#define DMA_MODE_CEN_MASK                       0x00000007
113#define DMA_MODE_DBG_SHIFT                      7
114#define DMA_MODE_AID_MODE_SHIFT         4
115
116#define DMA_THRESH_COMMQ_SHIFT                  24
117#define DMA_THRESH_READ_INT_BUF_SHIFT           16
118#define DMA_THRESH_READ_INT_BUF_MASK            0x0000003f
119#define DMA_THRESH_WRITE_INT_BUF_MASK           0x0000003f
120
121#define DMA_TRANSFER_PORTID_SHIFT               24
122#define DMA_TRANSFER_TNUM_SHIFT         16
123
124#define DMA_CAM_SIZEOF_ENTRY                    0x40
125#define DMA_CAM_UNITS                           8
126
127#define DMA_LIODN_SHIFT         16
128#define DMA_LIODN_BASE_MASK     0x00000FFF
129
130/* FPM defines */
131#define FPM_EV_MASK_DOUBLE_ECC          0x80000000
132#define FPM_EV_MASK_STALL               0x40000000
133#define FPM_EV_MASK_SINGLE_ECC          0x20000000
134#define FPM_EV_MASK_RELEASE_FM          0x00010000
135#define FPM_EV_MASK_DOUBLE_ECC_EN       0x00008000
136#define FPM_EV_MASK_STALL_EN            0x00004000
137#define FPM_EV_MASK_SINGLE_ECC_EN       0x00002000
138#define FPM_EV_MASK_EXTERNAL_HALT       0x00000008
139#define FPM_EV_MASK_ECC_ERR_HALT        0x00000004
140
141#define FPM_RAM_MURAM_ECC               0x00008000
142#define FPM_RAM_IRAM_ECC                0x00004000
143#define FPM_IRAM_ECC_ERR_EX_EN          0x00020000
144#define FPM_MURAM_ECC_ERR_EX_EN 0x00040000
145#define FPM_RAM_IRAM_ECC_EN             0x40000000
146#define FPM_RAM_RAMS_ECC_EN             0x80000000
147#define FPM_RAM_RAMS_ECC_EN_SRC_SEL     0x08000000
148
149#define FPM_REV1_MAJOR_MASK             0x0000FF00
150#define FPM_REV1_MINOR_MASK             0x000000FF
151
152#define FPM_DISP_LIMIT_SHIFT            24
153
154#define FPM_PRT_FM_CTL1                 0x00000001
155#define FPM_PRT_FM_CTL2                 0x00000002
156#define FPM_PORT_FM_CTL_PORTID_SHIFT    24
157#define FPM_PRC_ORA_FM_CTL_SEL_SHIFT    16
158
159#define FPM_THR1_PRS_SHIFT              24
160#define FPM_THR1_KG_SHIFT               16
161#define FPM_THR1_PLCR_SHIFT             8
162#define FPM_THR1_BMI_SHIFT              0
163
164#define FPM_THR2_QMI_ENQ_SHIFT          24
165#define FPM_THR2_QMI_DEQ_SHIFT          0
166#define FPM_THR2_FM_CTL1_SHIFT          16
167#define FPM_THR2_FM_CTL2_SHIFT          8
168
169#define FPM_EV_MASK_CAT_ERR_SHIFT       1
170#define FPM_EV_MASK_DMA_ERR_SHIFT       0
171
172#define FPM_REV1_MAJOR_SHIFT            8
173
174#define FPM_RSTC_FM_RESET               0x80000000
175#define FPM_RSTC_MAC0_RESET             0x40000000
176#define FPM_RSTC_MAC1_RESET             0x20000000
177#define FPM_RSTC_MAC2_RESET             0x10000000
178#define FPM_RSTC_MAC3_RESET             0x08000000
179#define FPM_RSTC_MAC8_RESET             0x04000000
180#define FPM_RSTC_MAC4_RESET             0x02000000
181#define FPM_RSTC_MAC5_RESET             0x01000000
182#define FPM_RSTC_MAC6_RESET             0x00800000
183#define FPM_RSTC_MAC7_RESET             0x00400000
184#define FPM_RSTC_MAC9_RESET             0x00200000
185
186#define FPM_TS_INT_SHIFT                16
187#define FPM_TS_CTL_EN                   0x80000000
188
189/* BMI defines */
190#define BMI_INIT_START                          0x80000000
191#define BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC     0x80000000
192#define BMI_ERR_INTR_EN_LIST_RAM_ECC            0x40000000
193#define BMI_ERR_INTR_EN_STATISTICS_RAM_ECC      0x20000000
194#define BMI_ERR_INTR_EN_DISPATCH_RAM_ECC        0x10000000
195#define BMI_NUM_OF_TASKS_MASK                   0x3F000000
196#define BMI_NUM_OF_EXTRA_TASKS_MASK             0x000F0000
197#define BMI_NUM_OF_DMAS_MASK                    0x00000F00
198#define BMI_NUM_OF_EXTRA_DMAS_MASK              0x0000000F
199#define BMI_FIFO_SIZE_MASK                      0x000003FF
200#define BMI_EXTRA_FIFO_SIZE_MASK                0x03FF0000
201#define BMI_CFG2_DMAS_MASK                      0x0000003F
202#define BMI_CFG2_TASKS_MASK                     0x0000003F
203
204#define BMI_CFG2_TASKS_SHIFT            16
205#define BMI_CFG2_DMAS_SHIFT             0
206#define BMI_CFG1_FIFO_SIZE_SHIFT        16
207#define BMI_NUM_OF_TASKS_SHIFT          24
208#define BMI_EXTRA_NUM_OF_TASKS_SHIFT    16
209#define BMI_NUM_OF_DMAS_SHIFT           8
210#define BMI_EXTRA_NUM_OF_DMAS_SHIFT     0
211
212#define BMI_FIFO_ALIGN                  0x100
213
214#define BMI_EXTRA_FIFO_SIZE_SHIFT       16
215
216/* QMI defines */
217#define QMI_CFG_ENQ_EN                  0x80000000
218#define QMI_CFG_DEQ_EN                  0x40000000
219#define QMI_CFG_EN_COUNTERS             0x10000000
220#define QMI_CFG_DEQ_MASK                0x0000003F
221#define QMI_CFG_ENQ_MASK                0x00003F00
222#define QMI_CFG_ENQ_SHIFT               8
223
224#define QMI_ERR_INTR_EN_DOUBLE_ECC      0x80000000
225#define QMI_ERR_INTR_EN_DEQ_FROM_DEF    0x40000000
226#define QMI_INTR_EN_SINGLE_ECC          0x80000000
227
228#define QMI_GS_HALT_NOT_BUSY            0x00000002
229
230/* HWP defines */
231#define HWP_RPIMAC_PEN                  0x00000001
232
233/* IRAM defines */
234#define IRAM_IADD_AIE                   0x80000000
235#define IRAM_READY                      0x80000000
236
237/* Default values */
238#define DEFAULT_CATASTROPHIC_ERR                0
239#define DEFAULT_DMA_ERR                         0
240#define DEFAULT_AID_MODE                        FMAN_DMA_AID_OUT_TNUM
241#define DEFAULT_DMA_COMM_Q_LOW                  0x2A
242#define DEFAULT_DMA_COMM_Q_HIGH         0x3F
243#define DEFAULT_CACHE_OVERRIDE                  0
244#define DEFAULT_DMA_CAM_NUM_OF_ENTRIES          64
245#define DEFAULT_DMA_DBG_CNT_MODE                0
246#define DEFAULT_DMA_SOS_EMERGENCY               0
247#define DEFAULT_DMA_WATCHDOG                    0
248#define DEFAULT_DISP_LIMIT                      0
249#define DEFAULT_PRS_DISP_TH                     16
250#define DEFAULT_PLCR_DISP_TH                    16
251#define DEFAULT_KG_DISP_TH                      16
252#define DEFAULT_BMI_DISP_TH                     16
253#define DEFAULT_QMI_ENQ_DISP_TH         16
254#define DEFAULT_QMI_DEQ_DISP_TH         16
255#define DEFAULT_FM_CTL1_DISP_TH         16
256#define DEFAULT_FM_CTL2_DISP_TH         16
257
258#define DFLT_AXI_DBG_NUM_OF_BEATS               1
259
260#define DFLT_DMA_READ_INT_BUF_LOW(dma_thresh_max_buf)   \
261        ((dma_thresh_max_buf + 1) / 2)
262#define DFLT_DMA_READ_INT_BUF_HIGH(dma_thresh_max_buf)  \
263        ((dma_thresh_max_buf + 1) * 3 / 4)
264#define DFLT_DMA_WRITE_INT_BUF_LOW(dma_thresh_max_buf)  \
265        ((dma_thresh_max_buf + 1) / 2)
266#define DFLT_DMA_WRITE_INT_BUF_HIGH(dma_thresh_max_buf)\
267        ((dma_thresh_max_buf + 1) * 3 / 4)
268
269#define DMA_COMM_Q_LOW_FMAN_V3          0x2A
270#define DMA_COMM_Q_LOW_FMAN_V2(dma_thresh_max_commq)            \
271        ((dma_thresh_max_commq + 1) / 2)
272#define DFLT_DMA_COMM_Q_LOW(major, dma_thresh_max_commq)        \
273        ((major == 6) ? DMA_COMM_Q_LOW_FMAN_V3 :                \
274        DMA_COMM_Q_LOW_FMAN_V2(dma_thresh_max_commq))
275
276#define DMA_COMM_Q_HIGH_FMAN_V3 0x3f
277#define DMA_COMM_Q_HIGH_FMAN_V2(dma_thresh_max_commq)           \
278        ((dma_thresh_max_commq + 1) * 3 / 4)
279#define DFLT_DMA_COMM_Q_HIGH(major, dma_thresh_max_commq)       \
280        ((major == 6) ? DMA_COMM_Q_HIGH_FMAN_V3 :               \
281        DMA_COMM_Q_HIGH_FMAN_V2(dma_thresh_max_commq))
282
283#define TOTAL_NUM_OF_TASKS_FMAN_V3L     59
284#define TOTAL_NUM_OF_TASKS_FMAN_V3H     124
285#define DFLT_TOTAL_NUM_OF_TASKS(major, minor, bmi_max_num_of_tasks)     \
286        ((major == 6) ? ((minor == 1 || minor == 4) ?                   \
287        TOTAL_NUM_OF_TASKS_FMAN_V3L : TOTAL_NUM_OF_TASKS_FMAN_V3H) :    \
288        bmi_max_num_of_tasks)
289
290#define DMA_CAM_NUM_OF_ENTRIES_FMAN_V3          64
291#define DMA_CAM_NUM_OF_ENTRIES_FMAN_V2          32
292#define DFLT_DMA_CAM_NUM_OF_ENTRIES(major)                      \
293        (major == 6 ? DMA_CAM_NUM_OF_ENTRIES_FMAN_V3 :          \
294        DMA_CAM_NUM_OF_ENTRIES_FMAN_V2)
295
296#define FM_TIMESTAMP_1_USEC_BIT             8
297
298/* Defines used for enabling/disabling FMan interrupts */
299#define ERR_INTR_EN_DMA         0x00010000
300#define ERR_INTR_EN_FPM         0x80000000
301#define ERR_INTR_EN_BMI         0x00800000
302#define ERR_INTR_EN_QMI         0x00400000
303#define ERR_INTR_EN_MURAM       0x00040000
304#define ERR_INTR_EN_MAC0        0x00004000
305#define ERR_INTR_EN_MAC1        0x00002000
306#define ERR_INTR_EN_MAC2        0x00001000
307#define ERR_INTR_EN_MAC3        0x00000800
308#define ERR_INTR_EN_MAC4        0x00000400
309#define ERR_INTR_EN_MAC5        0x00000200
310#define ERR_INTR_EN_MAC6        0x00000100
311#define ERR_INTR_EN_MAC7        0x00000080
312#define ERR_INTR_EN_MAC8        0x00008000
313#define ERR_INTR_EN_MAC9        0x00000040
314
315#define INTR_EN_QMI             0x40000000
316#define INTR_EN_MAC0            0x00080000
317#define INTR_EN_MAC1            0x00040000
318#define INTR_EN_MAC2            0x00020000
319#define INTR_EN_MAC3            0x00010000
320#define INTR_EN_MAC4            0x00000040
321#define INTR_EN_MAC5            0x00000020
322#define INTR_EN_MAC6            0x00000008
323#define INTR_EN_MAC7            0x00000002
324#define INTR_EN_MAC8            0x00200000
325#define INTR_EN_MAC9            0x00100000
326#define INTR_EN_REV0            0x00008000
327#define INTR_EN_REV1            0x00004000
328#define INTR_EN_REV2            0x00002000
329#define INTR_EN_REV3            0x00001000
330#define INTR_EN_TMR             0x01000000
331
332enum fman_dma_aid_mode {
333        FMAN_DMA_AID_OUT_PORT_ID = 0,             /* 4 LSB of PORT_ID */
334        FMAN_DMA_AID_OUT_TNUM                     /* 4 LSB of TNUM */
335};
336
337struct fman_iram_regs {
338        u32 iadd;       /* FM IRAM instruction address register */
339        u32 idata;      /* FM IRAM instruction data register */
340        u32 itcfg;      /* FM IRAM timing config register */
341        u32 iready;     /* FM IRAM ready register */
342};
343
344struct fman_fpm_regs {
345        u32 fmfp_tnc;           /* FPM TNUM Control 0x00 */
346        u32 fmfp_prc;           /* FPM Port_ID FmCtl Association 0x04 */
347        u32 fmfp_brkc;          /* FPM Breakpoint Control 0x08 */
348        u32 fmfp_mxd;           /* FPM Flush Control 0x0c */
349        u32 fmfp_dist1;         /* FPM Dispatch Thresholds1 0x10 */
350        u32 fmfp_dist2;         /* FPM Dispatch Thresholds2 0x14 */
351        u32 fm_epi;             /* FM Error Pending Interrupts 0x18 */
352        u32 fm_rie;             /* FM Error Interrupt Enable 0x1c */
353        u32 fmfp_fcev[4];       /* FPM FMan-Controller Event 1-4 0x20-0x2f */
354        u32 res0030[4];         /* res 0x30 - 0x3f */
355        u32 fmfp_cee[4];        /* PM FMan-Controller Event 1-4 0x40-0x4f */
356        u32 res0050[4];         /* res 0x50-0x5f */
357        u32 fmfp_tsc1;          /* FPM TimeStamp Control1 0x60 */
358        u32 fmfp_tsc2;          /* FPM TimeStamp Control2 0x64 */
359        u32 fmfp_tsp;           /* FPM Time Stamp 0x68 */
360        u32 fmfp_tsf;           /* FPM Time Stamp Fraction 0x6c */
361        u32 fm_rcr;             /* FM Rams Control 0x70 */
362        u32 fmfp_extc;          /* FPM External Requests Control 0x74 */
363        u32 fmfp_ext1;          /* FPM External Requests Config1 0x78 */
364        u32 fmfp_ext2;          /* FPM External Requests Config2 0x7c */
365        u32 fmfp_drd[16];       /* FPM Data_Ram Data 0-15 0x80 - 0xbf */
366        u32 fmfp_dra;           /* FPM Data Ram Access 0xc0 */
367        u32 fm_ip_rev_1;        /* FM IP Block Revision 1 0xc4 */
368        u32 fm_ip_rev_2;        /* FM IP Block Revision 2 0xc8 */
369        u32 fm_rstc;            /* FM Reset Command 0xcc */
370        u32 fm_cld;             /* FM Classifier Debug 0xd0 */
371        u32 fm_npi;             /* FM Normal Pending Interrupts 0xd4 */
372        u32 fmfp_exte;          /* FPM External Requests Enable 0xd8 */
373        u32 fmfp_ee;            /* FPM Event&Mask 0xdc */
374        u32 fmfp_cev[4];        /* FPM CPU Event 1-4 0xe0-0xef */
375        u32 res00f0[4];         /* res 0xf0-0xff */
376        u32 fmfp_ps[50];        /* FPM Port Status 0x100-0x1c7 */
377        u32 res01c8[14];        /* res 0x1c8-0x1ff */
378        u32 fmfp_clfabc;        /* FPM CLFABC 0x200 */
379        u32 fmfp_clfcc;         /* FPM CLFCC 0x204 */
380        u32 fmfp_clfaval;       /* FPM CLFAVAL 0x208 */
381        u32 fmfp_clfbval;       /* FPM CLFBVAL 0x20c */
382        u32 fmfp_clfcval;       /* FPM CLFCVAL 0x210 */
383        u32 fmfp_clfamsk;       /* FPM CLFAMSK 0x214 */
384        u32 fmfp_clfbmsk;       /* FPM CLFBMSK 0x218 */
385        u32 fmfp_clfcmsk;       /* FPM CLFCMSK 0x21c */
386        u32 fmfp_clfamc;        /* FPM CLFAMC 0x220 */
387        u32 fmfp_clfbmc;        /* FPM CLFBMC 0x224 */
388        u32 fmfp_clfcmc;        /* FPM CLFCMC 0x228 */
389        u32 fmfp_decceh;        /* FPM DECCEH 0x22c */
390        u32 res0230[116];       /* res 0x230 - 0x3ff */
391        u32 fmfp_ts[128];       /* 0x400: FPM Task Status 0x400 - 0x5ff */
392        u32 res0600[0x400 - 384];
393};
394
395struct fman_bmi_regs {
396        u32 fmbm_init;          /* BMI Initialization 0x00 */
397        u32 fmbm_cfg1;          /* BMI Configuration 1 0x04 */
398        u32 fmbm_cfg2;          /* BMI Configuration 2 0x08 */
399        u32 res000c[5];         /* 0x0c - 0x1f */
400        u32 fmbm_ievr;          /* Interrupt Event Register 0x20 */
401        u32 fmbm_ier;           /* Interrupt Enable Register 0x24 */
402        u32 fmbm_ifr;           /* Interrupt Force Register 0x28 */
403        u32 res002c[5];         /* 0x2c - 0x3f */
404        u32 fmbm_arb[8];        /* BMI Arbitration 0x40 - 0x5f */
405        u32 res0060[12];        /* 0x60 - 0x8f */
406        u32 fmbm_dtc[3];        /* Debug Trap Counter 0x90 - 0x9b */
407        u32 res009c;            /* 0x9c */
408        u32 fmbm_dcv[3][4];     /* Debug Compare val 0xa0-0xcf */
409        u32 fmbm_dcm[3][4];     /* Debug Compare Mask 0xd0-0xff */
410        u32 fmbm_gde;           /* BMI Global Debug Enable 0x100 */
411        u32 fmbm_pp[63];        /* BMI Port Parameters 0x104 - 0x1ff */
412        u32 res0200;            /* 0x200 */
413        u32 fmbm_pfs[63];       /* BMI Port FIFO Size 0x204 - 0x2ff */
414        u32 res0300;            /* 0x300 */
415        u32 fmbm_spliodn[63];   /* Port Partition ID 0x304 - 0x3ff */
416};
417
418struct fman_qmi_regs {
419        u32 fmqm_gc;            /* General Configuration Register 0x00 */
420        u32 res0004;            /* 0x04 */
421        u32 fmqm_eie;           /* Error Interrupt Event Register 0x08 */
422        u32 fmqm_eien;          /* Error Interrupt Enable Register 0x0c */
423        u32 fmqm_eif;           /* Error Interrupt Force Register 0x10 */
424        u32 fmqm_ie;            /* Interrupt Event Register 0x14 */
425        u32 fmqm_ien;           /* Interrupt Enable Register 0x18 */
426        u32 fmqm_if;            /* Interrupt Force Register 0x1c */
427        u32 fmqm_gs;            /* Global Status Register 0x20 */
428        u32 fmqm_ts;            /* Task Status Register 0x24 */
429        u32 fmqm_etfc;          /* Enqueue Total Frame Counter 0x28 */
430        u32 fmqm_dtfc;          /* Dequeue Total Frame Counter 0x2c */
431        u32 fmqm_dc0;           /* Dequeue Counter 0 0x30 */
432        u32 fmqm_dc1;           /* Dequeue Counter 1 0x34 */
433        u32 fmqm_dc2;           /* Dequeue Counter 2 0x38 */
434        u32 fmqm_dc3;           /* Dequeue Counter 3 0x3c */
435        u32 fmqm_dfdc;          /* Dequeue FQID from Default Counter 0x40 */
436        u32 fmqm_dfcc;          /* Dequeue FQID from Context Counter 0x44 */
437        u32 fmqm_dffc;          /* Dequeue FQID from FD Counter 0x48 */
438        u32 fmqm_dcc;           /* Dequeue Confirm Counter 0x4c */
439        u32 res0050[7];         /* 0x50 - 0x6b */
440        u32 fmqm_tapc;          /* Tnum Aging Period Control 0x6c */
441        u32 fmqm_dmcvc;         /* Dequeue MAC Command Valid Counter 0x70 */
442        u32 fmqm_difdcc;        /* Dequeue Invalid FD Command Counter 0x74 */
443        u32 fmqm_da1v;          /* Dequeue A1 Valid Counter 0x78 */
444        u32 res007c;            /* 0x7c */
445        u32 fmqm_dtc;           /* 0x80 Debug Trap Counter 0x80 */
446        u32 fmqm_efddd;         /* 0x84 Enqueue Frame desc Dynamic dbg 0x84 */
447        u32 res0088[2];         /* 0x88 - 0x8f */
448        struct {
449                u32 fmqm_dtcfg1;        /* 0x90 dbg trap cfg 1 Register 0x00 */
450                u32 fmqm_dtval1;        /* Debug Trap Value 1 Register 0x04 */
451                u32 fmqm_dtm1;          /* Debug Trap Mask 1 Register 0x08 */
452                u32 fmqm_dtc1;          /* Debug Trap Counter 1 Register 0x0c */
453                u32 fmqm_dtcfg2;        /* dbg Trap cfg 2 Register 0x10 */
454                u32 fmqm_dtval2;        /* Debug Trap Value 2 Register 0x14 */
455                u32 fmqm_dtm2;          /* Debug Trap Mask 2 Register 0x18 */
456                u32 res001c;            /* 0x1c */
457        } dbg_traps[3];                 /* 0x90 - 0xef */
458        u8 res00f0[0x400 - 0xf0];       /* 0xf0 - 0x3ff */
459};
460
461struct fman_dma_regs {
462        u32 fmdmsr;     /* FM DMA status register 0x00 */
463        u32 fmdmmr;     /* FM DMA mode register 0x04 */
464        u32 fmdmtr;     /* FM DMA bus threshold register 0x08 */
465        u32 fmdmhy;     /* FM DMA bus hysteresis register 0x0c */
466        u32 fmdmsetr;   /* FM DMA SOS emergency Threshold Register 0x10 */
467        u32 fmdmtah;    /* FM DMA transfer bus address high reg 0x14 */
468        u32 fmdmtal;    /* FM DMA transfer bus address low reg 0x18 */
469        u32 fmdmtcid;   /* FM DMA transfer bus communication ID reg 0x1c */
470        u32 fmdmra;     /* FM DMA bus internal ram address register 0x20 */
471        u32 fmdmrd;     /* FM DMA bus internal ram data register 0x24 */
472        u32 fmdmwcr;    /* FM DMA CAM watchdog counter value 0x28 */
473        u32 fmdmebcr;   /* FM DMA CAM base in MURAM register 0x2c */
474        u32 fmdmccqdr;  /* FM DMA CAM and CMD Queue Debug reg 0x30 */
475        u32 fmdmccqvr1; /* FM DMA CAM and CMD Queue Value reg #1 0x34 */
476        u32 fmdmccqvr2; /* FM DMA CAM and CMD Queue Value reg #2 0x38 */
477        u32 fmdmcqvr3;  /* FM DMA CMD Queue Value register #3 0x3c */
478        u32 fmdmcqvr4;  /* FM DMA CMD Queue Value register #4 0x40 */
479        u32 fmdmcqvr5;  /* FM DMA CMD Queue Value register #5 0x44 */
480        u32 fmdmsefrc;  /* FM DMA Semaphore Entry Full Reject Cntr 0x48 */
481        u32 fmdmsqfrc;  /* FM DMA Semaphore Queue Full Reject Cntr 0x4c */
482        u32 fmdmssrc;   /* FM DMA Semaphore SYNC Reject Counter 0x50 */
483        u32 fmdmdcr;    /* FM DMA Debug Counter 0x54 */
484        u32 fmdmemsr;   /* FM DMA Emergency Smoother Register 0x58 */
485        u32 res005c;    /* 0x5c */
486        u32 fmdmplr[FMAN_LIODN_TBL / 2];        /* DMA LIODN regs 0x60-0xdf */
487        u32 res00e0[0x400 - 56];
488};
489
490struct fman_hwp_regs {
491        u32 res0000[0x844 / 4];         /* 0x000..0x843 */
492        u32 fmprrpimac; /* FM Parser Internal memory access control */
493        u32 res[(0x1000 - 0x848) / 4];  /* 0x848..0xFFF */
494};
495
496/* Structure that holds current FMan state.
497 * Used for saving run time information.
498 */
499struct fman_state_struct {
500        u8 fm_id;
501        u16 fm_clk_freq;
502        struct fman_rev_info rev_info;
503        bool enabled_time_stamp;
504        u8 count1_micro_bit;
505        u8 total_num_of_tasks;
506        u8 accumulated_num_of_tasks;
507        u32 accumulated_fifo_size;
508        u8 accumulated_num_of_open_dmas;
509        u8 accumulated_num_of_deq_tnums;
510        u32 exceptions;
511        u32 extra_fifo_pool_size;
512        u8 extra_tasks_pool_size;
513        u8 extra_open_dmas_pool_size;
514        u16 port_mfl[MAX_NUM_OF_MACS];
515        u16 mac_mfl[MAX_NUM_OF_MACS];
516
517        /* SOC specific */
518        u32 fm_iram_size;
519        /* DMA */
520        u32 dma_thresh_max_commq;
521        u32 dma_thresh_max_buf;
522        u32 max_num_of_open_dmas;
523        /* QMI */
524        u32 qmi_max_num_of_tnums;
525        u32 qmi_def_tnums_thresh;
526        /* BMI */
527        u32 bmi_max_num_of_tasks;
528        u32 bmi_max_fifo_size;
529        /* General */
530        u32 fm_port_num_of_cg;
531        u32 num_of_rx_ports;
532        u32 total_fifo_size;
533
534        u32 qman_channel_base;
535        u32 num_of_qman_channels;
536
537        struct resource *res;
538};
539
540/* Structure that holds FMan initial configuration */
541struct fman_cfg {
542        u8 disp_limit_tsh;
543        u8 prs_disp_tsh;
544        u8 plcr_disp_tsh;
545        u8 kg_disp_tsh;
546        u8 bmi_disp_tsh;
547        u8 qmi_enq_disp_tsh;
548        u8 qmi_deq_disp_tsh;
549        u8 fm_ctl1_disp_tsh;
550        u8 fm_ctl2_disp_tsh;
551        int dma_cache_override;
552        enum fman_dma_aid_mode dma_aid_mode;
553        u32 dma_axi_dbg_num_of_beats;
554        u32 dma_cam_num_of_entries;
555        u32 dma_watchdog;
556        u8 dma_comm_qtsh_asrt_emer;
557        u32 dma_write_buf_tsh_asrt_emer;
558        u32 dma_read_buf_tsh_asrt_emer;
559        u8 dma_comm_qtsh_clr_emer;
560        u32 dma_write_buf_tsh_clr_emer;
561        u32 dma_read_buf_tsh_clr_emer;
562        u32 dma_sos_emergency;
563        int dma_dbg_cnt_mode;
564        int catastrophic_err;
565        int dma_err;
566        u32 exceptions;
567        u16 clk_freq;
568        u32 cam_base_addr;
569        u32 fifo_base_addr;
570        u32 total_fifo_size;
571        u32 total_num_of_tasks;
572        u32 qmi_def_tnums_thresh;
573};
574
575/* Structure that holds information received from device tree */
576struct fman_dts_params {
577        void __iomem *base_addr;                /* FMan virtual address */
578#ifndef __rtems__
579        struct resource *res;                   /* FMan memory resource */
580#endif /* __rtems__ */
581        u8 id;                                  /* FMan ID */
582
583        int err_irq;                            /* FMan Error IRQ */
584
585        u16 clk_freq;                           /* FMan clock freq (In Mhz) */
586
587        u32 qman_channel_base;                  /* QMan channels base */
588        u32 num_of_qman_channels;               /* Number of QMan channels */
589
590        struct resource muram_res;              /* MURAM resource */
591};
592
593/** fman_exceptions_cb
594 * fman         - Pointer to FMan
595 * exception    - The exception.
596 *
597 * Exceptions user callback routine, will be called upon an exception
598 * passing the exception identification.
599 *
600 * Return: irq status
601 */
602typedef irqreturn_t (fman_exceptions_cb)(struct fman *fman,
603                                         enum fman_exceptions exception);
604
605/** fman_bus_error_cb
606 * fman         - Pointer to FMan
607 * port_id      - Port id
608 * addr         - Address that caused the error
609 * tnum         - Owner of error
610 * liodn        - Logical IO device number
611 *
612 * Bus error user callback routine, will be called upon bus error,
613 * passing parameters describing the errors and the owner.
614 *
615 * Return: IRQ status
616 */
617typedef irqreturn_t (fman_bus_error_cb)(struct fman *fman, u8 port_id,
618                                        u64 addr, u8 tnum, u16 liodn);
619
620struct fman {
621        struct device *dev;
622        void __iomem *base_addr;
623        struct fman_intr_src intr_mng[FMAN_EV_CNT];
624
625        struct fman_fpm_regs __iomem *fpm_regs;
626        struct fman_bmi_regs __iomem *bmi_regs;
627        struct fman_qmi_regs __iomem *qmi_regs;
628        struct fman_dma_regs __iomem *dma_regs;
629        struct fman_hwp_regs __iomem *hwp_regs;
630        fman_exceptions_cb *exception_cb;
631        fman_bus_error_cb *bus_error_cb;
632        /* Spinlock for FMan use */
633        spinlock_t spinlock;
634        struct fman_state_struct *state;
635
636        struct fman_cfg *cfg;
637        struct muram_info *muram;
638        /* cam section in muram */
639        unsigned long cam_offset;
640        size_t cam_size;
641        /* Fifo in MURAM */
642        unsigned long fifo_offset;
643        size_t fifo_size;
644
645        u32 liodn_base[64];
646        u32 liodn_offset[64];
647
648        struct fman_dts_params dts_params;
649};
650
651static irqreturn_t fman_exceptions(struct fman *fman,
652                                   enum fman_exceptions exception)
653{
654        dev_dbg(fman->dev, "%s: FMan[%d] exception %d\n",
655                __func__, fman->state->fm_id, exception);
656
657        return IRQ_HANDLED;
658}
659
660static irqreturn_t fman_bus_error(struct fman *fman, u8 __maybe_unused port_id,
661                                  u64 __maybe_unused addr,
662                                  u8 __maybe_unused tnum,
663                                  u16 __maybe_unused liodn)
664{
665        dev_dbg(fman->dev, "%s: FMan[%d] bus error: port_id[%d]\n",
666                __func__, fman->state->fm_id, port_id);
667
668        return IRQ_HANDLED;
669}
670
671static inline irqreturn_t call_mac_isr(struct fman *fman, u8 id)
672{
673        if (fman->intr_mng[id].isr_cb) {
674                fman->intr_mng[id].isr_cb(fman->intr_mng[id].src_handle);
675
676                return IRQ_HANDLED;
677        }
678
679        return IRQ_NONE;
680}
681
682static inline u8 hw_port_id_to_sw_port_id(u8 major, u8 hw_port_id)
683{
684        u8 sw_port_id = 0;
685
686        if (hw_port_id >= BASE_TX_PORTID)
687                sw_port_id = hw_port_id - BASE_TX_PORTID;
688        else if (hw_port_id >= BASE_RX_PORTID)
689                sw_port_id = hw_port_id - BASE_RX_PORTID;
690        else
691                sw_port_id = 0;
692
693        return sw_port_id;
694}
695
696static void set_port_order_restoration(struct fman_fpm_regs __iomem *fpm_rg,
697                                       u8 port_id)
698{
699        u32 tmp = 0;
700
701        tmp = port_id << FPM_PORT_FM_CTL_PORTID_SHIFT;
702
703        tmp |= FPM_PRT_FM_CTL2 | FPM_PRT_FM_CTL1;
704
705        /* order restoration */
706        if (port_id % 2)
707                tmp |= FPM_PRT_FM_CTL1 << FPM_PRC_ORA_FM_CTL_SEL_SHIFT;
708        else
709                tmp |= FPM_PRT_FM_CTL2 << FPM_PRC_ORA_FM_CTL_SEL_SHIFT;
710
711        iowrite32be(tmp, &fpm_rg->fmfp_prc);
712}
713
714static void set_port_liodn(struct fman *fman, u8 port_id,
715                           u32 liodn_base, u32 liodn_ofst)
716{
717        u32 tmp;
718
719        /* set LIODN base for this port */
720        tmp = ioread32be(&fman->dma_regs->fmdmplr[port_id / 2]);
721        if (port_id % 2) {
722                tmp &= ~DMA_LIODN_BASE_MASK;
723                tmp |= liodn_base;
724        } else {
725                tmp &= ~(DMA_LIODN_BASE_MASK << DMA_LIODN_SHIFT);
726                tmp |= liodn_base << DMA_LIODN_SHIFT;
727        }
728        iowrite32be(tmp, &fman->dma_regs->fmdmplr[port_id / 2]);
729        iowrite32be(liodn_ofst, &fman->bmi_regs->fmbm_spliodn[port_id - 1]);
730}
731
732static void enable_rams_ecc(struct fman_fpm_regs __iomem *fpm_rg)
733{
734        u32 tmp;
735
736        tmp = ioread32be(&fpm_rg->fm_rcr);
737        if (tmp & FPM_RAM_RAMS_ECC_EN_SRC_SEL)
738                iowrite32be(tmp | FPM_RAM_IRAM_ECC_EN, &fpm_rg->fm_rcr);
739        else
740                iowrite32be(tmp | FPM_RAM_RAMS_ECC_EN |
741                            FPM_RAM_IRAM_ECC_EN, &fpm_rg->fm_rcr);
742}
743
744static void disable_rams_ecc(struct fman_fpm_regs __iomem *fpm_rg)
745{
746        u32 tmp;
747
748        tmp = ioread32be(&fpm_rg->fm_rcr);
749        if (tmp & FPM_RAM_RAMS_ECC_EN_SRC_SEL)
750                iowrite32be(tmp & ~FPM_RAM_IRAM_ECC_EN, &fpm_rg->fm_rcr);
751        else
752                iowrite32be(tmp & ~(FPM_RAM_RAMS_ECC_EN | FPM_RAM_IRAM_ECC_EN),
753                            &fpm_rg->fm_rcr);
754}
755
756static void fman_defconfig(struct fman_cfg *cfg)
757{
758        memset(cfg, 0, sizeof(struct fman_cfg));
759
760        cfg->catastrophic_err = DEFAULT_CATASTROPHIC_ERR;
761        cfg->dma_err = DEFAULT_DMA_ERR;
762        cfg->dma_aid_mode = DEFAULT_AID_MODE;
763        cfg->dma_comm_qtsh_clr_emer = DEFAULT_DMA_COMM_Q_LOW;
764        cfg->dma_comm_qtsh_asrt_emer = DEFAULT_DMA_COMM_Q_HIGH;
765        cfg->dma_cache_override = DEFAULT_CACHE_OVERRIDE;
766        cfg->dma_cam_num_of_entries = DEFAULT_DMA_CAM_NUM_OF_ENTRIES;
767        cfg->dma_dbg_cnt_mode = DEFAULT_DMA_DBG_CNT_MODE;
768        cfg->dma_sos_emergency = DEFAULT_DMA_SOS_EMERGENCY;
769        cfg->dma_watchdog = DEFAULT_DMA_WATCHDOG;
770        cfg->disp_limit_tsh = DEFAULT_DISP_LIMIT;
771        cfg->prs_disp_tsh = DEFAULT_PRS_DISP_TH;
772        cfg->plcr_disp_tsh = DEFAULT_PLCR_DISP_TH;
773        cfg->kg_disp_tsh = DEFAULT_KG_DISP_TH;
774        cfg->bmi_disp_tsh = DEFAULT_BMI_DISP_TH;
775        cfg->qmi_enq_disp_tsh = DEFAULT_QMI_ENQ_DISP_TH;
776        cfg->qmi_deq_disp_tsh = DEFAULT_QMI_DEQ_DISP_TH;
777        cfg->fm_ctl1_disp_tsh = DEFAULT_FM_CTL1_DISP_TH;
778        cfg->fm_ctl2_disp_tsh = DEFAULT_FM_CTL2_DISP_TH;
779}
780
781static int dma_init(struct fman *fman)
782{
783        struct fman_dma_regs __iomem *dma_rg = fman->dma_regs;
784        struct fman_cfg *cfg = fman->cfg;
785        u32 tmp_reg;
786
787        /* Init DMA Registers */
788
789        /* clear status reg events */
790        tmp_reg = (DMA_STATUS_BUS_ERR | DMA_STATUS_READ_ECC |
791                   DMA_STATUS_SYSTEM_WRITE_ECC | DMA_STATUS_FM_WRITE_ECC);
792        iowrite32be(ioread32be(&dma_rg->fmdmsr) | tmp_reg, &dma_rg->fmdmsr);
793
794        /* configure mode register */
795        tmp_reg = 0;
796        tmp_reg |= cfg->dma_cache_override << DMA_MODE_CACHE_OR_SHIFT;
797        if (cfg->exceptions & EX_DMA_BUS_ERROR)
798                tmp_reg |= DMA_MODE_BER;
799        if ((cfg->exceptions & EX_DMA_SYSTEM_WRITE_ECC) |
800            (cfg->exceptions & EX_DMA_READ_ECC) |
801            (cfg->exceptions & EX_DMA_FM_WRITE_ECC))
802                tmp_reg |= DMA_MODE_ECC;
803        if (cfg->dma_axi_dbg_num_of_beats)
804                tmp_reg |= (DMA_MODE_AXI_DBG_MASK &
805                        ((cfg->dma_axi_dbg_num_of_beats - 1)
806                        << DMA_MODE_AXI_DBG_SHIFT));
807
808        tmp_reg |= (((cfg->dma_cam_num_of_entries / DMA_CAM_UNITS) - 1) &
809                DMA_MODE_CEN_MASK) << DMA_MODE_CEN_SHIFT;
810        tmp_reg |= DMA_MODE_SECURE_PROT;
811        tmp_reg |= cfg->dma_dbg_cnt_mode << DMA_MODE_DBG_SHIFT;
812        tmp_reg |= cfg->dma_aid_mode << DMA_MODE_AID_MODE_SHIFT;
813
814        iowrite32be(tmp_reg, &dma_rg->fmdmmr);
815
816        /* configure thresholds register */
817        tmp_reg = ((u32)cfg->dma_comm_qtsh_asrt_emer <<
818                DMA_THRESH_COMMQ_SHIFT);
819        tmp_reg |= (cfg->dma_read_buf_tsh_asrt_emer &
820                DMA_THRESH_READ_INT_BUF_MASK) << DMA_THRESH_READ_INT_BUF_SHIFT;
821        tmp_reg |= cfg->dma_write_buf_tsh_asrt_emer &
822                DMA_THRESH_WRITE_INT_BUF_MASK;
823
824        iowrite32be(tmp_reg, &dma_rg->fmdmtr);
825
826        /* configure hysteresis register */
827        tmp_reg = ((u32)cfg->dma_comm_qtsh_clr_emer <<
828                DMA_THRESH_COMMQ_SHIFT);
829        tmp_reg |= (cfg->dma_read_buf_tsh_clr_emer &
830                DMA_THRESH_READ_INT_BUF_MASK) << DMA_THRESH_READ_INT_BUF_SHIFT;
831        tmp_reg |= cfg->dma_write_buf_tsh_clr_emer &
832                DMA_THRESH_WRITE_INT_BUF_MASK;
833
834        iowrite32be(tmp_reg, &dma_rg->fmdmhy);
835
836        /* configure emergency threshold */
837        iowrite32be(cfg->dma_sos_emergency, &dma_rg->fmdmsetr);
838
839        /* configure Watchdog */
840        iowrite32be((cfg->dma_watchdog * cfg->clk_freq), &dma_rg->fmdmwcr);
841
842        iowrite32be(cfg->cam_base_addr, &dma_rg->fmdmebcr);
843
844        /* Allocate MURAM for CAM */
845        fman->cam_size =
846                (u32)(fman->cfg->dma_cam_num_of_entries * DMA_CAM_SIZEOF_ENTRY);
847        fman->cam_offset = fman_muram_alloc(fman->muram, fman->cam_size);
848        if (IS_ERR_VALUE(fman->cam_offset)) {
849                dev_err(fman->dev, "%s: MURAM alloc for DMA CAM failed\n",
850                        __func__);
851                return -ENOMEM;
852        }
853
854        if (fman->state->rev_info.major == 2) {
855                u32 __iomem *cam_base_addr;
856
857                fman_muram_free_mem(fman->muram, fman->cam_offset,
858                                    fman->cam_size);
859
860                fman->cam_size = fman->cfg->dma_cam_num_of_entries * 72 + 128;
861                fman->cam_offset = fman_muram_alloc(fman->muram,
862                                                    fman->cam_size);
863                if (IS_ERR_VALUE(fman->cam_offset)) {
864                        dev_err(fman->dev, "%s: MURAM alloc for DMA CAM failed\n",
865                                __func__);
866                        return -ENOMEM;
867                }
868
869                if (fman->cfg->dma_cam_num_of_entries % 8 ||
870                    fman->cfg->dma_cam_num_of_entries > 32) {
871                        dev_err(fman->dev, "%s: wrong dma_cam_num_of_entries\n",
872                                __func__);
873                        return -EINVAL;
874                }
875
876                cam_base_addr = (u32 __iomem *)
877                        fman_muram_offset_to_vbase(fman->muram,
878                                                   fman->cam_offset);
879                iowrite32be(~((1 <<
880                            (32 - fman->cfg->dma_cam_num_of_entries)) - 1),
881                            cam_base_addr);
882        }
883
884        fman->cfg->cam_base_addr = fman->cam_offset;
885
886        return 0;
887}
888
889static void fpm_init(struct fman_fpm_regs __iomem *fpm_rg, struct fman_cfg *cfg)
890{
891        u32 tmp_reg;
892        int i;
893
894        /* Init FPM Registers */
895
896        tmp_reg = (u32)(cfg->disp_limit_tsh << FPM_DISP_LIMIT_SHIFT);
897        iowrite32be(tmp_reg, &fpm_rg->fmfp_mxd);
898
899        tmp_reg = (((u32)cfg->prs_disp_tsh << FPM_THR1_PRS_SHIFT) |
900                   ((u32)cfg->kg_disp_tsh << FPM_THR1_KG_SHIFT) |
901                   ((u32)cfg->plcr_disp_tsh << FPM_THR1_PLCR_SHIFT) |
902                   ((u32)cfg->bmi_disp_tsh << FPM_THR1_BMI_SHIFT));
903        iowrite32be(tmp_reg, &fpm_rg->fmfp_dist1);
904
905        tmp_reg =
906                (((u32)cfg->qmi_enq_disp_tsh << FPM_THR2_QMI_ENQ_SHIFT) |
907                 ((u32)cfg->qmi_deq_disp_tsh << FPM_THR2_QMI_DEQ_SHIFT) |
908                 ((u32)cfg->fm_ctl1_disp_tsh << FPM_THR2_FM_CTL1_SHIFT) |
909                 ((u32)cfg->fm_ctl2_disp_tsh << FPM_THR2_FM_CTL2_SHIFT));
910        iowrite32be(tmp_reg, &fpm_rg->fmfp_dist2);
911
912        /* define exceptions and error behavior */
913        tmp_reg = 0;
914        /* Clear events */
915        tmp_reg |= (FPM_EV_MASK_STALL | FPM_EV_MASK_DOUBLE_ECC |
916                    FPM_EV_MASK_SINGLE_ECC);
917        /* enable interrupts */
918        if (cfg->exceptions & EX_FPM_STALL_ON_TASKS)
919                tmp_reg |= FPM_EV_MASK_STALL_EN;
920        if (cfg->exceptions & EX_FPM_SINGLE_ECC)
921                tmp_reg |= FPM_EV_MASK_SINGLE_ECC_EN;
922        if (cfg->exceptions & EX_FPM_DOUBLE_ECC)
923                tmp_reg |= FPM_EV_MASK_DOUBLE_ECC_EN;
924        tmp_reg |= (cfg->catastrophic_err << FPM_EV_MASK_CAT_ERR_SHIFT);
925        tmp_reg |= (cfg->dma_err << FPM_EV_MASK_DMA_ERR_SHIFT);
926        /* FMan is not halted upon external halt activation */
927        tmp_reg |= FPM_EV_MASK_EXTERNAL_HALT;
928        /* Man is not halted upon  Unrecoverable ECC error behavior */
929        tmp_reg |= FPM_EV_MASK_ECC_ERR_HALT;
930        iowrite32be(tmp_reg, &fpm_rg->fmfp_ee);
931
932        /* clear all fmCtls event registers */
933        for (i = 0; i < FM_NUM_OF_FMAN_CTRL_EVENT_REGS; i++)
934                iowrite32be(0xFFFFFFFF, &fpm_rg->fmfp_cev[i]);
935
936        /* RAM ECC -  enable and clear events */
937        /* first we need to clear all parser memory,
938         * as it is uninitialized and may cause ECC errors
939         */
940        /* event bits */
941        tmp_reg = (FPM_RAM_MURAM_ECC | FPM_RAM_IRAM_ECC);
942
943        iowrite32be(tmp_reg, &fpm_rg->fm_rcr);
944
945        tmp_reg = 0;
946        if (cfg->exceptions & EX_IRAM_ECC) {
947                tmp_reg |= FPM_IRAM_ECC_ERR_EX_EN;
948                enable_rams_ecc(fpm_rg);
949        }
950        if (cfg->exceptions & EX_MURAM_ECC) {
951                tmp_reg |= FPM_MURAM_ECC_ERR_EX_EN;
952                enable_rams_ecc(fpm_rg);
953        }
954        iowrite32be(tmp_reg, &fpm_rg->fm_rie);
955}
956
957static void bmi_init(struct fman_bmi_regs __iomem *bmi_rg,
958                     struct fman_cfg *cfg)
959{
960        u32 tmp_reg;
961
962        /* Init BMI Registers */
963
964        /* define common resources */
965        tmp_reg = cfg->fifo_base_addr;
966        tmp_reg = tmp_reg / BMI_FIFO_ALIGN;
967
968        tmp_reg |= ((cfg->total_fifo_size / FMAN_BMI_FIFO_UNITS - 1) <<
969                    BMI_CFG1_FIFO_SIZE_SHIFT);
970        iowrite32be(tmp_reg, &bmi_rg->fmbm_cfg1);
971
972        tmp_reg = ((cfg->total_num_of_tasks - 1) & BMI_CFG2_TASKS_MASK) <<
973                   BMI_CFG2_TASKS_SHIFT;
974        /* num of DMA's will be dynamically updated when each port is set */
975        iowrite32be(tmp_reg, &bmi_rg->fmbm_cfg2);
976
977        /* define unmaskable exceptions, enable and clear events */
978        tmp_reg = 0;
979        iowrite32be(BMI_ERR_INTR_EN_LIST_RAM_ECC |
980                    BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC |
981                    BMI_ERR_INTR_EN_STATISTICS_RAM_ECC |
982                    BMI_ERR_INTR_EN_DISPATCH_RAM_ECC, &bmi_rg->fmbm_ievr);
983
984        if (cfg->exceptions & EX_BMI_LIST_RAM_ECC)
985                tmp_reg |= BMI_ERR_INTR_EN_LIST_RAM_ECC;
986        if (cfg->exceptions & EX_BMI_STORAGE_PROFILE_ECC)
987                tmp_reg |= BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC;
988        if (cfg->exceptions & EX_BMI_STATISTICS_RAM_ECC)
989                tmp_reg |= BMI_ERR_INTR_EN_STATISTICS_RAM_ECC;
990        if (cfg->exceptions & EX_BMI_DISPATCH_RAM_ECC)
991                tmp_reg |= BMI_ERR_INTR_EN_DISPATCH_RAM_ECC;
992        iowrite32be(tmp_reg, &bmi_rg->fmbm_ier);
993}
994
995static void qmi_init(struct fman_qmi_regs __iomem *qmi_rg,
996                     struct fman_cfg *cfg)
997{
998        u32 tmp_reg;
999
1000        /* Init QMI Registers */
1001
1002        /* Clear error interrupt events */
1003
1004        iowrite32be(QMI_ERR_INTR_EN_DOUBLE_ECC | QMI_ERR_INTR_EN_DEQ_FROM_DEF,
1005                    &qmi_rg->fmqm_eie);
1006        tmp_reg = 0;
1007        if (cfg->exceptions & EX_QMI_DEQ_FROM_UNKNOWN_PORTID)
1008                tmp_reg |= QMI_ERR_INTR_EN_DEQ_FROM_DEF;
1009        if (cfg->exceptions & EX_QMI_DOUBLE_ECC)
1010                tmp_reg |= QMI_ERR_INTR_EN_DOUBLE_ECC;
1011        /* enable events */
1012        iowrite32be(tmp_reg, &qmi_rg->fmqm_eien);
1013
1014        tmp_reg = 0;
1015        /* Clear interrupt events */
1016        iowrite32be(QMI_INTR_EN_SINGLE_ECC, &qmi_rg->fmqm_ie);
1017        if (cfg->exceptions & EX_QMI_SINGLE_ECC)
1018                tmp_reg |= QMI_INTR_EN_SINGLE_ECC;
1019        /* enable events */
1020        iowrite32be(tmp_reg, &qmi_rg->fmqm_ien);
1021}
1022
1023static void hwp_init(struct fman_hwp_regs __iomem *hwp_rg)
1024{
1025        /* enable HW Parser */
1026        iowrite32be(HWP_RPIMAC_PEN, &hwp_rg->fmprrpimac);
1027}
1028
1029static int enable(struct fman *fman, struct fman_cfg *cfg)
1030{
1031        u32 cfg_reg = 0;
1032
1033        /* Enable all modules */
1034
1035        /* clear&enable global counters - calculate reg and save for later,
1036         * because it's the same reg for QMI enable
1037         */
1038        cfg_reg = QMI_CFG_EN_COUNTERS;
1039
1040        /* Set enqueue and dequeue thresholds */
1041        cfg_reg |= (cfg->qmi_def_tnums_thresh << 8) | cfg->qmi_def_tnums_thresh;
1042
1043        iowrite32be(BMI_INIT_START, &fman->bmi_regs->fmbm_init);
1044        iowrite32be(cfg_reg | QMI_CFG_ENQ_EN | QMI_CFG_DEQ_EN,
1045                    &fman->qmi_regs->fmqm_gc);
1046
1047        return 0;
1048}
1049
1050static int set_exception(struct fman *fman,
1051                         enum fman_exceptions exception, bool enable)
1052{
1053        u32 tmp;
1054
1055        switch (exception) {
1056        case FMAN_EX_DMA_BUS_ERROR:
1057                tmp = ioread32be(&fman->dma_regs->fmdmmr);
1058                if (enable)
1059                        tmp |= DMA_MODE_BER;
1060                else
1061                        tmp &= ~DMA_MODE_BER;
1062                /* disable bus error */
1063                iowrite32be(tmp, &fman->dma_regs->fmdmmr);
1064                break;
1065        case FMAN_EX_DMA_READ_ECC:
1066        case FMAN_EX_DMA_SYSTEM_WRITE_ECC:
1067        case FMAN_EX_DMA_FM_WRITE_ECC:
1068                tmp = ioread32be(&fman->dma_regs->fmdmmr);
1069                if (enable)
1070                        tmp |= DMA_MODE_ECC;
1071                else
1072                        tmp &= ~DMA_MODE_ECC;
1073                iowrite32be(tmp, &fman->dma_regs->fmdmmr);
1074                break;
1075        case FMAN_EX_FPM_STALL_ON_TASKS:
1076                tmp = ioread32be(&fman->fpm_regs->fmfp_ee);
1077                if (enable)
1078                        tmp |= FPM_EV_MASK_STALL_EN;
1079                else
1080                        tmp &= ~FPM_EV_MASK_STALL_EN;
1081                iowrite32be(tmp, &fman->fpm_regs->fmfp_ee);
1082                break;
1083        case FMAN_EX_FPM_SINGLE_ECC:
1084                tmp = ioread32be(&fman->fpm_regs->fmfp_ee);
1085                if (enable)
1086                        tmp |= FPM_EV_MASK_SINGLE_ECC_EN;
1087                else
1088                        tmp &= ~FPM_EV_MASK_SINGLE_ECC_EN;
1089                iowrite32be(tmp, &fman->fpm_regs->fmfp_ee);
1090                break;
1091        case FMAN_EX_FPM_DOUBLE_ECC:
1092                tmp = ioread32be(&fman->fpm_regs->fmfp_ee);
1093                if (enable)
1094                        tmp |= FPM_EV_MASK_DOUBLE_ECC_EN;
1095                else
1096                        tmp &= ~FPM_EV_MASK_DOUBLE_ECC_EN;
1097                iowrite32be(tmp, &fman->fpm_regs->fmfp_ee);
1098                break;
1099        case FMAN_EX_QMI_SINGLE_ECC:
1100                tmp = ioread32be(&fman->qmi_regs->fmqm_ien);
1101                if (enable)
1102                        tmp |= QMI_INTR_EN_SINGLE_ECC;
1103                else
1104                        tmp &= ~QMI_INTR_EN_SINGLE_ECC;
1105                iowrite32be(tmp, &fman->qmi_regs->fmqm_ien);
1106                break;
1107        case FMAN_EX_QMI_DOUBLE_ECC:
1108                tmp = ioread32be(&fman->qmi_regs->fmqm_eien);
1109                if (enable)
1110                        tmp |= QMI_ERR_INTR_EN_DOUBLE_ECC;
1111                else
1112                        tmp &= ~QMI_ERR_INTR_EN_DOUBLE_ECC;
1113                iowrite32be(tmp, &fman->qmi_regs->fmqm_eien);
1114                break;
1115        case FMAN_EX_QMI_DEQ_FROM_UNKNOWN_PORTID:
1116                tmp = ioread32be(&fman->qmi_regs->fmqm_eien);
1117                if (enable)
1118                        tmp |= QMI_ERR_INTR_EN_DEQ_FROM_DEF;
1119                else
1120                        tmp &= ~QMI_ERR_INTR_EN_DEQ_FROM_DEF;
1121                iowrite32be(tmp, &fman->qmi_regs->fmqm_eien);
1122                break;
1123        case FMAN_EX_BMI_LIST_RAM_ECC:
1124                tmp = ioread32be(&fman->bmi_regs->fmbm_ier);
1125                if (enable)
1126                        tmp |= BMI_ERR_INTR_EN_LIST_RAM_ECC;
1127                else
1128                        tmp &= ~BMI_ERR_INTR_EN_LIST_RAM_ECC;
1129                iowrite32be(tmp, &fman->bmi_regs->fmbm_ier);
1130                break;
1131        case FMAN_EX_BMI_STORAGE_PROFILE_ECC:
1132                tmp = ioread32be(&fman->bmi_regs->fmbm_ier);
1133                if (enable)
1134                        tmp |= BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC;
1135                else
1136                        tmp &= ~BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC;
1137                iowrite32be(tmp, &fman->bmi_regs->fmbm_ier);
1138                break;
1139        case FMAN_EX_BMI_STATISTICS_RAM_ECC:
1140                tmp = ioread32be(&fman->bmi_regs->fmbm_ier);
1141                if (enable)
1142                        tmp |= BMI_ERR_INTR_EN_STATISTICS_RAM_ECC;
1143                else
1144                        tmp &= ~BMI_ERR_INTR_EN_STATISTICS_RAM_ECC;
1145                iowrite32be(tmp, &fman->bmi_regs->fmbm_ier);
1146                break;
1147        case FMAN_EX_BMI_DISPATCH_RAM_ECC:
1148                tmp = ioread32be(&fman->bmi_regs->fmbm_ier);
1149                if (enable)
1150                        tmp |= BMI_ERR_INTR_EN_DISPATCH_RAM_ECC;
1151                else
1152                        tmp &= ~BMI_ERR_INTR_EN_DISPATCH_RAM_ECC;
1153                iowrite32be(tmp, &fman->bmi_regs->fmbm_ier);
1154                break;
1155        case FMAN_EX_IRAM_ECC:
1156                tmp = ioread32be(&fman->fpm_regs->fm_rie);
1157                if (enable) {
1158                        /* enable ECC if not enabled */
1159                        enable_rams_ecc(fman->fpm_regs);
1160                        /* enable ECC interrupts */
1161                        tmp |= FPM_IRAM_ECC_ERR_EX_EN;
1162                } else {
1163                        /* ECC mechanism may be disabled,
1164                         * depending on driver status
1165                         */
1166                        disable_rams_ecc(fman->fpm_regs);
1167                        tmp &= ~FPM_IRAM_ECC_ERR_EX_EN;
1168                }
1169                iowrite32be(tmp, &fman->fpm_regs->fm_rie);
1170                break;
1171        case FMAN_EX_MURAM_ECC:
1172                tmp = ioread32be(&fman->fpm_regs->fm_rie);
1173                if (enable) {
1174                        /* enable ECC if not enabled */
1175                        enable_rams_ecc(fman->fpm_regs);
1176                        /* enable ECC interrupts */
1177                        tmp |= FPM_MURAM_ECC_ERR_EX_EN;
1178                } else {
1179                        /* ECC mechanism may be disabled,
1180                         * depending on driver status
1181                         */
1182                        disable_rams_ecc(fman->fpm_regs);
1183                        tmp &= ~FPM_MURAM_ECC_ERR_EX_EN;
1184                }
1185                iowrite32be(tmp, &fman->fpm_regs->fm_rie);
1186                break;
1187        default:
1188                return -EINVAL;
1189        }
1190        return 0;
1191}
1192
1193static void resume(struct fman_fpm_regs __iomem *fpm_rg)
1194{
1195        u32 tmp;
1196
1197        tmp = ioread32be(&fpm_rg->fmfp_ee);
1198        /* clear tmp_reg event bits in order not to clear standing events */
1199        tmp &= ~(FPM_EV_MASK_DOUBLE_ECC |
1200                 FPM_EV_MASK_STALL | FPM_EV_MASK_SINGLE_ECC);
1201        tmp |= FPM_EV_MASK_RELEASE_FM;
1202
1203        iowrite32be(tmp, &fpm_rg->fmfp_ee);
1204}
1205
1206static int fill_soc_specific_params(struct fman_state_struct *state)
1207{
1208        u8 minor = state->rev_info.minor;
1209        /* P4080 - Major 2
1210         * P2041/P3041/P5020/P5040 - Major 3
1211         * Tx/Bx - Major 6
1212         */
1213        switch (state->rev_info.major) {
1214        case 3:
1215                state->bmi_max_fifo_size        = 160 * 1024;
1216                state->fm_iram_size             = 64 * 1024;
1217                state->dma_thresh_max_commq     = 31;
1218                state->dma_thresh_max_buf       = 127;
1219                state->qmi_max_num_of_tnums     = 64;
1220                state->qmi_def_tnums_thresh     = 48;
1221                state->bmi_max_num_of_tasks     = 128;
1222                state->max_num_of_open_dmas     = 32;
1223                state->fm_port_num_of_cg        = 256;
1224                state->num_of_rx_ports  = 6;
1225                state->total_fifo_size  = 136 * 1024;
1226                break;
1227
1228        case 2:
1229                state->bmi_max_fifo_size        = 160 * 1024;
1230                state->fm_iram_size             = 64 * 1024;
1231                state->dma_thresh_max_commq     = 31;
1232                state->dma_thresh_max_buf       = 127;
1233                state->qmi_max_num_of_tnums     = 64;
1234                state->qmi_def_tnums_thresh     = 48;
1235                state->bmi_max_num_of_tasks     = 128;
1236                state->max_num_of_open_dmas     = 32;
1237                state->fm_port_num_of_cg        = 256;
1238                state->num_of_rx_ports  = 5;
1239                state->total_fifo_size  = 100 * 1024;
1240                break;
1241
1242        case 6:
1243                state->dma_thresh_max_commq     = 83;
1244                state->dma_thresh_max_buf       = 127;
1245                state->qmi_max_num_of_tnums     = 64;
1246                state->qmi_def_tnums_thresh     = 32;
1247                state->fm_port_num_of_cg        = 256;
1248
1249                /* FManV3L */
1250                if (minor == 1 || minor == 4) {
1251                        state->bmi_max_fifo_size        = 192 * 1024;
1252                        state->bmi_max_num_of_tasks     = 64;
1253                        state->max_num_of_open_dmas     = 32;
1254                        state->num_of_rx_ports          = 5;
1255                        if (minor == 1)
1256                                state->fm_iram_size     = 32 * 1024;
1257                        else
1258                                state->fm_iram_size     = 64 * 1024;
1259                        state->total_fifo_size          = 156 * 1024;
1260                }
1261                /* FManV3H */
1262                else if (minor == 0 || minor == 2 || minor == 3) {
1263                        state->bmi_max_fifo_size        = 384 * 1024;
1264                        state->fm_iram_size             = 64 * 1024;
1265                        state->bmi_max_num_of_tasks     = 128;
1266                        state->max_num_of_open_dmas     = 84;
1267                        state->num_of_rx_ports          = 8;
1268                        state->total_fifo_size          = 295 * 1024;
1269                } else {
1270                        pr_err("Unsupported FManv3 version\n");
1271                        return -EINVAL;
1272                }
1273
1274                break;
1275        default:
1276                pr_err("Unsupported FMan version\n");
1277                return -EINVAL;
1278        }
1279
1280        return 0;
1281}
1282
1283static bool is_init_done(struct fman_cfg *cfg)
1284{
1285        /* Checks if FMan driver parameters were initialized */
1286        if (!cfg)
1287                return true;
1288
1289        return false;
1290}
1291
1292static void free_init_resources(struct fman *fman)
1293{
1294        if (fman->cam_offset)
1295                fman_muram_free_mem(fman->muram, fman->cam_offset,
1296                                    fman->cam_size);
1297        if (fman->fifo_offset)
1298                fman_muram_free_mem(fman->muram, fman->fifo_offset,
1299                                    fman->fifo_size);
1300}
1301
1302static irqreturn_t bmi_err_event(struct fman *fman)
1303{
1304        u32 event, mask, force;
1305        struct fman_bmi_regs __iomem *bmi_rg = fman->bmi_regs;
1306        irqreturn_t ret = IRQ_NONE;
1307
1308        event = ioread32be(&bmi_rg->fmbm_ievr);
1309        mask = ioread32be(&bmi_rg->fmbm_ier);
1310        event &= mask;
1311        /* clear the forced events */
1312        force = ioread32be(&bmi_rg->fmbm_ifr);
1313        if (force & event)
1314                iowrite32be(force & ~event, &bmi_rg->fmbm_ifr);
1315        /* clear the acknowledged events */
1316        iowrite32be(event, &bmi_rg->fmbm_ievr);
1317
1318        if (event & BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC)
1319                ret = fman->exception_cb(fman, FMAN_EX_BMI_STORAGE_PROFILE_ECC);
1320        if (event & BMI_ERR_INTR_EN_LIST_RAM_ECC)
1321                ret = fman->exception_cb(fman, FMAN_EX_BMI_LIST_RAM_ECC);
1322        if (event & BMI_ERR_INTR_EN_STATISTICS_RAM_ECC)
1323                ret = fman->exception_cb(fman, FMAN_EX_BMI_STATISTICS_RAM_ECC);
1324        if (event & BMI_ERR_INTR_EN_DISPATCH_RAM_ECC)
1325                ret = fman->exception_cb(fman, FMAN_EX_BMI_DISPATCH_RAM_ECC);
1326
1327        return ret;
1328}
1329
1330static irqreturn_t qmi_err_event(struct fman *fman)
1331{
1332        u32 event, mask, force;
1333        struct fman_qmi_regs __iomem *qmi_rg = fman->qmi_regs;
1334        irqreturn_t ret = IRQ_NONE;
1335
1336        event = ioread32be(&qmi_rg->fmqm_eie);
1337        mask = ioread32be(&qmi_rg->fmqm_eien);
1338        event &= mask;
1339
1340        /* clear the forced events */
1341        force = ioread32be(&qmi_rg->fmqm_eif);
1342        if (force & event)
1343                iowrite32be(force & ~event, &qmi_rg->fmqm_eif);
1344        /* clear the acknowledged events */
1345        iowrite32be(event, &qmi_rg->fmqm_eie);
1346
1347        if (event & QMI_ERR_INTR_EN_DOUBLE_ECC)
1348                ret = fman->exception_cb(fman, FMAN_EX_QMI_DOUBLE_ECC);
1349        if (event & QMI_ERR_INTR_EN_DEQ_FROM_DEF)
1350                ret = fman->exception_cb(fman,
1351                                         FMAN_EX_QMI_DEQ_FROM_UNKNOWN_PORTID);
1352
1353        return ret;
1354}
1355
1356static irqreturn_t dma_err_event(struct fman *fman)
1357{
1358        u32 status, mask, com_id;
1359        u8 tnum, port_id, relative_port_id;
1360        u16 liodn;
1361        struct fman_dma_regs __iomem *dma_rg = fman->dma_regs;
1362        irqreturn_t ret = IRQ_NONE;
1363
1364        status = ioread32be(&dma_rg->fmdmsr);
1365        mask = ioread32be(&dma_rg->fmdmmr);
1366
1367        /* clear DMA_STATUS_BUS_ERR if mask has no DMA_MODE_BER */
1368        if ((mask & DMA_MODE_BER) != DMA_MODE_BER)
1369                status &= ~DMA_STATUS_BUS_ERR;
1370
1371        /* clear relevant bits if mask has no DMA_MODE_ECC */
1372        if ((mask & DMA_MODE_ECC) != DMA_MODE_ECC)
1373                status &= ~(DMA_STATUS_FM_SPDAT_ECC |
1374                            DMA_STATUS_READ_ECC |
1375                            DMA_STATUS_SYSTEM_WRITE_ECC |
1376                            DMA_STATUS_FM_WRITE_ECC);
1377
1378        /* clear set events */
1379        iowrite32be(status, &dma_rg->fmdmsr);
1380
1381        if (status & DMA_STATUS_BUS_ERR) {
1382                u64 addr;
1383
1384                addr = (u64)ioread32be(&dma_rg->fmdmtal);
1385                addr |= ((u64)(ioread32be(&dma_rg->fmdmtah)) << 32);
1386
1387                com_id = ioread32be(&dma_rg->fmdmtcid);
1388                port_id = (u8)(((com_id & DMA_TRANSFER_PORTID_MASK) >>
1389                               DMA_TRANSFER_PORTID_SHIFT));
1390                relative_port_id =
1391                hw_port_id_to_sw_port_id(fman->state->rev_info.major, port_id);
1392                tnum = (u8)((com_id & DMA_TRANSFER_TNUM_MASK) >>
1393                            DMA_TRANSFER_TNUM_SHIFT);
1394                liodn = (u16)(com_id & DMA_TRANSFER_LIODN_MASK);
1395                ret = fman->bus_error_cb(fman, relative_port_id, addr, tnum,
1396                                         liodn);
1397        }
1398        if (status & DMA_STATUS_FM_SPDAT_ECC)
1399                ret = fman->exception_cb(fman, FMAN_EX_DMA_SINGLE_PORT_ECC);
1400        if (status & DMA_STATUS_READ_ECC)
1401                ret = fman->exception_cb(fman, FMAN_EX_DMA_READ_ECC);
1402        if (status & DMA_STATUS_SYSTEM_WRITE_ECC)
1403                ret = fman->exception_cb(fman, FMAN_EX_DMA_SYSTEM_WRITE_ECC);
1404        if (status & DMA_STATUS_FM_WRITE_ECC)
1405                ret = fman->exception_cb(fman, FMAN_EX_DMA_FM_WRITE_ECC);
1406
1407        return ret;
1408}
1409
1410static irqreturn_t fpm_err_event(struct fman *fman)
1411{
1412        u32 event;
1413        struct fman_fpm_regs __iomem *fpm_rg = fman->fpm_regs;
1414        irqreturn_t ret = IRQ_NONE;
1415
1416        event = ioread32be(&fpm_rg->fmfp_ee);
1417        /* clear the all occurred events */
1418        iowrite32be(event, &fpm_rg->fmfp_ee);
1419
1420        if ((event & FPM_EV_MASK_DOUBLE_ECC) &&
1421            (event & FPM_EV_MASK_DOUBLE_ECC_EN))
1422                ret = fman->exception_cb(fman, FMAN_EX_FPM_DOUBLE_ECC);
1423        if ((event & FPM_EV_MASK_STALL) && (event & FPM_EV_MASK_STALL_EN))
1424                ret = fman->exception_cb(fman, FMAN_EX_FPM_STALL_ON_TASKS);
1425        if ((event & FPM_EV_MASK_SINGLE_ECC) &&
1426            (event & FPM_EV_MASK_SINGLE_ECC_EN))
1427                ret = fman->exception_cb(fman, FMAN_EX_FPM_SINGLE_ECC);
1428
1429        return ret;
1430}
1431
1432static irqreturn_t muram_err_intr(struct fman *fman)
1433{
1434        u32 event, mask;
1435        struct fman_fpm_regs __iomem *fpm_rg = fman->fpm_regs;
1436        irqreturn_t ret = IRQ_NONE;
1437
1438        event = ioread32be(&fpm_rg->fm_rcr);
1439        mask = ioread32be(&fpm_rg->fm_rie);
1440
1441        /* clear MURAM event bit (do not clear IRAM event) */
1442        iowrite32be(event & ~FPM_RAM_IRAM_ECC, &fpm_rg->fm_rcr);
1443
1444        if ((mask & FPM_MURAM_ECC_ERR_EX_EN) && (event & FPM_RAM_MURAM_ECC))
1445                ret = fman->exception_cb(fman, FMAN_EX_MURAM_ECC);
1446
1447        return ret;
1448}
1449
1450static irqreturn_t qmi_event(struct fman *fman)
1451{
1452        u32 event, mask, force;
1453        struct fman_qmi_regs __iomem *qmi_rg = fman->qmi_regs;
1454        irqreturn_t ret = IRQ_NONE;
1455
1456        event = ioread32be(&qmi_rg->fmqm_ie);
1457        mask = ioread32be(&qmi_rg->fmqm_ien);
1458        event &= mask;
1459        /* clear the forced events */
1460        force = ioread32be(&qmi_rg->fmqm_if);
1461        if (force & event)
1462                iowrite32be(force & ~event, &qmi_rg->fmqm_if);
1463        /* clear the acknowledged events */
1464        iowrite32be(event, &qmi_rg->fmqm_ie);
1465
1466        if (event & QMI_INTR_EN_SINGLE_ECC)
1467                ret = fman->exception_cb(fman, FMAN_EX_QMI_SINGLE_ECC);
1468
1469        return ret;
1470}
1471
1472static void enable_time_stamp(struct fman *fman)
1473{
1474        struct fman_fpm_regs __iomem *fpm_rg = fman->fpm_regs;
1475        u16 fm_clk_freq = fman->state->fm_clk_freq;
1476        u32 tmp, intgr, ts_freq;
1477        u64 frac;
1478
1479        ts_freq = (u32)(1 << fman->state->count1_micro_bit);
1480        /* configure timestamp so that bit 8 will count 1 microsecond
1481         * Find effective count rate at TIMESTAMP least significant bits:
1482         * Effective_Count_Rate = 1MHz x 2^8 = 256MHz
1483         * Find frequency ratio between effective count rate and the clock:
1484         * Effective_Count_Rate / CLK e.g. for 600 MHz clock:
1485         * 256/600 = 0.4266666...
1486         */
1487
1488        intgr = ts_freq / fm_clk_freq;
1489        /* we multiply by 2^16 to keep the fraction of the division
1490         * we do not div back, since we write this value as a fraction
1491         * see spec
1492         */
1493
1494        frac = ((ts_freq << 16) - (intgr << 16) * fm_clk_freq) / fm_clk_freq;
1495        /* we check remainder of the division in order to round up if not int */
1496        if (((ts_freq << 16) - (intgr << 16) * fm_clk_freq) % fm_clk_freq)
1497                frac++;
1498
1499        tmp = (intgr << FPM_TS_INT_SHIFT) | (u16)frac;
1500        iowrite32be(tmp, &fpm_rg->fmfp_tsc2);
1501
1502        /* enable timestamp with original clock */
1503        iowrite32be(FPM_TS_CTL_EN, &fpm_rg->fmfp_tsc1);
1504        fman->state->enabled_time_stamp = true;
1505}
1506
1507static int clear_iram(struct fman *fman)
1508{
1509        struct fman_iram_regs __iomem *iram;
1510        int i, count;
1511
1512        iram = fman->base_addr + IMEM_OFFSET;
1513
1514        /* Enable the auto-increment */
1515        iowrite32be(IRAM_IADD_AIE, &iram->iadd);
1516        count = 100;
1517        do {
1518                udelay(1);
1519        } while ((ioread32be(&iram->iadd) != IRAM_IADD_AIE) && --count);
1520        if (count == 0)
1521                return -EBUSY;
1522
1523        for (i = 0; i < (fman->state->fm_iram_size / 4); i++)
1524                iowrite32be(0xffffffff, &iram->idata);
1525
1526        iowrite32be(fman->state->fm_iram_size - 4, &iram->iadd);
1527        count = 100;
1528        do {
1529                udelay(1);
1530        } while ((ioread32be(&iram->idata) != 0xffffffff) && --count);
1531        if (count == 0)
1532                return -EBUSY;
1533
1534        return 0;
1535}
1536
1537static u32 get_exception_flag(enum fman_exceptions exception)
1538{
1539        u32 bit_mask;
1540
1541        switch (exception) {
1542        case FMAN_EX_DMA_BUS_ERROR:
1543                bit_mask = EX_DMA_BUS_ERROR;
1544                break;
1545        case FMAN_EX_DMA_SINGLE_PORT_ECC:
1546                bit_mask = EX_DMA_SINGLE_PORT_ECC;
1547                break;
1548        case FMAN_EX_DMA_READ_ECC:
1549                bit_mask = EX_DMA_READ_ECC;
1550                break;
1551        case FMAN_EX_DMA_SYSTEM_WRITE_ECC:
1552                bit_mask = EX_DMA_SYSTEM_WRITE_ECC;
1553                break;
1554        case FMAN_EX_DMA_FM_WRITE_ECC:
1555                bit_mask = EX_DMA_FM_WRITE_ECC;
1556                break;
1557        case FMAN_EX_FPM_STALL_ON_TASKS:
1558                bit_mask = EX_FPM_STALL_ON_TASKS;
1559                break;
1560        case FMAN_EX_FPM_SINGLE_ECC:
1561                bit_mask = EX_FPM_SINGLE_ECC;
1562                break;
1563        case FMAN_EX_FPM_DOUBLE_ECC:
1564                bit_mask = EX_FPM_DOUBLE_ECC;
1565                break;
1566        case FMAN_EX_QMI_SINGLE_ECC:
1567                bit_mask = EX_QMI_SINGLE_ECC;
1568                break;
1569        case FMAN_EX_QMI_DOUBLE_ECC:
1570                bit_mask = EX_QMI_DOUBLE_ECC;
1571                break;
1572        case FMAN_EX_QMI_DEQ_FROM_UNKNOWN_PORTID:
1573                bit_mask = EX_QMI_DEQ_FROM_UNKNOWN_PORTID;
1574                break;
1575        case FMAN_EX_BMI_LIST_RAM_ECC:
1576                bit_mask = EX_BMI_LIST_RAM_ECC;
1577                break;
1578        case FMAN_EX_BMI_STORAGE_PROFILE_ECC:
1579                bit_mask = EX_BMI_STORAGE_PROFILE_ECC;
1580                break;
1581        case FMAN_EX_BMI_STATISTICS_RAM_ECC:
1582                bit_mask = EX_BMI_STATISTICS_RAM_ECC;
1583                break;
1584        case FMAN_EX_BMI_DISPATCH_RAM_ECC:
1585                bit_mask = EX_BMI_DISPATCH_RAM_ECC;
1586                break;
1587        case FMAN_EX_MURAM_ECC:
1588                bit_mask = EX_MURAM_ECC;
1589                break;
1590        default:
1591                bit_mask = 0;
1592                break;
1593        }
1594
1595        return bit_mask;
1596}
1597
1598static int get_module_event(enum fman_event_modules module, u8 mod_id,
1599                            enum fman_intr_type intr_type)
1600{
1601        int event;
1602
1603        switch (module) {
1604        case FMAN_MOD_MAC:
1605                if (intr_type == FMAN_INTR_TYPE_ERR)
1606                        event = FMAN_EV_ERR_MAC0 + mod_id;
1607                else
1608                        event = FMAN_EV_MAC0 + mod_id;
1609                break;
1610        case FMAN_MOD_FMAN_CTRL:
1611                if (intr_type == FMAN_INTR_TYPE_ERR)
1612                        event = FMAN_EV_CNT;
1613                else
1614                        event = (FMAN_EV_FMAN_CTRL_0 + mod_id);
1615                break;
1616        case FMAN_MOD_DUMMY_LAST:
1617                event = FMAN_EV_CNT;
1618                break;
1619        default:
1620                event = FMAN_EV_CNT;
1621                break;
1622        }
1623
1624        return event;
1625}
1626
1627static int set_size_of_fifo(struct fman *fman, u8 port_id, u32 *size_of_fifo,
1628                            u32 *extra_size_of_fifo)
1629{
1630        struct fman_bmi_regs __iomem *bmi_rg = fman->bmi_regs;
1631        u32 fifo = *size_of_fifo;
1632        u32 extra_fifo = *extra_size_of_fifo;
1633        u32 tmp;
1634
1635        /* if this is the first time a port requires extra_fifo_pool_size,
1636         * the total extra_fifo_pool_size must be initialized to 1 buffer per
1637         * port
1638         */
1639        if (extra_fifo && !fman->state->extra_fifo_pool_size)
1640                fman->state->extra_fifo_pool_size =
1641                        fman->state->num_of_rx_ports * FMAN_BMI_FIFO_UNITS;
1642
1643        fman->state->extra_fifo_pool_size =
1644                max(fman->state->extra_fifo_pool_size, extra_fifo);
1645
1646        /* check that there are enough uncommitted fifo size */
1647        if ((fman->state->accumulated_fifo_size + fifo) >
1648            (fman->state->total_fifo_size -
1649            fman->state->extra_fifo_pool_size)) {
1650                dev_err(fman->dev, "%s: Requested fifo size and extra size exceed total FIFO size.\n",
1651                        __func__);
1652                return -EAGAIN;
1653        }
1654
1655        /* Read, modify and write to HW */
1656        tmp = (fifo / FMAN_BMI_FIFO_UNITS - 1) |
1657               ((extra_fifo / FMAN_BMI_FIFO_UNITS) <<
1658               BMI_EXTRA_FIFO_SIZE_SHIFT);
1659        iowrite32be(tmp, &bmi_rg->fmbm_pfs[port_id - 1]);
1660
1661        /* update accumulated */
1662        fman->state->accumulated_fifo_size += fifo;
1663
1664        return 0;
1665}
1666
1667static int set_num_of_tasks(struct fman *fman, u8 port_id, u8 *num_of_tasks,
1668                            u8 *num_of_extra_tasks)
1669{
1670        struct fman_bmi_regs __iomem *bmi_rg = fman->bmi_regs;
1671        u8 tasks = *num_of_tasks;
1672        u8 extra_tasks = *num_of_extra_tasks;
1673        u32 tmp;
1674
1675        if (extra_tasks)
1676                fman->state->extra_tasks_pool_size =
1677                max(fman->state->extra_tasks_pool_size, extra_tasks);
1678
1679        /* check that there are enough uncommitted tasks */
1680        if ((fman->state->accumulated_num_of_tasks + tasks) >
1681            (fman->state->total_num_of_tasks -
1682             fman->state->extra_tasks_pool_size)) {
1683                dev_err(fman->dev, "%s: Requested num_of_tasks and extra tasks pool for fm%d exceed total num_of_tasks.\n",
1684                        __func__, fman->state->fm_id);
1685                return -EAGAIN;
1686        }
1687        /* update accumulated */
1688        fman->state->accumulated_num_of_tasks += tasks;
1689
1690        /* Write to HW */
1691        tmp = ioread32be(&bmi_rg->fmbm_pp[port_id - 1]) &
1692            ~(BMI_NUM_OF_TASKS_MASK | BMI_NUM_OF_EXTRA_TASKS_MASK);
1693        tmp |= ((u32)((tasks - 1) << BMI_NUM_OF_TASKS_SHIFT) |
1694                (u32)(extra_tasks << BMI_EXTRA_NUM_OF_TASKS_SHIFT));
1695        iowrite32be(tmp, &bmi_rg->fmbm_pp[port_id - 1]);
1696
1697        return 0;
1698}
1699
1700static int set_num_of_open_dmas(struct fman *fman, u8 port_id,
1701                                u8 *num_of_open_dmas,
1702                                u8 *num_of_extra_open_dmas)
1703{
1704        struct fman_bmi_regs __iomem *bmi_rg = fman->bmi_regs;
1705        u8 open_dmas = *num_of_open_dmas;
1706        u8 extra_open_dmas = *num_of_extra_open_dmas;
1707        u8 total_num_dmas = 0, current_val = 0, current_extra_val = 0;
1708        u32 tmp;
1709
1710        if (!open_dmas) {
1711                /* Configuration according to values in the HW.
1712                 * read the current number of open Dma's
1713                 */
1714                tmp = ioread32be(&bmi_rg->fmbm_pp[port_id - 1]);
1715                current_extra_val = (u8)((tmp & BMI_NUM_OF_EXTRA_DMAS_MASK) >>
1716                                         BMI_EXTRA_NUM_OF_DMAS_SHIFT);
1717
1718                tmp = ioread32be(&bmi_rg->fmbm_pp[port_id - 1]);
1719                current_val = (u8)(((tmp & BMI_NUM_OF_DMAS_MASK) >>
1720                                   BMI_NUM_OF_DMAS_SHIFT) + 1);
1721
1722                /* This is the first configuration and user did not
1723                 * specify value (!open_dmas), reset values will be used
1724                 * and we just save these values for resource management
1725                 */
1726                fman->state->extra_open_dmas_pool_size =
1727                        (u8)max(fman->state->extra_open_dmas_pool_size,
1728                                current_extra_val);
1729                fman->state->accumulated_num_of_open_dmas += current_val;
1730                *num_of_open_dmas = current_val;
1731                *num_of_extra_open_dmas = current_extra_val;
1732                return 0;
1733        }
1734
1735        if (extra_open_dmas > current_extra_val)
1736                fman->state->extra_open_dmas_pool_size =
1737                    (u8)max(fman->state->extra_open_dmas_pool_size,
1738                            extra_open_dmas);
1739
1740        if ((fman->state->rev_info.major < 6) &&
1741            (fman->state->accumulated_num_of_open_dmas - current_val +
1742             open_dmas > fman->state->max_num_of_open_dmas)) {
1743                dev_err(fman->dev, "%s: Requested num_of_open_dmas for fm%d exceeds total num_of_open_dmas.\n",
1744                        __func__, fman->state->fm_id);
1745                return -EAGAIN;
1746        } else if ((fman->state->rev_info.major >= 6) &&
1747                   !((fman->state->rev_info.major == 6) &&
1748                   (fman->state->rev_info.minor == 0)) &&
1749                   (fman->state->accumulated_num_of_open_dmas -
1750                   current_val + open_dmas >
1751                   fman->state->dma_thresh_max_commq + 1)) {
1752                dev_err(fman->dev, "%s: Requested num_of_open_dmas for fm%d exceeds DMA Command queue (%d)\n",
1753                        __func__, fman->state->fm_id,
1754                       fman->state->dma_thresh_max_commq + 1);
1755                return -EAGAIN;
1756        }
1757
1758        WARN_ON(fman->state->accumulated_num_of_open_dmas < current_val);
1759        /* update acummulated */
1760        fman->state->accumulated_num_of_open_dmas -= current_val;
1761        fman->state->accumulated_num_of_open_dmas += open_dmas;
1762
1763        if (fman->state->rev_info.major < 6)
1764                total_num_dmas =
1765                    (u8)(fman->state->accumulated_num_of_open_dmas +
1766                    fman->state->extra_open_dmas_pool_size);
1767
1768        /* calculate reg */
1769        tmp = ioread32be(&bmi_rg->fmbm_pp[port_id - 1]) &
1770            ~(BMI_NUM_OF_DMAS_MASK | BMI_NUM_OF_EXTRA_DMAS_MASK);
1771        tmp |= (u32)(((open_dmas - 1) << BMI_NUM_OF_DMAS_SHIFT) |
1772                           (extra_open_dmas << BMI_EXTRA_NUM_OF_DMAS_SHIFT));
1773        iowrite32be(tmp, &bmi_rg->fmbm_pp[port_id - 1]);
1774
1775        /* update total num of DMA's with committed number of open DMAS,
1776         * and max uncommitted pool.
1777         */
1778        if (total_num_dmas) {
1779                tmp = ioread32be(&bmi_rg->fmbm_cfg2) & ~BMI_CFG2_DMAS_MASK;
1780                tmp |= (u32)(total_num_dmas - 1) << BMI_CFG2_DMAS_SHIFT;
1781                iowrite32be(tmp, &bmi_rg->fmbm_cfg2);
1782        }
1783
1784        return 0;
1785}
1786
1787static int fman_config(struct fman *fman)
1788{
1789        void __iomem *base_addr;
1790        int err;
1791
1792        base_addr = fman->dts_params.base_addr;
1793
1794        fman->state = kzalloc(sizeof(*fman->state), GFP_KERNEL);
1795        if (!fman->state)
1796                goto err_fm_state;
1797
1798        /* Allocate the FM driver's parameters structure */
1799        fman->cfg = kzalloc(sizeof(*fman->cfg), GFP_KERNEL);
1800        if (!fman->cfg)
1801                goto err_fm_drv;
1802
1803        /* Initialize MURAM block */
1804        fman->muram =
1805                fman_muram_init(fman->dts_params.muram_res.start,
1806                                resource_size(&fman->dts_params.muram_res));
1807        if (!fman->muram)
1808                goto err_fm_soc_specific;
1809
1810        /* Initialize FM parameters which will be kept by the driver */
1811        fman->state->fm_id = fman->dts_params.id;
1812        fman->state->fm_clk_freq = fman->dts_params.clk_freq;
1813        fman->state->qman_channel_base = fman->dts_params.qman_channel_base;
1814        fman->state->num_of_qman_channels =
1815                fman->dts_params.num_of_qman_channels;
1816#ifndef __rtems__
1817        fman->state->res = fman->dts_params.res;
1818#endif /* __rtems__ */
1819        fman->exception_cb = fman_exceptions;
1820        fman->bus_error_cb = fman_bus_error;
1821        fman->fpm_regs = base_addr + FPM_OFFSET;
1822        fman->bmi_regs = base_addr + BMI_OFFSET;
1823        fman->qmi_regs = base_addr + QMI_OFFSET;
1824        fman->dma_regs = base_addr + DMA_OFFSET;
1825        fman->hwp_regs = base_addr + HWP_OFFSET;
1826        fman->base_addr = base_addr;
1827
1828        spin_lock_init(&fman->spinlock);
1829        fman_defconfig(fman->cfg);
1830
1831        fman->state->extra_fifo_pool_size = 0;
1832        fman->state->exceptions = (EX_DMA_BUS_ERROR                 |
1833                                        EX_DMA_READ_ECC              |
1834                                        EX_DMA_SYSTEM_WRITE_ECC      |
1835                                        EX_DMA_FM_WRITE_ECC          |
1836                                        EX_FPM_STALL_ON_TASKS        |
1837                                        EX_FPM_SINGLE_ECC            |
1838                                        EX_FPM_DOUBLE_ECC            |
1839                                        EX_QMI_DEQ_FROM_UNKNOWN_PORTID |
1840                                        EX_BMI_LIST_RAM_ECC          |
1841                                        EX_BMI_STORAGE_PROFILE_ECC   |
1842                                        EX_BMI_STATISTICS_RAM_ECC    |
1843                                        EX_MURAM_ECC                 |
1844                                        EX_BMI_DISPATCH_RAM_ECC      |
1845                                        EX_QMI_DOUBLE_ECC            |
1846                                        EX_QMI_SINGLE_ECC);
1847
1848        /* Read FMan revision for future use*/
1849        fman_get_revision(fman, &fman->state->rev_info);
1850
1851        err = fill_soc_specific_params(fman->state);
1852        if (err)
1853                goto err_fm_soc_specific;
1854
1855        /* FM_AID_MODE_NO_TNUM_SW005 Errata workaround */
1856        if (fman->state->rev_info.major >= 6)
1857                fman->cfg->dma_aid_mode = FMAN_DMA_AID_OUT_PORT_ID;
1858
1859        fman->cfg->qmi_def_tnums_thresh = fman->state->qmi_def_tnums_thresh;
1860
1861        fman->state->total_num_of_tasks =
1862        (u8)DFLT_TOTAL_NUM_OF_TASKS(fman->state->rev_info.major,
1863                                    fman->state->rev_info.minor,
1864                                    fman->state->bmi_max_num_of_tasks);
1865
1866        if (fman->state->rev_info.major < 6) {
1867                fman->cfg->dma_comm_qtsh_clr_emer =
1868                (u8)DFLT_DMA_COMM_Q_LOW(fman->state->rev_info.major,
1869                                        fman->state->dma_thresh_max_commq);
1870
1871                fman->cfg->dma_comm_qtsh_asrt_emer =
1872                (u8)DFLT_DMA_COMM_Q_HIGH(fman->state->rev_info.major,
1873                                         fman->state->dma_thresh_max_commq);
1874
1875                fman->cfg->dma_cam_num_of_entries =
1876                DFLT_DMA_CAM_NUM_OF_ENTRIES(fman->state->rev_info.major);
1877
1878                fman->cfg->dma_read_buf_tsh_clr_emer =
1879                DFLT_DMA_READ_INT_BUF_LOW(fman->state->dma_thresh_max_buf);
1880
1881                fman->cfg->dma_read_buf_tsh_asrt_emer =
1882                DFLT_DMA_READ_INT_BUF_HIGH(fman->state->dma_thresh_max_buf);
1883
1884                fman->cfg->dma_write_buf_tsh_clr_emer =
1885                DFLT_DMA_WRITE_INT_BUF_LOW(fman->state->dma_thresh_max_buf);
1886
1887                fman->cfg->dma_write_buf_tsh_asrt_emer =
1888                DFLT_DMA_WRITE_INT_BUF_HIGH(fman->state->dma_thresh_max_buf);
1889
1890                fman->cfg->dma_axi_dbg_num_of_beats =
1891                DFLT_AXI_DBG_NUM_OF_BEATS;
1892        }
1893
1894        return 0;
1895
1896err_fm_soc_specific:
1897        kfree(fman->cfg);
1898err_fm_drv:
1899        kfree(fman->state);
1900err_fm_state:
1901        kfree(fman);
1902        return -EINVAL;
1903}
1904
1905#ifndef __rtems__
1906static int fman_reset(struct fman *fman)
1907{
1908        u32 count;
1909        int err = 0;
1910
1911        if (fman->state->rev_info.major < 6) {
1912                iowrite32be(FPM_RSTC_FM_RESET, &fman->fpm_regs->fm_rstc);
1913                /* Wait for reset completion */
1914                count = 100;
1915                do {
1916                        udelay(1);
1917                } while (((ioread32be(&fman->fpm_regs->fm_rstc)) &
1918                         FPM_RSTC_FM_RESET) && --count);
1919                if (count == 0)
1920                        err = -EBUSY;
1921
1922                goto _return;
1923        } else {
1924#ifdef CONFIG_PPC
1925                struct device_node *guts_node;
1926                struct ccsr_guts __iomem *guts_regs;
1927                u32 devdisr2, reg;
1928
1929                /* Errata A007273 */
1930                guts_node =
1931                        of_find_compatible_node(NULL, NULL,
1932                                                "fsl,qoriq-device-config-2.0");
1933                if (!guts_node) {
1934                        dev_err(fman->dev, "%s: Couldn't find guts node\n",
1935                                __func__);
1936                        goto guts_node;
1937                }
1938
1939                guts_regs = of_iomap(guts_node, 0);
1940                if (!guts_regs) {
1941                        dev_err(fman->dev, "%s: Couldn't map %s regs\n",
1942                                __func__, guts_node->full_name);
1943                        goto guts_regs;
1944                }
1945#define FMAN1_ALL_MACS_MASK     0xFCC00000
1946#define FMAN2_ALL_MACS_MASK     0x000FCC00
1947                /* Read current state */
1948                devdisr2 = ioread32be(&guts_regs->devdisr2);
1949                if (fman->dts_params.id == 0)
1950                        reg = devdisr2 & ~FMAN1_ALL_MACS_MASK;
1951                else
1952                        reg = devdisr2 & ~FMAN2_ALL_MACS_MASK;
1953
1954                /* Enable all MACs */
1955                iowrite32be(reg, &guts_regs->devdisr2);
1956#endif
1957
1958                /* Perform FMan reset */
1959                iowrite32be(FPM_RSTC_FM_RESET, &fman->fpm_regs->fm_rstc);
1960
1961                /* Wait for reset completion */
1962                count = 100;
1963                do {
1964                        udelay(1);
1965                } while (((ioread32be(&fman->fpm_regs->fm_rstc)) &
1966                         FPM_RSTC_FM_RESET) && --count);
1967                if (count == 0) {
1968#ifdef CONFIG_PPC
1969                        iounmap(guts_regs);
1970                        of_node_put(guts_node);
1971#endif
1972                        err = -EBUSY;
1973                        goto _return;
1974                }
1975#ifdef CONFIG_PPC
1976
1977                /* Restore devdisr2 value */
1978                iowrite32be(devdisr2, &guts_regs->devdisr2);
1979
1980                iounmap(guts_regs);
1981                of_node_put(guts_node);
1982#endif
1983
1984                goto _return;
1985
1986#ifdef CONFIG_PPC
1987guts_regs:
1988                of_node_put(guts_node);
1989guts_node:
1990                dev_dbg(fman->dev, "%s: Didn't perform FManV3 reset due to Errata A007273!\n",
1991                        __func__);
1992#endif
1993        }
1994_return:
1995        return err;
1996}
1997#endif /* __rtems__ */
1998
1999static int fman_init(struct fman *fman)
2000{
2001        struct fman_cfg *cfg = NULL;
2002        int err = 0, i, count;
2003
2004        if (is_init_done(fman->cfg))
2005                return -EINVAL;
2006
2007        fman->state->count1_micro_bit = FM_TIMESTAMP_1_USEC_BIT;
2008
2009        cfg = fman->cfg;
2010
2011        /* clear revision-dependent non existing exception */
2012        if (fman->state->rev_info.major < 6)
2013                fman->state->exceptions &= ~FMAN_EX_BMI_DISPATCH_RAM_ECC;
2014
2015        if (fman->state->rev_info.major >= 6)
2016                fman->state->exceptions &= ~FMAN_EX_QMI_SINGLE_ECC;
2017
2018        /* clear CPG */
2019        memset_io((void __iomem *)(fman->base_addr + CGP_OFFSET), 0,
2020                  fman->state->fm_port_num_of_cg);
2021
2022        /* Save LIODN info before FMan reset
2023         * Skipping non-existent port 0 (i = 1)
2024         */
2025        for (i = 1; i < FMAN_LIODN_TBL; i++) {
2026                u32 liodn_base;
2027
2028                fman->liodn_offset[i] =
2029                        ioread32be(&fman->bmi_regs->fmbm_spliodn[i - 1]);
2030                liodn_base = ioread32be(&fman->dma_regs->fmdmplr[i / 2]);
2031                if (i % 2) {
2032                        /* FMDM_PLR LSB holds LIODN base for odd ports */
2033                        liodn_base &= DMA_LIODN_BASE_MASK;
2034                } else {
2035                        /* FMDM_PLR MSB holds LIODN base for even ports */
2036                        liodn_base >>= DMA_LIODN_SHIFT;
2037                        liodn_base &= DMA_LIODN_BASE_MASK;
2038                }
2039                fman->liodn_base[i] = liodn_base;
2040        }
2041
2042        err = fman_reset(fman);
2043        if (err)
2044                return err;
2045
2046        if (ioread32be(&fman->qmi_regs->fmqm_gs) & QMI_GS_HALT_NOT_BUSY) {
2047                resume(fman->fpm_regs);
2048                /* Wait until QMI is not in halt not busy state */
2049                count = 100;
2050                do {
2051                        udelay(1);
2052                } while (((ioread32be(&fman->qmi_regs->fmqm_gs)) &
2053                         QMI_GS_HALT_NOT_BUSY) && --count);
2054                if (count == 0)
2055                        dev_warn(fman->dev, "%s: QMI is in halt not busy state\n",
2056                                 __func__);
2057        }
2058
2059        if (clear_iram(fman) != 0)
2060                return -EINVAL;
2061
2062        cfg->exceptions = fman->state->exceptions;
2063
2064        /* Init DMA Registers */
2065
2066        err = dma_init(fman);
2067        if (err != 0) {
2068                free_init_resources(fman);
2069                return err;
2070        }
2071
2072        /* Init FPM Registers */
2073        fpm_init(fman->fpm_regs, fman->cfg);
2074
2075        /* define common resources */
2076        /* allocate MURAM for FIFO according to total size */
2077        fman->fifo_offset = fman_muram_alloc(fman->muram,
2078                                             fman->state->total_fifo_size);
2079        if (IS_ERR_VALUE(fman->fifo_offset)) {
2080                free_init_resources(fman);
2081                dev_err(fman->dev, "%s: MURAM alloc for BMI FIFO failed\n",
2082                        __func__);
2083                return -ENOMEM;
2084        }
2085
2086        cfg->fifo_base_addr = fman->fifo_offset;
2087        cfg->total_fifo_size = fman->state->total_fifo_size;
2088        cfg->total_num_of_tasks = fman->state->total_num_of_tasks;
2089        cfg->clk_freq = fman->state->fm_clk_freq;
2090
2091        /* Init BMI Registers */
2092        bmi_init(fman->bmi_regs, fman->cfg);
2093
2094        /* Init QMI Registers */
2095        qmi_init(fman->qmi_regs, fman->cfg);
2096
2097        /* Init HW Parser */
2098        hwp_init(fman->hwp_regs);
2099
2100        err = enable(fman, cfg);
2101        if (err != 0)
2102                return err;
2103
2104        enable_time_stamp(fman);
2105
2106        kfree(fman->cfg);
2107        fman->cfg = NULL;
2108
2109        return 0;
2110}
2111
2112static int fman_set_exception(struct fman *fman,
2113                              enum fman_exceptions exception, bool enable)
2114{
2115        u32 bit_mask = 0;
2116
2117        if (!is_init_done(fman->cfg))
2118                return -EINVAL;
2119
2120        bit_mask = get_exception_flag(exception);
2121        if (bit_mask) {
2122                if (enable)
2123                        fman->state->exceptions |= bit_mask;
2124                else
2125                        fman->state->exceptions &= ~bit_mask;
2126        } else {
2127                dev_err(fman->dev, "%s: Undefined exception (%d)\n",
2128                        __func__, exception);
2129                return -EINVAL;
2130        }
2131
2132        return set_exception(fman, exception, enable);
2133}
2134
2135/**
2136 * fman_register_intr
2137 * @fman:       A Pointer to FMan device
2138 * @mod:        Calling module
2139 * @mod_id:     Module id (if more than 1 exists, '0' if not)
2140 * @intr_type:  Interrupt type (error/normal) selection.
2141 * @f_isr:      The interrupt service routine.
2142 * @h_src_arg:  Argument to be passed to f_isr.
2143 *
2144 * Used to register an event handler to be processed by FMan
2145 *
2146 * Return: 0 on success; Error code otherwise.
2147 */
2148void fman_register_intr(struct fman *fman, enum fman_event_modules module,
2149                        u8 mod_id, enum fman_intr_type intr_type,
2150                        void (*isr_cb)(void *src_arg), void *src_arg)
2151{
2152        int event = 0;
2153
2154        event = get_module_event(module, mod_id, intr_type);
2155        WARN_ON(event >= FMAN_EV_CNT);
2156
2157        /* register in local FM structure */
2158        fman->intr_mng[event].isr_cb = isr_cb;
2159        fman->intr_mng[event].src_handle = src_arg;
2160}
2161EXPORT_SYMBOL(fman_register_intr);
2162
2163/**
2164 * fman_unregister_intr
2165 * @fman:       A Pointer to FMan device
2166 * @mod:        Calling module
2167 * @mod_id:     Module id (if more than 1 exists, '0' if not)
2168 * @intr_type:  Interrupt type (error/normal) selection.
2169 *
2170 * Used to unregister an event handler to be processed by FMan
2171 *
2172 * Return: 0 on success; Error code otherwise.
2173 */
2174void fman_unregister_intr(struct fman *fman, enum fman_event_modules module,
2175                          u8 mod_id, enum fman_intr_type intr_type)
2176{
2177        int event = 0;
2178
2179        event = get_module_event(module, mod_id, intr_type);
2180        WARN_ON(event >= FMAN_EV_CNT);
2181
2182        fman->intr_mng[event].isr_cb = NULL;
2183        fman->intr_mng[event].src_handle = NULL;
2184}
2185EXPORT_SYMBOL(fman_unregister_intr);
2186
2187/**
2188 * fman_set_port_params
2189 * @fman:               A Pointer to FMan device
2190 * @port_params:        Port parameters
2191 *
2192 * Used by FMan Port to pass parameters to the FMan
2193 *
2194 * Return: 0 on success; Error code otherwise.
2195 */
2196int fman_set_port_params(struct fman *fman,
2197                         struct fman_port_init_params *port_params)
2198{
2199        int err;
2200        unsigned long flags;
2201        u8 port_id = port_params->port_id, mac_id;
2202
2203        spin_lock_irqsave(&fman->spinlock, flags);
2204
2205        err = set_num_of_tasks(fman, port_params->port_id,
2206                               &port_params->num_of_tasks,
2207                               &port_params->num_of_extra_tasks);
2208        if (err)
2209                goto return_err;
2210
2211        /* TX Ports */
2212        if (port_params->port_type != FMAN_PORT_TYPE_RX) {
2213                u32 enq_th, deq_th, reg;
2214
2215                /* update qmi ENQ/DEQ threshold */
2216                fman->state->accumulated_num_of_deq_tnums +=
2217                        port_params->deq_pipeline_depth;
2218                enq_th = (ioread32be(&fman->qmi_regs->fmqm_gc) &
2219                          QMI_CFG_ENQ_MASK) >> QMI_CFG_ENQ_SHIFT;
2220                /* if enq_th is too big, we reduce it to the max value
2221                 * that is still 0
2222                 */
2223                if (enq_th >= (fman->state->qmi_max_num_of_tnums -
2224                    fman->state->accumulated_num_of_deq_tnums)) {
2225                        enq_th =
2226                        fman->state->qmi_max_num_of_tnums -
2227                        fman->state->accumulated_num_of_deq_tnums - 1;
2228
2229                        reg = ioread32be(&fman->qmi_regs->fmqm_gc);
2230                        reg &= ~QMI_CFG_ENQ_MASK;
2231                        reg |= (enq_th << QMI_CFG_ENQ_SHIFT);
2232                        iowrite32be(reg, &fman->qmi_regs->fmqm_gc);
2233                }
2234
2235                deq_th = ioread32be(&fman->qmi_regs->fmqm_gc) &
2236                                    QMI_CFG_DEQ_MASK;
2237                /* if deq_th is too small, we enlarge it to the min
2238                 * value that is still 0.
2239                 * depTh may not be larger than 63
2240                 * (fman->state->qmi_max_num_of_tnums-1).
2241                 */
2242                if ((deq_th <= fman->state->accumulated_num_of_deq_tnums) &&
2243                    (deq_th < fman->state->qmi_max_num_of_tnums - 1)) {
2244                        deq_th = fman->state->accumulated_num_of_deq_tnums + 1;
2245                        reg = ioread32be(&fman->qmi_regs->fmqm_gc);
2246                        reg &= ~QMI_CFG_DEQ_MASK;
2247                        reg |= deq_th;
2248                        iowrite32be(reg, &fman->qmi_regs->fmqm_gc);
2249                }
2250        }
2251
2252        err = set_size_of_fifo(fman, port_params->port_id,
2253                               &port_params->size_of_fifo,
2254                               &port_params->extra_size_of_fifo);
2255        if (err)
2256                goto return_err;
2257
2258        err = set_num_of_open_dmas(fman, port_params->port_id,
2259                                   &port_params->num_of_open_dmas,
2260                                   &port_params->num_of_extra_open_dmas);
2261        if (err)
2262                goto return_err;
2263
2264        set_port_liodn(fman, port_id, fman->liodn_base[port_id],
2265                       fman->liodn_offset[port_id]);
2266
2267        if (fman->state->rev_info.major < 6)
2268                set_port_order_restoration(fman->fpm_regs, port_id);
2269
2270        mac_id = hw_port_id_to_sw_port_id(fman->state->rev_info.major, port_id);
2271
2272        if (port_params->max_frame_length >= fman->state->mac_mfl[mac_id]) {
2273                fman->state->port_mfl[mac_id] = port_params->max_frame_length;
2274        } else {
2275                dev_warn(fman->dev, "%s: Port (%d) max_frame_length is smaller than MAC (%d) current MTU\n",
2276                         __func__, port_id, mac_id);
2277                err = -EINVAL;
2278                goto return_err;
2279        }
2280
2281        spin_unlock_irqrestore(&fman->spinlock, flags);
2282
2283        return 0;
2284
2285return_err:
2286        spin_unlock_irqrestore(&fman->spinlock, flags);
2287        return err;
2288}
2289EXPORT_SYMBOL(fman_set_port_params);
2290
2291/**
2292 * fman_reset_mac
2293 * @fman:       A Pointer to FMan device
2294 * @mac_id:     MAC id to be reset
2295 *
2296 * Reset a specific MAC
2297 *
2298 * Return: 0 on success; Error code otherwise.
2299 */
2300int fman_reset_mac(struct fman *fman, u8 mac_id)
2301{
2302        struct fman_fpm_regs __iomem *fpm_rg = fman->fpm_regs;
2303        u32 msk, timeout = 100;
2304
2305        if (fman->state->rev_info.major >= 6) {
2306                dev_err(fman->dev, "%s: FMan MAC reset no available for FMan V3!\n",
2307                        __func__);
2308                return -EINVAL;
2309        }
2310
2311        /* Get the relevant bit mask */
2312        switch (mac_id) {
2313        case 0:
2314                msk = FPM_RSTC_MAC0_RESET;
2315                break;
2316        case 1:
2317                msk = FPM_RSTC_MAC1_RESET;
2318                break;
2319        case 2:
2320                msk = FPM_RSTC_MAC2_RESET;
2321                break;
2322        case 3:
2323                msk = FPM_RSTC_MAC3_RESET;
2324                break;
2325        case 4:
2326                msk = FPM_RSTC_MAC4_RESET;
2327                break;
2328        case 5:
2329                msk = FPM_RSTC_MAC5_RESET;
2330                break;
2331        case 6:
2332                msk = FPM_RSTC_MAC6_RESET;
2333                break;
2334        case 7:
2335                msk = FPM_RSTC_MAC7_RESET;
2336                break;
2337        case 8:
2338                msk = FPM_RSTC_MAC8_RESET;
2339                break;
2340        case 9:
2341                msk = FPM_RSTC_MAC9_RESET;
2342                break;
2343        default:
2344                dev_warn(fman->dev, "%s: Illegal MAC Id [%d]\n",
2345                         __func__, mac_id);
2346                return -EINVAL;
2347        }
2348
2349        /* reset */
2350        iowrite32be(msk, &fpm_rg->fm_rstc);
2351        while ((ioread32be(&fpm_rg->fm_rstc) & msk) && --timeout)
2352                udelay(10);
2353
2354        if (!timeout)
2355                return -EIO;
2356
2357        return 0;
2358}
2359EXPORT_SYMBOL(fman_reset_mac);
2360
2361/**
2362 * fman_set_mac_max_frame
2363 * @fman:       A Pointer to FMan device
2364 * @mac_id:     MAC id
2365 * @mfl:        Maximum frame length
2366 *
2367 * Set maximum frame length of specific MAC in FMan driver
2368 *
2369 * Return: 0 on success; Error code otherwise.
2370 */
2371int fman_set_mac_max_frame(struct fman *fman, u8 mac_id, u16 mfl)
2372{
2373        /* if port is already initialized, check that MaxFrameLength is smaller
2374         * or equal to the port's max
2375         */
2376        if ((!fman->state->port_mfl[mac_id]) ||
2377            (mfl <= fman->state->port_mfl[mac_id])) {
2378                fman->state->mac_mfl[mac_id] = mfl;
2379        } else {
2380                dev_warn(fman->dev, "%s: MAC max_frame_length is larger than Port max_frame_length\n",
2381                         __func__);
2382                return -EINVAL;
2383        }
2384        return 0;
2385}
2386EXPORT_SYMBOL(fman_set_mac_max_frame);
2387
2388/**
2389 * fman_get_clock_freq
2390 * @fman:       A Pointer to FMan device
2391 *
2392 * Get FMan clock frequency
2393 *
2394 * Return: FMan clock frequency
2395 */
2396u16 fman_get_clock_freq(struct fman *fman)
2397{
2398        return fman->state->fm_clk_freq;
2399}
2400
2401/**
2402 * fman_get_bmi_max_fifo_size
2403 * @fman:       A Pointer to FMan device
2404 *
2405 * Get FMan maximum FIFO size
2406 *
2407 * Return: FMan Maximum FIFO size
2408 */
2409u32 fman_get_bmi_max_fifo_size(struct fman *fman)
2410{
2411        return fman->state->bmi_max_fifo_size;
2412}
2413EXPORT_SYMBOL(fman_get_bmi_max_fifo_size);
2414
2415/**
2416 * fman_get_revision
2417 * @fman                - Pointer to the FMan module
2418 * @rev_info            - A structure of revision information parameters.
2419 *
2420 * Returns the FM revision
2421 *
2422 * Allowed only following fman_init().
2423 *
2424 * Return: 0 on success; Error code otherwise.
2425 */
2426void fman_get_revision(struct fman *fman, struct fman_rev_info *rev_info)
2427{
2428        u32 tmp;
2429
2430        tmp = ioread32be(&fman->fpm_regs->fm_ip_rev_1);
2431        rev_info->major = (u8)((tmp & FPM_REV1_MAJOR_MASK) >>
2432                                FPM_REV1_MAJOR_SHIFT);
2433        rev_info->minor = tmp & FPM_REV1_MINOR_MASK;
2434}
2435EXPORT_SYMBOL(fman_get_revision);
2436
2437/**
2438 * fman_get_qman_channel_id
2439 * @fman:       A Pointer to FMan device
2440 * @port_id:    Port id
2441 *
2442 * Get QMan channel ID associated to the Port id
2443 *
2444 * Return: QMan channel ID
2445 */
2446u32 fman_get_qman_channel_id(struct fman *fman, u32 port_id)
2447{
2448        int i;
2449
2450        if (fman->state->rev_info.major >= 6) {
2451                u32 port_ids[] = {0x30, 0x31, 0x28, 0x29, 0x2a, 0x2b,
2452                                  0x2c, 0x2d, 0x2, 0x3, 0x4, 0x5, 0x7, 0x7};
2453                for (i = 0; i < fman->state->num_of_qman_channels; i++) {
2454                        if (port_ids[i] == port_id)
2455                                break;
2456                }
2457        } else {
2458                u32 port_ids[] = {0x30, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x1,
2459                                  0x2, 0x3, 0x4, 0x5, 0x7, 0x7};
2460                for (i = 0; i < fman->state->num_of_qman_channels; i++) {
2461                        if (port_ids[i] == port_id)
2462                                break;
2463                }
2464        }
2465
2466        if (i == fman->state->num_of_qman_channels)
2467                return 0;
2468
2469        return fman->state->qman_channel_base + i;
2470}
2471EXPORT_SYMBOL(fman_get_qman_channel_id);
2472
2473/**
2474 * fman_get_mem_region
2475 * @fman:       A Pointer to FMan device
2476 *
2477 * Get FMan memory region
2478 *
2479 * Return: A structure with FMan memory region information
2480 */
2481struct resource *fman_get_mem_region(struct fman *fman)
2482{
2483        return fman->state->res;
2484}
2485EXPORT_SYMBOL(fman_get_mem_region);
2486
2487/* Bootargs defines */
2488/* Extra headroom for RX buffers - Default, min and max */
2489#define FSL_FM_RX_EXTRA_HEADROOM        64
2490#define FSL_FM_RX_EXTRA_HEADROOM_MIN    16
2491#define FSL_FM_RX_EXTRA_HEADROOM_MAX    384
2492
2493/* Maximum frame length */
2494#define FSL_FM_MAX_FRAME_SIZE                   1522
2495#define FSL_FM_MAX_POSSIBLE_FRAME_SIZE          9600
2496#define FSL_FM_MIN_POSSIBLE_FRAME_SIZE          64
2497
2498/* Extra headroom for Rx buffers.
2499 * FMan is instructed to allocate, on the Rx path, this amount of
2500 * space at the beginning of a data buffer, beside the DPA private
2501 * data area and the IC fields.
2502 * Does not impact Tx buffer layout.
2503 * Configurable from bootargs. 64 by default, it's needed on
2504 * particular forwarding scenarios that add extra headers to the
2505 * forwarded frame.
2506 */
2507static int fsl_fm_rx_extra_headroom = FSL_FM_RX_EXTRA_HEADROOM;
2508module_param(fsl_fm_rx_extra_headroom, int, 0);
2509MODULE_PARM_DESC(fsl_fm_rx_extra_headroom, "Extra headroom for Rx buffers");
2510
2511/* Max frame size, across all interfaces.
2512 * Configurable from bootargs, to avoid allocating oversized (socket)
2513 * buffers when not using jumbo frames.
2514 * Must be large enough to accommodate the network MTU, but small enough
2515 * to avoid wasting skb memory.
2516 *
2517 * Could be overridden once, at boot-time, via the
2518 * fm_set_max_frm() callback.
2519 */
2520#ifndef __rtems__
2521static int fsl_fm_max_frm = FSL_FM_MAX_FRAME_SIZE;
2522#else /* __rtems__ */
2523static int fsl_fm_max_frm = FSL_FM_MAX_POSSIBLE_FRAME_SIZE;
2524#endif /* __rtems__ */
2525module_param(fsl_fm_max_frm, int, 0);
2526MODULE_PARM_DESC(fsl_fm_max_frm, "Maximum frame size, across all interfaces");
2527
2528/**
2529 * fman_get_max_frm
2530 *
2531 * Return: Max frame length configured in the FM driver
2532 */
2533u16 fman_get_max_frm(void)
2534{
2535        static bool fm_check_mfl;
2536
2537        if (!fm_check_mfl) {
2538                if (fsl_fm_max_frm > FSL_FM_MAX_POSSIBLE_FRAME_SIZE ||
2539                    fsl_fm_max_frm < FSL_FM_MIN_POSSIBLE_FRAME_SIZE) {
2540                        pr_warn("Invalid fsl_fm_max_frm value (%d) in bootargs, valid range is %d-%d. Falling back to the default (%d)\n",
2541                                fsl_fm_max_frm,
2542                                FSL_FM_MIN_POSSIBLE_FRAME_SIZE,
2543                                FSL_FM_MAX_POSSIBLE_FRAME_SIZE,
2544                                FSL_FM_MAX_FRAME_SIZE);
2545                        fsl_fm_max_frm = FSL_FM_MAX_FRAME_SIZE;
2546                }
2547                fm_check_mfl = true;
2548        }
2549
2550        return fsl_fm_max_frm;
2551}
2552EXPORT_SYMBOL(fman_get_max_frm);
2553
2554/**
2555 * fman_get_rx_extra_headroom
2556 *
2557 * Return: Extra headroom size configured in the FM driver
2558 */
2559int fman_get_rx_extra_headroom(void)
2560{
2561        static bool fm_check_rx_extra_headroom;
2562
2563        if (!fm_check_rx_extra_headroom) {
2564                if (fsl_fm_rx_extra_headroom > FSL_FM_RX_EXTRA_HEADROOM_MAX ||
2565                    fsl_fm_rx_extra_headroom < FSL_FM_RX_EXTRA_HEADROOM_MIN) {
2566                        pr_warn("Invalid fsl_fm_rx_extra_headroom value (%d) in bootargs, valid range is %d-%d. Falling back to the default (%d)\n",
2567                                fsl_fm_rx_extra_headroom,
2568                                FSL_FM_RX_EXTRA_HEADROOM_MIN,
2569                                FSL_FM_RX_EXTRA_HEADROOM_MAX,
2570                                FSL_FM_RX_EXTRA_HEADROOM);
2571                        fsl_fm_rx_extra_headroom = FSL_FM_RX_EXTRA_HEADROOM;
2572                }
2573
2574                fm_check_rx_extra_headroom = true;
2575                fsl_fm_rx_extra_headroom = ALIGN(fsl_fm_rx_extra_headroom, 16);
2576        }
2577
2578        return fsl_fm_rx_extra_headroom;
2579}
2580EXPORT_SYMBOL(fman_get_rx_extra_headroom);
2581
2582/**
2583 * fman_bind
2584 * @dev:        FMan OF device pointer
2585 *
2586 * Bind to a specific FMan device.
2587 *
2588 * Allowed only after the port was created.
2589 *
2590 * Return: A pointer to the FMan device
2591 */
2592struct fman *fman_bind(struct device *fm_dev)
2593{
2594        return (struct fman *)(dev_get_drvdata(get_device(fm_dev)));
2595}
2596EXPORT_SYMBOL(fman_bind);
2597
2598static irqreturn_t fman_err_irq(int irq, void *handle)
2599{
2600        struct fman *fman = (struct fman *)handle;
2601        u32 pending;
2602        struct fman_fpm_regs __iomem *fpm_rg;
2603        irqreturn_t single_ret, ret = IRQ_NONE;
2604
2605        if (!is_init_done(fman->cfg))
2606                return IRQ_NONE;
2607
2608        fpm_rg = fman->fpm_regs;
2609
2610        /* error interrupts */
2611        pending = ioread32be(&fpm_rg->fm_epi);
2612        if (!pending)
2613                return IRQ_NONE;
2614
2615        if (pending & ERR_INTR_EN_BMI) {
2616                single_ret = bmi_err_event(fman);
2617                if (single_ret == IRQ_HANDLED)
2618                        ret = IRQ_HANDLED;
2619        }
2620        if (pending & ERR_INTR_EN_QMI) {
2621                single_ret = qmi_err_event(fman);
2622                if (single_ret == IRQ_HANDLED)
2623                        ret = IRQ_HANDLED;
2624        }
2625        if (pending & ERR_INTR_EN_FPM) {
2626                single_ret = fpm_err_event(fman);
2627                if (single_ret == IRQ_HANDLED)
2628                        ret = IRQ_HANDLED;
2629        }
2630        if (pending & ERR_INTR_EN_DMA) {
2631                single_ret = dma_err_event(fman);
2632                if (single_ret == IRQ_HANDLED)
2633                        ret = IRQ_HANDLED;
2634        }
2635        if (pending & ERR_INTR_EN_MURAM) {
2636                single_ret = muram_err_intr(fman);
2637                if (single_ret == IRQ_HANDLED)
2638                        ret = IRQ_HANDLED;
2639        }
2640
2641        /* MAC error interrupts */
2642        if (pending & ERR_INTR_EN_MAC0) {
2643                single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 0);
2644                if (single_ret == IRQ_HANDLED)
2645                        ret = IRQ_HANDLED;
2646        }
2647        if (pending & ERR_INTR_EN_MAC1) {
2648                single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 1);
2649                if (single_ret == IRQ_HANDLED)
2650                        ret = IRQ_HANDLED;
2651        }
2652        if (pending & ERR_INTR_EN_MAC2) {
2653                single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 2);
2654                if (single_ret == IRQ_HANDLED)
2655                        ret = IRQ_HANDLED;
2656        }
2657        if (pending & ERR_INTR_EN_MAC3) {
2658                single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 3);
2659                if (single_ret == IRQ_HANDLED)
2660                        ret = IRQ_HANDLED;
2661        }
2662        if (pending & ERR_INTR_EN_MAC4) {
2663                single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 4);
2664                if (single_ret == IRQ_HANDLED)
2665                        ret = IRQ_HANDLED;
2666        }
2667        if (pending & ERR_INTR_EN_MAC5) {
2668                single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 5);
2669                if (single_ret == IRQ_HANDLED)
2670                        ret = IRQ_HANDLED;
2671        }
2672        if (pending & ERR_INTR_EN_MAC6) {
2673                single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 6);
2674                if (single_ret == IRQ_HANDLED)
2675                        ret = IRQ_HANDLED;
2676        }
2677        if (pending & ERR_INTR_EN_MAC7) {
2678                single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 7);
2679                if (single_ret == IRQ_HANDLED)
2680                        ret = IRQ_HANDLED;
2681        }
2682        if (pending & ERR_INTR_EN_MAC8) {
2683                single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 8);
2684                if (single_ret == IRQ_HANDLED)
2685                        ret = IRQ_HANDLED;
2686        }
2687        if (pending & ERR_INTR_EN_MAC9) {
2688                single_ret = call_mac_isr(fman, FMAN_EV_ERR_MAC0 + 9);
2689                if (single_ret == IRQ_HANDLED)
2690                        ret = IRQ_HANDLED;
2691        }
2692
2693        return ret;
2694}
2695
2696static irqreturn_t fman_irq(int irq, void *handle)
2697{
2698        struct fman *fman = (struct fman *)handle;
2699        u32 pending;
2700        struct fman_fpm_regs __iomem *fpm_rg;
2701        irqreturn_t single_ret, ret = IRQ_NONE;
2702
2703        if (!is_init_done(fman->cfg))
2704                return IRQ_NONE;
2705
2706        fpm_rg = fman->fpm_regs;
2707
2708        /* normal interrupts */
2709        pending = ioread32be(&fpm_rg->fm_npi);
2710        if (!pending)
2711                return IRQ_NONE;
2712
2713        if (pending & INTR_EN_QMI) {
2714                single_ret = qmi_event(fman);
2715                if (single_ret == IRQ_HANDLED)
2716                        ret = IRQ_HANDLED;
2717        }
2718
2719        /* MAC interrupts */
2720        if (pending & INTR_EN_MAC0) {
2721                single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 0);
2722                if (single_ret == IRQ_HANDLED)
2723                        ret = IRQ_HANDLED;
2724        }
2725        if (pending & INTR_EN_MAC1) {
2726                single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 1);
2727                if (single_ret == IRQ_HANDLED)
2728                        ret = IRQ_HANDLED;
2729        }
2730        if (pending & INTR_EN_MAC2) {
2731                single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 2);
2732                if (single_ret == IRQ_HANDLED)
2733                        ret = IRQ_HANDLED;
2734        }
2735        if (pending & INTR_EN_MAC3) {
2736                single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 3);
2737                if (single_ret == IRQ_HANDLED)
2738                        ret = IRQ_HANDLED;
2739        }
2740        if (pending & INTR_EN_MAC4) {
2741                single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 4);
2742                if (single_ret == IRQ_HANDLED)
2743                        ret = IRQ_HANDLED;
2744        }
2745        if (pending & INTR_EN_MAC5) {
2746                single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 5);
2747                if (single_ret == IRQ_HANDLED)
2748                        ret = IRQ_HANDLED;
2749        }
2750        if (pending & INTR_EN_MAC6) {
2751                single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 6);
2752                if (single_ret == IRQ_HANDLED)
2753                        ret = IRQ_HANDLED;
2754        }
2755        if (pending & INTR_EN_MAC7) {
2756                single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 7);
2757                if (single_ret == IRQ_HANDLED)
2758                        ret = IRQ_HANDLED;
2759        }
2760        if (pending & INTR_EN_MAC8) {
2761                single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 8);
2762                if (single_ret == IRQ_HANDLED)
2763                        ret = IRQ_HANDLED;
2764        }
2765        if (pending & INTR_EN_MAC9) {
2766                single_ret = call_mac_isr(fman, FMAN_EV_MAC0 + 9);
2767                if (single_ret == IRQ_HANDLED)
2768                        ret = IRQ_HANDLED;
2769        }
2770
2771        return ret;
2772}
2773
2774#ifndef __rtems__
2775static const struct of_device_id fman_muram_match[] = {
2776        {
2777                .compatible = "fsl,fman-muram"},
2778        {}
2779};
2780MODULE_DEVICE_TABLE(of, fman_muram_match);
2781#endif /* __rtems__ */
2782
2783static struct fman *read_dts_node(struct platform_device *of_dev)
2784{
2785        struct fman *fman;
2786#ifndef __rtems__
2787        struct device_node *fm_node, *muram_node;
2788        struct resource *res;
2789#else /* __rtems__ */
2790        const char *fdt = bsp_fdt_get();
2791        struct device_node *fm_node;
2792#endif /* __rtems__ */
2793        u32 val, range[2];
2794        int err, irq;
2795#ifndef __rtems__
2796        struct clk *clk;
2797        u32 clk_rate;
2798#endif /* __rtems__ */
2799        phys_addr_t phys_base_addr;
2800#ifndef __rtems__
2801        resource_size_t mem_size;
2802#endif /* __rtems__ */
2803
2804        fman = kzalloc(sizeof(*fman), GFP_KERNEL);
2805        if (!fman)
2806                return NULL;
2807
2808        fm_node = of_node_get(of_dev->dev.of_node);
2809
2810        err = of_property_read_u32(fm_node, "cell-index", &val);
2811        if (err) {
2812                dev_err(&of_dev->dev, "%s: failed to read cell-index for %s\n",
2813                        __func__, fm_node->full_name);
2814                goto fman_node_put;
2815        }
2816        fman->dts_params.id = (u8)val;
2817
2818#ifndef __rtems__
2819        /* Get the FM interrupt */
2820        res = platform_get_resource(of_dev, IORESOURCE_IRQ, 0);
2821        if (!res) {
2822                dev_err(&of_dev->dev, "%s: Can't get FMan IRQ resource\n",
2823                        __func__);
2824                goto fman_node_put;
2825        }
2826        irq = res->start;
2827
2828        /* Get the FM error interrupt */
2829        res = platform_get_resource(of_dev, IORESOURCE_IRQ, 1);
2830        if (!res) {
2831                dev_err(&of_dev->dev, "%s: Can't get FMan Error IRQ resource\n",
2832                        __func__);
2833                goto fman_node_put;
2834        }
2835        fman->dts_params.err_irq = res->start;
2836
2837        /* Get the FM address */
2838        res = platform_get_resource(of_dev, IORESOURCE_MEM, 0);
2839        if (!res) {
2840                dev_err(&of_dev->dev, "%s: Can't get FMan memory resource\n",
2841                        __func__);
2842                goto fman_node_put;
2843        }
2844
2845        phys_base_addr = res->start;
2846        mem_size = resource_size(res);
2847
2848#else /* __rtems__ */
2849        irq = of_irq_to_resource(fm_node, 0, NULL);
2850        fman->dts_params.err_irq = of_irq_to_resource(fm_node, 1, NULL);
2851        phys_base_addr = of_dev->dev.base;
2852        fman->dts_params.base_addr = (void *)(uintptr_t)phys_base_addr;
2853#endif /* __rtems__ */
2854
2855#ifndef __rtems__
2856        clk = of_clk_get(fm_node, 0);
2857        if (IS_ERR(clk)) {
2858                dev_err(&of_dev->dev, "%s: Failed to get FM%d clock structure\n",
2859                        __func__, fman->dts_params.id);
2860                goto fman_node_put;
2861        }
2862
2863        clk_rate = clk_get_rate(clk);
2864        if (!clk_rate) {
2865                dev_err(&of_dev->dev, "%s: Failed to determine FM%d clock rate\n",
2866                        __func__, fman->dts_params.id);
2867                goto fman_node_put;
2868        }
2869        /* Rounding to MHz */
2870        fman->dts_params.clk_freq = DIV_ROUND_UP(clk_rate, 1000000);
2871#else /* __rtems__ */
2872        /* FIXME */
2873        fman->dts_params.clk_freq = 733;
2874#endif /* __rtems__ */
2875
2876        err = of_property_read_u32_array(fm_node, "fsl,qman-channel-range",
2877                                         &range[0], 2);
2878        if (err) {
2879                dev_err(&of_dev->dev, "%s: failed to read fsl,qman-channel-range for %s\n",
2880                        __func__, fm_node->full_name);
2881                goto fman_node_put;
2882        }
2883        fman->dts_params.qman_channel_base = range[0];
2884        fman->dts_params.num_of_qman_channels = range[1];
2885
2886        /* Get the MURAM base address and size */
2887#ifndef __rtems__
2888        /* FIXME */
2889        muram_node = of_find_matching_node(fm_node, fman_muram_match);
2890        if (!muram_node) {
2891                dev_err(&of_dev->dev, "%s: could not find MURAM node\n",
2892                        __func__);
2893                goto fman_node_put;
2894        }
2895
2896        err = of_address_to_resource(muram_node, 0,
2897                                     &fman->dts_params.muram_res);
2898        if (err) {
2899                of_node_put(muram_node);
2900                dev_err(&of_dev->dev, "%s: of_address_to_resource() = %d\n",
2901                        __func__, err);
2902                goto fman_node_put;
2903        }
2904#else /* __rtems__ */
2905        {
2906                int node = fdt_node_offset_by_compatible(fdt,
2907                    fm_node->offset, "fsl,fman-muram");
2908                struct device_node muram_node = {
2909                        .offset = node
2910                };
2911                struct resource res;
2912
2913                err = of_address_to_resource(&muram_node, 0, &res);
2914                if (err != 0) {
2915                        pr_err("could not find MURAM node\n");
2916                        goto fman_node_put;
2917                }
2918                fman->dts_params.muram_res.start = phys_base_addr + res.start;
2919                fman->dts_params.muram_res.end = phys_base_addr + res.end - 1;
2920        }
2921#endif /* __rtems__ */
2922#ifndef __rtems__
2923        of_node_put(muram_node);
2924#endif /* __rtems__ */
2925
2926        err = devm_request_irq(&of_dev->dev, irq, fman_irq, 0, "fman", fman);
2927        if (err < 0) {
2928                dev_err(&of_dev->dev, "%s: irq %d allocation failed (error = %d)\n",
2929                        __func__, irq, err);
2930                goto fman_free;
2931        }
2932
2933        if (fman->dts_params.err_irq != 0) {
2934                err = devm_request_irq(&of_dev->dev, fman->dts_params.err_irq,
2935                                       fman_err_irq, IRQF_SHARED,
2936                                       "fman-err", fman);
2937                if (err < 0) {
2938                        dev_err(&of_dev->dev, "%s: irq %d allocation failed (error = %d)\n",
2939                                __func__, fman->dts_params.err_irq, err);
2940                        goto fman_free;
2941                }
2942        }
2943
2944#ifndef __rtems__
2945        fman->dts_params.res =
2946                devm_request_mem_region(&of_dev->dev, phys_base_addr,
2947                                        mem_size, "fman");
2948        if (!fman->dts_params.res) {
2949                dev_err(&of_dev->dev, "%s: request_mem_region() failed\n",
2950                        __func__);
2951                goto fman_free;
2952        }
2953
2954        fman->dts_params.base_addr =
2955                devm_ioremap(&of_dev->dev, phys_base_addr, mem_size);
2956        if (!fman->dts_params.base_addr) {
2957                dev_err(&of_dev->dev, "%s: devm_ioremap() failed\n", __func__);
2958                goto fman_free;
2959        }
2960
2961        fman->dev = &of_dev->dev;
2962
2963        err = of_platform_populate(fm_node, NULL, NULL, &of_dev->dev);
2964        if (err) {
2965                dev_err(&of_dev->dev, "%s: of_platform_populate() failed\n",
2966                        __func__);
2967                goto fman_free;
2968        }
2969#endif /* __rtems__ */
2970
2971        return fman;
2972
2973fman_node_put:
2974        of_node_put(fm_node);
2975fman_free:
2976        kfree(fman);
2977        return NULL;
2978}
2979
2980static int fman_probe(struct platform_device *of_dev)
2981{
2982        struct fman *fman;
2983        struct device *dev;
2984        int err;
2985
2986        dev = &of_dev->dev;
2987
2988        fman = read_dts_node(of_dev);
2989        if (!fman)
2990                return -EIO;
2991
2992        err = fman_config(fman);
2993        if (err) {
2994                dev_err(dev, "%s: FMan config failed\n", __func__);
2995                return -EINVAL;
2996        }
2997
2998        if (fman_init(fman) != 0) {
2999                dev_err(dev, "%s: FMan init failed\n", __func__);
3000                return -EINVAL;
3001        }
3002
3003        if (fman->dts_params.err_irq == 0) {
3004                fman_set_exception(fman, FMAN_EX_DMA_BUS_ERROR, false);
3005                fman_set_exception(fman, FMAN_EX_DMA_READ_ECC, false);
3006                fman_set_exception(fman, FMAN_EX_DMA_SYSTEM_WRITE_ECC, false);
3007                fman_set_exception(fman, FMAN_EX_DMA_FM_WRITE_ECC, false);
3008                fman_set_exception(fman, FMAN_EX_DMA_SINGLE_PORT_ECC, false);
3009                fman_set_exception(fman, FMAN_EX_FPM_STALL_ON_TASKS, false);
3010                fman_set_exception(fman, FMAN_EX_FPM_SINGLE_ECC, false);
3011                fman_set_exception(fman, FMAN_EX_FPM_DOUBLE_ECC, false);
3012                fman_set_exception(fman, FMAN_EX_QMI_SINGLE_ECC, false);
3013                fman_set_exception(fman, FMAN_EX_QMI_DOUBLE_ECC, false);
3014                fman_set_exception(fman,
3015                                   FMAN_EX_QMI_DEQ_FROM_UNKNOWN_PORTID, false);
3016                fman_set_exception(fman, FMAN_EX_BMI_LIST_RAM_ECC, false);
3017                fman_set_exception(fman, FMAN_EX_BMI_STORAGE_PROFILE_ECC,
3018                                   false);
3019                fman_set_exception(fman, FMAN_EX_BMI_STATISTICS_RAM_ECC, false);
3020                fman_set_exception(fman, FMAN_EX_BMI_DISPATCH_RAM_ECC, false);
3021        }
3022
3023        dev_set_drvdata(dev, fman);
3024
3025        dev_dbg(dev, "FMan%d probed\n", fman->dts_params.id);
3026
3027        return 0;
3028}
3029
3030#ifndef __rtems__
3031static const struct of_device_id fman_match[] = {
3032        {
3033                .compatible = "fsl,fman"},
3034        {}
3035};
3036
3037MODULE_DEVICE_TABLE(of, fman_match);
3038
3039static struct platform_driver fman_driver = {
3040        .driver = {
3041                .name = "fsl-fman",
3042                .of_match_table = fman_match,
3043        },
3044        .probe = fman_probe,
3045};
3046
3047static int __init fman_load(void)
3048{
3049        int err;
3050
3051        pr_debug("FSL DPAA FMan driver\n");
3052
3053        err = platform_driver_register(&fman_driver);
3054        if (err < 0)
3055                pr_err("Error, platform_driver_register() = %d\n", err);
3056
3057        return err;
3058}
3059module_init(fman_load);
3060
3061static void __exit fman_unload(void)
3062{
3063        platform_driver_unregister(&fman_driver);
3064}
3065module_exit(fman_unload);
3066
3067MODULE_LICENSE("Dual BSD/GPL");
3068MODULE_DESCRIPTION("Freescale DPAA Frame Manager driver");
3069#else /* __rtems__ */
3070#include <sys/cdefs.h>
3071#include <sys/param.h>
3072#include <sys/systm.h>
3073#include <sys/bus.h>
3074#include <sys/kernel.h>
3075
3076int
3077fman_reset(struct fman *fman)
3078{
3079
3080        /*
3081         * Ignore errata A007273, since we do not disable the Ethernet MAC
3082         * clocks.
3083         */
3084
3085        out_be32(&fman->fpm_regs->fm_rstc, FPM_RSTC_FM_RESET);
3086        /* Memory barrier */
3087        mb();
3088        usleep_range(100, 300);
3089
3090        if (!!(ioread32be(&fman->qmi_regs->fmqm_gs) &
3091            QMI_GS_HALT_NOT_BUSY)) {
3092                usleep_range(100, 300);
3093        }
3094
3095        return (0);
3096}
3097
3098struct fman_softc {
3099        struct platform_device of_dev;
3100        struct device_node dn;
3101};
3102
3103static int
3104fman_dev_probe_fdt(struct fman_softc *sc, int unit)
3105{
3106        const char *fdt = bsp_fdt_get();
3107        const char *name = "fsl,fman";
3108        int node = 0;
3109
3110        while (1) {
3111                node = fdt_node_offset_by_compatible(fdt, node, name);
3112                if (node >= 0) {
3113                        int len;
3114                        const fdt32_t *p = fdt_getprop(fdt, node, "cell-index", &len);
3115
3116                        if (p != NULL && len == sizeof(*p)) {
3117                                if (fdt32_to_cpu(*p) == (uint32_t)unit) {
3118                                        sc->dn.offset = node;
3119                                        sc->dn.full_name = name;
3120                                        sc->of_dev.dev.of_node = &sc->dn;
3121                                        sc->of_dev.dev.base = (uintptr_t)&qoriq.fman[unit];
3122                                        return (BUS_PROBE_DEFAULT);
3123                                }
3124                        } else {
3125                                return (ENXIO);
3126                        }
3127                } else {
3128                        return (ENXIO);
3129                }
3130        }
3131}
3132
3133static int
3134fman_dev_probe(device_t dev)
3135{
3136        struct fman_softc *sc = device_get_softc(dev);
3137
3138        device_set_desc(dev, "FMan");
3139
3140        return (fman_dev_probe_fdt(sc, device_get_unit(dev)));
3141}
3142
3143static int
3144fman_dev_attach(device_t dev)
3145{
3146        const char *fdt = bsp_fdt_get();
3147        struct fman_softc *sc = device_get_softc(dev);
3148        int node;
3149        int err;
3150
3151        err = fman_probe(&sc->of_dev);
3152        if (err != 0) {
3153                return (ENXIO);
3154        }
3155
3156        node = fdt_first_subnode(fdt, sc->dn.offset);
3157        while (node >= 0) {
3158                struct fman_ivars *ivars =
3159                    kzalloc(sizeof(*ivars), GFP_KERNEL);
3160                device_t child;
3161
3162                if (ivars == NULL) {
3163                        return (ENOMEM);
3164                }
3165
3166                ivars->dn.offset = node;
3167                ivars->of_dev.dev.of_node = &ivars->dn;
3168                ivars->of_dev.dev.base = sc->of_dev.dev.base;
3169                ivars->fman = dev_get_drvdata(&sc->of_dev.dev);
3170
3171                child = device_add_child(dev, NULL, -1);
3172                if (child == NULL) {
3173                        kfree(ivars);
3174                        return (ENOMEM);
3175                }
3176
3177                device_set_ivars(child, ivars);
3178
3179                err = device_probe_and_attach(child);
3180                if (err != 0) {
3181                        kfree(ivars);
3182                }
3183
3184                node = fdt_next_subnode(fdt, node);
3185        }
3186
3187        return (0);
3188}
3189
3190static int
3191fman_dev_detach(device_t dev)
3192{
3193        struct fman_softc *sc = device_get_softc(dev);
3194        int err;
3195
3196        err = bus_generic_detach(dev);
3197        if (err == 0) {
3198                fman_reset(dev_get_drvdata(&sc->of_dev.dev));
3199        }
3200
3201        return (err);
3202}
3203
3204static device_method_t fman_methods[] = {
3205        /* Device interface */
3206        DEVMETHOD(device_probe, fman_dev_probe),
3207        DEVMETHOD(device_attach, fman_dev_attach),
3208        DEVMETHOD(device_detach, fman_dev_detach),
3209        DEVMETHOD(device_suspend, bus_generic_suspend),
3210        DEVMETHOD(device_resume, bus_generic_resume),
3211        DEVMETHOD(device_shutdown, bus_generic_shutdown),
3212
3213        DEVMETHOD_END
3214};
3215
3216driver_t fman_driver = {
3217        .name = "fman",
3218        .methods = fman_methods,
3219        .size = sizeof(struct fman_softc),
3220};
3221
3222static devclass_t fman_devclass;
3223
3224DRIVER_MODULE(fman, nexus, fman_driver, fman_devclass, 0, 0);
3225#endif /* __rtems__ */
Note: See TracBrowser for help on using the repository browser.