The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/ncsw/Peripherals/FM/Pcd/fm_pcd.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright 2008-2012 Freescale Semiconductor Inc.
    3  *
    4  * Redistribution and use in source and binary forms, with or without
    5  * modification, are permitted provided that the following conditions are met:
    6  *     * Redistributions of source code must retain the above copyright
    7  *       notice, this list of conditions and the following disclaimer.
    8  *     * Redistributions in binary form must reproduce the above copyright
    9  *       notice, this list of conditions and the following disclaimer in the
   10  *       documentation and/or other materials provided with the distribution.
   11  *     * Neither the name of Freescale Semiconductor nor the
   12  *       names of its contributors may be used to endorse or promote products
   13  *       derived from this software without specific prior written permission.
   14  *
   15  *
   16  * ALTERNATIVELY, this software may be distributed under the terms of the
   17  * GNU General Public License ("GPL") as published by the Free Software
   18  * Foundation, either version 2 of that License or (at your option) any
   19  * later version.
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
   22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   24  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
   25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   31  */
   32 
   33 
   34 /******************************************************************************
   35  @File          fm_pcd.c
   36 
   37  @Description   FM PCD ...
   38 *//***************************************************************************/
   39 #include "std_ext.h"
   40 #include "error_ext.h"
   41 #include "string_ext.h"
   42 #include "xx_ext.h"
   43 #include "sprint_ext.h"
   44 #include "debug_ext.h"
   45 #include "net_ext.h"
   46 #include "fm_ext.h"
   47 #include "fm_pcd_ext.h"
   48 
   49 #include "fm_common.h"
   50 #include "fm_pcd.h"
   51 #include "fm_pcd_ipc.h"
   52 #include "fm_hc.h"
   53 #include "fm_muram_ext.h"
   54 
   55 
   56 /****************************************/
   57 /*       static functions               */
   58 /****************************************/
   59 
   60 static t_Error CheckFmPcdParameters(t_FmPcd *p_FmPcd)
   61 {
   62     if (!p_FmPcd->h_Fm)
   63          RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("h_Fm has to be initialized"));
   64 
   65     if (p_FmPcd->guestId == NCSW_MASTER_ID)
   66     {
   67         if (p_FmPcd->p_FmPcdKg && !p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs)
   68             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something WRONG"));
   69 
   70         if (p_FmPcd->p_FmPcdPlcr && !p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs)
   71             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something WRONG"));
   72 
   73         if (!p_FmPcd->f_Exception)
   74             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("f_FmPcdExceptions has to be initialized"));
   75 
   76         if ((!p_FmPcd->f_FmPcdIndexedException) && (p_FmPcd->p_FmPcdPlcr || p_FmPcd->p_FmPcdKg))
   77             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("f_FmPcdIndexedException has to be initialized"));
   78 
   79         if (p_FmPcd->p_FmPcdDriverParam->prsMaxParseCycleLimit > PRS_MAX_CYCLE_LIMIT)
   80             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("prsMaxParseCycleLimit has to be less than 8191"));
   81     }
   82 
   83     return E_OK;
   84 }
   85 
   86 static volatile bool blockingFlag = FALSE;
   87 static void IpcMsgCompletionCB(t_Handle   h_FmPcd,
   88                                uint8_t    *p_Msg,
   89                                uint8_t    *p_Reply,
   90                                uint32_t   replyLength,
   91                                t_Error    status)
   92 {
   93     UNUSED(h_FmPcd);UNUSED(p_Msg);UNUSED(p_Reply);UNUSED(replyLength);UNUSED(status);
   94     blockingFlag = FALSE;
   95 }
   96 
   97 static t_Error IpcMsgHandlerCB(t_Handle  h_FmPcd,
   98                                uint8_t   *p_Msg,
   99                                uint32_t  msgLength,
  100                                uint8_t   *p_Reply,
  101                                uint32_t  *p_ReplyLength)
  102 {
  103     t_FmPcd             *p_FmPcd = (t_FmPcd*)h_FmPcd;
  104     t_Error             err = E_OK;
  105     t_FmPcdIpcMsg       *p_IpcMsg   = (t_FmPcdIpcMsg*)p_Msg;
  106     t_FmPcdIpcReply     *p_IpcReply = (t_FmPcdIpcReply*)p_Reply;
  107 
  108     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
  109     SANITY_CHECK_RETURN_ERROR((msgLength >= sizeof(uint32_t)), E_INVALID_VALUE);
  110 
  111 #ifdef DISABLE_SANITY_CHECKS
  112     UNUSED(msgLength);
  113 #endif /* DISABLE_SANITY_CHECKS */
  114 
  115     ASSERT_COND(p_Msg);
  116 
  117     memset(p_IpcReply, 0, (sizeof(uint8_t) * FM_PCD_MAX_REPLY_SIZE));
  118     *p_ReplyLength = 0;
  119 
  120     switch (p_IpcMsg->msgId)
  121     {
  122         case (FM_PCD_MASTER_IS_ALIVE):
  123             *(uint8_t*)(p_IpcReply->replyBody) = 1;
  124             p_IpcReply->error = E_OK;
  125             *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
  126             break;
  127         case (FM_PCD_MASTER_IS_ENABLED):
  128             /* count partitions registrations */
  129             if (p_FmPcd->enabled)
  130                 p_FmPcd->numOfEnabledGuestPartitionsPcds++;
  131             *(uint8_t*)(p_IpcReply->replyBody)  = (uint8_t)p_FmPcd->enabled;
  132             p_IpcReply->error = E_OK;
  133             *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
  134             break;
  135         case (FM_PCD_GUEST_DISABLE):
  136             if (p_FmPcd->numOfEnabledGuestPartitionsPcds)
  137             {
  138                 p_FmPcd->numOfEnabledGuestPartitionsPcds--;
  139                 p_IpcReply->error = E_OK;
  140             }
  141             else
  142             {
  143                 REPORT_ERROR(MINOR, E_INVALID_STATE,("Trying to disable an unregistered partition"));
  144                 p_IpcReply->error = E_INVALID_STATE;
  145             }
  146             *p_ReplyLength = sizeof(uint32_t);
  147             break;
  148         case (FM_PCD_GET_COUNTER):
  149         {
  150             e_FmPcdCounters inCounter;
  151             uint32_t        outCounter;
  152 
  153             memcpy((uint8_t*)&inCounter, p_IpcMsg->msgBody, sizeof(uint32_t));
  154             outCounter = FM_PCD_GetCounter(h_FmPcd, inCounter);
  155             memcpy(p_IpcReply->replyBody, (uint8_t*)&outCounter, sizeof(uint32_t));
  156             p_IpcReply->error = E_OK;
  157             *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);
  158             break;
  159         }
  160         case (FM_PCD_ALLOC_KG_SCHEMES):
  161         {
  162             t_FmPcdIpcKgSchemesParams   ipcSchemesParams;
  163 
  164             memcpy((uint8_t*)&ipcSchemesParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgSchemesParams));
  165             err = FmPcdKgAllocSchemes(h_FmPcd,
  166                                       ipcSchemesParams.numOfSchemes,
  167                                       ipcSchemesParams.guestId,
  168                                       p_IpcReply->replyBody);
  169             p_IpcReply->error = err;
  170             *p_ReplyLength = sizeof(uint32_t) + ipcSchemesParams.numOfSchemes*sizeof(uint8_t);
  171             break;
  172         }
  173         case (FM_PCD_FREE_KG_SCHEMES):
  174         {
  175             t_FmPcdIpcKgSchemesParams   ipcSchemesParams;
  176 
  177             memcpy((uint8_t*)&ipcSchemesParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgSchemesParams));
  178             err = FmPcdKgFreeSchemes(h_FmPcd,
  179                                      ipcSchemesParams.numOfSchemes,
  180                                      ipcSchemesParams.guestId,
  181                                      ipcSchemesParams.schemesIds);
  182             p_IpcReply->error = err;
  183             *p_ReplyLength = sizeof(uint32_t);
  184             break;
  185         }
  186         case (FM_PCD_ALLOC_KG_CLSPLAN):
  187         {
  188             t_FmPcdIpcKgClsPlanParams   ipcKgClsPlanParams;
  189 
  190             memcpy((uint8_t*)&ipcKgClsPlanParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgClsPlanParams));
  191             err = KgAllocClsPlanEntries(h_FmPcd,
  192                                         ipcKgClsPlanParams.numOfClsPlanEntries,
  193                                         ipcKgClsPlanParams.guestId,
  194                                         p_IpcReply->replyBody);
  195             p_IpcReply->error = err;
  196             *p_ReplyLength =  sizeof(uint32_t) + sizeof(uint8_t);
  197             break;
  198         }
  199         case (FM_PCD_FREE_KG_CLSPLAN):
  200         {
  201             t_FmPcdIpcKgClsPlanParams   ipcKgClsPlanParams;
  202 
  203             memcpy((uint8_t*)&ipcKgClsPlanParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgClsPlanParams));
  204             KgFreeClsPlanEntries(h_FmPcd,
  205                                  ipcKgClsPlanParams.numOfClsPlanEntries,
  206                                  ipcKgClsPlanParams.guestId,
  207                                  ipcKgClsPlanParams.clsPlanBase);
  208             *p_ReplyLength = sizeof(uint32_t);
  209             break;
  210         }
  211         case (FM_PCD_ALLOC_PROFILES):
  212         {
  213             t_FmIpcResourceAllocParams      ipcAllocParams;
  214             uint16_t                        base;
  215             memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
  216             base =  PlcrAllocProfilesForPartition(h_FmPcd,
  217                                                   ipcAllocParams.base,
  218                                                   ipcAllocParams.num,
  219                                                   ipcAllocParams.guestId);
  220             memcpy(p_IpcReply->replyBody, (uint16_t*)&base, sizeof(uint16_t));
  221             *p_ReplyLength = sizeof(uint32_t) + sizeof(uint16_t);
  222             break;
  223         }
  224         case (FM_PCD_FREE_PROFILES):
  225         {
  226             t_FmIpcResourceAllocParams   ipcAllocParams;
  227             memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
  228             PlcrFreeProfilesForPartition(h_FmPcd,
  229                                          ipcAllocParams.base,
  230                                          ipcAllocParams.num,
  231                                          ipcAllocParams.guestId);
  232             break;
  233         }
  234         case (FM_PCD_SET_PORT_PROFILES):
  235         {
  236             t_FmIpcResourceAllocParams   ipcAllocParams;
  237             memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
  238             PlcrSetPortProfiles(h_FmPcd,
  239                                 ipcAllocParams.guestId,
  240                                 ipcAllocParams.num,
  241                                 ipcAllocParams.base);
  242             break;
  243         }
  244         case (FM_PCD_CLEAR_PORT_PROFILES):
  245         {
  246             t_FmIpcResourceAllocParams   ipcAllocParams;
  247             memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));
  248             PlcrClearPortProfiles(h_FmPcd,
  249                                   ipcAllocParams.guestId);
  250             break;
  251         }
  252         case (FM_PCD_GET_SW_PRS_OFFSET):
  253         {
  254             t_FmPcdIpcSwPrsLable   ipcSwPrsLable;
  255             uint32_t               swPrsOffset;
  256 
  257             memcpy((uint8_t*)&ipcSwPrsLable, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcSwPrsLable));
  258             swPrsOffset =
  259                 FmPcdGetSwPrsOffset(h_FmPcd,
  260                                     (e_NetHeaderType)ipcSwPrsLable.enumHdr,
  261                                     ipcSwPrsLable.indexPerHdr);
  262             memcpy(p_IpcReply->replyBody, (uint8_t*)&swPrsOffset, sizeof(uint32_t));
  263             *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);
  264             break;
  265         }
  266         case (FM_PCD_PRS_INC_PORT_STATS):
  267         {
  268             t_FmPcdIpcPrsIncludePort   ipcPrsIncludePort;
  269 
  270             memcpy((uint8_t*)&ipcPrsIncludePort, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcPrsIncludePort));
  271             PrsIncludePortInStatistics(h_FmPcd,
  272                                        ipcPrsIncludePort.hardwarePortId,
  273                                        ipcPrsIncludePort.include);
  274            break;
  275         }
  276         default:
  277             *p_ReplyLength = 0;
  278             RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!"));
  279     }
  280     return E_OK;
  281 }
  282 
  283 static uint32_t NetEnvLock(t_Handle h_NetEnv)
  284 {
  285     ASSERT_COND(h_NetEnv);
  286     return XX_LockIntrSpinlock(((t_FmPcdNetEnv*)h_NetEnv)->h_Spinlock);
  287 }
  288 
  289 static void NetEnvUnlock(t_Handle h_NetEnv, uint32_t intFlags)
  290 {
  291     ASSERT_COND(h_NetEnv);
  292     XX_UnlockIntrSpinlock(((t_FmPcdNetEnv*)h_NetEnv)->h_Spinlock, intFlags);
  293 }
  294 
  295 static void EnqueueLockToFreeLst(t_FmPcd *p_FmPcd, t_FmPcdLock *p_Lock)
  296 {
  297     uint32_t   intFlags;
  298 
  299     intFlags = XX_LockIntrSpinlock(p_FmPcd->h_Spinlock);
  300     NCSW_LIST_AddToTail(&p_Lock->node, &p_FmPcd->freeLocksLst);
  301     XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);
  302 }
  303 
  304 static t_FmPcdLock * DequeueLockFromFreeLst(t_FmPcd *p_FmPcd)
  305 {
  306     t_FmPcdLock *p_Lock = NULL;
  307     uint32_t    intFlags;
  308 
  309     intFlags = XX_LockIntrSpinlock(p_FmPcd->h_Spinlock);
  310     if (!NCSW_LIST_IsEmpty(&p_FmPcd->freeLocksLst))
  311     {
  312         p_Lock = FM_PCD_LOCK_OBJ(p_FmPcd->freeLocksLst.p_Next);
  313         NCSW_LIST_DelAndInit(&p_Lock->node);
  314     }
  315     if (p_FmPcd->h_Spinlock)
  316         XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);
  317 
  318     return p_Lock;
  319 }
  320 
  321 static void EnqueueLockToAcquiredLst(t_FmPcd *p_FmPcd, t_FmPcdLock *p_Lock)
  322 {
  323     uint32_t   intFlags;
  324 
  325     intFlags = XX_LockIntrSpinlock(p_FmPcd->h_Spinlock);
  326     NCSW_LIST_AddToTail(&p_Lock->node, &p_FmPcd->acquiredLocksLst);
  327     XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);
  328 }
  329 
  330 static t_Error FillFreeLocksLst(t_FmPcd *p_FmPcd)
  331 {
  332     t_FmPcdLock *p_Lock;
  333     int         i;
  334 
  335     for (i=0; i<10; i++)
  336     {
  337         p_Lock = (t_FmPcdLock *)XX_Malloc(sizeof(t_FmPcdLock));
  338         if (!p_Lock)
  339             RETURN_ERROR(MINOR, E_NO_MEMORY, ("FM-PCD lock obj!"));
  340         memset(p_Lock, 0, sizeof(t_FmPcdLock));
  341         INIT_LIST(&p_Lock->node);
  342         p_Lock->h_Spinlock = XX_InitSpinlock();
  343         if (!p_Lock->h_Spinlock)
  344         {
  345             XX_Free(p_Lock);
  346             RETURN_ERROR(MINOR, E_INVALID_STATE, ("FM-PCD spinlock obj!"));
  347         }
  348         EnqueueLockToFreeLst(p_FmPcd, p_Lock);
  349     }
  350 
  351     return E_OK;
  352 }
  353 
  354 static void ReleaseFreeLocksLst(t_FmPcd *p_FmPcd)
  355 {
  356     t_FmPcdLock *p_Lock;
  357 
  358     p_Lock = DequeueLockFromFreeLst(p_FmPcd);
  359     while (p_Lock)
  360     {
  361         XX_FreeSpinlock(p_Lock->h_Spinlock);
  362         XX_Free(p_Lock);
  363         p_Lock = DequeueLockFromFreeLst(p_FmPcd);
  364     }
  365 }
  366 
  367 
  368 
  369 /*****************************************************************************/
  370 /*              Inter-module API routines                                    */
  371 /*****************************************************************************/
  372 
  373 void FmPcdSetClsPlanGrpId(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint8_t clsPlanGrpId)
  374 {
  375     ASSERT_COND(p_FmPcd);
  376     p_FmPcd->netEnvs[netEnvId].clsPlanGrpId = clsPlanGrpId;
  377 }
  378 
  379 t_Error PcdGetClsPlanGrpParams(t_FmPcd *p_FmPcd, t_FmPcdKgInterModuleClsPlanGrpParams *p_GrpParams)
  380 {
  381     uint8_t netEnvId = p_GrpParams->netEnvId;
  382     int     i, k, j;
  383 
  384     ASSERT_COND(p_FmPcd);
  385     if (p_FmPcd->netEnvs[netEnvId].clsPlanGrpId != ILLEGAL_CLS_PLAN)
  386     {
  387         p_GrpParams->grpExists = TRUE;
  388         p_GrpParams->clsPlanGrpId = p_FmPcd->netEnvs[netEnvId].clsPlanGrpId;
  389         return E_OK;
  390     }
  391 
  392     for (i=0; ((i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
  393               (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)); i++)
  394     {
  395         for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
  396                    (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)
  397         {
  398             /* if an option exists, add it to the opts list */
  399             if (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)
  400             {
  401                 /* check if this option already exists, add if it doesn't */
  402                 for (j = 0;j<p_GrpParams->numOfOptions;j++)
  403                 {
  404                     if (p_GrpParams->options[j] == p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)
  405                         break;
  406                 }
  407                 p_GrpParams->optVectors[j] |= p_FmPcd->netEnvs[netEnvId].unitsVectors[i];
  408                 if (j == p_GrpParams->numOfOptions)
  409                 {
  410                     p_GrpParams->options[p_GrpParams->numOfOptions] = p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt;
  411                     p_GrpParams->numOfOptions++;
  412                 }
  413             }
  414         }
  415     }
  416 
  417     if (p_GrpParams->numOfOptions == 0)
  418     {
  419         if (p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId != ILLEGAL_CLS_PLAN)
  420         {
  421             p_GrpParams->grpExists = TRUE;
  422             p_GrpParams->clsPlanGrpId = p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId;
  423         }
  424     }
  425 
  426     return E_OK;
  427 
  428 }
  429 
  430 t_Error PcdGetVectorForOpt(t_FmPcd *p_FmPcd, uint8_t netEnvId, protocolOpt_t opt, uint32_t *p_Vector)
  431 {
  432     uint8_t     j,k;
  433 
  434     *p_Vector = 0;
  435 
  436     ASSERT_COND(p_FmPcd);
  437     for (j=0; ((j < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
  438               (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[0].hdr != HEADER_TYPE_NONE)); j++)
  439     {
  440         for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
  441                   (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)
  442         {
  443             if (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[k].opt == opt)
  444                 *p_Vector |= p_FmPcd->netEnvs[netEnvId].unitsVectors[j];
  445         }
  446     }
  447 
  448     if (!*p_Vector)
  449         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Requested option was not defined for this Network Environment Characteristics module"));
  450     else
  451         return E_OK;
  452 }
  453 
  454 t_Error PcdGetUnitsVector(t_FmPcd *p_FmPcd, t_NetEnvParams *p_Params)
  455 {
  456     int                     i;
  457 
  458     ASSERT_COND(p_FmPcd);
  459     ASSERT_COND(p_Params->netEnvId < FM_MAX_NUM_OF_PORTS);
  460 
  461     p_Params->vector = 0;
  462     for (i=0; i<p_Params->numOfDistinctionUnits ;i++)
  463     {
  464         if (p_FmPcd->netEnvs[p_Params->netEnvId].units[p_Params->unitIds[i]].hdrs[0].hdr == HEADER_TYPE_NONE)
  465             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Requested unit was not defined for this Network Environment Characteristics module"));
  466         ASSERT_COND(p_FmPcd->netEnvs[p_Params->netEnvId].unitsVectors[p_Params->unitIds[i]]);
  467         p_Params->vector |= p_FmPcd->netEnvs[p_Params->netEnvId].unitsVectors[p_Params->unitIds[i]];
  468     }
  469 
  470     return E_OK;
  471 }
  472 
  473 bool PcdNetEnvIsUnitWithoutOpts(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint32_t unitVector)
  474 {
  475     int     i=0, k;
  476 
  477     ASSERT_COND(p_FmPcd);
  478     /* check whether a given unit may be used by non-clsPlan users. */
  479     /* first, recognize the unit by its vector */
  480     while (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)
  481     {
  482         if (p_FmPcd->netEnvs[netEnvId].unitsVectors[i] == unitVector)
  483         {
  484             for (k=0;
  485                  ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
  486                   (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE));
  487                  k++)
  488                 /* check that no option exists */
  489                 if ((protocolOpt_t)p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)
  490                     return FALSE;
  491             break;
  492         }
  493         i++;
  494     }
  495     /* assert that a unit was found to mach the vector */
  496     ASSERT_COND(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE);
  497 
  498     return TRUE;
  499 }
  500 bool  FmPcdNetEnvIsHdrExist(t_Handle h_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr)
  501 {
  502     t_FmPcd     *p_FmPcd = (t_FmPcd*)h_FmPcd;
  503     int         i, k;
  504 
  505     ASSERT_COND(p_FmPcd);
  506 
  507     for (i=0; ((i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
  508               (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)); i++)
  509     {
  510         for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
  511                   (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)
  512             if (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr == hdr)
  513                 return TRUE;
  514     }
  515     for (i=0; ((i < FM_PCD_MAX_NUM_OF_ALIAS_HDRS) &&
  516               (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE)); i++)
  517     {
  518         if (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr)
  519             return TRUE;
  520     }
  521 
  522     return FALSE;
  523 }
  524 
  525 uint8_t FmPcdNetEnvGetUnitId(t_FmPcd *p_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr, bool interchangeable, protocolOpt_t opt)
  526 {
  527     uint8_t     i, k;
  528 
  529     ASSERT_COND(p_FmPcd);
  530 
  531     if (interchangeable)
  532     {
  533         for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
  534                  (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
  535         {
  536             for (k=0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
  537                      (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
  538             {
  539                 if ((p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr == hdr) &&
  540                     (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt == opt))
  541 
  542                 return i;
  543             }
  544         }
  545     }
  546     else
  547     {
  548         for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
  549                  (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
  550             if ((p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr == hdr) &&
  551                 (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].opt == opt) &&
  552                 (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[1].hdr == HEADER_TYPE_NONE))
  553                     return i;
  554 
  555         for (i=0; (i < FM_PCD_MAX_NUM_OF_ALIAS_HDRS) &&
  556                  (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE); i++)
  557             if ((p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr) &&
  558                 (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].opt == opt))
  559                 return p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].aliasHdr;
  560     }
  561 
  562     return FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS;
  563 }
  564 
  565 t_Error FmPcdUnregisterReassmPort(t_Handle h_FmPcd, t_Handle h_ReasmCommonPramTbl)
  566 {
  567     t_FmPcd                         *p_FmPcd = (t_FmPcd*)h_FmPcd;
  568     t_FmPcdCcReassmTimeoutParams    ccReassmTimeoutParams = {0};
  569     uint8_t                         result;
  570     t_Error                         err = E_OK;
  571 
  572     ASSERT_COND(p_FmPcd);
  573     ASSERT_COND(h_ReasmCommonPramTbl);
  574 
  575     ccReassmTimeoutParams.iprcpt   = (uint32_t)(XX_VirtToPhys(h_ReasmCommonPramTbl) - p_FmPcd->physicalMuramBase);
  576     ccReassmTimeoutParams.activate = FALSE; /*Disable Timeout Task*/
  577 
  578     if ((err = FmHcPcdCcTimeoutReassm(p_FmPcd->h_Hc, &ccReassmTimeoutParams, &result)) != E_OK)
  579         RETURN_ERROR(MAJOR, err, NO_MSG);
  580 
  581     switch (result)
  582     {
  583         case (0):
  584             return E_OK;
  585         case (1):
  586             RETURN_ERROR(MAJOR, E_INVALID_STATE, (""));
  587         case (2):
  588             RETURN_ERROR(MAJOR, E_INVALID_STATE, (""));
  589         case (3):
  590             RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("Disable Timeout Task with invalid IPRCPT"));
  591         default:
  592             RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
  593     }
  594 
  595     return E_OK;
  596 }
  597 
  598 e_NetHeaderType FmPcdGetAliasHdr(t_FmPcd *p_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr)
  599 {
  600     int         i;
  601 
  602     ASSERT_COND(p_FmPcd);
  603     ASSERT_COND(netEnvId < FM_MAX_NUM_OF_PORTS);
  604 
  605     for (i=0; (i < FM_PCD_MAX_NUM_OF_ALIAS_HDRS)
  606         && (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE); i++)
  607     {
  608         if (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr)
  609             return p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].aliasHdr;
  610     }
  611 
  612     return HEADER_TYPE_NONE;
  613 }
  614 
  615 void   FmPcdPortRegister(t_Handle h_FmPcd, t_Handle h_FmPort, uint8_t hardwarePortId)
  616 {
  617     t_FmPcd         *p_FmPcd = (t_FmPcd*)h_FmPcd;
  618     uint16_t        swPortIndex = 0;
  619 
  620     ASSERT_COND(h_FmPcd);
  621     HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);
  622     p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].h_FmPort = h_FmPort;
  623 }
  624 
  625 uint32_t FmPcdGetLcv(t_Handle h_FmPcd, uint32_t netEnvId, uint8_t hdrNum)
  626 {
  627     t_FmPcd     *p_FmPcd = (t_FmPcd*)h_FmPcd;
  628 
  629     ASSERT_COND(h_FmPcd);
  630     return p_FmPcd->netEnvs[netEnvId].lcvs[hdrNum];
  631 }
  632 
  633 uint32_t FmPcdGetMacsecLcv(t_Handle h_FmPcd, uint32_t netEnvId)
  634 {
  635     t_FmPcd     *p_FmPcd = (t_FmPcd*)h_FmPcd;
  636 
  637     ASSERT_COND(h_FmPcd);
  638     return p_FmPcd->netEnvs[netEnvId].macsecVector;
  639 }
  640 
  641 uint8_t FmPcdGetNetEnvId(t_Handle h_NetEnv)
  642 {
  643     return ((t_FmPcdNetEnv*)h_NetEnv)->netEnvId;
  644 }
  645 
  646 void FmPcdIncNetEnvOwners(t_Handle h_FmPcd, uint8_t netEnvId)
  647 {
  648     uint32_t    intFlags;
  649 
  650     ASSERT_COND(h_FmPcd);
  651 
  652     intFlags = NetEnvLock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId]);
  653     ((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners++;
  654     NetEnvUnlock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId], intFlags);
  655 }
  656 
  657 void FmPcdDecNetEnvOwners(t_Handle h_FmPcd, uint8_t netEnvId)
  658 {
  659     uint32_t    intFlags;
  660 
  661     ASSERT_COND(h_FmPcd);
  662     ASSERT_COND(((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners);
  663 
  664     intFlags = NetEnvLock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId]);
  665     ((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners--;
  666     NetEnvUnlock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId], intFlags);
  667 }
  668 
  669 uint32_t FmPcdLock(t_Handle h_FmPcd)
  670 {
  671     ASSERT_COND(h_FmPcd);
  672     return XX_LockIntrSpinlock(((t_FmPcd*)h_FmPcd)->h_Spinlock);
  673 }
  674 
  675 void FmPcdUnlock(t_Handle h_FmPcd, uint32_t intFlags)
  676 {
  677     ASSERT_COND(h_FmPcd);
  678     XX_UnlockIntrSpinlock(((t_FmPcd*)h_FmPcd)->h_Spinlock, intFlags);
  679 }
  680 
  681 t_FmPcdLock * FmPcdAcquireLock(t_Handle h_FmPcd)
  682 {
  683     t_FmPcdLock *p_Lock;
  684     ASSERT_COND(h_FmPcd);
  685     p_Lock = DequeueLockFromFreeLst((t_FmPcd*)h_FmPcd);
  686     if (!p_Lock)
  687     {
  688         FillFreeLocksLst(h_FmPcd);
  689         p_Lock = DequeueLockFromFreeLst((t_FmPcd*)h_FmPcd);
  690     }
  691 
  692     if (p_Lock)
  693         EnqueueLockToAcquiredLst((t_FmPcd*)h_FmPcd, p_Lock);
  694     return p_Lock;
  695 }
  696 
  697 void FmPcdReleaseLock(t_Handle h_FmPcd, t_FmPcdLock *p_Lock)
  698 {
  699     uint32_t intFlags;
  700     ASSERT_COND(h_FmPcd);
  701     intFlags = FmPcdLock(h_FmPcd);
  702     NCSW_LIST_DelAndInit(&p_Lock->node);
  703     FmPcdUnlock(h_FmPcd, intFlags);
  704     EnqueueLockToFreeLst((t_FmPcd*)h_FmPcd, p_Lock);
  705 }
  706 
  707 bool FmPcdLockTryLockAll(t_Handle h_FmPcd)
  708 {
  709     uint32_t    intFlags;
  710     t_List      *p_Pos, *p_SavedPos=NULL;
  711 
  712     ASSERT_COND(h_FmPcd);
  713     intFlags = FmPcdLock(h_FmPcd);
  714     NCSW_LIST_FOR_EACH(p_Pos, &((t_FmPcd*)h_FmPcd)->acquiredLocksLst)
  715     {
  716         t_FmPcdLock *p_Lock = FM_PCD_LOCK_OBJ(p_Pos);
  717         if (!FmPcdLockTryLock(p_Lock))
  718         {
  719             p_SavedPos = p_Pos;
  720             break;
  721         }
  722     }
  723     if (p_SavedPos)
  724     {
  725         NCSW_LIST_FOR_EACH(p_Pos, &((t_FmPcd*)h_FmPcd)->acquiredLocksLst)
  726         {
  727             t_FmPcdLock *p_Lock = FM_PCD_LOCK_OBJ(p_Pos);
  728             if (p_Pos == p_SavedPos)
  729                 break;
  730             FmPcdLockUnlock(p_Lock);
  731         }
  732     }
  733     FmPcdUnlock(h_FmPcd, intFlags);
  734 
  735     CORE_MemoryBarrier();
  736 
  737     if (p_SavedPos)
  738         return FALSE;
  739 
  740     return TRUE;
  741 }
  742 
  743 void FmPcdLockUnlockAll(t_Handle h_FmPcd)
  744 {
  745     uint32_t    intFlags;
  746     t_List      *p_Pos;
  747 
  748     ASSERT_COND(h_FmPcd);
  749     intFlags = FmPcdLock(h_FmPcd);
  750     NCSW_LIST_FOR_EACH(p_Pos, &((t_FmPcd*)h_FmPcd)->acquiredLocksLst)
  751     {
  752         t_FmPcdLock *p_Lock = FM_PCD_LOCK_OBJ(p_Pos);
  753         p_Lock->flag = FALSE;
  754     }
  755     FmPcdUnlock(h_FmPcd, intFlags);
  756 
  757     CORE_MemoryBarrier();
  758 }
  759 
  760 t_Error FmPcdHcSync(t_Handle h_FmPcd)
  761 {
  762     ASSERT_COND(h_FmPcd);
  763     ASSERT_COND(((t_FmPcd*)h_FmPcd)->h_Hc);
  764 
  765     return FmHcPcdSync(((t_FmPcd*)h_FmPcd)->h_Hc);
  766 }
  767 
  768 t_Handle FmPcdGetHcHandle(t_Handle h_FmPcd)
  769 {
  770     ASSERT_COND(h_FmPcd);
  771     return ((t_FmPcd*)h_FmPcd)->h_Hc;
  772 }
  773 
  774 bool FmPcdIsAdvancedOffloadSupported(t_Handle h_FmPcd)
  775 {
  776     ASSERT_COND(h_FmPcd);
  777     return ((t_FmPcd*)h_FmPcd)->advancedOffloadSupport;
  778 }
  779 /*********************** End of inter-module routines ************************/
  780 
  781 
  782 /****************************************/
  783 /*       API Init unit functions        */
  784 /****************************************/
  785 
  786 t_Handle FM_PCD_Config(t_FmPcdParams *p_FmPcdParams)
  787 {
  788     t_FmPcd             *p_FmPcd = NULL;
  789     t_FmPhysAddr        physicalMuramBase;
  790     uint8_t             i;
  791 
  792     SANITY_CHECK_RETURN_VALUE(p_FmPcdParams, E_INVALID_HANDLE,NULL);
  793 
  794     p_FmPcd = (t_FmPcd *) XX_Malloc(sizeof(t_FmPcd));
  795     if (!p_FmPcd)
  796     {
  797         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD"));
  798         return NULL;
  799     }
  800     memset(p_FmPcd, 0, sizeof(t_FmPcd));
  801 
  802     p_FmPcd->p_FmPcdDriverParam = (t_FmPcdDriverParam *) XX_Malloc(sizeof(t_FmPcdDriverParam));
  803     if (!p_FmPcd->p_FmPcdDriverParam)
  804     {
  805         XX_Free(p_FmPcd);
  806         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Driver Param"));
  807         return NULL;
  808     }
  809     memset(p_FmPcd->p_FmPcdDriverParam, 0, sizeof(t_FmPcdDriverParam));
  810 
  811     p_FmPcd->h_Fm = p_FmPcdParams->h_Fm;
  812     p_FmPcd->guestId = FmGetGuestId(p_FmPcd->h_Fm);
  813     p_FmPcd->h_FmMuram = FmGetMuramHandle(p_FmPcd->h_Fm);
  814     if (p_FmPcd->h_FmMuram)
  815     {
  816         FmGetPhysicalMuramBase(p_FmPcdParams->h_Fm, &physicalMuramBase);
  817         p_FmPcd->physicalMuramBase = (uint64_t)((uint64_t)(&physicalMuramBase)->low | ((uint64_t)(&physicalMuramBase)->high << 32));
  818     }
  819 
  820     for (i = 0; i<FM_MAX_NUM_OF_PORTS; i++)
  821         p_FmPcd->netEnvs[i].clsPlanGrpId = ILLEGAL_CLS_PLAN;
  822 
  823     if (p_FmPcdParams->useHostCommand)
  824     {
  825         t_FmHcParams    hcParams;
  826 
  827         memset(&hcParams, 0, sizeof(hcParams));
  828         hcParams.h_Fm = p_FmPcd->h_Fm;
  829         hcParams.h_FmPcd = (t_Handle)p_FmPcd;
  830         memcpy((uint8_t*)&hcParams.params, (uint8_t*)&p_FmPcdParams->hc, sizeof(t_FmPcdHcParams));
  831         p_FmPcd->h_Hc = FmHcConfigAndInit(&hcParams);
  832         if (!p_FmPcd->h_Hc)
  833         {
  834             REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD HC"));
  835             FM_PCD_Free(p_FmPcd);
  836             return NULL;
  837         }
  838     }
  839     else if (p_FmPcd->guestId != NCSW_MASTER_ID)
  840         REPORT_ERROR(MAJOR, E_INVALID_STATE, ("No Host Command defined for a guest partition."));
  841 
  842     if (p_FmPcdParams->kgSupport)
  843     {
  844         p_FmPcd->p_FmPcdKg = (t_FmPcdKg *)KgConfig(p_FmPcd, p_FmPcdParams);
  845         if (!p_FmPcd->p_FmPcdKg)
  846         {
  847             REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Keygen"));
  848             FM_PCD_Free(p_FmPcd);
  849             return NULL;
  850         }
  851     }
  852 
  853     if (p_FmPcdParams->plcrSupport)
  854     {
  855         p_FmPcd->p_FmPcdPlcr = (t_FmPcdPlcr *)PlcrConfig(p_FmPcd, p_FmPcdParams);
  856         if (!p_FmPcd->p_FmPcdPlcr)
  857         {
  858             REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Policer"));
  859             FM_PCD_Free(p_FmPcd);
  860             return NULL;
  861         }
  862     }
  863 
  864     if (p_FmPcdParams->prsSupport)
  865     {
  866         p_FmPcd->p_FmPcdPrs = (t_FmPcdPrs *)PrsConfig(p_FmPcd, p_FmPcdParams);
  867         if (!p_FmPcd->p_FmPcdPrs)
  868         {
  869             REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Parser"));
  870             FM_PCD_Free(p_FmPcd);
  871             return NULL;
  872         }
  873     }
  874 
  875     p_FmPcd->h_Spinlock = XX_InitSpinlock();
  876     if (!p_FmPcd->h_Spinlock)
  877     {
  878         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD spinlock"));
  879         FM_PCD_Free(p_FmPcd);
  880         return NULL;
  881     }
  882     INIT_LIST(&p_FmPcd->freeLocksLst);
  883     INIT_LIST(&p_FmPcd->acquiredLocksLst);
  884 
  885     p_FmPcd->numOfEnabledGuestPartitionsPcds = 0;
  886 
  887     p_FmPcd->f_Exception                = p_FmPcdParams->f_Exception;
  888     p_FmPcd->f_FmPcdIndexedException    = p_FmPcdParams->f_ExceptionId;
  889     p_FmPcd->h_App                      = p_FmPcdParams->h_App;
  890 
  891     p_FmPcd->p_CcShadow                 = NULL;
  892     p_FmPcd->ccShadowSize               = 0;
  893     p_FmPcd->ccShadowAlign              = 0;
  894 
  895     p_FmPcd->h_ShadowSpinlock = XX_InitSpinlock();
  896     if (!p_FmPcd->h_ShadowSpinlock)
  897     {
  898         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD shadow spinlock"));
  899         FM_PCD_Free(p_FmPcd);
  900         return NULL;
  901     }
  902 
  903     return p_FmPcd;
  904 }
  905 
  906 t_Error FM_PCD_Init(t_Handle h_FmPcd)
  907 {
  908     t_FmPcd         *p_FmPcd = (t_FmPcd*)h_FmPcd;
  909     t_Error         err = E_OK;
  910     t_FmPcdIpcMsg   msg;
  911 
  912     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
  913     SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE);
  914 
  915     FM_GetRevision(p_FmPcd->h_Fm, &p_FmPcd->fmRevInfo);
  916 
  917     if (p_FmPcd->guestId != NCSW_MASTER_ID)
  918     {
  919         memset(p_FmPcd->fmPcdIpcHandlerModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);
  920         if (Sprint (p_FmPcd->fmPcdIpcHandlerModuleName, "FM_PCD_%d_%d", FmGetId(p_FmPcd->h_Fm), NCSW_MASTER_ID) != 10)
  921             RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
  922         memset(p_FmPcd->fmPcdModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);
  923         if (Sprint (p_FmPcd->fmPcdModuleName, "FM_PCD_%d_%d",FmGetId(p_FmPcd->h_Fm), p_FmPcd->guestId) != (p_FmPcd->guestId<10 ? 10:11))
  924             RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
  925 
  926         p_FmPcd->h_IpcSession = XX_IpcInitSession(p_FmPcd->fmPcdIpcHandlerModuleName, p_FmPcd->fmPcdModuleName);
  927         if (p_FmPcd->h_IpcSession)
  928         {
  929             t_FmPcdIpcReply         reply;
  930             uint32_t                replyLength;
  931             uint8_t                 isMasterAlive = 0;
  932 
  933             memset(&msg, 0, sizeof(msg));
  934             memset(&reply, 0, sizeof(reply));
  935             msg.msgId = FM_PCD_MASTER_IS_ALIVE;
  936             msg.msgBody[0] = p_FmPcd->guestId;
  937             blockingFlag = TRUE;
  938 
  939             do
  940             {
  941                 replyLength = sizeof(uint32_t) + sizeof(isMasterAlive);
  942                 if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
  943                                              (uint8_t*)&msg,
  944                                              sizeof(msg.msgId)+sizeof(p_FmPcd->guestId),
  945                                              (uint8_t*)&reply,
  946                                              &replyLength,
  947                                              IpcMsgCompletionCB,
  948                                              h_FmPcd)) != E_OK)
  949                     REPORT_ERROR(MAJOR, err, NO_MSG);
  950                 while (blockingFlag) ;
  951                 if (replyLength != (sizeof(uint32_t) + sizeof(isMasterAlive)))
  952                     REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
  953                 isMasterAlive = *(uint8_t*)(reply.replyBody);
  954             } while (!isMasterAlive);
  955         }
  956     }
  957 
  958     CHECK_INIT_PARAMETERS(p_FmPcd, CheckFmPcdParameters);
  959 
  960     if (p_FmPcd->p_FmPcdKg)
  961     {
  962         err = KgInit(p_FmPcd);
  963         if (err)
  964             RETURN_ERROR(MAJOR, err, NO_MSG);
  965     }
  966 
  967     if (p_FmPcd->p_FmPcdPlcr)
  968     {
  969         err = PlcrInit(p_FmPcd);
  970         if (err)
  971             RETURN_ERROR(MAJOR, err, NO_MSG);
  972     }
  973 
  974     if (p_FmPcd->p_FmPcdPrs)
  975     {
  976         err = PrsInit(p_FmPcd);
  977         if (err)
  978             RETURN_ERROR(MAJOR, err, NO_MSG);
  979     }
  980 
  981     if (p_FmPcd->guestId == NCSW_MASTER_ID)
  982     {
  983          /* register to inter-core messaging mechanism */
  984         memset(p_FmPcd->fmPcdModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);
  985         if (Sprint (p_FmPcd->fmPcdModuleName, "FM_PCD_%d_%d",FmGetId(p_FmPcd->h_Fm),NCSW_MASTER_ID) != 10)
  986             RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
  987         err = XX_IpcRegisterMsgHandler(p_FmPcd->fmPcdModuleName, IpcMsgHandlerCB, p_FmPcd, FM_PCD_MAX_REPLY_SIZE);
  988         if (err)
  989             RETURN_ERROR(MAJOR, err, NO_MSG);
  990     }
  991 
  992     /* IPv6 Frame-Id used for fragmentation */
  993     p_FmPcd->ipv6FrameIdAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram, 4, 4));
  994     if (!p_FmPcd->ipv6FrameIdAddr)
  995     {
  996         FM_PCD_Free(p_FmPcd);
  997         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for IPv6 Frame-Id"));
  998     }
  999     IOMemSet32(UINT_TO_PTR(p_FmPcd->ipv6FrameIdAddr), 0,  4);
 1000 
 1001     /* CAPWAP Frame-Id used for fragmentation */
 1002     p_FmPcd->capwapFrameIdAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram, 2, 4));
 1003     if (!p_FmPcd->capwapFrameIdAddr)
 1004     {
 1005         FM_PCD_Free(p_FmPcd);
 1006         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CAPWAP Frame-Id"));
 1007     }
 1008     IOMemSet32(UINT_TO_PTR(p_FmPcd->capwapFrameIdAddr), 0,  2);
 1009 
 1010     XX_Free(p_FmPcd->p_FmPcdDriverParam);
 1011     p_FmPcd->p_FmPcdDriverParam = NULL;
 1012 
 1013     FmRegisterPcd(p_FmPcd->h_Fm, p_FmPcd);
 1014 
 1015     return E_OK;
 1016 }
 1017 
 1018 t_Error FM_PCD_Free(t_Handle h_FmPcd)
 1019 {
 1020     t_FmPcd                             *p_FmPcd =(t_FmPcd *)h_FmPcd;
 1021     t_Error                             err = E_OK;
 1022 
 1023     if (p_FmPcd->ipv6FrameIdAddr)
 1024         FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, UINT_TO_PTR(p_FmPcd->ipv6FrameIdAddr));
 1025 
 1026     if (p_FmPcd->capwapFrameIdAddr)
 1027         FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, UINT_TO_PTR(p_FmPcd->capwapFrameIdAddr));
 1028 
 1029     if (p_FmPcd->enabled)
 1030         FM_PCD_Disable(p_FmPcd);
 1031 
 1032     if (p_FmPcd->p_FmPcdDriverParam)
 1033     {
 1034         XX_Free(p_FmPcd->p_FmPcdDriverParam);
 1035         p_FmPcd->p_FmPcdDriverParam = NULL;
 1036     }
 1037 
 1038     if (p_FmPcd->p_FmPcdKg)
 1039     {
 1040         if ((err = KgFree(p_FmPcd)) != E_OK)
 1041             RETURN_ERROR(MINOR, err, NO_MSG);
 1042         XX_Free(p_FmPcd->p_FmPcdKg);
 1043         p_FmPcd->p_FmPcdKg = NULL;
 1044     }
 1045 
 1046     if (p_FmPcd->p_FmPcdPlcr)
 1047     {
 1048         PlcrFree(p_FmPcd);
 1049         XX_Free(p_FmPcd->p_FmPcdPlcr);
 1050         p_FmPcd->p_FmPcdPlcr = NULL;
 1051     }
 1052 
 1053     if (p_FmPcd->p_FmPcdPrs)
 1054     {
 1055         if (p_FmPcd->guestId == NCSW_MASTER_ID)
 1056             PrsFree(p_FmPcd);
 1057         XX_Free(p_FmPcd->p_FmPcdPrs);
 1058         p_FmPcd->p_FmPcdPrs = NULL;
 1059     }
 1060 
 1061     if (p_FmPcd->h_Hc)
 1062     {
 1063         FmHcFree(p_FmPcd->h_Hc);
 1064         p_FmPcd->h_Hc = NULL;
 1065     }
 1066 
 1067     XX_IpcUnregisterMsgHandler(p_FmPcd->fmPcdModuleName);
 1068 
 1069     FmUnregisterPcd(p_FmPcd->h_Fm);
 1070 
 1071     ReleaseFreeLocksLst(p_FmPcd);
 1072 
 1073     if (p_FmPcd->h_Spinlock)
 1074         XX_FreeSpinlock(p_FmPcd->h_Spinlock);
 1075 
 1076     if (p_FmPcd->h_ShadowSpinlock)
 1077         XX_FreeSpinlock(p_FmPcd->h_ShadowSpinlock);
 1078 
 1079     XX_Free(p_FmPcd);
 1080 
 1081     return E_OK;
 1082 }
 1083 
 1084 t_Error FM_PCD_ConfigException(t_Handle h_FmPcd, e_FmPcdExceptions exception, bool enable)
 1085 {
 1086     t_FmPcd         *p_FmPcd = (t_FmPcd*)h_FmPcd;
 1087     uint32_t        bitMask = 0;
 1088 
 1089     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
 1090 
 1091     if (p_FmPcd->guestId != NCSW_MASTER_ID)
 1092         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ConfigException - guest mode!"));
 1093 
 1094     GET_FM_PCD_EXCEPTION_FLAG(bitMask, exception);
 1095     if (bitMask)
 1096     {
 1097         if (enable)
 1098             p_FmPcd->exceptions |= bitMask;
 1099         else
 1100             p_FmPcd->exceptions &= ~bitMask;
 1101    }
 1102     else
 1103         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
 1104 
 1105     return E_OK;
 1106 }
 1107 
 1108 t_Error FM_PCD_ConfigHcFramesDataMemory(t_Handle h_FmPcd, uint8_t memId)
 1109 {
 1110     t_FmPcd         *p_FmPcd = (t_FmPcd*)h_FmPcd;
 1111 
 1112     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
 1113     SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
 1114 
 1115     return FmHcSetFramesDataMemory(p_FmPcd->h_Hc, memId);
 1116 }
 1117 
 1118 t_Error FM_PCD_Enable(t_Handle h_FmPcd)
 1119 {
 1120     t_FmPcd             *p_FmPcd = (t_FmPcd*)h_FmPcd;
 1121     t_Error             err = E_OK;
 1122 
 1123     SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
 1124 
 1125     if (p_FmPcd->enabled)
 1126         return E_OK;
 1127 
 1128     if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
 1129         p_FmPcd->h_IpcSession)
 1130     {
 1131         uint8_t         enabled;
 1132         t_FmPcdIpcMsg   msg;
 1133         t_FmPcdIpcReply reply;
 1134         uint32_t        replyLength;
 1135 
 1136         memset(&reply, 0, sizeof(reply));
 1137         memset(&msg, 0, sizeof(msg));
 1138         msg.msgId = FM_PCD_MASTER_IS_ENABLED;
 1139         replyLength = sizeof(uint32_t) + sizeof(enabled);
 1140         if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
 1141                                      (uint8_t*)&msg,
 1142                                      sizeof(msg.msgId),
 1143                                      (uint8_t*)&reply,
 1144                                      &replyLength,
 1145                                      NULL,
 1146                                      NULL)) != E_OK)
 1147             RETURN_ERROR(MAJOR, err, NO_MSG);
 1148         if (replyLength != sizeof(uint32_t) + sizeof(enabled))
 1149             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
 1150         p_FmPcd->enabled = (bool)!!(*(uint8_t*)(reply.replyBody));
 1151         if (!p_FmPcd->enabled)
 1152             RETURN_ERROR(MAJOR, E_INVALID_STATE, ("FM-PCD master should be enabled first!"));
 1153 
 1154         return E_OK;
 1155     }
 1156     else if (p_FmPcd->guestId != NCSW_MASTER_ID)
 1157         RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
 1158                      ("running in guest-mode without IPC!"));
 1159 
 1160     if (p_FmPcd->p_FmPcdKg)
 1161         KgEnable(p_FmPcd);
 1162 
 1163     if (p_FmPcd->p_FmPcdPlcr)
 1164         PlcrEnable(p_FmPcd);
 1165 
 1166     if (p_FmPcd->p_FmPcdPrs)
 1167         PrsEnable(p_FmPcd);
 1168 
 1169     p_FmPcd->enabled = TRUE;
 1170 
 1171     return E_OK;
 1172 }
 1173 
 1174 t_Error FM_PCD_Disable(t_Handle h_FmPcd)
 1175 {
 1176     t_FmPcd             *p_FmPcd = (t_FmPcd*)h_FmPcd;
 1177     t_Error             err = E_OK;
 1178 
 1179     SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
 1180 
 1181     if (!p_FmPcd->enabled)
 1182         return E_OK;
 1183 
 1184     if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
 1185         p_FmPcd->h_IpcSession)
 1186     {
 1187         t_FmPcdIpcMsg       msg;
 1188         t_FmPcdIpcReply     reply;
 1189         uint32_t            replyLength;
 1190 
 1191         memset(&reply, 0, sizeof(reply));
 1192         memset(&msg, 0, sizeof(msg));
 1193         msg.msgId = FM_PCD_GUEST_DISABLE;
 1194         replyLength = sizeof(uint32_t);
 1195         if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
 1196                                      (uint8_t*)&msg,
 1197                                      sizeof(msg.msgId),
 1198                                      (uint8_t*)&reply,
 1199                                      &replyLength,
 1200                                      NULL,
 1201                                      NULL)) != E_OK)
 1202             RETURN_ERROR(MAJOR, err, NO_MSG);
 1203         if (replyLength != sizeof(uint32_t))
 1204             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
 1205         if (reply.error == E_OK)
 1206             p_FmPcd->enabled = FALSE;
 1207 
 1208         return (t_Error)(reply.error);
 1209     }
 1210     else if (p_FmPcd->guestId != NCSW_MASTER_ID)
 1211         RETURN_ERROR(MINOR, E_NOT_SUPPORTED,
 1212                      ("running in guest-mode without IPC!"));
 1213 
 1214     if (p_FmPcd->numOfEnabledGuestPartitionsPcds != 0)
 1215         RETURN_ERROR(MAJOR, E_INVALID_STATE,
 1216                      ("Trying to disable a master partition PCD while"
 1217                       "guest partitions are still enabled!"));
 1218 
 1219     if (p_FmPcd->p_FmPcdKg)
 1220          KgDisable(p_FmPcd);
 1221 
 1222     if (p_FmPcd->p_FmPcdPlcr)
 1223         PlcrDisable(p_FmPcd);
 1224 
 1225     if (p_FmPcd->p_FmPcdPrs)
 1226         PrsDisable(p_FmPcd);
 1227 
 1228     p_FmPcd->enabled = FALSE;
 1229 
 1230     return E_OK;
 1231 }
 1232 
 1233 t_Handle FM_PCD_NetEnvCharacteristicsSet(t_Handle h_FmPcd, t_FmPcdNetEnvParams  *p_NetEnvParams)
 1234 {
 1235     t_FmPcd                 *p_FmPcd = (t_FmPcd*)h_FmPcd;
 1236     uint32_t                intFlags, specialUnits = 0;
 1237     uint8_t                 bitId = 0;
 1238     uint8_t                 i, j, k;
 1239     uint8_t                 netEnvCurrId;
 1240     uint8_t                 ipsecAhUnit = 0,ipsecEspUnit = 0;
 1241     bool                    ipsecAhExists = FALSE, ipsecEspExists = FALSE, shim1Selected = FALSE;
 1242     uint8_t                 hdrNum;
 1243     t_FmPcdNetEnvParams     *p_ModifiedNetEnvParams;
 1244 
 1245     SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_STATE, NULL);
 1246     SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, NULL);
 1247     SANITY_CHECK_RETURN_VALUE(p_NetEnvParams, E_NULL_POINTER, NULL);
 1248 
 1249     intFlags = FmPcdLock(p_FmPcd);
 1250 
 1251     /* find a new netEnv */
 1252     for (i = 0; i < FM_MAX_NUM_OF_PORTS; i++)
 1253         if (!p_FmPcd->netEnvs[i].used)
 1254             break;
 1255 
 1256     if (i== FM_MAX_NUM_OF_PORTS)
 1257     {
 1258         REPORT_ERROR(MAJOR, E_FULL,("No more than %d netEnv's allowed.", FM_MAX_NUM_OF_PORTS));
 1259         FmPcdUnlock(p_FmPcd, intFlags);
 1260         return NULL;
 1261     }
 1262 
 1263     p_FmPcd->netEnvs[i].used = TRUE;
 1264     FmPcdUnlock(p_FmPcd, intFlags);
 1265 
 1266     /* As anyone doesn't have handle of this netEnv yet, no need
 1267        to protect it with spinlocks */
 1268 
 1269     p_ModifiedNetEnvParams = (t_FmPcdNetEnvParams *)XX_Malloc(sizeof(t_FmPcdNetEnvParams));
 1270     if (!p_ModifiedNetEnvParams)
 1271     {
 1272         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FmPcdNetEnvParams"));
 1273         return NULL;
 1274     }
 1275 
 1276     memcpy(p_ModifiedNetEnvParams, p_NetEnvParams, sizeof(t_FmPcdNetEnvParams));
 1277     p_NetEnvParams = p_ModifiedNetEnvParams;
 1278 
 1279     netEnvCurrId = (uint8_t)i;
 1280 
 1281     /* clear from previous use */
 1282     memset(&p_FmPcd->netEnvs[netEnvCurrId].units, 0, FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS * sizeof(t_FmPcdIntDistinctionUnit));
 1283     memset(&p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs, 0, FM_PCD_MAX_NUM_OF_ALIAS_HDRS * sizeof(t_FmPcdNetEnvAliases));
 1284     memcpy(&p_FmPcd->netEnvs[netEnvCurrId].units, p_NetEnvParams->units, p_NetEnvParams->numOfDistinctionUnits*sizeof(t_FmPcdIntDistinctionUnit));
 1285 
 1286     p_FmPcd->netEnvs[netEnvCurrId].netEnvId = netEnvCurrId;
 1287     p_FmPcd->netEnvs[netEnvCurrId].h_FmPcd = p_FmPcd;
 1288 
 1289     p_FmPcd->netEnvs[netEnvCurrId].clsPlanGrpId = ILLEGAL_CLS_PLAN;
 1290 
 1291     /* check that header with opt is not interchanged with the same header */
 1292     for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
 1293             && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
 1294     {
 1295         for (k = 0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
 1296             && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
 1297         {
 1298             /* if an option exists, check that other headers are not the same header
 1299             without option */
 1300             if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt)
 1301             {
 1302                 for (j = 0; (j < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
 1303                         && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].hdr != HEADER_TYPE_NONE); j++)
 1304                 {
 1305                     if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].hdr == p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr) &&
 1306                         !p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].opt)
 1307                     {
 1308                         REPORT_ERROR(MINOR, E_FULL,
 1309                                 ("Illegal unit - header with opt may not be interchangeable with the same header without opt"));
 1310                         XX_Free(p_ModifiedNetEnvParams);
 1311                         return NULL;
 1312                     }
 1313                 }
 1314             }
 1315         }
 1316     }
 1317 
 1318     /* Specific headers checking  */
 1319     for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
 1320         && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
 1321     {
 1322         for (k = 0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
 1323             && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
 1324         {
 1325             /* Some headers pairs may not be defined on different units as the parser
 1326             doesn't distinguish */
 1327             /* IPSEC_AH and IPSEC_SPI can't be 2 units,  */
 1328             /* check that header with opt is not interchanged with the same header */
 1329             if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPSEC_AH)
 1330             {
 1331                 if (ipsecEspExists && (ipsecEspUnit != i))
 1332                 {
 1333                     REPORT_ERROR(MINOR, E_INVALID_STATE, ("HEADER_TYPE_IPSEC_AH and HEADER_TYPE_IPSEC_ESP may not be defined in separate units"));
 1334                     XX_Free(p_ModifiedNetEnvParams);
 1335                     return NULL;
 1336                 }
 1337                 else
 1338                 {
 1339                     ipsecAhUnit = i;
 1340                     ipsecAhExists = TRUE;
 1341                 }
 1342             }
 1343             if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPSEC_ESP)
 1344             {
 1345                 if (ipsecAhExists && (ipsecAhUnit != i))
 1346                 {
 1347                     REPORT_ERROR(MINOR, E_INVALID_STATE, ("HEADER_TYPE_IPSEC_AH and HEADER_TYPE_IPSEC_ESP may not be defined in separate units"));
 1348                     XX_Free(p_ModifiedNetEnvParams);
 1349                     return NULL;
 1350                 }
 1351                 else
 1352                 {
 1353                     ipsecEspUnit = i;
 1354                     ipsecEspExists = TRUE;
 1355                 }
 1356             }
 1357             /* ENCAP_ESP  */
 1358             if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_UDP_ENCAP_ESP)
 1359             {
 1360                 /* IPSec UDP encapsulation is currently set to use SHIM1 */
 1361                 p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_UDP_ENCAP_ESP;
 1362                 p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM1;
 1363                 p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM1;
 1364                 p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
 1365             }
 1366 #if (DPAA_VERSION >= 11) || ((DPAA_VERSION == 10) && defined(FM_CAPWAP_SUPPORT))
 1367             /* UDP_LITE  */
 1368             if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_UDP_LITE)
 1369             {
 1370                 p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_UDP_LITE;
 1371                 p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_UDP;
 1372                 p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_UDP;
 1373                 p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
 1374             }
 1375 #endif /* (DPAA_VERSION >= 11) || ((DPAA_VERSION == 10) && defined(FM_CAPWAP_SUPPORT)) */
 1376 
 1377             /* IP FRAG  */
 1378             if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPv4) &&
 1379                 (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt == IPV4_FRAG_1))
 1380             {
 1381                 /* If IPv4+Frag, we need to set 2 units - SHIM 2 and IPv4. We first set SHIM2, and than check if
 1382                  * IPv4 exists. If so we don't need to set an extra unit
 1383                  * We consider as "having IPv4" any IPv4 without interchangable headers
 1384                  * but including any options.  */
 1385                 p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_IPv4;
 1386                 p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].opt = IPV4_FRAG_1;
 1387                 p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM2;
 1388                 p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM2;
 1389                 p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
 1390 
 1391                 /* check if IPv4 header exists by itself */
 1392                 if (FmPcdNetEnvGetUnitId(p_FmPcd, netEnvCurrId, HEADER_TYPE_IPv4, FALSE, 0) == FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
 1393                 {
 1394                     p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits].hdrs[0].hdr = HEADER_TYPE_IPv4;
 1395                     p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits++].hdrs[0].opt = 0;
 1396                 }
 1397             }
 1398             if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPv6) &&
 1399                 (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt == IPV6_FRAG_1))
 1400             {
 1401                 /* If IPv6+Frag, we need to set 2 units - SHIM 2 and IPv6. We first set SHIM2, and than check if
 1402                  * IPv4 exists. If so we don't need to set an extra unit
 1403                  * We consider as "having IPv6" any IPv6 without interchangable headers
 1404                  * but including any options.  */
 1405                 p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_IPv6;
 1406                 p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].opt = IPV6_FRAG_1;
 1407                 p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM2;
 1408                 p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM2;
 1409                 p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
 1410 
 1411                 /* check if IPv6 header exists by itself */
 1412                 if (FmPcdNetEnvGetUnitId(p_FmPcd, netEnvCurrId, HEADER_TYPE_IPv6, FALSE, 0) == FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
 1413                 {
 1414                     p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits].hdrs[0].hdr = HEADER_TYPE_IPv6;
 1415                     p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits++].hdrs[0].opt = 0;
 1416                 }
 1417             }
 1418 #if (DPAA_VERSION >= 11)
 1419             /* CAPWAP FRAG  */
 1420             if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_CAPWAP) &&
 1421                 (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt == CAPWAP_FRAG_1))
 1422             {
 1423                 p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_CAPWAP;
 1424                 p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].opt = CAPWAP_FRAG_1;
 1425                 p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM2;
 1426                 p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM2;
 1427                 p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
 1428             }
 1429 #endif /* (DPAA_VERSION >= 11) */
 1430         }
 1431     }
 1432 
 1433     /* if private header (shim), check that no other headers specified */
 1434     for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
 1435         && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
 1436     {
 1437         if (IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
 1438             if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[1].hdr != HEADER_TYPE_NONE)
 1439             {
 1440                 REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("SHIM header may not be interchanged with other headers"));
 1441                 XX_Free(p_ModifiedNetEnvParams);
 1442                 return NULL;
 1443             }
 1444     }
 1445 
 1446     for (i = 0; i < p_NetEnvParams->numOfDistinctionUnits; i++)
 1447     {
 1448         if (IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
 1449             switch (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr)
 1450             {
 1451                 case (HEADER_TYPE_USER_DEFINED_SHIM1):
 1452                     if (shim1Selected)
 1453                     {
 1454                         REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("SHIM header cannot be selected with UDP_IPSEC_ESP"));
 1455                         XX_Free(p_ModifiedNetEnvParams);
 1456                         return NULL;
 1457                     }
 1458                     shim1Selected = TRUE;
 1459                     p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = 0x00000001;
 1460                     break;
 1461                 case (HEADER_TYPE_USER_DEFINED_SHIM2):
 1462                     p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = 0x00000002;
 1463                     break;
 1464                 default:
 1465                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Requested SHIM not supported"));
 1466             }
 1467         else
 1468         {
 1469             p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = (uint32_t)(0x80000000 >> bitId++);
 1470 
 1471             if (IS_SPECIAL_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
 1472                 p_FmPcd->netEnvs[netEnvCurrId].macsecVector = p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i];
 1473         }
 1474     }
 1475 
 1476     /* define a set of hardware parser LCV's according to the defined netenv */
 1477 
 1478     /* set an array of LCV's for each header in the netEnv */
 1479     for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
 1480         && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
 1481     {
 1482         /* private headers have no LCV in the hard parser */
 1483         if (!IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
 1484         {
 1485             for (k = 0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
 1486                     && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
 1487             {
 1488                 hdrNum = GetPrsHdrNum(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr);
 1489                 if ((hdrNum == ILLEGAL_HDR_NUM) || (hdrNum == NO_HDR_NUM))
 1490                 {
 1491                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, NO_MSG);
 1492                     XX_Free(p_ModifiedNetEnvParams);
 1493                     return NULL;
 1494                 }
 1495                 p_FmPcd->netEnvs[netEnvCurrId].lcvs[hdrNum] |= p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i];
 1496             }
 1497         }
 1498     }
 1499     XX_Free(p_ModifiedNetEnvParams);
 1500 
 1501     p_FmPcd->netEnvs[netEnvCurrId].h_Spinlock = XX_InitSpinlock();
 1502     if (!p_FmPcd->netEnvs[netEnvCurrId].h_Spinlock)
 1503     {
 1504         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd NetEnv spinlock"));
 1505         return NULL;
 1506     }
 1507     return &p_FmPcd->netEnvs[netEnvCurrId];
 1508 }
 1509 
 1510 t_Error FM_PCD_NetEnvCharacteristicsDelete(t_Handle h_NetEnv)
 1511 {
 1512     t_FmPcdNetEnv   *p_NetEnv = (t_FmPcdNetEnv*)h_NetEnv;
 1513     t_FmPcd         *p_FmPcd = p_NetEnv->h_FmPcd;
 1514     uint32_t        intFlags;
 1515     uint8_t         netEnvId = p_NetEnv->netEnvId;
 1516 
 1517     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_STATE);
 1518     SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
 1519 
 1520     /* check that no port is bound to this netEnv */
 1521     if (p_FmPcd->netEnvs[netEnvId].owners)
 1522     {
 1523         RETURN_ERROR(MINOR, E_INVALID_STATE,
 1524                 ("Trying to delete a netEnv that has ports/schemes/trees/clsPlanGrps bound to"));
 1525     }
 1526 
 1527     intFlags = FmPcdLock(p_FmPcd);
 1528 
 1529     p_FmPcd->netEnvs[netEnvId].used = FALSE;
 1530     p_FmPcd->netEnvs[netEnvId].clsPlanGrpId = ILLEGAL_CLS_PLAN;
 1531 
 1532     memset(p_FmPcd->netEnvs[netEnvId].units, 0, sizeof(t_FmPcdIntDistinctionUnit)*FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);
 1533     memset(p_FmPcd->netEnvs[netEnvId].unitsVectors, 0, sizeof(uint32_t)*FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);
 1534     memset(p_FmPcd->netEnvs[netEnvId].lcvs, 0, sizeof(uint32_t)*FM_PCD_PRS_NUM_OF_HDRS);
 1535 
 1536     if (p_FmPcd->netEnvs[netEnvId].h_Spinlock)
 1537         XX_FreeSpinlock(p_FmPcd->netEnvs[netEnvId].h_Spinlock);
 1538 
 1539     FmPcdUnlock(p_FmPcd, intFlags);
 1540     return E_OK;
 1541 }
 1542 
 1543 void FM_PCD_HcTxConf(t_Handle h_FmPcd, t_DpaaFD *p_Fd)
 1544 {
 1545     t_FmPcd                 *p_FmPcd = (t_FmPcd*)h_FmPcd;
 1546 
 1547     SANITY_CHECK_RETURN(h_FmPcd, E_INVALID_STATE);
 1548 
 1549     FmHcTxConf(p_FmPcd->h_Hc, p_Fd);
 1550 }
 1551 
 1552 t_Error FM_PCD_SetAdvancedOffloadSupport(t_Handle h_FmPcd)
 1553 {
 1554     t_FmPcd                     *p_FmPcd = (t_FmPcd*)h_FmPcd;
 1555     t_FmCtrlCodeRevisionInfo    revInfo;
 1556     t_Error                     err;
 1557 
 1558     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
 1559     SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
 1560     SANITY_CHECK_RETURN_ERROR(!p_FmPcd->enabled, E_INVALID_STATE);
 1561 
 1562     if ((err = FM_GetFmanCtrlCodeRevision(p_FmPcd->h_Fm, &revInfo)) != E_OK)
 1563     {
 1564         DBG(WARNING, ("FM in guest-mode without IPC, can't validate firmware revision."));
 1565         revInfo.packageRev = IP_OFFLOAD_PACKAGE_NUMBER;
 1566     }
 1567     if (!IS_OFFLOAD_PACKAGE(revInfo.packageRev))
 1568         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Fman ctrl code package"));
 1569 
 1570     if (!p_FmPcd->h_Hc)
 1571         RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("HC must be initialized in this mode"));
 1572 
 1573     p_FmPcd->advancedOffloadSupport = TRUE;
 1574 
 1575     return E_OK;
 1576 }
 1577 
 1578 uint32_t FM_PCD_GetCounter(t_Handle h_FmPcd, e_FmPcdCounters counter)
 1579 {
 1580     t_FmPcd                 *p_FmPcd = (t_FmPcd*)h_FmPcd;
 1581     uint32_t                outCounter = 0;
 1582     t_Error                 err;
 1583 
 1584     SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, 0);
 1585     SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, 0);
 1586 
 1587     switch (counter)
 1588     {
 1589         case (e_FM_PCD_KG_COUNTERS_TOTAL):
 1590             if (!p_FmPcd->p_FmPcdKg)
 1591             {
 1592                 REPORT_ERROR(MAJOR, E_INVALID_STATE, ("KeyGen is not activated"));
 1593                 return 0;
 1594             }
 1595             if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
 1596                 !p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs &&
 1597                 !p_FmPcd->h_IpcSession)
 1598             {
 1599                 REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
 1600                              ("running in guest-mode without neither IPC nor mapped register!"));
 1601                 return 0;
 1602             }
 1603             break;
 1604 
 1605         case (e_FM_PCD_PLCR_COUNTERS_YELLOW):
 1606         case (e_FM_PCD_PLCR_COUNTERS_RED):
 1607         case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
 1608         case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
 1609         case (e_FM_PCD_PLCR_COUNTERS_TOTAL):
 1610         case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
 1611             if (!p_FmPcd->p_FmPcdPlcr)
 1612             {
 1613                 REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Policer is not activated"));
 1614                 return 0;
 1615             }
 1616             if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
 1617                 !p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs &&
 1618                 !p_FmPcd->h_IpcSession)
 1619             {
 1620                 REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
 1621                              ("running in \"guest-mode\" without neither IPC nor mapped register!"));
 1622                 return 0;
 1623             }
 1624 
 1625             /* check that counters are enabled */
 1626             if (p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs &&
 1627                 !(GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr) & FM_PCD_PLCR_GCR_STEN))
 1628             {
 1629                 REPORT_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
 1630                 return 0;
 1631             }
 1632             ASSERT_COND(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs ||
 1633                         ((p_FmPcd->guestId != NCSW_MASTER_ID) && p_FmPcd->h_IpcSession));
 1634             break;
 1635 
 1636         case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
 1637         case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
 1638         case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
 1639         case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
 1640         case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
 1641         case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
 1642         case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
 1643         case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
 1644         case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
 1645         case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
 1646         case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
 1647         case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
 1648         case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
 1649         case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
 1650         case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
 1651         case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
 1652         case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
 1653             if (!p_FmPcd->p_FmPcdPrs)
 1654             {
 1655                 REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Parser is not activated"));
 1656                 return 0;
 1657             }
 1658             if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
 1659                 !p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs &&
 1660                 !p_FmPcd->h_IpcSession)
 1661             {
 1662                 REPORT_ERROR(MINOR, E_NOT_SUPPORTED,
 1663                              ("running in guest-mode without neither IPC nor mapped register!"));
 1664                 return 0;
 1665             }
 1666             break;
 1667         default:
 1668             REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported type of counter"));
 1669             return 0;
 1670     }
 1671 
 1672     if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&
 1673         p_FmPcd->h_IpcSession)
 1674     {
 1675         t_FmPcdIpcMsg           msg;
 1676         t_FmPcdIpcReply         reply;
 1677         uint32_t                replyLength;
 1678 
 1679         memset(&msg, 0, sizeof(msg));
 1680         memset(&reply, 0, sizeof(reply));
 1681         msg.msgId = FM_PCD_GET_COUNTER;
 1682         memcpy(msg.msgBody, (uint8_t *)&counter, sizeof(uint32_t));
 1683         replyLength = sizeof(uint32_t) + sizeof(uint32_t);
 1684         if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
 1685                                      (uint8_t*)&msg,
 1686                                      sizeof(msg.msgId) +sizeof(uint32_t),
 1687                                      (uint8_t*)&reply,
 1688                                      &replyLength,
 1689                                      NULL,
 1690                                      NULL)) != E_OK)
 1691             RETURN_ERROR(MAJOR, err, NO_MSG);
 1692         if (replyLength != sizeof(uint32_t) + sizeof(uint32_t))
 1693             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
 1694 
 1695         memcpy((uint8_t*)&outCounter, reply.replyBody, sizeof(uint32_t));
 1696         return outCounter;
 1697     }
 1698 
 1699     switch (counter)
 1700     {
 1701         /* Parser statistics */
 1702         case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
 1703                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pds);
 1704         case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
 1705                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rrs);
 1706         case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
 1707                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rrs);
 1708         case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
 1709                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rrs);
 1710         case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
 1711                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srrs);
 1712         case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
 1713                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rres);
 1714         case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
 1715                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rres);
 1716         case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
 1717                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rres);
 1718         case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
 1719                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srres);
 1720         case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
 1721                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spcs);
 1722         case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
 1723                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spscs);
 1724         case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
 1725                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_hxscs);
 1726         case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
 1727                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrcs);
 1728         case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
 1729                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrscs);
 1730         case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
 1731                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwcs);
 1732         case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
 1733                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwscs);
 1734         case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
 1735                return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_fcscs);
 1736         case (e_FM_PCD_KG_COUNTERS_TOTAL):
 1737                return GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_tpc);
 1738 
 1739         /* Policer statistics */
 1740         case (e_FM_PCD_PLCR_COUNTERS_YELLOW):
 1741                 return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ypcnt);
 1742         case (e_FM_PCD_PLCR_COUNTERS_RED):
 1743                 return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rpcnt);
 1744         case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
 1745                 return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rrpcnt);
 1746         case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
 1747                 return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rypcnt);
 1748         case (e_FM_PCD_PLCR_COUNTERS_TOTAL):
 1749                 return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_tpcnt);
 1750         case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
 1751                 return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_flmcnt);
 1752     }
 1753     return 0;
 1754 }
 1755 
 1756 t_Error FM_PCD_SetException(t_Handle h_FmPcd, e_FmPcdExceptions exception, bool enable)
 1757 {
 1758     t_FmPcd         *p_FmPcd = (t_FmPcd*)h_FmPcd;
 1759     uint32_t        bitMask = 0, tmpReg;
 1760 
 1761     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
 1762     SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
 1763 
 1764     if (p_FmPcd->guestId != NCSW_MASTER_ID)
 1765         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_SetException - guest mode!"));
 1766 
 1767     GET_FM_PCD_EXCEPTION_FLAG(bitMask, exception);
 1768 
 1769     if (bitMask)
 1770     {
 1771         if (enable)
 1772             p_FmPcd->exceptions |= bitMask;
 1773         else
 1774             p_FmPcd->exceptions &= ~bitMask;
 1775 
 1776         switch (exception)
 1777         {
 1778             case (e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):
 1779             case (e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):
 1780                 if (!p_FmPcd->p_FmPcdKg)
 1781                     RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - keygen is not working"));
 1782                 break;
 1783             case (e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):
 1784             case (e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):
 1785             case (e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):
 1786             case (e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):
 1787                 if (!p_FmPcd->p_FmPcdPlcr)
 1788                     RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - policer is not working"));
 1789                 break;
 1790             case (e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):
 1791             case (e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):
 1792                 if (!p_FmPcd->p_FmPcdPrs)
 1793                     RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - parser is not working"));
 1794                 break;
 1795         }
 1796 
 1797         switch (exception)
 1798         {
 1799             case (e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):
 1800                 tmpReg = GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer);
 1801                 if (enable)
 1802                     tmpReg |= FM_EX_KG_DOUBLE_ECC;
 1803                 else
 1804                     tmpReg &= ~FM_EX_KG_DOUBLE_ECC;
 1805                 WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer, tmpReg);
 1806                 break;
 1807             case (e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):
 1808                 tmpReg = GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer);
 1809                 if (enable)
 1810                     tmpReg |= FM_EX_KG_KEYSIZE_OVERFLOW;
 1811                 else
 1812                     tmpReg &= ~FM_EX_KG_KEYSIZE_OVERFLOW;
 1813                 WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer, tmpReg);
 1814                 break;
 1815             case (e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):
 1816                 tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_perer);
 1817                 if (enable)
 1818                     tmpReg |= FM_PCD_PRS_DOUBLE_ECC;
 1819                 else
 1820                     tmpReg &= ~FM_PCD_PRS_DOUBLE_ECC;
 1821                 WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_perer, tmpReg);
 1822                 break;
 1823             case (e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):
 1824                 tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pever);
 1825                 if (enable)
 1826                     tmpReg |= FM_PCD_PRS_SINGLE_ECC;
 1827                 else
 1828                     tmpReg &= ~FM_PCD_PRS_SINGLE_ECC;
 1829                 WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pever, tmpReg);
 1830                 break;
 1831             case (e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):
 1832                 tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier);
 1833                 if (enable)
 1834                     tmpReg |= FM_PCD_PLCR_DOUBLE_ECC;
 1835                 else
 1836                     tmpReg &= ~FM_PCD_PLCR_DOUBLE_ECC;
 1837                 WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier, tmpReg);
 1838                 break;
 1839             case (e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):
 1840                 tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier);
 1841                 if (enable)
 1842                     tmpReg |= FM_PCD_PLCR_INIT_ENTRY_ERROR;
 1843                 else
 1844                     tmpReg &= ~FM_PCD_PLCR_INIT_ENTRY_ERROR;
 1845                 WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier, tmpReg);
 1846                 break;
 1847             case (e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):
 1848                 tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier);
 1849                 if (enable)
 1850                     tmpReg |= FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE;
 1851                 else
 1852                     tmpReg &= ~FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE;
 1853                 WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier, tmpReg);
 1854                 break;
 1855             case (e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):
 1856                 tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier);
 1857                 if (enable)
 1858                     tmpReg |= FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE;
 1859                 else
 1860                     tmpReg &= ~FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE;
 1861                 WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier, tmpReg);
 1862                 break;
 1863         }
 1864         /* for ECC exceptions driver automatically enables ECC mechanism, if disabled.
 1865            Driver may disable them automatically, depending on driver's status */
 1866         if (enable && ((exception == e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC) |
 1867                        (exception == e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC) |
 1868                        (exception == e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC) |
 1869                        (exception == e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC)))
 1870             FmEnableRamsEcc(p_FmPcd->h_Fm);
 1871         if (!enable && ((exception == e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC) |
 1872                        (exception == e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC) |
 1873                        (exception == e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC) |
 1874                        (exception == e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC)))
 1875             FmDisableRamsEcc(p_FmPcd->h_Fm);
 1876     }
 1877 
 1878     return E_OK;
 1879 }
 1880 
 1881 t_Error FM_PCD_ForceIntr (t_Handle h_FmPcd, e_FmPcdExceptions exception)
 1882 {
 1883     t_FmPcd            *p_FmPcd = (t_FmPcd*)h_FmPcd;
 1884 
 1885     SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
 1886     SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
 1887 
 1888     if (p_FmPcd->guestId != NCSW_MASTER_ID)
 1889         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ForceIntr - guest mode!"));
 1890 
 1891     switch (exception)
 1892     {
 1893         case (e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):
 1894         case (e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):
 1895             if (!p_FmPcd->p_FmPcdKg)
 1896                 RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - keygen is not working"));
 1897             break;
 1898         case (e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):
 1899         case (e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):
 1900         case (e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):
 1901         case (e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):
 1902             if (!p_FmPcd->p_FmPcdPlcr)
 1903                 RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - policer is not working"));
 1904             break;
 1905         case (e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):
 1906         case (e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):
 1907            if (!p_FmPcd->p_FmPcdPrs)
 1908                 RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt -parsrer is not working"));
 1909             break;
 1910         default:
 1911             RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid interrupt requested"));
 1912     }
 1913     switch (exception)
 1914     {
 1915         case e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC:
 1916             if (!(p_FmPcd->exceptions & FM_PCD_EX_PRS_DOUBLE_ECC))
 1917                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
 1918             break;
 1919         case e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC:
 1920             if (!(p_FmPcd->exceptions & FM_PCD_EX_PRS_SINGLE_ECC))
 1921                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
 1922             break;
 1923         case e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC:
 1924             if (!(p_FmPcd->exceptions & FM_EX_KG_DOUBLE_ECC))
 1925                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
 1926             WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_feer, FM_EX_KG_DOUBLE_ECC);
 1927             break;
 1928         case e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW:
 1929             if (!(p_FmPcd->exceptions & FM_EX_KG_KEYSIZE_OVERFLOW))
 1930                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
 1931             WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_feer, FM_EX_KG_KEYSIZE_OVERFLOW);
 1932             break;
 1933         case e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC:
 1934             if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_DOUBLE_ECC))
 1935                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
 1936             WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr, FM_PCD_PLCR_DOUBLE_ECC);
 1937             break;
 1938         case e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR:
 1939             if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_INIT_ENTRY_ERROR))
 1940                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
 1941             WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr, FM_PCD_PLCR_INIT_ENTRY_ERROR);
 1942             break;
 1943         case e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE:
 1944             if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_PRAM_SELF_INIT_COMPLETE))
 1945                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
 1946             WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr, FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE);
 1947             break;
 1948         case e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE:
 1949             if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_ATOMIC_ACTION_COMPLETE))
 1950                 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
 1951             WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr, FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE);
 1952             break;
 1953     }
 1954 
 1955     return E_OK;
 1956 }
 1957 
 1958 
 1959 t_Error FM_PCD_ModifyCounter(t_Handle h_FmPcd, e_FmPcdCounters counter, uint32_t value)
 1960 {
 1961     t_FmPcd            *p_FmPcd = (t_FmPcd*)h_FmPcd;
 1962 
 1963     SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
 1964     SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
 1965 
 1966     if (p_FmPcd->guestId != NCSW_MASTER_ID)
 1967         RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ModifyCounter - guest mode!"));
 1968 
 1969     switch (counter)
 1970     {
 1971         case (e_FM_PCD_KG_COUNTERS_TOTAL):
 1972             if (!p_FmPcd->p_FmPcdKg)
 1973                 RETURN_ERROR(MINOR, E_INVALID_STATE, ("Invalid counters - KeyGen is not working"));
 1974             break;
 1975         case (e_FM_PCD_PLCR_COUNTERS_YELLOW):
 1976         case (e_FM_PCD_PLCR_COUNTERS_RED):
 1977         case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
 1978         case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
 1979         case (e_FM_PCD_PLCR_COUNTERS_TOTAL):
 1980         case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
 1981             if (!p_FmPcd->p_FmPcdPlcr)
 1982                 RETURN_ERROR(MINOR, E_INVALID_STATE, ("Invalid counters - Policer is not working"));
 1983             if (!(GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr) & FM_PCD_PLCR_GCR_STEN))
 1984                 RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
 1985             break;
 1986         case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
 1987         case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
 1988         case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
 1989         case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
 1990         case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
 1991         case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
 1992         case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
 1993         case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
 1994         case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
 1995         case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
 1996         case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
 1997         case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
 1998         case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
 1999         case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
 2000         case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
 2001         case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
 2002         case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
 2003             if (!p_FmPcd->p_FmPcdPrs)
 2004                 RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter"));
 2005             break;
 2006         default:
 2007             RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter"));
 2008     }
 2009     switch (counter)
 2010     {
 2011         case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
 2012                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pds, value);
 2013             break;
 2014         case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
 2015                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rrs, value);
 2016             break;
 2017         case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
 2018                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rrs, value);
 2019              break;
 2020        case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
 2021                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rrs, value);
 2022             break;
 2023         case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
 2024                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srrs, value);
 2025             break;
 2026         case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
 2027                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rres, value);
 2028             break;
 2029         case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
 2030                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rres, value);
 2031             break;
 2032         case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
 2033                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rres, value);
 2034             break;
 2035         case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
 2036                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srres, value);
 2037             break;
 2038         case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
 2039                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spcs, value);
 2040             break;
 2041         case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
 2042                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spscs, value);
 2043             break;
 2044         case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
 2045                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_hxscs, value);
 2046             break;
 2047         case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
 2048                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrcs, value);
 2049             break;
 2050         case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
 2051                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrscs, value);
 2052             break;
 2053         case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
 2054                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwcs, value);
 2055             break;
 2056         case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
 2057                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwscs, value);
 2058             break;
 2059         case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
 2060                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_fcscs, value);
 2061              break;
 2062         case (e_FM_PCD_KG_COUNTERS_TOTAL):
 2063             WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_tpc,value);
 2064             break;
 2065 
 2066         /*Policer counters*/
 2067         case (e_FM_PCD_PLCR_COUNTERS_YELLOW):
 2068             WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ypcnt, value);
 2069             break;
 2070         case (e_FM_PCD_PLCR_COUNTERS_RED):
 2071             WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rpcnt, value);
 2072             break;
 2073         case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
 2074              WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rrpcnt, value);
 2075             break;
 2076         case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
 2077               WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rypcnt, value);
 2078             break;
 2079         case (e_FM_PCD_PLCR_COUNTERS_TOTAL):
 2080               WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_tpcnt, value);
 2081             break;
 2082         case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
 2083               WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_flmcnt, value);
 2084             break;
 2085     }
 2086 
 2087     return E_OK;
 2088 }
 2089 
 2090 t_Handle FM_PCD_GetHcPort(t_Handle h_FmPcd)
 2091 {
 2092     t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
 2093     return FmHcGetPort(p_FmPcd->h_Hc);
 2094 }
 2095 

Cache object: c965485246b7e899c7f1ddd550b1ab3a


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.