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 *//***************************************************************************/
390aeed3e9SJustin Hibbits #include "std_ext.h"
400aeed3e9SJustin Hibbits #include "error_ext.h"
410aeed3e9SJustin Hibbits #include "string_ext.h"
420aeed3e9SJustin Hibbits #include "xx_ext.h"
430aeed3e9SJustin Hibbits #include "sprint_ext.h"
440aeed3e9SJustin Hibbits #include "debug_ext.h"
450aeed3e9SJustin Hibbits #include "net_ext.h"
460aeed3e9SJustin Hibbits #include "fm_ext.h"
470aeed3e9SJustin Hibbits #include "fm_pcd_ext.h"
480aeed3e9SJustin Hibbits
490aeed3e9SJustin Hibbits #include "fm_common.h"
500aeed3e9SJustin Hibbits #include "fm_pcd.h"
510aeed3e9SJustin Hibbits #include "fm_pcd_ipc.h"
520aeed3e9SJustin Hibbits #include "fm_hc.h"
53*852ba100SJustin Hibbits #include "fm_muram_ext.h"
540aeed3e9SJustin Hibbits
550aeed3e9SJustin Hibbits
56*852ba100SJustin Hibbits /****************************************/
57*852ba100SJustin Hibbits /* static functions */
58*852ba100SJustin Hibbits /****************************************/
59*852ba100SJustin Hibbits
CheckFmPcdParameters(t_FmPcd * p_FmPcd)600aeed3e9SJustin Hibbits static t_Error CheckFmPcdParameters(t_FmPcd *p_FmPcd)
610aeed3e9SJustin Hibbits {
620aeed3e9SJustin Hibbits if (!p_FmPcd->h_Fm)
630aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("h_Fm has to be initialized"));
640aeed3e9SJustin Hibbits
650aeed3e9SJustin Hibbits if (p_FmPcd->guestId == NCSW_MASTER_ID)
660aeed3e9SJustin Hibbits {
670aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdKg && !p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs)
680aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something WRONG"));
690aeed3e9SJustin Hibbits
700aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdPlcr && !p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs)
710aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something WRONG"));
720aeed3e9SJustin Hibbits
730aeed3e9SJustin Hibbits if (!p_FmPcd->f_Exception)
740aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("f_FmPcdExceptions has to be initialized"));
750aeed3e9SJustin Hibbits
760aeed3e9SJustin Hibbits if ((!p_FmPcd->f_FmPcdIndexedException) && (p_FmPcd->p_FmPcdPlcr || p_FmPcd->p_FmPcdKg))
770aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("f_FmPcdIndexedException has to be initialized"));
780aeed3e9SJustin Hibbits
790aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdDriverParam->prsMaxParseCycleLimit > PRS_MAX_CYCLE_LIMIT)
800aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("prsMaxParseCycleLimit has to be less than 8191"));
810aeed3e9SJustin Hibbits }
820aeed3e9SJustin Hibbits
830aeed3e9SJustin Hibbits return E_OK;
840aeed3e9SJustin Hibbits }
850aeed3e9SJustin Hibbits
860aeed3e9SJustin Hibbits static volatile bool blockingFlag = FALSE;
IpcMsgCompletionCB(t_Handle h_FmPcd,uint8_t * p_Msg,uint8_t * p_Reply,uint32_t replyLength,t_Error status)87*852ba100SJustin Hibbits static void IpcMsgCompletionCB(t_Handle h_FmPcd,
880aeed3e9SJustin Hibbits uint8_t *p_Msg,
890aeed3e9SJustin Hibbits uint8_t *p_Reply,
900aeed3e9SJustin Hibbits uint32_t replyLength,
910aeed3e9SJustin Hibbits t_Error status)
920aeed3e9SJustin Hibbits {
930aeed3e9SJustin Hibbits UNUSED(h_FmPcd);UNUSED(p_Msg);UNUSED(p_Reply);UNUSED(replyLength);UNUSED(status);
940aeed3e9SJustin Hibbits blockingFlag = FALSE;
950aeed3e9SJustin Hibbits }
960aeed3e9SJustin Hibbits
IpcMsgHandlerCB(t_Handle h_FmPcd,uint8_t * p_Msg,uint32_t msgLength,uint8_t * p_Reply,uint32_t * p_ReplyLength)97*852ba100SJustin Hibbits static t_Error IpcMsgHandlerCB(t_Handle h_FmPcd,
980aeed3e9SJustin Hibbits uint8_t *p_Msg,
990aeed3e9SJustin Hibbits uint32_t msgLength,
1000aeed3e9SJustin Hibbits uint8_t *p_Reply,
1010aeed3e9SJustin Hibbits uint32_t *p_ReplyLength)
1020aeed3e9SJustin Hibbits {
1030aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
1040aeed3e9SJustin Hibbits t_Error err = E_OK;
1050aeed3e9SJustin Hibbits t_FmPcdIpcMsg *p_IpcMsg = (t_FmPcdIpcMsg*)p_Msg;
1060aeed3e9SJustin Hibbits t_FmPcdIpcReply *p_IpcReply = (t_FmPcdIpcReply*)p_Reply;
1070aeed3e9SJustin Hibbits
1080aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
1090aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR((msgLength >= sizeof(uint32_t)), E_INVALID_VALUE);
1100aeed3e9SJustin Hibbits
1110aeed3e9SJustin Hibbits #ifdef DISABLE_SANITY_CHECKS
1120aeed3e9SJustin Hibbits UNUSED(msgLength);
1130aeed3e9SJustin Hibbits #endif /* DISABLE_SANITY_CHECKS */
1140aeed3e9SJustin Hibbits
1150aeed3e9SJustin Hibbits ASSERT_COND(p_Msg);
1160aeed3e9SJustin Hibbits
1170aeed3e9SJustin Hibbits memset(p_IpcReply, 0, (sizeof(uint8_t) * FM_PCD_MAX_REPLY_SIZE));
1180aeed3e9SJustin Hibbits *p_ReplyLength = 0;
1190aeed3e9SJustin Hibbits
1200aeed3e9SJustin Hibbits switch (p_IpcMsg->msgId)
1210aeed3e9SJustin Hibbits {
1220aeed3e9SJustin Hibbits case (FM_PCD_MASTER_IS_ALIVE):
1230aeed3e9SJustin Hibbits *(uint8_t*)(p_IpcReply->replyBody) = 1;
1240aeed3e9SJustin Hibbits p_IpcReply->error = E_OK;
1250aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
1260aeed3e9SJustin Hibbits break;
1270aeed3e9SJustin Hibbits case (FM_PCD_MASTER_IS_ENABLED):
1280aeed3e9SJustin Hibbits /* count partitions registrations */
1290aeed3e9SJustin Hibbits if (p_FmPcd->enabled)
1300aeed3e9SJustin Hibbits p_FmPcd->numOfEnabledGuestPartitionsPcds++;
1310aeed3e9SJustin Hibbits *(uint8_t*)(p_IpcReply->replyBody) = (uint8_t)p_FmPcd->enabled;
1320aeed3e9SJustin Hibbits p_IpcReply->error = E_OK;
1330aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
1340aeed3e9SJustin Hibbits break;
1350aeed3e9SJustin Hibbits case (FM_PCD_GUEST_DISABLE):
1360aeed3e9SJustin Hibbits if (p_FmPcd->numOfEnabledGuestPartitionsPcds)
1370aeed3e9SJustin Hibbits {
1380aeed3e9SJustin Hibbits p_FmPcd->numOfEnabledGuestPartitionsPcds--;
1390aeed3e9SJustin Hibbits p_IpcReply->error = E_OK;
1400aeed3e9SJustin Hibbits }
1410aeed3e9SJustin Hibbits else
1420aeed3e9SJustin Hibbits {
1430aeed3e9SJustin Hibbits REPORT_ERROR(MINOR, E_INVALID_STATE,("Trying to disable an unregistered partition"));
1440aeed3e9SJustin Hibbits p_IpcReply->error = E_INVALID_STATE;
1450aeed3e9SJustin Hibbits }
1460aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t);
1470aeed3e9SJustin Hibbits break;
1480aeed3e9SJustin Hibbits case (FM_PCD_GET_COUNTER):
1490aeed3e9SJustin Hibbits {
1500aeed3e9SJustin Hibbits e_FmPcdCounters inCounter;
1510aeed3e9SJustin Hibbits uint32_t outCounter;
1520aeed3e9SJustin Hibbits
1530aeed3e9SJustin Hibbits memcpy((uint8_t*)&inCounter, p_IpcMsg->msgBody, sizeof(uint32_t));
1540aeed3e9SJustin Hibbits outCounter = FM_PCD_GetCounter(h_FmPcd, inCounter);
1550aeed3e9SJustin Hibbits memcpy(p_IpcReply->replyBody, (uint8_t*)&outCounter, sizeof(uint32_t));
1560aeed3e9SJustin Hibbits p_IpcReply->error = E_OK;
1570aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);
1580aeed3e9SJustin Hibbits break;
1590aeed3e9SJustin Hibbits }
1600aeed3e9SJustin Hibbits case (FM_PCD_ALLOC_KG_SCHEMES):
1610aeed3e9SJustin Hibbits {
1620aeed3e9SJustin Hibbits t_FmPcdIpcKgSchemesParams ipcSchemesParams;
1630aeed3e9SJustin Hibbits
1640aeed3e9SJustin Hibbits memcpy((uint8_t*)&ipcSchemesParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgSchemesParams));
1650aeed3e9SJustin Hibbits err = FmPcdKgAllocSchemes(h_FmPcd,
1660aeed3e9SJustin Hibbits ipcSchemesParams.numOfSchemes,
1670aeed3e9SJustin Hibbits ipcSchemesParams.guestId,
1680aeed3e9SJustin Hibbits p_IpcReply->replyBody);
1690aeed3e9SJustin Hibbits p_IpcReply->error = err;
1700aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t) + ipcSchemesParams.numOfSchemes*sizeof(uint8_t);
1710aeed3e9SJustin Hibbits break;
1720aeed3e9SJustin Hibbits }
1730aeed3e9SJustin Hibbits case (FM_PCD_FREE_KG_SCHEMES):
1740aeed3e9SJustin Hibbits {
1750aeed3e9SJustin Hibbits t_FmPcdIpcKgSchemesParams ipcSchemesParams;
1760aeed3e9SJustin Hibbits
1770aeed3e9SJustin Hibbits memcpy((uint8_t*)&ipcSchemesParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgSchemesParams));
1780aeed3e9SJustin Hibbits err = FmPcdKgFreeSchemes(h_FmPcd,
1790aeed3e9SJustin Hibbits ipcSchemesParams.numOfSchemes,
1800aeed3e9SJustin Hibbits ipcSchemesParams.guestId,
1810aeed3e9SJustin Hibbits ipcSchemesParams.schemesIds);
1820aeed3e9SJustin Hibbits p_IpcReply->error = err;
1830aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t);
1840aeed3e9SJustin Hibbits break;
1850aeed3e9SJustin Hibbits }
1860aeed3e9SJustin Hibbits case (FM_PCD_ALLOC_KG_CLSPLAN):
1870aeed3e9SJustin Hibbits {
1880aeed3e9SJustin Hibbits t_FmPcdIpcKgClsPlanParams ipcKgClsPlanParams;
1890aeed3e9SJustin Hibbits
1900aeed3e9SJustin Hibbits memcpy((uint8_t*)&ipcKgClsPlanParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgClsPlanParams));
1910aeed3e9SJustin Hibbits err = KgAllocClsPlanEntries(h_FmPcd,
1920aeed3e9SJustin Hibbits ipcKgClsPlanParams.numOfClsPlanEntries,
1930aeed3e9SJustin Hibbits ipcKgClsPlanParams.guestId,
1940aeed3e9SJustin Hibbits p_IpcReply->replyBody);
1950aeed3e9SJustin Hibbits p_IpcReply->error = err;
1960aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
1970aeed3e9SJustin Hibbits break;
1980aeed3e9SJustin Hibbits }
1990aeed3e9SJustin Hibbits case (FM_PCD_FREE_KG_CLSPLAN):
2000aeed3e9SJustin Hibbits {
2010aeed3e9SJustin Hibbits t_FmPcdIpcKgClsPlanParams ipcKgClsPlanParams;
2020aeed3e9SJustin Hibbits
2030aeed3e9SJustin Hibbits memcpy((uint8_t*)&ipcKgClsPlanParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgClsPlanParams));
2040aeed3e9SJustin Hibbits KgFreeClsPlanEntries(h_FmPcd,
2050aeed3e9SJustin Hibbits ipcKgClsPlanParams.numOfClsPlanEntries,
2060aeed3e9SJustin Hibbits ipcKgClsPlanParams.guestId,
2070aeed3e9SJustin Hibbits ipcKgClsPlanParams.clsPlanBase);
2080aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t);
2090aeed3e9SJustin Hibbits break;
2100aeed3e9SJustin Hibbits }
2110aeed3e9SJustin Hibbits case (FM_PCD_ALLOC_PROFILES):
2120aeed3e9SJustin Hibbits {
213*852ba100SJustin Hibbits t_FmIpcResourceAllocParams ipcAllocParams;
214*852ba100SJustin Hibbits uint16_t base;
215*852ba100SJustin Hibbits memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
216*852ba100SJustin Hibbits base = PlcrAllocProfilesForPartition(h_FmPcd,
217*852ba100SJustin Hibbits ipcAllocParams.base,
218*852ba100SJustin Hibbits ipcAllocParams.num,
219*852ba100SJustin Hibbits ipcAllocParams.guestId);
220*852ba100SJustin Hibbits memcpy(p_IpcReply->replyBody, (uint16_t*)&base, sizeof(uint16_t));
2210aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint16_t);
2220aeed3e9SJustin Hibbits break;
2230aeed3e9SJustin Hibbits }
2240aeed3e9SJustin Hibbits case (FM_PCD_FREE_PROFILES):
2250aeed3e9SJustin Hibbits {
226*852ba100SJustin Hibbits t_FmIpcResourceAllocParams ipcAllocParams;
227*852ba100SJustin Hibbits memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
228*852ba100SJustin Hibbits PlcrFreeProfilesForPartition(h_FmPcd,
229*852ba100SJustin Hibbits ipcAllocParams.base,
230*852ba100SJustin Hibbits ipcAllocParams.num,
231*852ba100SJustin Hibbits ipcAllocParams.guestId);
2320aeed3e9SJustin Hibbits break;
2330aeed3e9SJustin Hibbits }
234*852ba100SJustin Hibbits case (FM_PCD_SET_PORT_PROFILES):
2350aeed3e9SJustin Hibbits {
236*852ba100SJustin Hibbits t_FmIpcResourceAllocParams ipcAllocParams;
237*852ba100SJustin Hibbits memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
238*852ba100SJustin Hibbits PlcrSetPortProfiles(h_FmPcd,
239*852ba100SJustin Hibbits ipcAllocParams.guestId,
240*852ba100SJustin Hibbits ipcAllocParams.num,
241*852ba100SJustin Hibbits ipcAllocParams.base);
2420aeed3e9SJustin Hibbits break;
2430aeed3e9SJustin Hibbits }
244*852ba100SJustin Hibbits case (FM_PCD_CLEAR_PORT_PROFILES):
2450aeed3e9SJustin Hibbits {
246*852ba100SJustin Hibbits t_FmIpcResourceAllocParams ipcAllocParams;
247*852ba100SJustin Hibbits memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
248*852ba100SJustin Hibbits PlcrClearPortProfiles(h_FmPcd,
249*852ba100SJustin Hibbits ipcAllocParams.guestId);
2500aeed3e9SJustin Hibbits break;
2510aeed3e9SJustin Hibbits }
2520aeed3e9SJustin Hibbits case (FM_PCD_GET_SW_PRS_OFFSET):
2530aeed3e9SJustin Hibbits {
2540aeed3e9SJustin Hibbits t_FmPcdIpcSwPrsLable ipcSwPrsLable;
2550aeed3e9SJustin Hibbits uint32_t swPrsOffset;
2560aeed3e9SJustin Hibbits
2570aeed3e9SJustin Hibbits memcpy((uint8_t*)&ipcSwPrsLable, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcSwPrsLable));
2580aeed3e9SJustin Hibbits swPrsOffset =
2590aeed3e9SJustin Hibbits FmPcdGetSwPrsOffset(h_FmPcd,
2600aeed3e9SJustin Hibbits (e_NetHeaderType)ipcSwPrsLable.enumHdr,
2610aeed3e9SJustin Hibbits ipcSwPrsLable.indexPerHdr);
2620aeed3e9SJustin Hibbits memcpy(p_IpcReply->replyBody, (uint8_t*)&swPrsOffset, sizeof(uint32_t));
2630aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);
2640aeed3e9SJustin Hibbits break;
2650aeed3e9SJustin Hibbits }
2660aeed3e9SJustin Hibbits case (FM_PCD_PRS_INC_PORT_STATS):
2670aeed3e9SJustin Hibbits {
2680aeed3e9SJustin Hibbits t_FmPcdIpcPrsIncludePort ipcPrsIncludePort;
2690aeed3e9SJustin Hibbits
2700aeed3e9SJustin Hibbits memcpy((uint8_t*)&ipcPrsIncludePort, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcPrsIncludePort));
2710aeed3e9SJustin Hibbits PrsIncludePortInStatistics(h_FmPcd,
2720aeed3e9SJustin Hibbits ipcPrsIncludePort.hardwarePortId,
2730aeed3e9SJustin Hibbits ipcPrsIncludePort.include);
2740aeed3e9SJustin Hibbits break;
2750aeed3e9SJustin Hibbits }
2760aeed3e9SJustin Hibbits default:
2770aeed3e9SJustin Hibbits *p_ReplyLength = 0;
2780aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!"));
2790aeed3e9SJustin Hibbits }
2800aeed3e9SJustin Hibbits return E_OK;
2810aeed3e9SJustin Hibbits }
2820aeed3e9SJustin Hibbits
NetEnvLock(t_Handle h_NetEnv)283*852ba100SJustin Hibbits static uint32_t NetEnvLock(t_Handle h_NetEnv)
284*852ba100SJustin Hibbits {
285*852ba100SJustin Hibbits ASSERT_COND(h_NetEnv);
286*852ba100SJustin Hibbits return XX_LockIntrSpinlock(((t_FmPcdNetEnv*)h_NetEnv)->h_Spinlock);
287*852ba100SJustin Hibbits }
288*852ba100SJustin Hibbits
NetEnvUnlock(t_Handle h_NetEnv,uint32_t intFlags)289*852ba100SJustin Hibbits static void NetEnvUnlock(t_Handle h_NetEnv, uint32_t intFlags)
290*852ba100SJustin Hibbits {
291*852ba100SJustin Hibbits ASSERT_COND(h_NetEnv);
292*852ba100SJustin Hibbits XX_UnlockIntrSpinlock(((t_FmPcdNetEnv*)h_NetEnv)->h_Spinlock, intFlags);
293*852ba100SJustin Hibbits }
294*852ba100SJustin Hibbits
EnqueueLockToFreeLst(t_FmPcd * p_FmPcd,t_FmPcdLock * p_Lock)295*852ba100SJustin Hibbits static void EnqueueLockToFreeLst(t_FmPcd *p_FmPcd, t_FmPcdLock *p_Lock)
296*852ba100SJustin Hibbits {
297*852ba100SJustin Hibbits uint32_t intFlags;
298*852ba100SJustin Hibbits
299*852ba100SJustin Hibbits intFlags = XX_LockIntrSpinlock(p_FmPcd->h_Spinlock);
300*852ba100SJustin Hibbits NCSW_LIST_AddToTail(&p_Lock->node, &p_FmPcd->freeLocksLst);
301*852ba100SJustin Hibbits XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);
302*852ba100SJustin Hibbits }
303*852ba100SJustin Hibbits
DequeueLockFromFreeLst(t_FmPcd * p_FmPcd)304*852ba100SJustin Hibbits static t_FmPcdLock * DequeueLockFromFreeLst(t_FmPcd *p_FmPcd)
305*852ba100SJustin Hibbits {
306*852ba100SJustin Hibbits t_FmPcdLock *p_Lock = NULL;
307*852ba100SJustin Hibbits uint32_t intFlags;
308*852ba100SJustin Hibbits
309*852ba100SJustin Hibbits intFlags = XX_LockIntrSpinlock(p_FmPcd->h_Spinlock);
310*852ba100SJustin Hibbits if (!NCSW_LIST_IsEmpty(&p_FmPcd->freeLocksLst))
311*852ba100SJustin Hibbits {
312*852ba100SJustin Hibbits p_Lock = FM_PCD_LOCK_OBJ(p_FmPcd->freeLocksLst.p_Next);
313*852ba100SJustin Hibbits NCSW_LIST_DelAndInit(&p_Lock->node);
314*852ba100SJustin Hibbits }
315*852ba100SJustin Hibbits if (p_FmPcd->h_Spinlock)
316*852ba100SJustin Hibbits XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);
317*852ba100SJustin Hibbits
318*852ba100SJustin Hibbits return p_Lock;
319*852ba100SJustin Hibbits }
320*852ba100SJustin Hibbits
EnqueueLockToAcquiredLst(t_FmPcd * p_FmPcd,t_FmPcdLock * p_Lock)321*852ba100SJustin Hibbits static void EnqueueLockToAcquiredLst(t_FmPcd *p_FmPcd, t_FmPcdLock *p_Lock)
322*852ba100SJustin Hibbits {
323*852ba100SJustin Hibbits uint32_t intFlags;
324*852ba100SJustin Hibbits
325*852ba100SJustin Hibbits intFlags = XX_LockIntrSpinlock(p_FmPcd->h_Spinlock);
326*852ba100SJustin Hibbits NCSW_LIST_AddToTail(&p_Lock->node, &p_FmPcd->acquiredLocksLst);
327*852ba100SJustin Hibbits XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);
328*852ba100SJustin Hibbits }
329*852ba100SJustin Hibbits
FillFreeLocksLst(t_FmPcd * p_FmPcd)330*852ba100SJustin Hibbits static t_Error FillFreeLocksLst(t_FmPcd *p_FmPcd)
331*852ba100SJustin Hibbits {
332*852ba100SJustin Hibbits t_FmPcdLock *p_Lock;
333*852ba100SJustin Hibbits int i;
334*852ba100SJustin Hibbits
335*852ba100SJustin Hibbits for (i=0; i<10; i++)
336*852ba100SJustin Hibbits {
337*852ba100SJustin Hibbits p_Lock = (t_FmPcdLock *)XX_Malloc(sizeof(t_FmPcdLock));
338*852ba100SJustin Hibbits if (!p_Lock)
339*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_NO_MEMORY, ("FM-PCD lock obj!"));
340*852ba100SJustin Hibbits memset(p_Lock, 0, sizeof(t_FmPcdLock));
341*852ba100SJustin Hibbits INIT_LIST(&p_Lock->node);
342*852ba100SJustin Hibbits p_Lock->h_Spinlock = XX_InitSpinlock();
343*852ba100SJustin Hibbits if (!p_Lock->h_Spinlock)
344*852ba100SJustin Hibbits {
345*852ba100SJustin Hibbits XX_Free(p_Lock);
346*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("FM-PCD spinlock obj!"));
347*852ba100SJustin Hibbits }
348*852ba100SJustin Hibbits EnqueueLockToFreeLst(p_FmPcd, p_Lock);
349*852ba100SJustin Hibbits }
350*852ba100SJustin Hibbits
351*852ba100SJustin Hibbits return E_OK;
352*852ba100SJustin Hibbits }
353*852ba100SJustin Hibbits
ReleaseFreeLocksLst(t_FmPcd * p_FmPcd)354*852ba100SJustin Hibbits static void ReleaseFreeLocksLst(t_FmPcd *p_FmPcd)
355*852ba100SJustin Hibbits {
356*852ba100SJustin Hibbits t_FmPcdLock *p_Lock;
357*852ba100SJustin Hibbits
358*852ba100SJustin Hibbits p_Lock = DequeueLockFromFreeLst(p_FmPcd);
359*852ba100SJustin Hibbits while (p_Lock)
360*852ba100SJustin Hibbits {
361*852ba100SJustin Hibbits XX_FreeSpinlock(p_Lock->h_Spinlock);
362*852ba100SJustin Hibbits XX_Free(p_Lock);
363*852ba100SJustin Hibbits p_Lock = DequeueLockFromFreeLst(p_FmPcd);
364*852ba100SJustin Hibbits }
365*852ba100SJustin Hibbits }
366*852ba100SJustin Hibbits
367*852ba100SJustin Hibbits
368*852ba100SJustin Hibbits
369*852ba100SJustin Hibbits /*****************************************************************************/
370*852ba100SJustin Hibbits /* Inter-module API routines */
371*852ba100SJustin Hibbits /*****************************************************************************/
372*852ba100SJustin Hibbits
FmPcdSetClsPlanGrpId(t_FmPcd * p_FmPcd,uint8_t netEnvId,uint8_t clsPlanGrpId)3730aeed3e9SJustin Hibbits void FmPcdSetClsPlanGrpId(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint8_t clsPlanGrpId)
3740aeed3e9SJustin Hibbits {
375*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd);
3760aeed3e9SJustin Hibbits p_FmPcd->netEnvs[netEnvId].clsPlanGrpId = clsPlanGrpId;
3770aeed3e9SJustin Hibbits }
3780aeed3e9SJustin Hibbits
PcdGetClsPlanGrpParams(t_FmPcd * p_FmPcd,t_FmPcdKgInterModuleClsPlanGrpParams * p_GrpParams)3790aeed3e9SJustin Hibbits t_Error PcdGetClsPlanGrpParams(t_FmPcd *p_FmPcd, t_FmPcdKgInterModuleClsPlanGrpParams *p_GrpParams)
3800aeed3e9SJustin Hibbits {
3810aeed3e9SJustin Hibbits uint8_t netEnvId = p_GrpParams->netEnvId;
3820aeed3e9SJustin Hibbits int i, k, j;
3830aeed3e9SJustin Hibbits
384*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd);
3850aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[netEnvId].clsPlanGrpId != ILLEGAL_CLS_PLAN)
3860aeed3e9SJustin Hibbits {
3870aeed3e9SJustin Hibbits p_GrpParams->grpExists = TRUE;
3880aeed3e9SJustin Hibbits p_GrpParams->clsPlanGrpId = p_FmPcd->netEnvs[netEnvId].clsPlanGrpId;
3890aeed3e9SJustin Hibbits return E_OK;
3900aeed3e9SJustin Hibbits }
3910aeed3e9SJustin Hibbits
3920aeed3e9SJustin Hibbits for (i=0; ((i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
3930aeed3e9SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)); i++)
3940aeed3e9SJustin Hibbits {
3950aeed3e9SJustin Hibbits for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
3960aeed3e9SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)
3970aeed3e9SJustin Hibbits {
3980aeed3e9SJustin Hibbits /* if an option exists, add it to the opts list */
3990aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)
4000aeed3e9SJustin Hibbits {
4010aeed3e9SJustin Hibbits /* check if this option already exists, add if it doesn't */
4020aeed3e9SJustin Hibbits for (j = 0;j<p_GrpParams->numOfOptions;j++)
4030aeed3e9SJustin Hibbits {
4040aeed3e9SJustin Hibbits if (p_GrpParams->options[j] == p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)
4050aeed3e9SJustin Hibbits break;
4060aeed3e9SJustin Hibbits }
4070aeed3e9SJustin Hibbits p_GrpParams->optVectors[j] |= p_FmPcd->netEnvs[netEnvId].unitsVectors[i];
4080aeed3e9SJustin Hibbits if (j == p_GrpParams->numOfOptions)
4090aeed3e9SJustin Hibbits {
4100aeed3e9SJustin Hibbits p_GrpParams->options[p_GrpParams->numOfOptions] = p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt;
4110aeed3e9SJustin Hibbits p_GrpParams->numOfOptions++;
4120aeed3e9SJustin Hibbits }
4130aeed3e9SJustin Hibbits }
4140aeed3e9SJustin Hibbits }
4150aeed3e9SJustin Hibbits }
4160aeed3e9SJustin Hibbits
4170aeed3e9SJustin Hibbits if (p_GrpParams->numOfOptions == 0)
4180aeed3e9SJustin Hibbits {
4190aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId != ILLEGAL_CLS_PLAN)
4200aeed3e9SJustin Hibbits {
4210aeed3e9SJustin Hibbits p_GrpParams->grpExists = TRUE;
4220aeed3e9SJustin Hibbits p_GrpParams->clsPlanGrpId = p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId;
4230aeed3e9SJustin Hibbits }
4240aeed3e9SJustin Hibbits }
4250aeed3e9SJustin Hibbits
4260aeed3e9SJustin Hibbits return E_OK;
4270aeed3e9SJustin Hibbits
4280aeed3e9SJustin Hibbits }
4290aeed3e9SJustin Hibbits
PcdGetVectorForOpt(t_FmPcd * p_FmPcd,uint8_t netEnvId,protocolOpt_t opt,uint32_t * p_Vector)4300aeed3e9SJustin Hibbits t_Error PcdGetVectorForOpt(t_FmPcd *p_FmPcd, uint8_t netEnvId, protocolOpt_t opt, uint32_t *p_Vector)
4310aeed3e9SJustin Hibbits {
4320aeed3e9SJustin Hibbits uint8_t j,k;
4330aeed3e9SJustin Hibbits
4340aeed3e9SJustin Hibbits *p_Vector = 0;
4350aeed3e9SJustin Hibbits
436*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd);
4370aeed3e9SJustin Hibbits for (j=0; ((j < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
4380aeed3e9SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[0].hdr != HEADER_TYPE_NONE)); j++)
4390aeed3e9SJustin Hibbits {
4400aeed3e9SJustin Hibbits for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
4410aeed3e9SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)
4420aeed3e9SJustin Hibbits {
4430aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[k].opt == opt)
4440aeed3e9SJustin Hibbits *p_Vector |= p_FmPcd->netEnvs[netEnvId].unitsVectors[j];
4450aeed3e9SJustin Hibbits }
4460aeed3e9SJustin Hibbits }
4470aeed3e9SJustin Hibbits
4480aeed3e9SJustin Hibbits if (!*p_Vector)
4490aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Requested option was not defined for this Network Environment Characteristics module"));
4500aeed3e9SJustin Hibbits else
4510aeed3e9SJustin Hibbits return E_OK;
4520aeed3e9SJustin Hibbits }
4530aeed3e9SJustin Hibbits
PcdGetUnitsVector(t_FmPcd * p_FmPcd,t_NetEnvParams * p_Params)4540aeed3e9SJustin Hibbits t_Error PcdGetUnitsVector(t_FmPcd *p_FmPcd, t_NetEnvParams *p_Params)
4550aeed3e9SJustin Hibbits {
4560aeed3e9SJustin Hibbits int i;
4570aeed3e9SJustin Hibbits
458*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd);
459*852ba100SJustin Hibbits ASSERT_COND(p_Params->netEnvId < FM_MAX_NUM_OF_PORTS);
460*852ba100SJustin Hibbits
4610aeed3e9SJustin Hibbits p_Params->vector = 0;
4620aeed3e9SJustin Hibbits for (i=0; i<p_Params->numOfDistinctionUnits ;i++)
4630aeed3e9SJustin Hibbits {
4640aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[p_Params->netEnvId].units[p_Params->unitIds[i]].hdrs[0].hdr == HEADER_TYPE_NONE)
4650aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Requested unit was not defined for this Network Environment Characteristics module"));
4660aeed3e9SJustin Hibbits ASSERT_COND(p_FmPcd->netEnvs[p_Params->netEnvId].unitsVectors[p_Params->unitIds[i]]);
4670aeed3e9SJustin Hibbits p_Params->vector |= p_FmPcd->netEnvs[p_Params->netEnvId].unitsVectors[p_Params->unitIds[i]];
4680aeed3e9SJustin Hibbits }
4690aeed3e9SJustin Hibbits
4700aeed3e9SJustin Hibbits return E_OK;
4710aeed3e9SJustin Hibbits }
4720aeed3e9SJustin Hibbits
PcdNetEnvIsUnitWithoutOpts(t_FmPcd * p_FmPcd,uint8_t netEnvId,uint32_t unitVector)4730aeed3e9SJustin Hibbits bool PcdNetEnvIsUnitWithoutOpts(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint32_t unitVector)
4740aeed3e9SJustin Hibbits {
4750aeed3e9SJustin Hibbits int i=0, k;
476*852ba100SJustin Hibbits
477*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd);
4780aeed3e9SJustin Hibbits /* check whether a given unit may be used by non-clsPlan users. */
4790aeed3e9SJustin Hibbits /* first, recognize the unit by its vector */
4800aeed3e9SJustin Hibbits while (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)
4810aeed3e9SJustin Hibbits {
4820aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[netEnvId].unitsVectors[i] == unitVector)
4830aeed3e9SJustin Hibbits {
4840aeed3e9SJustin Hibbits for (k=0;
4850aeed3e9SJustin Hibbits ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
4860aeed3e9SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE));
4870aeed3e9SJustin Hibbits k++)
4880aeed3e9SJustin Hibbits /* check that no option exists */
4890aeed3e9SJustin Hibbits if ((protocolOpt_t)p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)
4900aeed3e9SJustin Hibbits return FALSE;
4910aeed3e9SJustin Hibbits break;
4920aeed3e9SJustin Hibbits }
4930aeed3e9SJustin Hibbits i++;
4940aeed3e9SJustin Hibbits }
4950aeed3e9SJustin Hibbits /* assert that a unit was found to mach the vector */
4960aeed3e9SJustin Hibbits ASSERT_COND(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE);
4970aeed3e9SJustin Hibbits
4980aeed3e9SJustin Hibbits return TRUE;
4990aeed3e9SJustin Hibbits }
FmPcdNetEnvIsHdrExist(t_Handle h_FmPcd,uint8_t netEnvId,e_NetHeaderType hdr)5000aeed3e9SJustin Hibbits bool FmPcdNetEnvIsHdrExist(t_Handle h_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr)
5010aeed3e9SJustin Hibbits {
5020aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
5030aeed3e9SJustin Hibbits int i, k;
5040aeed3e9SJustin Hibbits
5050aeed3e9SJustin Hibbits ASSERT_COND(p_FmPcd);
5060aeed3e9SJustin Hibbits
5070aeed3e9SJustin Hibbits for (i=0; ((i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
5080aeed3e9SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)); i++)
5090aeed3e9SJustin Hibbits {
5100aeed3e9SJustin Hibbits for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
5110aeed3e9SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)
5120aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr == hdr)
5130aeed3e9SJustin Hibbits return TRUE;
5140aeed3e9SJustin Hibbits }
515*852ba100SJustin Hibbits for (i=0; ((i < FM_PCD_MAX_NUM_OF_ALIAS_HDRS) &&
5160aeed3e9SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE)); i++)
5170aeed3e9SJustin Hibbits {
5180aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr)
5190aeed3e9SJustin Hibbits return TRUE;
5200aeed3e9SJustin Hibbits }
5210aeed3e9SJustin Hibbits
5220aeed3e9SJustin Hibbits return FALSE;
5230aeed3e9SJustin Hibbits }
5240aeed3e9SJustin Hibbits
FmPcdNetEnvGetUnitId(t_FmPcd * p_FmPcd,uint8_t netEnvId,e_NetHeaderType hdr,bool interchangeable,protocolOpt_t opt)525*852ba100SJustin Hibbits uint8_t FmPcdNetEnvGetUnitId(t_FmPcd *p_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr, bool interchangeable, protocolOpt_t opt)
526*852ba100SJustin Hibbits {
527*852ba100SJustin Hibbits uint8_t i, k;
528*852ba100SJustin Hibbits
529*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd);
530*852ba100SJustin Hibbits
531*852ba100SJustin Hibbits if (interchangeable)
532*852ba100SJustin Hibbits {
533*852ba100SJustin Hibbits for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
534*852ba100SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
535*852ba100SJustin Hibbits {
536*852ba100SJustin Hibbits for (k=0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
537*852ba100SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
538*852ba100SJustin Hibbits {
539*852ba100SJustin Hibbits if ((p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr == hdr) &&
540*852ba100SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt == opt))
541*852ba100SJustin Hibbits
542*852ba100SJustin Hibbits return i;
543*852ba100SJustin Hibbits }
544*852ba100SJustin Hibbits }
545*852ba100SJustin Hibbits }
546*852ba100SJustin Hibbits else
547*852ba100SJustin Hibbits {
548*852ba100SJustin Hibbits for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
549*852ba100SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
550*852ba100SJustin Hibbits if ((p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr == hdr) &&
551*852ba100SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].opt == opt) &&
552*852ba100SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[1].hdr == HEADER_TYPE_NONE))
553*852ba100SJustin Hibbits return i;
554*852ba100SJustin Hibbits
555*852ba100SJustin Hibbits for (i=0; (i < FM_PCD_MAX_NUM_OF_ALIAS_HDRS) &&
556*852ba100SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE); i++)
557*852ba100SJustin Hibbits if ((p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr) &&
558*852ba100SJustin Hibbits (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].opt == opt))
559*852ba100SJustin Hibbits return p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].aliasHdr;
560*852ba100SJustin Hibbits }
561*852ba100SJustin Hibbits
562*852ba100SJustin Hibbits return FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS;
563*852ba100SJustin Hibbits }
564*852ba100SJustin Hibbits
FmPcdUnregisterReassmPort(t_Handle h_FmPcd,t_Handle h_ReasmCommonPramTbl)565*852ba100SJustin Hibbits t_Error FmPcdUnregisterReassmPort(t_Handle h_FmPcd, t_Handle h_ReasmCommonPramTbl)
566*852ba100SJustin Hibbits {
567*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
568*852ba100SJustin Hibbits t_FmPcdCcReassmTimeoutParams ccReassmTimeoutParams = {0};
569*852ba100SJustin Hibbits uint8_t result;
570*852ba100SJustin Hibbits t_Error err = E_OK;
571*852ba100SJustin Hibbits
572*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd);
573*852ba100SJustin Hibbits ASSERT_COND(h_ReasmCommonPramTbl);
574*852ba100SJustin Hibbits
575*852ba100SJustin Hibbits ccReassmTimeoutParams.iprcpt = (uint32_t)(XX_VirtToPhys(h_ReasmCommonPramTbl) - p_FmPcd->physicalMuramBase);
576*852ba100SJustin Hibbits ccReassmTimeoutParams.activate = FALSE; /*Disable Timeout Task*/
577*852ba100SJustin Hibbits
578*852ba100SJustin Hibbits if ((err = FmHcPcdCcTimeoutReassm(p_FmPcd->h_Hc, &ccReassmTimeoutParams, &result)) != E_OK)
579*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
580*852ba100SJustin Hibbits
581*852ba100SJustin Hibbits switch (result)
582*852ba100SJustin Hibbits {
583*852ba100SJustin Hibbits case (0):
584*852ba100SJustin Hibbits return E_OK;
585*852ba100SJustin Hibbits case (1):
586*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, (""));
587*852ba100SJustin Hibbits case (2):
588*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, (""));
589*852ba100SJustin Hibbits case (3):
590*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("Disable Timeout Task with invalid IPRCPT"));
591*852ba100SJustin Hibbits default:
592*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
593*852ba100SJustin Hibbits }
594*852ba100SJustin Hibbits
595*852ba100SJustin Hibbits return E_OK;
596*852ba100SJustin Hibbits }
597*852ba100SJustin Hibbits
FmPcdGetAliasHdr(t_FmPcd * p_FmPcd,uint8_t netEnvId,e_NetHeaderType hdr)5980aeed3e9SJustin Hibbits e_NetHeaderType FmPcdGetAliasHdr(t_FmPcd *p_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr)
5990aeed3e9SJustin Hibbits {
6000aeed3e9SJustin Hibbits int i;
6010aeed3e9SJustin Hibbits
6020aeed3e9SJustin Hibbits ASSERT_COND(p_FmPcd);
603*852ba100SJustin Hibbits ASSERT_COND(netEnvId < FM_MAX_NUM_OF_PORTS);
6040aeed3e9SJustin Hibbits
605*852ba100SJustin Hibbits for (i=0; (i < FM_PCD_MAX_NUM_OF_ALIAS_HDRS)
6060aeed3e9SJustin Hibbits && (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE); i++)
6070aeed3e9SJustin Hibbits {
6080aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr)
6090aeed3e9SJustin Hibbits return p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].aliasHdr;
6100aeed3e9SJustin Hibbits }
6110aeed3e9SJustin Hibbits
6120aeed3e9SJustin Hibbits return HEADER_TYPE_NONE;
6130aeed3e9SJustin Hibbits }
6140aeed3e9SJustin Hibbits
FmPcdPortRegister(t_Handle h_FmPcd,t_Handle h_FmPort,uint8_t hardwarePortId)6150aeed3e9SJustin Hibbits void FmPcdPortRegister(t_Handle h_FmPcd, t_Handle h_FmPort, uint8_t hardwarePortId)
6160aeed3e9SJustin Hibbits {
6170aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
6180aeed3e9SJustin Hibbits uint16_t swPortIndex = 0;
6190aeed3e9SJustin Hibbits
620*852ba100SJustin Hibbits ASSERT_COND(h_FmPcd);
6210aeed3e9SJustin Hibbits HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);
6220aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].h_FmPort = h_FmPort;
6230aeed3e9SJustin Hibbits }
6240aeed3e9SJustin Hibbits
FmPcdGetLcv(t_Handle h_FmPcd,uint32_t netEnvId,uint8_t hdrNum)6250aeed3e9SJustin Hibbits uint32_t FmPcdGetLcv(t_Handle h_FmPcd, uint32_t netEnvId, uint8_t hdrNum)
6260aeed3e9SJustin Hibbits {
6270aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
6280aeed3e9SJustin Hibbits
629*852ba100SJustin Hibbits ASSERT_COND(h_FmPcd);
6300aeed3e9SJustin Hibbits return p_FmPcd->netEnvs[netEnvId].lcvs[hdrNum];
6310aeed3e9SJustin Hibbits }
6320aeed3e9SJustin Hibbits
FmPcdGetMacsecLcv(t_Handle h_FmPcd,uint32_t netEnvId)6330aeed3e9SJustin Hibbits uint32_t FmPcdGetMacsecLcv(t_Handle h_FmPcd, uint32_t netEnvId)
6340aeed3e9SJustin Hibbits {
6350aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
6360aeed3e9SJustin Hibbits
637*852ba100SJustin Hibbits ASSERT_COND(h_FmPcd);
6380aeed3e9SJustin Hibbits return p_FmPcd->netEnvs[netEnvId].macsecVector;
6390aeed3e9SJustin Hibbits }
6400aeed3e9SJustin Hibbits
FmPcdGetNetEnvId(t_Handle h_NetEnv)641*852ba100SJustin Hibbits uint8_t FmPcdGetNetEnvId(t_Handle h_NetEnv)
642*852ba100SJustin Hibbits {
643*852ba100SJustin Hibbits return ((t_FmPcdNetEnv*)h_NetEnv)->netEnvId;
644*852ba100SJustin Hibbits }
645*852ba100SJustin Hibbits
FmPcdIncNetEnvOwners(t_Handle h_FmPcd,uint8_t netEnvId)6460aeed3e9SJustin Hibbits void FmPcdIncNetEnvOwners(t_Handle h_FmPcd, uint8_t netEnvId)
6470aeed3e9SJustin Hibbits {
648*852ba100SJustin Hibbits uint32_t intFlags;
649*852ba100SJustin Hibbits
650*852ba100SJustin Hibbits ASSERT_COND(h_FmPcd);
651*852ba100SJustin Hibbits
652*852ba100SJustin Hibbits intFlags = NetEnvLock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId]);
6530aeed3e9SJustin Hibbits ((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners++;
654*852ba100SJustin Hibbits NetEnvUnlock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId], intFlags);
6550aeed3e9SJustin Hibbits }
6560aeed3e9SJustin Hibbits
FmPcdDecNetEnvOwners(t_Handle h_FmPcd,uint8_t netEnvId)6570aeed3e9SJustin Hibbits void FmPcdDecNetEnvOwners(t_Handle h_FmPcd, uint8_t netEnvId)
6580aeed3e9SJustin Hibbits {
659*852ba100SJustin Hibbits uint32_t intFlags;
660*852ba100SJustin Hibbits
661*852ba100SJustin Hibbits ASSERT_COND(h_FmPcd);
6620aeed3e9SJustin Hibbits ASSERT_COND(((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners);
663*852ba100SJustin Hibbits
664*852ba100SJustin Hibbits intFlags = NetEnvLock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId]);
6650aeed3e9SJustin Hibbits ((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners--;
666*852ba100SJustin Hibbits NetEnvUnlock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId], intFlags);
6670aeed3e9SJustin Hibbits }
6680aeed3e9SJustin Hibbits
FmPcdLock(t_Handle h_FmPcd)6690aeed3e9SJustin Hibbits uint32_t FmPcdLock(t_Handle h_FmPcd)
6700aeed3e9SJustin Hibbits {
671*852ba100SJustin Hibbits ASSERT_COND(h_FmPcd);
6720aeed3e9SJustin Hibbits return XX_LockIntrSpinlock(((t_FmPcd*)h_FmPcd)->h_Spinlock);
6730aeed3e9SJustin Hibbits }
6740aeed3e9SJustin Hibbits
FmPcdUnlock(t_Handle h_FmPcd,uint32_t intFlags)6750aeed3e9SJustin Hibbits void FmPcdUnlock(t_Handle h_FmPcd, uint32_t intFlags)
6760aeed3e9SJustin Hibbits {
677*852ba100SJustin Hibbits ASSERT_COND(h_FmPcd);
6780aeed3e9SJustin Hibbits XX_UnlockIntrSpinlock(((t_FmPcd*)h_FmPcd)->h_Spinlock, intFlags);
6790aeed3e9SJustin Hibbits }
6800aeed3e9SJustin Hibbits
FmPcdAcquireLock(t_Handle h_FmPcd)681*852ba100SJustin Hibbits t_FmPcdLock * FmPcdAcquireLock(t_Handle h_FmPcd)
682*852ba100SJustin Hibbits {
683*852ba100SJustin Hibbits t_FmPcdLock *p_Lock;
684*852ba100SJustin Hibbits ASSERT_COND(h_FmPcd);
685*852ba100SJustin Hibbits p_Lock = DequeueLockFromFreeLst((t_FmPcd*)h_FmPcd);
686*852ba100SJustin Hibbits if (!p_Lock)
687*852ba100SJustin Hibbits {
688*852ba100SJustin Hibbits FillFreeLocksLst(h_FmPcd);
689*852ba100SJustin Hibbits p_Lock = DequeueLockFromFreeLst((t_FmPcd*)h_FmPcd);
690*852ba100SJustin Hibbits }
691*852ba100SJustin Hibbits
692*852ba100SJustin Hibbits if (p_Lock)
693*852ba100SJustin Hibbits EnqueueLockToAcquiredLst((t_FmPcd*)h_FmPcd, p_Lock);
694*852ba100SJustin Hibbits return p_Lock;
695*852ba100SJustin Hibbits }
696*852ba100SJustin Hibbits
FmPcdReleaseLock(t_Handle h_FmPcd,t_FmPcdLock * p_Lock)697*852ba100SJustin Hibbits void FmPcdReleaseLock(t_Handle h_FmPcd, t_FmPcdLock *p_Lock)
698*852ba100SJustin Hibbits {
699*852ba100SJustin Hibbits uint32_t intFlags;
700*852ba100SJustin Hibbits ASSERT_COND(h_FmPcd);
701*852ba100SJustin Hibbits intFlags = FmPcdLock(h_FmPcd);
702*852ba100SJustin Hibbits NCSW_LIST_DelAndInit(&p_Lock->node);
703*852ba100SJustin Hibbits FmPcdUnlock(h_FmPcd, intFlags);
704*852ba100SJustin Hibbits EnqueueLockToFreeLst((t_FmPcd*)h_FmPcd, p_Lock);
705*852ba100SJustin Hibbits }
706*852ba100SJustin Hibbits
FmPcdLockTryLockAll(t_Handle h_FmPcd)707*852ba100SJustin Hibbits bool FmPcdLockTryLockAll(t_Handle h_FmPcd)
708*852ba100SJustin Hibbits {
709*852ba100SJustin Hibbits uint32_t intFlags;
710*852ba100SJustin Hibbits t_List *p_Pos, *p_SavedPos=NULL;
711*852ba100SJustin Hibbits
712*852ba100SJustin Hibbits ASSERT_COND(h_FmPcd);
713*852ba100SJustin Hibbits intFlags = FmPcdLock(h_FmPcd);
714*852ba100SJustin Hibbits NCSW_LIST_FOR_EACH(p_Pos, &((t_FmPcd*)h_FmPcd)->acquiredLocksLst)
715*852ba100SJustin Hibbits {
716*852ba100SJustin Hibbits t_FmPcdLock *p_Lock = FM_PCD_LOCK_OBJ(p_Pos);
717*852ba100SJustin Hibbits if (!FmPcdLockTryLock(p_Lock))
718*852ba100SJustin Hibbits {
719*852ba100SJustin Hibbits p_SavedPos = p_Pos;
720*852ba100SJustin Hibbits break;
721*852ba100SJustin Hibbits }
722*852ba100SJustin Hibbits }
723*852ba100SJustin Hibbits if (p_SavedPos)
724*852ba100SJustin Hibbits {
725*852ba100SJustin Hibbits NCSW_LIST_FOR_EACH(p_Pos, &((t_FmPcd*)h_FmPcd)->acquiredLocksLst)
726*852ba100SJustin Hibbits {
727*852ba100SJustin Hibbits t_FmPcdLock *p_Lock = FM_PCD_LOCK_OBJ(p_Pos);
728*852ba100SJustin Hibbits if (p_Pos == p_SavedPos)
729*852ba100SJustin Hibbits break;
730*852ba100SJustin Hibbits FmPcdLockUnlock(p_Lock);
731*852ba100SJustin Hibbits }
732*852ba100SJustin Hibbits }
733*852ba100SJustin Hibbits FmPcdUnlock(h_FmPcd, intFlags);
734*852ba100SJustin Hibbits
735*852ba100SJustin Hibbits CORE_MemoryBarrier();
736*852ba100SJustin Hibbits
737*852ba100SJustin Hibbits if (p_SavedPos)
738*852ba100SJustin Hibbits return FALSE;
739*852ba100SJustin Hibbits
740*852ba100SJustin Hibbits return TRUE;
741*852ba100SJustin Hibbits }
742*852ba100SJustin Hibbits
FmPcdLockUnlockAll(t_Handle h_FmPcd)743*852ba100SJustin Hibbits void FmPcdLockUnlockAll(t_Handle h_FmPcd)
744*852ba100SJustin Hibbits {
745*852ba100SJustin Hibbits uint32_t intFlags;
746*852ba100SJustin Hibbits t_List *p_Pos;
747*852ba100SJustin Hibbits
748*852ba100SJustin Hibbits ASSERT_COND(h_FmPcd);
749*852ba100SJustin Hibbits intFlags = FmPcdLock(h_FmPcd);
750*852ba100SJustin Hibbits NCSW_LIST_FOR_EACH(p_Pos, &((t_FmPcd*)h_FmPcd)->acquiredLocksLst)
751*852ba100SJustin Hibbits {
752*852ba100SJustin Hibbits t_FmPcdLock *p_Lock = FM_PCD_LOCK_OBJ(p_Pos);
753*852ba100SJustin Hibbits p_Lock->flag = FALSE;
754*852ba100SJustin Hibbits }
755*852ba100SJustin Hibbits FmPcdUnlock(h_FmPcd, intFlags);
756*852ba100SJustin Hibbits
757*852ba100SJustin Hibbits CORE_MemoryBarrier();
758*852ba100SJustin Hibbits }
759*852ba100SJustin Hibbits
FmPcdHcSync(t_Handle h_FmPcd)760*852ba100SJustin Hibbits t_Error FmPcdHcSync(t_Handle h_FmPcd)
761*852ba100SJustin Hibbits {
762*852ba100SJustin Hibbits ASSERT_COND(h_FmPcd);
763*852ba100SJustin Hibbits ASSERT_COND(((t_FmPcd*)h_FmPcd)->h_Hc);
764*852ba100SJustin Hibbits
765*852ba100SJustin Hibbits return FmHcPcdSync(((t_FmPcd*)h_FmPcd)->h_Hc);
766*852ba100SJustin Hibbits }
767*852ba100SJustin Hibbits
FmPcdGetHcHandle(t_Handle h_FmPcd)7680aeed3e9SJustin Hibbits t_Handle FmPcdGetHcHandle(t_Handle h_FmPcd)
7690aeed3e9SJustin Hibbits {
7700aeed3e9SJustin Hibbits ASSERT_COND(h_FmPcd);
7710aeed3e9SJustin Hibbits return ((t_FmPcd*)h_FmPcd)->h_Hc;
7720aeed3e9SJustin Hibbits }
7730aeed3e9SJustin Hibbits
FmPcdIsAdvancedOffloadSupported(t_Handle h_FmPcd)774*852ba100SJustin Hibbits bool FmPcdIsAdvancedOffloadSupported(t_Handle h_FmPcd)
775*852ba100SJustin Hibbits {
776*852ba100SJustin Hibbits ASSERT_COND(h_FmPcd);
777*852ba100SJustin Hibbits return ((t_FmPcd*)h_FmPcd)->advancedOffloadSupport;
778*852ba100SJustin Hibbits }
779*852ba100SJustin Hibbits /*********************** End of inter-module routines ************************/
780*852ba100SJustin Hibbits
781*852ba100SJustin Hibbits
782*852ba100SJustin Hibbits /****************************************/
783*852ba100SJustin Hibbits /* API Init unit functions */
784*852ba100SJustin Hibbits /****************************************/
7850aeed3e9SJustin Hibbits
FM_PCD_Config(t_FmPcdParams * p_FmPcdParams)7860aeed3e9SJustin Hibbits t_Handle FM_PCD_Config(t_FmPcdParams *p_FmPcdParams)
7870aeed3e9SJustin Hibbits {
7880aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = NULL;
7890aeed3e9SJustin Hibbits t_FmPhysAddr physicalMuramBase;
7900aeed3e9SJustin Hibbits uint8_t i;
7910aeed3e9SJustin Hibbits
7920aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_FmPcdParams, E_INVALID_HANDLE,NULL);
7930aeed3e9SJustin Hibbits
7940aeed3e9SJustin Hibbits p_FmPcd = (t_FmPcd *) XX_Malloc(sizeof(t_FmPcd));
7950aeed3e9SJustin Hibbits if (!p_FmPcd)
7960aeed3e9SJustin Hibbits {
797*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD"));
7980aeed3e9SJustin Hibbits return NULL;
7990aeed3e9SJustin Hibbits }
8000aeed3e9SJustin Hibbits memset(p_FmPcd, 0, sizeof(t_FmPcd));
8010aeed3e9SJustin Hibbits
8020aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdDriverParam = (t_FmPcdDriverParam *) XX_Malloc(sizeof(t_FmPcdDriverParam));
8030aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdDriverParam)
8040aeed3e9SJustin Hibbits {
8050aeed3e9SJustin Hibbits XX_Free(p_FmPcd);
806*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Driver Param"));
8070aeed3e9SJustin Hibbits return NULL;
8080aeed3e9SJustin Hibbits }
8090aeed3e9SJustin Hibbits memset(p_FmPcd->p_FmPcdDriverParam, 0, sizeof(t_FmPcdDriverParam));
8100aeed3e9SJustin Hibbits
8110aeed3e9SJustin Hibbits p_FmPcd->h_Fm = p_FmPcdParams->h_Fm;
8120aeed3e9SJustin Hibbits p_FmPcd->guestId = FmGetGuestId(p_FmPcd->h_Fm);
8130aeed3e9SJustin Hibbits p_FmPcd->h_FmMuram = FmGetMuramHandle(p_FmPcd->h_Fm);
814*852ba100SJustin Hibbits if (p_FmPcd->h_FmMuram)
815*852ba100SJustin Hibbits {
8160aeed3e9SJustin Hibbits FmGetPhysicalMuramBase(p_FmPcdParams->h_Fm, &physicalMuramBase);
8170aeed3e9SJustin Hibbits p_FmPcd->physicalMuramBase = (uint64_t)((uint64_t)(&physicalMuramBase)->low | ((uint64_t)(&physicalMuramBase)->high << 32));
818*852ba100SJustin Hibbits }
8190aeed3e9SJustin Hibbits
8200aeed3e9SJustin Hibbits for (i = 0; i<FM_MAX_NUM_OF_PORTS; i++)
8210aeed3e9SJustin Hibbits p_FmPcd->netEnvs[i].clsPlanGrpId = ILLEGAL_CLS_PLAN;
8220aeed3e9SJustin Hibbits
8230aeed3e9SJustin Hibbits if (p_FmPcdParams->useHostCommand)
8240aeed3e9SJustin Hibbits {
8250aeed3e9SJustin Hibbits t_FmHcParams hcParams;
8260aeed3e9SJustin Hibbits
8270aeed3e9SJustin Hibbits memset(&hcParams, 0, sizeof(hcParams));
8280aeed3e9SJustin Hibbits hcParams.h_Fm = p_FmPcd->h_Fm;
8290aeed3e9SJustin Hibbits hcParams.h_FmPcd = (t_Handle)p_FmPcd;
8300aeed3e9SJustin Hibbits memcpy((uint8_t*)&hcParams.params, (uint8_t*)&p_FmPcdParams->hc, sizeof(t_FmPcdHcParams));
8310aeed3e9SJustin Hibbits p_FmPcd->h_Hc = FmHcConfigAndInit(&hcParams);
8320aeed3e9SJustin Hibbits if (!p_FmPcd->h_Hc)
8330aeed3e9SJustin Hibbits {
834*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD HC"));
8350aeed3e9SJustin Hibbits FM_PCD_Free(p_FmPcd);
8360aeed3e9SJustin Hibbits return NULL;
8370aeed3e9SJustin Hibbits }
8380aeed3e9SJustin Hibbits }
8390aeed3e9SJustin Hibbits else if (p_FmPcd->guestId != NCSW_MASTER_ID)
8400aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, ("No Host Command defined for a guest partition."));
8410aeed3e9SJustin Hibbits
8420aeed3e9SJustin Hibbits if (p_FmPcdParams->kgSupport)
8430aeed3e9SJustin Hibbits {
8440aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdKg = (t_FmPcdKg *)KgConfig(p_FmPcd, p_FmPcdParams);
8450aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdKg)
8460aeed3e9SJustin Hibbits {
847*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Keygen"));
8480aeed3e9SJustin Hibbits FM_PCD_Free(p_FmPcd);
8490aeed3e9SJustin Hibbits return NULL;
8500aeed3e9SJustin Hibbits }
8510aeed3e9SJustin Hibbits }
8520aeed3e9SJustin Hibbits
8530aeed3e9SJustin Hibbits if (p_FmPcdParams->plcrSupport)
8540aeed3e9SJustin Hibbits {
8550aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdPlcr = (t_FmPcdPlcr *)PlcrConfig(p_FmPcd, p_FmPcdParams);
8560aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdPlcr)
8570aeed3e9SJustin Hibbits {
858*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Policer"));
8590aeed3e9SJustin Hibbits FM_PCD_Free(p_FmPcd);
8600aeed3e9SJustin Hibbits return NULL;
8610aeed3e9SJustin Hibbits }
8620aeed3e9SJustin Hibbits }
8630aeed3e9SJustin Hibbits
8640aeed3e9SJustin Hibbits if (p_FmPcdParams->prsSupport)
8650aeed3e9SJustin Hibbits {
8660aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdPrs = (t_FmPcdPrs *)PrsConfig(p_FmPcd, p_FmPcdParams);
8670aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdPrs)
8680aeed3e9SJustin Hibbits {
869*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Parser"));
8700aeed3e9SJustin Hibbits FM_PCD_Free(p_FmPcd);
8710aeed3e9SJustin Hibbits return NULL;
8720aeed3e9SJustin Hibbits }
8730aeed3e9SJustin Hibbits }
8740aeed3e9SJustin Hibbits
8750aeed3e9SJustin Hibbits p_FmPcd->h_Spinlock = XX_InitSpinlock();
8760aeed3e9SJustin Hibbits if (!p_FmPcd->h_Spinlock)
8770aeed3e9SJustin Hibbits {
878*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD spinlock"));
8790aeed3e9SJustin Hibbits FM_PCD_Free(p_FmPcd);
8800aeed3e9SJustin Hibbits return NULL;
8810aeed3e9SJustin Hibbits }
882*852ba100SJustin Hibbits INIT_LIST(&p_FmPcd->freeLocksLst);
883*852ba100SJustin Hibbits INIT_LIST(&p_FmPcd->acquiredLocksLst);
8840aeed3e9SJustin Hibbits
8850aeed3e9SJustin Hibbits p_FmPcd->numOfEnabledGuestPartitionsPcds = 0;
8860aeed3e9SJustin Hibbits
8870aeed3e9SJustin Hibbits p_FmPcd->f_Exception = p_FmPcdParams->f_Exception;
8880aeed3e9SJustin Hibbits p_FmPcd->f_FmPcdIndexedException = p_FmPcdParams->f_ExceptionId;
8890aeed3e9SJustin Hibbits p_FmPcd->h_App = p_FmPcdParams->h_App;
8900aeed3e9SJustin Hibbits
891*852ba100SJustin Hibbits p_FmPcd->p_CcShadow = NULL;
892*852ba100SJustin Hibbits p_FmPcd->ccShadowSize = 0;
893*852ba100SJustin Hibbits p_FmPcd->ccShadowAlign = 0;
894*852ba100SJustin Hibbits
895*852ba100SJustin Hibbits p_FmPcd->h_ShadowSpinlock = XX_InitSpinlock();
896*852ba100SJustin Hibbits if (!p_FmPcd->h_ShadowSpinlock)
897*852ba100SJustin Hibbits {
898*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD shadow spinlock"));
899*852ba100SJustin Hibbits FM_PCD_Free(p_FmPcd);
900*852ba100SJustin Hibbits return NULL;
901*852ba100SJustin Hibbits }
902*852ba100SJustin Hibbits
9030aeed3e9SJustin Hibbits return p_FmPcd;
9040aeed3e9SJustin Hibbits }
9050aeed3e9SJustin Hibbits
FM_PCD_Init(t_Handle h_FmPcd)9060aeed3e9SJustin Hibbits t_Error FM_PCD_Init(t_Handle h_FmPcd)
9070aeed3e9SJustin Hibbits {
9080aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
9090aeed3e9SJustin Hibbits t_Error err = E_OK;
9100aeed3e9SJustin Hibbits t_FmPcdIpcMsg msg;
9110aeed3e9SJustin Hibbits
9120aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
9130aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE);
9140aeed3e9SJustin Hibbits
915*852ba100SJustin Hibbits FM_GetRevision(p_FmPcd->h_Fm, &p_FmPcd->fmRevInfo);
916*852ba100SJustin Hibbits
9170aeed3e9SJustin Hibbits if (p_FmPcd->guestId != NCSW_MASTER_ID)
9180aeed3e9SJustin Hibbits {
9190aeed3e9SJustin Hibbits memset(p_FmPcd->fmPcdIpcHandlerModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);
9200aeed3e9SJustin Hibbits if (Sprint (p_FmPcd->fmPcdIpcHandlerModuleName, "FM_PCD_%d_%d", FmGetId(p_FmPcd->h_Fm), NCSW_MASTER_ID) != 10)
9210aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
9220aeed3e9SJustin Hibbits memset(p_FmPcd->fmPcdModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);
9230aeed3e9SJustin Hibbits if (Sprint (p_FmPcd->fmPcdModuleName, "FM_PCD_%d_%d",FmGetId(p_FmPcd->h_Fm), p_FmPcd->guestId) != (p_FmPcd->guestId<10 ? 10:11))
9240aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
9250aeed3e9SJustin Hibbits
9260aeed3e9SJustin Hibbits p_FmPcd->h_IpcSession = XX_IpcInitSession(p_FmPcd->fmPcdIpcHandlerModuleName, p_FmPcd->fmPcdModuleName);
927*852ba100SJustin Hibbits if (p_FmPcd->h_IpcSession)
928*852ba100SJustin Hibbits {
929*852ba100SJustin Hibbits t_FmPcdIpcReply reply;
930*852ba100SJustin Hibbits uint32_t replyLength;
931*852ba100SJustin Hibbits uint8_t isMasterAlive = 0;
9320aeed3e9SJustin Hibbits
9330aeed3e9SJustin Hibbits memset(&msg, 0, sizeof(msg));
9340aeed3e9SJustin Hibbits memset(&reply, 0, sizeof(reply));
9350aeed3e9SJustin Hibbits msg.msgId = FM_PCD_MASTER_IS_ALIVE;
9360aeed3e9SJustin Hibbits msg.msgBody[0] = p_FmPcd->guestId;
9370aeed3e9SJustin Hibbits blockingFlag = TRUE;
9380aeed3e9SJustin Hibbits
9390aeed3e9SJustin Hibbits do
9400aeed3e9SJustin Hibbits {
9410aeed3e9SJustin Hibbits replyLength = sizeof(uint32_t) + sizeof(isMasterAlive);
9420aeed3e9SJustin Hibbits if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
9430aeed3e9SJustin Hibbits (uint8_t*)&msg,
9440aeed3e9SJustin Hibbits sizeof(msg.msgId)+sizeof(p_FmPcd->guestId),
9450aeed3e9SJustin Hibbits (uint8_t*)&reply,
9460aeed3e9SJustin Hibbits &replyLength,
947*852ba100SJustin Hibbits IpcMsgCompletionCB,
9480aeed3e9SJustin Hibbits h_FmPcd)) != E_OK)
9490aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, err, NO_MSG);
9500aeed3e9SJustin Hibbits while (blockingFlag) ;
9510aeed3e9SJustin Hibbits if (replyLength != (sizeof(uint32_t) + sizeof(isMasterAlive)))
9520aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
9530aeed3e9SJustin Hibbits isMasterAlive = *(uint8_t*)(reply.replyBody);
9540aeed3e9SJustin Hibbits } while (!isMasterAlive);
9550aeed3e9SJustin Hibbits }
956*852ba100SJustin Hibbits }
9570aeed3e9SJustin Hibbits
9580aeed3e9SJustin Hibbits CHECK_INIT_PARAMETERS(p_FmPcd, CheckFmPcdParameters);
9590aeed3e9SJustin Hibbits
9600aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdKg)
9610aeed3e9SJustin Hibbits {
9620aeed3e9SJustin Hibbits err = KgInit(p_FmPcd);
9630aeed3e9SJustin Hibbits if (err)
9640aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
9650aeed3e9SJustin Hibbits }
9660aeed3e9SJustin Hibbits
9670aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdPlcr)
9680aeed3e9SJustin Hibbits {
9690aeed3e9SJustin Hibbits err = PlcrInit(p_FmPcd);
9700aeed3e9SJustin Hibbits if (err)
9710aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
9720aeed3e9SJustin Hibbits }
9730aeed3e9SJustin Hibbits
9740aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdPrs)
9750aeed3e9SJustin Hibbits {
9760aeed3e9SJustin Hibbits err = PrsInit(p_FmPcd);
9770aeed3e9SJustin Hibbits if (err)
9780aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
9790aeed3e9SJustin Hibbits }
9800aeed3e9SJustin Hibbits
9810aeed3e9SJustin Hibbits if (p_FmPcd->guestId == NCSW_MASTER_ID)
9820aeed3e9SJustin Hibbits {
9830aeed3e9SJustin Hibbits /* register to inter-core messaging mechanism */
9840aeed3e9SJustin Hibbits memset(p_FmPcd->fmPcdModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);
9850aeed3e9SJustin Hibbits if (Sprint (p_FmPcd->fmPcdModuleName, "FM_PCD_%d_%d",FmGetId(p_FmPcd->h_Fm),NCSW_MASTER_ID) != 10)
9860aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
987*852ba100SJustin Hibbits err = XX_IpcRegisterMsgHandler(p_FmPcd->fmPcdModuleName, IpcMsgHandlerCB, p_FmPcd, FM_PCD_MAX_REPLY_SIZE);
9880aeed3e9SJustin Hibbits if (err)
9890aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
9900aeed3e9SJustin Hibbits }
9910aeed3e9SJustin Hibbits
992*852ba100SJustin Hibbits /* IPv6 Frame-Id used for fragmentation */
993*852ba100SJustin Hibbits p_FmPcd->ipv6FrameIdAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram, 4, 4));
994*852ba100SJustin Hibbits if (!p_FmPcd->ipv6FrameIdAddr)
995*852ba100SJustin Hibbits {
996*852ba100SJustin Hibbits FM_PCD_Free(p_FmPcd);
997*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for IPv6 Frame-Id"));
998*852ba100SJustin Hibbits }
999*852ba100SJustin Hibbits IOMemSet32(UINT_TO_PTR(p_FmPcd->ipv6FrameIdAddr), 0, 4);
1000*852ba100SJustin Hibbits
1001*852ba100SJustin Hibbits /* CAPWAP Frame-Id used for fragmentation */
1002*852ba100SJustin Hibbits p_FmPcd->capwapFrameIdAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram, 2, 4));
1003*852ba100SJustin Hibbits if (!p_FmPcd->capwapFrameIdAddr)
1004*852ba100SJustin Hibbits {
1005*852ba100SJustin Hibbits FM_PCD_Free(p_FmPcd);
1006*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CAPWAP Frame-Id"));
1007*852ba100SJustin Hibbits }
1008*852ba100SJustin Hibbits IOMemSet32(UINT_TO_PTR(p_FmPcd->capwapFrameIdAddr), 0, 2);
1009*852ba100SJustin Hibbits
10100aeed3e9SJustin Hibbits XX_Free(p_FmPcd->p_FmPcdDriverParam);
10110aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdDriverParam = NULL;
10120aeed3e9SJustin Hibbits
10130aeed3e9SJustin Hibbits FmRegisterPcd(p_FmPcd->h_Fm, p_FmPcd);
10140aeed3e9SJustin Hibbits
10150aeed3e9SJustin Hibbits return E_OK;
10160aeed3e9SJustin Hibbits }
10170aeed3e9SJustin Hibbits
FM_PCD_Free(t_Handle h_FmPcd)10180aeed3e9SJustin Hibbits t_Error FM_PCD_Free(t_Handle h_FmPcd)
10190aeed3e9SJustin Hibbits {
10200aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd =(t_FmPcd *)h_FmPcd;
10210aeed3e9SJustin Hibbits t_Error err = E_OK;
10220aeed3e9SJustin Hibbits
1023*852ba100SJustin Hibbits if (p_FmPcd->ipv6FrameIdAddr)
1024*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, UINT_TO_PTR(p_FmPcd->ipv6FrameIdAddr));
1025*852ba100SJustin Hibbits
1026*852ba100SJustin Hibbits if (p_FmPcd->capwapFrameIdAddr)
1027*852ba100SJustin Hibbits FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, UINT_TO_PTR(p_FmPcd->capwapFrameIdAddr));
1028*852ba100SJustin Hibbits
10290aeed3e9SJustin Hibbits if (p_FmPcd->enabled)
10300aeed3e9SJustin Hibbits FM_PCD_Disable(p_FmPcd);
10310aeed3e9SJustin Hibbits
10320aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdDriverParam)
10330aeed3e9SJustin Hibbits {
10340aeed3e9SJustin Hibbits XX_Free(p_FmPcd->p_FmPcdDriverParam);
10350aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdDriverParam = NULL;
10360aeed3e9SJustin Hibbits }
1037*852ba100SJustin Hibbits
10380aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdKg)
10390aeed3e9SJustin Hibbits {
10400aeed3e9SJustin Hibbits if ((err = KgFree(p_FmPcd)) != E_OK)
10410aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, err, NO_MSG);
10420aeed3e9SJustin Hibbits XX_Free(p_FmPcd->p_FmPcdKg);
10430aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdKg = NULL;
10440aeed3e9SJustin Hibbits }
10450aeed3e9SJustin Hibbits
10460aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdPlcr)
10470aeed3e9SJustin Hibbits {
1048*852ba100SJustin Hibbits PlcrFree(p_FmPcd);
10490aeed3e9SJustin Hibbits XX_Free(p_FmPcd->p_FmPcdPlcr);
10500aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdPlcr = NULL;
10510aeed3e9SJustin Hibbits }
10520aeed3e9SJustin Hibbits
10530aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdPrs)
10540aeed3e9SJustin Hibbits {
10550aeed3e9SJustin Hibbits if (p_FmPcd->guestId == NCSW_MASTER_ID)
10560aeed3e9SJustin Hibbits PrsFree(p_FmPcd);
10570aeed3e9SJustin Hibbits XX_Free(p_FmPcd->p_FmPcdPrs);
10580aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdPrs = NULL;
10590aeed3e9SJustin Hibbits }
10600aeed3e9SJustin Hibbits
10610aeed3e9SJustin Hibbits if (p_FmPcd->h_Hc)
10620aeed3e9SJustin Hibbits {
10630aeed3e9SJustin Hibbits FmHcFree(p_FmPcd->h_Hc);
10640aeed3e9SJustin Hibbits p_FmPcd->h_Hc = NULL;
10650aeed3e9SJustin Hibbits }
10660aeed3e9SJustin Hibbits
10670aeed3e9SJustin Hibbits XX_IpcUnregisterMsgHandler(p_FmPcd->fmPcdModuleName);
10680aeed3e9SJustin Hibbits
10690aeed3e9SJustin Hibbits FmUnregisterPcd(p_FmPcd->h_Fm);
10700aeed3e9SJustin Hibbits
1071*852ba100SJustin Hibbits ReleaseFreeLocksLst(p_FmPcd);
1072*852ba100SJustin Hibbits
1073*852ba100SJustin Hibbits if (p_FmPcd->h_Spinlock)
1074*852ba100SJustin Hibbits XX_FreeSpinlock(p_FmPcd->h_Spinlock);
1075*852ba100SJustin Hibbits
1076*852ba100SJustin Hibbits if (p_FmPcd->h_ShadowSpinlock)
1077*852ba100SJustin Hibbits XX_FreeSpinlock(p_FmPcd->h_ShadowSpinlock);
1078*852ba100SJustin Hibbits
10790aeed3e9SJustin Hibbits XX_Free(p_FmPcd);
1080*852ba100SJustin Hibbits
10810aeed3e9SJustin Hibbits return E_OK;
10820aeed3e9SJustin Hibbits }
10830aeed3e9SJustin Hibbits
FM_PCD_ConfigException(t_Handle h_FmPcd,e_FmPcdExceptions exception,bool enable)1084*852ba100SJustin Hibbits t_Error FM_PCD_ConfigException(t_Handle h_FmPcd, e_FmPcdExceptions exception, bool enable)
1085*852ba100SJustin Hibbits {
1086*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
1087*852ba100SJustin Hibbits uint32_t bitMask = 0;
1088*852ba100SJustin Hibbits
1089*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
1090*852ba100SJustin Hibbits
1091*852ba100SJustin Hibbits if (p_FmPcd->guestId != NCSW_MASTER_ID)
1092*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ConfigException - guest mode!"));
1093*852ba100SJustin Hibbits
1094*852ba100SJustin Hibbits GET_FM_PCD_EXCEPTION_FLAG(bitMask, exception);
1095*852ba100SJustin Hibbits if (bitMask)
1096*852ba100SJustin Hibbits {
1097*852ba100SJustin Hibbits if (enable)
1098*852ba100SJustin Hibbits p_FmPcd->exceptions |= bitMask;
1099*852ba100SJustin Hibbits else
1100*852ba100SJustin Hibbits p_FmPcd->exceptions &= ~bitMask;
1101*852ba100SJustin Hibbits }
1102*852ba100SJustin Hibbits else
1103*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
1104*852ba100SJustin Hibbits
1105*852ba100SJustin Hibbits return E_OK;
1106*852ba100SJustin Hibbits }
1107*852ba100SJustin Hibbits
FM_PCD_ConfigHcFramesDataMemory(t_Handle h_FmPcd,uint8_t memId)1108*852ba100SJustin Hibbits t_Error FM_PCD_ConfigHcFramesDataMemory(t_Handle h_FmPcd, uint8_t memId)
1109*852ba100SJustin Hibbits {
1110*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
1111*852ba100SJustin Hibbits
1112*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
1113*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
1114*852ba100SJustin Hibbits
1115*852ba100SJustin Hibbits return FmHcSetFramesDataMemory(p_FmPcd->h_Hc, memId);
1116*852ba100SJustin Hibbits }
1117*852ba100SJustin Hibbits
FM_PCD_Enable(t_Handle h_FmPcd)11180aeed3e9SJustin Hibbits t_Error FM_PCD_Enable(t_Handle h_FmPcd)
11190aeed3e9SJustin Hibbits {
11200aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
11210aeed3e9SJustin Hibbits t_Error err = E_OK;
11220aeed3e9SJustin Hibbits
11230aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
11240aeed3e9SJustin Hibbits
1125*852ba100SJustin Hibbits if (p_FmPcd->enabled)
1126*852ba100SJustin Hibbits return E_OK;
11270aeed3e9SJustin Hibbits
1128*852ba100SJustin Hibbits if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
1129*852ba100SJustin Hibbits p_FmPcd->h_IpcSession)
11300aeed3e9SJustin Hibbits {
11310aeed3e9SJustin Hibbits uint8_t enabled;
11320aeed3e9SJustin Hibbits t_FmPcdIpcMsg msg;
11330aeed3e9SJustin Hibbits t_FmPcdIpcReply reply;
11340aeed3e9SJustin Hibbits uint32_t replyLength;
11350aeed3e9SJustin Hibbits
11360aeed3e9SJustin Hibbits memset(&reply, 0, sizeof(reply));
1137*852ba100SJustin Hibbits memset(&msg, 0, sizeof(msg));
11380aeed3e9SJustin Hibbits msg.msgId = FM_PCD_MASTER_IS_ENABLED;
11390aeed3e9SJustin Hibbits replyLength = sizeof(uint32_t) + sizeof(enabled);
11400aeed3e9SJustin Hibbits if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
11410aeed3e9SJustin Hibbits (uint8_t*)&msg,
11420aeed3e9SJustin Hibbits sizeof(msg.msgId),
11430aeed3e9SJustin Hibbits (uint8_t*)&reply,
11440aeed3e9SJustin Hibbits &replyLength,
11450aeed3e9SJustin Hibbits NULL,
11460aeed3e9SJustin Hibbits NULL)) != E_OK)
11470aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
11480aeed3e9SJustin Hibbits if (replyLength != sizeof(uint32_t) + sizeof(enabled))
11490aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
11500aeed3e9SJustin Hibbits p_FmPcd->enabled = (bool)!!(*(uint8_t*)(reply.replyBody));
11510aeed3e9SJustin Hibbits if (!p_FmPcd->enabled)
11520aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("FM-PCD master should be enabled first!"));
1153*852ba100SJustin Hibbits
1154*852ba100SJustin Hibbits return E_OK;
11550aeed3e9SJustin Hibbits }
1156*852ba100SJustin Hibbits else if (p_FmPcd->guestId != NCSW_MASTER_ID)
1157*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
1158*852ba100SJustin Hibbits ("running in guest-mode without IPC!"));
1159*852ba100SJustin Hibbits
1160*852ba100SJustin Hibbits if (p_FmPcd->p_FmPcdKg)
1161*852ba100SJustin Hibbits KgEnable(p_FmPcd);
1162*852ba100SJustin Hibbits
1163*852ba100SJustin Hibbits if (p_FmPcd->p_FmPcdPlcr)
1164*852ba100SJustin Hibbits PlcrEnable(p_FmPcd);
1165*852ba100SJustin Hibbits
1166*852ba100SJustin Hibbits if (p_FmPcd->p_FmPcdPrs)
1167*852ba100SJustin Hibbits PrsEnable(p_FmPcd);
1168*852ba100SJustin Hibbits
1169*852ba100SJustin Hibbits p_FmPcd->enabled = TRUE;
11700aeed3e9SJustin Hibbits
11710aeed3e9SJustin Hibbits return E_OK;
11720aeed3e9SJustin Hibbits }
11730aeed3e9SJustin Hibbits
FM_PCD_Disable(t_Handle h_FmPcd)11740aeed3e9SJustin Hibbits t_Error FM_PCD_Disable(t_Handle h_FmPcd)
11750aeed3e9SJustin Hibbits {
11760aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
11770aeed3e9SJustin Hibbits t_Error err = E_OK;
1178*852ba100SJustin Hibbits
1179*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
1180*852ba100SJustin Hibbits
1181*852ba100SJustin Hibbits if (!p_FmPcd->enabled)
1182*852ba100SJustin Hibbits return E_OK;
1183*852ba100SJustin Hibbits
1184*852ba100SJustin Hibbits if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
1185*852ba100SJustin Hibbits p_FmPcd->h_IpcSession)
1186*852ba100SJustin Hibbits {
11870aeed3e9SJustin Hibbits t_FmPcdIpcMsg msg;
11880aeed3e9SJustin Hibbits t_FmPcdIpcReply reply;
11890aeed3e9SJustin Hibbits uint32_t replyLength;
11900aeed3e9SJustin Hibbits
1191*852ba100SJustin Hibbits memset(&reply, 0, sizeof(reply));
1192*852ba100SJustin Hibbits memset(&msg, 0, sizeof(msg));
1193*852ba100SJustin Hibbits msg.msgId = FM_PCD_GUEST_DISABLE;
1194*852ba100SJustin Hibbits replyLength = sizeof(uint32_t);
1195*852ba100SJustin Hibbits if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
1196*852ba100SJustin Hibbits (uint8_t*)&msg,
1197*852ba100SJustin Hibbits sizeof(msg.msgId),
1198*852ba100SJustin Hibbits (uint8_t*)&reply,
1199*852ba100SJustin Hibbits &replyLength,
1200*852ba100SJustin Hibbits NULL,
1201*852ba100SJustin Hibbits NULL)) != E_OK)
1202*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
1203*852ba100SJustin Hibbits if (replyLength != sizeof(uint32_t))
1204*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
1205*852ba100SJustin Hibbits if (reply.error == E_OK)
1206*852ba100SJustin Hibbits p_FmPcd->enabled = FALSE;
12070aeed3e9SJustin Hibbits
1208*852ba100SJustin Hibbits return (t_Error)(reply.error);
1209*852ba100SJustin Hibbits }
1210*852ba100SJustin Hibbits else if (p_FmPcd->guestId != NCSW_MASTER_ID)
1211*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
1212*852ba100SJustin Hibbits ("running in guest-mode without IPC!"));
1213*852ba100SJustin Hibbits
12140aeed3e9SJustin Hibbits if (p_FmPcd->numOfEnabledGuestPartitionsPcds != 0)
1215*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE,
1216*852ba100SJustin Hibbits ("Trying to disable a master partition PCD while"
1217*852ba100SJustin Hibbits "guest partitions are still enabled!"));
12180aeed3e9SJustin Hibbits
12190aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdKg)
12200aeed3e9SJustin Hibbits KgDisable(p_FmPcd);
12210aeed3e9SJustin Hibbits
12220aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdPlcr)
12230aeed3e9SJustin Hibbits PlcrDisable(p_FmPcd);
12240aeed3e9SJustin Hibbits
12250aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdPrs)
12260aeed3e9SJustin Hibbits PrsDisable(p_FmPcd);
12270aeed3e9SJustin Hibbits
12280aeed3e9SJustin Hibbits p_FmPcd->enabled = FALSE;
12290aeed3e9SJustin Hibbits
12300aeed3e9SJustin Hibbits return E_OK;
12310aeed3e9SJustin Hibbits }
12320aeed3e9SJustin Hibbits
FM_PCD_NetEnvCharacteristicsSet(t_Handle h_FmPcd,t_FmPcdNetEnvParams * p_NetEnvParams)1233*852ba100SJustin Hibbits t_Handle FM_PCD_NetEnvCharacteristicsSet(t_Handle h_FmPcd, t_FmPcdNetEnvParams *p_NetEnvParams)
12340aeed3e9SJustin Hibbits {
12350aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
12360aeed3e9SJustin Hibbits uint32_t intFlags, specialUnits = 0;
12370aeed3e9SJustin Hibbits uint8_t bitId = 0;
12380aeed3e9SJustin Hibbits uint8_t i, j, k;
12390aeed3e9SJustin Hibbits uint8_t netEnvCurrId;
12400aeed3e9SJustin Hibbits uint8_t ipsecAhUnit = 0,ipsecEspUnit = 0;
12410aeed3e9SJustin Hibbits bool ipsecAhExists = FALSE, ipsecEspExists = FALSE, shim1Selected = FALSE;
12420aeed3e9SJustin Hibbits uint8_t hdrNum;
1243*852ba100SJustin Hibbits t_FmPcdNetEnvParams *p_ModifiedNetEnvParams;
12440aeed3e9SJustin Hibbits
12450aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_STATE, NULL);
12460aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, NULL);
1247*852ba100SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_NetEnvParams, E_NULL_POINTER, NULL);
12480aeed3e9SJustin Hibbits
12490aeed3e9SJustin Hibbits intFlags = FmPcdLock(p_FmPcd);
12500aeed3e9SJustin Hibbits
12510aeed3e9SJustin Hibbits /* find a new netEnv */
12520aeed3e9SJustin Hibbits for (i = 0; i < FM_MAX_NUM_OF_PORTS; i++)
12530aeed3e9SJustin Hibbits if (!p_FmPcd->netEnvs[i].used)
12540aeed3e9SJustin Hibbits break;
12550aeed3e9SJustin Hibbits
12560aeed3e9SJustin Hibbits if (i== FM_MAX_NUM_OF_PORTS)
12570aeed3e9SJustin Hibbits {
12580aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_FULL,("No more than %d netEnv's allowed.", FM_MAX_NUM_OF_PORTS));
12590aeed3e9SJustin Hibbits FmPcdUnlock(p_FmPcd, intFlags);
12600aeed3e9SJustin Hibbits return NULL;
12610aeed3e9SJustin Hibbits }
12620aeed3e9SJustin Hibbits
12630aeed3e9SJustin Hibbits p_FmPcd->netEnvs[i].used = TRUE;
12640aeed3e9SJustin Hibbits FmPcdUnlock(p_FmPcd, intFlags);
1265*852ba100SJustin Hibbits
1266*852ba100SJustin Hibbits /* As anyone doesn't have handle of this netEnv yet, no need
1267*852ba100SJustin Hibbits to protect it with spinlocks */
1268*852ba100SJustin Hibbits
1269*852ba100SJustin Hibbits p_ModifiedNetEnvParams = (t_FmPcdNetEnvParams *)XX_Malloc(sizeof(t_FmPcdNetEnvParams));
1270*852ba100SJustin Hibbits if (!p_ModifiedNetEnvParams)
1271*852ba100SJustin Hibbits {
1272*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FmPcdNetEnvParams"));
12730aeed3e9SJustin Hibbits return NULL;
12740aeed3e9SJustin Hibbits }
1275*852ba100SJustin Hibbits
1276*852ba100SJustin Hibbits memcpy(p_ModifiedNetEnvParams, p_NetEnvParams, sizeof(t_FmPcdNetEnvParams));
1277*852ba100SJustin Hibbits p_NetEnvParams = p_ModifiedNetEnvParams;
12780aeed3e9SJustin Hibbits
12790aeed3e9SJustin Hibbits netEnvCurrId = (uint8_t)i;
12800aeed3e9SJustin Hibbits
12810aeed3e9SJustin Hibbits /* clear from previous use */
12820aeed3e9SJustin Hibbits memset(&p_FmPcd->netEnvs[netEnvCurrId].units, 0, FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS * sizeof(t_FmPcdIntDistinctionUnit));
1283*852ba100SJustin Hibbits memset(&p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs, 0, FM_PCD_MAX_NUM_OF_ALIAS_HDRS * sizeof(t_FmPcdNetEnvAliases));
12840aeed3e9SJustin Hibbits memcpy(&p_FmPcd->netEnvs[netEnvCurrId].units, p_NetEnvParams->units, p_NetEnvParams->numOfDistinctionUnits*sizeof(t_FmPcdIntDistinctionUnit));
1285*852ba100SJustin Hibbits
1286*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].netEnvId = netEnvCurrId;
1287*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].h_FmPcd = p_FmPcd;
1288*852ba100SJustin Hibbits
12890aeed3e9SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].clsPlanGrpId = ILLEGAL_CLS_PLAN;
12900aeed3e9SJustin Hibbits
12910aeed3e9SJustin Hibbits /* check that header with opt is not interchanged with the same header */
12920aeed3e9SJustin Hibbits for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
12930aeed3e9SJustin Hibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
12940aeed3e9SJustin Hibbits {
12950aeed3e9SJustin Hibbits for (k = 0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
12960aeed3e9SJustin Hibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
12970aeed3e9SJustin Hibbits {
12980aeed3e9SJustin Hibbits /* if an option exists, check that other headers are not the same header
12990aeed3e9SJustin Hibbits without option */
13000aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt)
13010aeed3e9SJustin Hibbits {
13020aeed3e9SJustin Hibbits for (j = 0; (j < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
13030aeed3e9SJustin Hibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].hdr != HEADER_TYPE_NONE); j++)
1304*852ba100SJustin Hibbits {
13050aeed3e9SJustin Hibbits if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].hdr == p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr) &&
13060aeed3e9SJustin Hibbits !p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].opt)
13070aeed3e9SJustin Hibbits {
1308*852ba100SJustin Hibbits REPORT_ERROR(MINOR, E_FULL,
1309*852ba100SJustin Hibbits ("Illegal unit - header with opt may not be interchangeable with the same header without opt"));
1310*852ba100SJustin Hibbits XX_Free(p_ModifiedNetEnvParams);
13110aeed3e9SJustin Hibbits return NULL;
13120aeed3e9SJustin Hibbits }
13130aeed3e9SJustin Hibbits }
13140aeed3e9SJustin Hibbits }
13150aeed3e9SJustin Hibbits }
1316*852ba100SJustin Hibbits }
13170aeed3e9SJustin Hibbits
1318*852ba100SJustin Hibbits /* Specific headers checking */
13190aeed3e9SJustin Hibbits for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
13200aeed3e9SJustin Hibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
13210aeed3e9SJustin Hibbits {
13220aeed3e9SJustin Hibbits for (k = 0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
13230aeed3e9SJustin Hibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
13240aeed3e9SJustin Hibbits {
13250aeed3e9SJustin Hibbits /* Some headers pairs may not be defined on different units as the parser
13260aeed3e9SJustin Hibbits doesn't distinguish */
1327*852ba100SJustin Hibbits /* IPSEC_AH and IPSEC_SPI can't be 2 units, */
1328*852ba100SJustin Hibbits /* check that header with opt is not interchanged with the same header */
13290aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPSEC_AH)
13300aeed3e9SJustin Hibbits {
13310aeed3e9SJustin Hibbits if (ipsecEspExists && (ipsecEspUnit != i))
13320aeed3e9SJustin Hibbits {
13330aeed3e9SJustin Hibbits REPORT_ERROR(MINOR, E_INVALID_STATE, ("HEADER_TYPE_IPSEC_AH and HEADER_TYPE_IPSEC_ESP may not be defined in separate units"));
1334*852ba100SJustin Hibbits XX_Free(p_ModifiedNetEnvParams);
13350aeed3e9SJustin Hibbits return NULL;
13360aeed3e9SJustin Hibbits }
13370aeed3e9SJustin Hibbits else
13380aeed3e9SJustin Hibbits {
13390aeed3e9SJustin Hibbits ipsecAhUnit = i;
13400aeed3e9SJustin Hibbits ipsecAhExists = TRUE;
13410aeed3e9SJustin Hibbits }
13420aeed3e9SJustin Hibbits }
13430aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPSEC_ESP)
13440aeed3e9SJustin Hibbits {
13450aeed3e9SJustin Hibbits if (ipsecAhExists && (ipsecAhUnit != i))
13460aeed3e9SJustin Hibbits {
13470aeed3e9SJustin Hibbits REPORT_ERROR(MINOR, E_INVALID_STATE, ("HEADER_TYPE_IPSEC_AH and HEADER_TYPE_IPSEC_ESP may not be defined in separate units"));
1348*852ba100SJustin Hibbits XX_Free(p_ModifiedNetEnvParams);
13490aeed3e9SJustin Hibbits return NULL;
13500aeed3e9SJustin Hibbits }
13510aeed3e9SJustin Hibbits else
13520aeed3e9SJustin Hibbits {
13530aeed3e9SJustin Hibbits ipsecEspUnit = i;
13540aeed3e9SJustin Hibbits ipsecEspExists = TRUE;
13550aeed3e9SJustin Hibbits }
13560aeed3e9SJustin Hibbits }
1357*852ba100SJustin Hibbits /* ENCAP_ESP */
13580aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_UDP_ENCAP_ESP)
13590aeed3e9SJustin Hibbits {
1360*852ba100SJustin Hibbits /* IPSec UDP encapsulation is currently set to use SHIM1 */
13610aeed3e9SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_UDP_ENCAP_ESP;
13620aeed3e9SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM1;
13630aeed3e9SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM1;
13640aeed3e9SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
13650aeed3e9SJustin Hibbits }
1366*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11) || ((DPAA_VERSION == 10) && defined(FM_CAPWAP_SUPPORT))
1367*852ba100SJustin Hibbits /* UDP_LITE */
1368*852ba100SJustin Hibbits if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_UDP_LITE)
1369*852ba100SJustin Hibbits {
1370*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_UDP_LITE;
1371*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_UDP;
1372*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_UDP;
1373*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
1374*852ba100SJustin Hibbits }
1375*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) || ((DPAA_VERSION == 10) && defined(FM_CAPWAP_SUPPORT)) */
1376*852ba100SJustin Hibbits
1377*852ba100SJustin Hibbits /* IP FRAG */
1378*852ba100SJustin Hibbits if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPv4) &&
1379*852ba100SJustin Hibbits (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt == IPV4_FRAG_1))
1380*852ba100SJustin Hibbits {
1381*852ba100SJustin Hibbits /* If IPv4+Frag, we need to set 2 units - SHIM 2 and IPv4. We first set SHIM2, and than check if
1382*852ba100SJustin Hibbits * IPv4 exists. If so we don't need to set an extra unit
1383*852ba100SJustin Hibbits * We consider as "having IPv4" any IPv4 without interchangable headers
1384*852ba100SJustin Hibbits * but including any options. */
1385*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_IPv4;
1386*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].opt = IPV4_FRAG_1;
1387*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM2;
1388*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM2;
1389*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
1390*852ba100SJustin Hibbits
1391*852ba100SJustin Hibbits /* check if IPv4 header exists by itself */
1392*852ba100SJustin Hibbits if (FmPcdNetEnvGetUnitId(p_FmPcd, netEnvCurrId, HEADER_TYPE_IPv4, FALSE, 0) == FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
1393*852ba100SJustin Hibbits {
1394*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits].hdrs[0].hdr = HEADER_TYPE_IPv4;
1395*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits++].hdrs[0].opt = 0;
1396*852ba100SJustin Hibbits }
1397*852ba100SJustin Hibbits }
1398*852ba100SJustin Hibbits if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPv6) &&
1399*852ba100SJustin Hibbits (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt == IPV6_FRAG_1))
1400*852ba100SJustin Hibbits {
1401*852ba100SJustin Hibbits /* If IPv6+Frag, we need to set 2 units - SHIM 2 and IPv6. We first set SHIM2, and than check if
1402*852ba100SJustin Hibbits * IPv4 exists. If so we don't need to set an extra unit
1403*852ba100SJustin Hibbits * We consider as "having IPv6" any IPv6 without interchangable headers
1404*852ba100SJustin Hibbits * but including any options. */
1405*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_IPv6;
1406*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].opt = IPV6_FRAG_1;
1407*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM2;
1408*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM2;
1409*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
1410*852ba100SJustin Hibbits
1411*852ba100SJustin Hibbits /* check if IPv6 header exists by itself */
1412*852ba100SJustin Hibbits if (FmPcdNetEnvGetUnitId(p_FmPcd, netEnvCurrId, HEADER_TYPE_IPv6, FALSE, 0) == FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
1413*852ba100SJustin Hibbits {
1414*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits].hdrs[0].hdr = HEADER_TYPE_IPv6;
1415*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits++].hdrs[0].opt = 0;
1416*852ba100SJustin Hibbits }
1417*852ba100SJustin Hibbits }
1418*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
1419*852ba100SJustin Hibbits /* CAPWAP FRAG */
1420*852ba100SJustin Hibbits if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_CAPWAP) &&
1421*852ba100SJustin Hibbits (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt == CAPWAP_FRAG_1))
1422*852ba100SJustin Hibbits {
1423*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_CAPWAP;
1424*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].opt = CAPWAP_FRAG_1;
1425*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM2;
1426*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM2;
1427*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
1428*852ba100SJustin Hibbits }
1429*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
14300aeed3e9SJustin Hibbits }
14310aeed3e9SJustin Hibbits }
14320aeed3e9SJustin Hibbits
14330aeed3e9SJustin Hibbits /* if private header (shim), check that no other headers specified */
14340aeed3e9SJustin Hibbits for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
14350aeed3e9SJustin Hibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
14360aeed3e9SJustin Hibbits {
14370aeed3e9SJustin Hibbits if (IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
14380aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[1].hdr != HEADER_TYPE_NONE)
14390aeed3e9SJustin Hibbits {
14400aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("SHIM header may not be interchanged with other headers"));
1441*852ba100SJustin Hibbits XX_Free(p_ModifiedNetEnvParams);
14420aeed3e9SJustin Hibbits return NULL;
14430aeed3e9SJustin Hibbits }
14440aeed3e9SJustin Hibbits }
14450aeed3e9SJustin Hibbits
14460aeed3e9SJustin Hibbits for (i = 0; i < p_NetEnvParams->numOfDistinctionUnits; i++)
14470aeed3e9SJustin Hibbits {
14480aeed3e9SJustin Hibbits if (IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
14490aeed3e9SJustin Hibbits switch (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr)
14500aeed3e9SJustin Hibbits {
14510aeed3e9SJustin Hibbits case (HEADER_TYPE_USER_DEFINED_SHIM1):
14520aeed3e9SJustin Hibbits if (shim1Selected)
14530aeed3e9SJustin Hibbits {
14540aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("SHIM header cannot be selected with UDP_IPSEC_ESP"));
1455*852ba100SJustin Hibbits XX_Free(p_ModifiedNetEnvParams);
14560aeed3e9SJustin Hibbits return NULL;
14570aeed3e9SJustin Hibbits }
14580aeed3e9SJustin Hibbits shim1Selected = TRUE;
14590aeed3e9SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = 0x00000001;
14600aeed3e9SJustin Hibbits break;
14610aeed3e9SJustin Hibbits case (HEADER_TYPE_USER_DEFINED_SHIM2):
14620aeed3e9SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = 0x00000002;
14630aeed3e9SJustin Hibbits break;
14640aeed3e9SJustin Hibbits default:
14650aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Requested SHIM not supported"));
14660aeed3e9SJustin Hibbits }
14670aeed3e9SJustin Hibbits else
14680aeed3e9SJustin Hibbits {
14690aeed3e9SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = (uint32_t)(0x80000000 >> bitId++);
14700aeed3e9SJustin Hibbits
14710aeed3e9SJustin Hibbits if (IS_SPECIAL_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
14720aeed3e9SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].macsecVector = p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i];
14730aeed3e9SJustin Hibbits }
14740aeed3e9SJustin Hibbits }
14750aeed3e9SJustin Hibbits
14760aeed3e9SJustin Hibbits /* define a set of hardware parser LCV's according to the defined netenv */
14770aeed3e9SJustin Hibbits
14780aeed3e9SJustin Hibbits /* set an array of LCV's for each header in the netEnv */
14790aeed3e9SJustin Hibbits for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
14800aeed3e9SJustin Hibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
14810aeed3e9SJustin Hibbits {
14820aeed3e9SJustin Hibbits /* private headers have no LCV in the hard parser */
14830aeed3e9SJustin Hibbits if (!IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
14840aeed3e9SJustin Hibbits {
14850aeed3e9SJustin Hibbits for (k = 0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
14860aeed3e9SJustin Hibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
14870aeed3e9SJustin Hibbits {
1488*852ba100SJustin Hibbits hdrNum = GetPrsHdrNum(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr);
14890aeed3e9SJustin Hibbits if ((hdrNum == ILLEGAL_HDR_NUM) || (hdrNum == NO_HDR_NUM))
14900aeed3e9SJustin Hibbits {
14910aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, NO_MSG);
1492*852ba100SJustin Hibbits XX_Free(p_ModifiedNetEnvParams);
14930aeed3e9SJustin Hibbits return NULL;
14940aeed3e9SJustin Hibbits }
14950aeed3e9SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].lcvs[hdrNum] |= p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i];
14960aeed3e9SJustin Hibbits }
14970aeed3e9SJustin Hibbits }
14980aeed3e9SJustin Hibbits }
1499*852ba100SJustin Hibbits XX_Free(p_ModifiedNetEnvParams);
15000aeed3e9SJustin Hibbits
1501*852ba100SJustin Hibbits p_FmPcd->netEnvs[netEnvCurrId].h_Spinlock = XX_InitSpinlock();
1502*852ba100SJustin Hibbits if (!p_FmPcd->netEnvs[netEnvCurrId].h_Spinlock)
1503*852ba100SJustin Hibbits {
1504*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd NetEnv spinlock"));
1505*852ba100SJustin Hibbits return NULL;
1506*852ba100SJustin Hibbits }
1507*852ba100SJustin Hibbits return &p_FmPcd->netEnvs[netEnvCurrId];
15080aeed3e9SJustin Hibbits }
15090aeed3e9SJustin Hibbits
FM_PCD_NetEnvCharacteristicsDelete(t_Handle h_NetEnv)1510*852ba100SJustin Hibbits t_Error FM_PCD_NetEnvCharacteristicsDelete(t_Handle h_NetEnv)
15110aeed3e9SJustin Hibbits {
1512*852ba100SJustin Hibbits t_FmPcdNetEnv *p_NetEnv = (t_FmPcdNetEnv*)h_NetEnv;
1513*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = p_NetEnv->h_FmPcd;
1514*852ba100SJustin Hibbits uint32_t intFlags;
1515*852ba100SJustin Hibbits uint8_t netEnvId = p_NetEnv->netEnvId;
15160aeed3e9SJustin Hibbits
1517*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_STATE);
15180aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
15190aeed3e9SJustin Hibbits
15200aeed3e9SJustin Hibbits /* check that no port is bound to this netEnv */
15210aeed3e9SJustin Hibbits if (p_FmPcd->netEnvs[netEnvId].owners)
15220aeed3e9SJustin Hibbits {
1523*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE,
1524*852ba100SJustin Hibbits ("Trying to delete a netEnv that has ports/schemes/trees/clsPlanGrps bound to"));
15250aeed3e9SJustin Hibbits }
1526*852ba100SJustin Hibbits
1527*852ba100SJustin Hibbits intFlags = FmPcdLock(p_FmPcd);
1528*852ba100SJustin Hibbits
15290aeed3e9SJustin Hibbits p_FmPcd->netEnvs[netEnvId].used = FALSE;
15300aeed3e9SJustin Hibbits p_FmPcd->netEnvs[netEnvId].clsPlanGrpId = ILLEGAL_CLS_PLAN;
15310aeed3e9SJustin Hibbits
15320aeed3e9SJustin Hibbits memset(p_FmPcd->netEnvs[netEnvId].units, 0, sizeof(t_FmPcdIntDistinctionUnit)*FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);
15330aeed3e9SJustin Hibbits memset(p_FmPcd->netEnvs[netEnvId].unitsVectors, 0, sizeof(uint32_t)*FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);
15340aeed3e9SJustin Hibbits memset(p_FmPcd->netEnvs[netEnvId].lcvs, 0, sizeof(uint32_t)*FM_PCD_PRS_NUM_OF_HDRS);
15350aeed3e9SJustin Hibbits
1536*852ba100SJustin Hibbits if (p_FmPcd->netEnvs[netEnvId].h_Spinlock)
1537*852ba100SJustin Hibbits XX_FreeSpinlock(p_FmPcd->netEnvs[netEnvId].h_Spinlock);
15380aeed3e9SJustin Hibbits
1539*852ba100SJustin Hibbits FmPcdUnlock(p_FmPcd, intFlags);
15400aeed3e9SJustin Hibbits return E_OK;
15410aeed3e9SJustin Hibbits }
15420aeed3e9SJustin Hibbits
FM_PCD_HcTxConf(t_Handle h_FmPcd,t_DpaaFD * p_Fd)15430aeed3e9SJustin Hibbits void FM_PCD_HcTxConf(t_Handle h_FmPcd, t_DpaaFD *p_Fd)
15440aeed3e9SJustin Hibbits {
15450aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
15460aeed3e9SJustin Hibbits
15470aeed3e9SJustin Hibbits SANITY_CHECK_RETURN(h_FmPcd, E_INVALID_STATE);
15480aeed3e9SJustin Hibbits
15490aeed3e9SJustin Hibbits FmHcTxConf(p_FmPcd->h_Hc, p_Fd);
15500aeed3e9SJustin Hibbits }
15510aeed3e9SJustin Hibbits
FM_PCD_SetAdvancedOffloadSupport(t_Handle h_FmPcd)1552*852ba100SJustin Hibbits t_Error FM_PCD_SetAdvancedOffloadSupport(t_Handle h_FmPcd)
1553*852ba100SJustin Hibbits {
1554*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
1555*852ba100SJustin Hibbits t_FmCtrlCodeRevisionInfo revInfo;
1556*852ba100SJustin Hibbits t_Error err;
1557*852ba100SJustin Hibbits
1558*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
1559*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
1560*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->enabled, E_INVALID_STATE);
1561*852ba100SJustin Hibbits
1562*852ba100SJustin Hibbits if ((err = FM_GetFmanCtrlCodeRevision(p_FmPcd->h_Fm, &revInfo)) != E_OK)
1563*852ba100SJustin Hibbits {
1564*852ba100SJustin Hibbits DBG(WARNING, ("FM in guest-mode without IPC, can't validate firmware revision."));
1565*852ba100SJustin Hibbits revInfo.packageRev = IP_OFFLOAD_PACKAGE_NUMBER;
1566*852ba100SJustin Hibbits }
1567*852ba100SJustin Hibbits if (!IS_OFFLOAD_PACKAGE(revInfo.packageRev))
1568*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Fman ctrl code package"));
1569*852ba100SJustin Hibbits
1570*852ba100SJustin Hibbits if (!p_FmPcd->h_Hc)
1571*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("HC must be initialized in this mode"));
1572*852ba100SJustin Hibbits
1573*852ba100SJustin Hibbits p_FmPcd->advancedOffloadSupport = TRUE;
1574*852ba100SJustin Hibbits
1575*852ba100SJustin Hibbits return E_OK;
1576*852ba100SJustin Hibbits }
1577*852ba100SJustin Hibbits
FM_PCD_GetCounter(t_Handle h_FmPcd,e_FmPcdCounters counter)15780aeed3e9SJustin Hibbits uint32_t FM_PCD_GetCounter(t_Handle h_FmPcd, e_FmPcdCounters counter)
15790aeed3e9SJustin Hibbits {
15800aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
1581*852ba100SJustin Hibbits uint32_t outCounter = 0;
15820aeed3e9SJustin Hibbits t_Error err;
15830aeed3e9SJustin Hibbits
15840aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, 0);
15850aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, 0);
15860aeed3e9SJustin Hibbits
1587*852ba100SJustin Hibbits switch (counter)
15880aeed3e9SJustin Hibbits {
1589*852ba100SJustin Hibbits case (e_FM_PCD_KG_COUNTERS_TOTAL):
1590*852ba100SJustin Hibbits if (!p_FmPcd->p_FmPcdKg)
1591*852ba100SJustin Hibbits {
1592*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, ("KeyGen is not activated"));
1593*852ba100SJustin Hibbits return 0;
1594*852ba100SJustin Hibbits }
1595*852ba100SJustin Hibbits if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
1596*852ba100SJustin Hibbits !p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs &&
1597*852ba100SJustin Hibbits !p_FmPcd->h_IpcSession)
1598*852ba100SJustin Hibbits {
1599*852ba100SJustin Hibbits REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
1600*852ba100SJustin Hibbits ("running in guest-mode without neither IPC nor mapped register!"));
1601*852ba100SJustin Hibbits return 0;
1602*852ba100SJustin Hibbits }
1603*852ba100SJustin Hibbits break;
1604*852ba100SJustin Hibbits
1605*852ba100SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_YELLOW):
1606*852ba100SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_RED):
1607*852ba100SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
1608*852ba100SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
1609*852ba100SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_TOTAL):
1610*852ba100SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
1611*852ba100SJustin Hibbits if (!p_FmPcd->p_FmPcdPlcr)
1612*852ba100SJustin Hibbits {
1613*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Policer is not activated"));
1614*852ba100SJustin Hibbits return 0;
1615*852ba100SJustin Hibbits }
1616*852ba100SJustin Hibbits if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
1617*852ba100SJustin Hibbits !p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs &&
1618*852ba100SJustin Hibbits !p_FmPcd->h_IpcSession)
1619*852ba100SJustin Hibbits {
1620*852ba100SJustin Hibbits REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
1621*852ba100SJustin Hibbits ("running in \"guest-mode\" without neither IPC nor mapped register!"));
1622*852ba100SJustin Hibbits return 0;
1623*852ba100SJustin Hibbits }
1624*852ba100SJustin Hibbits
1625*852ba100SJustin Hibbits /* check that counters are enabled */
1626*852ba100SJustin Hibbits if (p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs &&
1627*852ba100SJustin Hibbits !(GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr) & FM_PCD_PLCR_GCR_STEN))
1628*852ba100SJustin Hibbits {
1629*852ba100SJustin Hibbits REPORT_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
1630*852ba100SJustin Hibbits return 0;
1631*852ba100SJustin Hibbits }
1632*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs ||
1633*852ba100SJustin Hibbits ((p_FmPcd->guestId != NCSW_MASTER_ID) && p_FmPcd->h_IpcSession));
1634*852ba100SJustin Hibbits break;
1635*852ba100SJustin Hibbits
1636*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
1637*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
1638*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
1639*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
1640*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
1641*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
1642*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
1643*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
1644*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
1645*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
1646*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
1647*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
1648*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
1649*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
1650*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
1651*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
1652*852ba100SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
1653*852ba100SJustin Hibbits if (!p_FmPcd->p_FmPcdPrs)
1654*852ba100SJustin Hibbits {
1655*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Parser is not activated"));
1656*852ba100SJustin Hibbits return 0;
1657*852ba100SJustin Hibbits }
1658*852ba100SJustin Hibbits if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
1659*852ba100SJustin Hibbits !p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs &&
1660*852ba100SJustin Hibbits !p_FmPcd->h_IpcSession)
1661*852ba100SJustin Hibbits {
1662*852ba100SJustin Hibbits REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
1663*852ba100SJustin Hibbits ("running in guest-mode without neither IPC nor mapped register!"));
1664*852ba100SJustin Hibbits return 0;
1665*852ba100SJustin Hibbits }
1666*852ba100SJustin Hibbits break;
1667*852ba100SJustin Hibbits default:
1668*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported type of counter"));
1669*852ba100SJustin Hibbits return 0;
1670*852ba100SJustin Hibbits }
1671*852ba100SJustin Hibbits
1672*852ba100SJustin Hibbits if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
1673*852ba100SJustin Hibbits p_FmPcd->h_IpcSession)
1674*852ba100SJustin Hibbits {
1675*852ba100SJustin Hibbits t_FmPcdIpcMsg msg;
1676*852ba100SJustin Hibbits t_FmPcdIpcReply reply;
1677*852ba100SJustin Hibbits uint32_t replyLength;
1678*852ba100SJustin Hibbits
16790aeed3e9SJustin Hibbits memset(&msg, 0, sizeof(msg));
16800aeed3e9SJustin Hibbits memset(&reply, 0, sizeof(reply));
16810aeed3e9SJustin Hibbits msg.msgId = FM_PCD_GET_COUNTER;
16820aeed3e9SJustin Hibbits memcpy(msg.msgBody, (uint8_t *)&counter, sizeof(uint32_t));
16830aeed3e9SJustin Hibbits replyLength = sizeof(uint32_t) + sizeof(uint32_t);
16840aeed3e9SJustin Hibbits if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
16850aeed3e9SJustin Hibbits (uint8_t*)&msg,
16860aeed3e9SJustin Hibbits sizeof(msg.msgId) +sizeof(uint32_t),
16870aeed3e9SJustin Hibbits (uint8_t*)&reply,
16880aeed3e9SJustin Hibbits &replyLength,
16890aeed3e9SJustin Hibbits NULL,
16900aeed3e9SJustin Hibbits NULL)) != E_OK)
16910aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
16920aeed3e9SJustin Hibbits if (replyLength != sizeof(uint32_t) + sizeof(uint32_t))
16930aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
16940aeed3e9SJustin Hibbits
16950aeed3e9SJustin Hibbits memcpy((uint8_t*)&outCounter, reply.replyBody, sizeof(uint32_t));
16960aeed3e9SJustin Hibbits return outCounter;
16970aeed3e9SJustin Hibbits }
16980aeed3e9SJustin Hibbits
16990aeed3e9SJustin Hibbits switch (counter)
17000aeed3e9SJustin Hibbits {
1701*852ba100SJustin Hibbits /* Parser statistics */
17020aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
1703*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pds);
17040aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
1705*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rrs);
17060aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
1707*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rrs);
17080aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
1709*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rrs);
17100aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
1711*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srrs);
17120aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
1713*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rres);
17140aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
1715*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rres);
17160aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
1717*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rres);
17180aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
1719*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srres);
17200aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
1721*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spcs);
17220aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
1723*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spscs);
17240aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
1725*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_hxscs);
17260aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
1727*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrcs);
17280aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
1729*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrscs);
17300aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
1731*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwcs);
17320aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
1733*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwscs);
17340aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
1735*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_fcscs);
17360aeed3e9SJustin Hibbits case (e_FM_PCD_KG_COUNTERS_TOTAL):
1737*852ba100SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_tpc);
17380aeed3e9SJustin Hibbits
1739*852ba100SJustin Hibbits /* Policer statistics */
17400aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_YELLOW):
17410aeed3e9SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ypcnt);
17420aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_RED):
17430aeed3e9SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rpcnt);
17440aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
17450aeed3e9SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rrpcnt);
17460aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
17470aeed3e9SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rypcnt);
17480aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_TOTAL):
17490aeed3e9SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_tpcnt);
17500aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
17510aeed3e9SJustin Hibbits return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_flmcnt);
1752*852ba100SJustin Hibbits }
17530aeed3e9SJustin Hibbits return 0;
17540aeed3e9SJustin Hibbits }
17550aeed3e9SJustin Hibbits
FM_PCD_SetException(t_Handle h_FmPcd,e_FmPcdExceptions exception,bool enable)17560aeed3e9SJustin Hibbits t_Error FM_PCD_SetException(t_Handle h_FmPcd, e_FmPcdExceptions exception, bool enable)
17570aeed3e9SJustin Hibbits {
17580aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
17590aeed3e9SJustin Hibbits uint32_t bitMask = 0, tmpReg;
17600aeed3e9SJustin Hibbits
17610aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
17620aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
17630aeed3e9SJustin Hibbits
17640aeed3e9SJustin Hibbits if (p_FmPcd->guestId != NCSW_MASTER_ID)
17650aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_SetException - guest mode!"));
17660aeed3e9SJustin Hibbits
17670aeed3e9SJustin Hibbits GET_FM_PCD_EXCEPTION_FLAG(bitMask, exception);
17680aeed3e9SJustin Hibbits
17690aeed3e9SJustin Hibbits if (bitMask)
17700aeed3e9SJustin Hibbits {
17710aeed3e9SJustin Hibbits if (enable)
17720aeed3e9SJustin Hibbits p_FmPcd->exceptions |= bitMask;
17730aeed3e9SJustin Hibbits else
17740aeed3e9SJustin Hibbits p_FmPcd->exceptions &= ~bitMask;
17750aeed3e9SJustin Hibbits
17760aeed3e9SJustin Hibbits switch (exception)
17770aeed3e9SJustin Hibbits {
17780aeed3e9SJustin Hibbits case (e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):
17790aeed3e9SJustin Hibbits case (e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):
17800aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdKg)
17810aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - keygen is not working"));
17820aeed3e9SJustin Hibbits break;
17830aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):
17840aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):
17850aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):
17860aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):
17870aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdPlcr)
17880aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - policer is not working"));
17890aeed3e9SJustin Hibbits break;
17900aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):
17910aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):
17920aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdPrs)
17930aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - parser is not working"));
17940aeed3e9SJustin Hibbits break;
17950aeed3e9SJustin Hibbits }
17960aeed3e9SJustin Hibbits
17970aeed3e9SJustin Hibbits switch (exception)
17980aeed3e9SJustin Hibbits {
17990aeed3e9SJustin Hibbits case (e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):
1800*852ba100SJustin Hibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer);
18010aeed3e9SJustin Hibbits if (enable)
1802*852ba100SJustin Hibbits tmpReg |= FM_EX_KG_DOUBLE_ECC;
18030aeed3e9SJustin Hibbits else
1804*852ba100SJustin Hibbits tmpReg &= ~FM_EX_KG_DOUBLE_ECC;
1805*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer, tmpReg);
18060aeed3e9SJustin Hibbits break;
18070aeed3e9SJustin Hibbits case (e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):
1808*852ba100SJustin Hibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer);
18090aeed3e9SJustin Hibbits if (enable)
1810*852ba100SJustin Hibbits tmpReg |= FM_EX_KG_KEYSIZE_OVERFLOW;
18110aeed3e9SJustin Hibbits else
1812*852ba100SJustin Hibbits tmpReg &= ~FM_EX_KG_KEYSIZE_OVERFLOW;
1813*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer, tmpReg);
18140aeed3e9SJustin Hibbits break;
18150aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):
1816*852ba100SJustin Hibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_perer);
18170aeed3e9SJustin Hibbits if (enable)
18180aeed3e9SJustin Hibbits tmpReg |= FM_PCD_PRS_DOUBLE_ECC;
18190aeed3e9SJustin Hibbits else
18200aeed3e9SJustin Hibbits tmpReg &= ~FM_PCD_PRS_DOUBLE_ECC;
1821*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_perer, tmpReg);
18220aeed3e9SJustin Hibbits break;
18230aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):
1824*852ba100SJustin Hibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pever);
18250aeed3e9SJustin Hibbits if (enable)
18260aeed3e9SJustin Hibbits tmpReg |= FM_PCD_PRS_SINGLE_ECC;
18270aeed3e9SJustin Hibbits else
18280aeed3e9SJustin Hibbits tmpReg &= ~FM_PCD_PRS_SINGLE_ECC;
1829*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pever, tmpReg);
18300aeed3e9SJustin Hibbits break;
18310aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):
18320aeed3e9SJustin Hibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier);
18330aeed3e9SJustin Hibbits if (enable)
18340aeed3e9SJustin Hibbits tmpReg |= FM_PCD_PLCR_DOUBLE_ECC;
18350aeed3e9SJustin Hibbits else
18360aeed3e9SJustin Hibbits tmpReg &= ~FM_PCD_PLCR_DOUBLE_ECC;
18370aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier, tmpReg);
18380aeed3e9SJustin Hibbits break;
18390aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):
18400aeed3e9SJustin Hibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier);
18410aeed3e9SJustin Hibbits if (enable)
18420aeed3e9SJustin Hibbits tmpReg |= FM_PCD_PLCR_INIT_ENTRY_ERROR;
18430aeed3e9SJustin Hibbits else
18440aeed3e9SJustin Hibbits tmpReg &= ~FM_PCD_PLCR_INIT_ENTRY_ERROR;
18450aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier, tmpReg);
18460aeed3e9SJustin Hibbits break;
18470aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):
18480aeed3e9SJustin Hibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier);
18490aeed3e9SJustin Hibbits if (enable)
18500aeed3e9SJustin Hibbits tmpReg |= FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE;
18510aeed3e9SJustin Hibbits else
18520aeed3e9SJustin Hibbits tmpReg &= ~FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE;
18530aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier, tmpReg);
18540aeed3e9SJustin Hibbits break;
18550aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):
18560aeed3e9SJustin Hibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier);
18570aeed3e9SJustin Hibbits if (enable)
18580aeed3e9SJustin Hibbits tmpReg |= FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE;
18590aeed3e9SJustin Hibbits else
18600aeed3e9SJustin Hibbits tmpReg &= ~FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE;
18610aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier, tmpReg);
18620aeed3e9SJustin Hibbits break;
18630aeed3e9SJustin Hibbits }
18640aeed3e9SJustin Hibbits /* for ECC exceptions driver automatically enables ECC mechanism, if disabled.
18650aeed3e9SJustin Hibbits Driver may disable them automatically, depending on driver's status */
18660aeed3e9SJustin Hibbits if (enable && ((exception == e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC) |
18670aeed3e9SJustin Hibbits (exception == e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC) |
18680aeed3e9SJustin Hibbits (exception == e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC) |
18690aeed3e9SJustin Hibbits (exception == e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC)))
18700aeed3e9SJustin Hibbits FmEnableRamsEcc(p_FmPcd->h_Fm);
18710aeed3e9SJustin Hibbits if (!enable && ((exception == e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC) |
18720aeed3e9SJustin Hibbits (exception == e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC) |
18730aeed3e9SJustin Hibbits (exception == e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC) |
18740aeed3e9SJustin Hibbits (exception == e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC)))
18750aeed3e9SJustin Hibbits FmDisableRamsEcc(p_FmPcd->h_Fm);
18760aeed3e9SJustin Hibbits }
18770aeed3e9SJustin Hibbits
18780aeed3e9SJustin Hibbits return E_OK;
18790aeed3e9SJustin Hibbits }
18800aeed3e9SJustin Hibbits
FM_PCD_ForceIntr(t_Handle h_FmPcd,e_FmPcdExceptions exception)18810aeed3e9SJustin Hibbits t_Error FM_PCD_ForceIntr (t_Handle h_FmPcd, e_FmPcdExceptions exception)
18820aeed3e9SJustin Hibbits {
18830aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
18840aeed3e9SJustin Hibbits
18850aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
18860aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
18870aeed3e9SJustin Hibbits
18880aeed3e9SJustin Hibbits if (p_FmPcd->guestId != NCSW_MASTER_ID)
18890aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ForceIntr - guest mode!"));
18900aeed3e9SJustin Hibbits
18910aeed3e9SJustin Hibbits switch (exception)
18920aeed3e9SJustin Hibbits {
18930aeed3e9SJustin Hibbits case (e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):
18940aeed3e9SJustin Hibbits case (e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):
18950aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdKg)
18960aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - keygen is not working"));
18970aeed3e9SJustin Hibbits break;
18980aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):
18990aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):
19000aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):
19010aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):
19020aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdPlcr)
19030aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - policer is not working"));
19040aeed3e9SJustin Hibbits break;
19050aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):
19060aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):
19070aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdPrs)
19080aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt -parsrer is not working"));
19090aeed3e9SJustin Hibbits break;
19100aeed3e9SJustin Hibbits default:
1911*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid interrupt requested"));
19120aeed3e9SJustin Hibbits }
19130aeed3e9SJustin Hibbits switch (exception)
19140aeed3e9SJustin Hibbits {
19150aeed3e9SJustin Hibbits case e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC:
19160aeed3e9SJustin Hibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_PRS_DOUBLE_ECC))
19170aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
19180aeed3e9SJustin Hibbits break;
19190aeed3e9SJustin Hibbits case e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC:
19200aeed3e9SJustin Hibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_PRS_SINGLE_ECC))
19210aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
19220aeed3e9SJustin Hibbits break;
19230aeed3e9SJustin Hibbits case e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC:
1924*852ba100SJustin Hibbits if (!(p_FmPcd->exceptions & FM_EX_KG_DOUBLE_ECC))
19250aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
1926*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_feer, FM_EX_KG_DOUBLE_ECC);
19270aeed3e9SJustin Hibbits break;
19280aeed3e9SJustin Hibbits case e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW:
1929*852ba100SJustin Hibbits if (!(p_FmPcd->exceptions & FM_EX_KG_KEYSIZE_OVERFLOW))
19300aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
1931*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_feer, FM_EX_KG_KEYSIZE_OVERFLOW);
19320aeed3e9SJustin Hibbits break;
19330aeed3e9SJustin Hibbits case e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC:
19340aeed3e9SJustin Hibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_DOUBLE_ECC))
19350aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
19360aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr, FM_PCD_PLCR_DOUBLE_ECC);
19370aeed3e9SJustin Hibbits break;
19380aeed3e9SJustin Hibbits case e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR:
19390aeed3e9SJustin Hibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_INIT_ENTRY_ERROR))
19400aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
19410aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr, FM_PCD_PLCR_INIT_ENTRY_ERROR);
19420aeed3e9SJustin Hibbits break;
19430aeed3e9SJustin Hibbits case e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE:
19440aeed3e9SJustin Hibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_PRAM_SELF_INIT_COMPLETE))
19450aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
19460aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr, FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE);
19470aeed3e9SJustin Hibbits break;
19480aeed3e9SJustin Hibbits case e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE:
19490aeed3e9SJustin Hibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_ATOMIC_ACTION_COMPLETE))
19500aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
19510aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr, FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE);
19520aeed3e9SJustin Hibbits break;
19530aeed3e9SJustin Hibbits }
19540aeed3e9SJustin Hibbits
19550aeed3e9SJustin Hibbits return E_OK;
19560aeed3e9SJustin Hibbits }
19570aeed3e9SJustin Hibbits
19580aeed3e9SJustin Hibbits
FM_PCD_ModifyCounter(t_Handle h_FmPcd,e_FmPcdCounters counter,uint32_t value)19590aeed3e9SJustin Hibbits t_Error FM_PCD_ModifyCounter(t_Handle h_FmPcd, e_FmPcdCounters counter, uint32_t value)
19600aeed3e9SJustin Hibbits {
19610aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
19620aeed3e9SJustin Hibbits
19630aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
19640aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
19650aeed3e9SJustin Hibbits
19660aeed3e9SJustin Hibbits if (p_FmPcd->guestId != NCSW_MASTER_ID)
19670aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ModifyCounter - guest mode!"));
19680aeed3e9SJustin Hibbits
19690aeed3e9SJustin Hibbits switch (counter)
19700aeed3e9SJustin Hibbits {
19710aeed3e9SJustin Hibbits case (e_FM_PCD_KG_COUNTERS_TOTAL):
19720aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdKg)
1973*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Invalid counters - KeyGen is not working"));
19740aeed3e9SJustin Hibbits break;
19750aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_YELLOW):
19760aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_RED):
19770aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
19780aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
19790aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_TOTAL):
19800aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
19810aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdPlcr)
1982*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Invalid counters - Policer is not working"));
19830aeed3e9SJustin Hibbits if (!(GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr) & FM_PCD_PLCR_GCR_STEN))
19840aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
19850aeed3e9SJustin Hibbits break;
19860aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
19870aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
19880aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
19890aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
19900aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
19910aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
19920aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
19930aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
19940aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
19950aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
19960aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
19970aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
19980aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
19990aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
20000aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
20010aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
20020aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
20030aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdPrs)
20040aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter"));
20050aeed3e9SJustin Hibbits break;
20060aeed3e9SJustin Hibbits default:
20070aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter"));
20080aeed3e9SJustin Hibbits }
20090aeed3e9SJustin Hibbits switch (counter)
20100aeed3e9SJustin Hibbits {
20110aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
2012*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pds, value);
20130aeed3e9SJustin Hibbits break;
20140aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
2015*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rrs, value);
20160aeed3e9SJustin Hibbits break;
20170aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
2018*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rrs, value);
20190aeed3e9SJustin Hibbits break;
20200aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
2021*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rrs, value);
20220aeed3e9SJustin Hibbits break;
20230aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
2024*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srrs, value);
20250aeed3e9SJustin Hibbits break;
20260aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
2027*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rres, value);
20280aeed3e9SJustin Hibbits break;
20290aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
2030*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rres, value);
20310aeed3e9SJustin Hibbits break;
20320aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
2033*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rres, value);
20340aeed3e9SJustin Hibbits break;
20350aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
2036*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srres, value);
20370aeed3e9SJustin Hibbits break;
20380aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
2039*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spcs, value);
20400aeed3e9SJustin Hibbits break;
20410aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
2042*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spscs, value);
20430aeed3e9SJustin Hibbits break;
20440aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
2045*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_hxscs, value);
20460aeed3e9SJustin Hibbits break;
20470aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
2048*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrcs, value);
20490aeed3e9SJustin Hibbits break;
20500aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
2051*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrscs, value);
20520aeed3e9SJustin Hibbits break;
20530aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
2054*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwcs, value);
20550aeed3e9SJustin Hibbits break;
20560aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
2057*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwscs, value);
20580aeed3e9SJustin Hibbits break;
20590aeed3e9SJustin Hibbits case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
2060*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_fcscs, value);
20610aeed3e9SJustin Hibbits break;
20620aeed3e9SJustin Hibbits case (e_FM_PCD_KG_COUNTERS_TOTAL):
2063*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_tpc,value);
20640aeed3e9SJustin Hibbits break;
20650aeed3e9SJustin Hibbits
20660aeed3e9SJustin Hibbits /*Policer counters*/
20670aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_YELLOW):
20680aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ypcnt, value);
20690aeed3e9SJustin Hibbits break;
20700aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_RED):
20710aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rpcnt, value);
20720aeed3e9SJustin Hibbits break;
20730aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
20740aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rrpcnt, value);
20750aeed3e9SJustin Hibbits break;
20760aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
20770aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rypcnt, value);
20780aeed3e9SJustin Hibbits break;
20790aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_TOTAL):
20800aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_tpcnt, value);
20810aeed3e9SJustin Hibbits break;
20820aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
20830aeed3e9SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_flmcnt, value);
20840aeed3e9SJustin Hibbits break;
20850aeed3e9SJustin Hibbits }
20860aeed3e9SJustin Hibbits
20870aeed3e9SJustin Hibbits return E_OK;
20880aeed3e9SJustin Hibbits }
20890aeed3e9SJustin Hibbits
FM_PCD_GetHcPort(t_Handle h_FmPcd)2090*852ba100SJustin Hibbits t_Handle FM_PCD_GetHcPort(t_Handle h_FmPcd)
2091*852ba100SJustin Hibbits {
2092*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
2093*852ba100SJustin Hibbits return FmHcGetPort(p_FmPcd->h_Hc);
2094*852ba100SJustin Hibbits }
2095*852ba100SJustin Hibbits
2096