xref: /freebsd/sys/contrib/ncsw/Peripherals/FM/fm_ncsw.c (revision dd41de95a84d979615a2ef11df6850622bf6184e)
1 /*
2  * Copyright 2008-2012 Freescale Semiconductor Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above copyright
9  *       notice, this list of conditions and the following disclaimer in the
10  *       documentation and/or other materials provided with the distribution.
11  *     * Neither the name of Freescale Semiconductor nor the
12  *       names of its contributors may be used to endorse or promote products
13  *       derived from this software without specific prior written permission.
14  *
15  *
16  * ALTERNATIVELY, this software may be distributed under the terms of the
17  * GNU General Public License ("GPL") as published by the Free Software
18  * Foundation, either version 2 of that License or (at your option) any
19  * later version.
20  *
21  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 
34 /******************************************************************************
35  @File          fm.c
36 
37  @Description   FM driver routines implementation.
38 *//***************************************************************************/
39 #include "std_ext.h"
40 #include "error_ext.h"
41 #include "xx_ext.h"
42 #include "string_ext.h"
43 #include "sprint_ext.h"
44 #include "debug_ext.h"
45 #include "fm_muram_ext.h"
46 #include <linux/math64.h>
47 
48 #include "fm_common.h"
49 #include "fm_ipc.h"
50 #include "fm.h"
51 #include "fsl_fman.h"
52 
53 
54 /****************************************/
55 /*       static functions               */
56 /****************************************/
57 
58 static volatile bool blockingFlag = FALSE;
59 static void IpcMsgCompletionCB(t_Handle   h_Fm,
60                                uint8_t    *p_Msg,
61                                uint8_t    *p_Reply,
62                                uint32_t   replyLength,
63                                t_Error    status)
64 {
65     UNUSED(h_Fm);UNUSED(p_Msg);UNUSED(p_Reply);UNUSED(replyLength);UNUSED(status);
66     blockingFlag = FALSE;
67 }
68 
69 static void FreeInitResources(t_Fm *p_Fm)
70 {
71     if (p_Fm->camBaseAddr)
72        FM_MURAM_FreeMem(p_Fm->h_FmMuram, UINT_TO_PTR(p_Fm->camBaseAddr));
73     if (p_Fm->fifoBaseAddr)
74        FM_MURAM_FreeMem(p_Fm->h_FmMuram, UINT_TO_PTR(p_Fm->fifoBaseAddr));
75     if (p_Fm->resAddr)
76        FM_MURAM_FreeMem(p_Fm->h_FmMuram, UINT_TO_PTR(p_Fm->resAddr));
77 }
78 
79 static bool IsFmanCtrlCodeLoaded(t_Fm *p_Fm)
80 {
81     t_FMIramRegs    *p_Iram;
82 
83     ASSERT_COND(p_Fm);
84     p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM);
85 
86     return (bool)!!(GET_UINT32(p_Iram->iready) & IRAM_READY);
87 }
88 
89 static t_Error CheckFmParameters(t_Fm *p_Fm)
90 {
91     if (IsFmanCtrlCodeLoaded(p_Fm) && !p_Fm->resetOnInit)
92         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Old FMan CTRL code is loaded; FM must be reset!"));
93 #if (DPAA_VERSION < 11)
94     if (!p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats ||
95         (p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats > DMA_MODE_MAX_AXI_DBG_NUM_OF_BEATS))
96         RETURN_ERROR(MAJOR, E_INVALID_VALUE,
97                      ("axiDbgNumOfBeats has to be in the range 1 - %d", DMA_MODE_MAX_AXI_DBG_NUM_OF_BEATS));
98 #endif /* (DPAA_VERSION < 11) */
99     if (p_Fm->p_FmDriverParam->dma_cam_num_of_entries % DMA_CAM_UNITS)
100         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_cam_num_of_entries has to be divisble by %d", DMA_CAM_UNITS));
101 //    if (!p_Fm->p_FmDriverParam->dma_cam_num_of_entries || (p_Fm->p_FmDriverParam->dma_cam_num_of_entries > DMA_MODE_MAX_CAM_NUM_OF_ENTRIES))
102 //        RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_cam_num_of_entries has to be in the range 1 - %d", DMA_MODE_MAX_CAM_NUM_OF_ENTRIES));
103     if (p_Fm->p_FmDriverParam->dma_comm_qtsh_asrt_emer > DMA_THRESH_MAX_COMMQ)
104         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_comm_qtsh_asrt_emer can not be larger than %d", DMA_THRESH_MAX_COMMQ));
105     if (p_Fm->p_FmDriverParam->dma_comm_qtsh_clr_emer > DMA_THRESH_MAX_COMMQ)
106         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_comm_qtsh_clr_emer can not be larger than %d", DMA_THRESH_MAX_COMMQ));
107     if (p_Fm->p_FmDriverParam->dma_comm_qtsh_clr_emer >= p_Fm->p_FmDriverParam->dma_comm_qtsh_asrt_emer)
108         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_comm_qtsh_clr_emer must be smaller than dma_comm_qtsh_asrt_emer"));
109 #if (DPAA_VERSION < 11)
110     if (p_Fm->p_FmDriverParam->dma_read_buf_tsh_asrt_emer > DMA_THRESH_MAX_BUF)
111         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_read_buf_tsh_asrt_emer can not be larger than %d", DMA_THRESH_MAX_BUF));
112     if (p_Fm->p_FmDriverParam->dma_read_buf_tsh_clr_emer > DMA_THRESH_MAX_BUF)
113         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_read_buf_tsh_clr_emer can not be larger than %d", DMA_THRESH_MAX_BUF));
114     if (p_Fm->p_FmDriverParam->dma_read_buf_tsh_clr_emer >= p_Fm->p_FmDriverParam->dma_read_buf_tsh_asrt_emer)
115         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_read_buf_tsh_clr_emer must be smaller than dma_read_buf_tsh_asrt_emer"));
116     if (p_Fm->p_FmDriverParam->dma_write_buf_tsh_asrt_emer > DMA_THRESH_MAX_BUF)
117         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_write_buf_tsh_asrt_emer can not be larger than %d", DMA_THRESH_MAX_BUF));
118     if (p_Fm->p_FmDriverParam->dma_write_buf_tsh_clr_emer > DMA_THRESH_MAX_BUF)
119         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_write_buf_tsh_clr_emer can not be larger than %d", DMA_THRESH_MAX_BUF));
120     if (p_Fm->p_FmDriverParam->dma_write_buf_tsh_clr_emer >= p_Fm->p_FmDriverParam->dma_write_buf_tsh_asrt_emer)
121         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_write_buf_tsh_clr_emer must be smaller than dma_write_buf_tsh_asrt_emer"));
122 #else /* (DPAA_VERSION >= 11) */
123     if ((p_Fm->p_FmDriverParam->dma_dbg_cnt_mode == E_FMAN_DMA_DBG_CNT_INT_READ_EM)||
124             (p_Fm->p_FmDriverParam->dma_dbg_cnt_mode == E_FMAN_DMA_DBG_CNT_INT_WRITE_EM) ||
125             (p_Fm->p_FmDriverParam->dma_dbg_cnt_mode == E_FMAN_DMA_DBG_CNT_RAW_WAR_PROT))
126         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_dbg_cnt_mode value not supported by this integration."));
127     if ((p_Fm->p_FmDriverParam->dma_emergency_bus_select == FM_DMA_MURAM_READ_EMERGENCY)||
128             (p_Fm->p_FmDriverParam->dma_emergency_bus_select == FM_DMA_MURAM_WRITE_EMERGENCY))
129         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("emergencyBusSelect value not supported by this integration."));
130     if (p_Fm->p_FmDriverParam->dma_stop_on_bus_error)
131         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_stop_on_bus_error not supported by this integration."));
132 #ifdef FM_AID_MODE_NO_TNUM_SW005
133     if (p_Fm->p_FmDriverParam->dma_aid_mode != E_FMAN_DMA_AID_OUT_PORT_ID)
134             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_aid_mode not supported by this integration."));
135 #endif /* FM_AID_MODE_NO_TNUM_SW005 */
136     if (p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats)
137         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_axi_dbg_num_of_beats not supported by this integration."));
138 #endif /* (DPAA_VERSION < 11) */
139 
140     if (!p_Fm->p_FmStateStruct->fmClkFreq)
141         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fmClkFreq must be set."));
142     if (USEC_TO_CLK(p_Fm->p_FmDriverParam->dma_watchdog, p_Fm->p_FmStateStruct->fmClkFreq) > DMA_MAX_WATCHDOG)
143         RETURN_ERROR(MAJOR, E_INVALID_VALUE,
144                      ("dma_watchdog depends on FM clock. dma_watchdog(in microseconds) * clk (in Mhz), may not exceed 0x08x", DMA_MAX_WATCHDOG));
145 
146 #if (DPAA_VERSION >= 11)
147     if ((p_Fm->partVSPBase + p_Fm->partNumOfVSPs) > FM_VSP_MAX_NUM_OF_ENTRIES)
148         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("partVSPBase+partNumOfVSPs out of range!!!"));
149 #endif /* (DPAA_VERSION >= 11) */
150 
151     if (p_Fm->p_FmStateStruct->totalFifoSize % BMI_FIFO_UNITS)
152         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalFifoSize number has to be divisible by %d", BMI_FIFO_UNITS));
153     if (!p_Fm->p_FmStateStruct->totalFifoSize ||
154         (p_Fm->p_FmStateStruct->totalFifoSize > BMI_MAX_FIFO_SIZE))
155         RETURN_ERROR(MAJOR, E_INVALID_VALUE,
156                      ("totalFifoSize (currently defined as %d) has to be in the range of 256 to %d",
157                       p_Fm->p_FmStateStruct->totalFifoSize,
158                       BMI_MAX_FIFO_SIZE));
159     if (!p_Fm->p_FmStateStruct->totalNumOfTasks ||
160         (p_Fm->p_FmStateStruct->totalNumOfTasks > BMI_MAX_NUM_OF_TASKS))
161         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalNumOfTasks number has to be in the range 1 - %d", BMI_MAX_NUM_OF_TASKS));
162 
163 #ifdef FM_HAS_TOTAL_DMAS
164     if (!p_Fm->p_FmStateStruct->maxNumOfOpenDmas ||
165         (p_Fm->p_FmStateStruct->maxNumOfOpenDmas > BMI_MAX_NUM_OF_DMAS))
166         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("maxNumOfOpenDmas number has to be in the range 1 - %d", BMI_MAX_NUM_OF_DMAS));
167 #endif /* FM_HAS_TOTAL_DMAS */
168 
169     if (p_Fm->p_FmDriverParam->disp_limit_tsh > FPM_MAX_DISP_LIMIT)
170         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("disp_limit_tsh can't be greater than %d", FPM_MAX_DISP_LIMIT));
171 
172     if (!p_Fm->f_Exception)
173         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceptions callback not provided"));
174     if (!p_Fm->f_BusError)
175         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceptions callback not provided"));
176 
177 #ifdef FM_NO_WATCHDOG
178     if ((p_Fm->p_FmStateStruct->revInfo.majorRev == 2) &&
179         (p_Fm->p_FmDriverParam->dma_watchdog))
180         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("watchdog!"));
181 #endif /* FM_NO_WATCHDOG */
182 
183 #ifdef FM_ECC_HALT_NO_SYNC_ERRATA_10GMAC_A008
184     if ((p_Fm->p_FmStateStruct->revInfo.majorRev < 6) &&
185         (p_Fm->p_FmDriverParam->halt_on_unrecov_ecc_err))
186         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("HaltOnEccError!"));
187 #endif /* FM_ECC_HALT_NO_SYNC_ERRATA_10GMAC_A008 */
188 
189 #ifdef FM_NO_TNUM_AGING
190     if ((p_Fm->p_FmStateStruct->revInfo.majorRev != 4) &&
191         (p_Fm->p_FmStateStruct->revInfo.majorRev < 6))
192         if (p_Fm->p_FmDriverParam->tnum_aging_period)
193         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Tnum aging!"));
194 #endif /* FM_NO_TNUM_AGING */
195 
196     /* check that user did not set revision-dependent exceptions */
197 #ifdef FM_NO_DISPATCH_RAM_ECC
198     if ((p_Fm->p_FmStateStruct->revInfo.majorRev != 4) &&
199         (p_Fm->p_FmStateStruct->revInfo.majorRev < 6))
200         if (p_Fm->userSetExceptions & FM_EX_BMI_DISPATCH_RAM_ECC)
201             RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("exception e_FM_EX_BMI_DISPATCH_RAM_ECC!"));
202 #endif /* FM_NO_DISPATCH_RAM_ECC */
203 
204 #ifdef FM_QMI_NO_ECC_EXCEPTIONS
205     if (p_Fm->p_FmStateStruct->revInfo.majorRev == 4)
206         if (p_Fm->userSetExceptions & (FM_EX_QMI_SINGLE_ECC | FM_EX_QMI_DOUBLE_ECC))
207             RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("exception e_FM_EX_QMI_SINGLE_ECC/e_FM_EX_QMI_DOUBLE_ECC!"));
208 #endif /* FM_QMI_NO_ECC_EXCEPTIONS */
209 
210 #ifdef FM_QMI_NO_SINGLE_ECC_EXCEPTION
211     if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)
212         if (p_Fm->userSetExceptions & FM_EX_QMI_SINGLE_ECC)
213             RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("exception e_FM_EX_QMI_SINGLE_ECC!"));
214 #endif /* FM_QMI_NO_SINGLE_ECC_EXCEPTION */
215 
216     return E_OK;
217 }
218 
219 
220 static void SendIpcIsr(t_Fm *p_Fm, uint32_t macEvent, uint32_t pendingReg)
221 {
222     ASSERT_COND(p_Fm->guestId == NCSW_MASTER_ID);
223 
224     if (p_Fm->intrMng[macEvent].guestId == NCSW_MASTER_ID)
225         p_Fm->intrMng[macEvent].f_Isr(p_Fm->intrMng[macEvent].h_SrcHandle);
226 
227     /* If the MAC is running on guest-partition and we have IPC session with it,
228        we inform him about the event through IPC; otherwise, we ignore the event. */
229     else if (p_Fm->h_IpcSessions[p_Fm->intrMng[macEvent].guestId])
230     {
231         t_Error     err;
232         t_FmIpcIsr  fmIpcIsr;
233         t_FmIpcMsg  msg;
234 
235         memset(&msg, 0, sizeof(msg));
236         msg.msgId = FM_GUEST_ISR;
237         fmIpcIsr.pendingReg = pendingReg;
238         fmIpcIsr.boolErr = FALSE;
239         memcpy(msg.msgBody, &fmIpcIsr, sizeof(fmIpcIsr));
240         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[p_Fm->intrMng[macEvent].guestId],
241                                 (uint8_t*)&msg,
242                                 sizeof(msg.msgId) + sizeof(fmIpcIsr),
243                                 NULL,
244                                 NULL,
245                                 NULL,
246                                 NULL);
247         if (err != E_OK)
248             REPORT_ERROR(MINOR, err, NO_MSG);
249     }
250     else
251         DBG(TRACE, ("FM Guest mode, without IPC - can't call ISR!"));
252 }
253 
254 static void BmiErrEvent(t_Fm *p_Fm)
255 {
256     uint32_t    event;
257     struct fman_bmi_regs *bmi_rg = p_Fm->p_FmBmiRegs;
258 
259 
260     event = fman_get_bmi_err_event(bmi_rg);
261 
262     if (event & BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC)
263         p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_BMI_STORAGE_PROFILE_ECC);
264     if (event & BMI_ERR_INTR_EN_LIST_RAM_ECC)
265         p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_BMI_LIST_RAM_ECC);
266     if (event & BMI_ERR_INTR_EN_STATISTICS_RAM_ECC)
267         p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_BMI_STATISTICS_RAM_ECC);
268     if (event & BMI_ERR_INTR_EN_DISPATCH_RAM_ECC)
269         p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_BMI_DISPATCH_RAM_ECC);
270 }
271 
272 static void    QmiErrEvent(t_Fm *p_Fm)
273 {
274     uint32_t    event;
275     struct fman_qmi_regs *qmi_rg = p_Fm->p_FmQmiRegs;
276 
277     event = fman_get_qmi_err_event(qmi_rg);
278 
279     if (event & QMI_ERR_INTR_EN_DOUBLE_ECC)
280         p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_QMI_DOUBLE_ECC);
281     if (event & QMI_ERR_INTR_EN_DEQ_FROM_DEF)
282         p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_QMI_DEQ_FROM_UNKNOWN_PORTID);
283 }
284 
285 static void    DmaErrEvent(t_Fm *p_Fm)
286 {
287     uint32_t            status, com_id;
288     uint8_t             tnum;
289     uint8_t             hardwarePortId;
290     uint8_t             relativePortId;
291     uint16_t            liodn;
292     struct fman_dma_regs *dma_rg = p_Fm->p_FmDmaRegs;
293 
294     status = fman_get_dma_err_event(dma_rg);
295 
296     if (status & DMA_STATUS_BUS_ERR)
297     {
298         com_id = fman_get_dma_com_id(dma_rg);
299         hardwarePortId = (uint8_t)(((com_id & DMA_TRANSFER_PORTID_MASK) >> DMA_TRANSFER_PORTID_SHIFT));
300         ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));
301         HW_PORT_ID_TO_SW_PORT_ID(relativePortId, hardwarePortId);
302         tnum = (uint8_t)((com_id & DMA_TRANSFER_TNUM_MASK) >> DMA_TRANSFER_TNUM_SHIFT);
303         liodn = (uint16_t)(com_id & DMA_TRANSFER_LIODN_MASK);
304         ASSERT_COND(p_Fm->p_FmStateStruct->portsTypes[hardwarePortId] != e_FM_PORT_TYPE_DUMMY);
305         p_Fm->f_BusError(p_Fm->h_App,
306                          p_Fm->p_FmStateStruct->portsTypes[hardwarePortId],
307                          relativePortId,
308                          fman_get_dma_addr(dma_rg),
309                          tnum,
310                          liodn);
311     }
312         if (status & DMA_STATUS_FM_SPDAT_ECC)
313             p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_DMA_SINGLE_PORT_ECC);
314         if (status & DMA_STATUS_READ_ECC)
315             p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_DMA_READ_ECC);
316         if (status & DMA_STATUS_SYSTEM_WRITE_ECC)
317             p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_DMA_SYSTEM_WRITE_ECC);
318         if (status & DMA_STATUS_FM_WRITE_ECC)
319             p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_DMA_FM_WRITE_ECC);
320     }
321 
322 static void    FpmErrEvent(t_Fm *p_Fm)
323 {
324     uint32_t    event;
325     struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;
326 
327     event = fman_get_fpm_err_event(fpm_rg);
328 
329     if ((event  & FPM_EV_MASK_DOUBLE_ECC) && (event & FPM_EV_MASK_DOUBLE_ECC_EN))
330         p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_FPM_DOUBLE_ECC);
331     if ((event  & FPM_EV_MASK_STALL) && (event & FPM_EV_MASK_STALL_EN))
332         p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_FPM_STALL_ON_TASKS);
333     if ((event  & FPM_EV_MASK_SINGLE_ECC) && (event & FPM_EV_MASK_SINGLE_ECC_EN))
334         p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_FPM_SINGLE_ECC);
335 }
336 
337 static void    MuramErrIntr(t_Fm *p_Fm)
338 {
339     uint32_t    event;
340     struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;
341 
342     event = fman_get_muram_err_event(fpm_rg);
343 
344     if (event & FPM_RAM_MURAM_ECC)
345         p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_MURAM_ECC);
346 }
347 
348 static void IramErrIntr(t_Fm *p_Fm)
349 {
350     uint32_t    event;
351     struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;
352 
353     event = fman_get_iram_err_event(fpm_rg);
354 
355     if (event & FPM_RAM_IRAM_ECC)
356         p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_IRAM_ECC);
357 }
358 
359 static void QmiEvent(t_Fm *p_Fm)
360 {
361     uint32_t    event;
362     struct fman_qmi_regs *qmi_rg = p_Fm->p_FmQmiRegs;
363 
364     event = fman_get_qmi_event(qmi_rg);
365 
366     if (event & QMI_INTR_EN_SINGLE_ECC)
367         p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_QMI_SINGLE_ECC);
368 }
369 
370 static void UnimplementedIsr(t_Handle h_Arg)
371 {
372     UNUSED(h_Arg);
373 
374     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Unimplemented ISR!"));
375 }
376 
377 static void UnimplementedFmanCtrlIsr(t_Handle h_Arg, uint32_t event)
378 {
379     UNUSED(h_Arg); UNUSED(event);
380 
381     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Unimplemented FmCtl ISR!"));
382 }
383 
384 static void EnableTimeStamp(t_Fm *p_Fm)
385 {
386     struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;
387 
388     ASSERT_COND(p_Fm->p_FmStateStruct);
389     ASSERT_COND(p_Fm->p_FmStateStruct->count1MicroBit);
390 
391     fman_enable_time_stamp(fpm_rg, p_Fm->p_FmStateStruct->count1MicroBit, p_Fm->p_FmStateStruct->fmClkFreq);
392 
393     p_Fm->p_FmStateStruct->enabledTimeStamp = TRUE;
394 }
395 
396 static t_Error ClearIRam(t_Fm *p_Fm)
397 {
398     t_FMIramRegs    *p_Iram;
399     int             i;
400     int             iram_size;
401 
402     ASSERT_COND(p_Fm);
403     p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM);
404     iram_size = FM_IRAM_SIZE(p_Fm->p_FmStateStruct->revInfo.majorRev,p_Fm->p_FmStateStruct->revInfo.minorRev);
405 
406     /* Enable the auto-increment */
407     WRITE_UINT32(p_Iram->iadd, IRAM_IADD_AIE);
408     while (GET_UINT32(p_Iram->iadd) != IRAM_IADD_AIE) ;
409 
410     for (i=0; i < (iram_size/4); i++)
411         WRITE_UINT32(p_Iram->idata, 0xffffffff);
412 
413     WRITE_UINT32(p_Iram->iadd, iram_size - 4);
414     CORE_MemoryBarrier();
415     while (GET_UINT32(p_Iram->idata) != 0xffffffff) ;
416 
417     return E_OK;
418 }
419 
420 static t_Error LoadFmanCtrlCode(t_Fm *p_Fm)
421 {
422     t_FMIramRegs    *p_Iram;
423     int             i;
424     uint32_t        tmp;
425     uint8_t         compTo16;
426 
427     ASSERT_COND(p_Fm);
428     p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM);
429 
430     /* Enable the auto-increment */
431     WRITE_UINT32(p_Iram->iadd, IRAM_IADD_AIE);
432     while (GET_UINT32(p_Iram->iadd) != IRAM_IADD_AIE) ;
433 
434     for (i=0; i < (p_Fm->firmware.size / 4); i++)
435         WRITE_UINT32(p_Iram->idata, p_Fm->firmware.p_Code[i]);
436 
437     compTo16 = (uint8_t)(p_Fm->firmware.size % 16);
438     if (compTo16)
439         for (i=0; i < ((16-compTo16) / 4); i++)
440             WRITE_UINT32(p_Iram->idata, 0xffffffff);
441 
442     WRITE_UINT32(p_Iram->iadd,p_Fm->firmware.size-4);
443     while (GET_UINT32(p_Iram->iadd) != (p_Fm->firmware.size-4)) ;
444 
445     /* verify that writing has completed */
446     while (GET_UINT32(p_Iram->idata) != p_Fm->firmware.p_Code[(p_Fm->firmware.size / 4)-1]) ;
447 
448     if (p_Fm->fwVerify)
449     {
450         WRITE_UINT32(p_Iram->iadd, IRAM_IADD_AIE);
451         while (GET_UINT32(p_Iram->iadd) != IRAM_IADD_AIE) ;
452         for (i=0; i < (p_Fm->firmware.size / 4); i++)
453         {
454             tmp = GET_UINT32(p_Iram->idata);
455             if (tmp != p_Fm->firmware.p_Code[i])
456                 RETURN_ERROR(MAJOR, E_WRITE_FAILED,
457                              ("UCode write error : write 0x%x, read 0x%x",
458                               p_Fm->firmware.p_Code[i],tmp));
459         }
460         WRITE_UINT32(p_Iram->iadd, 0x0);
461     }
462 
463     /* Enable patch from IRAM */
464     WRITE_UINT32(p_Iram->iready, IRAM_READY);
465     XX_UDelay(1000);
466 
467     DBG(INFO, ("FMan-Controller code (ver %d.%d.%d) loaded to IRAM.",
468                ((uint16_t *)p_Fm->firmware.p_Code)[2],
469                ((uint8_t *)p_Fm->firmware.p_Code)[6],
470                ((uint8_t *)p_Fm->firmware.p_Code)[7]));
471 
472     return E_OK;
473 }
474 
475 #ifdef FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173
476 static t_Error FwNotResetErratumBugzilla6173WA(t_Fm *p_Fm)
477 {
478     t_FMIramRegs    *p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM);
479     uint32_t        tmpReg;
480     uint32_t        savedSpliodn[63];
481 
482     /* write to IRAM first location the debug instruction */
483     WRITE_UINT32(p_Iram->iadd, 0);
484     while (GET_UINT32(p_Iram->iadd) != 0) ;
485     WRITE_UINT32(p_Iram->idata, FM_FW_DEBUG_INSTRUCTION);
486 
487     WRITE_UINT32(p_Iram->iadd, 0);
488     while (GET_UINT32(p_Iram->iadd) != 0) ;
489     while (GET_UINT32(p_Iram->idata) != FM_FW_DEBUG_INSTRUCTION) ;
490 
491     /* Enable patch from IRAM */
492     WRITE_UINT32(p_Iram->iready, IRAM_READY);
493     CORE_MemoryBarrier();
494     XX_UDelay(100);
495     IO2MemCpy32((uint8_t *)savedSpliodn,
496                 (uint8_t *)p_Fm->p_FmBmiRegs->fmbm_spliodn,
497                 63*sizeof(uint32_t));
498 
499     /* reset FMAN */
500     WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rstc, FPM_RSTC_FM_RESET);
501     CORE_MemoryBarrier();
502     XX_UDelay(100);
503 
504     /* verify breakpoint debug status register */
505     tmpReg = GET_UINT32(*(uint32_t *)UINT_TO_PTR(p_Fm->baseAddr + FM_DEBUG_STATUS_REGISTER_OFFSET));
506     if (!tmpReg)
507         REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Invalid debug status register value is '0'"));
508 
509     /*************************************/
510     /* Load FMan-Controller code to IRAM */
511     /*************************************/
512     ClearIRam(p_Fm);
513     if (p_Fm->firmware.p_Code &&
514         (LoadFmanCtrlCode(p_Fm) != E_OK))
515         RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
516     XX_UDelay(100);
517 
518     /* reset FMAN again to start the microcode */
519     WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rstc, FPM_RSTC_FM_RESET);
520     CORE_MemoryBarrier();
521     XX_UDelay(100);
522     Mem2IOCpy32((uint8_t *)p_Fm->p_FmBmiRegs->fmbm_spliodn,
523                 (uint8_t *)savedSpliodn,
524                 63*sizeof(uint32_t));
525 
526     if (fman_is_qmi_halt_not_busy_state(p_Fm->p_FmQmiRegs))
527     {
528         fman_resume(p_Fm->p_FmFpmRegs);
529         CORE_MemoryBarrier();
530         XX_UDelay(100);
531     }
532 
533     return E_OK;
534 }
535 #endif /* FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */
536 
537 static void GuestErrorIsr(t_Fm *p_Fm, uint32_t pending)
538 {
539 #define FM_G_CALL_1G_MAC_ERR_ISR(_id)   \
540 do {                                    \
541     p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id)].h_SrcHandle);\
542 } while (0)
543 #define FM_G_CALL_10G_MAC_ERR_ISR(_id)  \
544 do {                                    \
545     p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id)].h_SrcHandle);\
546 } while (0)
547 
548     /* error interrupts */
549     if (pending & ERR_INTR_EN_1G_MAC0)
550         FM_G_CALL_1G_MAC_ERR_ISR(0);
551     if (pending & ERR_INTR_EN_1G_MAC1)
552         FM_G_CALL_1G_MAC_ERR_ISR(1);
553     if (pending & ERR_INTR_EN_1G_MAC2)
554         FM_G_CALL_1G_MAC_ERR_ISR(2);
555     if (pending & ERR_INTR_EN_1G_MAC3)
556         FM_G_CALL_1G_MAC_ERR_ISR(3);
557     if (pending & ERR_INTR_EN_1G_MAC4)
558         FM_G_CALL_1G_MAC_ERR_ISR(4);
559     if (pending & ERR_INTR_EN_1G_MAC5)
560         FM_G_CALL_1G_MAC_ERR_ISR(5);
561     if (pending & ERR_INTR_EN_1G_MAC6)
562         FM_G_CALL_1G_MAC_ERR_ISR(6);
563     if (pending & ERR_INTR_EN_1G_MAC7)
564         FM_G_CALL_1G_MAC_ERR_ISR(7);
565     if (pending & ERR_INTR_EN_10G_MAC0)
566         FM_G_CALL_10G_MAC_ERR_ISR(0);
567     if (pending & ERR_INTR_EN_10G_MAC1)
568         FM_G_CALL_10G_MAC_ERR_ISR(1);
569 }
570 
571 static void GuestEventIsr(t_Fm *p_Fm, uint32_t pending)
572 {
573 #define FM_G_CALL_1G_MAC_ISR(_id)   \
574 do {                                    \
575     p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id)].h_SrcHandle);\
576 } while (0)
577 #define FM_G_CALL_10G_MAC_ISR(_id)   \
578 do {                                    \
579     p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id)].h_SrcHandle);\
580 } while (0)
581 
582     if (pending & INTR_EN_1G_MAC0)
583         FM_G_CALL_1G_MAC_ISR(0);
584     if (pending & INTR_EN_1G_MAC1)
585         FM_G_CALL_1G_MAC_ISR(1);
586     if (pending & INTR_EN_1G_MAC2)
587         FM_G_CALL_1G_MAC_ISR(2);
588     if (pending & INTR_EN_1G_MAC3)
589         FM_G_CALL_1G_MAC_ISR(3);
590     if (pending & INTR_EN_1G_MAC4)
591         FM_G_CALL_1G_MAC_ISR(4);
592     if (pending & INTR_EN_1G_MAC5)
593         FM_G_CALL_1G_MAC_ISR(5);
594     if (pending & INTR_EN_1G_MAC6)
595         FM_G_CALL_1G_MAC_ISR(6);
596     if (pending & INTR_EN_1G_MAC7)
597         FM_G_CALL_1G_MAC_ISR(7);
598     if (pending & INTR_EN_10G_MAC0)
599         FM_G_CALL_10G_MAC_ISR(0);
600     if (pending & INTR_EN_10G_MAC1)
601         FM_G_CALL_10G_MAC_ISR(1);
602     if (pending & INTR_EN_TMR)
603         p_Fm->intrMng[e_FM_EV_TMR].f_Isr(p_Fm->intrMng[e_FM_EV_TMR].h_SrcHandle);
604 }
605 
606 #if (DPAA_VERSION >= 11)
607 static t_Error SetVSPWindow(t_Handle  h_Fm,
608                             uint8_t   hardwarePortId,
609                             uint8_t   baseStorageProfile,
610                             uint8_t   log2NumOfProfiles)
611 {
612     t_Fm                    *p_Fm = (t_Fm *)h_Fm;
613 
614     ASSERT_COND(h_Fm);
615     ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));
616 
617     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
618         !p_Fm->p_FmBmiRegs &&
619         p_Fm->h_IpcSessions[0])
620     {
621         t_FmIpcVspSetPortWindow fmIpcVspSetPortWindow;
622         t_FmIpcMsg              msg;
623         t_Error                 err = E_OK;
624 
625         memset(&msg, 0, sizeof(msg));
626         memset(&fmIpcVspSetPortWindow, 0, sizeof(t_FmIpcVspSetPortWindow));
627         fmIpcVspSetPortWindow.hardwarePortId      = hardwarePortId;
628         fmIpcVspSetPortWindow.baseStorageProfile  = baseStorageProfile;
629         fmIpcVspSetPortWindow.log2NumOfProfiles   = log2NumOfProfiles;
630         msg.msgId                                 = FM_VSP_SET_PORT_WINDOW;
631         memcpy(msg.msgBody, &fmIpcVspSetPortWindow, sizeof(t_FmIpcVspSetPortWindow));
632 
633         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
634                                 (uint8_t*)&msg,
635                                 sizeof(msg.msgId),
636                                 NULL,
637                                 NULL,
638                                 NULL,
639                                 NULL);
640         if (err != E_OK)
641             RETURN_ERROR(MINOR, err, NO_MSG);
642         return E_OK;
643     }
644     else if (!p_Fm->p_FmBmiRegs)
645         RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
646                      ("Either IPC or 'baseAddress' is required!"));
647 
648     fman_set_vsp_window(p_Fm->p_FmBmiRegs,
649                         hardwarePortId,
650                         baseStorageProfile,
651                         log2NumOfProfiles);
652 
653     return E_OK;
654 }
655 
656 static uint8_t AllocVSPsForPartition(t_Handle  h_Fm, uint8_t base, uint8_t numOfProfiles, uint8_t guestId)
657 {
658     t_Fm        *p_Fm = (t_Fm *)h_Fm;
659     uint8_t     profilesFound = 0;
660     int         i = 0;
661     uint32_t    intFlags;
662 
663     if (!numOfProfiles)
664         return E_OK;
665 
666     if ((numOfProfiles > FM_VSP_MAX_NUM_OF_ENTRIES) ||
667         (base + numOfProfiles > FM_VSP_MAX_NUM_OF_ENTRIES))
668         return (uint8_t)ILLEGAL_BASE;
669 
670     if (p_Fm->h_IpcSessions[0])
671     {
672         t_FmIpcResourceAllocParams  ipcAllocParams;
673         t_FmIpcMsg                  msg;
674         t_FmIpcReply                reply;
675         t_Error                     err;
676         uint32_t                    replyLength;
677 
678         memset(&msg, 0, sizeof(msg));
679         memset(&reply, 0, sizeof(reply));
680         memset(&ipcAllocParams, 0, sizeof(t_FmIpcResourceAllocParams));
681         ipcAllocParams.guestId         = p_Fm->guestId;
682         ipcAllocParams.num             = p_Fm->partNumOfVSPs;
683         ipcAllocParams.base            = p_Fm->partVSPBase;
684         msg.msgId                              = FM_VSP_ALLOC;
685         memcpy(msg.msgBody, &ipcAllocParams, sizeof(t_FmIpcResourceAllocParams));
686         replyLength = sizeof(uint32_t) + sizeof(uint8_t);
687         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
688                                 (uint8_t*)&msg,
689                                 sizeof(msg.msgId) + sizeof(t_FmIpcResourceAllocParams),
690                                 (uint8_t*)&reply,
691                                 &replyLength,
692                                 NULL,
693                                 NULL);
694         if ((err != E_OK) ||
695             (replyLength != (sizeof(uint32_t) + sizeof(uint8_t))))
696             RETURN_ERROR(MAJOR, err, NO_MSG);
697         else
698             memcpy((uint8_t*)&p_Fm->partVSPBase, reply.replyBody, sizeof(uint8_t));
699         if (p_Fm->partVSPBase == (uint8_t)(ILLEGAL_BASE))
700             RETURN_ERROR(MAJOR, err, NO_MSG);
701     }
702     if (p_Fm->guestId != NCSW_MASTER_ID)
703     {
704         DBG(WARNING, ("FM Guest mode, without IPC - can't validate VSP range!"));
705         return (uint8_t)ILLEGAL_BASE;
706     }
707 
708     intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock);
709     for (i = base; i < base + numOfProfiles; i++)
710         if (p_Fm->p_FmSp->profiles[i].profilesMng.ownerId == (uint8_t)ILLEGAL_BASE)
711             profilesFound++;
712         else
713             break;
714 
715     if (profilesFound == numOfProfiles)
716         for (i = base; i<base + numOfProfiles; i++)
717             p_Fm->p_FmSp->profiles[i].profilesMng.ownerId = guestId;
718     else
719     {
720         XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);
721         return (uint8_t)ILLEGAL_BASE;
722     }
723     XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);
724 
725     return base;
726 }
727 
728 static void FreeVSPsForPartition(t_Handle  h_Fm, uint8_t base, uint8_t numOfProfiles, uint8_t guestId)
729 {
730     t_Fm    *p_Fm = (t_Fm *)h_Fm;
731     int     i = 0;
732 
733     ASSERT_COND(p_Fm);
734 
735     if (p_Fm->h_IpcSessions[0])
736     {
737         t_FmIpcResourceAllocParams  ipcAllocParams;
738         t_FmIpcMsg                  msg;
739         t_FmIpcReply                reply;
740         uint32_t                    replyLength;
741         t_Error                     err;
742 
743         memset(&msg, 0, sizeof(msg));
744         memset(&reply, 0, sizeof(reply));
745         memset(&ipcAllocParams, 0, sizeof(t_FmIpcResourceAllocParams));
746         ipcAllocParams.guestId         = p_Fm->guestId;
747         ipcAllocParams.num             = p_Fm->partNumOfVSPs;
748         ipcAllocParams.base            = p_Fm->partVSPBase;
749         msg.msgId                              = FM_VSP_FREE;
750         memcpy(msg.msgBody, &ipcAllocParams, sizeof(t_FmIpcResourceAllocParams));
751         replyLength = sizeof(uint32_t) + sizeof(uint8_t);
752         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
753                                 (uint8_t*)&msg,
754                                 sizeof(msg.msgId) + sizeof(t_FmIpcResourceAllocParams),
755                                 (uint8_t*)&reply,
756                                 &replyLength,
757                                 NULL,
758                                 NULL);
759         if (err != E_OK)
760             REPORT_ERROR(MAJOR, err, NO_MSG);
761         return;
762     }
763     if (p_Fm->guestId != NCSW_MASTER_ID)
764     {
765         DBG(WARNING, ("FM Guest mode, without IPC - can't validate VSP range!"));
766         return;
767     }
768 
769     ASSERT_COND(p_Fm->p_FmSp);
770 
771     for (i=base; i<numOfProfiles; i++)
772     {
773         if (p_Fm->p_FmSp->profiles[i].profilesMng.ownerId == guestId)
774            p_Fm->p_FmSp->profiles[i].profilesMng.ownerId = (uint8_t)ILLEGAL_BASE;
775         else
776             DBG(WARNING, ("Request for freeing storage profile window which wasn't allocated to this partition"));
777     }
778 }
779 #endif /* (DPAA_VERSION >= 11) */
780 
781 static t_Error FmGuestHandleIpcMsgCB(t_Handle  h_Fm,
782                                      uint8_t   *p_Msg,
783                                      uint32_t  msgLength,
784                                      uint8_t   *p_Reply,
785                                      uint32_t  *p_ReplyLength)
786 {
787     t_Fm            *p_Fm       = (t_Fm*)h_Fm;
788     t_FmIpcMsg      *p_IpcMsg   = (t_FmIpcMsg*)p_Msg;
789 
790     UNUSED(p_Reply);
791     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
792     SANITY_CHECK_RETURN_ERROR((msgLength > sizeof(uint32_t)), E_INVALID_VALUE);
793 
794 #ifdef DISABLE_SANITY_CHECKS
795     UNUSED(msgLength);
796 #endif /* DISABLE_SANITY_CHECKS */
797 
798     ASSERT_COND(p_Msg);
799 
800     *p_ReplyLength = 0;
801 
802     switch (p_IpcMsg->msgId)
803     {
804         case (FM_GUEST_ISR):
805         {
806             t_FmIpcIsr ipcIsr;
807 
808             memcpy((uint8_t*)&ipcIsr, p_IpcMsg->msgBody, sizeof(t_FmIpcIsr));
809             if (ipcIsr.boolErr)
810                 GuestErrorIsr(p_Fm, ipcIsr.pendingReg);
811             else
812                 GuestEventIsr(p_Fm, ipcIsr.pendingReg);
813             break;
814         }
815         default:
816             *p_ReplyLength = 0;
817             RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!"));
818     }
819     return E_OK;
820 }
821 
822 static t_Error FmHandleIpcMsgCB(t_Handle  h_Fm,
823                                 uint8_t   *p_Msg,
824                                 uint32_t  msgLength,
825                                 uint8_t   *p_Reply,
826                                 uint32_t  *p_ReplyLength)
827 {
828     t_Error         err;
829     t_Fm            *p_Fm       = (t_Fm*)h_Fm;
830     t_FmIpcMsg      *p_IpcMsg   = (t_FmIpcMsg*)p_Msg;
831     t_FmIpcReply    *p_IpcReply = (t_FmIpcReply*)p_Reply;
832 
833     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
834     SANITY_CHECK_RETURN_ERROR((msgLength >= sizeof(uint32_t)), E_INVALID_VALUE);
835 
836 #ifdef DISABLE_SANITY_CHECKS
837     UNUSED(msgLength);
838 #endif /* DISABLE_SANITY_CHECKS */
839 
840     ASSERT_COND(p_IpcMsg);
841 
842     memset(p_IpcReply, 0, (sizeof(uint8_t) * FM_IPC_MAX_REPLY_SIZE));
843     *p_ReplyLength = 0;
844 
845     switch (p_IpcMsg->msgId)
846     {
847         case (FM_GET_SET_PORT_PARAMS):
848         {
849             t_FmIpcPortInInitParams         ipcInitParams;
850             t_FmInterModulePortInitParams   initParams;
851             t_FmIpcPortOutInitParams        ipcOutInitParams;
852 
853             memcpy((uint8_t*)&ipcInitParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortInInitParams));
854             initParams.hardwarePortId = ipcInitParams.hardwarePortId;
855             initParams.portType = (e_FmPortType)ipcInitParams.enumPortType;
856             initParams.independentMode = (bool)(ipcInitParams.boolIndependentMode);
857             initParams.liodnOffset = ipcInitParams.liodnOffset;
858             initParams.numOfTasks = ipcInitParams.numOfTasks;
859             initParams.numOfExtraTasks = ipcInitParams.numOfExtraTasks;
860             initParams.numOfOpenDmas = ipcInitParams.numOfOpenDmas;
861             initParams.numOfExtraOpenDmas = ipcInitParams.numOfExtraOpenDmas;
862             initParams.sizeOfFifo = ipcInitParams.sizeOfFifo;
863             initParams.extraSizeOfFifo = ipcInitParams.extraSizeOfFifo;
864             initParams.deqPipelineDepth = ipcInitParams.deqPipelineDepth;
865             initParams.maxFrameLength = ipcInitParams.maxFrameLength;
866             initParams.liodnBase = ipcInitParams.liodnBase;
867 
868             p_IpcReply->error = (uint32_t)FmGetSetPortParams(h_Fm, &initParams);
869 
870             ipcOutInitParams.ipcPhysAddr.high = initParams.fmMuramPhysBaseAddr.high;
871             ipcOutInitParams.ipcPhysAddr.low = initParams.fmMuramPhysBaseAddr.low;
872             ipcOutInitParams.sizeOfFifo = initParams.sizeOfFifo;
873             ipcOutInitParams.extraSizeOfFifo = initParams.extraSizeOfFifo;
874             ipcOutInitParams.numOfTasks = initParams.numOfTasks;
875             ipcOutInitParams.numOfExtraTasks = initParams.numOfExtraTasks;
876             ipcOutInitParams.numOfOpenDmas = initParams.numOfOpenDmas;
877             ipcOutInitParams.numOfExtraOpenDmas = initParams.numOfExtraOpenDmas;
878             memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcOutInitParams, sizeof(ipcOutInitParams));
879             *p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcPortOutInitParams);
880             break;
881         }
882         case (FM_SET_SIZE_OF_FIFO):
883         {
884             t_FmIpcPortRsrcParams   ipcPortRsrcParams;
885 
886             memcpy((uint8_t*)&ipcPortRsrcParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortRsrcParams));
887             p_IpcReply->error = (uint32_t)FmSetSizeOfFifo(h_Fm,
888                                                           ipcPortRsrcParams.hardwarePortId,
889                                                           &ipcPortRsrcParams.val,
890                                                           &ipcPortRsrcParams.extra,
891                                                           (bool)ipcPortRsrcParams.boolInitialConfig);
892             *p_ReplyLength = sizeof(uint32_t);
893             break;
894         }
895         case (FM_SET_NUM_OF_TASKS):
896         {
897             t_FmIpcPortRsrcParams   ipcPortRsrcParams;
898 
899             memcpy((uint8_t*)&ipcPortRsrcParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortRsrcParams));
900             p_IpcReply->error = (uint32_t)FmSetNumOfTasks(h_Fm, ipcPortRsrcParams.hardwarePortId,
901                                                           (uint8_t*)&ipcPortRsrcParams.val,
902                                                           (uint8_t*)&ipcPortRsrcParams.extra,
903                                                           (bool)ipcPortRsrcParams.boolInitialConfig);
904             *p_ReplyLength = sizeof(uint32_t);
905             break;
906         }
907         case (FM_SET_NUM_OF_OPEN_DMAS):
908         {
909             t_FmIpcPortRsrcParams   ipcPortRsrcParams;
910 
911             memcpy((uint8_t*)&ipcPortRsrcParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortRsrcParams));
912             p_IpcReply->error = (uint32_t)FmSetNumOfOpenDmas(h_Fm, ipcPortRsrcParams.hardwarePortId,
913                                                                (uint8_t*)&ipcPortRsrcParams.val,
914                                                                (uint8_t*)&ipcPortRsrcParams.extra,
915                                                                (bool)ipcPortRsrcParams.boolInitialConfig);
916             *p_ReplyLength = sizeof(uint32_t);
917             break;
918         }
919         case (FM_RESUME_STALLED_PORT):
920             *p_ReplyLength = sizeof(uint32_t);
921             p_IpcReply->error = (uint32_t)FmResumeStalledPort(h_Fm, p_IpcMsg->msgBody[0]);
922             break;
923         case (FM_MASTER_IS_ALIVE):
924         {
925             uint8_t guestId = p_IpcMsg->msgBody[0];
926             /* build the FM master partition IPC address */
927             memset(p_Fm->fmIpcHandlerModuleName[guestId], 0, (sizeof(char)) * MODULE_NAME_SIZE);
928             if (Sprint (p_Fm->fmIpcHandlerModuleName[guestId], "FM_%d_%d",p_Fm->p_FmStateStruct->fmId, guestId) != (guestId<10 ? 6:7))
929                 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
930             p_Fm->h_IpcSessions[guestId] = XX_IpcInitSession(p_Fm->fmIpcHandlerModuleName[guestId], p_Fm->fmModuleName);
931             if (p_Fm->h_IpcSessions[guestId] == NULL)
932                 RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("FM Master IPC session for guest %d", guestId));
933             *(uint8_t*)(p_IpcReply->replyBody) = 1;
934             *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
935             break;
936         }
937         case (FM_IS_PORT_STALLED):
938         {
939             bool tmp;
940 
941             p_IpcReply->error = (uint32_t)FmIsPortStalled(h_Fm, p_IpcMsg->msgBody[0], &tmp);
942             *(uint8_t*)(p_IpcReply->replyBody) = (uint8_t)tmp;
943             *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
944             break;
945         }
946         case (FM_RESET_MAC):
947         {
948             t_FmIpcMacParams    ipcMacParams;
949 
950             memcpy((uint8_t*)&ipcMacParams, p_IpcMsg->msgBody, sizeof(t_FmIpcMacParams));
951             p_IpcReply->error = (uint32_t)FmResetMac(p_Fm,
952                                                      (e_FmMacType)(ipcMacParams.enumType),
953                                                      ipcMacParams.id);
954             *p_ReplyLength = sizeof(uint32_t);
955             break;
956         }
957         case (FM_SET_MAC_MAX_FRAME):
958         {
959             t_FmIpcMacMaxFrameParams    ipcMacMaxFrameParams;
960 
961             memcpy((uint8_t*)&ipcMacMaxFrameParams, p_IpcMsg->msgBody, sizeof(t_FmIpcMacMaxFrameParams));
962             err = FmSetMacMaxFrame(p_Fm,
963                                   (e_FmMacType)(ipcMacMaxFrameParams.macParams.enumType),
964                                   ipcMacMaxFrameParams.macParams.id,
965                                   ipcMacMaxFrameParams.maxFrameLength);
966             if (err != E_OK)
967                 REPORT_ERROR(MINOR, err, NO_MSG);
968             break;
969         }
970 #if (DPAA_VERSION >= 11)
971         case (FM_VSP_ALLOC) :
972         {
973             t_FmIpcResourceAllocParams  ipcAllocParams;
974             uint8_t                     vspBase;
975             memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
976             vspBase =  AllocVSPsForPartition(h_Fm, (uint8_t)ipcAllocParams.base, (uint8_t)ipcAllocParams.num, ipcAllocParams.guestId);
977             memcpy(p_IpcReply->replyBody, (uint8_t*)&vspBase, sizeof(uint8_t));
978             *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
979             break;
980         }
981         case (FM_VSP_FREE) :
982         {
983             t_FmIpcResourceAllocParams   ipcAllocParams;
984             memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
985             FreeVSPsForPartition(h_Fm, (uint8_t)ipcAllocParams.base, (uint8_t)ipcAllocParams.num, ipcAllocParams.guestId);
986             break;
987         }
988         case (FM_VSP_SET_PORT_WINDOW) :
989         {
990             t_FmIpcVspSetPortWindow   ipcVspSetPortWindow;
991             memcpy(&ipcVspSetPortWindow, p_IpcMsg->msgBody, sizeof(t_FmIpcVspSetPortWindow));
992             err = SetVSPWindow(h_Fm,
993                                             ipcVspSetPortWindow.hardwarePortId,
994                                             ipcVspSetPortWindow.baseStorageProfile,
995                                             ipcVspSetPortWindow.log2NumOfProfiles);
996             return err;
997         }
998         case (FM_SET_CONG_GRP_PFC_PRIO) :
999         {
1000             t_FmIpcSetCongestionGroupPfcPriority    fmIpcSetCongestionGroupPfcPriority;
1001             memcpy(&fmIpcSetCongestionGroupPfcPriority, p_IpcMsg->msgBody, sizeof(t_FmIpcSetCongestionGroupPfcPriority));
1002             err = FmSetCongestionGroupPFCpriority(h_Fm,
1003                                                   fmIpcSetCongestionGroupPfcPriority.congestionGroupId,
1004                                                   fmIpcSetCongestionGroupPfcPriority.priorityBitMap);
1005             return err;
1006         }
1007 #endif /* (DPAA_VERSION >= 11) */
1008 
1009         case (FM_FREE_PORT):
1010         {
1011             t_FmInterModulePortFreeParams   portParams;
1012             t_FmIpcPortFreeParams           ipcPortParams;
1013 
1014             memcpy((uint8_t*)&ipcPortParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortFreeParams));
1015             portParams.hardwarePortId = ipcPortParams.hardwarePortId;
1016             portParams.portType = (e_FmPortType)(ipcPortParams.enumPortType);
1017             portParams.deqPipelineDepth = ipcPortParams.deqPipelineDepth;
1018             FmFreePortParams(h_Fm, &portParams);
1019             break;
1020         }
1021         case (FM_REGISTER_INTR):
1022         {
1023             t_FmIpcRegisterIntr ipcRegIntr;
1024 
1025             memcpy((uint8_t*)&ipcRegIntr, p_IpcMsg->msgBody, sizeof(ipcRegIntr));
1026             p_Fm->intrMng[ipcRegIntr.event].guestId = ipcRegIntr.guestId;
1027             break;
1028         }
1029         case (FM_GET_PARAMS):
1030         {
1031              t_FmIpcParams  ipcParams;
1032 
1033             /* Get clock frequency */
1034             ipcParams.fmClkFreq = p_Fm->p_FmStateStruct->fmClkFreq;
1035             ipcParams.fmMacClkFreq = p_Fm->p_FmStateStruct->fmMacClkFreq;
1036 
1037             fman_get_revision(p_Fm->p_FmFpmRegs,&ipcParams.majorRev,&ipcParams.minorRev);
1038 
1039             memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcParams, sizeof(t_FmIpcParams));
1040             *p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcParams);
1041              break;
1042         }
1043         case (FM_GET_FMAN_CTRL_CODE_REV):
1044         {
1045             t_FmCtrlCodeRevisionInfo        fmanCtrlRevInfo;
1046             t_FmIpcFmanCtrlCodeRevisionInfo ipcRevInfo;
1047 
1048             p_IpcReply->error = (uint32_t)FM_GetFmanCtrlCodeRevision(h_Fm, &fmanCtrlRevInfo);
1049             ipcRevInfo.packageRev = fmanCtrlRevInfo.packageRev;
1050             ipcRevInfo.majorRev = fmanCtrlRevInfo.majorRev;
1051             ipcRevInfo.minorRev = fmanCtrlRevInfo.minorRev;
1052             memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcRevInfo, sizeof(t_FmIpcFmanCtrlCodeRevisionInfo));
1053             *p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcFmanCtrlCodeRevisionInfo);
1054             break;
1055         }
1056 
1057         case (FM_DMA_STAT):
1058         {
1059             t_FmDmaStatus       dmaStatus;
1060             t_FmIpcDmaStatus    ipcDmaStatus;
1061 
1062             FM_GetDmaStatus(h_Fm, &dmaStatus);
1063             ipcDmaStatus.boolCmqNotEmpty = (uint8_t)dmaStatus.cmqNotEmpty;
1064             ipcDmaStatus.boolBusError = (uint8_t)dmaStatus.busError;
1065             ipcDmaStatus.boolReadBufEccError = (uint8_t)dmaStatus.readBufEccError;
1066             ipcDmaStatus.boolWriteBufEccSysError = (uint8_t)dmaStatus.writeBufEccSysError;
1067             ipcDmaStatus.boolWriteBufEccFmError = (uint8_t)dmaStatus.writeBufEccFmError;
1068             ipcDmaStatus.boolSinglePortEccError = (uint8_t)dmaStatus.singlePortEccError;
1069             memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcDmaStatus, sizeof(t_FmIpcDmaStatus));
1070             *p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcDmaStatus);
1071             break;
1072         }
1073         case (FM_ALLOC_FMAN_CTRL_EVENT_REG):
1074             p_IpcReply->error = (uint32_t)FmAllocFmanCtrlEventReg(h_Fm, (uint8_t*)p_IpcReply->replyBody);
1075             *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
1076             break;
1077         case (FM_FREE_FMAN_CTRL_EVENT_REG):
1078             FmFreeFmanCtrlEventReg(h_Fm, p_IpcMsg->msgBody[0]);
1079             break;
1080         case (FM_GET_TIMESTAMP_SCALE):
1081         {
1082             uint32_t    timeStamp = FmGetTimeStampScale(h_Fm);
1083 
1084             memcpy(p_IpcReply->replyBody, (uint8_t*)&timeStamp, sizeof(uint32_t));
1085             *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);
1086             break;
1087         }
1088         case (FM_GET_COUNTER):
1089         {
1090             e_FmCounters    inCounter;
1091             uint32_t        outCounter;
1092 
1093             memcpy((uint8_t*)&inCounter, p_IpcMsg->msgBody, sizeof(uint32_t));
1094             outCounter = FM_GetCounter(h_Fm, inCounter);
1095             memcpy(p_IpcReply->replyBody, (uint8_t*)&outCounter, sizeof(uint32_t));
1096             *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);
1097             break;
1098         }
1099         case (FM_SET_FMAN_CTRL_EVENTS_ENABLE):
1100         {
1101             t_FmIpcFmanEvents ipcFmanEvents;
1102 
1103             memcpy((uint8_t*)&ipcFmanEvents, p_IpcMsg->msgBody, sizeof(t_FmIpcFmanEvents));
1104             FmSetFmanCtrlIntr(h_Fm,
1105                               ipcFmanEvents.eventRegId,
1106                               ipcFmanEvents.enableEvents);
1107             break;
1108         }
1109         case (FM_GET_FMAN_CTRL_EVENTS_ENABLE):
1110         {
1111             uint32_t    tmp = FmGetFmanCtrlIntr(h_Fm, p_IpcMsg->msgBody[0]);
1112 
1113             memcpy(p_IpcReply->replyBody, (uint8_t*)&tmp, sizeof(uint32_t));
1114             *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);
1115             break;
1116         }
1117         case (FM_GET_PHYS_MURAM_BASE):
1118         {
1119             t_FmPhysAddr        physAddr;
1120             t_FmIpcPhysAddr     ipcPhysAddr;
1121 
1122             FmGetPhysicalMuramBase(h_Fm, &physAddr);
1123             ipcPhysAddr.high    = physAddr.high;
1124             ipcPhysAddr.low     = physAddr.low;
1125             memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcPhysAddr, sizeof(t_FmIpcPhysAddr));
1126             *p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcPhysAddr);
1127             break;
1128         }
1129         case (FM_ENABLE_RAM_ECC):
1130         {
1131             if (((err = FM_EnableRamsEcc(h_Fm)) != E_OK) ||
1132                 ((err = FM_SetException(h_Fm, e_FM_EX_IRAM_ECC, TRUE)) != E_OK) ||
1133                 ((err = FM_SetException(h_Fm, e_FM_EX_MURAM_ECC, TRUE)) != E_OK))
1134 #if (!(defined(DEBUG_ERRORS)) || (DEBUG_ERRORS == 0))
1135                 UNUSED(err);
1136 #else
1137                 REPORT_ERROR(MINOR, err, NO_MSG);
1138 #endif /* (!(defined(DEBUG_ERRORS)) || (DEBUG_ERRORS == 0)) */
1139             break;
1140         }
1141         case (FM_DISABLE_RAM_ECC):
1142         {
1143 
1144             if (((err = FM_SetException(h_Fm, e_FM_EX_IRAM_ECC, FALSE)) != E_OK) ||
1145                 ((err = FM_SetException(h_Fm, e_FM_EX_MURAM_ECC, FALSE)) != E_OK) ||
1146                 ((err = FM_DisableRamsEcc(h_Fm)) != E_OK))
1147 #if (!(defined(DEBUG_ERRORS)) || (DEBUG_ERRORS == 0))
1148                 UNUSED(err);
1149 #else
1150                 REPORT_ERROR(MINOR, err, NO_MSG);
1151 #endif /* (!(defined(DEBUG_ERRORS)) || (DEBUG_ERRORS == 0)) */
1152             break;
1153         }
1154         case (FM_SET_NUM_OF_FMAN_CTRL):
1155         {
1156             t_FmIpcPortNumOfFmanCtrls   ipcPortNumOfFmanCtrls;
1157 
1158             memcpy((uint8_t*)&ipcPortNumOfFmanCtrls, p_IpcMsg->msgBody, sizeof(t_FmIpcPortNumOfFmanCtrls));
1159             err = FmSetNumOfRiscsPerPort(h_Fm,
1160                                          ipcPortNumOfFmanCtrls.hardwarePortId,
1161                                          ipcPortNumOfFmanCtrls.numOfFmanCtrls,
1162                                          ipcPortNumOfFmanCtrls.orFmanCtrl);
1163             if (err != E_OK)
1164                 REPORT_ERROR(MINOR, err, NO_MSG);
1165             break;
1166         }
1167 #ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
1168         case (FM_10G_TX_ECC_WA):
1169             p_IpcReply->error = (uint32_t)Fm10GTxEccWorkaround(h_Fm, p_IpcMsg->msgBody[0]);
1170             *p_ReplyLength = sizeof(uint32_t);
1171             break;
1172 #endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
1173         default:
1174             *p_ReplyLength = 0;
1175             RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!"));
1176     }
1177     return E_OK;
1178 }
1179 
1180 
1181 /****************************************/
1182 /*       Inter-Module functions         */
1183 /****************************************/
1184 #ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
1185 t_Error Fm10GTxEccWorkaround(t_Handle h_Fm, uint8_t macId)
1186 {
1187     t_Fm            *p_Fm = (t_Fm*)h_Fm;
1188     t_Error         err = E_OK;
1189     t_FmIpcMsg      msg;
1190     t_FmIpcReply    reply;
1191     uint32_t        replyLength;
1192     uint8_t         rxHardwarePortId, txHardwarePortId;
1193     struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;
1194 
1195     if (p_Fm->guestId != NCSW_MASTER_ID)
1196     {
1197         memset(&msg, 0, sizeof(msg));
1198         memset(&reply, 0, sizeof(reply));
1199         msg.msgId = FM_10G_TX_ECC_WA;
1200         msg.msgBody[0] = macId;
1201         replyLength = sizeof(uint32_t);
1202         if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
1203                                      (uint8_t*)&msg,
1204                                      sizeof(msg.msgId)+sizeof(macId),
1205                                      (uint8_t*)&reply,
1206                                      &replyLength,
1207                                      NULL,
1208                                      NULL)) != E_OK)
1209             RETURN_ERROR(MINOR, err, NO_MSG);
1210         if (replyLength != sizeof(uint32_t))
1211             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
1212         return (t_Error)(reply.error);
1213     }
1214 
1215     SANITY_CHECK_RETURN_ERROR((macId == 0), E_NOT_SUPPORTED);
1216     SANITY_CHECK_RETURN_ERROR(IsFmanCtrlCodeLoaded(p_Fm), E_INVALID_STATE);
1217 
1218     rxHardwarePortId = SwPortIdToHwPortId(e_FM_PORT_TYPE_RX_10G,
1219                                     macId,
1220                                     p_Fm->p_FmStateStruct->revInfo.majorRev,
1221                                     p_Fm->p_FmStateStruct->revInfo.minorRev);
1222     txHardwarePortId = SwPortIdToHwPortId(e_FM_PORT_TYPE_TX_10G,
1223                                     macId,
1224                                     p_Fm->p_FmStateStruct->revInfo.majorRev,
1225                                     p_Fm->p_FmStateStruct->revInfo.minorRev);
1226     if ((p_Fm->p_FmStateStruct->portsTypes[rxHardwarePortId] != e_FM_PORT_TYPE_DUMMY) ||
1227         (p_Fm->p_FmStateStruct->portsTypes[txHardwarePortId] != e_FM_PORT_TYPE_DUMMY))
1228         RETURN_ERROR(MAJOR, E_INVALID_STATE,
1229                      ("MAC should be initialized prior to Rx and Tx ports!"));
1230 
1231     return fman_set_erratum_10gmac_a004_wa(fpm_rg);
1232 }
1233 #endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
1234 
1235 uint16_t FmGetTnumAgingPeriod(t_Handle h_Fm)
1236 {
1237     t_Fm *p_Fm = (t_Fm *)h_Fm;
1238 
1239     SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0);
1240     SANITY_CHECK_RETURN_VALUE(!p_Fm->p_FmDriverParam, E_INVALID_STATE, 0);
1241 
1242     return p_Fm->tnumAgingPeriod;
1243 }
1244 
1245 t_Error FmSetPortPreFetchConfiguration(t_Handle h_Fm,
1246                                        uint8_t  portNum,
1247                                        bool     preFetchConfigured)
1248 {
1249     t_Fm *p_Fm = (t_Fm*)h_Fm;
1250 
1251     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
1252     SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
1253 
1254     p_Fm->portsPreFetchConfigured[portNum] = TRUE;
1255     p_Fm->portsPreFetchValue[portNum] = preFetchConfigured;
1256 
1257     return E_OK;
1258 }
1259 
1260 t_Error FmGetPortPreFetchConfiguration(t_Handle h_Fm,
1261                                        uint8_t  portNum,
1262                                        bool     *p_PortConfigured,
1263                                        bool     *p_PreFetchConfigured)
1264 {
1265     t_Fm *p_Fm = (t_Fm*)h_Fm;
1266 
1267     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
1268     SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
1269 
1270     /* If the prefetch wasn't configured yet (not enable or disabled)
1271        we return the value TRUE as it was already configured */
1272     if (!p_Fm->portsPreFetchConfigured[portNum])
1273     {
1274         *p_PortConfigured = FALSE;
1275         *p_PreFetchConfigured = FALSE;
1276     }
1277     else
1278     {
1279         *p_PortConfigured = TRUE;
1280         *p_PreFetchConfigured = (p_Fm->portsPreFetchConfigured[portNum]);
1281     }
1282 
1283     return E_OK;
1284 }
1285 
1286 t_Error FmSetCongestionGroupPFCpriority(t_Handle    h_Fm,
1287                                         uint32_t    congestionGroupId,
1288                                         uint8_t     priorityBitMap)
1289 {
1290     t_Fm    *p_Fm  = (t_Fm *)h_Fm;
1291     uint32_t regNum;
1292 
1293     ASSERT_COND(h_Fm);
1294 
1295     if (congestionGroupId > FM_PORT_NUM_OF_CONGESTION_GRPS)
1296         RETURN_ERROR(MAJOR, E_INVALID_VALUE,
1297                      ("Congestion group ID bigger than %d",
1298                       FM_PORT_NUM_OF_CONGESTION_GRPS));
1299 
1300     if (p_Fm->guestId == NCSW_MASTER_ID)
1301     {
1302         ASSERT_COND(p_Fm->baseAddr);
1303         regNum = (FM_PORT_NUM_OF_CONGESTION_GRPS - 1 - congestionGroupId) / 4;
1304         fman_set_congestion_group_pfc_priority((uint32_t *)((p_Fm->baseAddr+FM_MM_CGP)),
1305                                                congestionGroupId,
1306                                                priorityBitMap,
1307                                                regNum);
1308     }
1309     else if (p_Fm->h_IpcSessions[0])
1310     {
1311         t_Error                              err;
1312         t_FmIpcMsg                           msg;
1313         t_FmIpcSetCongestionGroupPfcPriority fmIpcSetCongestionGroupPfcPriority;
1314 
1315         memset(&msg, 0, sizeof(msg));
1316         memset(&fmIpcSetCongestionGroupPfcPriority, 0, sizeof(t_FmIpcSetCongestionGroupPfcPriority));
1317         fmIpcSetCongestionGroupPfcPriority.congestionGroupId = congestionGroupId;
1318         fmIpcSetCongestionGroupPfcPriority.priorityBitMap    = priorityBitMap;
1319 
1320         msg.msgId = FM_SET_CONG_GRP_PFC_PRIO;
1321         memcpy(msg.msgBody, &fmIpcSetCongestionGroupPfcPriority, sizeof(t_FmIpcSetCongestionGroupPfcPriority));
1322 
1323         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
1324                                 (uint8_t*)&msg,
1325                                 sizeof(msg.msgId),
1326                                 NULL,
1327                                 NULL,
1328                                 NULL,
1329                                 NULL);
1330         if (err != E_OK)
1331             RETURN_ERROR(MINOR, err, NO_MSG);
1332     }
1333     else
1334         RETURN_ERROR(MAJOR, E_INVALID_STATE, ("guest without IPC!"));
1335 
1336     return E_OK;
1337 }
1338 
1339 uintptr_t FmGetPcdPrsBaseAddr(t_Handle h_Fm)
1340 {
1341     t_Fm        *p_Fm = (t_Fm*)h_Fm;
1342 
1343     SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0);
1344 
1345     if (!p_Fm->baseAddr)
1346     {
1347         REPORT_ERROR(MAJOR, E_INVALID_STATE,
1348                      ("No base-addr; probably Guest with IPC!"));
1349         return 0;
1350     }
1351 
1352     return (p_Fm->baseAddr + FM_MM_PRS);
1353 }
1354 
1355 uintptr_t FmGetPcdKgBaseAddr(t_Handle h_Fm)
1356 {
1357     t_Fm        *p_Fm = (t_Fm*)h_Fm;
1358 
1359     SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0);
1360 
1361     if (!p_Fm->baseAddr)
1362     {
1363         REPORT_ERROR(MAJOR, E_INVALID_STATE,
1364                      ("No base-addr; probably Guest with IPC!"));
1365         return 0;
1366     }
1367 
1368     return (p_Fm->baseAddr + FM_MM_KG);
1369 }
1370 
1371 uintptr_t FmGetPcdPlcrBaseAddr(t_Handle h_Fm)
1372 {
1373     t_Fm        *p_Fm = (t_Fm*)h_Fm;
1374 
1375     SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0);
1376 
1377     if (!p_Fm->baseAddr)
1378     {
1379         REPORT_ERROR(MAJOR, E_INVALID_STATE,
1380                      ("No base-addr; probably Guest with IPC!"));
1381         return 0;
1382     }
1383 
1384     return (p_Fm->baseAddr + FM_MM_PLCR);
1385 }
1386 
1387 #if (DPAA_VERSION >= 11)
1388 uintptr_t FmGetVSPBaseAddr(t_Handle h_Fm)
1389 {
1390     t_Fm        *p_Fm = (t_Fm*)h_Fm;
1391 
1392     SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0);
1393 
1394     return p_Fm->vspBaseAddr;
1395 }
1396 #endif /* (DPAA_VERSION >= 11) */
1397 
1398 t_Handle FmGetMuramHandle(t_Handle h_Fm)
1399 {
1400     t_Fm        *p_Fm = (t_Fm*)h_Fm;
1401 
1402     SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, NULL);
1403 
1404     return (p_Fm->h_FmMuram);
1405 }
1406 
1407 void FmGetPhysicalMuramBase(t_Handle h_Fm, t_FmPhysAddr *p_FmPhysAddr)
1408 {
1409     t_Fm            *p_Fm = (t_Fm*)h_Fm;
1410 
1411     if (p_Fm->fmMuramPhysBaseAddr)
1412     {
1413         /* General FM driver initialization */
1414         p_FmPhysAddr->low = (uint32_t)p_Fm->fmMuramPhysBaseAddr;
1415         p_FmPhysAddr->high = (uint8_t)((p_Fm->fmMuramPhysBaseAddr & 0x000000ff00000000LL) >> 32);
1416         return;
1417     }
1418 
1419     ASSERT_COND(p_Fm->guestId != NCSW_MASTER_ID);
1420 
1421     if (p_Fm->h_IpcSessions[0])
1422     {
1423         t_Error         err;
1424         t_FmIpcMsg      msg;
1425         t_FmIpcReply    reply;
1426         uint32_t        replyLength;
1427         t_FmIpcPhysAddr ipcPhysAddr;
1428 
1429         memset(&msg, 0, sizeof(msg));
1430         memset(&reply, 0, sizeof(reply));
1431         msg.msgId = FM_GET_PHYS_MURAM_BASE;
1432         replyLength = sizeof(uint32_t) + sizeof(t_FmPhysAddr);
1433         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
1434                                 (uint8_t*)&msg,
1435                                 sizeof(msg.msgId),
1436                                 (uint8_t*)&reply,
1437                                 &replyLength,
1438                                 NULL,
1439                                 NULL);
1440         if (err != E_OK)
1441         {
1442             REPORT_ERROR(MINOR, err, NO_MSG);
1443             return;
1444         }
1445         if (replyLength != (sizeof(uint32_t) + sizeof(t_FmPhysAddr)))
1446         {
1447             REPORT_ERROR(MINOR, E_INVALID_VALUE,("IPC reply length mismatch"));
1448             return;
1449         }
1450         memcpy((uint8_t*)&ipcPhysAddr, reply.replyBody, sizeof(t_FmIpcPhysAddr));
1451         p_FmPhysAddr->high = ipcPhysAddr.high;
1452         p_FmPhysAddr->low  = ipcPhysAddr.low;
1453     }
1454     else
1455         REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
1456                      ("running in guest-mode without neither IPC nor mapped register!"));
1457 }
1458 
1459 #if (DPAA_VERSION >= 11)
1460 t_Error FmVSPAllocForPort (t_Handle        h_Fm,
1461                            e_FmPortType    portType,
1462                            uint8_t         portId,
1463                            uint8_t         numOfVSPs)
1464 {
1465     t_Fm           *p_Fm = (t_Fm *)h_Fm;
1466     t_Error        err = E_OK;
1467     uint32_t       profilesFound, intFlags;
1468     uint8_t        first, i;
1469     uint8_t        log2Num;
1470     uint8_t        swPortIndex=0, hardwarePortId;
1471 
1472     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
1473 
1474      if (!numOfVSPs)
1475         return E_OK;
1476 
1477     if (numOfVSPs > FM_VSP_MAX_NUM_OF_ENTRIES)
1478         RETURN_ERROR(MINOR, E_INVALID_VALUE, ("numProfiles can not be bigger than %d.",FM_VSP_MAX_NUM_OF_ENTRIES));
1479 
1480     if (!POWER_OF_2(numOfVSPs))
1481         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numProfiles must be a power of 2."));
1482 
1483     LOG2((uint64_t)numOfVSPs, log2Num);
1484 
1485     if ((log2Num == 0) || (p_Fm->partVSPBase == 0))
1486         first = 0;
1487     else
1488         first = 1<<log2Num;
1489 
1490     if (first > (p_Fm->partVSPBase + p_Fm->partNumOfVSPs))
1491          RETURN_ERROR(MINOR, E_INVALID_VALUE, ("can not allocate storage profile port window"));
1492 
1493     if (first < p_Fm->partVSPBase)
1494         while (first < p_Fm->partVSPBase)
1495             first = first + numOfVSPs;
1496 
1497     if ((first + numOfVSPs) > (p_Fm->partVSPBase + p_Fm->partNumOfVSPs))
1498         RETURN_ERROR(MINOR, E_INVALID_VALUE, ("can not allocate storage profile port window"));
1499 
1500     intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock);
1501     profilesFound = 0;
1502     for (i=first; i < p_Fm->partVSPBase + p_Fm->partNumOfVSPs; )
1503     {
1504         if (!p_Fm->p_FmSp->profiles[i].profilesMng.allocated)
1505         {
1506             profilesFound++;
1507             i++;
1508             if (profilesFound == numOfVSPs)
1509                 break;
1510         }
1511         else
1512         {
1513             profilesFound = 0;
1514             /* advance i to the next aligned address */
1515             first = i = (uint8_t)(first + numOfVSPs);
1516         }
1517     }
1518     if (profilesFound == numOfVSPs)
1519         for (i = first; i<first + numOfVSPs; i++)
1520             p_Fm->p_FmSp->profiles[i].profilesMng.allocated = TRUE;
1521     else
1522     {
1523         XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);
1524         RETURN_ERROR(MINOR, E_FULL, ("No profiles."));
1525     }
1526 
1527     hardwarePortId = SwPortIdToHwPortId(portType,
1528                                     portId,
1529                                     p_Fm->p_FmStateStruct->revInfo.majorRev,
1530                                     p_Fm->p_FmStateStruct->revInfo.minorRev);
1531     HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);
1532 
1533     p_Fm->p_FmSp->portsMapping[swPortIndex].numOfProfiles = numOfVSPs;
1534     p_Fm->p_FmSp->portsMapping[swPortIndex].profilesBase = first;
1535 
1536     if ((err = SetVSPWindow(h_Fm,hardwarePortId, first,log2Num)) != E_OK)
1537         for (i = first; i < first + numOfVSPs; i++)
1538             p_Fm->p_FmSp->profiles[i].profilesMng.allocated = FALSE;
1539 
1540     XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);
1541 
1542     return err;
1543 }
1544 
1545 t_Error FmVSPFreeForPort(t_Handle        h_Fm,
1546                          e_FmPortType    portType,
1547                          uint8_t         portId)
1548 {
1549     t_Fm            *p_Fm = (t_Fm *)h_Fm;
1550     uint8_t         swPortIndex=0, hardwarePortId, first, numOfVSPs, i;
1551     uint32_t        intFlags;
1552 
1553     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
1554 
1555     hardwarePortId = SwPortIdToHwPortId(portType,
1556                                     portId,
1557                                     p_Fm->p_FmStateStruct->revInfo.majorRev,
1558                                     p_Fm->p_FmStateStruct->revInfo.minorRev);
1559     HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);
1560 
1561     numOfVSPs = (uint8_t)p_Fm->p_FmSp->portsMapping[swPortIndex].numOfProfiles;
1562     first = (uint8_t)p_Fm->p_FmSp->portsMapping[swPortIndex].profilesBase;
1563 
1564     intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock);
1565     for (i = first; i < first + numOfVSPs; i++)
1566            p_Fm->p_FmSp->profiles[i].profilesMng.allocated = FALSE;
1567     XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);
1568 
1569     p_Fm->p_FmSp->portsMapping[swPortIndex].numOfProfiles = 0;
1570     p_Fm->p_FmSp->portsMapping[swPortIndex].profilesBase = 0;
1571 
1572     return E_OK;
1573 }
1574 #endif /* (DPAA_VERSION >= 11) */
1575 
1576 t_Error FmAllocFmanCtrlEventReg(t_Handle h_Fm, uint8_t *p_EventId)
1577 {
1578     t_Fm            *p_Fm = (t_Fm*)h_Fm;
1579     uint8_t         i;
1580 
1581     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
1582 
1583     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
1584         p_Fm->h_IpcSessions[0])
1585     {
1586         t_Error         err;
1587         t_FmIpcMsg      msg;
1588         t_FmIpcReply    reply;
1589         uint32_t        replyLength;
1590 
1591         memset(&msg, 0, sizeof(msg));
1592         memset(&reply, 0, sizeof(reply));
1593         msg.msgId = FM_ALLOC_FMAN_CTRL_EVENT_REG;
1594         replyLength = sizeof(uint32_t) + sizeof(uint8_t);
1595         if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
1596                                      (uint8_t*)&msg,
1597                                      sizeof(msg.msgId),
1598                                      (uint8_t*)&reply,
1599                                      &replyLength,
1600                                      NULL,
1601                                      NULL)) != E_OK)
1602             RETURN_ERROR(MAJOR, err, NO_MSG);
1603 
1604         if (replyLength != (sizeof(uint32_t) + sizeof(uint8_t)))
1605             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
1606 
1607         *p_EventId = *(uint8_t*)(reply.replyBody);
1608 
1609         return (t_Error)(reply.error);
1610     }
1611     else if (p_Fm->guestId != NCSW_MASTER_ID)
1612         RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
1613                      ("running in guest-mode without IPC!"));
1614 
1615     for (i=0;i<FM_NUM_OF_FMAN_CTRL_EVENT_REGS;i++)
1616         if (!p_Fm->usedEventRegs[i])
1617         {
1618             p_Fm->usedEventRegs[i] = TRUE;
1619             *p_EventId = i;
1620             break;
1621         }
1622 
1623     if (i==FM_NUM_OF_FMAN_CTRL_EVENT_REGS)
1624         RETURN_ERROR(MAJOR, E_BUSY, ("No resource - FMan controller event register."));
1625 
1626     return E_OK;
1627 }
1628 
1629 void FmFreeFmanCtrlEventReg(t_Handle h_Fm, uint8_t eventId)
1630 {
1631     t_Fm        *p_Fm = (t_Fm*)h_Fm;
1632 
1633     SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE);
1634 
1635     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
1636         p_Fm->h_IpcSessions[0])
1637     {
1638         t_Error     err;
1639         t_FmIpcMsg  msg;
1640 
1641         memset(&msg, 0, sizeof(msg));
1642         msg.msgId = FM_FREE_FMAN_CTRL_EVENT_REG;
1643         msg.msgBody[0] = eventId;
1644         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
1645                                 (uint8_t*)&msg,
1646                                 sizeof(msg.msgId)+sizeof(eventId),
1647                                 NULL,
1648                                 NULL,
1649                                 NULL,
1650                                 NULL);
1651         if (err != E_OK)
1652             REPORT_ERROR(MINOR, err, NO_MSG);
1653         return;
1654     }
1655     else if (p_Fm->guestId != NCSW_MASTER_ID)
1656     {
1657         REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
1658                      ("running in guest-mode without IPC!"));
1659         return;
1660     }
1661 
1662     ((t_Fm*)h_Fm)->usedEventRegs[eventId] = FALSE;
1663 }
1664 
1665 void FmSetFmanCtrlIntr(t_Handle h_Fm, uint8_t eventRegId, uint32_t enableEvents)
1666 {
1667     t_Fm                *p_Fm = (t_Fm*)h_Fm;
1668     struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;
1669 
1670     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
1671         !p_Fm->p_FmFpmRegs &&
1672         p_Fm->h_IpcSessions[0])
1673     {
1674         t_FmIpcFmanEvents   fmanCtrl;
1675         t_Error             err;
1676         t_FmIpcMsg          msg;
1677 
1678         fmanCtrl.eventRegId = eventRegId;
1679         fmanCtrl.enableEvents = enableEvents;
1680         memset(&msg, 0, sizeof(msg));
1681         msg.msgId = FM_SET_FMAN_CTRL_EVENTS_ENABLE;
1682         memcpy(msg.msgBody, &fmanCtrl, sizeof(fmanCtrl));
1683         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
1684                                 (uint8_t*)&msg,
1685                                 sizeof(msg.msgId)+sizeof(fmanCtrl),
1686                                 NULL,
1687                                 NULL,
1688                                 NULL,
1689                                 NULL);
1690         if (err != E_OK)
1691             REPORT_ERROR(MINOR, err, NO_MSG);
1692         return;
1693     }
1694     else if (!p_Fm->p_FmFpmRegs)
1695     {
1696         REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
1697                      ("Either IPC or 'baseAddress' is required!"));
1698         return;
1699     }
1700 
1701     ASSERT_COND(eventRegId < FM_NUM_OF_FMAN_CTRL_EVENT_REGS);
1702     fman_set_ctrl_intr(fpm_rg, eventRegId, enableEvents);
1703 }
1704 
1705 uint32_t FmGetFmanCtrlIntr(t_Handle h_Fm, uint8_t eventRegId)
1706 {
1707     t_Fm            *p_Fm = (t_Fm*)h_Fm;
1708     struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;
1709 
1710     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
1711         !p_Fm->p_FmFpmRegs &&
1712         p_Fm->h_IpcSessions[0])
1713     {
1714         t_Error         err;
1715         t_FmIpcMsg      msg;
1716         t_FmIpcReply    reply;
1717         uint32_t        replyLength, ctrlIntr;
1718 
1719         memset(&msg, 0, sizeof(msg));
1720         memset(&reply, 0, sizeof(reply));
1721         msg.msgId = FM_GET_FMAN_CTRL_EVENTS_ENABLE;
1722         msg.msgBody[0] = eventRegId;
1723         replyLength = sizeof(uint32_t) + sizeof(uint32_t);
1724         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
1725                                 (uint8_t*)&msg,
1726                                 sizeof(msg.msgId)+sizeof(eventRegId),
1727                                 (uint8_t*)&reply,
1728                                 &replyLength,
1729                                 NULL,
1730                                 NULL);
1731         if (err != E_OK)
1732         {
1733             REPORT_ERROR(MINOR, err, NO_MSG);
1734             return 0;
1735         }
1736         if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t)))
1737         {
1738             REPORT_ERROR(MINOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
1739             return 0;
1740         }
1741         memcpy((uint8_t*)&ctrlIntr, reply.replyBody, sizeof(uint32_t));
1742         return ctrlIntr;
1743     }
1744     else if (!p_Fm->p_FmFpmRegs)
1745     {
1746         REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
1747                      ("Either IPC or 'baseAddress' is required!"));
1748         return 0;
1749     }
1750 
1751     return fman_get_ctrl_intr(fpm_rg, eventRegId);
1752 }
1753 
1754 void FmRegisterIntr(t_Handle                h_Fm,
1755                     e_FmEventModules        module,
1756                     uint8_t                 modId,
1757                     e_FmIntrType            intrType,
1758                     void                    (*f_Isr) (t_Handle h_Arg),
1759                     t_Handle                h_Arg)
1760 {
1761     t_Fm                *p_Fm = (t_Fm*)h_Fm;
1762     int                 event = 0;
1763 
1764     ASSERT_COND(h_Fm);
1765 
1766     GET_FM_MODULE_EVENT(module, modId, intrType, event);
1767     ASSERT_COND(event < e_FM_EV_DUMMY_LAST);
1768 
1769     /* register in local FM structure */
1770     p_Fm->intrMng[event].f_Isr = f_Isr;
1771     p_Fm->intrMng[event].h_SrcHandle = h_Arg;
1772 
1773     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
1774         p_Fm->h_IpcSessions[0])
1775     {
1776         t_FmIpcRegisterIntr fmIpcRegisterIntr;
1777         t_Error             err;
1778         t_FmIpcMsg          msg;
1779 
1780         /* register in Master FM structure */
1781         fmIpcRegisterIntr.event = (uint32_t)event;
1782         fmIpcRegisterIntr.guestId = p_Fm->guestId;
1783         memset(&msg, 0, sizeof(msg));
1784         msg.msgId = FM_REGISTER_INTR;
1785         memcpy(msg.msgBody, &fmIpcRegisterIntr, sizeof(fmIpcRegisterIntr));
1786         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
1787                                 (uint8_t*)&msg,
1788                                 sizeof(msg.msgId) + sizeof(fmIpcRegisterIntr),
1789                                 NULL,
1790                                 NULL,
1791                                 NULL,
1792                                 NULL);
1793         if (err != E_OK)
1794             REPORT_ERROR(MINOR, err, NO_MSG);
1795     }
1796     else if (p_Fm->guestId != NCSW_MASTER_ID)
1797         REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
1798                      ("running in guest-mode without IPC!"));
1799 }
1800 
1801 void FmUnregisterIntr(t_Handle                  h_Fm,
1802                         e_FmEventModules        module,
1803                         uint8_t                 modId,
1804                         e_FmIntrType            intrType)
1805 {
1806     t_Fm        *p_Fm = (t_Fm*)h_Fm;
1807     int         event = 0;
1808 
1809     ASSERT_COND(h_Fm);
1810 
1811     GET_FM_MODULE_EVENT(module, modId,intrType, event);
1812     ASSERT_COND(event < e_FM_EV_DUMMY_LAST);
1813 
1814     p_Fm->intrMng[event].f_Isr = UnimplementedIsr;
1815     p_Fm->intrMng[event].h_SrcHandle = NULL;
1816 }
1817 
1818 void  FmRegisterFmanCtrlIntr(t_Handle h_Fm, uint8_t eventRegId, void (*f_Isr) (t_Handle h_Arg, uint32_t event), t_Handle    h_Arg)
1819 {
1820     t_Fm       *p_Fm = (t_Fm*)h_Fm;
1821 
1822     ASSERT_COND(eventRegId<FM_NUM_OF_FMAN_CTRL_EVENT_REGS);
1823 
1824     if (p_Fm->guestId != NCSW_MASTER_ID)
1825     {
1826         REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM in guest-mode"));
1827         return;
1828     }
1829 
1830     p_Fm->fmanCtrlIntr[eventRegId].f_Isr = f_Isr;
1831     p_Fm->fmanCtrlIntr[eventRegId].h_SrcHandle = h_Arg;
1832 }
1833 
1834 void  FmUnregisterFmanCtrlIntr(t_Handle h_Fm, uint8_t eventRegId)
1835 {
1836     t_Fm       *p_Fm = (t_Fm*)h_Fm;
1837 
1838     ASSERT_COND(eventRegId<FM_NUM_OF_FMAN_CTRL_EVENT_REGS);
1839 
1840     if (p_Fm->guestId != NCSW_MASTER_ID)
1841     {
1842         REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM in guest-mode"));
1843         return;
1844     }
1845 
1846     p_Fm->fmanCtrlIntr[eventRegId].f_Isr = UnimplementedFmanCtrlIsr;
1847     p_Fm->fmanCtrlIntr[eventRegId].h_SrcHandle = NULL;
1848 }
1849 
1850 void  FmRegisterPcd(t_Handle h_Fm, t_Handle h_FmPcd)
1851 {
1852     t_Fm       *p_Fm = (t_Fm*)h_Fm;
1853 
1854     if (p_Fm->h_Pcd)
1855         REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("PCD already set"));
1856 
1857     p_Fm->h_Pcd = h_FmPcd;
1858 }
1859 
1860 void  FmUnregisterPcd(t_Handle h_Fm)
1861 {
1862     t_Fm       *p_Fm = (t_Fm*)h_Fm;
1863 
1864     if (!p_Fm->h_Pcd)
1865         REPORT_ERROR(MAJOR, E_NOT_FOUND, ("PCD handle!"));
1866 
1867     p_Fm->h_Pcd = NULL;
1868 }
1869 
1870 t_Handle FmGetPcdHandle(t_Handle h_Fm)
1871 {
1872     t_Fm       *p_Fm = (t_Fm*)h_Fm;
1873 
1874     return p_Fm->h_Pcd;
1875 }
1876 
1877 uint8_t FmGetId(t_Handle h_Fm)
1878 {
1879     t_Fm *p_Fm = (t_Fm*)h_Fm;
1880 
1881     SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0xff);
1882 
1883     return p_Fm->p_FmStateStruct->fmId;
1884 }
1885 
1886 t_Error FmReset(t_Handle h_Fm)
1887 {
1888 	t_Fm *p_Fm = (t_Fm*)h_Fm;
1889 
1890     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
1891 
1892     WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rstc, FPM_RSTC_FM_RESET);
1893     CORE_MemoryBarrier();
1894     XX_UDelay(100);
1895 
1896     return E_OK;
1897 }
1898 
1899 t_Error FmSetNumOfRiscsPerPort(t_Handle     h_Fm,
1900                                uint8_t      hardwarePortId,
1901                                uint8_t      numOfFmanCtrls,
1902                                t_FmFmanCtrl orFmanCtrl)
1903 {
1904 
1905     t_Fm                        *p_Fm = (t_Fm*)h_Fm;
1906     struct fman_fpm_regs *fpm_rg;
1907 
1908     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
1909     SANITY_CHECK_RETURN_ERROR(((numOfFmanCtrls > 0) && (numOfFmanCtrls < 3)) , E_INVALID_HANDLE);
1910 
1911     fpm_rg = p_Fm->p_FmFpmRegs;
1912     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
1913         !p_Fm->p_FmFpmRegs &&
1914         p_Fm->h_IpcSessions[0])
1915     {
1916         t_Error                     err;
1917         t_FmIpcPortNumOfFmanCtrls   params;
1918         t_FmIpcMsg                  msg;
1919 
1920         memset(&msg, 0, sizeof(msg));
1921         params.hardwarePortId = hardwarePortId;
1922         params.numOfFmanCtrls = numOfFmanCtrls;
1923         params.orFmanCtrl = orFmanCtrl;
1924         msg.msgId = FM_SET_NUM_OF_FMAN_CTRL;
1925         memcpy(msg.msgBody, &params, sizeof(params));
1926         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
1927                                 (uint8_t*)&msg,
1928                                 sizeof(msg.msgId) +sizeof(params),
1929                                 NULL,
1930                                 NULL,
1931                                 NULL,
1932                                 NULL);
1933         if (err != E_OK)
1934             RETURN_ERROR(MINOR, err, NO_MSG);
1935         return E_OK;
1936     }
1937     else if (!p_Fm->p_FmFpmRegs)
1938         RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
1939                      ("Either IPC or 'baseAddress' is required!"));
1940 
1941     fman_set_num_of_riscs_per_port(fpm_rg, hardwarePortId, numOfFmanCtrls, orFmanCtrl);
1942 
1943     return E_OK;
1944 }
1945 
1946 t_Error FmGetSetPortParams(t_Handle h_Fm, t_FmInterModulePortInitParams *p_PortParams)
1947 {
1948     t_Fm                    *p_Fm = (t_Fm*)h_Fm;
1949     t_Error                 err;
1950     uint32_t                intFlags;
1951     uint8_t                 hardwarePortId = p_PortParams->hardwarePortId, macId;
1952     struct fman_rg          fman_rg;
1953 
1954     fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;
1955     fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;
1956     fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;
1957     fman_rg.dma_rg = p_Fm->p_FmDmaRegs;
1958 
1959     if (p_Fm->guestId != NCSW_MASTER_ID)
1960     {
1961         t_FmIpcPortInInitParams     portInParams;
1962         t_FmIpcPortOutInitParams    portOutParams;
1963         t_FmIpcMsg                  msg;
1964         t_FmIpcReply                reply;
1965         uint32_t                    replyLength;
1966 
1967         portInParams.hardwarePortId     = p_PortParams->hardwarePortId;
1968         portInParams.enumPortType       = (uint32_t)p_PortParams->portType;
1969         portInParams.boolIndependentMode= (uint8_t)p_PortParams->independentMode;
1970         portInParams.liodnOffset        = p_PortParams->liodnOffset;
1971         portInParams.numOfTasks         = p_PortParams->numOfTasks;
1972         portInParams.numOfExtraTasks    = p_PortParams->numOfExtraTasks;
1973         portInParams.numOfOpenDmas      = p_PortParams->numOfOpenDmas;
1974         portInParams.numOfExtraOpenDmas = p_PortParams->numOfExtraOpenDmas;
1975         portInParams.sizeOfFifo         = p_PortParams->sizeOfFifo;
1976         portInParams.extraSizeOfFifo    = p_PortParams->extraSizeOfFifo;
1977         portInParams.deqPipelineDepth   = p_PortParams->deqPipelineDepth;
1978         portInParams.maxFrameLength     = p_PortParams->maxFrameLength;
1979         portInParams.liodnBase          = p_PortParams->liodnBase;
1980 
1981         memset(&msg, 0, sizeof(msg));
1982         memset(&reply, 0, sizeof(reply));
1983         msg.msgId = FM_GET_SET_PORT_PARAMS;
1984         memcpy(msg.msgBody, &portInParams, sizeof(portInParams));
1985         replyLength = (sizeof(uint32_t) + sizeof(t_FmIpcPortOutInitParams));
1986         if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
1987                                      (uint8_t*)&msg,
1988                                      sizeof(msg.msgId) +sizeof(portInParams),
1989                                      (uint8_t*)&reply,
1990                                      &replyLength,
1991                                      NULL,
1992                                      NULL)) != E_OK)
1993             RETURN_ERROR(MINOR, err, NO_MSG);
1994         if (replyLength != (sizeof(uint32_t) + sizeof(t_FmIpcPortOutInitParams)))
1995             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
1996         memcpy((uint8_t*)&portOutParams, reply.replyBody, sizeof(t_FmIpcPortOutInitParams));
1997 
1998         p_PortParams->fmMuramPhysBaseAddr.high = portOutParams.ipcPhysAddr.high;
1999         p_PortParams->fmMuramPhysBaseAddr.low  = portOutParams.ipcPhysAddr.low;
2000         p_PortParams->numOfTasks = portOutParams.numOfTasks;
2001         p_PortParams->numOfExtraTasks = portOutParams.numOfExtraTasks;
2002         p_PortParams->numOfOpenDmas = portOutParams.numOfOpenDmas;
2003         p_PortParams->numOfExtraOpenDmas = portOutParams.numOfExtraOpenDmas;
2004         p_PortParams->sizeOfFifo = portOutParams.sizeOfFifo;
2005         p_PortParams->extraSizeOfFifo = portOutParams.extraSizeOfFifo;
2006 
2007         return (t_Error)(reply.error);
2008     }
2009 
2010     ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));
2011 
2012     intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock);
2013     if (p_PortParams->independentMode)
2014     {
2015         /* set port parameters */
2016         p_Fm->independentMode = p_PortParams->independentMode;
2017         /* disable dispatch limit */
2018         fman_qmi_disable_dispatch_limit(fman_rg.fpm_rg);
2019     }
2020 
2021     if (p_PortParams->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND)
2022     {
2023         if (p_Fm->hcPortInitialized)
2024         {
2025             XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);
2026             RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Only one host command port is allowed."));
2027         }
2028         else
2029             p_Fm->hcPortInitialized = TRUE;
2030     }
2031     p_Fm->p_FmStateStruct->portsTypes[hardwarePortId] = p_PortParams->portType;
2032 
2033     err = FmSetNumOfTasks(p_Fm, hardwarePortId, &p_PortParams->numOfTasks, &p_PortParams->numOfExtraTasks, TRUE);
2034     if (err)
2035     {
2036         XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);
2037         RETURN_ERROR(MAJOR, err, NO_MSG);
2038     }
2039 
2040 #ifdef FM_QMI_NO_DEQ_OPTIONS_SUPPORT
2041     if (p_Fm->p_FmStateStruct->revInfo.majorRev != 4)
2042 #endif /* FM_QMI_NO_DEQ_OPTIONS_SUPPORT */
2043     if ((p_PortParams->portType != e_FM_PORT_TYPE_RX) &&
2044        (p_PortParams->portType != e_FM_PORT_TYPE_RX_10G))
2045     /* for transmit & O/H ports */
2046     {
2047         uint8_t     enqTh;
2048         uint8_t     deqTh;
2049 
2050         /* update qmi ENQ/DEQ threshold */
2051         p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums += p_PortParams->deqPipelineDepth;
2052         enqTh = fman_get_qmi_enq_th(fman_rg.qmi_rg);
2053         /* if enqTh is too big, we reduce it to the max value that is still OK */
2054         if (enqTh >= (QMI_MAX_NUM_OF_TNUMS - p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums))
2055         {
2056             enqTh = (uint8_t)(QMI_MAX_NUM_OF_TNUMS - p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums - 1);
2057             fman_set_qmi_enq_th(fman_rg.qmi_rg, enqTh);
2058         }
2059 
2060         deqTh = fman_get_qmi_deq_th(fman_rg.qmi_rg);
2061         /* if deqTh is too small, we enlarge it to the min value that is still OK.
2062          deqTh may not be larger than 63 (QMI_MAX_NUM_OF_TNUMS-1). */
2063         if ((deqTh <= p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums)  && (deqTh < QMI_MAX_NUM_OF_TNUMS-1))
2064         {
2065             deqTh = (uint8_t)(p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums + 1);
2066             fman_set_qmi_deq_th(fman_rg.qmi_rg, deqTh);
2067         }
2068     }
2069 
2070 #ifdef FM_LOW_END_RESTRICTION
2071     if ((hardwarePortId==0x1) || (hardwarePortId==0x29))
2072     {
2073         if (p_Fm->p_FmStateStruct->lowEndRestriction)
2074         {
2075             XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);
2076             RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("OP #0 cannot work with Tx Port #1."));
2077         }
2078         else
2079             p_Fm->p_FmStateStruct->lowEndRestriction = TRUE;
2080     }
2081 #endif /* FM_LOW_END_RESTRICTION */
2082 
2083     err = FmSetSizeOfFifo(p_Fm,
2084                           hardwarePortId,
2085                           &p_PortParams->sizeOfFifo,
2086                           &p_PortParams->extraSizeOfFifo,
2087                           TRUE);
2088     if (err)
2089     {
2090         XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);
2091         RETURN_ERROR(MAJOR, err, NO_MSG);
2092     }
2093 
2094     err = FmSetNumOfOpenDmas(p_Fm,
2095                              hardwarePortId,
2096                              &p_PortParams->numOfOpenDmas,
2097                              &p_PortParams->numOfExtraOpenDmas,
2098                              TRUE);
2099     if (err)
2100     {
2101         XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);
2102         RETURN_ERROR(MAJOR, err, NO_MSG);
2103     }
2104 
2105     fman_set_liodn_per_port(&fman_rg,
2106                             hardwarePortId,
2107                             p_PortParams->liodnBase,
2108                             p_PortParams->liodnOffset);
2109 
2110     if (p_Fm->p_FmStateStruct->revInfo.majorRev < 6)
2111         fman_set_order_restoration_per_port(fman_rg.fpm_rg,
2112                                             hardwarePortId,
2113                                             p_PortParams->independentMode,
2114                                             !!((p_PortParams->portType==e_FM_PORT_TYPE_RX) || (p_PortParams->portType==e_FM_PORT_TYPE_RX_10G)));
2115 
2116     HW_PORT_ID_TO_SW_PORT_ID(macId, hardwarePortId);
2117 
2118 #if defined(FM_MAX_NUM_OF_10G_MACS) && (FM_MAX_NUM_OF_10G_MACS)
2119     if ((p_PortParams->portType == e_FM_PORT_TYPE_TX_10G) ||
2120         (p_PortParams->portType == e_FM_PORT_TYPE_RX_10G))
2121     {
2122         ASSERT_COND(macId < FM_MAX_NUM_OF_10G_MACS);
2123         if (p_PortParams->maxFrameLength >= p_Fm->p_FmStateStruct->macMaxFrameLengths10G[macId])
2124             p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId] = p_PortParams->maxFrameLength;
2125         else
2126             RETURN_ERROR(MINOR, E_INVALID_VALUE, ("Port maxFrameLength is smaller than MAC current MTU"));
2127     }
2128     else
2129 #endif /* defined(FM_MAX_NUM_OF_10G_MACS) && ... */
2130     if ((p_PortParams->portType == e_FM_PORT_TYPE_TX) ||
2131         (p_PortParams->portType == e_FM_PORT_TYPE_RX))
2132     {
2133         ASSERT_COND(macId < FM_MAX_NUM_OF_1G_MACS);
2134         if (p_PortParams->maxFrameLength >= p_Fm->p_FmStateStruct->macMaxFrameLengths1G[macId])
2135             p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId] = p_PortParams->maxFrameLength;
2136         else
2137             RETURN_ERROR(MINOR, E_INVALID_VALUE, ("Port maxFrameLength is smaller than MAC current MTU"));
2138     }
2139 
2140     FmGetPhysicalMuramBase(p_Fm, &p_PortParams->fmMuramPhysBaseAddr);
2141     XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);
2142 
2143     return E_OK;
2144 }
2145 
2146 void FmFreePortParams(t_Handle h_Fm,t_FmInterModulePortFreeParams *p_PortParams)
2147 {
2148     t_Fm                    *p_Fm = (t_Fm*)h_Fm;
2149     uint32_t                intFlags;
2150     uint8_t                 hardwarePortId = p_PortParams->hardwarePortId;
2151     uint8_t                 numOfTasks, numOfDmas, macId;
2152     uint16_t                sizeOfFifo;
2153     t_Error                 err;
2154     t_FmIpcPortFreeParams   portParams;
2155     t_FmIpcMsg              msg;
2156     struct fman_qmi_regs *qmi_rg = p_Fm->p_FmQmiRegs;
2157     struct fman_bmi_regs *bmi_rg = p_Fm->p_FmBmiRegs;
2158 
2159     if (p_Fm->guestId != NCSW_MASTER_ID)
2160     {
2161         portParams.hardwarePortId = p_PortParams->hardwarePortId;
2162         portParams.enumPortType = (uint32_t)p_PortParams->portType;
2163         portParams.deqPipelineDepth = p_PortParams->deqPipelineDepth;
2164         memset(&msg, 0, sizeof(msg));
2165         msg.msgId = FM_FREE_PORT;
2166         memcpy(msg.msgBody, &portParams, sizeof(portParams));
2167         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
2168                                 (uint8_t*)&msg,
2169                                 sizeof(msg.msgId)+sizeof(portParams),
2170                                 NULL,
2171                                 NULL,
2172                                 NULL,
2173                                 NULL);
2174         if (err != E_OK)
2175             REPORT_ERROR(MINOR, err, NO_MSG);
2176         return;
2177     }
2178 
2179     ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));
2180 
2181     intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock);
2182 
2183     if (p_PortParams->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND)
2184     {
2185         ASSERT_COND(p_Fm->hcPortInitialized);
2186         p_Fm->hcPortInitialized = FALSE;
2187     }
2188 
2189     p_Fm->p_FmStateStruct->portsTypes[hardwarePortId] = e_FM_PORT_TYPE_DUMMY;
2190 
2191     /* free numOfTasks */
2192     numOfTasks = fman_get_num_of_tasks(bmi_rg, hardwarePortId);
2193     ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedNumOfTasks >= numOfTasks);
2194     p_Fm->p_FmStateStruct->accumulatedNumOfTasks -= numOfTasks;
2195 
2196     /* free numOfOpenDmas */
2197     numOfDmas = fman_get_num_of_dmas(bmi_rg, hardwarePortId);
2198     ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas >= numOfDmas);
2199     p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas -= numOfDmas;
2200 
2201 #ifdef FM_HAS_TOTAL_DMAS
2202     if (p_Fm->p_FmStateStruct->revInfo.majorRev < 6)
2203     {
2204         /* update total num of DMA's with committed number of open DMAS, and max uncommitted pool. */
2205         fman_set_num_of_open_dmas(bmi_rg,
2206                                   hardwarePortId,
2207                                   1,
2208                                   0,
2209                          (uint8_t)(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas + p_Fm->p_FmStateStruct->extraOpenDmasPoolSize));
2210     }
2211 #endif /* FM_HAS_TOTAL_DMAS */
2212 
2213     /* free sizeOfFifo */
2214     sizeOfFifo = fman_get_size_of_fifo(bmi_rg, hardwarePortId);
2215     ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedFifoSize >= (sizeOfFifo * BMI_FIFO_UNITS));
2216     p_Fm->p_FmStateStruct->accumulatedFifoSize -= (sizeOfFifo * BMI_FIFO_UNITS);
2217 
2218 #ifdef FM_QMI_NO_DEQ_OPTIONS_SUPPORT
2219     if (p_Fm->p_FmStateStruct->revInfo.majorRev != 4)
2220 #endif /* FM_QMI_NO_DEQ_OPTIONS_SUPPORT */
2221     if ((p_PortParams->portType != e_FM_PORT_TYPE_RX) &&
2222         (p_PortParams->portType != e_FM_PORT_TYPE_RX_10G))
2223     /* for transmit & O/H ports */
2224     {
2225         uint8_t     enqTh;
2226         uint8_t     deqTh;
2227 
2228         /* update qmi ENQ/DEQ threshold */
2229         p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums -= p_PortParams->deqPipelineDepth;
2230 
2231         /* p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums is now smaller,
2232            so we can enlarge enqTh */
2233         enqTh = (uint8_t)(QMI_MAX_NUM_OF_TNUMS - p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums - 1);
2234 
2235          /* p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums is now smaller,
2236             so we can reduce deqTh */
2237         deqTh = (uint8_t)(p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums + 1);
2238 
2239         fman_set_qmi_enq_th(qmi_rg, enqTh);
2240         fman_set_qmi_deq_th(qmi_rg, deqTh);
2241     }
2242 
2243     HW_PORT_ID_TO_SW_PORT_ID(macId, hardwarePortId);
2244 
2245 #if defined(FM_MAX_NUM_OF_10G_MACS) && (FM_MAX_NUM_OF_10G_MACS)
2246     if ((p_PortParams->portType == e_FM_PORT_TYPE_TX_10G) ||
2247         (p_PortParams->portType == e_FM_PORT_TYPE_RX_10G))
2248     {
2249         ASSERT_COND(macId < FM_MAX_NUM_OF_10G_MACS);
2250         p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId] = 0;
2251     }
2252     else
2253 #endif /* defined(FM_MAX_NUM_OF_10G_MACS) && ... */
2254     if ((p_PortParams->portType == e_FM_PORT_TYPE_TX) ||
2255         (p_PortParams->portType == e_FM_PORT_TYPE_RX))
2256     {
2257         ASSERT_COND(macId < FM_MAX_NUM_OF_1G_MACS);
2258         p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId] = 0;
2259     }
2260 
2261 #ifdef FM_LOW_END_RESTRICTION
2262     if ((hardwarePortId==0x1) || (hardwarePortId==0x29))
2263         p_Fm->p_FmStateStruct->lowEndRestriction = FALSE;
2264 #endif /* FM_LOW_END_RESTRICTION */
2265     XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);
2266 }
2267 
2268 t_Error FmIsPortStalled(t_Handle h_Fm, uint8_t hardwarePortId, bool *p_IsStalled)
2269 {
2270     t_Fm            *p_Fm = (t_Fm*)h_Fm;
2271     t_Error         err;
2272     t_FmIpcMsg      msg;
2273     t_FmIpcReply    reply;
2274     uint32_t        replyLength;
2275     struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;
2276 
2277     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
2278         !p_Fm->baseAddr &&
2279         p_Fm->h_IpcSessions[0])
2280     {
2281         memset(&msg, 0, sizeof(msg));
2282         memset(&reply, 0, sizeof(reply));
2283         msg.msgId = FM_IS_PORT_STALLED;
2284         msg.msgBody[0] = hardwarePortId;
2285         replyLength = sizeof(uint32_t) + sizeof(uint8_t);
2286         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
2287                                 (uint8_t*)&msg,
2288                                 sizeof(msg.msgId)+sizeof(hardwarePortId),
2289                                 (uint8_t*)&reply,
2290                                 &replyLength,
2291                                 NULL,
2292                                 NULL);
2293         if (err != E_OK)
2294             RETURN_ERROR(MINOR, err, NO_MSG);
2295         if (replyLength != (sizeof(uint32_t) + sizeof(uint8_t)))
2296             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
2297 
2298         *p_IsStalled = (bool)!!(*(uint8_t*)(reply.replyBody));
2299 
2300         return (t_Error)(reply.error);
2301     }
2302     else if (!p_Fm->baseAddr)
2303         RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
2304                      ("Either IPC or 'baseAddress' is required!"));
2305 
2306     *p_IsStalled = fman_is_port_stalled(fpm_rg, hardwarePortId);
2307 
2308     return E_OK;
2309 }
2310 
2311 t_Error FmResumeStalledPort(t_Handle h_Fm, uint8_t hardwarePortId)
2312 {
2313     t_Fm            *p_Fm = (t_Fm*)h_Fm;
2314     t_Error         err;
2315     bool            isStalled;
2316     struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;
2317 
2318     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
2319         !p_Fm->baseAddr &&
2320         p_Fm->h_IpcSessions[0])
2321     {
2322         t_FmIpcMsg      msg;
2323         t_FmIpcReply    reply;
2324         uint32_t        replyLength;
2325 
2326         memset(&msg, 0, sizeof(msg));
2327         memset(&reply, 0, sizeof(reply));
2328         msg.msgId = FM_RESUME_STALLED_PORT;
2329         msg.msgBody[0] = hardwarePortId;
2330         replyLength = sizeof(uint32_t);
2331         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
2332                                 (uint8_t*)&msg,
2333                                 sizeof(msg.msgId) + sizeof(hardwarePortId),
2334                                 (uint8_t*)&reply,
2335                                 &replyLength,
2336                                 NULL,
2337                                 NULL);
2338         if (err != E_OK)
2339             RETURN_ERROR(MINOR, err, NO_MSG);
2340         if (replyLength != sizeof(uint32_t))
2341             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
2342         return (t_Error)(reply.error);
2343     }
2344     else if (!p_Fm->baseAddr)
2345         RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
2346                      ("Either IPC or 'baseAddress' is required!"));
2347 
2348     if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)
2349         RETURN_ERROR(MINOR, E_NOT_AVAILABLE, ("Not available for this FM revision!"));
2350 
2351     /* Get port status */
2352     err = FmIsPortStalled(h_Fm, hardwarePortId, &isStalled);
2353     if (err)
2354         RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Can't get port status"));
2355     if (!isStalled)
2356         return E_OK;
2357 
2358     fman_resume_stalled_port(fpm_rg, hardwarePortId);
2359 
2360     return E_OK;
2361 }
2362 
2363 t_Error FmResetMac(t_Handle h_Fm, e_FmMacType type, uint8_t macId)
2364 {
2365     t_Fm                *p_Fm = (t_Fm*)h_Fm;
2366     t_Error             err;
2367     struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;
2368 
2369 #if (DPAA_VERSION >= 11)
2370     if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)
2371         RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
2372                      ("FMan MAC reset!"));
2373 #endif /*(DPAA_VERSION >= 11)*/
2374 
2375     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
2376         !p_Fm->baseAddr &&
2377         p_Fm->h_IpcSessions[0])
2378     {
2379         t_FmIpcMacParams    macParams;
2380         t_FmIpcMsg          msg;
2381         t_FmIpcReply        reply;
2382         uint32_t            replyLength;
2383 
2384         memset(&msg, 0, sizeof(msg));
2385         memset(&reply, 0, sizeof(reply));
2386         macParams.id = macId;
2387         macParams.enumType = (uint32_t)type;
2388         msg.msgId = FM_RESET_MAC;
2389         memcpy(msg.msgBody,  &macParams, sizeof(macParams));
2390         replyLength = sizeof(uint32_t);
2391         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
2392                                 (uint8_t*)&msg,
2393                                 sizeof(msg.msgId)+sizeof(macParams),
2394                                 (uint8_t*)&reply,
2395                                 &replyLength,
2396                                 NULL,
2397                                 NULL);
2398         if (err != E_OK)
2399             RETURN_ERROR(MINOR, err, NO_MSG);
2400         if (replyLength != sizeof(uint32_t))
2401             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
2402         return (t_Error)(reply.error);
2403     }
2404     else if (!p_Fm->baseAddr)
2405         RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
2406                      ("Either IPC or 'baseAddress' is required!"));
2407 
2408     err = (t_Error)fman_reset_mac(fpm_rg, macId, !!(type == e_FM_MAC_10G));
2409 
2410     if (err == -EBUSY)
2411         return ERROR_CODE(E_TIMEOUT);
2412     else if (err)
2413         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal MAC ID"));
2414 
2415     return E_OK;
2416 }
2417 
2418 t_Error FmSetMacMaxFrame(t_Handle h_Fm, e_FmMacType type, uint8_t macId, uint16_t mtu)
2419 {
2420     t_Fm                        *p_Fm = (t_Fm*)h_Fm;
2421 
2422     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
2423         p_Fm->h_IpcSessions[0])
2424     {
2425         t_FmIpcMacMaxFrameParams    macMaxFrameLengthParams;
2426         t_Error                     err;
2427         t_FmIpcMsg                  msg;
2428 
2429         memset(&msg, 0, sizeof(msg));
2430         macMaxFrameLengthParams.macParams.id = macId;
2431         macMaxFrameLengthParams.macParams.enumType = (uint32_t)type;
2432         macMaxFrameLengthParams.maxFrameLength = (uint16_t)mtu;
2433         msg.msgId = FM_SET_MAC_MAX_FRAME;
2434         memcpy(msg.msgBody,  &macMaxFrameLengthParams, sizeof(macMaxFrameLengthParams));
2435         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
2436                                 (uint8_t*)&msg,
2437                                 sizeof(msg.msgId)+sizeof(macMaxFrameLengthParams),
2438                                 NULL,
2439                                 NULL,
2440                                 NULL,
2441                                 NULL);
2442         if (err != E_OK)
2443             RETURN_ERROR(MINOR, err, NO_MSG);
2444         return E_OK;
2445     }
2446     else if (p_Fm->guestId != NCSW_MASTER_ID)
2447         RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
2448                      ("running in guest-mode without IPC!"));
2449 
2450     /* if port is already initialized, check that MaxFrameLength is smaller
2451      * or equal to the port's max */
2452 #if (defined(FM_MAX_NUM_OF_10G_MACS) && (FM_MAX_NUM_OF_10G_MACS))
2453     if (type == e_FM_MAC_10G)
2454     {
2455         if ((!p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId])
2456            || (p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId] &&
2457               (mtu <= p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId])))
2458                p_Fm->p_FmStateStruct->macMaxFrameLengths10G[macId] = mtu;
2459         else
2460             RETURN_ERROR(MINOR, E_INVALID_VALUE, ("MAC maxFrameLength is larger than Port maxFrameLength"));
2461 
2462     }
2463     else
2464 #else
2465     UNUSED(type);
2466 #endif /* (defined(FM_MAX_NUM_OF_10G_MACS) && ... */
2467     if ((!p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId])
2468        || (p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId] &&
2469           (mtu <= p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId])))
2470         p_Fm->p_FmStateStruct->macMaxFrameLengths1G[macId] = mtu;
2471     else
2472         RETURN_ERROR(MINOR, E_INVALID_VALUE, ("MAC maxFrameLength is larger than Port maxFrameLength"));
2473 
2474     return E_OK;
2475 }
2476 
2477 uint16_t FmGetClockFreq(t_Handle h_Fm)
2478 {
2479     t_Fm *p_Fm = (t_Fm*)h_Fm;
2480 
2481     /* for multicore environment: this depends on the
2482      * fact that fmClkFreq was properly initialized at "init". */
2483     return p_Fm->p_FmStateStruct->fmClkFreq;
2484 }
2485 
2486 uint16_t FmGetMacClockFreq(t_Handle h_Fm)
2487 {
2488     t_Fm *p_Fm = (t_Fm*)h_Fm;
2489 
2490     return p_Fm->p_FmStateStruct->fmMacClkFreq;
2491 }
2492 
2493 uint32_t FmGetTimeStampScale(t_Handle h_Fm)
2494 {
2495     t_Fm                *p_Fm = (t_Fm*)h_Fm;
2496 
2497     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
2498         !p_Fm->baseAddr &&
2499         p_Fm->h_IpcSessions[0])
2500     {
2501         t_Error             err;
2502         t_FmIpcMsg          msg;
2503         t_FmIpcReply        reply;
2504         uint32_t            replyLength, timeStamp;
2505 
2506         memset(&msg, 0, sizeof(msg));
2507         memset(&reply, 0, sizeof(reply));
2508         msg.msgId = FM_GET_TIMESTAMP_SCALE;
2509         replyLength = sizeof(uint32_t) + sizeof(uint32_t);
2510         if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
2511                                      (uint8_t*)&msg,
2512                                      sizeof(msg.msgId),
2513                                      (uint8_t*)&reply,
2514                                      &replyLength,
2515                                      NULL,
2516                                      NULL)) != E_OK)
2517         {
2518             REPORT_ERROR(MAJOR, err, NO_MSG);
2519             return 0;
2520         }
2521         if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t)))
2522         {
2523             REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
2524             return 0;
2525         }
2526 
2527         memcpy((uint8_t*)&timeStamp, reply.replyBody, sizeof(uint32_t));
2528         return timeStamp;
2529     }
2530     else if ((p_Fm->guestId != NCSW_MASTER_ID) &&
2531              p_Fm->baseAddr)
2532     {
2533         if (!(GET_UINT32(p_Fm->p_FmFpmRegs->fmfp_tsc1) & FPM_TS_CTL_EN))
2534         {
2535             REPORT_ERROR(MAJOR, E_INVALID_STATE, ("timestamp is not enabled!"));
2536             return 0;
2537         }
2538     }
2539     else if (p_Fm->guestId != NCSW_MASTER_ID)
2540         DBG(WARNING, ("No IPC - can't validate FM if timestamp enabled."));
2541 
2542     return p_Fm->p_FmStateStruct->count1MicroBit;
2543 }
2544 
2545 t_Error FmEnableRamsEcc(t_Handle h_Fm)
2546 {
2547     t_Fm        *p_Fm = (t_Fm*)h_Fm;
2548 
2549     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
2550 
2551     p_Fm->p_FmStateStruct->ramsEccOwners++;
2552     p_Fm->p_FmStateStruct->internalCall = TRUE;
2553 
2554     return FM_EnableRamsEcc(p_Fm);
2555 }
2556 
2557 t_Error FmDisableRamsEcc(t_Handle h_Fm)
2558 {
2559     t_Fm        *p_Fm = (t_Fm*)h_Fm;
2560 
2561     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
2562 
2563     ASSERT_COND(p_Fm->p_FmStateStruct->ramsEccOwners);
2564     p_Fm->p_FmStateStruct->ramsEccOwners--;
2565 
2566     if (p_Fm->p_FmStateStruct->ramsEccOwners==0)
2567     {
2568         p_Fm->p_FmStateStruct->internalCall = TRUE;
2569         return FM_DisableRamsEcc(p_Fm);
2570     }
2571 
2572     return E_OK;
2573 }
2574 
2575 uint8_t FmGetGuestId(t_Handle h_Fm)
2576 {
2577     t_Fm     *p_Fm = (t_Fm*)h_Fm;
2578 
2579     return p_Fm->guestId;
2580 }
2581 
2582 bool FmIsMaster(t_Handle h_Fm)
2583 {
2584     t_Fm     *p_Fm = (t_Fm*)h_Fm;
2585 
2586     return (p_Fm->guestId == NCSW_MASTER_ID);
2587 }
2588 
2589 t_Error FmSetSizeOfFifo(t_Handle    h_Fm,
2590                         uint8_t     hardwarePortId,
2591                         uint32_t    *p_SizeOfFifo,
2592                         uint32_t    *p_ExtraSizeOfFifo,
2593                         bool        initialConfig)
2594 {
2595     t_Fm                    *p_Fm = (t_Fm*)h_Fm;
2596     t_FmIpcPortRsrcParams   rsrcParams;
2597     t_Error                 err;
2598     struct fman_bmi_regs    *bmi_rg = p_Fm->p_FmBmiRegs;
2599     uint32_t                sizeOfFifo = *p_SizeOfFifo, extraSizeOfFifo = *p_ExtraSizeOfFifo;
2600     uint16_t                currentVal = 0, currentExtraVal = 0;
2601 
2602     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
2603         !p_Fm->baseAddr &&
2604         p_Fm->h_IpcSessions[0])
2605     {
2606         t_FmIpcMsg          msg;
2607         t_FmIpcReply        reply;
2608         uint32_t            replyLength;
2609 
2610         rsrcParams.hardwarePortId = hardwarePortId;
2611         rsrcParams.val = sizeOfFifo;
2612         rsrcParams.extra = extraSizeOfFifo;
2613         rsrcParams.boolInitialConfig = (uint8_t)initialConfig;
2614 
2615         memset(&msg, 0, sizeof(msg));
2616         memset(&reply, 0, sizeof(reply));
2617         msg.msgId = FM_SET_SIZE_OF_FIFO;
2618         memcpy(msg.msgBody, &rsrcParams, sizeof(rsrcParams));
2619         replyLength = sizeof(uint32_t);
2620         if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
2621                                      (uint8_t*)&msg,
2622                                      sizeof(msg.msgId) + sizeof(rsrcParams),
2623                                      (uint8_t*)&reply,
2624                                      &replyLength,
2625                                      NULL,
2626                                      NULL)) != E_OK)
2627             RETURN_ERROR(MINOR, err, NO_MSG);
2628         if (replyLength != sizeof(uint32_t))
2629             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
2630         return (t_Error)(reply.error);
2631     }
2632     else if ((p_Fm->guestId != NCSW_MASTER_ID) &&
2633              p_Fm->baseAddr)
2634     {
2635         DBG(WARNING, ("No IPC - can't validate FM total-fifo size."));
2636         fman_set_size_of_fifo(bmi_rg, hardwarePortId, sizeOfFifo, extraSizeOfFifo);
2637     }
2638     else if (p_Fm->guestId != NCSW_MASTER_ID)
2639         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,
2640                      ("running in guest-mode without neither IPC nor mapped register!"));
2641 
2642     if (!initialConfig)
2643     {
2644         /* !initialConfig - runtime change of existing value.
2645          * - read the current FIFO and extra FIFO size */
2646         currentExtraVal = fman_get_size_of_extra_fifo(bmi_rg, hardwarePortId);
2647         currentVal = fman_get_size_of_fifo(bmi_rg, hardwarePortId);
2648     }
2649 
2650     if (extraSizeOfFifo > currentExtraVal)
2651     {
2652         if (extraSizeOfFifo && !p_Fm->p_FmStateStruct->extraFifoPoolSize)
2653             /* if this is the first time a port requires extraFifoPoolSize, the total extraFifoPoolSize
2654              * must be initialized to 1 buffer per port
2655              */
2656             p_Fm->p_FmStateStruct->extraFifoPoolSize = FM_MAX_NUM_OF_RX_PORTS*BMI_FIFO_UNITS;
2657 
2658         p_Fm->p_FmStateStruct->extraFifoPoolSize = MAX(p_Fm->p_FmStateStruct->extraFifoPoolSize, extraSizeOfFifo);
2659     }
2660 
2661     /* check that there are enough uncommitted fifo size */
2662     if ((p_Fm->p_FmStateStruct->accumulatedFifoSize - currentVal + sizeOfFifo) >
2663         (p_Fm->p_FmStateStruct->totalFifoSize - p_Fm->p_FmStateStruct->extraFifoPoolSize)){
2664         REPORT_ERROR(MAJOR, E_INVALID_VALUE,
2665             ("Port request fifo size + accumulated size > total FIFO size:"));
2666         RETURN_ERROR(MAJOR, E_INVALID_VALUE,
2667             ("port 0x%x requested %d bytes, extra size = %d, accumulated size = %d total size = %d",
2668                 hardwarePortId, sizeOfFifo, p_Fm->p_FmStateStruct->extraFifoPoolSize,
2669                 p_Fm->p_FmStateStruct->accumulatedFifoSize,
2670                 p_Fm->p_FmStateStruct->totalFifoSize));
2671     }
2672     else
2673     {
2674         /* update accumulated */
2675         ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedFifoSize >= currentVal);
2676         p_Fm->p_FmStateStruct->accumulatedFifoSize -= currentVal;
2677         p_Fm->p_FmStateStruct->accumulatedFifoSize += sizeOfFifo;
2678         fman_set_size_of_fifo(bmi_rg, hardwarePortId, sizeOfFifo, extraSizeOfFifo);
2679     }
2680 
2681     return E_OK;
2682 }
2683 
2684 t_Error FmSetNumOfTasks(t_Handle    h_Fm,
2685                         uint8_t     hardwarePortId,
2686                         uint8_t     *p_NumOfTasks,
2687                         uint8_t     *p_NumOfExtraTasks,
2688                         bool        initialConfig)
2689 {
2690     t_Fm                    *p_Fm = (t_Fm *)h_Fm;
2691     t_Error                 err;
2692     struct fman_bmi_regs    *bmi_rg = p_Fm->p_FmBmiRegs;
2693     uint8_t                 currentVal = 0, currentExtraVal = 0, numOfTasks = *p_NumOfTasks, numOfExtraTasks = *p_NumOfExtraTasks;
2694 
2695     ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));
2696 
2697     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
2698         !p_Fm->baseAddr &&
2699         p_Fm->h_IpcSessions[0])
2700     {
2701         t_FmIpcPortRsrcParams   rsrcParams;
2702         t_FmIpcMsg              msg;
2703         t_FmIpcReply            reply;
2704         uint32_t                replyLength;
2705 
2706         rsrcParams.hardwarePortId = hardwarePortId;
2707         rsrcParams.val = numOfTasks;
2708         rsrcParams.extra = numOfExtraTasks;
2709         rsrcParams.boolInitialConfig = (uint8_t)initialConfig;
2710 
2711         memset(&msg, 0, sizeof(msg));
2712         memset(&reply, 0, sizeof(reply));
2713         msg.msgId = FM_SET_NUM_OF_TASKS;
2714         memcpy(msg.msgBody, &rsrcParams, sizeof(rsrcParams));
2715         replyLength = sizeof(uint32_t);
2716         if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
2717                                      (uint8_t*)&msg,
2718                                      sizeof(msg.msgId) + sizeof(rsrcParams),
2719                                      (uint8_t*)&reply,
2720                                      &replyLength,
2721                                      NULL,
2722                                      NULL)) != E_OK)
2723             RETURN_ERROR(MINOR, err, NO_MSG);
2724         if (replyLength != sizeof(uint32_t))
2725             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
2726         return (t_Error)(reply.error);
2727     }
2728     else if ((p_Fm->guestId != NCSW_MASTER_ID) &&
2729              p_Fm->baseAddr)
2730     {
2731         DBG(WARNING, ("No IPC - can't validate FM total-num-of-tasks."));
2732         fman_set_num_of_tasks(bmi_rg, hardwarePortId, numOfTasks, numOfExtraTasks);
2733     }
2734     else if (p_Fm->guestId != NCSW_MASTER_ID)
2735         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,
2736                      ("running in guest-mode without neither IPC nor mapped register!"));
2737 
2738     if (!initialConfig)
2739     {
2740         /* !initialConfig - runtime change of existing value.
2741          * - read the current number of tasks */
2742         currentVal = fman_get_num_of_tasks(bmi_rg, hardwarePortId);
2743         currentExtraVal = fman_get_num_extra_tasks(bmi_rg, hardwarePortId);
2744     }
2745 
2746     if (numOfExtraTasks > currentExtraVal)
2747          p_Fm->p_FmStateStruct->extraTasksPoolSize =
2748              (uint8_t)MAX(p_Fm->p_FmStateStruct->extraTasksPoolSize, numOfExtraTasks);
2749 
2750     /* check that there are enough uncommitted tasks */
2751     if ((p_Fm->p_FmStateStruct->accumulatedNumOfTasks - currentVal + numOfTasks) >
2752        (p_Fm->p_FmStateStruct->totalNumOfTasks - p_Fm->p_FmStateStruct->extraTasksPoolSize))
2753         RETURN_ERROR(MAJOR, E_NOT_AVAILABLE,
2754                      ("Requested numOfTasks and extra tasks pool for fm%d exceed total numOfTasks.",
2755                       p_Fm->p_FmStateStruct->fmId));
2756     else
2757     {
2758         ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedNumOfTasks >= currentVal);
2759         /* update accumulated */
2760         p_Fm->p_FmStateStruct->accumulatedNumOfTasks -= currentVal;
2761         p_Fm->p_FmStateStruct->accumulatedNumOfTasks += numOfTasks;
2762         fman_set_num_of_tasks(bmi_rg, hardwarePortId, numOfTasks, numOfExtraTasks);
2763     }
2764 
2765     return E_OK;
2766 }
2767 
2768 t_Error FmSetNumOfOpenDmas(t_Handle h_Fm,
2769                            uint8_t hardwarePortId,
2770                            uint8_t *p_NumOfOpenDmas,
2771                            uint8_t *p_NumOfExtraOpenDmas,
2772                            bool    initialConfig)
2773 
2774 {
2775     t_Fm                    *p_Fm = (t_Fm *)h_Fm;
2776     t_Error                 err;
2777     struct fman_bmi_regs    *bmi_rg = p_Fm->p_FmBmiRegs;
2778     uint8_t                 numOfOpenDmas = *p_NumOfOpenDmas, numOfExtraOpenDmas = *p_NumOfExtraOpenDmas;
2779     uint8_t                 totalNumDmas = 0, currentVal = 0, currentExtraVal = 0;
2780 
2781     ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));
2782 
2783     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
2784         !p_Fm->baseAddr &&
2785         p_Fm->h_IpcSessions[0])
2786     {
2787         t_FmIpcPortRsrcParams   rsrcParams;
2788         t_FmIpcMsg              msg;
2789         t_FmIpcReply            reply;
2790         uint32_t                replyLength;
2791 
2792         rsrcParams.hardwarePortId = hardwarePortId;
2793         rsrcParams.val = numOfOpenDmas;
2794         rsrcParams.extra = numOfExtraOpenDmas;
2795         rsrcParams.boolInitialConfig = (uint8_t)initialConfig;
2796 
2797         memset(&msg, 0, sizeof(msg));
2798         memset(&reply, 0, sizeof(reply));
2799         msg.msgId = FM_SET_NUM_OF_OPEN_DMAS;
2800         memcpy(msg.msgBody, &rsrcParams, sizeof(rsrcParams));
2801         replyLength = sizeof(uint32_t);
2802         if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
2803                                      (uint8_t*)&msg,
2804                                      sizeof(msg.msgId) + sizeof(rsrcParams),
2805                                      (uint8_t*)&reply,
2806                                      &replyLength,
2807                                      NULL,
2808                                      NULL)) != E_OK)
2809             RETURN_ERROR(MINOR, err, NO_MSG);
2810         if (replyLength != sizeof(uint32_t))
2811             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
2812         return (t_Error)(reply.error);
2813     }
2814 #ifdef FM_HAS_TOTAL_DMAS
2815     else if (p_Fm->guestId != NCSW_MASTER_ID)
2816         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("running in guest-mode without IPC!"));
2817 #else
2818     else if ((p_Fm->guestId != NCSW_MASTER_ID) &&
2819              p_Fm->baseAddr &&
2820              (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6))
2821     {
2822         /*DBG(WARNING, ("No IPC - can't validate FM total-num-of-dmas."));*/
2823 
2824         if (!numOfOpenDmas)
2825         {
2826              /* first config without explic it value: Do Nothing - reset value shouldn't be
2827                 changed, read register for port save */
2828                 *p_NumOfOpenDmas = fman_get_num_of_dmas(bmi_rg, hardwarePortId);
2829                 *p_NumOfExtraOpenDmas = fman_get_num_extra_dmas(bmi_rg, hardwarePortId);
2830         }
2831         else
2832             /* whether it is the first time with explicit value, or runtime "set" - write register */
2833             fman_set_num_of_open_dmas(bmi_rg,
2834                                    hardwarePortId,
2835                                    numOfOpenDmas,
2836                                    numOfExtraOpenDmas,
2837                                    p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas + p_Fm->p_FmStateStruct->extraOpenDmasPoolSize);
2838     }
2839     else if (p_Fm->guestId != NCSW_MASTER_ID)
2840         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,
2841                      ("running in guest-mode without neither IPC nor mapped register!"));
2842 #endif /* FM_HAS_TOTAL_DMAS */
2843 
2844     if (!initialConfig)
2845     {
2846         /* !initialConfig - runtime change of existing value.
2847          * - read the current number of open Dma's */
2848         currentExtraVal = fman_get_num_extra_dmas(bmi_rg, hardwarePortId);
2849         currentVal = fman_get_num_of_dmas(bmi_rg, hardwarePortId);
2850     }
2851 
2852 #ifdef FM_NO_GUARANTEED_RESET_VALUES
2853     /* it's illegal to be in a state where this is not the first set and no value is specified */
2854     ASSERT_COND(initialConfig || numOfOpenDmas);
2855     if (!numOfOpenDmas)
2856     {
2857         /* !numOfOpenDmas - first configuration according to values in regs.
2858          * - read the current number of open Dma's */
2859         currentExtraVal = fman_get_num_extra_dmas(bmi_rg, hardwarePortId);
2860         currentVal = fman_get_num_of_dmas(bmi_rg, hardwarePortId);
2861         /* This is the first configuration and user did not specify value (!numOfOpenDmas),
2862          * reset values will be used and we just save these values for resource management */
2863         p_Fm->p_FmStateStruct->extraOpenDmasPoolSize =
2864                     (uint8_t)MAX(p_Fm->p_FmStateStruct->extraOpenDmasPoolSize, currentExtraVal);
2865         p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas += currentVal;
2866         *p_NumOfOpenDmas = currentVal;
2867         *p_NumOfExtraOpenDmas = currentExtraVal;
2868         return E_OK;
2869     }
2870 #endif /* FM_NO_GUARANTEED_RESET_VALUES */
2871 
2872         if (numOfExtraOpenDmas > currentExtraVal)
2873              p_Fm->p_FmStateStruct->extraOpenDmasPoolSize =
2874                  (uint8_t)MAX(p_Fm->p_FmStateStruct->extraOpenDmasPoolSize, numOfExtraOpenDmas);
2875 
2876 #ifdef FM_HAS_TOTAL_DMAS
2877         if ((p_Fm->p_FmStateStruct->revInfo.majorRev < 6) &&
2878             (p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas - currentVal + numOfOpenDmas >
2879                 p_Fm->p_FmStateStruct->maxNumOfOpenDmas))
2880                 RETURN_ERROR(MAJOR, E_NOT_AVAILABLE,
2881                              ("Requested numOfOpenDmas for fm%d exceeds total numOfOpenDmas.",
2882                              p_Fm->p_FmStateStruct->fmId));
2883 #else
2884         if ((p_Fm->p_FmStateStruct->revInfo.majorRev >= 6) &&
2885 #ifdef FM_HEAVY_TRAFFIC_SEQUENCER_HANG_ERRATA_FMAN_A006981
2886             !((p_Fm->p_FmStateStruct->revInfo.majorRev == 6) &&
2887               (p_Fm->p_FmStateStruct->revInfo.minorRev == 0)) &&
2888 #endif /* FM_HEAVY_TRAFFIC_SEQUENCER_HANG_ERRATA_FMAN_A006981 */
2889             (p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas - currentVal + numOfOpenDmas > DMA_THRESH_MAX_COMMQ + 1))
2890             RETURN_ERROR(MAJOR, E_NOT_AVAILABLE,
2891                          ("Requested numOfOpenDmas for fm%d exceeds DMA Command queue (%d)",
2892                           p_Fm->p_FmStateStruct->fmId, DMA_THRESH_MAX_COMMQ+1));
2893 #endif /* FM_HAS_TOTAL_DMAS */
2894         else
2895         {
2896             ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas >= currentVal);
2897             /* update acummulated */
2898             p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas -= currentVal;
2899             p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas += numOfOpenDmas;
2900 
2901 #ifdef FM_HAS_TOTAL_DMAS
2902             if (p_Fm->p_FmStateStruct->revInfo.majorRev < 6)
2903             totalNumDmas = (uint8_t)(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas + p_Fm->p_FmStateStruct->extraOpenDmasPoolSize);
2904 #endif /* FM_HAS_TOTAL_DMAS */
2905             fman_set_num_of_open_dmas(bmi_rg,
2906                                hardwarePortId,
2907                                numOfOpenDmas,
2908                                numOfExtraOpenDmas,
2909                                totalNumDmas);
2910         }
2911 
2912     return E_OK;
2913 }
2914 
2915 #if (DPAA_VERSION >= 11)
2916 t_Error FmVSPCheckRelativeProfile(t_Handle        h_Fm,
2917                                   e_FmPortType    portType,
2918                                   uint8_t         portId,
2919                                   uint16_t        relativeProfile)
2920 {
2921     t_Fm         *p_Fm;
2922     t_FmSp      *p_FmPcdSp;
2923     uint8_t     swPortIndex=0, hardwarePortId;
2924 
2925     ASSERT_COND(h_Fm);
2926     p_Fm = (t_Fm*)h_Fm;
2927 
2928     hardwarePortId = SwPortIdToHwPortId(portType,
2929                                     portId,
2930                                     p_Fm->p_FmStateStruct->revInfo.majorRev,
2931                                     p_Fm->p_FmStateStruct->revInfo.minorRev);
2932     ASSERT_COND(hardwarePortId);
2933     HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);
2934 
2935     p_FmPcdSp = p_Fm->p_FmSp;
2936     ASSERT_COND(p_FmPcdSp);
2937 
2938     if (!p_FmPcdSp->portsMapping[swPortIndex].numOfProfiles)
2939         RETURN_ERROR(MAJOR, E_INVALID_STATE , ("Port has no allocated profiles"));
2940     if (relativeProfile >= p_FmPcdSp->portsMapping[swPortIndex].numOfProfiles)
2941         RETURN_ERROR(MAJOR, E_NOT_IN_RANGE , ("Profile id is out of range"));
2942 
2943     return E_OK;
2944 }
2945 
2946 t_Error FmVSPGetAbsoluteProfileId(t_Handle        h_Fm,
2947                                   e_FmPortType    portType,
2948                                   uint8_t         portId,
2949                                   uint16_t        relativeProfile,
2950                                   uint16_t        *p_AbsoluteId)
2951 {
2952     t_Fm         *p_Fm;
2953     t_FmSp      *p_FmPcdSp;
2954     uint8_t     swPortIndex=0, hardwarePortId;
2955     t_Error     err;
2956 
2957     ASSERT_COND(h_Fm);
2958     p_Fm = (t_Fm*)h_Fm;
2959 
2960     err = FmVSPCheckRelativeProfile(h_Fm, portType, portId, relativeProfile);
2961     if (err != E_OK)
2962         return err;
2963 
2964     hardwarePortId = SwPortIdToHwPortId(portType,
2965                                     portId,
2966                                     p_Fm->p_FmStateStruct->revInfo.majorRev,
2967                                     p_Fm->p_FmStateStruct->revInfo.minorRev);
2968     ASSERT_COND(hardwarePortId);
2969     HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);
2970 
2971     p_FmPcdSp = p_Fm->p_FmSp;
2972     ASSERT_COND(p_FmPcdSp);
2973 
2974     *p_AbsoluteId = (uint16_t)(p_FmPcdSp->portsMapping[swPortIndex].profilesBase + relativeProfile);
2975 
2976     return E_OK;
2977 }
2978 #endif /* (DPAA_VERSION >= 11) */
2979 
2980 static t_Error InitFmDma(t_Fm *p_Fm)
2981 {
2982     t_Error err;
2983 
2984     err = (t_Error)fman_dma_init(p_Fm->p_FmDmaRegs, p_Fm->p_FmDriverParam);
2985     if (err != E_OK)
2986         return err;
2987 
2988     /* Allocate MURAM for CAM */
2989     p_Fm->camBaseAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_Fm->h_FmMuram,
2990                                                       (uint32_t)(p_Fm->p_FmDriverParam->dma_cam_num_of_entries*DMA_CAM_SIZEOF_ENTRY),
2991                                                       DMA_CAM_ALIGN));
2992     if (!p_Fm->camBaseAddr)
2993         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for DMA CAM failed"));
2994 
2995     WRITE_BLOCK(UINT_TO_PTR(p_Fm->camBaseAddr),
2996                 0,
2997                 (uint32_t)(p_Fm->p_FmDriverParam->dma_cam_num_of_entries*DMA_CAM_SIZEOF_ENTRY));
2998 
2999     if (p_Fm->p_FmStateStruct->revInfo.majorRev == 2)
3000     {
3001         FM_MURAM_FreeMem(p_Fm->h_FmMuram, UINT_TO_PTR(p_Fm->camBaseAddr));
3002 
3003         p_Fm->camBaseAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_Fm->h_FmMuram,
3004                                                           (uint32_t)(p_Fm->p_FmDriverParam->dma_cam_num_of_entries*72 + 128),
3005                                                           64));
3006         if (!p_Fm->camBaseAddr)
3007             RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for DMA CAM failed"));
3008 
3009         WRITE_BLOCK(UINT_TO_PTR(p_Fm->camBaseAddr),
3010                    0,
3011                (uint32_t)(p_Fm->p_FmDriverParam->dma_cam_num_of_entries*72 + 128));
3012 
3013         switch(p_Fm->p_FmDriverParam->dma_cam_num_of_entries)
3014         {
3015             case (8):
3016                 WRITE_UINT32(*(uint32_t*)p_Fm->camBaseAddr, 0xff000000);
3017                 break;
3018             case (16):
3019                 WRITE_UINT32(*(uint32_t*)p_Fm->camBaseAddr, 0xffff0000);
3020                 break;
3021             case (24):
3022                 WRITE_UINT32(*(uint32_t*)p_Fm->camBaseAddr, 0xffffff00);
3023                 break;
3024             case (32):
3025                 WRITE_UINT32(*(uint32_t*)p_Fm->camBaseAddr, 0xffffffff);
3026                 break;
3027             default:
3028                 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("wrong dma_cam_num_of_entries"));
3029         }
3030     }
3031 
3032     p_Fm->p_FmDriverParam->cam_base_addr =
3033                  (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_Fm->camBaseAddr)) - p_Fm->fmMuramPhysBaseAddr);
3034 
3035     return E_OK;
3036 }
3037 
3038 static t_Error InitFmFpm(t_Fm *p_Fm)
3039 {
3040     return (t_Error)fman_fpm_init(p_Fm->p_FmFpmRegs, p_Fm->p_FmDriverParam);
3041 }
3042 
3043 static t_Error InitFmBmi(t_Fm *p_Fm)
3044 {
3045     return (t_Error)fman_bmi_init(p_Fm->p_FmBmiRegs, p_Fm->p_FmDriverParam);
3046 }
3047 
3048 static t_Error InitFmQmi(t_Fm *p_Fm)
3049 {
3050     return (t_Error)fman_qmi_init(p_Fm->p_FmQmiRegs, p_Fm->p_FmDriverParam);
3051 }
3052 
3053 static t_Error InitGuestMode(t_Fm *p_Fm)
3054 {
3055     t_Error                 err = E_OK;
3056     int                     i;
3057     t_FmIpcMsg              msg;
3058     t_FmIpcReply            reply;
3059     uint32_t                replyLength;
3060 
3061     ASSERT_COND(p_Fm);
3062     ASSERT_COND(p_Fm->guestId != NCSW_MASTER_ID);
3063 
3064     /* build the FM guest partition IPC address */
3065     if (Sprint (p_Fm->fmModuleName, "FM_%d_%d",p_Fm->p_FmStateStruct->fmId, p_Fm->guestId) != (p_Fm->guestId<10 ? 6:7))
3066         RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
3067 
3068     /* build the FM master partition IPC address */
3069     memset(p_Fm->fmIpcHandlerModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);
3070     if (Sprint (p_Fm->fmIpcHandlerModuleName[0], "FM_%d_%d",p_Fm->p_FmStateStruct->fmId, NCSW_MASTER_ID) != 6)
3071         RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
3072 
3073     for (i=0;i<e_FM_EV_DUMMY_LAST;i++)
3074         p_Fm->intrMng[i].f_Isr = UnimplementedIsr;
3075 
3076     p_Fm->h_IpcSessions[0] = XX_IpcInitSession(p_Fm->fmIpcHandlerModuleName[0], p_Fm->fmModuleName);
3077     if (p_Fm->h_IpcSessions[0])
3078     {
3079         uint8_t                 isMasterAlive;
3080         t_FmIpcParams           ipcParams;
3081 
3082         err = XX_IpcRegisterMsgHandler(p_Fm->fmModuleName, FmGuestHandleIpcMsgCB, p_Fm, FM_IPC_MAX_REPLY_SIZE);
3083         if (err)
3084             RETURN_ERROR(MAJOR, err, NO_MSG);
3085 
3086         memset(&msg, 0, sizeof(msg));
3087         memset(&reply, 0, sizeof(reply));
3088         msg.msgId = FM_MASTER_IS_ALIVE;
3089         msg.msgBody[0] = p_Fm->guestId;
3090         replyLength = sizeof(uint32_t) + sizeof(uint8_t);
3091         do
3092         {
3093             blockingFlag = TRUE;
3094             if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
3095                                          (uint8_t*)&msg,
3096                                          sizeof(msg.msgId)+sizeof(p_Fm->guestId),
3097                                          (uint8_t*)&reply,
3098                                          &replyLength,
3099                                          IpcMsgCompletionCB,
3100                                          p_Fm)) != E_OK)
3101                 REPORT_ERROR(MINOR, err, NO_MSG);
3102             while (blockingFlag) ;
3103             if (replyLength != (sizeof(uint32_t) + sizeof(uint8_t)))
3104                 REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
3105             isMasterAlive = *(uint8_t*)(reply.replyBody);
3106         } while (!isMasterAlive);
3107 
3108         /* read FM parameters and save */
3109         memset(&msg, 0, sizeof(msg));
3110         memset(&reply, 0, sizeof(reply));
3111         msg.msgId = FM_GET_PARAMS;
3112         replyLength = sizeof(uint32_t) + sizeof(t_FmIpcParams);
3113         if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
3114                                      (uint8_t*)&msg,
3115                                      sizeof(msg.msgId),
3116                                      (uint8_t*)&reply,
3117                                      &replyLength,
3118                                      NULL,
3119                                      NULL)) != E_OK)
3120             RETURN_ERROR(MAJOR, err, NO_MSG);
3121         if (replyLength != (sizeof(uint32_t) + sizeof(t_FmIpcParams)))
3122             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
3123         memcpy((uint8_t*)&ipcParams, reply.replyBody, sizeof(t_FmIpcParams));
3124 
3125         p_Fm->p_FmStateStruct->fmClkFreq = ipcParams.fmClkFreq;
3126         p_Fm->p_FmStateStruct->fmMacClkFreq = ipcParams.fmMacClkFreq;
3127         p_Fm->p_FmStateStruct->revInfo.majorRev = ipcParams.majorRev;
3128         p_Fm->p_FmStateStruct->revInfo.minorRev = ipcParams.minorRev;
3129     }
3130     else
3131     {
3132         DBG(WARNING, ("FM Guest mode - without IPC"));
3133         if (!p_Fm->p_FmStateStruct->fmClkFreq)
3134             RETURN_ERROR(MAJOR, E_INVALID_STATE, ("No fmClkFreq configured for guest without IPC"));
3135         if (p_Fm->baseAddr)
3136         {
3137             fman_get_revision(p_Fm->p_FmFpmRegs,
3138                               &p_Fm->p_FmStateStruct->revInfo.majorRev,
3139                               &p_Fm->p_FmStateStruct->revInfo.minorRev);
3140 
3141         }
3142     }
3143 
3144 #if (DPAA_VERSION >= 11)
3145     p_Fm->partVSPBase = AllocVSPsForPartition(p_Fm, p_Fm->partVSPBase, p_Fm->partNumOfVSPs, p_Fm->guestId);
3146     if (p_Fm->partVSPBase == (uint8_t)(ILLEGAL_BASE))
3147         DBG(WARNING, ("partition VSPs allocation is FAILED"));
3148 #endif /* (DPAA_VERSION >= 11) */
3149 
3150     /* General FM driver initialization */
3151     if (p_Fm->baseAddr)
3152         p_Fm->fmMuramPhysBaseAddr =
3153             (uint64_t)(XX_VirtToPhys(UINT_TO_PTR(p_Fm->baseAddr + FM_MM_MURAM)));
3154 
3155     XX_Free(p_Fm->p_FmDriverParam);
3156     p_Fm->p_FmDriverParam = NULL;
3157 
3158     if ((p_Fm->guestId == NCSW_MASTER_ID) ||
3159         (p_Fm->h_IpcSessions[0]))
3160     {
3161         FM_DisableRamsEcc(p_Fm);
3162         FmMuramClear(p_Fm->h_FmMuram);
3163         FM_EnableRamsEcc(p_Fm);
3164     }
3165 
3166     return E_OK;
3167 }
3168 
3169 static __inline__ enum fman_exceptions FmanExceptionTrans(e_FmExceptions exception)
3170 {
3171     switch (exception) {
3172             case  e_FM_EX_DMA_BUS_ERROR:
3173                 return E_FMAN_EX_DMA_BUS_ERROR;
3174             case  e_FM_EX_DMA_READ_ECC:
3175                 return E_FMAN_EX_DMA_READ_ECC;
3176             case  e_FM_EX_DMA_SYSTEM_WRITE_ECC:
3177                 return E_FMAN_EX_DMA_SYSTEM_WRITE_ECC;
3178             case  e_FM_EX_DMA_FM_WRITE_ECC:
3179                 return E_FMAN_EX_DMA_FM_WRITE_ECC;
3180             case  e_FM_EX_FPM_STALL_ON_TASKS:
3181                 return E_FMAN_EX_FPM_STALL_ON_TASKS;
3182             case  e_FM_EX_FPM_SINGLE_ECC:
3183                 return E_FMAN_EX_FPM_SINGLE_ECC;
3184             case  e_FM_EX_FPM_DOUBLE_ECC:
3185                 return E_FMAN_EX_FPM_DOUBLE_ECC;
3186             case  e_FM_EX_QMI_SINGLE_ECC:
3187                 return E_FMAN_EX_QMI_SINGLE_ECC;
3188             case  e_FM_EX_QMI_DOUBLE_ECC:
3189                 return E_FMAN_EX_QMI_DOUBLE_ECC;
3190             case  e_FM_EX_QMI_DEQ_FROM_UNKNOWN_PORTID:
3191                 return E_FMAN_EX_QMI_DEQ_FROM_UNKNOWN_PORTID;
3192             case  e_FM_EX_BMI_LIST_RAM_ECC:
3193                 return E_FMAN_EX_BMI_LIST_RAM_ECC;
3194             case  e_FM_EX_BMI_STORAGE_PROFILE_ECC:
3195                 return E_FMAN_EX_BMI_STORAGE_PROFILE_ECC;
3196             case  e_FM_EX_BMI_STATISTICS_RAM_ECC:
3197                 return E_FMAN_EX_BMI_STATISTICS_RAM_ECC;
3198             case  e_FM_EX_BMI_DISPATCH_RAM_ECC:
3199                 return E_FMAN_EX_BMI_DISPATCH_RAM_ECC;
3200             case  e_FM_EX_IRAM_ECC:
3201                 return E_FMAN_EX_IRAM_ECC;
3202             case  e_FM_EX_MURAM_ECC:
3203                 return E_FMAN_EX_MURAM_ECC;
3204             default:
3205                 return E_FMAN_EX_DMA_BUS_ERROR;
3206         }
3207 }
3208 
3209 uint8_t SwPortIdToHwPortId(e_FmPortType type, uint8_t relativePortId, uint8_t majorRev, uint8_t minorRev)
3210 {
3211 	switch (type)
3212 	{
3213 		case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):
3214 		case (e_FM_PORT_TYPE_OH_HOST_COMMAND):
3215 			CHECK_PORT_ID_OH_PORTS(relativePortId);
3216 			return (uint8_t)(BASE_OH_PORTID + (relativePortId));
3217 		case (e_FM_PORT_TYPE_RX):
3218 			CHECK_PORT_ID_1G_RX_PORTS(relativePortId);
3219 			return (uint8_t)(BASE_1G_RX_PORTID + (relativePortId));
3220 		case (e_FM_PORT_TYPE_RX_10G):
3221                        /* The 10G port in T1024 (FMan Version 6.4) is the first port.
3222                         * This is the reason why the 1G port offset is used.
3223                         */
3224                        if (majorRev == 6 && minorRev == 4)
3225                        {
3226                                CHECK_PORT_ID_1G_RX_PORTS(relativePortId);
3227                                return (uint8_t)(BASE_1G_RX_PORTID + (relativePortId));
3228                        }
3229                        else
3230                        {
3231                                CHECK_PORT_ID_10G_RX_PORTS(relativePortId);
3232                                return (uint8_t)(BASE_10G_RX_PORTID + (relativePortId));
3233                        }
3234 		case (e_FM_PORT_TYPE_TX):
3235 			CHECK_PORT_ID_1G_TX_PORTS(relativePortId);
3236 			return (uint8_t)(BASE_1G_TX_PORTID + (relativePortId));
3237 		case (e_FM_PORT_TYPE_TX_10G):
3238                        /* The 10G port in T1024 (FMan Version 6.4) is the first port.
3239                         * This is the reason why the 1G port offset is used.
3240                         */
3241                        if (majorRev == 6 && minorRev == 4)
3242                        {
3243                                CHECK_PORT_ID_1G_TX_PORTS(relativePortId);
3244                                return (uint8_t)(BASE_1G_TX_PORTID + (relativePortId));
3245                        }
3246                        else
3247                        {
3248                                CHECK_PORT_ID_10G_TX_PORTS(relativePortId);
3249                                return (uint8_t)(BASE_10G_TX_PORTID + (relativePortId));
3250                        }
3251 		default:
3252 			REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal port type"));
3253 			return 0;
3254 	}
3255 }
3256 
3257 #if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
3258 t_Error FmDumpPortRegs (t_Handle h_Fm, uint8_t hardwarePortId)
3259 {
3260     t_Fm            *p_Fm = (t_Fm *)h_Fm;
3261 
3262     DECLARE_DUMP;
3263 
3264     ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));
3265 
3266     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3267     SANITY_CHECK_RETURN_ERROR(((p_Fm->guestId == NCSW_MASTER_ID) ||
3268                                p_Fm->baseAddr), E_INVALID_OPERATION);
3269 
3270     DUMP_TITLE(&p_Fm->p_FmBmiRegs->fmbm_pp[hardwarePortId-1], ("fmbm_pp for port %u", (hardwarePortId)));
3271     DUMP_MEMORY(&p_Fm->p_FmBmiRegs->fmbm_pp[hardwarePortId-1], sizeof(uint32_t));
3272 
3273     DUMP_TITLE(&p_Fm->p_FmBmiRegs->fmbm_pfs[hardwarePortId-1], ("fmbm_pfs for port %u", (hardwarePortId )));
3274     DUMP_MEMORY(&p_Fm->p_FmBmiRegs->fmbm_pfs[hardwarePortId-1], sizeof(uint32_t));
3275 
3276     DUMP_TITLE(&p_Fm->p_FmBmiRegs->fmbm_spliodn[hardwarePortId-1], ("fmbm_spliodn for port %u", (hardwarePortId)));
3277     DUMP_MEMORY(&p_Fm->p_FmBmiRegs->fmbm_spliodn[hardwarePortId-1], sizeof(uint32_t));
3278 
3279     DUMP_TITLE(&p_Fm->p_FmFpmRegs->fmfp_ps[hardwarePortId], ("fmfp_ps for port %u", (hardwarePortId)));
3280     DUMP_MEMORY(&p_Fm->p_FmFpmRegs->fmfp_ps[hardwarePortId], sizeof(uint32_t));
3281 
3282     DUMP_TITLE(&p_Fm->p_FmDmaRegs->fmdmplr[hardwarePortId/2], ("fmdmplr for port %u", (hardwarePortId)));
3283     DUMP_MEMORY(&p_Fm->p_FmDmaRegs->fmdmplr[hardwarePortId/2], sizeof(uint32_t));
3284 
3285     return E_OK;
3286 }
3287 #endif /* (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)) */
3288 
3289 
3290 /*****************************************************************************/
3291 /*                      API Init unit functions                              */
3292 /*****************************************************************************/
3293 t_Handle FM_Config(t_FmParams *p_FmParam)
3294 {
3295     t_Fm                *p_Fm;
3296     uint8_t             i;
3297     uintptr_t           baseAddr;
3298 
3299     SANITY_CHECK_RETURN_VALUE(p_FmParam, E_NULL_POINTER, NULL);
3300     SANITY_CHECK_RETURN_VALUE(((p_FmParam->firmware.p_Code && p_FmParam->firmware.size) ||
3301                                (!p_FmParam->firmware.p_Code && !p_FmParam->firmware.size)),
3302                               E_INVALID_VALUE, NULL);
3303 
3304     baseAddr = p_FmParam->baseAddr;
3305 
3306     /* Allocate FM structure */
3307     p_Fm = (t_Fm *) XX_Malloc(sizeof(t_Fm));
3308     if (!p_Fm)
3309     {
3310         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM driver structure"));
3311         return NULL;
3312     }
3313     memset(p_Fm, 0, sizeof(t_Fm));
3314 
3315     p_Fm->p_FmStateStruct = (t_FmStateStruct *) XX_Malloc(sizeof(t_FmStateStruct));
3316     if (!p_Fm->p_FmStateStruct)
3317     {
3318         XX_Free(p_Fm);
3319         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Status structure"));
3320         return NULL;
3321     }
3322     memset(p_Fm->p_FmStateStruct, 0, sizeof(t_FmStateStruct));
3323 
3324     /* Initialize FM parameters which will be kept by the driver */
3325     p_Fm->p_FmStateStruct->fmId = p_FmParam->fmId;
3326     p_Fm->guestId               = p_FmParam->guestId;
3327 
3328     for (i=0; i<FM_MAX_NUM_OF_HW_PORT_IDS; i++)
3329         p_Fm->p_FmStateStruct->portsTypes[i] = e_FM_PORT_TYPE_DUMMY;
3330 
3331     /* Allocate the FM driver's parameters structure */
3332     p_Fm->p_FmDriverParam = (struct fman_cfg *)XX_Malloc(sizeof(struct fman_cfg));
3333     if (!p_Fm->p_FmDriverParam)
3334     {
3335         XX_Free(p_Fm->p_FmStateStruct);
3336         XX_Free(p_Fm);
3337         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM driver parameters"));
3338         return NULL;
3339     }
3340     memset(p_Fm->p_FmDriverParam, 0, sizeof(struct fman_cfg));
3341 
3342 #if (DPAA_VERSION >= 11)
3343     p_Fm->p_FmSp = (t_FmSp *)XX_Malloc(sizeof(t_FmSp));
3344     if (!p_Fm->p_FmSp)
3345     {
3346         XX_Free(p_Fm->p_FmDriverParam);
3347         XX_Free(p_Fm->p_FmStateStruct);
3348         XX_Free(p_Fm);
3349         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("allocation for internal data structure failed"));
3350         return NULL;
3351     }
3352     memset(p_Fm->p_FmSp, 0, sizeof(t_FmSp));
3353 
3354     for (i=0; i<FM_VSP_MAX_NUM_OF_ENTRIES; i++)
3355         p_Fm->p_FmSp->profiles[i].profilesMng.ownerId = (uint8_t)ILLEGAL_BASE;
3356 #endif /* (DPAA_VERSION >= 11) */
3357 
3358     /* Initialize FM parameters which will be kept by the driver */
3359     p_Fm->p_FmStateStruct->fmId                 = p_FmParam->fmId;
3360     p_Fm->h_FmMuram                             = p_FmParam->h_FmMuram;
3361     p_Fm->h_App                                 = p_FmParam->h_App;
3362     p_Fm->p_FmStateStruct->fmClkFreq            = p_FmParam->fmClkFreq;
3363     p_Fm->p_FmStateStruct->fmMacClkFreq         = p_FmParam->fmClkFreq / ((!p_FmParam->fmMacClkRatio)? 2: p_FmParam->fmMacClkRatio);
3364     p_Fm->f_Exception                           = p_FmParam->f_Exception;
3365     p_Fm->f_BusError                            = p_FmParam->f_BusError;
3366     p_Fm->p_FmFpmRegs = (struct fman_fpm_regs *)UINT_TO_PTR(baseAddr + FM_MM_FPM);
3367     p_Fm->p_FmBmiRegs = (struct fman_bmi_regs *)UINT_TO_PTR(baseAddr + FM_MM_BMI);
3368     p_Fm->p_FmQmiRegs = (struct fman_qmi_regs *)UINT_TO_PTR(baseAddr + FM_MM_QMI);
3369     p_Fm->p_FmDmaRegs = (struct fman_dma_regs *)UINT_TO_PTR(baseAddr + FM_MM_DMA);
3370     p_Fm->p_FmRegs       = (struct fman_regs *)UINT_TO_PTR(baseAddr + FM_MM_BMI);
3371     p_Fm->baseAddr                              = baseAddr;
3372     p_Fm->p_FmStateStruct->irq                  = p_FmParam->irq;
3373     p_Fm->p_FmStateStruct->errIrq               = p_FmParam->errIrq;
3374     p_Fm->hcPortInitialized                     = FALSE;
3375     p_Fm->independentMode                       = FALSE;
3376 
3377     p_Fm->h_Spinlock = XX_InitSpinlock();
3378     if (!p_Fm->h_Spinlock)
3379     {
3380         XX_Free(p_Fm->p_FmDriverParam);
3381         XX_Free(p_Fm->p_FmStateStruct);
3382         XX_Free(p_Fm);
3383         REPORT_ERROR(MAJOR, E_INVALID_STATE, ("can't allocate spinlock!"));
3384         return NULL;
3385     }
3386 
3387 #if (DPAA_VERSION >= 11)
3388     p_Fm->partVSPBase   = p_FmParam->partVSPBase;
3389     p_Fm->partNumOfVSPs = p_FmParam->partNumOfVSPs;
3390     p_Fm->vspBaseAddr = p_FmParam->vspBaseAddr;
3391 #endif /* (DPAA_VERSION >= 11) */
3392 
3393     fman_defconfig(p_Fm->p_FmDriverParam,
3394                   !!(p_Fm->guestId == NCSW_MASTER_ID));
3395 /* overide macros dependent parameters */
3396 #ifdef FM_PEDANTIC_DMA
3397     p_Fm->p_FmDriverParam->pedantic_dma = TRUE;
3398     p_Fm->p_FmDriverParam->dma_aid_override = TRUE;
3399 #endif /* FM_PEDANTIC_DMA */
3400 #ifndef FM_QMI_NO_DEQ_OPTIONS_SUPPORT
3401     p_Fm->p_FmDriverParam->qmi_deq_option_support = TRUE;
3402 #endif /* !FM_QMI_NO_DEQ_OPTIONS_SUPPORT */
3403 
3404     p_Fm->p_FmStateStruct->ramsEccEnable        = FALSE;
3405     p_Fm->p_FmStateStruct->extraFifoPoolSize    = 0;
3406     p_Fm->p_FmStateStruct->exceptions           = DEFAULT_exceptions;
3407     p_Fm->resetOnInit                          = DEFAULT_resetOnInit;
3408     p_Fm->f_ResetOnInitOverride                = DEFAULT_resetOnInitOverrideCallback;
3409     p_Fm->fwVerify                             = DEFAULT_VerifyUcode;
3410     p_Fm->firmware.size                        = p_FmParam->firmware.size;
3411     if (p_Fm->firmware.size)
3412     {
3413         p_Fm->firmware.p_Code = (uint32_t *)XX_Malloc(p_Fm->firmware.size);
3414         if (!p_Fm->firmware.p_Code)
3415         {
3416             XX_FreeSpinlock(p_Fm->h_Spinlock);
3417             XX_Free(p_Fm->p_FmStateStruct);
3418             XX_Free(p_Fm->p_FmDriverParam);
3419             XX_Free(p_Fm);
3420             REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM firmware code"));
3421             return NULL;
3422         }
3423         memcpy(p_Fm->firmware.p_Code, p_FmParam->firmware.p_Code ,p_Fm->firmware.size);
3424     }
3425 
3426     if (p_Fm->guestId != NCSW_MASTER_ID)
3427         return p_Fm;
3428 
3429     /* read revision */
3430     /* Chip dependent, will be configured in Init */
3431     fman_get_revision(p_Fm->p_FmFpmRegs,
3432                       &p_Fm->p_FmStateStruct->revInfo.majorRev,
3433                       &p_Fm->p_FmStateStruct->revInfo.minorRev);
3434 
3435 #ifdef FM_AID_MODE_NO_TNUM_SW005
3436     if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)
3437         p_Fm->p_FmDriverParam->dma_aid_mode = e_FM_DMA_AID_OUT_PORT_ID;
3438 #endif /* FM_AID_MODE_NO_TNUM_SW005 */
3439 #ifndef FM_QMI_NO_DEQ_OPTIONS_SUPPORT
3440    if (p_Fm->p_FmStateStruct->revInfo.majorRev != 4)
3441         p_Fm->p_FmDriverParam->qmi_def_tnums_thresh = QMI_DEF_TNUMS_THRESH;
3442 #endif /* FM_QMI_NO_DEQ_OPTIONS_SUPPORT */
3443 
3444         p_Fm->p_FmStateStruct->totalFifoSize        = 0;
3445         p_Fm->p_FmStateStruct->totalNumOfTasks      =
3446             DEFAULT_totalNumOfTasks(p_Fm->p_FmStateStruct->revInfo.majorRev,
3447                                     p_Fm->p_FmStateStruct->revInfo.minorRev);
3448 
3449 #ifdef FM_HAS_TOTAL_DMAS
3450         p_Fm->p_FmStateStruct->maxNumOfOpenDmas     = BMI_MAX_NUM_OF_DMAS;
3451 #endif /* FM_HAS_TOTAL_DMAS */
3452 #if (DPAA_VERSION < 11)
3453         p_Fm->p_FmDriverParam->dma_comm_qtsh_clr_emer        = DEFAULT_dmaCommQLow;
3454         p_Fm->p_FmDriverParam->dma_comm_qtsh_asrt_emer       = DEFAULT_dmaCommQHigh;
3455         p_Fm->p_FmDriverParam->dma_cam_num_of_entries        = DEFAULT_dmaCamNumOfEntries;
3456         p_Fm->p_FmDriverParam->dma_read_buf_tsh_clr_emer      = DEFAULT_dmaReadIntBufLow;
3457         p_Fm->p_FmDriverParam->dma_read_buf_tsh_asrt_emer     = DEFAULT_dmaReadIntBufHigh;
3458         p_Fm->p_FmDriverParam->dma_write_buf_tsh_clr_emer     = DEFAULT_dmaWriteIntBufLow;
3459         p_Fm->p_FmDriverParam->dma_write_buf_tsh_asrt_emer    = DEFAULT_dmaWriteIntBufHigh;
3460         p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats       = DEFAULT_axiDbgNumOfBeats;
3461 #endif /* (DPAA_VERSION < 11) */
3462 #ifdef FM_NO_TNUM_AGING
3463     p_Fm->p_FmDriverParam->tnum_aging_period = 0;
3464 #endif
3465     p_Fm->tnumAgingPeriod = p_Fm->p_FmDriverParam->tnum_aging_period;
3466 
3467    return p_Fm;
3468 }
3469 
3470 /**************************************************************************//**
3471  @Function      FM_Init
3472 
3473  @Description   Initializes the FM module
3474 
3475  @Param[in]     h_Fm - FM module descriptor
3476 
3477  @Return        E_OK on success; Error code otherwise.
3478 *//***************************************************************************/
3479 t_Error FM_Init(t_Handle h_Fm)
3480 {
3481     t_Fm                    *p_Fm = (t_Fm*)h_Fm;
3482     struct fman_cfg         *p_FmDriverParam = NULL;
3483     t_Error                 err = E_OK;
3484     int                     i;
3485     t_FmRevisionInfo        revInfo;
3486     struct fman_rg          fman_rg;
3487 
3488     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3489     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3490 
3491     fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;
3492     fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;
3493     fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;
3494     fman_rg.dma_rg = p_Fm->p_FmDmaRegs;
3495 
3496     p_Fm->p_FmStateStruct->count1MicroBit = FM_TIMESTAMP_1_USEC_BIT;
3497     p_Fm->p_FmDriverParam->num_of_fman_ctrl_evnt_regs = FM_NUM_OF_FMAN_CTRL_EVENT_REGS;
3498 
3499     if (p_Fm->guestId != NCSW_MASTER_ID)
3500         return InitGuestMode(p_Fm);
3501 
3502     /* if user didn't configured totalFifoSize - (totalFifoSize=0) we configure default
3503     * according to chip. otherwise, we use user's configuration.
3504     */
3505     if (p_Fm->p_FmStateStruct->totalFifoSize == 0)
3506         p_Fm->p_FmStateStruct->totalFifoSize = DEFAULT_totalFifoSize(p_Fm->p_FmStateStruct->revInfo.majorRev,
3507                                                                      p_Fm->p_FmStateStruct->revInfo.minorRev);
3508 
3509     CHECK_INIT_PARAMETERS(p_Fm, CheckFmParameters);
3510 
3511     p_FmDriverParam = p_Fm->p_FmDriverParam;
3512 
3513     FM_GetRevision(p_Fm, &revInfo);
3514 
3515     /* clear revision-dependent non existing exception */
3516 #ifdef FM_NO_DISPATCH_RAM_ECC
3517     if ((revInfo.majorRev != 4) &&
3518         (revInfo.majorRev < 6))
3519         p_Fm->p_FmStateStruct->exceptions &= ~FM_EX_BMI_DISPATCH_RAM_ECC;
3520 #endif /* FM_NO_DISPATCH_RAM_ECC */
3521 
3522 #ifdef FM_QMI_NO_ECC_EXCEPTIONS
3523     if (revInfo.majorRev == 4)
3524         p_Fm->p_FmStateStruct->exceptions &= ~(FM_EX_QMI_SINGLE_ECC | FM_EX_QMI_DOUBLE_ECC);
3525 #endif /* FM_QMI_NO_ECC_EXCEPTIONS */
3526 
3527 #ifdef FM_QMI_NO_SINGLE_ECC_EXCEPTION
3528     if (revInfo.majorRev >= 6)
3529        p_Fm->p_FmStateStruct->exceptions &= ~FM_EX_QMI_SINGLE_ECC;
3530 #endif /* FM_QMI_NO_SINGLE_ECC_EXCEPTION */
3531 
3532     FmMuramClear(p_Fm->h_FmMuram);
3533 
3534     /* clear CPG */
3535     IOMemSet32(UINT_TO_PTR(p_Fm->baseAddr + FM_MM_CGP), 0, FM_PORT_NUM_OF_CONGESTION_GRPS);
3536 
3537     /* add to the default exceptions the user's definitions */
3538     p_Fm->p_FmStateStruct->exceptions |= p_Fm->userSetExceptions;
3539 
3540     /* Reset the FM if required */
3541     if (p_Fm->resetOnInit)
3542     {
3543 #ifdef FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173
3544         if ((err = FwNotResetErratumBugzilla6173WA(p_Fm)) != E_OK)
3545             RETURN_ERROR(MAJOR, err, NO_MSG);
3546 #else  /* not FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */
3547 
3548         if (p_Fm->f_ResetOnInitOverride)
3549         {
3550         	/* Perform user specific FMan reset */
3551         	p_Fm->f_ResetOnInitOverride(h_Fm);
3552         }
3553         else
3554         {
3555         	/* Perform FMan reset */
3556         	FmReset(h_Fm);
3557         }
3558 
3559         if (fman_is_qmi_halt_not_busy_state(p_Fm->p_FmQmiRegs))
3560         {
3561             fman_resume(p_Fm->p_FmFpmRegs);
3562             XX_UDelay(100);
3563         }
3564 #endif /* not FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */
3565     }
3566 
3567 #ifdef FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173
3568     if (!p_Fm->resetOnInit) /* Skip operations done in errata workaround */
3569     {
3570 #endif /* FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */
3571     /* Load FMan-Controller code to IRAM */
3572 
3573     ClearIRam(p_Fm);
3574 
3575     if (p_Fm->firmware.p_Code && (LoadFmanCtrlCode(p_Fm) != E_OK))
3576         RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
3577 #ifdef FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173
3578     }
3579 #endif /* FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */
3580 
3581 #ifdef FM_CAPWAP_SUPPORT
3582     /* save first 256 byte in MURAM */
3583     p_Fm->resAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_Fm->h_FmMuram, 256, 0));
3584     if (!p_Fm->resAddr)
3585         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for reserved Area failed"));
3586 
3587     WRITE_BLOCK(UINT_TO_PTR(p_Fm->resAddr), 0, 256);
3588 #endif /* FM_CAPWAP_SUPPORT */
3589 
3590 #if (DPAA_VERSION >= 11)
3591     p_Fm->partVSPBase = AllocVSPsForPartition(h_Fm, p_Fm->partVSPBase, p_Fm->partNumOfVSPs, p_Fm->guestId);
3592     if (p_Fm->partVSPBase == (uint8_t)(ILLEGAL_BASE))
3593         DBG(WARNING, ("partition VSPs allocation is FAILED"));
3594 #endif /* (DPAA_VERSION >= 11) */
3595 
3596     /* General FM driver initialization */
3597     p_Fm->fmMuramPhysBaseAddr =
3598         (uint64_t)(XX_VirtToPhys(UINT_TO_PTR(p_Fm->baseAddr + FM_MM_MURAM)));
3599 
3600     for (i=0;i<e_FM_EV_DUMMY_LAST;i++)
3601         p_Fm->intrMng[i].f_Isr = UnimplementedIsr;
3602     for (i=0;i<FM_NUM_OF_FMAN_CTRL_EVENT_REGS;i++)
3603         p_Fm->fmanCtrlIntr[i].f_Isr = UnimplementedFmanCtrlIsr;
3604 
3605     p_FmDriverParam->exceptions = p_Fm->p_FmStateStruct->exceptions;
3606 
3607     /**********************/
3608     /* Init DMA Registers */
3609     /**********************/
3610     err = InitFmDma(p_Fm);
3611     if (err != E_OK)
3612     {
3613         FreeInitResources(p_Fm);
3614         RETURN_ERROR(MAJOR, err, NO_MSG);
3615     }
3616 
3617     /**********************/
3618     /* Init FPM Registers */
3619     /**********************/
3620     err = InitFmFpm(p_Fm);
3621     if (err != E_OK)
3622     {
3623         FreeInitResources(p_Fm);
3624         RETURN_ERROR(MAJOR, err, NO_MSG);
3625     }
3626 
3627     /* define common resources */
3628     /* allocate MURAM for FIFO according to total size */
3629     p_Fm->fifoBaseAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_Fm->h_FmMuram,
3630                                                        p_Fm->p_FmStateStruct->totalFifoSize,
3631                                                        BMI_FIFO_ALIGN));
3632     if (!p_Fm->fifoBaseAddr)
3633     {
3634         FreeInitResources(p_Fm);
3635         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for BMI FIFO failed"));
3636     }
3637 
3638     p_FmDriverParam->fifo_base_addr = (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_Fm->fifoBaseAddr)) - p_Fm->fmMuramPhysBaseAddr);
3639     p_FmDriverParam->total_fifo_size = p_Fm->p_FmStateStruct->totalFifoSize;
3640     p_FmDriverParam->total_num_of_tasks = p_Fm->p_FmStateStruct->totalNumOfTasks;
3641     p_FmDriverParam->clk_freq = p_Fm->p_FmStateStruct->fmClkFreq;
3642 
3643     /**********************/
3644     /* Init BMI Registers */
3645     /**********************/
3646     err = InitFmBmi(p_Fm);
3647     if (err != E_OK)
3648     {
3649         FreeInitResources(p_Fm);
3650         RETURN_ERROR(MAJOR, err, NO_MSG);
3651     }
3652 
3653     /**********************/
3654     /* Init QMI Registers */
3655     /**********************/
3656     err = InitFmQmi(p_Fm);
3657     if (err != E_OK)
3658     {
3659         FreeInitResources(p_Fm);
3660         RETURN_ERROR(MAJOR, err, NO_MSG);
3661     }
3662 
3663     /* build the FM master partition IPC address */
3664     if (Sprint (p_Fm->fmModuleName, "FM_%d_%d",p_Fm->p_FmStateStruct->fmId, NCSW_MASTER_ID) != 6)
3665     {
3666         FreeInitResources(p_Fm);
3667         RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
3668     }
3669 
3670     err = XX_IpcRegisterMsgHandler(p_Fm->fmModuleName, FmHandleIpcMsgCB, p_Fm, FM_IPC_MAX_REPLY_SIZE);
3671     if (err)
3672     {
3673         FreeInitResources(p_Fm);
3674         RETURN_ERROR(MAJOR, err, NO_MSG);
3675     }
3676 
3677     /* Register the FM interrupts handlers */
3678     if (p_Fm->p_FmStateStruct->irq != NO_IRQ)
3679     {
3680         XX_SetIntr(p_Fm->p_FmStateStruct->irq, FM_EventIsr, p_Fm);
3681         XX_EnableIntr(p_Fm->p_FmStateStruct->irq);
3682     }
3683 
3684     if (p_Fm->p_FmStateStruct->errIrq != NO_IRQ)
3685     {
3686         XX_SetIntr(p_Fm->p_FmStateStruct->errIrq, (void (*) (t_Handle))FM_ErrorIsr, p_Fm);
3687         XX_EnableIntr(p_Fm->p_FmStateStruct->errIrq);
3688     }
3689 
3690     err = (t_Error)fman_enable(&fman_rg , p_FmDriverParam);
3691     if (err != E_OK)
3692         return err; /* FIXME */
3693 
3694     EnableTimeStamp(p_Fm);
3695 
3696     if (p_Fm->firmware.p_Code)
3697     {
3698         XX_Free(p_Fm->firmware.p_Code);
3699         p_Fm->firmware.p_Code = NULL;
3700     }
3701 
3702     XX_Free(p_Fm->p_FmDriverParam);
3703     p_Fm->p_FmDriverParam = NULL;
3704 
3705     return E_OK;
3706 }
3707 
3708 /**************************************************************************//**
3709  @Function      FM_Free
3710 
3711  @Description   Frees all resources that were assigned to FM module.
3712 
3713                 Calling this routine invalidates the descriptor.
3714 
3715  @Param[in]     h_Fm - FM module descriptor
3716 
3717  @Return        E_OK on success; Error code otherwise.
3718 *//***************************************************************************/
3719 t_Error FM_Free(t_Handle h_Fm)
3720 {
3721     t_Fm    *p_Fm = (t_Fm*)h_Fm;
3722     struct fman_rg          fman_rg;
3723 
3724     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3725 
3726     fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;
3727     fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;
3728     fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;
3729     fman_rg.dma_rg = p_Fm->p_FmDmaRegs;
3730 
3731     if (p_Fm->guestId != NCSW_MASTER_ID)
3732     {
3733 #if (DPAA_VERSION >= 11)
3734         FreeVSPsForPartition(h_Fm, p_Fm->partVSPBase, p_Fm->partNumOfVSPs, p_Fm->guestId);
3735 
3736         if (p_Fm->p_FmSp)
3737         {
3738             XX_Free(p_Fm->p_FmSp);
3739             p_Fm->p_FmSp = NULL;
3740         }
3741 #endif /* (DPAA_VERSION >= 11) */
3742 
3743         if (p_Fm->fmModuleName[0] != 0)
3744             XX_IpcUnregisterMsgHandler(p_Fm->fmModuleName);
3745 
3746         if (!p_Fm->recoveryMode)
3747             XX_Free(p_Fm->p_FmStateStruct);
3748 
3749         XX_Free(p_Fm);
3750 
3751         return E_OK;
3752     }
3753 
3754     fman_free_resources(&fman_rg);
3755 
3756     if ((p_Fm->guestId == NCSW_MASTER_ID) && (p_Fm->fmModuleName[0] != 0))
3757         XX_IpcUnregisterMsgHandler(p_Fm->fmModuleName);
3758 
3759     if (p_Fm->p_FmStateStruct)
3760     {
3761         if (p_Fm->p_FmStateStruct->irq != NO_IRQ)
3762         {
3763             XX_DisableIntr(p_Fm->p_FmStateStruct->irq);
3764             XX_FreeIntr(p_Fm->p_FmStateStruct->irq);
3765         }
3766         if (p_Fm->p_FmStateStruct->errIrq != NO_IRQ)
3767         {
3768             XX_DisableIntr(p_Fm->p_FmStateStruct->errIrq);
3769             XX_FreeIntr(p_Fm->p_FmStateStruct->errIrq);
3770         }
3771     }
3772 
3773 #if (DPAA_VERSION >= 11)
3774     FreeVSPsForPartition(h_Fm, p_Fm->partVSPBase, p_Fm->partNumOfVSPs, p_Fm->guestId);
3775 
3776     if (p_Fm->p_FmSp)
3777     {
3778         XX_Free(p_Fm->p_FmSp);
3779         p_Fm->p_FmSp = NULL;
3780     }
3781 #endif /* (DPAA_VERSION >= 11) */
3782 
3783     if (p_Fm->h_Spinlock)
3784         XX_FreeSpinlock(p_Fm->h_Spinlock);
3785 
3786     if (p_Fm->p_FmDriverParam)
3787     {
3788         if (p_Fm->firmware.p_Code)
3789             XX_Free(p_Fm->firmware.p_Code);
3790         XX_Free(p_Fm->p_FmDriverParam);
3791         p_Fm->p_FmDriverParam = NULL;
3792     }
3793 
3794     FreeInitResources(p_Fm);
3795 
3796     if (!p_Fm->recoveryMode && p_Fm->p_FmStateStruct)
3797         XX_Free(p_Fm->p_FmStateStruct);
3798 
3799     XX_Free(p_Fm);
3800 
3801     return E_OK;
3802 }
3803 
3804 /*************************************************/
3805 /*       API Advanced Init unit functions        */
3806 /*************************************************/
3807 
3808 t_Error FM_ConfigResetOnInit(t_Handle h_Fm, bool enable)
3809 {
3810     t_Fm *p_Fm = (t_Fm*)h_Fm;
3811 
3812     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3813     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3814     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
3815 
3816     p_Fm->resetOnInit = enable;
3817 
3818     return E_OK;
3819 }
3820 
3821 t_Error FM_ConfigResetOnInitOverrideCallback(t_Handle h_Fm, t_FmResetOnInitOverrideCallback *f_ResetOnInitOverride)
3822 {
3823     t_Fm *p_Fm = (t_Fm*)h_Fm;
3824 
3825     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3826     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3827     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
3828 
3829     p_Fm->f_ResetOnInitOverride = f_ResetOnInitOverride;
3830 
3831     return E_OK;
3832 }
3833 
3834 t_Error FM_ConfigTotalFifoSize(t_Handle h_Fm, uint32_t totalFifoSize)
3835 {
3836     t_Fm *p_Fm = (t_Fm*)h_Fm;
3837 
3838     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3839     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3840     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
3841 
3842     p_Fm->p_FmStateStruct->totalFifoSize = totalFifoSize;
3843 
3844     return E_OK;
3845 }
3846 
3847 t_Error FM_ConfigDmaCacheOverride(t_Handle h_Fm, e_FmDmaCacheOverride cacheOverride)
3848 {
3849     t_Fm                            *p_Fm = (t_Fm*)h_Fm;
3850     enum fman_dma_cache_override    fsl_cache_override;
3851 
3852     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3853     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3854     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
3855 
3856     FMAN_CACHE_OVERRIDE_TRANS(fsl_cache_override, cacheOverride)
3857     p_Fm->p_FmDriverParam->dma_cache_override = fsl_cache_override;
3858 
3859     return E_OK;
3860 }
3861 
3862 t_Error FM_ConfigDmaAidOverride(t_Handle h_Fm, bool aidOverride)
3863 {
3864     t_Fm *p_Fm = (t_Fm*)h_Fm;
3865 
3866     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3867     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3868     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
3869 
3870     p_Fm->p_FmDriverParam->dma_aid_override = aidOverride;
3871 
3872     return E_OK;
3873 }
3874 
3875 t_Error FM_ConfigDmaAidMode(t_Handle h_Fm, e_FmDmaAidMode aidMode)
3876 {
3877     t_Fm                    *p_Fm = (t_Fm*)h_Fm;
3878     enum fman_dma_aid_mode  fsl_aid_mode;
3879 
3880     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3881     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3882     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
3883 
3884     FMAN_AID_MODE_TRANS(fsl_aid_mode, aidMode);
3885     p_Fm->p_FmDriverParam->dma_aid_mode = fsl_aid_mode;
3886 
3887     return E_OK;
3888 }
3889 
3890 t_Error FM_ConfigDmaAxiDbgNumOfBeats(t_Handle h_Fm, uint8_t axiDbgNumOfBeats)
3891 {
3892     t_Fm *p_Fm = (t_Fm*)h_Fm;
3893 
3894     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3895     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3896     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
3897 
3898 #if (DPAA_VERSION >= 11)
3899     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!"));
3900 #else
3901     p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats = axiDbgNumOfBeats;
3902 
3903     return E_OK;
3904 #endif /* (DPAA_VERSION >= 11) */
3905 }
3906 
3907 t_Error FM_ConfigDmaCamNumOfEntries(t_Handle h_Fm, uint8_t numOfEntries)
3908 {
3909     t_Fm *p_Fm = (t_Fm*)h_Fm;
3910 
3911     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3912     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3913     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
3914 
3915     p_Fm->p_FmDriverParam->dma_cam_num_of_entries = numOfEntries;
3916 
3917     return E_OK;
3918 }
3919 
3920 t_Error FM_ConfigDmaDbgCounter(t_Handle h_Fm, e_FmDmaDbgCntMode fmDmaDbgCntMode)
3921 {
3922     t_Fm                        *p_Fm = (t_Fm*)h_Fm;
3923     enum fman_dma_dbg_cnt_mode  fsl_dma_dbg_cnt;
3924 
3925     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3926     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3927     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
3928 
3929     FMAN_DMA_DBG_CNT_TRANS(fsl_dma_dbg_cnt, fmDmaDbgCntMode);
3930     p_Fm->p_FmDriverParam->dma_dbg_cnt_mode = fsl_dma_dbg_cnt;
3931 
3932     return E_OK;
3933 }
3934 
3935 t_Error FM_ConfigDmaStopOnBusErr(t_Handle h_Fm, bool stop)
3936 {
3937     t_Fm *p_Fm = (t_Fm*)h_Fm;
3938 
3939     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3940     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3941     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
3942 
3943     p_Fm->p_FmDriverParam->dma_stop_on_bus_error = stop;
3944 
3945     return E_OK;
3946 }
3947 
3948 t_Error FM_ConfigDmaEmergency(t_Handle h_Fm, t_FmDmaEmergency *p_Emergency)
3949 {
3950     t_Fm                            *p_Fm = (t_Fm*)h_Fm;
3951     enum fman_dma_emergency_level   fsl_dma_emer;
3952 
3953     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3954     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3955     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
3956 
3957     FMAN_DMA_EMER_TRANS(fsl_dma_emer, p_Emergency->emergencyLevel);
3958     p_Fm->p_FmDriverParam->dma_en_emergency = TRUE;
3959     p_Fm->p_FmDriverParam->dma_emergency_bus_select = (uint32_t)p_Emergency->emergencyBusSelect;
3960     p_Fm->p_FmDriverParam->dma_emergency_level = fsl_dma_emer;
3961 
3962     return E_OK;
3963 }
3964 
3965 t_Error FM_ConfigDmaEmergencySmoother(t_Handle h_Fm, uint32_t emergencyCnt)
3966 {
3967     t_Fm *p_Fm = (t_Fm*)h_Fm;
3968 
3969     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3970     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3971     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
3972 
3973     p_Fm->p_FmDriverParam->dma_en_emergency_smoother = TRUE;
3974     p_Fm->p_FmDriverParam->dma_emergency_switch_counter = emergencyCnt;
3975 
3976     return E_OK;
3977 }
3978 
3979 t_Error FM_ConfigDmaErr(t_Handle h_Fm, e_FmDmaErr dmaErr)
3980 {
3981     t_Fm                *p_Fm = (t_Fm*)h_Fm;
3982     enum fman_dma_err   fsl_dma_err;
3983 
3984     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
3985     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
3986     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
3987 
3988     FMAN_DMA_ERR_TRANS(fsl_dma_err, dmaErr);
3989     p_Fm->p_FmDriverParam->dma_err = fsl_dma_err;
3990 
3991     return E_OK;
3992 }
3993 
3994 t_Error FM_ConfigCatastrophicErr(t_Handle h_Fm, e_FmCatastrophicErr catastrophicErr)
3995 {
3996     t_Fm                        *p_Fm = (t_Fm*)h_Fm;
3997     enum fman_catastrophic_err  fsl_catastrophic_err;
3998 
3999     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4000     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4001     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4002 
4003     FMAN_CATASTROPHIC_ERR_TRANS(fsl_catastrophic_err, catastrophicErr);
4004     p_Fm->p_FmDriverParam->catastrophic_err = fsl_catastrophic_err;
4005 
4006     return E_OK;
4007 }
4008 
4009 t_Error FM_ConfigEnableMuramTestMode(t_Handle h_Fm)
4010 {
4011     t_Fm *p_Fm = (t_Fm*)h_Fm;
4012 
4013     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4014     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4015     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4016 
4017     if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)
4018         RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!"));
4019 
4020     p_Fm->p_FmDriverParam->en_muram_test_mode = TRUE;
4021 
4022     return E_OK;
4023 }
4024 
4025 t_Error FM_ConfigEnableIramTestMode(t_Handle h_Fm)
4026 {
4027     t_Fm *p_Fm = (t_Fm*)h_Fm;
4028 
4029     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE );
4030     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4031     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4032 
4033     if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)
4034         RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!"));
4035 
4036     p_Fm->p_FmDriverParam->en_iram_test_mode = TRUE;
4037 
4038     return E_OK;
4039 }
4040 
4041 t_Error FM_ConfigHaltOnExternalActivation(t_Handle h_Fm, bool enable)
4042 {
4043     t_Fm *p_Fm = (t_Fm*)h_Fm;
4044 
4045     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4046     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4047     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4048 
4049     p_Fm->p_FmDriverParam->halt_on_external_activ = enable;
4050 
4051     return E_OK;
4052 }
4053 
4054 t_Error FM_ConfigHaltOnUnrecoverableEccError(t_Handle h_Fm, bool enable)
4055 {
4056     t_Fm *p_Fm = (t_Fm*)h_Fm;
4057 
4058     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4059     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4060     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4061 
4062     if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)
4063         RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!"));
4064 
4065     p_Fm->p_FmDriverParam->halt_on_unrecov_ecc_err = enable;
4066 
4067     return E_OK;
4068 }
4069 
4070 t_Error FM_ConfigException(t_Handle h_Fm, e_FmExceptions exception, bool enable)
4071 {
4072     t_Fm                *p_Fm = (t_Fm*)h_Fm;
4073     uint32_t            bitMask = 0;
4074 
4075     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4076     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4077     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4078 
4079     GET_EXCEPTION_FLAG(bitMask, exception);
4080     if (bitMask)
4081     {
4082         if (enable)
4083             p_Fm->userSetExceptions |= bitMask;
4084         else
4085             p_Fm->p_FmStateStruct->exceptions &= ~bitMask;
4086     }
4087     else
4088         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
4089 
4090     return E_OK;
4091 }
4092 
4093 t_Error FM_ConfigExternalEccRamsEnable(t_Handle h_Fm, bool enable)
4094 {
4095     t_Fm        *p_Fm = (t_Fm*)h_Fm;
4096 
4097     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4098     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4099     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4100 
4101     p_Fm->p_FmDriverParam->external_ecc_rams_enable = enable;
4102 
4103     return E_OK;
4104 }
4105 
4106 t_Error FM_ConfigTnumAgingPeriod(t_Handle h_Fm, uint16_t tnumAgingPeriod)
4107 {
4108     t_Fm             *p_Fm = (t_Fm*)h_Fm;
4109 
4110     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4111     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4112     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4113 
4114     p_Fm->p_FmDriverParam->tnum_aging_period = tnumAgingPeriod;
4115     p_Fm->tnumAgingPeriod = p_Fm->p_FmDriverParam->tnum_aging_period;
4116 
4117     return E_OK;
4118 }
4119 
4120 /****************************************************/
4121 /*       Hidden-DEBUG Only API                      */
4122 /****************************************************/
4123 
4124 t_Error FM_ConfigThresholds(t_Handle h_Fm, t_FmThresholds *p_FmThresholds)
4125 {
4126     t_Fm *p_Fm = (t_Fm*)h_Fm;
4127 
4128     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4129     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4130     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4131 
4132     p_Fm->p_FmDriverParam->disp_limit_tsh  = p_FmThresholds->dispLimit;
4133     p_Fm->p_FmDriverParam->prs_disp_tsh    = p_FmThresholds->prsDispTh;
4134     p_Fm->p_FmDriverParam->plcr_disp_tsh   = p_FmThresholds->plcrDispTh;
4135     p_Fm->p_FmDriverParam->kg_disp_tsh     = p_FmThresholds->kgDispTh;
4136     p_Fm->p_FmDriverParam->bmi_disp_tsh    = p_FmThresholds->bmiDispTh;
4137     p_Fm->p_FmDriverParam->qmi_enq_disp_tsh = p_FmThresholds->qmiEnqDispTh;
4138     p_Fm->p_FmDriverParam->qmi_deq_disp_tsh = p_FmThresholds->qmiDeqDispTh;
4139     p_Fm->p_FmDriverParam->fm_ctl1_disp_tsh = p_FmThresholds->fmCtl1DispTh;
4140     p_Fm->p_FmDriverParam->fm_ctl2_disp_tsh = p_FmThresholds->fmCtl2DispTh;
4141 
4142     return E_OK;
4143 }
4144 
4145 t_Error FM_ConfigDmaSosEmergencyThreshold(t_Handle h_Fm, uint32_t dmaSosEmergency)
4146 {
4147     t_Fm *p_Fm = (t_Fm*)h_Fm;
4148 
4149     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4150     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4151     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4152 
4153     p_Fm->p_FmDriverParam->dma_sos_emergency = dmaSosEmergency;
4154 
4155     return E_OK;
4156 }
4157 
4158 t_Error FM_ConfigDmaWriteBufThresholds(t_Handle h_Fm, t_FmDmaThresholds *p_FmDmaThresholds)
4159 
4160 {
4161     t_Fm *p_Fm = (t_Fm*)h_Fm;
4162 
4163     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4164     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4165     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4166 
4167 #if (DPAA_VERSION >= 11)
4168     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!"));
4169 #else
4170     p_Fm->p_FmDriverParam->dma_write_buf_tsh_asrt_emer = p_FmDmaThresholds->assertEmergency;
4171     p_Fm->p_FmDriverParam->dma_write_buf_tsh_clr_emer  = p_FmDmaThresholds->clearEmergency;
4172 
4173     return E_OK;
4174 #endif
4175 }
4176 
4177 t_Error FM_ConfigDmaCommQThresholds(t_Handle h_Fm, t_FmDmaThresholds *p_FmDmaThresholds)
4178 {
4179     t_Fm *p_Fm = (t_Fm*)h_Fm;
4180 
4181     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4182     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4183     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4184 
4185     p_Fm->p_FmDriverParam->dma_comm_qtsh_asrt_emer    = p_FmDmaThresholds->assertEmergency;
4186     p_Fm->p_FmDriverParam->dma_comm_qtsh_clr_emer     = p_FmDmaThresholds->clearEmergency;
4187 
4188     return E_OK;
4189 }
4190 
4191 t_Error FM_ConfigDmaReadBufThresholds(t_Handle h_Fm, t_FmDmaThresholds *p_FmDmaThresholds)
4192 {
4193     t_Fm *p_Fm = (t_Fm*)h_Fm;
4194 
4195     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4196     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4197     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4198 
4199 #if (DPAA_VERSION >= 11)
4200     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!"));
4201 #else
4202     p_Fm->p_FmDriverParam->dma_read_buf_tsh_clr_emer   = p_FmDmaThresholds->clearEmergency;
4203     p_Fm->p_FmDriverParam->dma_read_buf_tsh_asrt_emer  = p_FmDmaThresholds->assertEmergency;
4204 
4205     return E_OK;
4206 #endif
4207 }
4208 
4209 t_Error FM_ConfigDmaWatchdog(t_Handle h_Fm, uint32_t watchdogValue)
4210 {
4211     t_Fm                *p_Fm = (t_Fm*)h_Fm;
4212 
4213     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4214     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4215     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4216 
4217     p_Fm->p_FmDriverParam->dma_watchdog = watchdogValue;
4218 
4219     return E_OK;
4220 }
4221 
4222 t_Error FM_ConfigEnableCounters(t_Handle h_Fm)
4223 {
4224     t_Fm                *p_Fm = (t_Fm*)h_Fm;
4225 
4226     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4227     SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4228 UNUSED(p_Fm);
4229 
4230     return E_OK;
4231 }
4232 
4233 t_Error FmGetSetParams(t_Handle h_Fm, t_FmGetSetParams *p_Params)
4234 {
4235 	t_Fm* p_Fm = (t_Fm*)h_Fm;
4236 	if (p_Params->setParams.type & UPDATE_FM_CLD)
4237 	{
4238 		WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_cld, GET_UINT32(
4239 				p_Fm->p_FmFpmRegs->fm_cld) | 0x00000800);
4240 	}
4241 	if (p_Params->setParams.type & CLEAR_IRAM_READY)
4242 	{
4243 	    t_FMIramRegs *p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM);
4244 		WRITE_UINT32(p_Iram->iready,GET_UINT32(p_Iram->iready) & ~IRAM_READY);
4245 	}
4246 	if (p_Params->setParams.type & UPDATE_FPM_EXTC)
4247 		WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_extc,0x80000000);
4248 	if (p_Params->setParams.type & UPDATE_FPM_EXTC_CLEAR)
4249 		WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_extc,0x00800000);
4250 	if (p_Params->setParams.type & UPDATE_FPM_BRKC_SLP)
4251 	{
4252 		if (p_Params->setParams.sleep)
4253 			WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc, GET_UINT32(
4254 				p_Fm->p_FmFpmRegs->fmfp_brkc) | FPM_BRKC_SLP);
4255 		else
4256 			WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc, GET_UINT32(
4257 				p_Fm->p_FmFpmRegs->fmfp_brkc) & ~FPM_BRKC_SLP);
4258 	}
4259 	if (p_Params->getParams.type & GET_FM_CLD)
4260 		p_Params->getParams.fm_cld = GET_UINT32(p_Fm->p_FmFpmRegs->fm_cld);
4261 	if (p_Params->getParams.type & GET_FMQM_GS)
4262 		p_Params->getParams.fmqm_gs = GET_UINT32(p_Fm->p_FmQmiRegs->fmqm_gs);
4263 	if (p_Params->getParams.type & GET_FM_NPI)
4264 		p_Params->getParams.fm_npi = GET_UINT32(p_Fm->p_FmFpmRegs->fm_npi);
4265 	if (p_Params->getParams.type & GET_FMFP_EXTC)
4266 		p_Params->getParams.fmfp_extc = GET_UINT32(p_Fm->p_FmFpmRegs->fmfp_extc);
4267 	return E_OK;
4268 }
4269 
4270 
4271 /****************************************************/
4272 /*       API Run-time Control uint functions        */
4273 /****************************************************/
4274 void FM_EventIsr(t_Handle h_Fm)
4275 {
4276 #define FM_M_CALL_1G_MAC_ISR(_id)    \
4277     {                                \
4278         if (p_Fm->guestId != p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id)].guestId)    \
4279             SendIpcIsr(p_Fm, (e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id), pending);                 \
4280         else                                                                                        \
4281             p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id)].h_SrcHandle);\
4282     }
4283 #define FM_M_CALL_10G_MAC_ISR(_id)   \
4284     {                                \
4285         if (p_Fm->guestId != p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id)].guestId)    \
4286             SendIpcIsr(p_Fm, (e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id), pending);                 \
4287         else                                                                                         \
4288             p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id)].h_SrcHandle);\
4289     }
4290     t_Fm                    *p_Fm = (t_Fm*)h_Fm;
4291     uint32_t                pending, event;
4292     struct fman_fpm_regs *fpm_rg;
4293 
4294     SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE);
4295     SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4296     SANITY_CHECK_RETURN((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4297 
4298     fpm_rg = p_Fm->p_FmFpmRegs;
4299 
4300     /* normal interrupts */
4301     pending = fman_get_normal_pending(fpm_rg);
4302     if (!pending)
4303         return;
4304     if (pending & INTR_EN_WAKEUP) // this is a wake up from sleep interrupt
4305     {
4306         t_FmGetSetParams fmGetSetParams;
4307         memset(&fmGetSetParams, 0, sizeof (t_FmGetSetParams));
4308         fmGetSetParams.setParams.type = UPDATE_FPM_BRKC_SLP;
4309         fmGetSetParams.setParams.sleep = 0;
4310         FmGetSetParams(h_Fm, &fmGetSetParams);
4311     }
4312     if (pending & INTR_EN_QMI)
4313         QmiEvent(p_Fm);
4314     if (pending & INTR_EN_PRS)
4315         p_Fm->intrMng[e_FM_EV_PRS].f_Isr(p_Fm->intrMng[e_FM_EV_PRS].h_SrcHandle);
4316     if (pending & INTR_EN_PLCR)
4317         p_Fm->intrMng[e_FM_EV_PLCR].f_Isr(p_Fm->intrMng[e_FM_EV_PLCR].h_SrcHandle);
4318     if (pending & INTR_EN_TMR)
4319             p_Fm->intrMng[e_FM_EV_TMR].f_Isr(p_Fm->intrMng[e_FM_EV_TMR].h_SrcHandle);
4320 
4321     /* MAC events may belong to different partitions */
4322     if (pending & INTR_EN_1G_MAC0)
4323         FM_M_CALL_1G_MAC_ISR(0);
4324     if (pending & INTR_EN_1G_MAC1)
4325         FM_M_CALL_1G_MAC_ISR(1);
4326     if (pending & INTR_EN_1G_MAC2)
4327         FM_M_CALL_1G_MAC_ISR(2);
4328     if (pending & INTR_EN_1G_MAC3)
4329         FM_M_CALL_1G_MAC_ISR(3);
4330     if (pending & INTR_EN_1G_MAC4)
4331         FM_M_CALL_1G_MAC_ISR(4);
4332     if (pending & INTR_EN_1G_MAC5)
4333         FM_M_CALL_1G_MAC_ISR(5);
4334     if (pending & INTR_EN_1G_MAC6)
4335         FM_M_CALL_1G_MAC_ISR(6);
4336     if (pending & INTR_EN_1G_MAC7)
4337         FM_M_CALL_1G_MAC_ISR(7);
4338     if (pending & INTR_EN_10G_MAC0)
4339         FM_M_CALL_10G_MAC_ISR(0);
4340     if (pending & INTR_EN_10G_MAC1)
4341         FM_M_CALL_10G_MAC_ISR(1);
4342 
4343     /* IM port events may belong to different partitions */
4344     if (pending & INTR_EN_REV0)
4345     {
4346         event = fman_get_controller_event(fpm_rg, 0);
4347         if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_FMAN_CTRL_0].guestId)
4348             /*TODO IPC ISR For Fman Ctrl */
4349             ASSERT_COND(0);
4350             /* SendIpcIsr(p_Fm, e_FM_EV_FMAN_CTRL_0, pending); */
4351         else
4352             p_Fm->fmanCtrlIntr[0].f_Isr(p_Fm->fmanCtrlIntr[0].h_SrcHandle, event);
4353 
4354     }
4355     if (pending & INTR_EN_REV1)
4356     {
4357         event = fman_get_controller_event(fpm_rg, 1);
4358         if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_FMAN_CTRL_1].guestId)
4359             /*TODO IPC ISR For Fman Ctrl */
4360             ASSERT_COND(0);
4361             /* SendIpcIsr(p_Fm, e_FM_EV_FMAN_CTRL_1, pending); */
4362         else
4363             p_Fm->fmanCtrlIntr[1].f_Isr(p_Fm->fmanCtrlIntr[1].h_SrcHandle, event);
4364     }
4365     if (pending & INTR_EN_REV2)
4366     {
4367         event = fman_get_controller_event(fpm_rg, 2);
4368         if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_FMAN_CTRL_2].guestId)
4369             /*TODO IPC ISR For Fman Ctrl */
4370             ASSERT_COND(0);
4371             /* SendIpcIsr(p_Fm, e_FM_EV_FMAN_CTRL_2, pending); */
4372         else
4373            p_Fm->fmanCtrlIntr[2].f_Isr(p_Fm->fmanCtrlIntr[2].h_SrcHandle, event);
4374     }
4375     if (pending & INTR_EN_REV3)
4376     {
4377         event = fman_get_controller_event(fpm_rg, 3);
4378         if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_FMAN_CTRL_3].guestId)
4379             /*TODO IPC ISR For Fman Ctrl */
4380             ASSERT_COND(0);
4381             /* SendIpcIsr(p_Fm, e_FM_EV_FMAN_CTRL_2, pendin3); */
4382         else
4383             p_Fm->fmanCtrlIntr[3].f_Isr(p_Fm->fmanCtrlIntr[3].h_SrcHandle, event);
4384     }
4385 #ifdef FM_MACSEC_SUPPORT
4386     if (pending & INTR_EN_MACSEC_MAC0)
4387     {
4388        if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_MACSEC_MAC0].guestId)
4389             SendIpcIsr(p_Fm, e_FM_EV_MACSEC_MAC0, pending);
4390         else
4391             p_Fm->intrMng[e_FM_EV_MACSEC_MAC0].f_Isr(p_Fm->intrMng[e_FM_EV_MACSEC_MAC0].h_SrcHandle);
4392     }
4393 #endif /* FM_MACSEC_SUPPORT */
4394 }
4395 
4396 t_Error FM_ErrorIsr(t_Handle h_Fm)
4397 {
4398 #define FM_M_CALL_1G_MAC_ERR_ISR(_id)   \
4399     {                                   \
4400        if (p_Fm->guestId != p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id)].guestId) \
4401             SendIpcIsr(p_Fm, (e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id), pending);             \
4402        else                                                                                         \
4403             p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id)].h_SrcHandle);\
4404     }
4405 #define FM_M_CALL_10G_MAC_ERR_ISR(_id)   \
4406     {                                    \
4407        if (p_Fm->guestId != p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id)].guestId) \
4408             SendIpcIsr(p_Fm, (e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id), pending);             \
4409        else                                                                                          \
4410             p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id)].h_SrcHandle);\
4411     }
4412     t_Fm                    *p_Fm = (t_Fm*)h_Fm;
4413     uint32_t                pending;
4414     struct fman_fpm_regs *fpm_rg;
4415 
4416     SANITY_CHECK_RETURN_ERROR(h_Fm, E_INVALID_HANDLE);
4417     SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
4418     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4419 
4420     fpm_rg = p_Fm->p_FmFpmRegs;
4421 
4422     /* error interrupts */
4423     pending = fman_get_fpm_error_interrupts(fpm_rg);
4424     if (!pending)
4425         return ERROR_CODE(E_EMPTY);
4426 
4427     if (pending & ERR_INTR_EN_BMI)
4428         BmiErrEvent(p_Fm);
4429     if (pending & ERR_INTR_EN_QMI)
4430         QmiErrEvent(p_Fm);
4431     if (pending & ERR_INTR_EN_FPM)
4432         FpmErrEvent(p_Fm);
4433     if (pending & ERR_INTR_EN_DMA)
4434         DmaErrEvent(p_Fm);
4435     if (pending & ERR_INTR_EN_IRAM)
4436         IramErrIntr(p_Fm);
4437     if (pending & ERR_INTR_EN_MURAM)
4438         MuramErrIntr(p_Fm);
4439     if (pending & ERR_INTR_EN_PRS)
4440         p_Fm->intrMng[e_FM_EV_ERR_PRS].f_Isr(p_Fm->intrMng[e_FM_EV_ERR_PRS].h_SrcHandle);
4441     if (pending & ERR_INTR_EN_PLCR)
4442         p_Fm->intrMng[e_FM_EV_ERR_PLCR].f_Isr(p_Fm->intrMng[e_FM_EV_ERR_PLCR].h_SrcHandle);
4443     if (pending & ERR_INTR_EN_KG)
4444         p_Fm->intrMng[e_FM_EV_ERR_KG].f_Isr(p_Fm->intrMng[e_FM_EV_ERR_KG].h_SrcHandle);
4445 
4446     /* MAC events may belong to different partitions */
4447     if (pending & ERR_INTR_EN_1G_MAC0)
4448         FM_M_CALL_1G_MAC_ERR_ISR(0);
4449     if (pending & ERR_INTR_EN_1G_MAC1)
4450         FM_M_CALL_1G_MAC_ERR_ISR(1);
4451     if (pending & ERR_INTR_EN_1G_MAC2)
4452         FM_M_CALL_1G_MAC_ERR_ISR(2);
4453     if (pending & ERR_INTR_EN_1G_MAC3)
4454         FM_M_CALL_1G_MAC_ERR_ISR(3);
4455     if (pending & ERR_INTR_EN_1G_MAC4)
4456         FM_M_CALL_1G_MAC_ERR_ISR(4);
4457     if (pending & ERR_INTR_EN_1G_MAC5)
4458         FM_M_CALL_1G_MAC_ERR_ISR(5);
4459     if (pending & ERR_INTR_EN_1G_MAC6)
4460         FM_M_CALL_1G_MAC_ERR_ISR(6);
4461     if (pending & ERR_INTR_EN_1G_MAC7)
4462         FM_M_CALL_1G_MAC_ERR_ISR(7);
4463     if (pending & ERR_INTR_EN_10G_MAC0)
4464         FM_M_CALL_10G_MAC_ERR_ISR(0);
4465     if (pending & ERR_INTR_EN_10G_MAC1)
4466         FM_M_CALL_10G_MAC_ERR_ISR(1);
4467 
4468 #ifdef FM_MACSEC_SUPPORT
4469     if (pending & ERR_INTR_EN_MACSEC_MAC0)
4470     {
4471        if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_ERR_MACSEC_MAC0].guestId)
4472             SendIpcIsr(p_Fm, e_FM_EV_ERR_MACSEC_MAC0, pending);
4473         else
4474             p_Fm->intrMng[e_FM_EV_ERR_MACSEC_MAC0].f_Isr(p_Fm->intrMng[e_FM_EV_ERR_MACSEC_MAC0].h_SrcHandle);
4475     }
4476 #endif /* FM_MACSEC_SUPPORT */
4477 
4478     return E_OK;
4479 }
4480 
4481 t_Error FM_SetPortsBandwidth(t_Handle h_Fm, t_FmPortsBandwidthParams *p_PortsBandwidth)
4482 {
4483     t_Fm        *p_Fm = (t_Fm*)h_Fm;
4484     int         i;
4485     uint8_t     sum;
4486     uint8_t     hardwarePortId;
4487     uint8_t     weights[64];
4488     uint8_t     weight, maxPercent = 0;
4489     struct fman_bmi_regs *bmi_rg;
4490 
4491     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4492     SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
4493     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4494 
4495     bmi_rg = p_Fm->p_FmBmiRegs;
4496 
4497     memset(weights, 0, (sizeof(uint8_t) * 64));
4498 
4499     /* check that all ports add up to 100% */
4500     sum = 0;
4501     for (i=0; i < p_PortsBandwidth->numOfPorts; i++)
4502         sum +=p_PortsBandwidth->portsBandwidths[i].bandwidth;
4503     if (sum != 100)
4504         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Sum of ports bandwidth differ from 100%"));
4505 
4506     /* find highest percent */
4507     for (i=0; i < p_PortsBandwidth->numOfPorts; i++)
4508     {
4509         if (p_PortsBandwidth->portsBandwidths[i].bandwidth > maxPercent)
4510             maxPercent = p_PortsBandwidth->portsBandwidths[i].bandwidth;
4511     }
4512 
4513     ASSERT_COND(maxPercent > 0); /* guaranteed by sum = 100 */
4514 
4515     /* calculate weight for each port */
4516     for (i=0; i < p_PortsBandwidth->numOfPorts; i++)
4517     {
4518         weight = (uint8_t)((p_PortsBandwidth->portsBandwidths[i].bandwidth * PORT_MAX_WEIGHT ) / maxPercent);
4519         /* we want even division between 1-to-PORT_MAX_WEIGHT. so if exact division
4520            is not reached, we round up so that:
4521            0 until maxPercent/PORT_MAX_WEIGHT get "1"
4522            maxPercent/PORT_MAX_WEIGHT+1 until (maxPercent/PORT_MAX_WEIGHT)*2 get "2"
4523            ...
4524            maxPercent - maxPercent/PORT_MAX_WEIGHT until maxPercent get "PORT_MAX_WEIGHT: */
4525         if ((uint8_t)((p_PortsBandwidth->portsBandwidths[i].bandwidth * PORT_MAX_WEIGHT ) % maxPercent))
4526             weight++;
4527 
4528         /* find the location of this port within the register */
4529         hardwarePortId =
4530             SwPortIdToHwPortId(p_PortsBandwidth->portsBandwidths[i].type,
4531                                p_PortsBandwidth->portsBandwidths[i].relativePortId,
4532                                p_Fm->p_FmStateStruct->revInfo.majorRev,
4533                                p_Fm->p_FmStateStruct->revInfo.minorRev);
4534 
4535         ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));
4536         weights[hardwarePortId] = weight;
4537     }
4538 
4539     fman_set_ports_bandwidth(bmi_rg, weights);
4540 
4541     return E_OK;
4542 }
4543 
4544 t_Error FM_EnableRamsEcc(t_Handle h_Fm)
4545 {
4546     t_Fm        *p_Fm = (t_Fm*)h_Fm;
4547     struct fman_fpm_regs *fpm_rg;
4548 
4549     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4550 
4551     fpm_rg = p_Fm->p_FmFpmRegs;
4552 
4553     if (p_Fm->guestId != NCSW_MASTER_ID)
4554     {
4555         t_FmIpcMsg      msg;
4556         t_Error         err;
4557 
4558         memset(&msg, 0, sizeof(msg));
4559         msg.msgId = FM_ENABLE_RAM_ECC;
4560         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
4561                                 (uint8_t*)&msg,
4562                                 sizeof(msg.msgId),
4563                                 NULL,
4564                                 NULL,
4565                                 NULL,
4566                                 NULL);
4567         if (err != E_OK)
4568             RETURN_ERROR(MINOR, err, NO_MSG);
4569         return E_OK;
4570     }
4571 
4572     if (!p_Fm->p_FmStateStruct->internalCall)
4573         p_Fm->p_FmStateStruct->explicitEnable = TRUE;
4574     p_Fm->p_FmStateStruct->internalCall = FALSE;
4575 
4576     if (p_Fm->p_FmStateStruct->ramsEccEnable)
4577         return E_OK;
4578     else
4579     {
4580         fman_enable_rams_ecc(fpm_rg);
4581         p_Fm->p_FmStateStruct->ramsEccEnable = TRUE;
4582     }
4583 
4584     return E_OK;
4585 }
4586 
4587 t_Error FM_DisableRamsEcc(t_Handle h_Fm)
4588 {
4589     t_Fm        *p_Fm = (t_Fm*)h_Fm;
4590     bool        explicitDisable = FALSE;
4591     struct fman_fpm_regs *fpm_rg;
4592 
4593     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4594     SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_HANDLE);
4595 
4596     fpm_rg = p_Fm->p_FmFpmRegs;
4597 
4598     if (p_Fm->guestId != NCSW_MASTER_ID)
4599     {
4600         t_Error             err;
4601         t_FmIpcMsg          msg;
4602 
4603         memset(&msg, 0, sizeof(msg));
4604         msg.msgId = FM_DISABLE_RAM_ECC;
4605         if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
4606                                      (uint8_t*)&msg,
4607                                      sizeof(msg.msgId),
4608                                      NULL,
4609                                      NULL,
4610                                      NULL,
4611                                      NULL)) != E_OK)
4612             RETURN_ERROR(MINOR, err, NO_MSG);
4613         return E_OK;
4614     }
4615 
4616     if (!p_Fm->p_FmStateStruct->internalCall)
4617         explicitDisable = TRUE;
4618     p_Fm->p_FmStateStruct->internalCall = FALSE;
4619 
4620     /* if rams are already disabled, or if rams were explicitly enabled and are
4621        currently called indirectly (not explicitly), ignore this call. */
4622     if (!p_Fm->p_FmStateStruct->ramsEccEnable ||
4623         (p_Fm->p_FmStateStruct->explicitEnable && !explicitDisable))
4624         return E_OK;
4625     else
4626     {
4627         if (p_Fm->p_FmStateStruct->explicitEnable)
4628             /* This is the case were both explicit are TRUE.
4629                Turn off this flag for cases were following ramsEnable
4630                routines are called */
4631             p_Fm->p_FmStateStruct->explicitEnable = FALSE;
4632 
4633         fman_enable_rams_ecc(fpm_rg);
4634         p_Fm->p_FmStateStruct->ramsEccEnable = FALSE;
4635     }
4636 
4637     return E_OK;
4638 }
4639 
4640 t_Error FM_SetException(t_Handle h_Fm, e_FmExceptions exception, bool enable)
4641 {
4642     t_Fm                *p_Fm = (t_Fm*)h_Fm;
4643     uint32_t            bitMask = 0;
4644     enum fman_exceptions fslException;
4645     struct fman_rg       fman_rg;
4646 
4647     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4648     SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
4649 
4650     fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;
4651     fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;
4652     fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;
4653     fman_rg.dma_rg = p_Fm->p_FmDmaRegs;
4654 
4655     GET_EXCEPTION_FLAG(bitMask, exception);
4656     if (bitMask)
4657     {
4658         if (enable)
4659             p_Fm->p_FmStateStruct->exceptions |= bitMask;
4660         else
4661             p_Fm->p_FmStateStruct->exceptions &= ~bitMask;
4662 
4663         fslException = FmanExceptionTrans(exception);
4664 
4665         return (t_Error)fman_set_exception(&fman_rg,
4666                                   fslException,
4667                                   enable);
4668     }
4669     else
4670         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
4671 
4672     return E_OK;
4673 }
4674 
4675 t_Error FM_GetRevision(t_Handle h_Fm, t_FmRevisionInfo *p_FmRevisionInfo)
4676 {
4677     t_Fm *p_Fm = (t_Fm*)h_Fm;
4678 
4679     p_FmRevisionInfo->majorRev = p_Fm->p_FmStateStruct->revInfo.majorRev;
4680     p_FmRevisionInfo->minorRev = p_Fm->p_FmStateStruct->revInfo.minorRev;
4681 
4682     return E_OK;
4683 }
4684 
4685 t_Error FM_GetFmanCtrlCodeRevision(t_Handle h_Fm, t_FmCtrlCodeRevisionInfo *p_RevisionInfo)
4686 {
4687     t_Fm                            *p_Fm = (t_Fm*)h_Fm;
4688     t_FMIramRegs                    *p_Iram;
4689     uint32_t                        revInfo;
4690 
4691     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4692     SANITY_CHECK_RETURN_ERROR(p_RevisionInfo, E_NULL_POINTER);
4693 
4694     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
4695         p_Fm->h_IpcSessions[0])
4696     {
4697         t_Error                         err;
4698         t_FmIpcMsg                      msg;
4699         t_FmIpcReply                    reply;
4700         uint32_t                        replyLength;
4701         t_FmIpcFmanCtrlCodeRevisionInfo ipcRevInfo;
4702 
4703         memset(&msg, 0, sizeof(msg));
4704         memset(&reply, 0, sizeof(reply));
4705         msg.msgId = FM_GET_FMAN_CTRL_CODE_REV;
4706         replyLength = sizeof(uint32_t) + sizeof(t_FmCtrlCodeRevisionInfo);
4707         if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
4708                                      (uint8_t*)&msg,
4709                                      sizeof(msg.msgId),
4710                                      (uint8_t*)&reply,
4711                                      &replyLength,
4712                                      NULL,
4713                                      NULL)) != E_OK)
4714             RETURN_ERROR(MINOR, err, NO_MSG);
4715         if (replyLength != (sizeof(uint32_t) + sizeof(t_FmCtrlCodeRevisionInfo)))
4716             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
4717         memcpy((uint8_t*)&ipcRevInfo, reply.replyBody, sizeof(t_FmCtrlCodeRevisionInfo));
4718         p_RevisionInfo->packageRev = ipcRevInfo.packageRev;
4719         p_RevisionInfo->majorRev = ipcRevInfo.majorRev;
4720         p_RevisionInfo->minorRev = ipcRevInfo.minorRev;
4721         return (t_Error)(reply.error);
4722     }
4723     else if (p_Fm->guestId != NCSW_MASTER_ID)
4724         RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
4725                      ("running in guest-mode without IPC!"));
4726 
4727     p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM);
4728     WRITE_UINT32(p_Iram->iadd, 0x4);
4729     while (GET_UINT32(p_Iram->iadd) != 0x4) ;
4730     revInfo = GET_UINT32(p_Iram->idata);
4731     p_RevisionInfo->packageRev = (uint16_t)((revInfo & 0xFFFF0000) >> 16);
4732     p_RevisionInfo->majorRev = (uint8_t)((revInfo & 0x0000FF00) >> 8);
4733     p_RevisionInfo->minorRev = (uint8_t)(revInfo & 0x000000FF);
4734 
4735     return E_OK;
4736 }
4737 
4738 uint32_t FM_GetCounter(t_Handle h_Fm, e_FmCounters counter)
4739 {
4740     t_Fm        *p_Fm = (t_Fm*)h_Fm;
4741     t_Error     err;
4742     uint32_t    counterValue;
4743     struct fman_rg       fman_rg;
4744     enum fman_counters fsl_counter;
4745 
4746     SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0);
4747     SANITY_CHECK_RETURN_VALUE(!p_Fm->p_FmDriverParam, E_INVALID_STATE, 0);
4748 
4749     fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;
4750     fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;
4751     fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;
4752     fman_rg.dma_rg = p_Fm->p_FmDmaRegs;
4753 
4754     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
4755         !p_Fm->baseAddr &&
4756         p_Fm->h_IpcSessions[0])
4757     {
4758         t_FmIpcMsg          msg;
4759         t_FmIpcReply        reply;
4760         uint32_t            replyLength, outCounter;
4761 
4762         memset(&msg, 0, sizeof(msg));
4763         memset(&reply, 0, sizeof(reply));
4764         msg.msgId = FM_GET_COUNTER;
4765         memcpy(msg.msgBody, (uint8_t *)&counter, sizeof(uint32_t));
4766         replyLength = sizeof(uint32_t) + sizeof(uint32_t);
4767         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
4768                                      (uint8_t*)&msg,
4769                                      sizeof(msg.msgId) +sizeof(counterValue),
4770                                      (uint8_t*)&reply,
4771                                      &replyLength,
4772                                      NULL,
4773                                      NULL);
4774         if (err != E_OK)
4775         {
4776             REPORT_ERROR(MAJOR, err, NO_MSG);
4777             return 0;
4778         }
4779         if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t)))
4780         {
4781             REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
4782             return 0;
4783         }
4784 
4785         memcpy((uint8_t*)&outCounter, reply.replyBody, sizeof(uint32_t));
4786         return outCounter;
4787     }
4788     else if (!p_Fm->baseAddr)
4789     {
4790         REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Either IPC or 'baseAddress' is required!"));
4791         return 0;
4792     }
4793 
4794     /* When applicable (when there is an 'enable counters' bit,
4795     check that counters are enabled */
4796     switch (counter)
4797     {
4798         case (e_FM_COUNTERS_DEQ_1):
4799         case (e_FM_COUNTERS_DEQ_2):
4800         case (e_FM_COUNTERS_DEQ_3):
4801             if ((p_Fm->p_FmStateStruct->revInfo.majorRev == 4) ||
4802                 (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6))
4803             {
4804                 REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Requested counter not supported"));
4805                 return 0;
4806             }
4807         case (e_FM_COUNTERS_ENQ_TOTAL_FRAME):
4808         case (e_FM_COUNTERS_DEQ_TOTAL_FRAME):
4809         case (e_FM_COUNTERS_DEQ_0):
4810         case (e_FM_COUNTERS_DEQ_FROM_DEFAULT):
4811         case (e_FM_COUNTERS_DEQ_FROM_CONTEXT):
4812         case (e_FM_COUNTERS_DEQ_FROM_FD):
4813         case (e_FM_COUNTERS_DEQ_CONFIRM):
4814             if (!(GET_UINT32(p_Fm->p_FmQmiRegs->fmqm_gc) & QMI_CFG_EN_COUNTERS))
4815             {
4816                 REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Requested counter was not enabled"));
4817                 return 0;
4818             }
4819             break;
4820         default:
4821             break;
4822     }
4823 
4824     FMAN_COUNTERS_TRANS(fsl_counter, counter);
4825     return fman_get_counter(&fman_rg, fsl_counter);
4826 }
4827 
4828 t_Error FM_ModifyCounter(t_Handle h_Fm, e_FmCounters counter, uint32_t val)
4829 {
4830     t_Fm *p_Fm = (t_Fm*)h_Fm;
4831     struct fman_rg          fman_rg;
4832     enum fman_counters fsl_counter;
4833 
4834     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4835     SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
4836 
4837    fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;
4838    fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;
4839    fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;
4840    fman_rg.dma_rg = p_Fm->p_FmDmaRegs;
4841 
4842    FMAN_COUNTERS_TRANS(fsl_counter, counter);
4843    return  (t_Error)fman_modify_counter(&fman_rg, fsl_counter, val);
4844 }
4845 
4846 void FM_SetDmaEmergency(t_Handle h_Fm, e_FmDmaMuramPort muramPort, bool enable)
4847 {
4848     t_Fm *p_Fm = (t_Fm*)h_Fm;
4849     struct fman_dma_regs *dma_rg;
4850 
4851     SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE);
4852     SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
4853 
4854     dma_rg = p_Fm->p_FmDmaRegs;
4855 
4856     fman_set_dma_emergency(dma_rg, !!(muramPort==e_FM_DMA_MURAM_PORT_WRITE), enable);
4857 }
4858 
4859 void FM_SetDmaExtBusPri(t_Handle h_Fm, e_FmDmaExtBusPri pri)
4860 {
4861     t_Fm *p_Fm = (t_Fm*)h_Fm;
4862     struct fman_dma_regs *dma_rg;
4863 
4864     SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE);
4865     SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
4866 
4867     dma_rg = p_Fm->p_FmDmaRegs;
4868 
4869     fman_set_dma_ext_bus_pri(dma_rg, pri);
4870 }
4871 
4872 void FM_GetDmaStatus(t_Handle h_Fm, t_FmDmaStatus *p_FmDmaStatus)
4873 {
4874     t_Fm                *p_Fm = (t_Fm*)h_Fm;
4875     uint32_t             dmaStatus;
4876     struct fman_dma_regs *dma_rg;
4877 
4878     SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE);
4879     SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
4880 
4881     dma_rg = p_Fm->p_FmDmaRegs;
4882 
4883     if ((p_Fm->guestId != NCSW_MASTER_ID) &&
4884         !p_Fm->baseAddr &&
4885         p_Fm->h_IpcSessions[0])
4886     {
4887         t_FmIpcDmaStatus    ipcDmaStatus;
4888         t_FmIpcMsg          msg;
4889         t_FmIpcReply        reply;
4890         t_Error             err;
4891         uint32_t            replyLength;
4892 
4893         memset(&msg, 0, sizeof(msg));
4894         memset(&reply, 0, sizeof(reply));
4895         msg.msgId = FM_DMA_STAT;
4896         replyLength = sizeof(uint32_t) + sizeof(t_FmIpcDmaStatus);
4897         err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],
4898                                 (uint8_t*)&msg,
4899                                 sizeof(msg.msgId),
4900                                 (uint8_t*)&reply,
4901                                 &replyLength,
4902                                 NULL,
4903                                 NULL);
4904         if (err != E_OK)
4905         {
4906             REPORT_ERROR(MINOR, err, NO_MSG);
4907             return;
4908         }
4909         if (replyLength != (sizeof(uint32_t) + sizeof(t_FmIpcDmaStatus)))
4910         {
4911             REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
4912             return;
4913         }
4914         memcpy((uint8_t*)&ipcDmaStatus, reply.replyBody, sizeof(t_FmIpcDmaStatus));
4915 
4916         p_FmDmaStatus->cmqNotEmpty = (bool)ipcDmaStatus.boolCmqNotEmpty;            /**< Command queue is not empty */
4917         p_FmDmaStatus->busError = (bool)ipcDmaStatus.boolBusError;                  /**< Bus error occurred */
4918         p_FmDmaStatus->readBufEccError = (bool)ipcDmaStatus.boolReadBufEccError;        /**< Double ECC error on buffer Read */
4919         p_FmDmaStatus->writeBufEccSysError =(bool)ipcDmaStatus.boolWriteBufEccSysError;    /**< Double ECC error on buffer write from system side */
4920         p_FmDmaStatus->writeBufEccFmError = (bool)ipcDmaStatus.boolWriteBufEccFmError;     /**< Double ECC error on buffer write from FM side */
4921         p_FmDmaStatus->singlePortEccError = (bool)ipcDmaStatus.boolSinglePortEccError;     /**< Double ECC error on buffer write from FM side */
4922         return;
4923     }
4924     else if (!p_Fm->baseAddr)
4925     {
4926         REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
4927                      ("Either IPC or 'baseAddress' is required!"));
4928         return;
4929     }
4930 
4931     dmaStatus = fman_get_dma_status(dma_rg);
4932 
4933     p_FmDmaStatus->cmqNotEmpty = (bool)(dmaStatus & DMA_STATUS_CMD_QUEUE_NOT_EMPTY);
4934     p_FmDmaStatus->busError = (bool)(dmaStatus & DMA_STATUS_BUS_ERR);
4935     if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)
4936         p_FmDmaStatus->singlePortEccError = (bool)(dmaStatus & DMA_STATUS_FM_SPDAT_ECC);
4937     else
4938     {
4939         p_FmDmaStatus->readBufEccError = (bool)(dmaStatus & DMA_STATUS_READ_ECC);
4940         p_FmDmaStatus->writeBufEccSysError = (bool)(dmaStatus & DMA_STATUS_SYSTEM_WRITE_ECC);
4941         p_FmDmaStatus->writeBufEccFmError = (bool)(dmaStatus & DMA_STATUS_FM_WRITE_ECC);
4942     }
4943 }
4944 
4945 void FM_Resume(t_Handle h_Fm)
4946 {
4947     t_Fm            *p_Fm = (t_Fm*)h_Fm;
4948     struct fman_fpm_regs *fpm_rg;
4949 
4950     SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE);
4951     SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
4952     SANITY_CHECK_RETURN((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
4953 
4954     fpm_rg = p_Fm->p_FmFpmRegs;
4955 
4956     fman_resume(fpm_rg);
4957 }
4958 
4959 t_Error FM_GetSpecialOperationCoding(t_Handle               h_Fm,
4960                                      fmSpecialOperations_t  spOper,
4961                                      uint8_t                *p_SpOperCoding)
4962 {
4963     t_Fm                        *p_Fm = (t_Fm*)h_Fm;
4964     t_FmCtrlCodeRevisionInfo    revInfo;
4965     t_Error                     err;
4966 
4967     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
4968     SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
4969     SANITY_CHECK_RETURN_ERROR(p_SpOperCoding, E_NULL_POINTER);
4970 
4971     if (!spOper)
4972     {
4973         *p_SpOperCoding = 0;
4974         return E_OK;
4975     }
4976 
4977     if ((err = FM_GetFmanCtrlCodeRevision(p_Fm, &revInfo)) != E_OK)
4978     {
4979         DBG(WARNING, ("FM in guest-mode without IPC, can't validate firmware revision."));
4980         revInfo.packageRev = IP_OFFLOAD_PACKAGE_NUMBER;
4981     }
4982     else if (!IS_OFFLOAD_PACKAGE(revInfo.packageRev))
4983         RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Fman ctrl code package"));
4984 
4985     switch (spOper)
4986     {
4987         case (FM_SP_OP_CAPWAP_DTLS_DEC):
4988                 *p_SpOperCoding = 9;
4989                 break;
4990         case (FM_SP_OP_CAPWAP_DTLS_ENC):
4991                 *p_SpOperCoding = 10;
4992                 break;
4993         case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN|FM_SP_OP_IPSEC_MANIP):
4994         case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN|FM_SP_OP_IPSEC_MANIP|FM_SP_OP_RPD):
4995                 *p_SpOperCoding = 5;
4996                 break;
4997         case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_MANIP):
4998         case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_MANIP|FM_SP_OP_RPD):
4999                 *p_SpOperCoding = 6;
5000                 break;
5001         case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN|FM_SP_OP_RPD):
5002                 *p_SpOperCoding = 3;
5003                 break;
5004         case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN):
5005                 *p_SpOperCoding = 1;
5006                 break;
5007         case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN|FM_SP_OP_IPSEC_NO_ETH_HDR):
5008                 *p_SpOperCoding = 12;
5009                 break;
5010         case (FM_SP_OP_IPSEC|FM_SP_OP_RPD):
5011                 *p_SpOperCoding = 4;
5012                 break;
5013         case (FM_SP_OP_IPSEC):
5014                 *p_SpOperCoding = 2;
5015                 break;
5016         case (FM_SP_OP_DCL4C):
5017                 *p_SpOperCoding = 7;
5018                 break;
5019         case (FM_SP_OP_CLEAR_RPD):
5020                 *p_SpOperCoding = 8;
5021                 break;
5022         default:
5023             RETURN_ERROR(MINOR, E_INVALID_VALUE, NO_MSG);
5024     }
5025 
5026     return E_OK;
5027 }
5028 
5029 t_Error FM_CtrlMonStart(t_Handle h_Fm)
5030 {
5031     t_Fm            *p_Fm = (t_Fm *)h_Fm;
5032     t_FmTrbRegs     *p_MonRegs;
5033     uint8_t         i;
5034 
5035     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
5036     SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
5037     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
5038 
5039     WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc,
5040                  GET_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc) | FPM_BRKC_RDBG);
5041 
5042     for (i = 0; i < FM_NUM_OF_CTRL; i++)
5043     {
5044         p_MonRegs = (t_FmTrbRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_TRB(i));
5045 
5046         /* Reset control registers */
5047         WRITE_UINT32(p_MonRegs->tcrh, TRB_TCRH_RESET);
5048         WRITE_UINT32(p_MonRegs->tcrl, TRB_TCRL_RESET);
5049 
5050         /* Configure: counter #1 counts all stalls in risc - ldsched stall
5051                       counter #2 counts all stalls in risc - other stall*/
5052         WRITE_UINT32(p_MonRegs->tcrl, TRB_TCRL_RESET | TRB_TCRL_UTIL);
5053 
5054         /* Enable monitoring */
5055         WRITE_UINT32(p_MonRegs->tcrh, TRB_TCRH_ENABLE_COUNTERS);
5056     }
5057 
5058     return E_OK;
5059 }
5060 
5061 t_Error FM_CtrlMonStop(t_Handle h_Fm)
5062 {
5063     t_Fm            *p_Fm = (t_Fm *)h_Fm;
5064     t_FmTrbRegs     *p_MonRegs;
5065     uint8_t         i;
5066 
5067     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
5068     SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
5069     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
5070 
5071     for (i = 0; i < FM_NUM_OF_CTRL; i++)
5072     {
5073         p_MonRegs = (t_FmTrbRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_TRB(i));
5074         WRITE_UINT32(p_MonRegs->tcrh, TRB_TCRH_DISABLE_COUNTERS);
5075     }
5076 
5077     WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc,
5078                  GET_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc) & ~FPM_BRKC_RDBG);
5079 
5080     return E_OK;
5081 }
5082 
5083 t_Error FM_CtrlMonGetCounters(t_Handle h_Fm, uint8_t fmCtrlIndex, t_FmCtrlMon *p_Mon)
5084 {
5085     t_Fm            *p_Fm = (t_Fm *)h_Fm;
5086     t_FmTrbRegs     *p_MonRegs;
5087     uint64_t        clkCnt, utilValue, effValue;
5088 
5089     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
5090     SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
5091     SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);
5092     SANITY_CHECK_RETURN_ERROR(p_Mon, E_NULL_POINTER);
5093 
5094     if (fmCtrlIndex >= FM_NUM_OF_CTRL)
5095         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("FM Controller index"));
5096 
5097     p_MonRegs = (t_FmTrbRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_TRB(fmCtrlIndex));
5098 
5099     clkCnt = (uint64_t)
5100             ((uint64_t)GET_UINT32(p_MonRegs->tpcch) << 32 | GET_UINT32(p_MonRegs->tpccl));
5101 
5102     utilValue = (uint64_t)
5103             ((uint64_t)GET_UINT32(p_MonRegs->tpc1h) << 32 | GET_UINT32(p_MonRegs->tpc1l));
5104 
5105     effValue = (uint64_t)
5106             ((uint64_t)GET_UINT32(p_MonRegs->tpc2h) << 32 | GET_UINT32(p_MonRegs->tpc2l));
5107 
5108     p_Mon->percentCnt[0] = (uint8_t)(((clkCnt - utilValue) * 100) / clkCnt);
5109     if (clkCnt != utilValue)
5110         p_Mon->percentCnt[1] = (uint8_t)((((clkCnt - utilValue) - effValue) * 100) / (clkCnt - utilValue));
5111     else
5112         p_Mon->percentCnt[1] = 0;
5113 
5114     return E_OK;
5115 }
5116 
5117 t_Handle FM_GetMuramHandle(t_Handle h_Fm)
5118 {
5119     t_Fm        *p_Fm = (t_Fm*)h_Fm;
5120 
5121     SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, NULL);
5122 
5123     return (p_Fm->h_FmMuram);
5124 }
5125 
5126 /****************************************************/
5127 /*       Hidden-DEBUG Only API                      */
5128 /****************************************************/
5129 t_Error FM_ForceIntr (t_Handle h_Fm, e_FmExceptions exception)
5130 {
5131     t_Fm *p_Fm = (t_Fm*)h_Fm;
5132     enum fman_exceptions fslException;
5133     struct fman_rg fman_rg;
5134 
5135     SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);
5136     SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);
5137 
5138     fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;
5139     fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;
5140     fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;
5141     fman_rg.dma_rg = p_Fm->p_FmDmaRegs;
5142 
5143     switch (exception)
5144     {
5145         case e_FM_EX_QMI_DEQ_FROM_UNKNOWN_PORTID:
5146             if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_QMI_DEQ_FROM_UNKNOWN_PORTID))
5147                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
5148             break;
5149         case e_FM_EX_QMI_SINGLE_ECC:
5150             if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)
5151                  RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("e_FM_EX_QMI_SINGLE_ECC not supported on this integration."));
5152 
5153             if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_QMI_SINGLE_ECC))
5154                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
5155             break;
5156         case e_FM_EX_QMI_DOUBLE_ECC:
5157             if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_QMI_DOUBLE_ECC))
5158                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
5159             break;
5160         case e_FM_EX_BMI_LIST_RAM_ECC:
5161             if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_BMI_LIST_RAM_ECC))
5162                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
5163             break;
5164         case e_FM_EX_BMI_STORAGE_PROFILE_ECC:
5165             if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_BMI_STORAGE_PROFILE_ECC))
5166                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
5167             break;
5168         case e_FM_EX_BMI_STATISTICS_RAM_ECC:
5169             if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_BMI_STATISTICS_RAM_ECC))
5170                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
5171             break;
5172         case e_FM_EX_BMI_DISPATCH_RAM_ECC:
5173             if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_BMI_DISPATCH_RAM_ECC))
5174                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
5175             break;
5176         default:
5177             RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception may not be forced"));
5178     }
5179 
5180     fslException = FmanExceptionTrans(exception);
5181     fman_force_intr (&fman_rg, fslException);
5182 
5183     return E_OK;
5184 }
5185 
5186 t_Handle FmGetPcd(t_Handle h_Fm)
5187 {
5188 	return ((t_Fm*)h_Fm)->h_Pcd;
5189 }
5190 #if (DPAA_VERSION >= 11)
5191 extern void *g_MemacRegs;
5192 void fm_clk_down(void);
5193 uint32_t fman_memac_get_event(void *regs, uint32_t ev_mask);
5194 void FM_ChangeClock(t_Handle h_Fm, int hardwarePortId)
5195 {
5196 	int macId;
5197 	uint32_t    event, rcr;
5198 	t_Fm *p_Fm = (t_Fm*)h_Fm;
5199 	rcr = GET_UINT32(p_Fm->p_FmFpmRegs->fm_rcr);
5200 	rcr |= 0x04000000;
5201 	WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rcr, rcr);
5202 
5203 	HW_PORT_ID_TO_SW_PORT_ID(macId, hardwarePortId);
5204 	do
5205 	{
5206 		event = fman_memac_get_event(g_MemacRegs, 0xFFFFFFFF);
5207 	} while ((event & 0x00000020) == 0);
5208 	fm_clk_down();
5209 	rcr = GET_UINT32(p_Fm->p_FmFpmRegs->fm_rcr);
5210 	rcr &= ~0x04000000;
5211 	WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rcr, rcr);
5212 }
5213 #endif
5214