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