1296177Sjhibbits/* Copyright (c) 2008-2011 Freescale Semiconductor, Inc. 2296177Sjhibbits * All rights reserved. 3296177Sjhibbits * 4296177Sjhibbits * Redistribution and use in source and binary forms, with or without 5296177Sjhibbits * modification, are permitted provided that the following conditions are met: 6296177Sjhibbits * * Redistributions of source code must retain the above copyright 7296177Sjhibbits * notice, this list of conditions and the following disclaimer. 8296177Sjhibbits * * Redistributions in binary form must reproduce the above copyright 9296177Sjhibbits * notice, this list of conditions and the following disclaimer in the 10296177Sjhibbits * documentation and/or other materials provided with the distribution. 11296177Sjhibbits * * Neither the name of Freescale Semiconductor nor the 12296177Sjhibbits * names of its contributors may be used to endorse or promote products 13296177Sjhibbits * derived from this software without specific prior written permission. 14296177Sjhibbits * 15296177Sjhibbits * 16296177Sjhibbits * ALTERNATIVELY, this software may be distributed under the terms of the 17296177Sjhibbits * GNU General Public License ("GPL") as published by the Free Software 18296177Sjhibbits * Foundation, either version 2 of that License or (at your option) any 19296177Sjhibbits * later version. 20296177Sjhibbits * 21296177Sjhibbits * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY 22296177Sjhibbits * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 23296177Sjhibbits * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24296177Sjhibbits * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY 25296177Sjhibbits * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26296177Sjhibbits * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27296177Sjhibbits * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 28296177Sjhibbits * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29296177Sjhibbits * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30296177Sjhibbits * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31296177Sjhibbits */ 32296177Sjhibbits 33296177Sjhibbits/****************************************************************************** 34296177Sjhibbits @File fm_pcd.c 35296177Sjhibbits 36296177Sjhibbits @Description FM PCD ... 37296177Sjhibbits*//***************************************************************************/ 38296177Sjhibbits#include "std_ext.h" 39296177Sjhibbits#include "error_ext.h" 40296177Sjhibbits#include "string_ext.h" 41296177Sjhibbits#include "xx_ext.h" 42296177Sjhibbits#include "sprint_ext.h" 43296177Sjhibbits#include "debug_ext.h" 44296177Sjhibbits#include "net_ext.h" 45296177Sjhibbits#include "fm_ext.h" 46296177Sjhibbits#include "fm_pcd_ext.h" 47296177Sjhibbits 48296177Sjhibbits#include "fm_common.h" 49296177Sjhibbits#include "fm_pcd.h" 50296177Sjhibbits#include "fm_pcd_ipc.h" 51296177Sjhibbits#include "fm_hc.h" 52296177Sjhibbits 53296177Sjhibbits 54296177Sjhibbitsstatic t_Error CheckFmPcdParameters(t_FmPcd *p_FmPcd) 55296177Sjhibbits{ 56296177Sjhibbits if(!p_FmPcd->h_Fm) 57296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("h_Fm has to be initialized")); 58296177Sjhibbits 59296177Sjhibbits if(p_FmPcd->guestId == NCSW_MASTER_ID) 60296177Sjhibbits { 61296177Sjhibbits if(p_FmPcd->p_FmPcdKg && !p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs) 62296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something WRONG")); 63296177Sjhibbits 64296177Sjhibbits if(p_FmPcd->p_FmPcdPlcr && !p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs) 65296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something WRONG")); 66296177Sjhibbits 67296177Sjhibbits if(!p_FmPcd->f_Exception) 68296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("f_FmPcdExceptions has to be initialized")); 69296177Sjhibbits 70296177Sjhibbits if((!p_FmPcd->f_FmPcdIndexedException) && (p_FmPcd->p_FmPcdPlcr || p_FmPcd->p_FmPcdKg)) 71296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("f_FmPcdIndexedException has to be initialized")); 72296177Sjhibbits 73296177Sjhibbits if(p_FmPcd->p_FmPcdDriverParam->prsMaxParseCycleLimit > PRS_MAX_CYCLE_LIMIT) 74296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("prsMaxParseCycleLimit has to be less than 8191")); 75296177Sjhibbits } 76296177Sjhibbits 77296177Sjhibbits return E_OK; 78296177Sjhibbits} 79296177Sjhibbits 80296177Sjhibbitsstatic volatile bool blockingFlag = FALSE; 81296177Sjhibbitsstatic void FmPcdIpcMsgCompletionCB(t_Handle h_FmPcd, 82296177Sjhibbits uint8_t *p_Msg, 83296177Sjhibbits uint8_t *p_Reply, 84296177Sjhibbits uint32_t replyLength, 85296177Sjhibbits t_Error status) 86296177Sjhibbits{ 87296177Sjhibbits UNUSED(h_FmPcd);UNUSED(p_Msg);UNUSED(p_Reply);UNUSED(replyLength);UNUSED(status); 88296177Sjhibbits blockingFlag = FALSE; 89296177Sjhibbits} 90296177Sjhibbits 91296177Sjhibbitsstatic t_Error FmPcdHandleIpcMsgCB(t_Handle h_FmPcd, 92296177Sjhibbits uint8_t *p_Msg, 93296177Sjhibbits uint32_t msgLength, 94296177Sjhibbits uint8_t *p_Reply, 95296177Sjhibbits uint32_t *p_ReplyLength) 96296177Sjhibbits{ 97296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 98296177Sjhibbits t_Error err = E_OK; 99296177Sjhibbits t_FmPcdIpcMsg *p_IpcMsg = (t_FmPcdIpcMsg*)p_Msg; 100296177Sjhibbits t_FmPcdIpcReply *p_IpcReply = (t_FmPcdIpcReply*)p_Reply; 101296177Sjhibbits 102296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE); 103296177Sjhibbits SANITY_CHECK_RETURN_ERROR((msgLength >= sizeof(uint32_t)), E_INVALID_VALUE); 104296177Sjhibbits 105296177Sjhibbits#ifdef DISABLE_SANITY_CHECKS 106296177Sjhibbits UNUSED(msgLength); 107296177Sjhibbits#endif /* DISABLE_SANITY_CHECKS */ 108296177Sjhibbits 109296177Sjhibbits ASSERT_COND(p_Msg); 110296177Sjhibbits 111296177Sjhibbits memset(p_IpcReply, 0, (sizeof(uint8_t) * FM_PCD_MAX_REPLY_SIZE)); 112296177Sjhibbits *p_ReplyLength = 0; 113296177Sjhibbits 114296177Sjhibbits switch(p_IpcMsg->msgId) 115296177Sjhibbits { 116296177Sjhibbits case (FM_PCD_MASTER_IS_ALIVE): 117296177Sjhibbits *(uint8_t*)(p_IpcReply->replyBody) = 1; 118296177Sjhibbits p_IpcReply->error = E_OK; 119296177Sjhibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t); 120296177Sjhibbits break; 121296177Sjhibbits case (FM_PCD_MASTER_IS_ENABLED): 122296177Sjhibbits /* count partitions registrations */ 123296177Sjhibbits if(p_FmPcd->enabled) 124296177Sjhibbits p_FmPcd->numOfEnabledGuestPartitionsPcds++; 125296177Sjhibbits *(uint8_t*)(p_IpcReply->replyBody) = (uint8_t)p_FmPcd->enabled; 126296177Sjhibbits p_IpcReply->error = E_OK; 127296177Sjhibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t); 128296177Sjhibbits break; 129296177Sjhibbits case (FM_PCD_GUEST_DISABLE): 130296177Sjhibbits if(p_FmPcd->numOfEnabledGuestPartitionsPcds) 131296177Sjhibbits { 132296177Sjhibbits p_FmPcd->numOfEnabledGuestPartitionsPcds--; 133296177Sjhibbits p_IpcReply->error = E_OK; 134296177Sjhibbits } 135296177Sjhibbits else 136296177Sjhibbits { 137296177Sjhibbits REPORT_ERROR(MINOR, E_INVALID_STATE,("Trying to disable an unregistered partition")); 138296177Sjhibbits p_IpcReply->error = E_INVALID_STATE; 139296177Sjhibbits } 140296177Sjhibbits *p_ReplyLength = sizeof(uint32_t); 141296177Sjhibbits break; 142296177Sjhibbits case(FM_PCD_GET_COUNTER): 143296177Sjhibbits { 144296177Sjhibbits e_FmPcdCounters inCounter; 145296177Sjhibbits uint32_t outCounter; 146296177Sjhibbits 147296177Sjhibbits memcpy((uint8_t*)&inCounter, p_IpcMsg->msgBody, sizeof(uint32_t)); 148296177Sjhibbits outCounter = FM_PCD_GetCounter(h_FmPcd, inCounter); 149296177Sjhibbits memcpy(p_IpcReply->replyBody, (uint8_t*)&outCounter, sizeof(uint32_t)); 150296177Sjhibbits p_IpcReply->error = E_OK; 151296177Sjhibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t); 152296177Sjhibbits break; 153296177Sjhibbits } 154296177Sjhibbits case (FM_PCD_ALLOC_KG_SCHEMES): 155296177Sjhibbits { 156296177Sjhibbits t_FmPcdIpcKgSchemesParams ipcSchemesParams; 157296177Sjhibbits 158296177Sjhibbits memcpy((uint8_t*)&ipcSchemesParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgSchemesParams)); 159296177Sjhibbits err = FmPcdKgAllocSchemes(h_FmPcd, 160296177Sjhibbits ipcSchemesParams.numOfSchemes, 161296177Sjhibbits ipcSchemesParams.guestId, 162296177Sjhibbits p_IpcReply->replyBody); 163296177Sjhibbits p_IpcReply->error = err; 164296177Sjhibbits *p_ReplyLength = sizeof(uint32_t) + ipcSchemesParams.numOfSchemes*sizeof(uint8_t); 165296177Sjhibbits break; 166296177Sjhibbits } 167296177Sjhibbits case (FM_PCD_FREE_KG_SCHEMES): 168296177Sjhibbits { 169296177Sjhibbits t_FmPcdIpcKgSchemesParams ipcSchemesParams; 170296177Sjhibbits 171296177Sjhibbits memcpy((uint8_t*)&ipcSchemesParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgSchemesParams)); 172296177Sjhibbits err = FmPcdKgFreeSchemes(h_FmPcd, 173296177Sjhibbits ipcSchemesParams.numOfSchemes, 174296177Sjhibbits ipcSchemesParams.guestId, 175296177Sjhibbits ipcSchemesParams.schemesIds); 176296177Sjhibbits p_IpcReply->error = err; 177296177Sjhibbits *p_ReplyLength = sizeof(uint32_t); 178296177Sjhibbits break; 179296177Sjhibbits } 180296177Sjhibbits case (FM_PCD_ALLOC_KG_CLSPLAN): 181296177Sjhibbits { 182296177Sjhibbits t_FmPcdIpcKgClsPlanParams ipcKgClsPlanParams; 183296177Sjhibbits 184296177Sjhibbits memcpy((uint8_t*)&ipcKgClsPlanParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgClsPlanParams)); 185296177Sjhibbits err = KgAllocClsPlanEntries(h_FmPcd, 186296177Sjhibbits ipcKgClsPlanParams.numOfClsPlanEntries, 187296177Sjhibbits ipcKgClsPlanParams.guestId, 188296177Sjhibbits p_IpcReply->replyBody); 189296177Sjhibbits p_IpcReply->error = err; 190296177Sjhibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t); 191296177Sjhibbits break; 192296177Sjhibbits } 193296177Sjhibbits case (FM_PCD_FREE_KG_CLSPLAN): 194296177Sjhibbits { 195296177Sjhibbits t_FmPcdIpcKgClsPlanParams ipcKgClsPlanParams; 196296177Sjhibbits 197296177Sjhibbits memcpy((uint8_t*)&ipcKgClsPlanParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgClsPlanParams)); 198296177Sjhibbits KgFreeClsPlanEntries(h_FmPcd, 199296177Sjhibbits ipcKgClsPlanParams.numOfClsPlanEntries, 200296177Sjhibbits ipcKgClsPlanParams.guestId, 201296177Sjhibbits ipcKgClsPlanParams.clsPlanBase); 202296177Sjhibbits *p_ReplyLength = sizeof(uint32_t); 203296177Sjhibbits break; 204296177Sjhibbits } 205296177Sjhibbits case (FM_PCD_ALLOC_PROFILES): 206296177Sjhibbits { 207296177Sjhibbits t_FmPcdIpcPlcrAllocParams ipcPlcrAllocParams; 208296177Sjhibbits uint16_t profilesBase; 209296177Sjhibbits 210296177Sjhibbits memcpy((uint8_t*)&ipcPlcrAllocParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcPlcrAllocParams)); 211296177Sjhibbits err = PlcrAllocProfiles(h_FmPcd, 212296177Sjhibbits ipcPlcrAllocParams.hardwarePortId, 213296177Sjhibbits ipcPlcrAllocParams.num, 214296177Sjhibbits &profilesBase); 215296177Sjhibbits memcpy(p_IpcReply->replyBody, (uint8_t*)&profilesBase, sizeof(uint16_t)); 216296177Sjhibbits p_IpcReply->error = err; 217296177Sjhibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint16_t); 218296177Sjhibbits break; 219296177Sjhibbits } 220296177Sjhibbits case (FM_PCD_FREE_PROFILES): 221296177Sjhibbits { 222296177Sjhibbits t_FmPcdIpcPlcrAllocParams ipcPlcrAllocParams; 223296177Sjhibbits 224296177Sjhibbits memcpy((uint8_t*)&ipcPlcrAllocParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcPlcrAllocParams)); 225296177Sjhibbits err = PlcrFreeProfiles(h_FmPcd, 226296177Sjhibbits ipcPlcrAllocParams.hardwarePortId, 227296177Sjhibbits ipcPlcrAllocParams.num, 228296177Sjhibbits ipcPlcrAllocParams.plcrProfilesBase); 229296177Sjhibbits p_IpcReply->error = err; 230296177Sjhibbits *p_ReplyLength = sizeof(uint32_t); 231296177Sjhibbits break; 232296177Sjhibbits } 233296177Sjhibbits case (FM_PCD_ALLOC_SHARED_PROFILES): 234296177Sjhibbits { 235296177Sjhibbits uint16_t numOfProfiles; 236296177Sjhibbits uint16_t profilesIds[FM_PCD_PLCR_NUM_ENTRIES]; 237296177Sjhibbits uint32_t profilesMask[FM_PCD_PLCR_NUM_ENTRIES/32]; 238296177Sjhibbits int i; 239296177Sjhibbits 240296177Sjhibbits memset(profilesMask, 0, FM_PCD_PLCR_NUM_ENTRIES/32 * sizeof(uint32_t)); 241296177Sjhibbits memcpy((uint8_t*)&numOfProfiles, p_IpcMsg->msgBody, sizeof(uint16_t)); 242296177Sjhibbits err = PlcrAllocSharedProfiles(h_FmPcd, 243296177Sjhibbits numOfProfiles, 244296177Sjhibbits profilesIds); 245296177Sjhibbits p_IpcReply->error = err; 246296177Sjhibbits 247296177Sjhibbits /* translate the allocated profile id's to a 32bit * 8regs mask */ 248296177Sjhibbits for(i = 0;i<numOfProfiles;i++) 249296177Sjhibbits profilesMask[profilesIds[i]/32] |= (0x80000000 >> (profilesIds[i] % 32)); 250296177Sjhibbits 251296177Sjhibbits memcpy(p_IpcReply->replyBody, (uint8_t*)&profilesMask, sizeof(profilesMask)); 252296177Sjhibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(profilesMask); /* num-of-shared-profiles */ 253296177Sjhibbits break; 254296177Sjhibbits } 255296177Sjhibbits case (FM_PCD_FREE_SHARED_PROFILES): 256296177Sjhibbits { 257296177Sjhibbits t_FmPcdIpcSharedPlcrAllocParams ipcSharedPlcrAllocParams; 258296177Sjhibbits uint16_t profilesIds[FM_PCD_PLCR_NUM_ENTRIES]; 259296177Sjhibbits int i,j, index = 0; 260296177Sjhibbits uint32_t walking1Mask = 0x80000000; 261296177Sjhibbits 262296177Sjhibbits memset(profilesIds, 0, FM_PCD_PLCR_NUM_ENTRIES*sizeof(uint16_t)); 263296177Sjhibbits memcpy((uint8_t*)&ipcSharedPlcrAllocParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcSharedPlcrAllocParams)); 264296177Sjhibbits for(i = 0; i<FM_PCD_PLCR_NUM_ENTRIES/32 ; i++) 265296177Sjhibbits { 266296177Sjhibbits if(ipcSharedPlcrAllocParams.sharedProfilesMask[i]) 267296177Sjhibbits { 268296177Sjhibbits for(j = 0 ; j<32 ; j++) 269296177Sjhibbits { 270296177Sjhibbits if(ipcSharedPlcrAllocParams.sharedProfilesMask[i] & walking1Mask) 271296177Sjhibbits profilesIds[index++] = (uint16_t)(i*32+j); 272296177Sjhibbits walking1Mask >>= 1; 273296177Sjhibbits } 274296177Sjhibbits walking1Mask = 0x80000000; 275296177Sjhibbits } 276296177Sjhibbits } 277296177Sjhibbits 278296177Sjhibbits PlcrFreeSharedProfiles(h_FmPcd, 279296177Sjhibbits ipcSharedPlcrAllocParams.num, 280296177Sjhibbits profilesIds); 281296177Sjhibbits break; 282296177Sjhibbits } 283296177Sjhibbits case(FM_PCD_GET_SW_PRS_OFFSET): 284296177Sjhibbits { 285296177Sjhibbits t_FmPcdIpcSwPrsLable ipcSwPrsLable; 286296177Sjhibbits uint32_t swPrsOffset; 287296177Sjhibbits 288296177Sjhibbits memcpy((uint8_t*)&ipcSwPrsLable, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcSwPrsLable)); 289296177Sjhibbits swPrsOffset = 290296177Sjhibbits FmPcdGetSwPrsOffset(h_FmPcd, 291296177Sjhibbits (e_NetHeaderType)ipcSwPrsLable.enumHdr, 292296177Sjhibbits ipcSwPrsLable.indexPerHdr); 293296177Sjhibbits memcpy(p_IpcReply->replyBody, (uint8_t*)&swPrsOffset, sizeof(uint32_t)); 294296177Sjhibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t); 295296177Sjhibbits break; 296296177Sjhibbits } 297296177Sjhibbits case(FM_PCD_PRS_INC_PORT_STATS): 298296177Sjhibbits { 299296177Sjhibbits t_FmPcdIpcPrsIncludePort ipcPrsIncludePort; 300296177Sjhibbits 301296177Sjhibbits memcpy((uint8_t*)&ipcPrsIncludePort, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcPrsIncludePort)); 302296177Sjhibbits PrsIncludePortInStatistics(h_FmPcd, 303296177Sjhibbits ipcPrsIncludePort.hardwarePortId, 304296177Sjhibbits ipcPrsIncludePort.include); 305296177Sjhibbits break; 306296177Sjhibbits } 307296177Sjhibbits#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)) 308296177Sjhibbits case(FM_PCD_DUMP_REGS): 309296177Sjhibbits if((err = FM_PCD_DumpRegs(h_FmPcd)) != E_OK) 310296177Sjhibbits REPORT_ERROR(MINOR, err, NO_MSG); 311296177Sjhibbits break; 312296177Sjhibbits case(FM_PCD_KG_DUMP_REGS): 313296177Sjhibbits if((err = FM_PCD_KgDumpRegs(h_FmPcd)) != E_OK) 314296177Sjhibbits REPORT_ERROR(MINOR, err, NO_MSG); 315296177Sjhibbits break; 316296177Sjhibbits case(FM_PCD_PLCR_DUMP_REGS): 317296177Sjhibbits if((err = FM_PCD_PlcrDumpRegs(h_FmPcd)) != E_OK) 318296177Sjhibbits REPORT_ERROR(MINOR, err, NO_MSG); 319296177Sjhibbits break; 320296177Sjhibbits case(FM_PCD_PLCR_PROFILE_DUMP_REGS): 321296177Sjhibbits { 322296177Sjhibbits t_Handle h_Profile; 323296177Sjhibbits memcpy((uint8_t*)&h_Profile, p_IpcMsg->msgBody, sizeof(t_Handle)); 324296177Sjhibbits if((err = FM_PCD_PlcrProfileDumpRegs(h_FmPcd, h_Profile)) != E_OK) 325296177Sjhibbits REPORT_ERROR(MINOR, err, NO_MSG); 326296177Sjhibbits break; 327296177Sjhibbits 328296177Sjhibbits } 329296177Sjhibbits case(FM_PCD_PRS_DUMP_REGS): 330296177Sjhibbits if((err = FM_PCD_PrsDumpRegs(h_FmPcd)) != E_OK) 331296177Sjhibbits REPORT_ERROR(MINOR, err, NO_MSG); 332296177Sjhibbits break; 333296177Sjhibbits#endif /* (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)) */ 334296177Sjhibbits default: 335296177Sjhibbits *p_ReplyLength = 0; 336296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!")); 337296177Sjhibbits } 338296177Sjhibbits return E_OK; 339296177Sjhibbits} 340296177Sjhibbits 341296177Sjhibbitsvoid FmPcdSetClsPlanGrpId(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint8_t clsPlanGrpId) 342296177Sjhibbits{ 343296177Sjhibbits p_FmPcd->netEnvs[netEnvId].clsPlanGrpId = clsPlanGrpId; 344296177Sjhibbits} 345296177Sjhibbits 346296177Sjhibbitst_Error PcdGetClsPlanGrpParams(t_FmPcd *p_FmPcd, t_FmPcdKgInterModuleClsPlanGrpParams *p_GrpParams) 347296177Sjhibbits{ 348296177Sjhibbits uint8_t netEnvId = p_GrpParams->netEnvId; 349296177Sjhibbits int i, k, j; 350296177Sjhibbits 351296177Sjhibbits if(p_FmPcd->netEnvs[netEnvId].clsPlanGrpId != ILLEGAL_CLS_PLAN) 352296177Sjhibbits { 353296177Sjhibbits p_GrpParams->grpExists = TRUE; 354296177Sjhibbits p_GrpParams->clsPlanGrpId = p_FmPcd->netEnvs[netEnvId].clsPlanGrpId; 355296177Sjhibbits return E_OK; 356296177Sjhibbits } 357296177Sjhibbits 358296177Sjhibbits for (i=0; ((i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) && 359296177Sjhibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)); i++) 360296177Sjhibbits { 361296177Sjhibbits for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) && 362296177Sjhibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE)); k++) 363296177Sjhibbits { 364296177Sjhibbits /* if an option exists, add it to the opts list */ 365296177Sjhibbits if(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt) 366296177Sjhibbits { 367296177Sjhibbits /* check if this option already exists, add if it doesn't */ 368296177Sjhibbits for(j = 0;j<p_GrpParams->numOfOptions;j++) 369296177Sjhibbits { 370296177Sjhibbits if(p_GrpParams->options[j] == p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt) 371296177Sjhibbits break; 372296177Sjhibbits } 373296177Sjhibbits p_GrpParams->optVectors[j] |= p_FmPcd->netEnvs[netEnvId].unitsVectors[i]; 374296177Sjhibbits if(j == p_GrpParams->numOfOptions) 375296177Sjhibbits { 376296177Sjhibbits p_GrpParams->options[p_GrpParams->numOfOptions] = p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt; 377296177Sjhibbits p_GrpParams->numOfOptions++; 378296177Sjhibbits } 379296177Sjhibbits } 380296177Sjhibbits } 381296177Sjhibbits } 382296177Sjhibbits 383296177Sjhibbits if(p_GrpParams->numOfOptions == 0) 384296177Sjhibbits { 385296177Sjhibbits if(p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId != ILLEGAL_CLS_PLAN) 386296177Sjhibbits { 387296177Sjhibbits p_GrpParams->grpExists = TRUE; 388296177Sjhibbits p_GrpParams->clsPlanGrpId = p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId; 389296177Sjhibbits } 390296177Sjhibbits } 391296177Sjhibbits 392296177Sjhibbits return E_OK; 393296177Sjhibbits 394296177Sjhibbits} 395296177Sjhibbits 396296177Sjhibbitst_Error PcdGetVectorForOpt(t_FmPcd *p_FmPcd, uint8_t netEnvId, protocolOpt_t opt, uint32_t *p_Vector) 397296177Sjhibbits{ 398296177Sjhibbits uint8_t j,k; 399296177Sjhibbits 400296177Sjhibbits *p_Vector = 0; 401296177Sjhibbits 402296177Sjhibbits for (j=0; ((j < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) && 403296177Sjhibbits (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[0].hdr != HEADER_TYPE_NONE)); j++) 404296177Sjhibbits { 405296177Sjhibbits for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) && 406296177Sjhibbits (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[k].hdr != HEADER_TYPE_NONE)); k++) 407296177Sjhibbits { 408296177Sjhibbits if (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[k].opt == opt) 409296177Sjhibbits *p_Vector |= p_FmPcd->netEnvs[netEnvId].unitsVectors[j]; 410296177Sjhibbits } 411296177Sjhibbits } 412296177Sjhibbits 413296177Sjhibbits if (!*p_Vector) 414296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Requested option was not defined for this Network Environment Characteristics module")); 415296177Sjhibbits else 416296177Sjhibbits return E_OK; 417296177Sjhibbits} 418296177Sjhibbits 419296177Sjhibbitst_Error PcdGetUnitsVector(t_FmPcd *p_FmPcd, t_NetEnvParams *p_Params) 420296177Sjhibbits{ 421296177Sjhibbits int i; 422296177Sjhibbits 423296177Sjhibbits p_Params->vector = 0; 424296177Sjhibbits for(i=0; i<p_Params->numOfDistinctionUnits ;i++) 425296177Sjhibbits { 426296177Sjhibbits if(p_FmPcd->netEnvs[p_Params->netEnvId].units[p_Params->unitIds[i]].hdrs[0].hdr == HEADER_TYPE_NONE) 427296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Requested unit was not defined for this Network Environment Characteristics module")); 428296177Sjhibbits ASSERT_COND(p_FmPcd->netEnvs[p_Params->netEnvId].unitsVectors[p_Params->unitIds[i]]); 429296177Sjhibbits p_Params->vector |= p_FmPcd->netEnvs[p_Params->netEnvId].unitsVectors[p_Params->unitIds[i]]; 430296177Sjhibbits } 431296177Sjhibbits 432296177Sjhibbits return E_OK; 433296177Sjhibbits} 434296177Sjhibbits 435296177Sjhibbitsbool PcdNetEnvIsUnitWithoutOpts(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint32_t unitVector) 436296177Sjhibbits{ 437296177Sjhibbits int i=0, k; 438296177Sjhibbits /* check whether a given unit may be used by non-clsPlan users. */ 439296177Sjhibbits /* first, recognize the unit by its vector */ 440296177Sjhibbits while (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE) 441296177Sjhibbits { 442296177Sjhibbits if (p_FmPcd->netEnvs[netEnvId].unitsVectors[i] == unitVector) 443296177Sjhibbits { 444296177Sjhibbits for (k=0; 445296177Sjhibbits ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) && 446296177Sjhibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE)); 447296177Sjhibbits k++) 448296177Sjhibbits /* check that no option exists */ 449296177Sjhibbits if((protocolOpt_t)p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt) 450296177Sjhibbits return FALSE; 451296177Sjhibbits break; 452296177Sjhibbits } 453296177Sjhibbits i++; 454296177Sjhibbits } 455296177Sjhibbits /* assert that a unit was found to mach the vector */ 456296177Sjhibbits ASSERT_COND(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); 457296177Sjhibbits 458296177Sjhibbits return TRUE; 459296177Sjhibbits} 460296177Sjhibbitsbool FmPcdNetEnvIsHdrExist(t_Handle h_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr) 461296177Sjhibbits{ 462296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 463296177Sjhibbits int i, k; 464296177Sjhibbits 465296177Sjhibbits ASSERT_COND(p_FmPcd); 466296177Sjhibbits 467296177Sjhibbits for (i=0; ((i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) && 468296177Sjhibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)); i++) 469296177Sjhibbits { 470296177Sjhibbits for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) && 471296177Sjhibbits (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE)); k++) 472296177Sjhibbits if (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr == hdr) 473296177Sjhibbits return TRUE; 474296177Sjhibbits } 475296177Sjhibbits for (i=0; ((i < FM_PCD_MAX_NUM_OF_PRIVATE_HDRS) && 476296177Sjhibbits (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE)); i++) 477296177Sjhibbits { 478296177Sjhibbits if (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr) 479296177Sjhibbits return TRUE; 480296177Sjhibbits } 481296177Sjhibbits 482296177Sjhibbits return FALSE; 483296177Sjhibbits} 484296177Sjhibbits 485296177Sjhibbitse_NetHeaderType FmPcdGetAliasHdr(t_FmPcd *p_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr) 486296177Sjhibbits{ 487296177Sjhibbits int i; 488296177Sjhibbits 489296177Sjhibbits ASSERT_COND(p_FmPcd); 490296177Sjhibbits 491296177Sjhibbits for (i=0; (i < FM_PCD_MAX_NUM_OF_PRIVATE_HDRS) 492296177Sjhibbits && (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE); i++) 493296177Sjhibbits { 494296177Sjhibbits if (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr) 495296177Sjhibbits return p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].aliasHdr; 496296177Sjhibbits } 497296177Sjhibbits 498296177Sjhibbits return HEADER_TYPE_NONE; 499296177Sjhibbits} 500296177Sjhibbits 501296177Sjhibbitsvoid FmPcdPortRegister(t_Handle h_FmPcd, t_Handle h_FmPort, uint8_t hardwarePortId) 502296177Sjhibbits{ 503296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 504296177Sjhibbits uint16_t swPortIndex = 0; 505296177Sjhibbits 506296177Sjhibbits HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId); 507296177Sjhibbits 508296177Sjhibbits p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].h_FmPort = h_FmPort; 509296177Sjhibbits} 510296177Sjhibbits 511296177Sjhibbitsuint32_t FmPcdGetLcv(t_Handle h_FmPcd, uint32_t netEnvId, uint8_t hdrNum) 512296177Sjhibbits{ 513296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 514296177Sjhibbits 515296177Sjhibbits return p_FmPcd->netEnvs[netEnvId].lcvs[hdrNum]; 516296177Sjhibbits} 517296177Sjhibbits 518296177Sjhibbitsuint32_t FmPcdGetMacsecLcv(t_Handle h_FmPcd, uint32_t netEnvId) 519296177Sjhibbits{ 520296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 521296177Sjhibbits 522296177Sjhibbits return p_FmPcd->netEnvs[netEnvId].macsecVector; 523296177Sjhibbits} 524296177Sjhibbits 525296177Sjhibbitsvoid FmPcdIncNetEnvOwners(t_Handle h_FmPcd, uint8_t netEnvId) 526296177Sjhibbits{ 527296177Sjhibbits ((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners++; 528296177Sjhibbits} 529296177Sjhibbits 530296177Sjhibbitsvoid FmPcdDecNetEnvOwners(t_Handle h_FmPcd, uint8_t netEnvId) 531296177Sjhibbits{ 532296177Sjhibbits ASSERT_COND(((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners); 533296177Sjhibbits ((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners--; 534296177Sjhibbits} 535296177Sjhibbits 536296177Sjhibbitsuint32_t FmPcdLock(t_Handle h_FmPcd) 537296177Sjhibbits{ 538296177Sjhibbits return XX_LockIntrSpinlock(((t_FmPcd*)h_FmPcd)->h_Spinlock); 539296177Sjhibbits} 540296177Sjhibbits 541296177Sjhibbitsvoid FmPcdUnlock(t_Handle h_FmPcd, uint32_t intFlags) 542296177Sjhibbits{ 543296177Sjhibbits XX_UnlockIntrSpinlock(((t_FmPcd*)h_FmPcd)->h_Spinlock, intFlags); 544296177Sjhibbits} 545296177Sjhibbits 546296177Sjhibbitst_Handle FmPcdGetHcHandle(t_Handle h_FmPcd) 547296177Sjhibbits{ 548296177Sjhibbits ASSERT_COND(h_FmPcd); 549296177Sjhibbits SANITY_CHECK_RETURN_VALUE(((t_FmPcd*)h_FmPcd)->h_Hc, E_INVALID_HANDLE, NULL); 550296177Sjhibbits return ((t_FmPcd*)h_FmPcd)->h_Hc; 551296177Sjhibbits} 552296177Sjhibbits 553296177Sjhibbits/**********************************************************************************************************/ 554296177Sjhibbits/* API */ 555296177Sjhibbits/**********************************************************************************************************/ 556296177Sjhibbits 557296177Sjhibbitst_Handle FM_PCD_Config(t_FmPcdParams *p_FmPcdParams) 558296177Sjhibbits{ 559296177Sjhibbits t_FmPcd *p_FmPcd = NULL; 560296177Sjhibbits t_FmPhysAddr physicalMuramBase; 561296177Sjhibbits uint8_t i; 562296177Sjhibbits 563296177Sjhibbits SANITY_CHECK_RETURN_VALUE(p_FmPcdParams, E_INVALID_HANDLE,NULL); 564296177Sjhibbits 565296177Sjhibbits p_FmPcd = (t_FmPcd *) XX_Malloc(sizeof(t_FmPcd)); 566296177Sjhibbits if (!p_FmPcd) 567296177Sjhibbits { 568296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd")); 569296177Sjhibbits return NULL; 570296177Sjhibbits } 571296177Sjhibbits memset(p_FmPcd, 0, sizeof(t_FmPcd)); 572296177Sjhibbits 573296177Sjhibbits p_FmPcd->p_FmPcdDriverParam = (t_FmPcdDriverParam *) XX_Malloc(sizeof(t_FmPcdDriverParam)); 574296177Sjhibbits if (!p_FmPcd->p_FmPcdDriverParam) 575296177Sjhibbits { 576296177Sjhibbits XX_Free(p_FmPcd); 577296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd Driver Param")); 578296177Sjhibbits return NULL; 579296177Sjhibbits } 580296177Sjhibbits memset(p_FmPcd->p_FmPcdDriverParam, 0, sizeof(t_FmPcdDriverParam)); 581296177Sjhibbits 582296177Sjhibbits p_FmPcd->h_Fm = p_FmPcdParams->h_Fm; 583296177Sjhibbits p_FmPcd->guestId = FmGetGuestId(p_FmPcd->h_Fm); 584296177Sjhibbits p_FmPcd->h_FmMuram = FmGetMuramHandle(p_FmPcd->h_Fm); 585296177Sjhibbits FmGetPhysicalMuramBase(p_FmPcdParams->h_Fm, &physicalMuramBase); 586296177Sjhibbits p_FmPcd->physicalMuramBase = (uint64_t)((uint64_t)(&physicalMuramBase)->low | ((uint64_t)(&physicalMuramBase)->high << 32)); 587296177Sjhibbits 588296177Sjhibbits for(i = 0; i<FM_MAX_NUM_OF_PORTS; i++) 589296177Sjhibbits p_FmPcd->netEnvs[i].clsPlanGrpId = ILLEGAL_CLS_PLAN; 590296177Sjhibbits 591296177Sjhibbits if (p_FmPcdParams->useHostCommand) 592296177Sjhibbits { 593296177Sjhibbits t_FmHcParams hcParams; 594296177Sjhibbits 595296177Sjhibbits memset(&hcParams, 0, sizeof(hcParams)); 596296177Sjhibbits hcParams.h_Fm = p_FmPcd->h_Fm; 597296177Sjhibbits hcParams.h_FmPcd = (t_Handle)p_FmPcd; 598296177Sjhibbits memcpy((uint8_t*)&hcParams.params, (uint8_t*)&p_FmPcdParams->hc, sizeof(t_FmPcdHcParams)); 599296177Sjhibbits p_FmPcd->h_Hc = FmHcConfigAndInit(&hcParams); 600296177Sjhibbits if (!p_FmPcd->h_Hc) 601296177Sjhibbits { 602296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd HC")); 603296177Sjhibbits FM_PCD_Free(p_FmPcd); 604296177Sjhibbits return NULL; 605296177Sjhibbits } 606296177Sjhibbits } 607296177Sjhibbits else if(p_FmPcd->guestId != NCSW_MASTER_ID) 608296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, ("No Host Command defined for a guest partition.")); 609296177Sjhibbits 610296177Sjhibbits if(p_FmPcdParams->kgSupport) 611296177Sjhibbits { 612296177Sjhibbits p_FmPcd->p_FmPcdKg = (t_FmPcdKg *)KgConfig(p_FmPcd, p_FmPcdParams); 613296177Sjhibbits if(!p_FmPcd->p_FmPcdKg) 614296177Sjhibbits { 615296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd Keygen")); 616296177Sjhibbits FM_PCD_Free(p_FmPcd); 617296177Sjhibbits return NULL; 618296177Sjhibbits } 619296177Sjhibbits } 620296177Sjhibbits 621296177Sjhibbits if(p_FmPcdParams->plcrSupport) 622296177Sjhibbits { 623296177Sjhibbits p_FmPcd->p_FmPcdPlcr = (t_FmPcdPlcr *)PlcrConfig(p_FmPcd, p_FmPcdParams); 624296177Sjhibbits if(!p_FmPcd->p_FmPcdPlcr) 625296177Sjhibbits { 626296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd Policer")); 627296177Sjhibbits FM_PCD_Free(p_FmPcd); 628296177Sjhibbits return NULL; 629296177Sjhibbits } 630296177Sjhibbits } 631296177Sjhibbits 632296177Sjhibbits if(p_FmPcdParams->prsSupport) 633296177Sjhibbits { 634296177Sjhibbits p_FmPcd->p_FmPcdPrs = (t_FmPcdPrs *)PrsConfig(p_FmPcd, p_FmPcdParams); 635296177Sjhibbits if(!p_FmPcd->p_FmPcdPrs) 636296177Sjhibbits { 637296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd Parser")); 638296177Sjhibbits FM_PCD_Free(p_FmPcd); 639296177Sjhibbits return NULL; 640296177Sjhibbits } 641296177Sjhibbits } 642296177Sjhibbits 643296177Sjhibbits p_FmPcd->h_Spinlock = XX_InitSpinlock(); 644296177Sjhibbits if (!p_FmPcd->h_Spinlock) 645296177Sjhibbits { 646296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd spinlock")); 647296177Sjhibbits FM_PCD_Free(p_FmPcd); 648296177Sjhibbits return NULL; 649296177Sjhibbits } 650296177Sjhibbits 651296177Sjhibbits p_FmPcd->numOfEnabledGuestPartitionsPcds = 0; 652296177Sjhibbits 653296177Sjhibbits p_FmPcd->f_Exception = p_FmPcdParams->f_Exception; 654296177Sjhibbits p_FmPcd->f_FmPcdIndexedException = p_FmPcdParams->f_ExceptionId; 655296177Sjhibbits p_FmPcd->h_App = p_FmPcdParams->h_App; 656296177Sjhibbits 657296177Sjhibbits return p_FmPcd; 658296177Sjhibbits} 659296177Sjhibbits 660296177Sjhibbitst_Error FM_PCD_Init(t_Handle h_FmPcd) 661296177Sjhibbits{ 662296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 663296177Sjhibbits t_Error err = E_OK; 664296177Sjhibbits t_FmPcdIpcMsg msg; 665296177Sjhibbits 666296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE); 667296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE); 668296177Sjhibbits 669296177Sjhibbits if(p_FmPcd->guestId != NCSW_MASTER_ID) 670296177Sjhibbits { 671296177Sjhibbits uint8_t isMasterAlive = 0; 672296177Sjhibbits t_FmPcdIpcReply reply; 673296177Sjhibbits uint32_t replyLength; 674296177Sjhibbits 675296177Sjhibbits memset(p_FmPcd->fmPcdIpcHandlerModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE); 676296177Sjhibbits if(Sprint (p_FmPcd->fmPcdIpcHandlerModuleName, "FM_PCD_%d_%d", FmGetId(p_FmPcd->h_Fm), NCSW_MASTER_ID) != 10) 677296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed")); 678296177Sjhibbits memset(p_FmPcd->fmPcdModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE); 679296177Sjhibbits if(Sprint (p_FmPcd->fmPcdModuleName, "FM_PCD_%d_%d",FmGetId(p_FmPcd->h_Fm), p_FmPcd->guestId) != (p_FmPcd->guestId<10 ? 10:11)) 680296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed")); 681296177Sjhibbits 682296177Sjhibbits p_FmPcd->h_IpcSession = XX_IpcInitSession(p_FmPcd->fmPcdIpcHandlerModuleName, p_FmPcd->fmPcdModuleName); 683296177Sjhibbits if (p_FmPcd->h_IpcSession == NULL) 684296177Sjhibbits RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("FM PCD Guest %d IPC session", p_FmPcd->guestId)); 685296177Sjhibbits 686296177Sjhibbits memset(&msg, 0, sizeof(msg)); 687296177Sjhibbits memset(&reply, 0, sizeof(reply)); 688296177Sjhibbits msg.msgId = FM_PCD_MASTER_IS_ALIVE; 689296177Sjhibbits msg.msgBody[0] = p_FmPcd->guestId; 690296177Sjhibbits blockingFlag = TRUE; 691296177Sjhibbits 692296177Sjhibbits do 693296177Sjhibbits { 694296177Sjhibbits replyLength = sizeof(uint32_t) + sizeof(isMasterAlive); 695296177Sjhibbits if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession, 696296177Sjhibbits (uint8_t*)&msg, 697296177Sjhibbits sizeof(msg.msgId)+sizeof(p_FmPcd->guestId), 698296177Sjhibbits (uint8_t*)&reply, 699296177Sjhibbits &replyLength, 700296177Sjhibbits FmPcdIpcMsgCompletionCB, 701296177Sjhibbits h_FmPcd)) != E_OK) 702296177Sjhibbits REPORT_ERROR(MAJOR, err, NO_MSG); 703296177Sjhibbits while(blockingFlag) ; 704296177Sjhibbits if(replyLength != (sizeof(uint32_t) + sizeof(isMasterAlive))) 705296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 706296177Sjhibbits isMasterAlive = *(uint8_t*)(reply.replyBody); 707296177Sjhibbits } while (!isMasterAlive); 708296177Sjhibbits } 709296177Sjhibbits 710296177Sjhibbits CHECK_INIT_PARAMETERS(p_FmPcd, CheckFmPcdParameters); 711296177Sjhibbits 712296177Sjhibbits if(p_FmPcd->p_FmPcdKg) 713296177Sjhibbits { 714296177Sjhibbits err = KgInit(p_FmPcd); 715296177Sjhibbits if(err) 716296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 717296177Sjhibbits } 718296177Sjhibbits 719296177Sjhibbits if(p_FmPcd->p_FmPcdPlcr) 720296177Sjhibbits { 721296177Sjhibbits err = PlcrInit(p_FmPcd); 722296177Sjhibbits if(err) 723296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 724296177Sjhibbits } 725296177Sjhibbits 726296177Sjhibbits if(p_FmPcd->p_FmPcdPrs) 727296177Sjhibbits { 728296177Sjhibbits err = PrsInit(p_FmPcd); 729296177Sjhibbits if(err) 730296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 731296177Sjhibbits } 732296177Sjhibbits 733296177Sjhibbits if(p_FmPcd->guestId == NCSW_MASTER_ID) 734296177Sjhibbits { 735296177Sjhibbits /* register to inter-core messaging mechanism */ 736296177Sjhibbits memset(p_FmPcd->fmPcdModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE); 737296177Sjhibbits if(Sprint (p_FmPcd->fmPcdModuleName, "FM_PCD_%d_%d",FmGetId(p_FmPcd->h_Fm),NCSW_MASTER_ID) != 10) 738296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed")); 739296177Sjhibbits err = XX_IpcRegisterMsgHandler(p_FmPcd->fmPcdModuleName, FmPcdHandleIpcMsgCB, p_FmPcd, FM_PCD_MAX_REPLY_SIZE); 740296177Sjhibbits if(err) 741296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 742296177Sjhibbits } 743296177Sjhibbits 744296177Sjhibbits XX_Free(p_FmPcd->p_FmPcdDriverParam); 745296177Sjhibbits p_FmPcd->p_FmPcdDriverParam = NULL; 746296177Sjhibbits 747296177Sjhibbits FmRegisterPcd(p_FmPcd->h_Fm, p_FmPcd); 748296177Sjhibbits 749296177Sjhibbits return E_OK; 750296177Sjhibbits} 751296177Sjhibbits 752296177Sjhibbitst_Error FM_PCD_Free(t_Handle h_FmPcd) 753296177Sjhibbits{ 754296177Sjhibbits t_FmPcd *p_FmPcd =(t_FmPcd *)h_FmPcd; 755296177Sjhibbits t_Error err = E_OK; 756296177Sjhibbits 757296177Sjhibbits if(p_FmPcd->enabled) 758296177Sjhibbits FM_PCD_Disable(p_FmPcd); 759296177Sjhibbits 760296177Sjhibbits if (p_FmPcd->h_Spinlock) 761296177Sjhibbits XX_FreeSpinlock(p_FmPcd->h_Spinlock); 762296177Sjhibbits 763296177Sjhibbits if(p_FmPcd->p_FmPcdDriverParam) 764296177Sjhibbits { 765296177Sjhibbits XX_Free(p_FmPcd->p_FmPcdDriverParam); 766296177Sjhibbits p_FmPcd->p_FmPcdDriverParam = NULL; 767296177Sjhibbits } 768296177Sjhibbits if(p_FmPcd->p_FmPcdKg) 769296177Sjhibbits { 770296177Sjhibbits if((err = KgFree(p_FmPcd)) != E_OK) 771296177Sjhibbits RETURN_ERROR(MINOR, err, NO_MSG); 772296177Sjhibbits XX_Free(p_FmPcd->p_FmPcdKg); 773296177Sjhibbits p_FmPcd->p_FmPcdKg = NULL; 774296177Sjhibbits } 775296177Sjhibbits 776296177Sjhibbits if(p_FmPcd->p_FmPcdPlcr) 777296177Sjhibbits { 778296177Sjhibbits if((err = PlcrFree(p_FmPcd)) != E_OK) 779296177Sjhibbits RETURN_ERROR(MINOR, err, NO_MSG); 780296177Sjhibbits XX_Free(p_FmPcd->p_FmPcdPlcr); 781296177Sjhibbits p_FmPcd->p_FmPcdPlcr = NULL; 782296177Sjhibbits } 783296177Sjhibbits 784296177Sjhibbits if(p_FmPcd->p_FmPcdPrs) 785296177Sjhibbits { 786296177Sjhibbits if(p_FmPcd->guestId == NCSW_MASTER_ID) 787296177Sjhibbits PrsFree(p_FmPcd); 788296177Sjhibbits XX_Free(p_FmPcd->p_FmPcdPrs); 789296177Sjhibbits p_FmPcd->p_FmPcdPrs = NULL; 790296177Sjhibbits } 791296177Sjhibbits 792296177Sjhibbits if (p_FmPcd->h_Hc) 793296177Sjhibbits { 794296177Sjhibbits FmHcFree(p_FmPcd->h_Hc); 795296177Sjhibbits p_FmPcd->h_Hc = NULL; 796296177Sjhibbits } 797296177Sjhibbits 798296177Sjhibbits XX_IpcUnregisterMsgHandler(p_FmPcd->fmPcdModuleName); 799296177Sjhibbits 800296177Sjhibbits FmUnregisterPcd(p_FmPcd->h_Fm); 801296177Sjhibbits 802296177Sjhibbits XX_Free(p_FmPcd); 803296177Sjhibbits return E_OK; 804296177Sjhibbits} 805296177Sjhibbits 806296177Sjhibbitst_Error FM_PCD_Enable(t_Handle h_FmPcd) 807296177Sjhibbits{ 808296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 809296177Sjhibbits t_Error err = E_OK; 810296177Sjhibbits 811296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 812296177Sjhibbits 813296177Sjhibbits if(p_FmPcd->guestId == NCSW_MASTER_ID) 814296177Sjhibbits { 815296177Sjhibbits if(p_FmPcd->p_FmPcdKg) 816296177Sjhibbits KgEnable(p_FmPcd); 817296177Sjhibbits 818296177Sjhibbits if(p_FmPcd->p_FmPcdPlcr) 819296177Sjhibbits PlcrEnable(p_FmPcd); 820296177Sjhibbits 821296177Sjhibbits if(p_FmPcd->p_FmPcdPrs) 822296177Sjhibbits PrsEnable(p_FmPcd); 823296177Sjhibbits 824296177Sjhibbits p_FmPcd->enabled = TRUE; 825296177Sjhibbits } 826296177Sjhibbits else 827296177Sjhibbits { 828296177Sjhibbits uint8_t enabled; 829296177Sjhibbits t_FmPcdIpcMsg msg; 830296177Sjhibbits t_FmPcdIpcReply reply; 831296177Sjhibbits uint32_t replyLength; 832296177Sjhibbits 833296177Sjhibbits memset(&msg, 0, sizeof(msg)); 834296177Sjhibbits memset(&reply, 0, sizeof(reply)); 835296177Sjhibbits msg.msgId = FM_PCD_MASTER_IS_ENABLED; 836296177Sjhibbits replyLength = sizeof(uint32_t) + sizeof(enabled); 837296177Sjhibbits if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession, 838296177Sjhibbits (uint8_t*)&msg, 839296177Sjhibbits sizeof(msg.msgId), 840296177Sjhibbits (uint8_t*)&reply, 841296177Sjhibbits &replyLength, 842296177Sjhibbits NULL, 843296177Sjhibbits NULL)) != E_OK) 844296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 845296177Sjhibbits if (replyLength != sizeof(uint32_t) + sizeof(enabled)) 846296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 847296177Sjhibbits p_FmPcd->enabled = (bool)!!(*(uint8_t*)(reply.replyBody)); 848296177Sjhibbits if (!p_FmPcd->enabled) 849296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("FM-PCD master should be enabled first!")); 850296177Sjhibbits } 851296177Sjhibbits 852296177Sjhibbits return E_OK; 853296177Sjhibbits} 854296177Sjhibbits 855296177Sjhibbitst_Error FM_PCD_Disable(t_Handle h_FmPcd) 856296177Sjhibbits{ 857296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 858296177Sjhibbits t_Error err = E_OK; 859296177Sjhibbits t_FmPcdIpcMsg msg; 860296177Sjhibbits t_FmPcdIpcReply reply; 861296177Sjhibbits uint32_t replyLength; 862296177Sjhibbits 863296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 864296177Sjhibbits 865296177Sjhibbits if(p_FmPcd->guestId == NCSW_MASTER_ID) 866296177Sjhibbits { 867296177Sjhibbits if(p_FmPcd->numOfEnabledGuestPartitionsPcds != 0) 868296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Trying to disable a master partition PCD while guest partitions are still enabled.")); 869296177Sjhibbits 870296177Sjhibbits if(p_FmPcd->p_FmPcdKg) 871296177Sjhibbits KgDisable(p_FmPcd); 872296177Sjhibbits 873296177Sjhibbits if(p_FmPcd->p_FmPcdPlcr) 874296177Sjhibbits PlcrDisable(p_FmPcd); 875296177Sjhibbits 876296177Sjhibbits if(p_FmPcd->p_FmPcdPrs) 877296177Sjhibbits PrsDisable(p_FmPcd); 878296177Sjhibbits 879296177Sjhibbits p_FmPcd->enabled = FALSE; 880296177Sjhibbits 881296177Sjhibbits return E_OK; 882296177Sjhibbits } 883296177Sjhibbits 884296177Sjhibbits memset(&msg, 0, sizeof(msg)); 885296177Sjhibbits msg.msgId = FM_PCD_GUEST_DISABLE; 886296177Sjhibbits memset(&reply, 0, sizeof(reply)); 887296177Sjhibbits replyLength = sizeof(uint32_t); 888296177Sjhibbits if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession, 889296177Sjhibbits (uint8_t*)&msg, 890296177Sjhibbits sizeof(msg.msgId), 891296177Sjhibbits (uint8_t*)&reply, 892296177Sjhibbits &replyLength, 893296177Sjhibbits NULL, 894296177Sjhibbits NULL)) != E_OK) 895296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 896296177Sjhibbits if (replyLength != sizeof(uint32_t)) 897296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 898296177Sjhibbits 899296177Sjhibbits return (t_Error)(reply.error); 900296177Sjhibbits} 901296177Sjhibbits 902296177Sjhibbitst_Handle FM_PCD_SetNetEnvCharacteristics(t_Handle h_FmPcd, t_FmPcdNetEnvParams *p_NetEnvParams) 903296177Sjhibbits{ 904296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 905296177Sjhibbits uint32_t intFlags, specialUnits = 0; 906296177Sjhibbits uint8_t bitId = 0; 907296177Sjhibbits uint8_t i, j, k; 908296177Sjhibbits uint8_t netEnvCurrId; 909296177Sjhibbits uint8_t ipsecAhUnit = 0,ipsecEspUnit = 0; 910296177Sjhibbits bool ipsecAhExists = FALSE, ipsecEspExists = FALSE, shim1Selected = FALSE; 911296177Sjhibbits uint8_t hdrNum; 912296177Sjhibbits 913296177Sjhibbits SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_STATE, NULL); 914296177Sjhibbits SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, NULL); 915296177Sjhibbits 916296177Sjhibbits intFlags = FmPcdLock(p_FmPcd); 917296177Sjhibbits 918296177Sjhibbits /* find a new netEnv */ 919296177Sjhibbits for(i = 0;i<FM_MAX_NUM_OF_PORTS;i++) 920296177Sjhibbits if(!p_FmPcd->netEnvs[i].used) 921296177Sjhibbits break; 922296177Sjhibbits 923296177Sjhibbits if(i== FM_MAX_NUM_OF_PORTS) 924296177Sjhibbits { 925296177Sjhibbits REPORT_ERROR(MAJOR, E_FULL,("No more than %d netEnv's allowed.", FM_MAX_NUM_OF_PORTS)); 926296177Sjhibbits FmPcdUnlock(p_FmPcd, intFlags); 927296177Sjhibbits return NULL; 928296177Sjhibbits } 929296177Sjhibbits 930296177Sjhibbits p_FmPcd->netEnvs[i].used = TRUE; 931296177Sjhibbits 932296177Sjhibbits if (!TRY_LOCK(NULL, &p_FmPcd->netEnvs[i].lock)) 933296177Sjhibbits { 934296177Sjhibbits FmPcdUnlock(p_FmPcd, intFlags); 935296177Sjhibbits return NULL; 936296177Sjhibbits } 937296177Sjhibbits FmPcdUnlock(p_FmPcd, intFlags); 938296177Sjhibbits 939296177Sjhibbits netEnvCurrId = (uint8_t)i; 940296177Sjhibbits 941296177Sjhibbits /* clear from previous use */ 942296177Sjhibbits memset(&p_FmPcd->netEnvs[netEnvCurrId].units, 0, FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS * sizeof(t_FmPcdIntDistinctionUnit)); 943296177Sjhibbits memset(&p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs, 0, FM_PCD_MAX_NUM_OF_PRIVATE_HDRS * sizeof(t_FmPcdNetEnvAliases)); 944296177Sjhibbits memcpy(&p_FmPcd->netEnvs[netEnvCurrId].units, p_NetEnvParams->units, p_NetEnvParams->numOfDistinctionUnits*sizeof(t_FmPcdIntDistinctionUnit)); 945296177Sjhibbits p_FmPcd->netEnvs[netEnvCurrId].clsPlanGrpId = ILLEGAL_CLS_PLAN; 946296177Sjhibbits 947296177Sjhibbits /* check that header with opt is not interchanged with the same header */ 948296177Sjhibbits for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) 949296177Sjhibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++) 950296177Sjhibbits { 951296177Sjhibbits for (k=0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) 952296177Sjhibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++) 953296177Sjhibbits { 954296177Sjhibbits /* if an option exists, check that other headers are not the same header 955296177Sjhibbits without option */ 956296177Sjhibbits if(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt) 957296177Sjhibbits { 958296177Sjhibbits for (j=0; (j < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) 959296177Sjhibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].hdr != HEADER_TYPE_NONE); j++) 960296177Sjhibbits if((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].hdr == p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr) && 961296177Sjhibbits !p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].opt) 962296177Sjhibbits { 963296177Sjhibbits REPORT_ERROR(MINOR, E_FULL, ("Illegal unit - header with opt may not be interchangeable with the same header without opt")); 964296177Sjhibbits RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock); 965296177Sjhibbits return NULL; 966296177Sjhibbits } 967296177Sjhibbits } 968296177Sjhibbits } 969296177Sjhibbits } 970296177Sjhibbits 971296177Sjhibbits /* IPSEC_AH and IPSEC_SPI can't be 2 units, */ 972296177Sjhibbits /* check that header with opt is not interchanged with the same header */ 973296177Sjhibbits for(i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) 974296177Sjhibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++) 975296177Sjhibbits { 976296177Sjhibbits for(k=0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) 977296177Sjhibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++) 978296177Sjhibbits { 979296177Sjhibbits /* Some headers pairs may not be defined on different units as the parser 980296177Sjhibbits doesn't distinguish */ 981296177Sjhibbits if(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPSEC_AH) 982296177Sjhibbits { 983296177Sjhibbits if (ipsecEspExists && (ipsecEspUnit != i)) 984296177Sjhibbits { 985296177Sjhibbits REPORT_ERROR(MINOR, E_INVALID_STATE, ("HEADER_TYPE_IPSEC_AH and HEADER_TYPE_IPSEC_ESP may not be defined in separate units")); 986296177Sjhibbits RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock); 987296177Sjhibbits return NULL; 988296177Sjhibbits } 989296177Sjhibbits else 990296177Sjhibbits { 991296177Sjhibbits ipsecAhUnit = i; 992296177Sjhibbits ipsecAhExists = TRUE; 993296177Sjhibbits } 994296177Sjhibbits } 995296177Sjhibbits if(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPSEC_ESP) 996296177Sjhibbits { 997296177Sjhibbits if (ipsecAhExists && (ipsecAhUnit != i)) 998296177Sjhibbits { 999296177Sjhibbits REPORT_ERROR(MINOR, E_INVALID_STATE, ("HEADER_TYPE_IPSEC_AH and HEADER_TYPE_IPSEC_ESP may not be defined in separate units")); 1000296177Sjhibbits RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock); 1001296177Sjhibbits return NULL; 1002296177Sjhibbits } 1003296177Sjhibbits else 1004296177Sjhibbits { 1005296177Sjhibbits ipsecEspUnit = i; 1006296177Sjhibbits ipsecEspExists = TRUE; 1007296177Sjhibbits } 1008296177Sjhibbits } 1009296177Sjhibbits if(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_UDP_ENCAP_ESP) 1010296177Sjhibbits { 1011296177Sjhibbits /* TODO - general coding. choose the free shim header */ 1012296177Sjhibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_UDP_ENCAP_ESP; 1013296177Sjhibbits p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM1; 1014296177Sjhibbits p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM1; 1015296177Sjhibbits p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0; 1016296177Sjhibbits } 1017296177Sjhibbits } 1018296177Sjhibbits } 1019296177Sjhibbits 1020296177Sjhibbits /* if private header (shim), check that no other headers specified */ 1021296177Sjhibbits for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) 1022296177Sjhibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++) 1023296177Sjhibbits { 1024296177Sjhibbits if(IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr)) 1025296177Sjhibbits if(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[1].hdr != HEADER_TYPE_NONE) 1026296177Sjhibbits { 1027296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("SHIM header may not be interchanged with other headers")); 1028296177Sjhibbits RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock); 1029296177Sjhibbits return NULL; 1030296177Sjhibbits } 1031296177Sjhibbits } 1032296177Sjhibbits 1033296177Sjhibbits for(i=0; i<p_NetEnvParams->numOfDistinctionUnits;i++) 1034296177Sjhibbits { 1035296177Sjhibbits if (IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr)) 1036296177Sjhibbits switch(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr) 1037296177Sjhibbits { 1038296177Sjhibbits case(HEADER_TYPE_USER_DEFINED_SHIM1): 1039296177Sjhibbits if (shim1Selected) 1040296177Sjhibbits { 1041296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("SHIM header cannot be selected with UDP_IPSEC_ESP")); 1042296177Sjhibbits RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock); 1043296177Sjhibbits return NULL; 1044296177Sjhibbits } 1045296177Sjhibbits shim1Selected = TRUE; 1046296177Sjhibbits p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = 0x00000001; 1047296177Sjhibbits break; 1048296177Sjhibbits case(HEADER_TYPE_USER_DEFINED_SHIM2): 1049296177Sjhibbits p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = 0x00000002; 1050296177Sjhibbits break; 1051296177Sjhibbits default: 1052296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Requested SHIM not supported")); 1053296177Sjhibbits } 1054296177Sjhibbits else 1055296177Sjhibbits { 1056296177Sjhibbits p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = (uint32_t)(0x80000000 >> bitId++); 1057296177Sjhibbits 1058296177Sjhibbits if(IS_SPECIAL_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr)) 1059296177Sjhibbits p_FmPcd->netEnvs[netEnvCurrId].macsecVector = p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i]; 1060296177Sjhibbits } 1061296177Sjhibbits } 1062296177Sjhibbits 1063296177Sjhibbits /* define a set of hardware parser LCV's according to the defined netenv */ 1064296177Sjhibbits 1065296177Sjhibbits /* set an array of LCV's for each header in the netEnv */ 1066296177Sjhibbits for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) 1067296177Sjhibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++) 1068296177Sjhibbits { 1069296177Sjhibbits /* private headers have no LCV in the hard parser */ 1070296177Sjhibbits if (!IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr)) 1071296177Sjhibbits { 1072296177Sjhibbits for (k=0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) 1073296177Sjhibbits && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++) 1074296177Sjhibbits { 1075296177Sjhibbits GET_PRS_HDR_NUM(hdrNum, p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr); 1076296177Sjhibbits if ((hdrNum == ILLEGAL_HDR_NUM) || (hdrNum == NO_HDR_NUM)) 1077296177Sjhibbits { 1078296177Sjhibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, NO_MSG); 1079296177Sjhibbits RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock); 1080296177Sjhibbits return NULL; 1081296177Sjhibbits } 1082296177Sjhibbits p_FmPcd->netEnvs[netEnvCurrId].lcvs[hdrNum] |= p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i]; 1083296177Sjhibbits } 1084296177Sjhibbits } 1085296177Sjhibbits } 1086296177Sjhibbits 1087296177Sjhibbits RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock); 1088296177Sjhibbits 1089296177Sjhibbits return UINT_TO_PTR((uint64_t)netEnvCurrId+1); 1090296177Sjhibbits} 1091296177Sjhibbits 1092296177Sjhibbitst_Error FM_PCD_DeleteNetEnvCharacteristics(t_Handle h_FmPcd, t_Handle h_NetEnv) 1093296177Sjhibbits{ 1094296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 1095296177Sjhibbits uint8_t netEnvId = (uint8_t)(PTR_TO_UINT(h_NetEnv)-1); 1096296177Sjhibbits 1097296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_STATE); 1098296177Sjhibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE); 1099296177Sjhibbits 1100296177Sjhibbits if (!TRY_LOCK(p_FmPcd->h_Spinlock, &p_FmPcd->netEnvs[netEnvId].lock)) 1101296177Sjhibbits return ERROR_CODE(E_BUSY); 1102296177Sjhibbits /* check that no port is bound to this netEnv */ 1103296177Sjhibbits if(p_FmPcd->netEnvs[netEnvId].owners) 1104296177Sjhibbits { 1105296177Sjhibbits RELEASE_LOCK(p_FmPcd->netEnvs[netEnvId].lock); 1106296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Trying to delete a netEnv that has ports/schemes/trees/clsPlanGrps bound to")); 1107296177Sjhibbits } 1108296177Sjhibbits p_FmPcd->netEnvs[netEnvId].used= FALSE; 1109296177Sjhibbits p_FmPcd->netEnvs[netEnvId].clsPlanGrpId = ILLEGAL_CLS_PLAN; 1110296177Sjhibbits 1111296177Sjhibbits memset(p_FmPcd->netEnvs[netEnvId].units, 0, sizeof(t_FmPcdIntDistinctionUnit)*FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS); 1112296177Sjhibbits memset(p_FmPcd->netEnvs[netEnvId].unitsVectors, 0, sizeof(uint32_t)*FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS); 1113296177Sjhibbits memset(p_FmPcd->netEnvs[netEnvId].lcvs, 0, sizeof(uint32_t)*FM_PCD_PRS_NUM_OF_HDRS); 1114296177Sjhibbits 1115296177Sjhibbits RELEASE_LOCK(p_FmPcd->netEnvs[netEnvId].lock); 1116296177Sjhibbits 1117296177Sjhibbits return E_OK; 1118296177Sjhibbits} 1119296177Sjhibbits 1120296177Sjhibbitsvoid FM_PCD_HcTxConf(t_Handle h_FmPcd, t_DpaaFD *p_Fd) 1121296177Sjhibbits{ 1122296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 1123296177Sjhibbits 1124296177Sjhibbits SANITY_CHECK_RETURN(h_FmPcd, E_INVALID_STATE); 1125296177Sjhibbits 1126296177Sjhibbits FmHcTxConf(p_FmPcd->h_Hc, p_Fd); 1127296177Sjhibbits} 1128296177Sjhibbits 1129296177Sjhibbitsuint32_t FM_PCD_GetCounter(t_Handle h_FmPcd, e_FmPcdCounters counter) 1130296177Sjhibbits{ 1131296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 1132296177Sjhibbits uint32_t replyLength, outCounter = 0; 1133296177Sjhibbits t_FmPcdIpcMsg msg; 1134296177Sjhibbits t_Error err; 1135296177Sjhibbits t_FmPcdIpcReply reply; 1136296177Sjhibbits 1137296177Sjhibbits SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, 0); 1138296177Sjhibbits SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, 0); 1139296177Sjhibbits 1140296177Sjhibbits if(p_FmPcd->guestId != NCSW_MASTER_ID) 1141296177Sjhibbits { 1142296177Sjhibbits memset(&msg, 0, sizeof(msg)); 1143296177Sjhibbits memset(&reply, 0, sizeof(reply)); 1144296177Sjhibbits msg.msgId = FM_PCD_GET_COUNTER; 1145296177Sjhibbits memcpy(msg.msgBody, (uint8_t *)&counter, sizeof(uint32_t)); 1146296177Sjhibbits replyLength = sizeof(uint32_t) + sizeof(uint32_t); 1147296177Sjhibbits if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession, 1148296177Sjhibbits (uint8_t*)&msg, 1149296177Sjhibbits sizeof(msg.msgId) +sizeof(uint32_t), 1150296177Sjhibbits (uint8_t*)&reply, 1151296177Sjhibbits &replyLength, 1152296177Sjhibbits NULL, 1153296177Sjhibbits NULL)) != E_OK) 1154296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 1155296177Sjhibbits if (replyLength != sizeof(uint32_t) + sizeof(uint32_t)) 1156296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 1157296177Sjhibbits 1158296177Sjhibbits memcpy((uint8_t*)&outCounter, reply.replyBody, sizeof(uint32_t)); 1159296177Sjhibbits return outCounter; 1160296177Sjhibbits } 1161296177Sjhibbits 1162296177Sjhibbits switch(counter) 1163296177Sjhibbits { 1164296177Sjhibbits case(e_FM_PCD_KG_COUNTERS_TOTAL): 1165296177Sjhibbits if(!p_FmPcd->p_FmPcdKg) 1166296177Sjhibbits { 1167296177Sjhibbits REPORT_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this counters")); 1168296177Sjhibbits return 0; 1169296177Sjhibbits } 1170296177Sjhibbits break; 1171296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_YELLOW): 1172296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_RED): 1173296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED): 1174296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW): 1175296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_TOTAL): 1176296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH): 1177296177Sjhibbits if(!p_FmPcd->p_FmPcdPlcr) 1178296177Sjhibbits { 1179296177Sjhibbits REPORT_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this counters")); 1180296177Sjhibbits return 0; 1181296177Sjhibbits } 1182296177Sjhibbits /* check that counters are enabled */ 1183296177Sjhibbits if(!(GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr) & FM_PCD_PLCR_GCR_STEN)) 1184296177Sjhibbits { 1185296177Sjhibbits REPORT_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled")); 1186296177Sjhibbits return 0; 1187296177Sjhibbits } 1188296177Sjhibbits break; 1189296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH): 1190296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED): 1191296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED): 1192296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED): 1193296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED): 1194296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR): 1195296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR): 1196296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR): 1197296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR): 1198296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES): 1199296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES): 1200296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES): 1201296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES): 1202296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES): 1203296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES): 1204296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES): 1205296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES): 1206296177Sjhibbits if(!p_FmPcd->p_FmPcdPrs) 1207296177Sjhibbits { 1208296177Sjhibbits REPORT_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this counters")); 1209296177Sjhibbits return 0; 1210296177Sjhibbits } 1211296177Sjhibbits break; 1212296177Sjhibbits default: 1213296177Sjhibbits REPORT_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter")); 1214296177Sjhibbits return 0; 1215296177Sjhibbits } 1216296177Sjhibbits switch(counter) 1217296177Sjhibbits { 1218296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH): 1219296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->pds); 1220296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED): 1221296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l2rrs); 1222296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED): 1223296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l3rrs); 1224296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED): 1225296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l4rrs); 1226296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED): 1227296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->srrs); 1228296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR): 1229296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l2rres); 1230296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR): 1231296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l3rres); 1232296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR): 1233296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l4rres); 1234296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR): 1235296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->srres); 1236296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES): 1237296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->spcs); 1238296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES): 1239296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->spscs); 1240296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES): 1241296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->hxscs); 1242296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES): 1243296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mrcs); 1244296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES): 1245296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mrscs); 1246296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES): 1247296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mwcs); 1248296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES): 1249296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mwscs); 1250296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES): 1251296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fcscs); 1252296177Sjhibbits case(e_FM_PCD_KG_COUNTERS_TOTAL): 1253296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgtpc); 1254296177Sjhibbits 1255296177Sjhibbits /*Policer statictics*/ 1256296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_YELLOW): 1257296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ypcnt); 1258296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_RED): 1259296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rpcnt); 1260296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED): 1261296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rrpcnt); 1262296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW): 1263296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rypcnt); 1264296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_TOTAL): 1265296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_tpcnt); 1266296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH): 1267296177Sjhibbits return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_flmcnt); 1268296177Sjhibbits 1269296177Sjhibbits default: 1270296177Sjhibbits REPORT_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter")); 1271296177Sjhibbits return 0; 1272296177Sjhibbits } 1273296177Sjhibbits} 1274296177Sjhibbits 1275296177Sjhibbits#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)) 1276296177Sjhibbitst_Error FM_PCD_DumpRegs(t_Handle h_FmPcd) 1277296177Sjhibbits{ 1278296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 1279296177Sjhibbits t_FmPcdIpcMsg msg; 1280296177Sjhibbits 1281296177Sjhibbits DECLARE_DUMP; 1282296177Sjhibbits 1283296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 1284296177Sjhibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE); 1285296177Sjhibbits 1286296177Sjhibbits if(p_FmPcd->guestId != NCSW_MASTER_ID) 1287296177Sjhibbits { 1288296177Sjhibbits memset(&msg, 0, sizeof(msg)); 1289296177Sjhibbits msg.msgId = FM_PCD_DUMP_REGS; 1290296177Sjhibbits return XX_IpcSendMessage(p_FmPcd->h_IpcSession, 1291296177Sjhibbits (uint8_t*)&msg, 1292296177Sjhibbits sizeof(msg.msgId), 1293296177Sjhibbits NULL, 1294296177Sjhibbits NULL, 1295296177Sjhibbits NULL, 1296296177Sjhibbits NULL); 1297296177Sjhibbits } 1298296177Sjhibbits if (p_FmPcd->p_FmPcdKg) 1299296177Sjhibbits return FM_PCD_KgDumpRegs(h_FmPcd); 1300296177Sjhibbits if (p_FmPcd->p_FmPcdPlcr) 1301296177Sjhibbits return FM_PCD_PlcrDumpRegs(h_FmPcd); 1302296177Sjhibbits if (p_FmPcd->p_FmPcdPrs) 1303296177Sjhibbits return FM_PCD_PrsDumpRegs(h_FmPcd); 1304296177Sjhibbits return E_OK; 1305296177Sjhibbits} 1306296177Sjhibbits 1307296177Sjhibbitst_Error FM_PCD_HcDumpRegs(t_Handle h_FmPcd) 1308296177Sjhibbits{ 1309296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 1310296177Sjhibbits 1311296177Sjhibbits DECLARE_DUMP; 1312296177Sjhibbits 1313296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 1314296177Sjhibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE); 1315296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_STATE); 1316296177Sjhibbits 1317296177Sjhibbits return FmHcDumpRegs(p_FmPcd->h_Hc); 1318296177Sjhibbits} 1319296177Sjhibbits 1320296177Sjhibbits#endif /* (defined(DEBUG_ERRORS) && ... */ 1321296177Sjhibbits 1322296177Sjhibbitst_Error FM_PCD_ConfigException(t_Handle h_FmPcd, e_FmPcdExceptions exception, bool enable) 1323296177Sjhibbits{ 1324296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 1325296177Sjhibbits uint32_t bitMask = 0; 1326296177Sjhibbits 1327296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE); 1328296177Sjhibbits 1329296177Sjhibbits if(p_FmPcd->guestId != NCSW_MASTER_ID) 1330296177Sjhibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ConfigException - guest mode!")); 1331296177Sjhibbits 1332296177Sjhibbits GET_FM_PCD_EXCEPTION_FLAG(bitMask, exception); 1333296177Sjhibbits if(bitMask) 1334296177Sjhibbits { 1335296177Sjhibbits if (enable) 1336296177Sjhibbits p_FmPcd->exceptions |= bitMask; 1337296177Sjhibbits else 1338296177Sjhibbits p_FmPcd->exceptions &= ~bitMask; 1339296177Sjhibbits } 1340296177Sjhibbits else 1341296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception")); 1342296177Sjhibbits 1343296177Sjhibbits return E_OK; 1344296177Sjhibbits} 1345296177Sjhibbits 1346296177Sjhibbitst_Error FM_PCD_SetException(t_Handle h_FmPcd, e_FmPcdExceptions exception, bool enable) 1347296177Sjhibbits{ 1348296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 1349296177Sjhibbits uint32_t bitMask = 0, tmpReg; 1350296177Sjhibbits 1351296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE); 1352296177Sjhibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE); 1353296177Sjhibbits 1354296177Sjhibbits if(p_FmPcd->guestId != NCSW_MASTER_ID) 1355296177Sjhibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_SetException - guest mode!")); 1356296177Sjhibbits 1357296177Sjhibbits GET_FM_PCD_EXCEPTION_FLAG(bitMask, exception); 1358296177Sjhibbits 1359296177Sjhibbits if(bitMask) 1360296177Sjhibbits { 1361296177Sjhibbits if (enable) 1362296177Sjhibbits p_FmPcd->exceptions |= bitMask; 1363296177Sjhibbits else 1364296177Sjhibbits p_FmPcd->exceptions &= ~bitMask; 1365296177Sjhibbits 1366296177Sjhibbits switch(exception) 1367296177Sjhibbits { 1368296177Sjhibbits case(e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC): 1369296177Sjhibbits case(e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW): 1370296177Sjhibbits if(!p_FmPcd->p_FmPcdKg) 1371296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - keygen is not working")); 1372296177Sjhibbits break; 1373296177Sjhibbits case(e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC): 1374296177Sjhibbits case(e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR): 1375296177Sjhibbits case(e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE): 1376296177Sjhibbits case(e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE): 1377296177Sjhibbits if(!p_FmPcd->p_FmPcdPlcr) 1378296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - policer is not working")); 1379296177Sjhibbits break; 1380296177Sjhibbits case(e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC): 1381296177Sjhibbits case(e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC): 1382296177Sjhibbits if(!p_FmPcd->p_FmPcdPrs) 1383296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - parser is not working")); 1384296177Sjhibbits break; 1385296177Sjhibbits default: 1386296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported exception")); 1387296177Sjhibbits 1388296177Sjhibbits } 1389296177Sjhibbits 1390296177Sjhibbits switch(exception) 1391296177Sjhibbits { 1392296177Sjhibbits case(e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC): 1393296177Sjhibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgeeer); 1394296177Sjhibbits if(enable) 1395296177Sjhibbits tmpReg |= FM_PCD_KG_DOUBLE_ECC; 1396296177Sjhibbits else 1397296177Sjhibbits tmpReg &= ~FM_PCD_KG_DOUBLE_ECC; 1398296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgeeer, tmpReg); 1399296177Sjhibbits break; 1400296177Sjhibbits case(e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW): 1401296177Sjhibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgeeer); 1402296177Sjhibbits if(enable) 1403296177Sjhibbits tmpReg |= FM_PCD_KG_KEYSIZE_OVERFLOW; 1404296177Sjhibbits else 1405296177Sjhibbits tmpReg &= ~FM_PCD_KG_KEYSIZE_OVERFLOW; 1406296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgeeer, tmpReg); 1407296177Sjhibbits break; 1408296177Sjhibbits case(e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC): 1409296177Sjhibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->perer); 1410296177Sjhibbits if(enable) 1411296177Sjhibbits tmpReg |= FM_PCD_PRS_DOUBLE_ECC; 1412296177Sjhibbits else 1413296177Sjhibbits tmpReg &= ~FM_PCD_PRS_DOUBLE_ECC; 1414296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->perer, tmpReg); 1415296177Sjhibbits break; 1416296177Sjhibbits case(e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC): 1417296177Sjhibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->pever); 1418296177Sjhibbits if(enable) 1419296177Sjhibbits tmpReg |= FM_PCD_PRS_SINGLE_ECC; 1420296177Sjhibbits else 1421296177Sjhibbits tmpReg &= ~FM_PCD_PRS_SINGLE_ECC; 1422296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->pever, tmpReg); 1423296177Sjhibbits break; 1424296177Sjhibbits case(e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC): 1425296177Sjhibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier); 1426296177Sjhibbits if(enable) 1427296177Sjhibbits tmpReg |= FM_PCD_PLCR_DOUBLE_ECC; 1428296177Sjhibbits else 1429296177Sjhibbits tmpReg &= ~FM_PCD_PLCR_DOUBLE_ECC; 1430296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier, tmpReg); 1431296177Sjhibbits break; 1432296177Sjhibbits case(e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR): 1433296177Sjhibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier); 1434296177Sjhibbits if(enable) 1435296177Sjhibbits tmpReg |= FM_PCD_PLCR_INIT_ENTRY_ERROR; 1436296177Sjhibbits else 1437296177Sjhibbits tmpReg &= ~FM_PCD_PLCR_INIT_ENTRY_ERROR; 1438296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier, tmpReg); 1439296177Sjhibbits break; 1440296177Sjhibbits case(e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE): 1441296177Sjhibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier); 1442296177Sjhibbits if(enable) 1443296177Sjhibbits tmpReg |= FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE; 1444296177Sjhibbits else 1445296177Sjhibbits tmpReg &= ~FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE; 1446296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier, tmpReg); 1447296177Sjhibbits break; 1448296177Sjhibbits case(e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE): 1449296177Sjhibbits tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier); 1450296177Sjhibbits if(enable) 1451296177Sjhibbits tmpReg |= FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE; 1452296177Sjhibbits else 1453296177Sjhibbits tmpReg &= ~FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE; 1454296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier, tmpReg); 1455296177Sjhibbits break; 1456296177Sjhibbits default: 1457296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported exception")); 1458296177Sjhibbits } 1459296177Sjhibbits /* for ECC exceptions driver automatically enables ECC mechanism, if disabled. 1460296177Sjhibbits Driver may disable them automatically, depending on driver's status */ 1461296177Sjhibbits if(enable && ( (exception == e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC) | 1462296177Sjhibbits (exception == e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC) | 1463296177Sjhibbits (exception == e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC) | 1464296177Sjhibbits (exception == e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC))) 1465296177Sjhibbits FmEnableRamsEcc(p_FmPcd->h_Fm); 1466296177Sjhibbits if(!enable && ( (exception == e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC) | 1467296177Sjhibbits (exception == e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC) | 1468296177Sjhibbits (exception == e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC) | 1469296177Sjhibbits (exception == e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC))) 1470296177Sjhibbits FmDisableRamsEcc(p_FmPcd->h_Fm); 1471296177Sjhibbits } 1472296177Sjhibbits else 1473296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception")); 1474296177Sjhibbits 1475296177Sjhibbits return E_OK; 1476296177Sjhibbits} 1477296177Sjhibbits 1478296177Sjhibbitst_Error FM_PCD_ForceIntr (t_Handle h_FmPcd, e_FmPcdExceptions exception) 1479296177Sjhibbits{ 1480296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 1481296177Sjhibbits 1482296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 1483296177Sjhibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE); 1484296177Sjhibbits 1485296177Sjhibbits if(p_FmPcd->guestId != NCSW_MASTER_ID) 1486296177Sjhibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ForceIntr - guest mode!")); 1487296177Sjhibbits 1488296177Sjhibbits switch(exception) 1489296177Sjhibbits { 1490296177Sjhibbits case(e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC): 1491296177Sjhibbits case(e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW): 1492296177Sjhibbits if(!p_FmPcd->p_FmPcdKg) 1493296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - keygen is not working")); 1494296177Sjhibbits break; 1495296177Sjhibbits case(e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC): 1496296177Sjhibbits case(e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR): 1497296177Sjhibbits case(e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE): 1498296177Sjhibbits case(e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE): 1499296177Sjhibbits if(!p_FmPcd->p_FmPcdPlcr) 1500296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - policer is not working")); 1501296177Sjhibbits break; 1502296177Sjhibbits case(e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC): 1503296177Sjhibbits case(e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC): 1504296177Sjhibbits if(!p_FmPcd->p_FmPcdPrs) 1505296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt -parsrer is not working")); 1506296177Sjhibbits break; 1507296177Sjhibbits default: 1508296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Invalid interrupt requested")); 1509296177Sjhibbits 1510296177Sjhibbits } 1511296177Sjhibbits switch(exception) 1512296177Sjhibbits { 1513296177Sjhibbits case e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC: 1514296177Sjhibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_PRS_DOUBLE_ECC)) 1515296177Sjhibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 1516296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->perfr, FM_PCD_PRS_DOUBLE_ECC); 1517296177Sjhibbits break; 1518296177Sjhibbits case e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC: 1519296177Sjhibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_PRS_SINGLE_ECC)) 1520296177Sjhibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 1521296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->pevfr, FM_PCD_PRS_SINGLE_ECC); 1522296177Sjhibbits break; 1523296177Sjhibbits case e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC: 1524296177Sjhibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_KG_DOUBLE_ECC)) 1525296177Sjhibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 1526296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgfeer, FM_PCD_KG_DOUBLE_ECC); 1527296177Sjhibbits break; 1528296177Sjhibbits case e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW: 1529296177Sjhibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_KG_KEYSIZE_OVERFLOW)) 1530296177Sjhibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 1531296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgfeer, FM_PCD_KG_KEYSIZE_OVERFLOW); 1532296177Sjhibbits break; 1533296177Sjhibbits case e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC: 1534296177Sjhibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_DOUBLE_ECC)) 1535296177Sjhibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 1536296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr, FM_PCD_PLCR_DOUBLE_ECC); 1537296177Sjhibbits break; 1538296177Sjhibbits case e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR: 1539296177Sjhibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_INIT_ENTRY_ERROR)) 1540296177Sjhibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 1541296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr, FM_PCD_PLCR_INIT_ENTRY_ERROR); 1542296177Sjhibbits break; 1543296177Sjhibbits case e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE: 1544296177Sjhibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_PRAM_SELF_INIT_COMPLETE)) 1545296177Sjhibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 1546296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr, FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE); 1547296177Sjhibbits break; 1548296177Sjhibbits case e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE: 1549296177Sjhibbits if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_ATOMIC_ACTION_COMPLETE)) 1550296177Sjhibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 1551296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr, FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE); 1552296177Sjhibbits break; 1553296177Sjhibbits default: 1554296177Sjhibbits RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception may not be forced")); 1555296177Sjhibbits } 1556296177Sjhibbits 1557296177Sjhibbits return E_OK; 1558296177Sjhibbits} 1559296177Sjhibbits 1560296177Sjhibbits 1561296177Sjhibbitst_Error FM_PCD_ModifyCounter(t_Handle h_FmPcd, e_FmPcdCounters counter, uint32_t value) 1562296177Sjhibbits{ 1563296177Sjhibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd; 1564296177Sjhibbits 1565296177Sjhibbits SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE); 1566296177Sjhibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE); 1567296177Sjhibbits 1568296177Sjhibbits if(p_FmPcd->guestId != NCSW_MASTER_ID) 1569296177Sjhibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ModifyCounter - guest mode!")); 1570296177Sjhibbits 1571296177Sjhibbits switch(counter) 1572296177Sjhibbits { 1573296177Sjhibbits case(e_FM_PCD_KG_COUNTERS_TOTAL): 1574296177Sjhibbits if(!p_FmPcd->p_FmPcdKg) 1575296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this counters - keygen is not working")); 1576296177Sjhibbits break; 1577296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_YELLOW): 1578296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_RED): 1579296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED): 1580296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW): 1581296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_TOTAL): 1582296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH): 1583296177Sjhibbits if(!p_FmPcd->p_FmPcdPlcr) 1584296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this counters - Policer is not working")); 1585296177Sjhibbits if(!(GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr) & FM_PCD_PLCR_GCR_STEN)) 1586296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled")); 1587296177Sjhibbits break; 1588296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH): 1589296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED): 1590296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED): 1591296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED): 1592296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED): 1593296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR): 1594296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR): 1595296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR): 1596296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR): 1597296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES): 1598296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES): 1599296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES): 1600296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES): 1601296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES): 1602296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES): 1603296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES): 1604296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES): 1605296177Sjhibbits if(!p_FmPcd->p_FmPcdPrs) 1606296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter")); 1607296177Sjhibbits break; 1608296177Sjhibbits default: 1609296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter")); 1610296177Sjhibbits } 1611296177Sjhibbits switch(counter) 1612296177Sjhibbits { 1613296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH): 1614296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->pds, value); 1615296177Sjhibbits break; 1616296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED): 1617296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l2rrs, value); 1618296177Sjhibbits break; 1619296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED): 1620296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l3rrs, value); 1621296177Sjhibbits break; 1622296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED): 1623296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l4rrs, value); 1624296177Sjhibbits break; 1625296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED): 1626296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->srrs, value); 1627296177Sjhibbits break; 1628296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR): 1629296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l2rres, value); 1630296177Sjhibbits break; 1631296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR): 1632296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l3rres, value); 1633296177Sjhibbits break; 1634296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR): 1635296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l4rres, value); 1636296177Sjhibbits break; 1637296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR): 1638296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->srres, value); 1639296177Sjhibbits break; 1640296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES): 1641296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->spcs, value); 1642296177Sjhibbits break; 1643296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES): 1644296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->spscs, value); 1645296177Sjhibbits break; 1646296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES): 1647296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->hxscs, value); 1648296177Sjhibbits break; 1649296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES): 1650296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mrcs, value); 1651296177Sjhibbits break; 1652296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES): 1653296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mrscs, value); 1654296177Sjhibbits break; 1655296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES): 1656296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mwcs, value); 1657296177Sjhibbits break; 1658296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES): 1659296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mwscs, value); 1660296177Sjhibbits break; 1661296177Sjhibbits case(e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES): 1662296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fcscs, value); 1663296177Sjhibbits break; 1664296177Sjhibbits case(e_FM_PCD_KG_COUNTERS_TOTAL): 1665296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgtpc,value); 1666296177Sjhibbits break; 1667296177Sjhibbits 1668296177Sjhibbits /*Policer counters*/ 1669296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_YELLOW): 1670296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ypcnt, value); 1671296177Sjhibbits break; 1672296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_RED): 1673296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rpcnt, value); 1674296177Sjhibbits break; 1675296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED): 1676296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rrpcnt, value); 1677296177Sjhibbits break; 1678296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW): 1679296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rypcnt, value); 1680296177Sjhibbits break; 1681296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_TOTAL): 1682296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_tpcnt, value); 1683296177Sjhibbits break; 1684296177Sjhibbits case(e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH): 1685296177Sjhibbits WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_flmcnt, value); 1686296177Sjhibbits break; 1687296177Sjhibbits default: 1688296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported type of counter")); 1689296177Sjhibbits } 1690296177Sjhibbits 1691296177Sjhibbitsreturn E_OK; 1692296177Sjhibbits} 1693296177Sjhibbits 1694