xref: /freebsd/sys/contrib/ncsw/Peripherals/FM/Pcd/fm_prs.c (revision c2c014f24c10f90d85126ac5fbd4d8524de32b1c)
1*852ba100SJustin Hibbits /*
2*852ba100SJustin Hibbits  * Copyright 2008-2012 Freescale Semiconductor Inc.
30aeed3e9SJustin Hibbits  *
40aeed3e9SJustin Hibbits  * Redistribution and use in source and binary forms, with or without
50aeed3e9SJustin Hibbits  * modification, are permitted provided that the following conditions are met:
60aeed3e9SJustin Hibbits  *     * Redistributions of source code must retain the above copyright
70aeed3e9SJustin Hibbits  *       notice, this list of conditions and the following disclaimer.
80aeed3e9SJustin Hibbits  *     * Redistributions in binary form must reproduce the above copyright
90aeed3e9SJustin Hibbits  *       notice, this list of conditions and the following disclaimer in the
100aeed3e9SJustin Hibbits  *       documentation and/or other materials provided with the distribution.
110aeed3e9SJustin Hibbits  *     * Neither the name of Freescale Semiconductor nor the
120aeed3e9SJustin Hibbits  *       names of its contributors may be used to endorse or promote products
130aeed3e9SJustin Hibbits  *       derived from this software without specific prior written permission.
140aeed3e9SJustin Hibbits  *
150aeed3e9SJustin Hibbits  *
160aeed3e9SJustin Hibbits  * ALTERNATIVELY, this software may be distributed under the terms of the
170aeed3e9SJustin Hibbits  * GNU General Public License ("GPL") as published by the Free Software
180aeed3e9SJustin Hibbits  * Foundation, either version 2 of that License or (at your option) any
190aeed3e9SJustin Hibbits  * later version.
200aeed3e9SJustin Hibbits  *
210aeed3e9SJustin Hibbits  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
220aeed3e9SJustin Hibbits  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
230aeed3e9SJustin Hibbits  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
240aeed3e9SJustin Hibbits  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
250aeed3e9SJustin Hibbits  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
260aeed3e9SJustin Hibbits  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
270aeed3e9SJustin Hibbits  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
280aeed3e9SJustin Hibbits  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
290aeed3e9SJustin Hibbits  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
300aeed3e9SJustin Hibbits  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
310aeed3e9SJustin Hibbits  */
320aeed3e9SJustin Hibbits 
33*852ba100SJustin Hibbits 
340aeed3e9SJustin Hibbits /******************************************************************************
350aeed3e9SJustin Hibbits  @File          fm_pcd.c
360aeed3e9SJustin Hibbits 
370aeed3e9SJustin Hibbits  @Description   FM PCD ...
380aeed3e9SJustin Hibbits *//***************************************************************************/
39*852ba100SJustin Hibbits #include <linux/math64.h>
400aeed3e9SJustin Hibbits #include "std_ext.h"
410aeed3e9SJustin Hibbits #include "error_ext.h"
420aeed3e9SJustin Hibbits #include "string_ext.h"
430aeed3e9SJustin Hibbits #include "debug_ext.h"
440aeed3e9SJustin Hibbits #include "net_ext.h"
450aeed3e9SJustin Hibbits 
460aeed3e9SJustin Hibbits #include "fm_common.h"
470aeed3e9SJustin Hibbits #include "fm_pcd.h"
480aeed3e9SJustin Hibbits #include "fm_pcd_ipc.h"
49*852ba100SJustin Hibbits #include "fm_prs.h"
50*852ba100SJustin Hibbits #include "fsl_fman_prs.h"
510aeed3e9SJustin Hibbits 
520aeed3e9SJustin Hibbits 
PcdPrsErrorException(t_Handle h_FmPcd)53*852ba100SJustin Hibbits static void PcdPrsErrorException(t_Handle h_FmPcd)
54*852ba100SJustin Hibbits {
55*852ba100SJustin Hibbits     t_FmPcd                 *p_FmPcd = (t_FmPcd *)h_FmPcd;
56*852ba100SJustin Hibbits     uint32_t                event, ev_mask;
57*852ba100SJustin Hibbits     struct fman_prs_regs     *PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
58*852ba100SJustin Hibbits 
59*852ba100SJustin Hibbits     ASSERT_COND(p_FmPcd->guestId == NCSW_MASTER_ID);
60*852ba100SJustin Hibbits     ev_mask = fman_prs_get_err_ev_mask(PrsRegs);
61*852ba100SJustin Hibbits 
62*852ba100SJustin Hibbits     event = fman_prs_get_err_event(PrsRegs, ev_mask);
63*852ba100SJustin Hibbits 
64*852ba100SJustin Hibbits     fman_prs_ack_err_event(PrsRegs, event);
65*852ba100SJustin Hibbits 
66*852ba100SJustin Hibbits     DBG(TRACE, ("parser error - 0x%08x\n",event));
67*852ba100SJustin Hibbits 
68*852ba100SJustin Hibbits     if(event & FM_PCD_PRS_DOUBLE_ECC)
69*852ba100SJustin Hibbits         p_FmPcd->f_Exception(p_FmPcd->h_App,e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC);
70*852ba100SJustin Hibbits }
71*852ba100SJustin Hibbits 
PcdPrsException(t_Handle h_FmPcd)72*852ba100SJustin Hibbits static void PcdPrsException(t_Handle h_FmPcd)
73*852ba100SJustin Hibbits {
74*852ba100SJustin Hibbits     t_FmPcd             *p_FmPcd = (t_FmPcd *)h_FmPcd;
75*852ba100SJustin Hibbits     uint32_t            event, ev_mask;
76*852ba100SJustin Hibbits     struct fman_prs_regs     *PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
77*852ba100SJustin Hibbits 
78*852ba100SJustin Hibbits     ASSERT_COND(p_FmPcd->guestId == NCSW_MASTER_ID);
79*852ba100SJustin Hibbits     ev_mask = fman_prs_get_expt_ev_mask(PrsRegs);
80*852ba100SJustin Hibbits     event = fman_prs_get_expt_event(PrsRegs, ev_mask);
81*852ba100SJustin Hibbits 
82*852ba100SJustin Hibbits     ASSERT_COND(event & FM_PCD_PRS_SINGLE_ECC);
83*852ba100SJustin Hibbits 
84*852ba100SJustin Hibbits     DBG(TRACE, ("parser event - 0x%08x\n",event));
85*852ba100SJustin Hibbits 
86*852ba100SJustin Hibbits     fman_prs_ack_expt_event(PrsRegs, event);
87*852ba100SJustin Hibbits 
88*852ba100SJustin Hibbits     p_FmPcd->f_Exception(p_FmPcd->h_App,e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC);
89*852ba100SJustin Hibbits }
90*852ba100SJustin Hibbits 
PrsConfig(t_FmPcd * p_FmPcd,t_FmPcdParams * p_FmPcdParams)910aeed3e9SJustin Hibbits t_Handle PrsConfig(t_FmPcd *p_FmPcd,t_FmPcdParams *p_FmPcdParams)
920aeed3e9SJustin Hibbits {
930aeed3e9SJustin Hibbits     t_FmPcdPrs  *p_FmPcdPrs;
940aeed3e9SJustin Hibbits     uintptr_t   baseAddr;
950aeed3e9SJustin Hibbits 
960aeed3e9SJustin Hibbits     UNUSED(p_FmPcd);
970aeed3e9SJustin Hibbits     UNUSED(p_FmPcdParams);
980aeed3e9SJustin Hibbits 
990aeed3e9SJustin Hibbits     p_FmPcdPrs = (t_FmPcdPrs *) XX_Malloc(sizeof(t_FmPcdPrs));
1000aeed3e9SJustin Hibbits     if (!p_FmPcdPrs)
1010aeed3e9SJustin Hibbits     {
1020aeed3e9SJustin Hibbits         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Parser structure allocation FAILED"));
1030aeed3e9SJustin Hibbits         return NULL;
1040aeed3e9SJustin Hibbits     }
1050aeed3e9SJustin Hibbits     memset(p_FmPcdPrs, 0, sizeof(t_FmPcdPrs));
106*852ba100SJustin Hibbits     fman_prs_defconfig(&p_FmPcd->p_FmPcdDriverParam->dfltCfg);
1070aeed3e9SJustin Hibbits 
1080aeed3e9SJustin Hibbits     if (p_FmPcd->guestId == NCSW_MASTER_ID)
1090aeed3e9SJustin Hibbits     {
1100aeed3e9SJustin Hibbits         baseAddr = FmGetPcdPrsBaseAddr(p_FmPcdParams->h_Fm);
1110aeed3e9SJustin Hibbits         p_FmPcdPrs->p_SwPrsCode  = (uint32_t *)UINT_TO_PTR(baseAddr);
112*852ba100SJustin Hibbits         p_FmPcdPrs->p_FmPcdPrsRegs  = (struct fman_prs_regs *)UINT_TO_PTR(baseAddr + PRS_REGS_OFFSET);
1130aeed3e9SJustin Hibbits     }
1140aeed3e9SJustin Hibbits 
115*852ba100SJustin Hibbits     p_FmPcdPrs->fmPcdPrsPortIdStatistics = p_FmPcd->p_FmPcdDriverParam->dfltCfg.port_id_stat;
116*852ba100SJustin Hibbits     p_FmPcd->p_FmPcdDriverParam->prsMaxParseCycleLimit = p_FmPcd->p_FmPcdDriverParam->dfltCfg.max_prs_cyc_lim;
117*852ba100SJustin Hibbits     p_FmPcd->exceptions |= p_FmPcd->p_FmPcdDriverParam->dfltCfg.prs_exceptions;
1180aeed3e9SJustin Hibbits 
1190aeed3e9SJustin Hibbits     return p_FmPcdPrs;
1200aeed3e9SJustin Hibbits }
1210aeed3e9SJustin Hibbits 
122*852ba100SJustin Hibbits #if ((DPAA_VERSION == 10) && defined(FM_CAPWAP_SUPPORT))
123*852ba100SJustin Hibbits     static uint8_t             swPrsPatch[] = SW_PRS_UDP_LITE_PATCH;
124*852ba100SJustin Hibbits #else
125*852ba100SJustin Hibbits     static uint8_t             swPrsPatch[] = SW_PRS_OFFLOAD_PATCH;
126*852ba100SJustin Hibbits #endif /* FM_CAPWAP_SUPPORT */
1270aeed3e9SJustin Hibbits 
PrsInit(t_FmPcd * p_FmPcd)1280aeed3e9SJustin Hibbits t_Error PrsInit(t_FmPcd *p_FmPcd)
1290aeed3e9SJustin Hibbits {
1300aeed3e9SJustin Hibbits     t_FmPcdDriverParam  *p_Param = p_FmPcd->p_FmPcdDriverParam;
131*852ba100SJustin Hibbits     uint32_t            *p_TmpCode;
132*852ba100SJustin Hibbits     uint32_t            *p_LoadTarget = (uint32_t *)PTR_MOVE(p_FmPcd->p_FmPcdPrs->p_SwPrsCode,
133*852ba100SJustin Hibbits                                                              FM_PCD_SW_PRS_SIZE-FM_PCD_PRS_SW_PATCHES_SIZE);
134*852ba100SJustin Hibbits     struct fman_prs_regs *PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
135*852ba100SJustin Hibbits     uint32_t            i;
1360aeed3e9SJustin Hibbits 
137*852ba100SJustin Hibbits     ASSERT_COND(sizeof(swPrsPatch) <= (FM_PCD_PRS_SW_PATCHES_SIZE-FM_PCD_PRS_SW_TAIL_SIZE));
138*852ba100SJustin Hibbits 
139*852ba100SJustin Hibbits     /* nothing to do in guest-partition */
1400aeed3e9SJustin Hibbits     if (p_FmPcd->guestId != NCSW_MASTER_ID)
1410aeed3e9SJustin Hibbits         return E_OK;
1420aeed3e9SJustin Hibbits 
143*852ba100SJustin Hibbits     p_TmpCode = (uint32_t *)XX_MallocSmart(ROUND_UP(sizeof(swPrsPatch),4), 0, sizeof(uint32_t));
144*852ba100SJustin Hibbits     if (!p_TmpCode)
145*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Tmp Sw-Parser code allocation FAILED"));
146*852ba100SJustin Hibbits     memset((uint8_t *)p_TmpCode, 0, ROUND_UP(sizeof(swPrsPatch),4));
147*852ba100SJustin Hibbits     memcpy((uint8_t *)p_TmpCode, (uint8_t *)swPrsPatch, sizeof(swPrsPatch));
1480aeed3e9SJustin Hibbits 
149*852ba100SJustin Hibbits     fman_prs_init(PrsRegs, &p_Param->dfltCfg);
1500aeed3e9SJustin Hibbits 
1510aeed3e9SJustin Hibbits     /* register even if no interrupts enabled, to allow future enablement */
1520aeed3e9SJustin Hibbits     FmRegisterIntr(p_FmPcd->h_Fm, e_FM_MOD_PRS, 0, e_FM_INTR_TYPE_ERR, PcdPrsErrorException, p_FmPcd);
1530aeed3e9SJustin Hibbits 
1540aeed3e9SJustin Hibbits     /* register even if no interrupts enabled, to allow future enablement */
1550aeed3e9SJustin Hibbits     FmRegisterIntr(p_FmPcd->h_Fm, e_FM_MOD_PRS, 0, e_FM_INTR_TYPE_NORMAL, PcdPrsException, p_FmPcd);
1560aeed3e9SJustin Hibbits 
1570aeed3e9SJustin Hibbits     if(p_FmPcd->exceptions & FM_PCD_EX_PRS_SINGLE_ECC)
1580aeed3e9SJustin Hibbits         FmEnableRamsEcc(p_FmPcd->h_Fm);
1590aeed3e9SJustin Hibbits 
1600aeed3e9SJustin Hibbits     if(p_FmPcd->exceptions & FM_PCD_EX_PRS_DOUBLE_ECC)
1610aeed3e9SJustin Hibbits         FmEnableRamsEcc(p_FmPcd->h_Fm);
1620aeed3e9SJustin Hibbits 
163*852ba100SJustin Hibbits     /* load sw parser Ip-Frag patch */
164*852ba100SJustin Hibbits     for (i=0; i<DIV_CEIL(sizeof(swPrsPatch), 4); i++)
165*852ba100SJustin Hibbits         WRITE_UINT32(p_LoadTarget[i], GET_UINT32(p_TmpCode[i]));
1660aeed3e9SJustin Hibbits 
167*852ba100SJustin Hibbits     XX_FreeSmart(p_TmpCode);
1680aeed3e9SJustin Hibbits 
1690aeed3e9SJustin Hibbits     return E_OK;
1700aeed3e9SJustin Hibbits }
1710aeed3e9SJustin Hibbits 
PrsFree(t_FmPcd * p_FmPcd)1720aeed3e9SJustin Hibbits void PrsFree(t_FmPcd *p_FmPcd)
1730aeed3e9SJustin Hibbits {
1740aeed3e9SJustin Hibbits     ASSERT_COND(p_FmPcd->guestId == NCSW_MASTER_ID);
1750aeed3e9SJustin Hibbits     FmUnregisterIntr(p_FmPcd->h_Fm, e_FM_MOD_PRS, 0, e_FM_INTR_TYPE_ERR);
1760aeed3e9SJustin Hibbits     /* register even if no interrupts enabled, to allow future enablement */
1770aeed3e9SJustin Hibbits     FmUnregisterIntr(p_FmPcd->h_Fm, e_FM_MOD_PRS, 0, e_FM_INTR_TYPE_NORMAL);
1780aeed3e9SJustin Hibbits }
1790aeed3e9SJustin Hibbits 
PrsEnable(t_FmPcd * p_FmPcd)1800aeed3e9SJustin Hibbits void PrsEnable(t_FmPcd *p_FmPcd)
1810aeed3e9SJustin Hibbits {
182*852ba100SJustin Hibbits     struct fman_prs_regs *PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
1830aeed3e9SJustin Hibbits 
1840aeed3e9SJustin Hibbits     ASSERT_COND(p_FmPcd->guestId == NCSW_MASTER_ID);
185*852ba100SJustin Hibbits     fman_prs_enable(PrsRegs);
1860aeed3e9SJustin Hibbits }
1870aeed3e9SJustin Hibbits 
PrsDisable(t_FmPcd * p_FmPcd)1880aeed3e9SJustin Hibbits void PrsDisable(t_FmPcd *p_FmPcd)
1890aeed3e9SJustin Hibbits {
190*852ba100SJustin Hibbits     struct fman_prs_regs *PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
1910aeed3e9SJustin Hibbits 
1920aeed3e9SJustin Hibbits     ASSERT_COND(p_FmPcd->guestId == NCSW_MASTER_ID);
193*852ba100SJustin Hibbits     fman_prs_disable(PrsRegs);
194*852ba100SJustin Hibbits }
195*852ba100SJustin Hibbits 
PrsIsEnabled(t_FmPcd * p_FmPcd)196*852ba100SJustin Hibbits int PrsIsEnabled(t_FmPcd *p_FmPcd)
197*852ba100SJustin Hibbits {
198*852ba100SJustin Hibbits     struct fman_prs_regs *PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
199*852ba100SJustin Hibbits 
200*852ba100SJustin Hibbits     ASSERT_COND(p_FmPcd->guestId == NCSW_MASTER_ID);
201*852ba100SJustin Hibbits     return fman_prs_is_enabled(PrsRegs);
2020aeed3e9SJustin Hibbits }
2030aeed3e9SJustin Hibbits 
PrsIncludePortInStatistics(t_FmPcd * p_FmPcd,uint8_t hardwarePortId,bool include)2040aeed3e9SJustin Hibbits t_Error PrsIncludePortInStatistics(t_FmPcd *p_FmPcd, uint8_t hardwarePortId, bool include)
2050aeed3e9SJustin Hibbits {
206*852ba100SJustin Hibbits     struct fman_prs_regs *PrsRegs;
2070aeed3e9SJustin Hibbits     uint32_t    bitMask = 0;
2080aeed3e9SJustin Hibbits     uint8_t     prsPortId;
2090aeed3e9SJustin Hibbits 
2100aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR((hardwarePortId >=1 && hardwarePortId <= 16), E_INVALID_VALUE);
2110aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
2120aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdPrs, E_INVALID_HANDLE);
2130aeed3e9SJustin Hibbits 
214*852ba100SJustin Hibbits     PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
215*852ba100SJustin Hibbits 
2160aeed3e9SJustin Hibbits     GET_FM_PCD_PRS_PORT_ID(prsPortId, hardwarePortId);
2170aeed3e9SJustin Hibbits     GET_FM_PCD_INDEX_FLAG(bitMask, prsPortId);
2180aeed3e9SJustin Hibbits 
2190aeed3e9SJustin Hibbits     if (include)
2200aeed3e9SJustin Hibbits         p_FmPcd->p_FmPcdPrs->fmPcdPrsPortIdStatistics |= bitMask;
2210aeed3e9SJustin Hibbits     else
2220aeed3e9SJustin Hibbits         p_FmPcd->p_FmPcdPrs->fmPcdPrsPortIdStatistics &= ~bitMask;
2230aeed3e9SJustin Hibbits 
224*852ba100SJustin Hibbits     fman_prs_set_stst_port_msk(PrsRegs,
225*852ba100SJustin Hibbits             p_FmPcd->p_FmPcdPrs->fmPcdPrsPortIdStatistics);
2260aeed3e9SJustin Hibbits 
2270aeed3e9SJustin Hibbits     return E_OK;
2280aeed3e9SJustin Hibbits }
2290aeed3e9SJustin Hibbits 
FmPcdPrsIncludePortInStatistics(t_Handle h_FmPcd,uint8_t hardwarePortId,bool include)2300aeed3e9SJustin Hibbits t_Error FmPcdPrsIncludePortInStatistics(t_Handle h_FmPcd, uint8_t hardwarePortId, bool include)
2310aeed3e9SJustin Hibbits {
2320aeed3e9SJustin Hibbits     t_FmPcd                     *p_FmPcd = (t_FmPcd *)h_FmPcd;
2330aeed3e9SJustin Hibbits     t_Error                     err;
2340aeed3e9SJustin Hibbits 
2350aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR((hardwarePortId >=1 && hardwarePortId <= 16), E_INVALID_VALUE);
2360aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
2370aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdPrs, E_INVALID_HANDLE);
2380aeed3e9SJustin Hibbits 
239*852ba100SJustin Hibbits     if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
240*852ba100SJustin Hibbits         p_FmPcd->h_IpcSession)
2410aeed3e9SJustin Hibbits     {
242*852ba100SJustin Hibbits         t_FmPcdIpcPrsIncludePort    prsIncludePortParams;
243*852ba100SJustin Hibbits         t_FmPcdIpcMsg               msg;
244*852ba100SJustin Hibbits 
2450aeed3e9SJustin Hibbits         prsIncludePortParams.hardwarePortId = hardwarePortId;
2460aeed3e9SJustin Hibbits         prsIncludePortParams.include = include;
2470aeed3e9SJustin Hibbits         memset(&msg, 0, sizeof(msg));
2480aeed3e9SJustin Hibbits         msg.msgId = FM_PCD_PRS_INC_PORT_STATS;
2490aeed3e9SJustin Hibbits         memcpy(msg.msgBody, &prsIncludePortParams, sizeof(prsIncludePortParams));
250*852ba100SJustin Hibbits         err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
2510aeed3e9SJustin Hibbits                                 (uint8_t*)&msg,
2520aeed3e9SJustin Hibbits                                 sizeof(msg.msgId) +sizeof(prsIncludePortParams),
2530aeed3e9SJustin Hibbits                                 NULL,
2540aeed3e9SJustin Hibbits                                 NULL,
2550aeed3e9SJustin Hibbits                                 NULL,
256*852ba100SJustin Hibbits                                 NULL);
257*852ba100SJustin Hibbits         if (err != E_OK)
2580aeed3e9SJustin Hibbits             RETURN_ERROR(MAJOR, err, NO_MSG);
2590aeed3e9SJustin Hibbits         return E_OK;
2600aeed3e9SJustin Hibbits     }
261*852ba100SJustin Hibbits     else if (p_FmPcd->guestId != NCSW_MASTER_ID)
262*852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
263*852ba100SJustin Hibbits                      ("running in guest-mode without IPC!"));
264*852ba100SJustin Hibbits 
2650aeed3e9SJustin Hibbits     return PrsIncludePortInStatistics(p_FmPcd, hardwarePortId, include);
2660aeed3e9SJustin Hibbits }
2670aeed3e9SJustin Hibbits 
FmPcdGetSwPrsOffset(t_Handle h_FmPcd,e_NetHeaderType hdr,uint8_t indexPerHdr)2680aeed3e9SJustin Hibbits uint32_t FmPcdGetSwPrsOffset(t_Handle h_FmPcd, e_NetHeaderType hdr, uint8_t indexPerHdr)
2690aeed3e9SJustin Hibbits {
2700aeed3e9SJustin Hibbits     t_FmPcd                 *p_FmPcd = (t_FmPcd *)h_FmPcd;
271*852ba100SJustin Hibbits     t_FmPcdPrsLabelParams   *p_Label;
272*852ba100SJustin Hibbits     int                     i;
273*852ba100SJustin Hibbits 
274*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(p_FmPcd, E_INVALID_HANDLE, 0);
275*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE, 0);
276*852ba100SJustin Hibbits 
277*852ba100SJustin Hibbits     if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
278*852ba100SJustin Hibbits         p_FmPcd->h_IpcSession)
279*852ba100SJustin Hibbits     {
2800aeed3e9SJustin Hibbits         t_Error                 err = E_OK;
2810aeed3e9SJustin Hibbits         t_FmPcdIpcSwPrsLable    labelParams;
2820aeed3e9SJustin Hibbits         t_FmPcdIpcMsg           msg;
2830aeed3e9SJustin Hibbits         uint32_t                prsOffset = 0;
2840aeed3e9SJustin Hibbits         t_FmPcdIpcReply         reply;
2850aeed3e9SJustin Hibbits         uint32_t                replyLength;
2860aeed3e9SJustin Hibbits 
2870aeed3e9SJustin Hibbits         memset(&reply, 0, sizeof(reply));
2880aeed3e9SJustin Hibbits         memset(&msg, 0, sizeof(msg));
2890aeed3e9SJustin Hibbits         labelParams.enumHdr = (uint32_t)hdr;
2900aeed3e9SJustin Hibbits         labelParams.indexPerHdr = indexPerHdr;
2910aeed3e9SJustin Hibbits         msg.msgId = FM_PCD_GET_SW_PRS_OFFSET;
2920aeed3e9SJustin Hibbits         memcpy(msg.msgBody, &labelParams, sizeof(labelParams));
2930aeed3e9SJustin Hibbits         replyLength = sizeof(uint32_t) + sizeof(uint32_t);
294*852ba100SJustin Hibbits         err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
2950aeed3e9SJustin Hibbits                                 (uint8_t*)&msg,
2960aeed3e9SJustin Hibbits                                 sizeof(msg.msgId) +sizeof(labelParams),
2970aeed3e9SJustin Hibbits                                 (uint8_t*)&reply,
2980aeed3e9SJustin Hibbits                                 &replyLength,
2990aeed3e9SJustin Hibbits                                 NULL,
300*852ba100SJustin Hibbits                                 NULL);
301*852ba100SJustin Hibbits         if (err != E_OK)
3020aeed3e9SJustin Hibbits             RETURN_ERROR(MAJOR, err, NO_MSG);
3030aeed3e9SJustin Hibbits         if (replyLength != sizeof(uint32_t) + sizeof(uint32_t))
3040aeed3e9SJustin Hibbits             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
3050aeed3e9SJustin Hibbits 
3060aeed3e9SJustin Hibbits         memcpy((uint8_t*)&prsOffset, reply.replyBody, sizeof(uint32_t));
3070aeed3e9SJustin Hibbits         return prsOffset;
3080aeed3e9SJustin Hibbits     }
309*852ba100SJustin Hibbits     else if (p_FmPcd->guestId != NCSW_MASTER_ID)
310*852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
311*852ba100SJustin Hibbits                      ("running in guest-mode without IPC!"));
3120aeed3e9SJustin Hibbits 
313*852ba100SJustin Hibbits     ASSERT_COND(p_FmPcd->p_FmPcdPrs->currLabel < FM_PCD_PRS_NUM_OF_LABELS);
314*852ba100SJustin Hibbits 
315*852ba100SJustin Hibbits     for (i=0; i<p_FmPcd->p_FmPcdPrs->currLabel; i++)
316*852ba100SJustin Hibbits     {
317*852ba100SJustin Hibbits         p_Label = &p_FmPcd->p_FmPcdPrs->labelsTable[i];
318*852ba100SJustin Hibbits 
319*852ba100SJustin Hibbits         if ((hdr == p_Label->hdr) && (indexPerHdr == p_Label->indexPerHdr))
320*852ba100SJustin Hibbits             return p_Label->instructionOffset;
321*852ba100SJustin Hibbits     }
322*852ba100SJustin Hibbits 
323*852ba100SJustin Hibbits     REPORT_ERROR(MAJOR, E_NOT_FOUND, ("Sw Parser attachment Not found"));
324*852ba100SJustin Hibbits     return (uint32_t)ILLEGAL_BASE;
3250aeed3e9SJustin Hibbits }
3260aeed3e9SJustin Hibbits 
FM_PCD_SetPrsStatistics(t_Handle h_FmPcd,bool enable)3270aeed3e9SJustin Hibbits void FM_PCD_SetPrsStatistics(t_Handle h_FmPcd, bool enable)
3280aeed3e9SJustin Hibbits {
3290aeed3e9SJustin Hibbits     t_FmPcd             *p_FmPcd = (t_FmPcd*)h_FmPcd;
330*852ba100SJustin Hibbits     struct fman_prs_regs *PrsRegs;
3310aeed3e9SJustin Hibbits 
3320aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN(p_FmPcd, E_INVALID_HANDLE);
3330aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN(p_FmPcd->p_FmPcdPrs, E_INVALID_HANDLE);
3340aeed3e9SJustin Hibbits 
335*852ba100SJustin Hibbits     PrsRegs = (struct fman_prs_regs *)p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs;
336*852ba100SJustin Hibbits 
337*852ba100SJustin Hibbits 
3380aeed3e9SJustin Hibbits     if(p_FmPcd->guestId != NCSW_MASTER_ID)
3390aeed3e9SJustin Hibbits     {
3400aeed3e9SJustin Hibbits         REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_SetPrsStatistics - guest mode!"));
3410aeed3e9SJustin Hibbits         return;
3420aeed3e9SJustin Hibbits     }
3430aeed3e9SJustin Hibbits 
344*852ba100SJustin Hibbits     fman_prs_set_stst(PrsRegs, enable);
3450aeed3e9SJustin Hibbits }
3460aeed3e9SJustin Hibbits 
FM_PCD_PrsLoadSw(t_Handle h_FmPcd,t_FmPcdPrsSwParams * p_SwPrs)3470aeed3e9SJustin Hibbits t_Error FM_PCD_PrsLoadSw(t_Handle h_FmPcd, t_FmPcdPrsSwParams *p_SwPrs)
3480aeed3e9SJustin Hibbits {
3490aeed3e9SJustin Hibbits     t_FmPcd                 *p_FmPcd = (t_FmPcd*)h_FmPcd;
350*852ba100SJustin Hibbits     uint32_t                *p_LoadTarget;
351*852ba100SJustin Hibbits     uint32_t                *p_TmpCode;
352*852ba100SJustin Hibbits     int                     i;
3530aeed3e9SJustin Hibbits 
3540aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
3550aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
3560aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdPrs, E_INVALID_STATE);
3570aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_SwPrs, E_INVALID_HANDLE);
3580aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(!p_FmPcd->enabled, E_INVALID_HANDLE);
3590aeed3e9SJustin Hibbits 
3600aeed3e9SJustin Hibbits     if (p_FmPcd->guestId != NCSW_MASTER_ID)
361*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM in guest-mode!"));
3620aeed3e9SJustin Hibbits 
3630aeed3e9SJustin Hibbits     if (!p_SwPrs->override)
3640aeed3e9SJustin Hibbits     {
3650aeed3e9SJustin Hibbits         if(p_FmPcd->p_FmPcdPrs->p_CurrSwPrs > p_FmPcd->p_FmPcdPrs->p_SwPrsCode + p_SwPrs->base*2/4)
3660aeed3e9SJustin Hibbits             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("SW parser base must be larger than current loaded code"));
3670aeed3e9SJustin Hibbits     }
368*852ba100SJustin Hibbits     else
369*852ba100SJustin Hibbits         p_FmPcd->p_FmPcdPrs->currLabel = 0;
370*852ba100SJustin Hibbits 
3710aeed3e9SJustin Hibbits     if (p_SwPrs->size > FM_PCD_SW_PRS_SIZE - FM_PCD_PRS_SW_TAIL_SIZE - p_SwPrs->base*2)
3720aeed3e9SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("p_SwPrs->size may not be larger than MAX_SW_PRS_CODE_SIZE"));
3730aeed3e9SJustin Hibbits 
3740aeed3e9SJustin Hibbits     if (p_FmPcd->p_FmPcdPrs->currLabel + p_SwPrs->numOfLabels > FM_PCD_PRS_NUM_OF_LABELS)
3750aeed3e9SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceeded number of labels allowed "));
376*852ba100SJustin Hibbits 
377*852ba100SJustin Hibbits     p_TmpCode = (uint32_t *)XX_MallocSmart(ROUND_UP(p_SwPrs->size,4), 0, sizeof(uint32_t));
378*852ba100SJustin Hibbits     if (!p_TmpCode)
379*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Tmp Sw-Parser code allocation FAILED"));
380*852ba100SJustin Hibbits     memset((uint8_t *)p_TmpCode, 0, ROUND_UP(p_SwPrs->size,4));
381*852ba100SJustin Hibbits     memcpy((uint8_t *)p_TmpCode, p_SwPrs->p_Code, p_SwPrs->size);
382*852ba100SJustin Hibbits 
383*852ba100SJustin Hibbits     /* save sw parser labels */
384*852ba100SJustin Hibbits     memcpy(&p_FmPcd->p_FmPcdPrs->labelsTable[p_FmPcd->p_FmPcdPrs->currLabel],
385*852ba100SJustin Hibbits            p_SwPrs->labelsTable,
386*852ba100SJustin Hibbits            p_SwPrs->numOfLabels*sizeof(t_FmPcdPrsLabelParams));
3870aeed3e9SJustin Hibbits     p_FmPcd->p_FmPcdPrs->currLabel += p_SwPrs->numOfLabels;
388*852ba100SJustin Hibbits 
3890aeed3e9SJustin Hibbits     /* load sw parser code */
3900aeed3e9SJustin Hibbits     p_LoadTarget = p_FmPcd->p_FmPcdPrs->p_SwPrsCode + p_SwPrs->base*2/4;
391*852ba100SJustin Hibbits 
392*852ba100SJustin Hibbits     for(i=0; i<DIV_CEIL(p_SwPrs->size, 4); i++)
393*852ba100SJustin Hibbits         WRITE_UINT32(p_LoadTarget[i], GET_UINT32(p_TmpCode[i]));
394*852ba100SJustin Hibbits 
395*852ba100SJustin Hibbits     p_FmPcd->p_FmPcdPrs->p_CurrSwPrs =
396*852ba100SJustin Hibbits         p_FmPcd->p_FmPcdPrs->p_SwPrsCode + p_SwPrs->base*2/4 + ROUND_UP(p_SwPrs->size,4);
3970aeed3e9SJustin Hibbits 
3980aeed3e9SJustin Hibbits     /* copy data parameters */
3990aeed3e9SJustin Hibbits     for (i=0;i<FM_PCD_PRS_NUM_OF_HDRS;i++)
4000aeed3e9SJustin Hibbits         WRITE_UINT32(*(p_FmPcd->p_FmPcdPrs->p_SwPrsCode+PRS_SW_DATA/4+i), p_SwPrs->swPrsDataParams[i]);
4010aeed3e9SJustin Hibbits 
4020aeed3e9SJustin Hibbits     /* Clear last 4 bytes */
4030aeed3e9SJustin Hibbits     WRITE_UINT32(*(p_FmPcd->p_FmPcdPrs->p_SwPrsCode+(PRS_SW_DATA-FM_PCD_PRS_SW_TAIL_SIZE)/4), 0);
4040aeed3e9SJustin Hibbits 
405*852ba100SJustin Hibbits     XX_FreeSmart(p_TmpCode);
406*852ba100SJustin Hibbits 
4070aeed3e9SJustin Hibbits     return E_OK;
4080aeed3e9SJustin Hibbits }
4090aeed3e9SJustin Hibbits 
FM_PCD_ConfigPrsMaxCycleLimit(t_Handle h_FmPcd,uint16_t value)4100aeed3e9SJustin Hibbits t_Error FM_PCD_ConfigPrsMaxCycleLimit(t_Handle h_FmPcd,uint16_t value)
4110aeed3e9SJustin Hibbits {
4120aeed3e9SJustin Hibbits     t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
4130aeed3e9SJustin Hibbits 
4140aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
4150aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE);
4160aeed3e9SJustin Hibbits 
4170aeed3e9SJustin Hibbits     if(p_FmPcd->guestId != NCSW_MASTER_ID)
4180aeed3e9SJustin Hibbits         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ConfigPrsMaxCycleLimit - guest mode!"));
4190aeed3e9SJustin Hibbits 
4200aeed3e9SJustin Hibbits     p_FmPcd->p_FmPcdDriverParam->prsMaxParseCycleLimit = value;
4210aeed3e9SJustin Hibbits 
4220aeed3e9SJustin Hibbits     return E_OK;
4230aeed3e9SJustin Hibbits }
424