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