Path: blob/main/sys/contrib/ncsw/Peripherals/FM/Pcd/fm_pcd.c
48524 views
/*1* Copyright 2008-2012 Freescale Semiconductor Inc.2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions are met:5* * Redistributions of source code must retain the above copyright6* notice, this list of conditions and the following disclaimer.7* * Redistributions in binary form must reproduce the above copyright8* notice, this list of conditions and the following disclaimer in the9* documentation and/or other materials provided with the distribution.10* * Neither the name of Freescale Semiconductor nor the11* names of its contributors may be used to endorse or promote products12* derived from this software without specific prior written permission.13*14*15* ALTERNATIVELY, this software may be distributed under the terms of the16* GNU General Public License ("GPL") as published by the Free Software17* Foundation, either version 2 of that License or (at your option) any18* later version.19*20* THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY21* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED22* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE23* DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY24* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES25* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;26* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND27* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT28* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS29* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.30*/313233/******************************************************************************34@File fm_pcd.c3536@Description FM PCD ...37*//***************************************************************************/38#include "std_ext.h"39#include "error_ext.h"40#include "string_ext.h"41#include "xx_ext.h"42#include "sprint_ext.h"43#include "debug_ext.h"44#include "net_ext.h"45#include "fm_ext.h"46#include "fm_pcd_ext.h"4748#include "fm_common.h"49#include "fm_pcd.h"50#include "fm_pcd_ipc.h"51#include "fm_hc.h"52#include "fm_muram_ext.h"535455/****************************************/56/* static functions */57/****************************************/5859static t_Error CheckFmPcdParameters(t_FmPcd *p_FmPcd)60{61if (!p_FmPcd->h_Fm)62RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("h_Fm has to be initialized"));6364if (p_FmPcd->guestId == NCSW_MASTER_ID)65{66if (p_FmPcd->p_FmPcdKg && !p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs)67RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something WRONG"));6869if (p_FmPcd->p_FmPcdPlcr && !p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs)70RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something WRONG"));7172if (!p_FmPcd->f_Exception)73RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("f_FmPcdExceptions has to be initialized"));7475if ((!p_FmPcd->f_FmPcdIndexedException) && (p_FmPcd->p_FmPcdPlcr || p_FmPcd->p_FmPcdKg))76RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("f_FmPcdIndexedException has to be initialized"));7778if (p_FmPcd->p_FmPcdDriverParam->prsMaxParseCycleLimit > PRS_MAX_CYCLE_LIMIT)79RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("prsMaxParseCycleLimit has to be less than 8191"));80}8182return E_OK;83}8485static volatile bool blockingFlag = FALSE;86static void IpcMsgCompletionCB(t_Handle h_FmPcd,87uint8_t *p_Msg,88uint8_t *p_Reply,89uint32_t replyLength,90t_Error status)91{92UNUSED(h_FmPcd);UNUSED(p_Msg);UNUSED(p_Reply);UNUSED(replyLength);UNUSED(status);93blockingFlag = FALSE;94}9596static t_Error IpcMsgHandlerCB(t_Handle h_FmPcd,97uint8_t *p_Msg,98uint32_t msgLength,99uint8_t *p_Reply,100uint32_t *p_ReplyLength)101{102t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;103t_Error err = E_OK;104t_FmPcdIpcMsg *p_IpcMsg = (t_FmPcdIpcMsg*)p_Msg;105t_FmPcdIpcReply *p_IpcReply = (t_FmPcdIpcReply*)p_Reply;106107SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);108SANITY_CHECK_RETURN_ERROR((msgLength >= sizeof(uint32_t)), E_INVALID_VALUE);109110#ifdef DISABLE_SANITY_CHECKS111UNUSED(msgLength);112#endif /* DISABLE_SANITY_CHECKS */113114ASSERT_COND(p_Msg);115116memset(p_IpcReply, 0, (sizeof(uint8_t) * FM_PCD_MAX_REPLY_SIZE));117*p_ReplyLength = 0;118119switch (p_IpcMsg->msgId)120{121case (FM_PCD_MASTER_IS_ALIVE):122*(uint8_t*)(p_IpcReply->replyBody) = 1;123p_IpcReply->error = E_OK;124*p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);125break;126case (FM_PCD_MASTER_IS_ENABLED):127/* count partitions registrations */128if (p_FmPcd->enabled)129p_FmPcd->numOfEnabledGuestPartitionsPcds++;130*(uint8_t*)(p_IpcReply->replyBody) = (uint8_t)p_FmPcd->enabled;131p_IpcReply->error = E_OK;132*p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);133break;134case (FM_PCD_GUEST_DISABLE):135if (p_FmPcd->numOfEnabledGuestPartitionsPcds)136{137p_FmPcd->numOfEnabledGuestPartitionsPcds--;138p_IpcReply->error = E_OK;139}140else141{142REPORT_ERROR(MINOR, E_INVALID_STATE,("Trying to disable an unregistered partition"));143p_IpcReply->error = E_INVALID_STATE;144}145*p_ReplyLength = sizeof(uint32_t);146break;147case (FM_PCD_GET_COUNTER):148{149e_FmPcdCounters inCounter;150uint32_t outCounter;151152memcpy((uint8_t*)&inCounter, p_IpcMsg->msgBody, sizeof(uint32_t));153outCounter = FM_PCD_GetCounter(h_FmPcd, inCounter);154memcpy(p_IpcReply->replyBody, (uint8_t*)&outCounter, sizeof(uint32_t));155p_IpcReply->error = E_OK;156*p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);157break;158}159case (FM_PCD_ALLOC_KG_SCHEMES):160{161t_FmPcdIpcKgSchemesParams ipcSchemesParams;162163memcpy((uint8_t*)&ipcSchemesParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgSchemesParams));164err = FmPcdKgAllocSchemes(h_FmPcd,165ipcSchemesParams.numOfSchemes,166ipcSchemesParams.guestId,167p_IpcReply->replyBody);168p_IpcReply->error = err;169*p_ReplyLength = sizeof(uint32_t) + ipcSchemesParams.numOfSchemes*sizeof(uint8_t);170break;171}172case (FM_PCD_FREE_KG_SCHEMES):173{174t_FmPcdIpcKgSchemesParams ipcSchemesParams;175176memcpy((uint8_t*)&ipcSchemesParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgSchemesParams));177err = FmPcdKgFreeSchemes(h_FmPcd,178ipcSchemesParams.numOfSchemes,179ipcSchemesParams.guestId,180ipcSchemesParams.schemesIds);181p_IpcReply->error = err;182*p_ReplyLength = sizeof(uint32_t);183break;184}185case (FM_PCD_ALLOC_KG_CLSPLAN):186{187t_FmPcdIpcKgClsPlanParams ipcKgClsPlanParams;188189memcpy((uint8_t*)&ipcKgClsPlanParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgClsPlanParams));190err = KgAllocClsPlanEntries(h_FmPcd,191ipcKgClsPlanParams.numOfClsPlanEntries,192ipcKgClsPlanParams.guestId,193p_IpcReply->replyBody);194p_IpcReply->error = err;195*p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);196break;197}198case (FM_PCD_FREE_KG_CLSPLAN):199{200t_FmPcdIpcKgClsPlanParams ipcKgClsPlanParams;201202memcpy((uint8_t*)&ipcKgClsPlanParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgClsPlanParams));203KgFreeClsPlanEntries(h_FmPcd,204ipcKgClsPlanParams.numOfClsPlanEntries,205ipcKgClsPlanParams.guestId,206ipcKgClsPlanParams.clsPlanBase);207*p_ReplyLength = sizeof(uint32_t);208break;209}210case (FM_PCD_ALLOC_PROFILES):211{212t_FmIpcResourceAllocParams ipcAllocParams;213uint16_t base;214memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));215base = PlcrAllocProfilesForPartition(h_FmPcd,216ipcAllocParams.base,217ipcAllocParams.num,218ipcAllocParams.guestId);219memcpy(p_IpcReply->replyBody, (uint16_t*)&base, sizeof(uint16_t));220*p_ReplyLength = sizeof(uint32_t) + sizeof(uint16_t);221break;222}223case (FM_PCD_FREE_PROFILES):224{225t_FmIpcResourceAllocParams ipcAllocParams;226memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));227PlcrFreeProfilesForPartition(h_FmPcd,228ipcAllocParams.base,229ipcAllocParams.num,230ipcAllocParams.guestId);231break;232}233case (FM_PCD_SET_PORT_PROFILES):234{235t_FmIpcResourceAllocParams ipcAllocParams;236memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));237PlcrSetPortProfiles(h_FmPcd,238ipcAllocParams.guestId,239ipcAllocParams.num,240ipcAllocParams.base);241break;242}243case (FM_PCD_CLEAR_PORT_PROFILES):244{245t_FmIpcResourceAllocParams ipcAllocParams;246memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));247PlcrClearPortProfiles(h_FmPcd,248ipcAllocParams.guestId);249break;250}251case (FM_PCD_GET_SW_PRS_OFFSET):252{253t_FmPcdIpcSwPrsLable ipcSwPrsLable;254uint32_t swPrsOffset;255256memcpy((uint8_t*)&ipcSwPrsLable, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcSwPrsLable));257swPrsOffset =258FmPcdGetSwPrsOffset(h_FmPcd,259(e_NetHeaderType)ipcSwPrsLable.enumHdr,260ipcSwPrsLable.indexPerHdr);261memcpy(p_IpcReply->replyBody, (uint8_t*)&swPrsOffset, sizeof(uint32_t));262*p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);263break;264}265case (FM_PCD_PRS_INC_PORT_STATS):266{267t_FmPcdIpcPrsIncludePort ipcPrsIncludePort;268269memcpy((uint8_t*)&ipcPrsIncludePort, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcPrsIncludePort));270PrsIncludePortInStatistics(h_FmPcd,271ipcPrsIncludePort.hardwarePortId,272ipcPrsIncludePort.include);273break;274}275default:276*p_ReplyLength = 0;277RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!"));278}279return E_OK;280}281282static uint32_t NetEnvLock(t_Handle h_NetEnv)283{284ASSERT_COND(h_NetEnv);285return XX_LockIntrSpinlock(((t_FmPcdNetEnv*)h_NetEnv)->h_Spinlock);286}287288static void NetEnvUnlock(t_Handle h_NetEnv, uint32_t intFlags)289{290ASSERT_COND(h_NetEnv);291XX_UnlockIntrSpinlock(((t_FmPcdNetEnv*)h_NetEnv)->h_Spinlock, intFlags);292}293294static void EnqueueLockToFreeLst(t_FmPcd *p_FmPcd, t_FmPcdLock *p_Lock)295{296uint32_t intFlags;297298intFlags = XX_LockIntrSpinlock(p_FmPcd->h_Spinlock);299NCSW_LIST_AddToTail(&p_Lock->node, &p_FmPcd->freeLocksLst);300XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);301}302303static t_FmPcdLock * DequeueLockFromFreeLst(t_FmPcd *p_FmPcd)304{305t_FmPcdLock *p_Lock = NULL;306uint32_t intFlags;307308intFlags = XX_LockIntrSpinlock(p_FmPcd->h_Spinlock);309if (!NCSW_LIST_IsEmpty(&p_FmPcd->freeLocksLst))310{311p_Lock = FM_PCD_LOCK_OBJ(p_FmPcd->freeLocksLst.p_Next);312NCSW_LIST_DelAndInit(&p_Lock->node);313}314if (p_FmPcd->h_Spinlock)315XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);316317return p_Lock;318}319320static void EnqueueLockToAcquiredLst(t_FmPcd *p_FmPcd, t_FmPcdLock *p_Lock)321{322uint32_t intFlags;323324intFlags = XX_LockIntrSpinlock(p_FmPcd->h_Spinlock);325NCSW_LIST_AddToTail(&p_Lock->node, &p_FmPcd->acquiredLocksLst);326XX_UnlockIntrSpinlock(p_FmPcd->h_Spinlock, intFlags);327}328329static t_Error FillFreeLocksLst(t_FmPcd *p_FmPcd)330{331t_FmPcdLock *p_Lock;332int i;333334for (i=0; i<10; i++)335{336p_Lock = (t_FmPcdLock *)XX_Malloc(sizeof(t_FmPcdLock));337if (!p_Lock)338RETURN_ERROR(MINOR, E_NO_MEMORY, ("FM-PCD lock obj!"));339memset(p_Lock, 0, sizeof(t_FmPcdLock));340INIT_LIST(&p_Lock->node);341p_Lock->h_Spinlock = XX_InitSpinlock();342if (!p_Lock->h_Spinlock)343{344XX_Free(p_Lock);345RETURN_ERROR(MINOR, E_INVALID_STATE, ("FM-PCD spinlock obj!"));346}347EnqueueLockToFreeLst(p_FmPcd, p_Lock);348}349350return E_OK;351}352353static void ReleaseFreeLocksLst(t_FmPcd *p_FmPcd)354{355t_FmPcdLock *p_Lock;356357p_Lock = DequeueLockFromFreeLst(p_FmPcd);358while (p_Lock)359{360XX_FreeSpinlock(p_Lock->h_Spinlock);361XX_Free(p_Lock);362p_Lock = DequeueLockFromFreeLst(p_FmPcd);363}364}365366367368/*****************************************************************************/369/* Inter-module API routines */370/*****************************************************************************/371372void FmPcdSetClsPlanGrpId(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint8_t clsPlanGrpId)373{374ASSERT_COND(p_FmPcd);375p_FmPcd->netEnvs[netEnvId].clsPlanGrpId = clsPlanGrpId;376}377378t_Error PcdGetClsPlanGrpParams(t_FmPcd *p_FmPcd, t_FmPcdKgInterModuleClsPlanGrpParams *p_GrpParams)379{380uint8_t netEnvId = p_GrpParams->netEnvId;381int i, k, j;382383ASSERT_COND(p_FmPcd);384if (p_FmPcd->netEnvs[netEnvId].clsPlanGrpId != ILLEGAL_CLS_PLAN)385{386p_GrpParams->grpExists = TRUE;387p_GrpParams->clsPlanGrpId = p_FmPcd->netEnvs[netEnvId].clsPlanGrpId;388return E_OK;389}390391for (i=0; ((i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&392(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)); i++)393{394for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&395(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)396{397/* if an option exists, add it to the opts list */398if (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)399{400/* check if this option already exists, add if it doesn't */401for (j = 0;j<p_GrpParams->numOfOptions;j++)402{403if (p_GrpParams->options[j] == p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)404break;405}406p_GrpParams->optVectors[j] |= p_FmPcd->netEnvs[netEnvId].unitsVectors[i];407if (j == p_GrpParams->numOfOptions)408{409p_GrpParams->options[p_GrpParams->numOfOptions] = p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt;410p_GrpParams->numOfOptions++;411}412}413}414}415416if (p_GrpParams->numOfOptions == 0)417{418if (p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId != ILLEGAL_CLS_PLAN)419{420p_GrpParams->grpExists = TRUE;421p_GrpParams->clsPlanGrpId = p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId;422}423}424425return E_OK;426427}428429t_Error PcdGetVectorForOpt(t_FmPcd *p_FmPcd, uint8_t netEnvId, protocolOpt_t opt, uint32_t *p_Vector)430{431uint8_t j,k;432433*p_Vector = 0;434435ASSERT_COND(p_FmPcd);436for (j=0; ((j < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&437(p_FmPcd->netEnvs[netEnvId].units[j].hdrs[0].hdr != HEADER_TYPE_NONE)); j++)438{439for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&440(p_FmPcd->netEnvs[netEnvId].units[j].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)441{442if (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[k].opt == opt)443*p_Vector |= p_FmPcd->netEnvs[netEnvId].unitsVectors[j];444}445}446447if (!*p_Vector)448RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Requested option was not defined for this Network Environment Characteristics module"));449else450return E_OK;451}452453t_Error PcdGetUnitsVector(t_FmPcd *p_FmPcd, t_NetEnvParams *p_Params)454{455int i;456457ASSERT_COND(p_FmPcd);458ASSERT_COND(p_Params->netEnvId < FM_MAX_NUM_OF_PORTS);459460p_Params->vector = 0;461for (i=0; i<p_Params->numOfDistinctionUnits ;i++)462{463if (p_FmPcd->netEnvs[p_Params->netEnvId].units[p_Params->unitIds[i]].hdrs[0].hdr == HEADER_TYPE_NONE)464RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Requested unit was not defined for this Network Environment Characteristics module"));465ASSERT_COND(p_FmPcd->netEnvs[p_Params->netEnvId].unitsVectors[p_Params->unitIds[i]]);466p_Params->vector |= p_FmPcd->netEnvs[p_Params->netEnvId].unitsVectors[p_Params->unitIds[i]];467}468469return E_OK;470}471472bool PcdNetEnvIsUnitWithoutOpts(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint32_t unitVector)473{474int i=0, k;475476ASSERT_COND(p_FmPcd);477/* check whether a given unit may be used by non-clsPlan users. */478/* first, recognize the unit by its vector */479while (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)480{481if (p_FmPcd->netEnvs[netEnvId].unitsVectors[i] == unitVector)482{483for (k=0;484((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&485(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE));486k++)487/* check that no option exists */488if ((protocolOpt_t)p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)489return FALSE;490break;491}492i++;493}494/* assert that a unit was found to mach the vector */495ASSERT_COND(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE);496497return TRUE;498}499bool FmPcdNetEnvIsHdrExist(t_Handle h_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr)500{501t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;502int i, k;503504ASSERT_COND(p_FmPcd);505506for (i=0; ((i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&507(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)); i++)508{509for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&510(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)511if (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr == hdr)512return TRUE;513}514for (i=0; ((i < FM_PCD_MAX_NUM_OF_ALIAS_HDRS) &&515(p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE)); i++)516{517if (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr)518return TRUE;519}520521return FALSE;522}523524uint8_t FmPcdNetEnvGetUnitId(t_FmPcd *p_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr, bool interchangeable, protocolOpt_t opt)525{526uint8_t i, k;527528ASSERT_COND(p_FmPcd);529530if (interchangeable)531{532for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&533(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)534{535for (k=0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&536(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)537{538if ((p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr == hdr) &&539(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt == opt))540541return i;542}543}544}545else546{547for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&548(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)549if ((p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr == hdr) &&550(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].opt == opt) &&551(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[1].hdr == HEADER_TYPE_NONE))552return i;553554for (i=0; (i < FM_PCD_MAX_NUM_OF_ALIAS_HDRS) &&555(p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE); i++)556if ((p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr) &&557(p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].opt == opt))558return p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].aliasHdr;559}560561return FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS;562}563564t_Error FmPcdUnregisterReassmPort(t_Handle h_FmPcd, t_Handle h_ReasmCommonPramTbl)565{566t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;567t_FmPcdCcReassmTimeoutParams ccReassmTimeoutParams = {0};568uint8_t result;569t_Error err = E_OK;570571ASSERT_COND(p_FmPcd);572ASSERT_COND(h_ReasmCommonPramTbl);573574ccReassmTimeoutParams.iprcpt = (uint32_t)(XX_VirtToPhys(h_ReasmCommonPramTbl) - p_FmPcd->physicalMuramBase);575ccReassmTimeoutParams.activate = FALSE; /*Disable Timeout Task*/576577if ((err = FmHcPcdCcTimeoutReassm(p_FmPcd->h_Hc, &ccReassmTimeoutParams, &result)) != E_OK)578RETURN_ERROR(MAJOR, err, NO_MSG);579580switch (result)581{582case (0):583return E_OK;584case (1):585RETURN_ERROR(MAJOR, E_INVALID_STATE, (""));586case (2):587RETURN_ERROR(MAJOR, E_INVALID_STATE, (""));588case (3):589RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("Disable Timeout Task with invalid IPRCPT"));590default:591RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);592}593594return E_OK;595}596597e_NetHeaderType FmPcdGetAliasHdr(t_FmPcd *p_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr)598{599int i;600601ASSERT_COND(p_FmPcd);602ASSERT_COND(netEnvId < FM_MAX_NUM_OF_PORTS);603604for (i=0; (i < FM_PCD_MAX_NUM_OF_ALIAS_HDRS)605&& (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE); i++)606{607if (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr)608return p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].aliasHdr;609}610611return HEADER_TYPE_NONE;612}613614void FmPcdPortRegister(t_Handle h_FmPcd, t_Handle h_FmPort, uint8_t hardwarePortId)615{616t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;617uint16_t swPortIndex = 0;618619ASSERT_COND(h_FmPcd);620HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);621p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].h_FmPort = h_FmPort;622}623624uint32_t FmPcdGetLcv(t_Handle h_FmPcd, uint32_t netEnvId, uint8_t hdrNum)625{626t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;627628ASSERT_COND(h_FmPcd);629return p_FmPcd->netEnvs[netEnvId].lcvs[hdrNum];630}631632uint32_t FmPcdGetMacsecLcv(t_Handle h_FmPcd, uint32_t netEnvId)633{634t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;635636ASSERT_COND(h_FmPcd);637return p_FmPcd->netEnvs[netEnvId].macsecVector;638}639640uint8_t FmPcdGetNetEnvId(t_Handle h_NetEnv)641{642return ((t_FmPcdNetEnv*)h_NetEnv)->netEnvId;643}644645void FmPcdIncNetEnvOwners(t_Handle h_FmPcd, uint8_t netEnvId)646{647uint32_t intFlags;648649ASSERT_COND(h_FmPcd);650651intFlags = NetEnvLock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId]);652((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners++;653NetEnvUnlock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId], intFlags);654}655656void FmPcdDecNetEnvOwners(t_Handle h_FmPcd, uint8_t netEnvId)657{658uint32_t intFlags;659660ASSERT_COND(h_FmPcd);661ASSERT_COND(((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners);662663intFlags = NetEnvLock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId]);664((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners--;665NetEnvUnlock(&((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId], intFlags);666}667668uint32_t FmPcdLock(t_Handle h_FmPcd)669{670ASSERT_COND(h_FmPcd);671return XX_LockIntrSpinlock(((t_FmPcd*)h_FmPcd)->h_Spinlock);672}673674void FmPcdUnlock(t_Handle h_FmPcd, uint32_t intFlags)675{676ASSERT_COND(h_FmPcd);677XX_UnlockIntrSpinlock(((t_FmPcd*)h_FmPcd)->h_Spinlock, intFlags);678}679680t_FmPcdLock * FmPcdAcquireLock(t_Handle h_FmPcd)681{682t_FmPcdLock *p_Lock;683ASSERT_COND(h_FmPcd);684p_Lock = DequeueLockFromFreeLst((t_FmPcd*)h_FmPcd);685if (!p_Lock)686{687FillFreeLocksLst(h_FmPcd);688p_Lock = DequeueLockFromFreeLst((t_FmPcd*)h_FmPcd);689}690691if (p_Lock)692EnqueueLockToAcquiredLst((t_FmPcd*)h_FmPcd, p_Lock);693return p_Lock;694}695696void FmPcdReleaseLock(t_Handle h_FmPcd, t_FmPcdLock *p_Lock)697{698uint32_t intFlags;699ASSERT_COND(h_FmPcd);700intFlags = FmPcdLock(h_FmPcd);701NCSW_LIST_DelAndInit(&p_Lock->node);702FmPcdUnlock(h_FmPcd, intFlags);703EnqueueLockToFreeLst((t_FmPcd*)h_FmPcd, p_Lock);704}705706bool FmPcdLockTryLockAll(t_Handle h_FmPcd)707{708uint32_t intFlags;709t_List *p_Pos, *p_SavedPos=NULL;710711ASSERT_COND(h_FmPcd);712intFlags = FmPcdLock(h_FmPcd);713NCSW_LIST_FOR_EACH(p_Pos, &((t_FmPcd*)h_FmPcd)->acquiredLocksLst)714{715t_FmPcdLock *p_Lock = FM_PCD_LOCK_OBJ(p_Pos);716if (!FmPcdLockTryLock(p_Lock))717{718p_SavedPos = p_Pos;719break;720}721}722if (p_SavedPos)723{724NCSW_LIST_FOR_EACH(p_Pos, &((t_FmPcd*)h_FmPcd)->acquiredLocksLst)725{726t_FmPcdLock *p_Lock = FM_PCD_LOCK_OBJ(p_Pos);727if (p_Pos == p_SavedPos)728break;729FmPcdLockUnlock(p_Lock);730}731}732FmPcdUnlock(h_FmPcd, intFlags);733734CORE_MemoryBarrier();735736if (p_SavedPos)737return FALSE;738739return TRUE;740}741742void FmPcdLockUnlockAll(t_Handle h_FmPcd)743{744uint32_t intFlags;745t_List *p_Pos;746747ASSERT_COND(h_FmPcd);748intFlags = FmPcdLock(h_FmPcd);749NCSW_LIST_FOR_EACH(p_Pos, &((t_FmPcd*)h_FmPcd)->acquiredLocksLst)750{751t_FmPcdLock *p_Lock = FM_PCD_LOCK_OBJ(p_Pos);752p_Lock->flag = FALSE;753}754FmPcdUnlock(h_FmPcd, intFlags);755756CORE_MemoryBarrier();757}758759t_Error FmPcdHcSync(t_Handle h_FmPcd)760{761ASSERT_COND(h_FmPcd);762ASSERT_COND(((t_FmPcd*)h_FmPcd)->h_Hc);763764return FmHcPcdSync(((t_FmPcd*)h_FmPcd)->h_Hc);765}766767t_Handle FmPcdGetHcHandle(t_Handle h_FmPcd)768{769ASSERT_COND(h_FmPcd);770return ((t_FmPcd*)h_FmPcd)->h_Hc;771}772773bool FmPcdIsAdvancedOffloadSupported(t_Handle h_FmPcd)774{775ASSERT_COND(h_FmPcd);776return ((t_FmPcd*)h_FmPcd)->advancedOffloadSupport;777}778/*********************** End of inter-module routines ************************/779780781/****************************************/782/* API Init unit functions */783/****************************************/784785t_Handle FM_PCD_Config(t_FmPcdParams *p_FmPcdParams)786{787t_FmPcd *p_FmPcd = NULL;788t_FmPhysAddr physicalMuramBase;789uint8_t i;790791SANITY_CHECK_RETURN_VALUE(p_FmPcdParams, E_INVALID_HANDLE,NULL);792793p_FmPcd = (t_FmPcd *) XX_Malloc(sizeof(t_FmPcd));794if (!p_FmPcd)795{796REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD"));797return NULL;798}799memset(p_FmPcd, 0, sizeof(t_FmPcd));800801p_FmPcd->p_FmPcdDriverParam = (t_FmPcdDriverParam *) XX_Malloc(sizeof(t_FmPcdDriverParam));802if (!p_FmPcd->p_FmPcdDriverParam)803{804XX_Free(p_FmPcd);805REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Driver Param"));806return NULL;807}808memset(p_FmPcd->p_FmPcdDriverParam, 0, sizeof(t_FmPcdDriverParam));809810p_FmPcd->h_Fm = p_FmPcdParams->h_Fm;811p_FmPcd->guestId = FmGetGuestId(p_FmPcd->h_Fm);812p_FmPcd->h_FmMuram = FmGetMuramHandle(p_FmPcd->h_Fm);813if (p_FmPcd->h_FmMuram)814{815FmGetPhysicalMuramBase(p_FmPcdParams->h_Fm, &physicalMuramBase);816p_FmPcd->physicalMuramBase = (uint64_t)((uint64_t)(&physicalMuramBase)->low | ((uint64_t)(&physicalMuramBase)->high << 32));817}818819for (i = 0; i<FM_MAX_NUM_OF_PORTS; i++)820p_FmPcd->netEnvs[i].clsPlanGrpId = ILLEGAL_CLS_PLAN;821822if (p_FmPcdParams->useHostCommand)823{824t_FmHcParams hcParams;825826memset(&hcParams, 0, sizeof(hcParams));827hcParams.h_Fm = p_FmPcd->h_Fm;828hcParams.h_FmPcd = (t_Handle)p_FmPcd;829memcpy((uint8_t*)&hcParams.params, (uint8_t*)&p_FmPcdParams->hc, sizeof(t_FmPcdHcParams));830p_FmPcd->h_Hc = FmHcConfigAndInit(&hcParams);831if (!p_FmPcd->h_Hc)832{833REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD HC"));834FM_PCD_Free(p_FmPcd);835return NULL;836}837}838else if (p_FmPcd->guestId != NCSW_MASTER_ID)839REPORT_ERROR(MAJOR, E_INVALID_STATE, ("No Host Command defined for a guest partition."));840841if (p_FmPcdParams->kgSupport)842{843p_FmPcd->p_FmPcdKg = (t_FmPcdKg *)KgConfig(p_FmPcd, p_FmPcdParams);844if (!p_FmPcd->p_FmPcdKg)845{846REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Keygen"));847FM_PCD_Free(p_FmPcd);848return NULL;849}850}851852if (p_FmPcdParams->plcrSupport)853{854p_FmPcd->p_FmPcdPlcr = (t_FmPcdPlcr *)PlcrConfig(p_FmPcd, p_FmPcdParams);855if (!p_FmPcd->p_FmPcdPlcr)856{857REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Policer"));858FM_PCD_Free(p_FmPcd);859return NULL;860}861}862863if (p_FmPcdParams->prsSupport)864{865p_FmPcd->p_FmPcdPrs = (t_FmPcdPrs *)PrsConfig(p_FmPcd, p_FmPcdParams);866if (!p_FmPcd->p_FmPcdPrs)867{868REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD Parser"));869FM_PCD_Free(p_FmPcd);870return NULL;871}872}873874p_FmPcd->h_Spinlock = XX_InitSpinlock();875if (!p_FmPcd->h_Spinlock)876{877REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD spinlock"));878FM_PCD_Free(p_FmPcd);879return NULL;880}881INIT_LIST(&p_FmPcd->freeLocksLst);882INIT_LIST(&p_FmPcd->acquiredLocksLst);883884p_FmPcd->numOfEnabledGuestPartitionsPcds = 0;885886p_FmPcd->f_Exception = p_FmPcdParams->f_Exception;887p_FmPcd->f_FmPcdIndexedException = p_FmPcdParams->f_ExceptionId;888p_FmPcd->h_App = p_FmPcdParams->h_App;889890p_FmPcd->p_CcShadow = NULL;891p_FmPcd->ccShadowSize = 0;892p_FmPcd->ccShadowAlign = 0;893894p_FmPcd->h_ShadowSpinlock = XX_InitSpinlock();895if (!p_FmPcd->h_ShadowSpinlock)896{897REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM PCD shadow spinlock"));898FM_PCD_Free(p_FmPcd);899return NULL;900}901902return p_FmPcd;903}904905t_Error FM_PCD_Init(t_Handle h_FmPcd)906{907t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;908t_Error err = E_OK;909t_FmPcdIpcMsg msg;910911SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);912SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE);913914FM_GetRevision(p_FmPcd->h_Fm, &p_FmPcd->fmRevInfo);915916if (p_FmPcd->guestId != NCSW_MASTER_ID)917{918memset(p_FmPcd->fmPcdIpcHandlerModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);919if (Sprint (p_FmPcd->fmPcdIpcHandlerModuleName, "FM_PCD_%d_%d", FmGetId(p_FmPcd->h_Fm), NCSW_MASTER_ID) != 10)920RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));921memset(p_FmPcd->fmPcdModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);922if (Sprint (p_FmPcd->fmPcdModuleName, "FM_PCD_%d_%d",FmGetId(p_FmPcd->h_Fm), p_FmPcd->guestId) != (p_FmPcd->guestId<10 ? 10:11))923RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));924925p_FmPcd->h_IpcSession = XX_IpcInitSession(p_FmPcd->fmPcdIpcHandlerModuleName, p_FmPcd->fmPcdModuleName);926if (p_FmPcd->h_IpcSession)927{928t_FmPcdIpcReply reply;929uint32_t replyLength;930uint8_t isMasterAlive = 0;931932memset(&msg, 0, sizeof(msg));933memset(&reply, 0, sizeof(reply));934msg.msgId = FM_PCD_MASTER_IS_ALIVE;935msg.msgBody[0] = p_FmPcd->guestId;936blockingFlag = TRUE;937938do939{940replyLength = sizeof(uint32_t) + sizeof(isMasterAlive);941if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,942(uint8_t*)&msg,943sizeof(msg.msgId)+sizeof(p_FmPcd->guestId),944(uint8_t*)&reply,945&replyLength,946IpcMsgCompletionCB,947h_FmPcd)) != E_OK)948REPORT_ERROR(MAJOR, err, NO_MSG);949while (blockingFlag) ;950if (replyLength != (sizeof(uint32_t) + sizeof(isMasterAlive)))951REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));952isMasterAlive = *(uint8_t*)(reply.replyBody);953} while (!isMasterAlive);954}955}956957CHECK_INIT_PARAMETERS(p_FmPcd, CheckFmPcdParameters);958959if (p_FmPcd->p_FmPcdKg)960{961err = KgInit(p_FmPcd);962if (err)963RETURN_ERROR(MAJOR, err, NO_MSG);964}965966if (p_FmPcd->p_FmPcdPlcr)967{968err = PlcrInit(p_FmPcd);969if (err)970RETURN_ERROR(MAJOR, err, NO_MSG);971}972973if (p_FmPcd->p_FmPcdPrs)974{975err = PrsInit(p_FmPcd);976if (err)977RETURN_ERROR(MAJOR, err, NO_MSG);978}979980if (p_FmPcd->guestId == NCSW_MASTER_ID)981{982/* register to inter-core messaging mechanism */983memset(p_FmPcd->fmPcdModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);984if (Sprint (p_FmPcd->fmPcdModuleName, "FM_PCD_%d_%d",FmGetId(p_FmPcd->h_Fm),NCSW_MASTER_ID) != 10)985RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));986err = XX_IpcRegisterMsgHandler(p_FmPcd->fmPcdModuleName, IpcMsgHandlerCB, p_FmPcd, FM_PCD_MAX_REPLY_SIZE);987if (err)988RETURN_ERROR(MAJOR, err, NO_MSG);989}990991/* IPv6 Frame-Id used for fragmentation */992p_FmPcd->ipv6FrameIdAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram, 4, 4));993if (!p_FmPcd->ipv6FrameIdAddr)994{995FM_PCD_Free(p_FmPcd);996RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for IPv6 Frame-Id"));997}998IOMemSet32(UINT_TO_PTR(p_FmPcd->ipv6FrameIdAddr), 0, 4);9991000/* CAPWAP Frame-Id used for fragmentation */1001p_FmPcd->capwapFrameIdAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_FmPcd->h_FmMuram, 2, 4));1002if (!p_FmPcd->capwapFrameIdAddr)1003{1004FM_PCD_Free(p_FmPcd);1005RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CAPWAP Frame-Id"));1006}1007IOMemSet32(UINT_TO_PTR(p_FmPcd->capwapFrameIdAddr), 0, 2);10081009XX_Free(p_FmPcd->p_FmPcdDriverParam);1010p_FmPcd->p_FmPcdDriverParam = NULL;10111012FmRegisterPcd(p_FmPcd->h_Fm, p_FmPcd);10131014return E_OK;1015}10161017t_Error FM_PCD_Free(t_Handle h_FmPcd)1018{1019t_FmPcd *p_FmPcd =(t_FmPcd *)h_FmPcd;1020t_Error err = E_OK;10211022if (p_FmPcd->ipv6FrameIdAddr)1023FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, UINT_TO_PTR(p_FmPcd->ipv6FrameIdAddr));10241025if (p_FmPcd->capwapFrameIdAddr)1026FM_MURAM_FreeMem(p_FmPcd->h_FmMuram, UINT_TO_PTR(p_FmPcd->capwapFrameIdAddr));10271028if (p_FmPcd->enabled)1029FM_PCD_Disable(p_FmPcd);10301031if (p_FmPcd->p_FmPcdDriverParam)1032{1033XX_Free(p_FmPcd->p_FmPcdDriverParam);1034p_FmPcd->p_FmPcdDriverParam = NULL;1035}10361037if (p_FmPcd->p_FmPcdKg)1038{1039if ((err = KgFree(p_FmPcd)) != E_OK)1040RETURN_ERROR(MINOR, err, NO_MSG);1041XX_Free(p_FmPcd->p_FmPcdKg);1042p_FmPcd->p_FmPcdKg = NULL;1043}10441045if (p_FmPcd->p_FmPcdPlcr)1046{1047PlcrFree(p_FmPcd);1048XX_Free(p_FmPcd->p_FmPcdPlcr);1049p_FmPcd->p_FmPcdPlcr = NULL;1050}10511052if (p_FmPcd->p_FmPcdPrs)1053{1054if (p_FmPcd->guestId == NCSW_MASTER_ID)1055PrsFree(p_FmPcd);1056XX_Free(p_FmPcd->p_FmPcdPrs);1057p_FmPcd->p_FmPcdPrs = NULL;1058}10591060if (p_FmPcd->h_Hc)1061{1062FmHcFree(p_FmPcd->h_Hc);1063p_FmPcd->h_Hc = NULL;1064}10651066XX_IpcUnregisterMsgHandler(p_FmPcd->fmPcdModuleName);10671068FmUnregisterPcd(p_FmPcd->h_Fm);10691070ReleaseFreeLocksLst(p_FmPcd);10711072if (p_FmPcd->h_Spinlock)1073XX_FreeSpinlock(p_FmPcd->h_Spinlock);10741075if (p_FmPcd->h_ShadowSpinlock)1076XX_FreeSpinlock(p_FmPcd->h_ShadowSpinlock);10771078XX_Free(p_FmPcd);10791080return E_OK;1081}10821083t_Error FM_PCD_ConfigException(t_Handle h_FmPcd, e_FmPcdExceptions exception, bool enable)1084{1085t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;1086uint32_t bitMask = 0;10871088SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);10891090if (p_FmPcd->guestId != NCSW_MASTER_ID)1091RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ConfigException - guest mode!"));10921093GET_FM_PCD_EXCEPTION_FLAG(bitMask, exception);1094if (bitMask)1095{1096if (enable)1097p_FmPcd->exceptions |= bitMask;1098else1099p_FmPcd->exceptions &= ~bitMask;1100}1101else1102RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));11031104return E_OK;1105}11061107t_Error FM_PCD_ConfigHcFramesDataMemory(t_Handle h_FmPcd, uint8_t memId)1108{1109t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;11101111SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);1112SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);11131114return FmHcSetFramesDataMemory(p_FmPcd->h_Hc, memId);1115}11161117t_Error FM_PCD_Enable(t_Handle h_FmPcd)1118{1119t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;1120t_Error err = E_OK;11211122SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);11231124if (p_FmPcd->enabled)1125return E_OK;11261127if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&1128p_FmPcd->h_IpcSession)1129{1130uint8_t enabled;1131t_FmPcdIpcMsg msg;1132t_FmPcdIpcReply reply;1133uint32_t replyLength;11341135memset(&reply, 0, sizeof(reply));1136memset(&msg, 0, sizeof(msg));1137msg.msgId = FM_PCD_MASTER_IS_ENABLED;1138replyLength = sizeof(uint32_t) + sizeof(enabled);1139if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,1140(uint8_t*)&msg,1141sizeof(msg.msgId),1142(uint8_t*)&reply,1143&replyLength,1144NULL,1145NULL)) != E_OK)1146RETURN_ERROR(MAJOR, err, NO_MSG);1147if (replyLength != sizeof(uint32_t) + sizeof(enabled))1148RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));1149p_FmPcd->enabled = (bool)!!(*(uint8_t*)(reply.replyBody));1150if (!p_FmPcd->enabled)1151RETURN_ERROR(MAJOR, E_INVALID_STATE, ("FM-PCD master should be enabled first!"));11521153return E_OK;1154}1155else if (p_FmPcd->guestId != NCSW_MASTER_ID)1156RETURN_ERROR(MINOR, E_NOT_SUPPORTED,1157("running in guest-mode without IPC!"));11581159if (p_FmPcd->p_FmPcdKg)1160KgEnable(p_FmPcd);11611162if (p_FmPcd->p_FmPcdPlcr)1163PlcrEnable(p_FmPcd);11641165if (p_FmPcd->p_FmPcdPrs)1166PrsEnable(p_FmPcd);11671168p_FmPcd->enabled = TRUE;11691170return E_OK;1171}11721173t_Error FM_PCD_Disable(t_Handle h_FmPcd)1174{1175t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;1176t_Error err = E_OK;11771178SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);11791180if (!p_FmPcd->enabled)1181return E_OK;11821183if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&1184p_FmPcd->h_IpcSession)1185{1186t_FmPcdIpcMsg msg;1187t_FmPcdIpcReply reply;1188uint32_t replyLength;11891190memset(&reply, 0, sizeof(reply));1191memset(&msg, 0, sizeof(msg));1192msg.msgId = FM_PCD_GUEST_DISABLE;1193replyLength = sizeof(uint32_t);1194if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,1195(uint8_t*)&msg,1196sizeof(msg.msgId),1197(uint8_t*)&reply,1198&replyLength,1199NULL,1200NULL)) != E_OK)1201RETURN_ERROR(MAJOR, err, NO_MSG);1202if (replyLength != sizeof(uint32_t))1203RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));1204if (reply.error == E_OK)1205p_FmPcd->enabled = FALSE;12061207return (t_Error)(reply.error);1208}1209else if (p_FmPcd->guestId != NCSW_MASTER_ID)1210RETURN_ERROR(MINOR, E_NOT_SUPPORTED,1211("running in guest-mode without IPC!"));12121213if (p_FmPcd->numOfEnabledGuestPartitionsPcds != 0)1214RETURN_ERROR(MAJOR, E_INVALID_STATE,1215("Trying to disable a master partition PCD while"1216"guest partitions are still enabled!"));12171218if (p_FmPcd->p_FmPcdKg)1219KgDisable(p_FmPcd);12201221if (p_FmPcd->p_FmPcdPlcr)1222PlcrDisable(p_FmPcd);12231224if (p_FmPcd->p_FmPcdPrs)1225PrsDisable(p_FmPcd);12261227p_FmPcd->enabled = FALSE;12281229return E_OK;1230}12311232t_Handle FM_PCD_NetEnvCharacteristicsSet(t_Handle h_FmPcd, t_FmPcdNetEnvParams *p_NetEnvParams)1233{1234t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;1235uint32_t intFlags, specialUnits = 0;1236uint8_t bitId = 0;1237uint8_t i, j, k;1238uint8_t netEnvCurrId;1239uint8_t ipsecAhUnit = 0,ipsecEspUnit = 0;1240bool ipsecAhExists = FALSE, ipsecEspExists = FALSE, shim1Selected = FALSE;1241uint8_t hdrNum;1242t_FmPcdNetEnvParams *p_ModifiedNetEnvParams;12431244SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_STATE, NULL);1245SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, NULL);1246SANITY_CHECK_RETURN_VALUE(p_NetEnvParams, E_NULL_POINTER, NULL);12471248intFlags = FmPcdLock(p_FmPcd);12491250/* find a new netEnv */1251for (i = 0; i < FM_MAX_NUM_OF_PORTS; i++)1252if (!p_FmPcd->netEnvs[i].used)1253break;12541255if (i== FM_MAX_NUM_OF_PORTS)1256{1257REPORT_ERROR(MAJOR, E_FULL,("No more than %d netEnv's allowed.", FM_MAX_NUM_OF_PORTS));1258FmPcdUnlock(p_FmPcd, intFlags);1259return NULL;1260}12611262p_FmPcd->netEnvs[i].used = TRUE;1263FmPcdUnlock(p_FmPcd, intFlags);12641265/* As anyone doesn't have handle of this netEnv yet, no need1266to protect it with spinlocks */12671268p_ModifiedNetEnvParams = (t_FmPcdNetEnvParams *)XX_Malloc(sizeof(t_FmPcdNetEnvParams));1269if (!p_ModifiedNetEnvParams)1270{1271REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FmPcdNetEnvParams"));1272return NULL;1273}12741275memcpy(p_ModifiedNetEnvParams, p_NetEnvParams, sizeof(t_FmPcdNetEnvParams));1276p_NetEnvParams = p_ModifiedNetEnvParams;12771278netEnvCurrId = (uint8_t)i;12791280/* clear from previous use */1281memset(&p_FmPcd->netEnvs[netEnvCurrId].units, 0, FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS * sizeof(t_FmPcdIntDistinctionUnit));1282memset(&p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs, 0, FM_PCD_MAX_NUM_OF_ALIAS_HDRS * sizeof(t_FmPcdNetEnvAliases));1283memcpy(&p_FmPcd->netEnvs[netEnvCurrId].units, p_NetEnvParams->units, p_NetEnvParams->numOfDistinctionUnits*sizeof(t_FmPcdIntDistinctionUnit));12841285p_FmPcd->netEnvs[netEnvCurrId].netEnvId = netEnvCurrId;1286p_FmPcd->netEnvs[netEnvCurrId].h_FmPcd = p_FmPcd;12871288p_FmPcd->netEnvs[netEnvCurrId].clsPlanGrpId = ILLEGAL_CLS_PLAN;12891290/* check that header with opt is not interchanged with the same header */1291for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)1292&& (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)1293{1294for (k = 0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)1295&& (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)1296{1297/* if an option exists, check that other headers are not the same header1298without option */1299if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt)1300{1301for (j = 0; (j < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)1302&& (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].hdr != HEADER_TYPE_NONE); j++)1303{1304if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].hdr == p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr) &&1305!p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].opt)1306{1307REPORT_ERROR(MINOR, E_FULL,1308("Illegal unit - header with opt may not be interchangeable with the same header without opt"));1309XX_Free(p_ModifiedNetEnvParams);1310return NULL;1311}1312}1313}1314}1315}13161317/* Specific headers checking */1318for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)1319&& (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)1320{1321for (k = 0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)1322&& (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)1323{1324/* Some headers pairs may not be defined on different units as the parser1325doesn't distinguish */1326/* IPSEC_AH and IPSEC_SPI can't be 2 units, */1327/* check that header with opt is not interchanged with the same header */1328if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPSEC_AH)1329{1330if (ipsecEspExists && (ipsecEspUnit != i))1331{1332REPORT_ERROR(MINOR, E_INVALID_STATE, ("HEADER_TYPE_IPSEC_AH and HEADER_TYPE_IPSEC_ESP may not be defined in separate units"));1333XX_Free(p_ModifiedNetEnvParams);1334return NULL;1335}1336else1337{1338ipsecAhUnit = i;1339ipsecAhExists = TRUE;1340}1341}1342if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPSEC_ESP)1343{1344if (ipsecAhExists && (ipsecAhUnit != i))1345{1346REPORT_ERROR(MINOR, E_INVALID_STATE, ("HEADER_TYPE_IPSEC_AH and HEADER_TYPE_IPSEC_ESP may not be defined in separate units"));1347XX_Free(p_ModifiedNetEnvParams);1348return NULL;1349}1350else1351{1352ipsecEspUnit = i;1353ipsecEspExists = TRUE;1354}1355}1356/* ENCAP_ESP */1357if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_UDP_ENCAP_ESP)1358{1359/* IPSec UDP encapsulation is currently set to use SHIM1 */1360p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_UDP_ENCAP_ESP;1361p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM1;1362p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM1;1363p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;1364}1365#if (DPAA_VERSION >= 11) || ((DPAA_VERSION == 10) && defined(FM_CAPWAP_SUPPORT))1366/* UDP_LITE */1367if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_UDP_LITE)1368{1369p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_UDP_LITE;1370p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_UDP;1371p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_UDP;1372p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;1373}1374#endif /* (DPAA_VERSION >= 11) || ((DPAA_VERSION == 10) && defined(FM_CAPWAP_SUPPORT)) */13751376/* IP FRAG */1377if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPv4) &&1378(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt == IPV4_FRAG_1))1379{1380/* If IPv4+Frag, we need to set 2 units - SHIM 2 and IPv4. We first set SHIM2, and than check if1381* IPv4 exists. If so we don't need to set an extra unit1382* We consider as "having IPv4" any IPv4 without interchangable headers1383* but including any options. */1384p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_IPv4;1385p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].opt = IPV4_FRAG_1;1386p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM2;1387p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM2;1388p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;13891390/* check if IPv4 header exists by itself */1391if (FmPcdNetEnvGetUnitId(p_FmPcd, netEnvCurrId, HEADER_TYPE_IPv4, FALSE, 0) == FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)1392{1393p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits].hdrs[0].hdr = HEADER_TYPE_IPv4;1394p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits++].hdrs[0].opt = 0;1395}1396}1397if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPv6) &&1398(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt == IPV6_FRAG_1))1399{1400/* If IPv6+Frag, we need to set 2 units - SHIM 2 and IPv6. We first set SHIM2, and than check if1401* IPv4 exists. If so we don't need to set an extra unit1402* We consider as "having IPv6" any IPv6 without interchangable headers1403* but including any options. */1404p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_IPv6;1405p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].opt = IPV6_FRAG_1;1406p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM2;1407p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM2;1408p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;14091410/* check if IPv6 header exists by itself */1411if (FmPcdNetEnvGetUnitId(p_FmPcd, netEnvCurrId, HEADER_TYPE_IPv6, FALSE, 0) == FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)1412{1413p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits].hdrs[0].hdr = HEADER_TYPE_IPv6;1414p_FmPcd->netEnvs[netEnvCurrId].units[p_NetEnvParams->numOfDistinctionUnits++].hdrs[0].opt = 0;1415}1416}1417#if (DPAA_VERSION >= 11)1418/* CAPWAP FRAG */1419if ((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_CAPWAP) &&1420(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt == CAPWAP_FRAG_1))1421{1422p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_CAPWAP;1423p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].opt = CAPWAP_FRAG_1;1424p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM2;1425p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM2;1426p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;1427}1428#endif /* (DPAA_VERSION >= 11) */1429}1430}14311432/* if private header (shim), check that no other headers specified */1433for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)1434&& (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)1435{1436if (IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))1437if (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[1].hdr != HEADER_TYPE_NONE)1438{1439REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("SHIM header may not be interchanged with other headers"));1440XX_Free(p_ModifiedNetEnvParams);1441return NULL;1442}1443}14441445for (i = 0; i < p_NetEnvParams->numOfDistinctionUnits; i++)1446{1447if (IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))1448switch (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr)1449{1450case (HEADER_TYPE_USER_DEFINED_SHIM1):1451if (shim1Selected)1452{1453REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("SHIM header cannot be selected with UDP_IPSEC_ESP"));1454XX_Free(p_ModifiedNetEnvParams);1455return NULL;1456}1457shim1Selected = TRUE;1458p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = 0x00000001;1459break;1460case (HEADER_TYPE_USER_DEFINED_SHIM2):1461p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = 0x00000002;1462break;1463default:1464REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Requested SHIM not supported"));1465}1466else1467{1468p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = (uint32_t)(0x80000000 >> bitId++);14691470if (IS_SPECIAL_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))1471p_FmPcd->netEnvs[netEnvCurrId].macsecVector = p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i];1472}1473}14741475/* define a set of hardware parser LCV's according to the defined netenv */14761477/* set an array of LCV's for each header in the netEnv */1478for (i = 0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)1479&& (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)1480{1481/* private headers have no LCV in the hard parser */1482if (!IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))1483{1484for (k = 0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)1485&& (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)1486{1487hdrNum = GetPrsHdrNum(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr);1488if ((hdrNum == ILLEGAL_HDR_NUM) || (hdrNum == NO_HDR_NUM))1489{1490REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, NO_MSG);1491XX_Free(p_ModifiedNetEnvParams);1492return NULL;1493}1494p_FmPcd->netEnvs[netEnvCurrId].lcvs[hdrNum] |= p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i];1495}1496}1497}1498XX_Free(p_ModifiedNetEnvParams);14991500p_FmPcd->netEnvs[netEnvCurrId].h_Spinlock = XX_InitSpinlock();1501if (!p_FmPcd->netEnvs[netEnvCurrId].h_Spinlock)1502{1503REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd NetEnv spinlock"));1504return NULL;1505}1506return &p_FmPcd->netEnvs[netEnvCurrId];1507}15081509t_Error FM_PCD_NetEnvCharacteristicsDelete(t_Handle h_NetEnv)1510{1511t_FmPcdNetEnv *p_NetEnv = (t_FmPcdNetEnv*)h_NetEnv;1512t_FmPcd *p_FmPcd = p_NetEnv->h_FmPcd;1513uint32_t intFlags;1514uint8_t netEnvId = p_NetEnv->netEnvId;15151516SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_STATE);1517SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);15181519/* check that no port is bound to this netEnv */1520if (p_FmPcd->netEnvs[netEnvId].owners)1521{1522RETURN_ERROR(MINOR, E_INVALID_STATE,1523("Trying to delete a netEnv that has ports/schemes/trees/clsPlanGrps bound to"));1524}15251526intFlags = FmPcdLock(p_FmPcd);15271528p_FmPcd->netEnvs[netEnvId].used = FALSE;1529p_FmPcd->netEnvs[netEnvId].clsPlanGrpId = ILLEGAL_CLS_PLAN;15301531memset(p_FmPcd->netEnvs[netEnvId].units, 0, sizeof(t_FmPcdIntDistinctionUnit)*FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);1532memset(p_FmPcd->netEnvs[netEnvId].unitsVectors, 0, sizeof(uint32_t)*FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);1533memset(p_FmPcd->netEnvs[netEnvId].lcvs, 0, sizeof(uint32_t)*FM_PCD_PRS_NUM_OF_HDRS);15341535if (p_FmPcd->netEnvs[netEnvId].h_Spinlock)1536XX_FreeSpinlock(p_FmPcd->netEnvs[netEnvId].h_Spinlock);15371538FmPcdUnlock(p_FmPcd, intFlags);1539return E_OK;1540}15411542void FM_PCD_HcTxConf(t_Handle h_FmPcd, t_DpaaFD *p_Fd)1543{1544t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;15451546SANITY_CHECK_RETURN(h_FmPcd, E_INVALID_STATE);15471548FmHcTxConf(p_FmPcd->h_Hc, p_Fd);1549}15501551t_Error FM_PCD_SetAdvancedOffloadSupport(t_Handle h_FmPcd)1552{1553t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;1554t_FmCtrlCodeRevisionInfo revInfo;1555t_Error err;15561557SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);1558SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);1559SANITY_CHECK_RETURN_ERROR(!p_FmPcd->enabled, E_INVALID_STATE);15601561if ((err = FM_GetFmanCtrlCodeRevision(p_FmPcd->h_Fm, &revInfo)) != E_OK)1562{1563DBG(WARNING, ("FM in guest-mode without IPC, can't validate firmware revision."));1564revInfo.packageRev = IP_OFFLOAD_PACKAGE_NUMBER;1565}1566if (!IS_OFFLOAD_PACKAGE(revInfo.packageRev))1567RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Fman ctrl code package"));15681569if (!p_FmPcd->h_Hc)1570RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("HC must be initialized in this mode"));15711572p_FmPcd->advancedOffloadSupport = TRUE;15731574return E_OK;1575}15761577uint32_t FM_PCD_GetCounter(t_Handle h_FmPcd, e_FmPcdCounters counter)1578{1579t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;1580uint32_t outCounter = 0;1581t_Error err;15821583SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, 0);1584SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, 0);15851586switch (counter)1587{1588case (e_FM_PCD_KG_COUNTERS_TOTAL):1589if (!p_FmPcd->p_FmPcdKg)1590{1591REPORT_ERROR(MAJOR, E_INVALID_STATE, ("KeyGen is not activated"));1592return 0;1593}1594if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&1595!p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs &&1596!p_FmPcd->h_IpcSession)1597{1598REPORT_ERROR(MINOR, E_NOT_SUPPORTED,1599("running in guest-mode without neither IPC nor mapped register!"));1600return 0;1601}1602break;16031604case (e_FM_PCD_PLCR_COUNTERS_YELLOW):1605case (e_FM_PCD_PLCR_COUNTERS_RED):1606case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):1607case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):1608case (e_FM_PCD_PLCR_COUNTERS_TOTAL):1609case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):1610if (!p_FmPcd->p_FmPcdPlcr)1611{1612REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Policer is not activated"));1613return 0;1614}1615if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&1616!p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs &&1617!p_FmPcd->h_IpcSession)1618{1619REPORT_ERROR(MINOR, E_NOT_SUPPORTED,1620("running in \"guest-mode\" without neither IPC nor mapped register!"));1621return 0;1622}16231624/* check that counters are enabled */1625if (p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs &&1626!(GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr) & FM_PCD_PLCR_GCR_STEN))1627{1628REPORT_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));1629return 0;1630}1631ASSERT_COND(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs ||1632((p_FmPcd->guestId != NCSW_MASTER_ID) && p_FmPcd->h_IpcSession));1633break;16341635case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):1636case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):1637case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):1638case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):1639case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):1640case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):1641case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):1642case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):1643case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):1644case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):1645case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):1646case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):1647case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):1648case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):1649case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):1650case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):1651case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):1652if (!p_FmPcd->p_FmPcdPrs)1653{1654REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Parser is not activated"));1655return 0;1656}1657if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&1658!p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs &&1659!p_FmPcd->h_IpcSession)1660{1661REPORT_ERROR(MINOR, E_NOT_SUPPORTED,1662("running in guest-mode without neither IPC nor mapped register!"));1663return 0;1664}1665break;1666default:1667REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported type of counter"));1668return 0;1669}16701671if ((p_FmPcd->guestId != NCSW_MASTER_ID) &&1672p_FmPcd->h_IpcSession)1673{1674t_FmPcdIpcMsg msg;1675t_FmPcdIpcReply reply;1676uint32_t replyLength;16771678memset(&msg, 0, sizeof(msg));1679memset(&reply, 0, sizeof(reply));1680msg.msgId = FM_PCD_GET_COUNTER;1681memcpy(msg.msgBody, (uint8_t *)&counter, sizeof(uint32_t));1682replyLength = sizeof(uint32_t) + sizeof(uint32_t);1683if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,1684(uint8_t*)&msg,1685sizeof(msg.msgId) +sizeof(uint32_t),1686(uint8_t*)&reply,1687&replyLength,1688NULL,1689NULL)) != E_OK)1690RETURN_ERROR(MAJOR, err, NO_MSG);1691if (replyLength != sizeof(uint32_t) + sizeof(uint32_t))1692RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));16931694memcpy((uint8_t*)&outCounter, reply.replyBody, sizeof(uint32_t));1695return outCounter;1696}16971698switch (counter)1699{1700/* Parser statistics */1701case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):1702return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pds);1703case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):1704return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rrs);1705case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):1706return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rrs);1707case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):1708return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rrs);1709case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):1710return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srrs);1711case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):1712return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rres);1713case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):1714return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rres);1715case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):1716return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rres);1717case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):1718return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srres);1719case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):1720return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spcs);1721case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):1722return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spscs);1723case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):1724return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_hxscs);1725case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):1726return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrcs);1727case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):1728return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrscs);1729case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):1730return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwcs);1731case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):1732return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwscs);1733case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):1734return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_fcscs);1735case (e_FM_PCD_KG_COUNTERS_TOTAL):1736return GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_tpc);17371738/* Policer statistics */1739case (e_FM_PCD_PLCR_COUNTERS_YELLOW):1740return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ypcnt);1741case (e_FM_PCD_PLCR_COUNTERS_RED):1742return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rpcnt);1743case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):1744return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rrpcnt);1745case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):1746return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rypcnt);1747case (e_FM_PCD_PLCR_COUNTERS_TOTAL):1748return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_tpcnt);1749case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):1750return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_flmcnt);1751}1752return 0;1753}17541755t_Error FM_PCD_SetException(t_Handle h_FmPcd, e_FmPcdExceptions exception, bool enable)1756{1757t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;1758uint32_t bitMask = 0, tmpReg;17591760SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);1761SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);17621763if (p_FmPcd->guestId != NCSW_MASTER_ID)1764RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_SetException - guest mode!"));17651766GET_FM_PCD_EXCEPTION_FLAG(bitMask, exception);17671768if (bitMask)1769{1770if (enable)1771p_FmPcd->exceptions |= bitMask;1772else1773p_FmPcd->exceptions &= ~bitMask;17741775switch (exception)1776{1777case (e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):1778case (e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):1779if (!p_FmPcd->p_FmPcdKg)1780RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - keygen is not working"));1781break;1782case (e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):1783case (e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):1784case (e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):1785case (e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):1786if (!p_FmPcd->p_FmPcdPlcr)1787RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - policer is not working"));1788break;1789case (e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):1790case (e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):1791if (!p_FmPcd->p_FmPcdPrs)1792RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - parser is not working"));1793break;1794}17951796switch (exception)1797{1798case (e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):1799tmpReg = GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer);1800if (enable)1801tmpReg |= FM_EX_KG_DOUBLE_ECC;1802else1803tmpReg &= ~FM_EX_KG_DOUBLE_ECC;1804WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer, tmpReg);1805break;1806case (e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):1807tmpReg = GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer);1808if (enable)1809tmpReg |= FM_EX_KG_KEYSIZE_OVERFLOW;1810else1811tmpReg &= ~FM_EX_KG_KEYSIZE_OVERFLOW;1812WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_eeer, tmpReg);1813break;1814case (e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):1815tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_perer);1816if (enable)1817tmpReg |= FM_PCD_PRS_DOUBLE_ECC;1818else1819tmpReg &= ~FM_PCD_PRS_DOUBLE_ECC;1820WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_perer, tmpReg);1821break;1822case (e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):1823tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pever);1824if (enable)1825tmpReg |= FM_PCD_PRS_SINGLE_ECC;1826else1827tmpReg &= ~FM_PCD_PRS_SINGLE_ECC;1828WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pever, tmpReg);1829break;1830case (e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):1831tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier);1832if (enable)1833tmpReg |= FM_PCD_PLCR_DOUBLE_ECC;1834else1835tmpReg &= ~FM_PCD_PLCR_DOUBLE_ECC;1836WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier, tmpReg);1837break;1838case (e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):1839tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier);1840if (enable)1841tmpReg |= FM_PCD_PLCR_INIT_ENTRY_ERROR;1842else1843tmpReg &= ~FM_PCD_PLCR_INIT_ENTRY_ERROR;1844WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier, tmpReg);1845break;1846case (e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):1847tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier);1848if (enable)1849tmpReg |= FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE;1850else1851tmpReg &= ~FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE;1852WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier, tmpReg);1853break;1854case (e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):1855tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier);1856if (enable)1857tmpReg |= FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE;1858else1859tmpReg &= ~FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE;1860WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier, tmpReg);1861break;1862}1863/* for ECC exceptions driver automatically enables ECC mechanism, if disabled.1864Driver may disable them automatically, depending on driver's status */1865if (enable && ((exception == e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC) |1866(exception == e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC) |1867(exception == e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC) |1868(exception == e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC)))1869FmEnableRamsEcc(p_FmPcd->h_Fm);1870if (!enable && ((exception == e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC) |1871(exception == e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC) |1872(exception == e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC) |1873(exception == e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC)))1874FmDisableRamsEcc(p_FmPcd->h_Fm);1875}18761877return E_OK;1878}18791880t_Error FM_PCD_ForceIntr (t_Handle h_FmPcd, e_FmPcdExceptions exception)1881{1882t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;18831884SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);1885SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);18861887if (p_FmPcd->guestId != NCSW_MASTER_ID)1888RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ForceIntr - guest mode!"));18891890switch (exception)1891{1892case (e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):1893case (e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):1894if (!p_FmPcd->p_FmPcdKg)1895RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - keygen is not working"));1896break;1897case (e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):1898case (e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):1899case (e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):1900case (e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):1901if (!p_FmPcd->p_FmPcdPlcr)1902RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - policer is not working"));1903break;1904case (e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):1905case (e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):1906if (!p_FmPcd->p_FmPcdPrs)1907RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt -parsrer is not working"));1908break;1909default:1910RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Invalid interrupt requested"));1911}1912switch (exception)1913{1914case e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC:1915if (!(p_FmPcd->exceptions & FM_PCD_EX_PRS_DOUBLE_ECC))1916RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));1917break;1918case e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC:1919if (!(p_FmPcd->exceptions & FM_PCD_EX_PRS_SINGLE_ECC))1920RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));1921break;1922case e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC:1923if (!(p_FmPcd->exceptions & FM_EX_KG_DOUBLE_ECC))1924RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));1925WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_feer, FM_EX_KG_DOUBLE_ECC);1926break;1927case e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW:1928if (!(p_FmPcd->exceptions & FM_EX_KG_KEYSIZE_OVERFLOW))1929RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));1930WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_feer, FM_EX_KG_KEYSIZE_OVERFLOW);1931break;1932case e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC:1933if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_DOUBLE_ECC))1934RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));1935WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr, FM_PCD_PLCR_DOUBLE_ECC);1936break;1937case e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR:1938if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_INIT_ENTRY_ERROR))1939RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));1940WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr, FM_PCD_PLCR_INIT_ENTRY_ERROR);1941break;1942case e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE:1943if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_PRAM_SELF_INIT_COMPLETE))1944RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));1945WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr, FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE);1946break;1947case e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE:1948if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_ATOMIC_ACTION_COMPLETE))1949RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));1950WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr, FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE);1951break;1952}19531954return E_OK;1955}195619571958t_Error FM_PCD_ModifyCounter(t_Handle h_FmPcd, e_FmPcdCounters counter, uint32_t value)1959{1960t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;19611962SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);1963SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);19641965if (p_FmPcd->guestId != NCSW_MASTER_ID)1966RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ModifyCounter - guest mode!"));19671968switch (counter)1969{1970case (e_FM_PCD_KG_COUNTERS_TOTAL):1971if (!p_FmPcd->p_FmPcdKg)1972RETURN_ERROR(MINOR, E_INVALID_STATE, ("Invalid counters - KeyGen is not working"));1973break;1974case (e_FM_PCD_PLCR_COUNTERS_YELLOW):1975case (e_FM_PCD_PLCR_COUNTERS_RED):1976case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):1977case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):1978case (e_FM_PCD_PLCR_COUNTERS_TOTAL):1979case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):1980if (!p_FmPcd->p_FmPcdPlcr)1981RETURN_ERROR(MINOR, E_INVALID_STATE, ("Invalid counters - Policer is not working"));1982if (!(GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr) & FM_PCD_PLCR_GCR_STEN))1983RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));1984break;1985case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):1986case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):1987case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):1988case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):1989case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):1990case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):1991case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):1992case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):1993case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):1994case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):1995case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):1996case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):1997case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):1998case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):1999case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):2000case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):2001case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):2002if (!p_FmPcd->p_FmPcdPrs)2003RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter"));2004break;2005default:2006RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter"));2007}2008switch (counter)2009{2010case (e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):2011WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_pds, value);2012break;2013case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):2014WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rrs, value);2015break;2016case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):2017WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rrs, value);2018break;2019case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):2020WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rrs, value);2021break;2022case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):2023WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srrs, value);2024break;2025case (e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):2026WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l2rres, value);2027break;2028case (e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):2029WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l3rres, value);2030break;2031case (e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):2032WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_l4rres, value);2033break;2034case (e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):2035WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_srres, value);2036break;2037case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):2038WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spcs, value);2039break;2040case (e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):2041WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_spscs, value);2042break;2043case (e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):2044WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_hxscs, value);2045break;2046case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):2047WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrcs, value);2048break;2049case (e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):2050WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mrscs, value);2051break;2052case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):2053WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwcs, value);2054break;2055case (e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):2056WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_mwscs, value);2057break;2058case (e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):2059WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fmpr_fcscs, value);2060break;2061case (e_FM_PCD_KG_COUNTERS_TOTAL):2062WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->fmkg_tpc,value);2063break;20642065/*Policer counters*/2066case (e_FM_PCD_PLCR_COUNTERS_YELLOW):2067WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ypcnt, value);2068break;2069case (e_FM_PCD_PLCR_COUNTERS_RED):2070WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rpcnt, value);2071break;2072case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):2073WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rrpcnt, value);2074break;2075case (e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):2076WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rypcnt, value);2077break;2078case (e_FM_PCD_PLCR_COUNTERS_TOTAL):2079WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_tpcnt, value);2080break;2081case (e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):2082WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_flmcnt, value);2083break;2084}20852086return E_OK;2087}20882089t_Handle FM_PCD_GetHcPort(t_Handle h_FmPcd)2090{2091t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;2092return FmHcGetPort(p_FmPcd->h_Hc);2093}2094209520962097