xref: /freebsd/sys/contrib/ncsw/Peripherals/FM/Pcd/fm_pcd.c (revision c2c014f24c10f90d85126ac5fbd4d8524de32b1c)
1*852ba100SJustin Hibbits /*
2*852ba100SJustin Hibbits  * Copyright 2008-2012 Freescale Semiconductor Inc.
30aeed3e9SJustin Hibbits  *
40aeed3e9SJustin Hibbits  * Redistribution and use in source and binary forms, with or without
50aeed3e9SJustin Hibbits  * modification, are permitted provided that the following conditions are met:
60aeed3e9SJustin Hibbits  *     * Redistributions of source code must retain the above copyright
70aeed3e9SJustin Hibbits  *       notice, this list of conditions and the following disclaimer.
80aeed3e9SJustin Hibbits  *     * Redistributions in binary form must reproduce the above copyright
90aeed3e9SJustin Hibbits  *       notice, this list of conditions and the following disclaimer in the
100aeed3e9SJustin Hibbits  *       documentation and/or other materials provided with the distribution.
110aeed3e9SJustin Hibbits  *     * Neither the name of Freescale Semiconductor nor the
120aeed3e9SJustin Hibbits  *       names of its contributors may be used to endorse or promote products
130aeed3e9SJustin Hibbits  *       derived from this software without specific prior written permission.
140aeed3e9SJustin Hibbits  *
150aeed3e9SJustin Hibbits  *
160aeed3e9SJustin Hibbits  * ALTERNATIVELY, this software may be distributed under the terms of the
170aeed3e9SJustin Hibbits  * GNU General Public License ("GPL") as published by the Free Software
180aeed3e9SJustin Hibbits  * Foundation, either version 2 of that License or (at your option) any
190aeed3e9SJustin Hibbits  * later version.
200aeed3e9SJustin Hibbits  *
210aeed3e9SJustin Hibbits  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
220aeed3e9SJustin Hibbits  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
230aeed3e9SJustin Hibbits  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
240aeed3e9SJustin Hibbits  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
250aeed3e9SJustin Hibbits  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
260aeed3e9SJustin Hibbits  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
270aeed3e9SJustin Hibbits  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
280aeed3e9SJustin Hibbits  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
290aeed3e9SJustin Hibbits  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
300aeed3e9SJustin Hibbits  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
310aeed3e9SJustin Hibbits  */
320aeed3e9SJustin Hibbits 
33*852ba100SJustin Hibbits 
340aeed3e9SJustin Hibbits /******************************************************************************
350aeed3e9SJustin Hibbits  @File          fm_pcd.c
360aeed3e9SJustin Hibbits 
370aeed3e9SJustin Hibbits  @Description   FM PCD ...
380aeed3e9SJustin Hibbits *//***************************************************************************/
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