Path: blob/main/sys/contrib/ncsw/Peripherals/FM/HC/hc.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#include "std_ext.h"34#include "error_ext.h"35#include "sprint_ext.h"36#include "string_ext.h"3738#include "fm_common.h"39#include "fm_hc.h"404142/**************************************************************************//**43@Description defaults44*//***************************************************************************/45#define DEFAULT_dataMemId 04647#define HC_HCOR_OPCODE_PLCR_PRFL 0x048#define HC_HCOR_OPCODE_KG_SCM 0x149#define HC_HCOR_OPCODE_SYNC 0x250#define HC_HCOR_OPCODE_CC 0x351#define HC_HCOR_OPCODE_CC_AGE_MASK 0x452#define HC_HCOR_OPCODE_CC_CAPWAP_REASSM_TIMEOUT 0x553#define HC_HCOR_OPCODE_CC_REASSM_TIMEOUT 0x1054#define HC_HCOR_OPCODE_CC_IP_FRAG_INITIALIZATION 0x1155#define HC_HCOR_OPCODE_CC_UPDATE_WITH_AGING 0x1356#define HC_HCOR_ACTION_REG_REASSM_TIMEOUT_ACTIVE_SHIFT 2457#define HC_HCOR_EXTRA_REG_REASSM_TIMEOUT_TSBS_SHIFT 2458#define HC_HCOR_EXTRA_REG_CC_AGING_ADD 0x8000000059#define HC_HCOR_EXTRA_REG_CC_AGING_REMOVE 0x4000000060#define HC_HCOR_EXTRA_REG_CC_AGING_CHANGE_MASK 0xC000000061#define HC_HCOR_EXTRA_REG_CC_REMOVE_INDX_SHIFT 2462#define HC_HCOR_EXTRA_REG_CC_REMOVE_INDX_MASK 0x1F00000063#define HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_SHIFT 1664#define HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_MASK 0xF65#define HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_CMD_SHIFT 2466#define HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_BPID 166768#define HC_HCOR_GBL 0x200000006970#define HC_HCOR_KG_SCHEME_COUNTER 0x000004007172#if (DPAA_VERSION == 10)73#define HC_HCOR_KG_SCHEME_REGS_MASK 0xFFFFF80074#else75#define HC_HCOR_KG_SCHEME_REGS_MASK 0xFFFFFE0076#endif /* (DPAA_VERSION == 10) */7778#define SIZE_OF_HC_FRAME_PORT_REGS (sizeof(t_HcFrame)-sizeof(struct fman_kg_scheme_regs)+sizeof(t_FmPcdKgPortRegs))79#define SIZE_OF_HC_FRAME_SCHEME_REGS sizeof(t_HcFrame)80#define SIZE_OF_HC_FRAME_PROFILES_REGS (sizeof(t_HcFrame)-sizeof(struct fman_kg_scheme_regs)+sizeof(t_FmPcdPlcrProfileRegs))81#define SIZE_OF_HC_FRAME_PROFILE_CNT (sizeof(t_HcFrame)-sizeof(t_FmPcdPlcrProfileRegs)+sizeof(uint32_t))82#define SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC 168384#define HC_CMD_POOL_SIZE (INTG_MAX_NUM_OF_CORES)8586#define BUILD_FD(len) \87do { \88memset(&fmFd, 0, sizeof(t_DpaaFD)); \89DPAA_FD_SET_ADDR(&fmFd, p_HcFrame); \90DPAA_FD_SET_OFFSET(&fmFd, 0); \91DPAA_FD_SET_LENGTH(&fmFd, len); \92} while (0)939495#if defined(__MWERKS__) && !defined(__GNUC__)96#pragma pack(push,1)97#endif /* defined(__MWERKS__) && ... */9899typedef struct t_FmPcdKgPortRegs {100volatile uint32_t spReg;101volatile uint32_t cppReg;102} t_FmPcdKgPortRegs;103104typedef struct t_HcFrame {105volatile uint32_t opcode;106volatile uint32_t actionReg;107volatile uint32_t extraReg;108volatile uint32_t commandSequence;109union {110struct fman_kg_scheme_regs schemeRegs;111struct fman_kg_scheme_regs schemeRegsWithoutCounter;112t_FmPcdPlcrProfileRegs profileRegs;113volatile uint32_t singleRegForWrite; /* for writing SP, CPP, profile counter */114t_FmPcdKgPortRegs portRegsForRead;115volatile uint32_t clsPlanEntries[CLS_PLAN_NUM_PER_GRP];116t_FmPcdCcCapwapReassmTimeoutParams ccCapwapReassmTimeout;117t_FmPcdCcReassmTimeoutParams ccReassmTimeout;118} hcSpecificData;119} t_HcFrame;120121#if defined(__MWERKS__) && !defined(__GNUC__)122#pragma pack(pop)123#endif /* defined(__MWERKS__) && ... */124125126typedef struct t_FmHc {127t_Handle h_FmPcd;128t_Handle h_HcPortDev;129t_FmPcdQmEnqueueCallback *f_QmEnqueue; /**< A callback for enqueuing frames to the QM */130t_Handle h_QmArg; /**< A handle to the QM module */131uint8_t dataMemId; /**< Memory partition ID for data buffers */132133uint32_t seqNum[HC_CMD_POOL_SIZE]; /* FIFO of seqNum to use when134taking buffer */135uint32_t nextSeqNumLocation; /* seqNum location in seqNum[] for next buffer */136volatile bool enqueued[HC_CMD_POOL_SIZE]; /* HC is active - frame is enqueued137and not confirmed yet */138t_HcFrame *p_Frm[HC_CMD_POOL_SIZE];139} t_FmHc;140141142static t_Error FillBufPool(t_FmHc *p_FmHc)143{144uint32_t i;145146ASSERT_COND(p_FmHc);147148for (i = 0; i < HC_CMD_POOL_SIZE; i++)149{150#ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004151p_FmHc->p_Frm[i] = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + (16 - (sizeof(t_FmHc) % 16))),152p_FmHc->dataMemId,15316);154#else155p_FmHc->p_Frm[i] = (t_HcFrame *)XX_MallocSmart(sizeof(t_HcFrame),156p_FmHc->dataMemId,15716);158#endif /* FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004 */159if (!p_FmHc->p_Frm[i])160RETURN_ERROR(MAJOR, E_NO_MEMORY, ("FM HC frames!"));161}162163/* Initialize FIFO of seqNum to use during GetBuf */164for (i = 0; i < HC_CMD_POOL_SIZE; i++)165{166p_FmHc->seqNum[i] = i;167}168p_FmHc->nextSeqNumLocation = 0;169170return E_OK;171}172173static __inline__ t_HcFrame * GetBuf(t_FmHc *p_FmHc, uint32_t *p_SeqNum)174{175uint32_t intFlags;176177ASSERT_COND(p_FmHc);178179intFlags = FmPcdLock(p_FmHc->h_FmPcd);180181if (p_FmHc->nextSeqNumLocation == HC_CMD_POOL_SIZE)182{183/* No more buffers */184FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);185return NULL;186}187188*p_SeqNum = p_FmHc->seqNum[p_FmHc->nextSeqNumLocation];189p_FmHc->nextSeqNumLocation++;190191FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);192return p_FmHc->p_Frm[*p_SeqNum];193}194195static __inline__ void PutBuf(t_FmHc *p_FmHc, t_HcFrame *p_Buf, uint32_t seqNum)196{197uint32_t intFlags;198199UNUSED(p_Buf);200201intFlags = FmPcdLock(p_FmHc->h_FmPcd);202ASSERT_COND(p_FmHc->nextSeqNumLocation);203p_FmHc->nextSeqNumLocation--;204p_FmHc->seqNum[p_FmHc->nextSeqNumLocation] = seqNum;205FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);206}207208static __inline__ t_Error EnQFrm(t_FmHc *p_FmHc, t_DpaaFD *p_FmFd, uint32_t seqNum)209{210t_Error err = E_OK;211uint32_t intFlags;212uint32_t timeout=100;213214intFlags = FmPcdLock(p_FmHc->h_FmPcd);215ASSERT_COND(!p_FmHc->enqueued[seqNum]);216p_FmHc->enqueued[seqNum] = TRUE;217FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);218DBG(TRACE, ("Send Hc, SeqNum %d, buff@0x%x, fd offset 0x%x",219seqNum,220DPAA_FD_GET_ADDR(p_FmFd),221DPAA_FD_GET_OFFSET(p_FmFd)));222err = p_FmHc->f_QmEnqueue(p_FmHc->h_QmArg, (void *)p_FmFd);223if (err)224RETURN_ERROR(MINOR, err, ("HC enqueue failed"));225226while (p_FmHc->enqueued[seqNum] && --timeout)227XX_UDelay(100);228229if (!timeout)230RETURN_ERROR(MINOR, E_TIMEOUT, ("HC Callback, timeout exceeded"));231232return err;233}234235236t_Handle FmHcConfigAndInit(t_FmHcParams *p_FmHcParams)237{238t_FmHc *p_FmHc;239t_FmPortParams fmPortParam;240t_Error err;241242p_FmHc = (t_FmHc *)XX_Malloc(sizeof(t_FmHc));243if (!p_FmHc)244{245REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC obj"));246return NULL;247}248memset(p_FmHc,0,sizeof(t_FmHc));249250p_FmHc->h_FmPcd = p_FmHcParams->h_FmPcd;251p_FmHc->f_QmEnqueue = p_FmHcParams->params.f_QmEnqueue;252p_FmHc->h_QmArg = p_FmHcParams->params.h_QmArg;253p_FmHc->dataMemId = DEFAULT_dataMemId;254255err = FillBufPool(p_FmHc);256if (err != E_OK)257{258REPORT_ERROR(MAJOR, err, NO_MSG);259FmHcFree(p_FmHc);260return NULL;261}262263if (!FmIsMaster(p_FmHcParams->h_Fm))264return (t_Handle)p_FmHc;265266memset(&fmPortParam, 0, sizeof(fmPortParam));267fmPortParam.baseAddr = p_FmHcParams->params.portBaseAddr;268fmPortParam.portType = e_FM_PORT_TYPE_OH_HOST_COMMAND;269fmPortParam.portId = p_FmHcParams->params.portId;270fmPortParam.liodnBase = p_FmHcParams->params.liodnBase;271fmPortParam.h_Fm = p_FmHcParams->h_Fm;272273fmPortParam.specificParams.nonRxParams.errFqid = p_FmHcParams->params.errFqid;274fmPortParam.specificParams.nonRxParams.dfltFqid = p_FmHcParams->params.confFqid;275fmPortParam.specificParams.nonRxParams.qmChannel = p_FmHcParams->params.qmChannel;276277p_FmHc->h_HcPortDev = FM_PORT_Config(&fmPortParam);278if (!p_FmHc->h_HcPortDev)279{280REPORT_ERROR(MAJOR, E_INVALID_HANDLE, ("FM HC port!"));281XX_Free(p_FmHc);282return NULL;283}284285err = FM_PORT_ConfigMaxFrameLength(p_FmHc->h_HcPortDev,286(uint16_t)sizeof(t_HcFrame));287288if (err != E_OK)289{290REPORT_ERROR(MAJOR, err, ("FM HC port init!"));291FmHcFree(p_FmHc);292return NULL;293}294295/* final init */296err = FM_PORT_Init(p_FmHc->h_HcPortDev);297if (err != E_OK)298{299REPORT_ERROR(MAJOR, err, ("FM HC port init!"));300FmHcFree(p_FmHc);301return NULL;302}303304err = FM_PORT_Enable(p_FmHc->h_HcPortDev);305if (err != E_OK)306{307REPORT_ERROR(MAJOR, err, ("FM HC port enable!"));308FmHcFree(p_FmHc);309return NULL;310}311312return (t_Handle)p_FmHc;313}314315void FmHcFree(t_Handle h_FmHc)316{317t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;318int i;319320if (!p_FmHc)321return;322323for (i=0; i<HC_CMD_POOL_SIZE; i++)324if (p_FmHc->p_Frm[i])325XX_FreeSmart(p_FmHc->p_Frm[i]);326else327break;328329if (p_FmHc->h_HcPortDev)330FM_PORT_Free(p_FmHc->h_HcPortDev);331332XX_Free(p_FmHc);333}334335/*****************************************************************************/336t_Error FmHcSetFramesDataMemory(t_Handle h_FmHc,337uint8_t memId)338{339t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;340int i;341342SANITY_CHECK_RETURN_ERROR(p_FmHc, E_INVALID_HANDLE);343344p_FmHc->dataMemId = memId;345346for (i=0; i<HC_CMD_POOL_SIZE; i++)347if (p_FmHc->p_Frm[i])348XX_FreeSmart(p_FmHc->p_Frm[i]);349350return FillBufPool(p_FmHc);351}352353void FmHcTxConf(t_Handle h_FmHc, t_DpaaFD *p_Fd)354{355t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;356t_HcFrame *p_HcFrame;357uint32_t intFlags;358359ASSERT_COND(p_FmHc);360361intFlags = FmPcdLock(p_FmHc->h_FmPcd);362p_HcFrame = (t_HcFrame *)PTR_MOVE(DPAA_FD_GET_ADDR(p_Fd), DPAA_FD_GET_OFFSET(p_Fd));363364DBG(TRACE, ("Hc Conf, SeqNum %d, FD@0x%x, fd offset 0x%x",365p_HcFrame->commandSequence, DPAA_FD_GET_ADDR(p_Fd), DPAA_FD_GET_OFFSET(p_Fd)));366367if (!(p_FmHc->enqueued[p_HcFrame->commandSequence]))368REPORT_ERROR(MINOR, E_INVALID_FRAME, ("Not an Host-Command frame received!"));369else370p_FmHc->enqueued[p_HcFrame->commandSequence] = FALSE;371FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);372}373374t_Error FmHcPcdKgSetScheme(t_Handle h_FmHc,375t_Handle h_Scheme,376struct fman_kg_scheme_regs *p_SchemeRegs,377bool updateCounter)378{379t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;380t_Error err = E_OK;381t_HcFrame *p_HcFrame;382t_DpaaFD fmFd;383uint8_t physicalSchemeId;384uint32_t seqNum;385386p_HcFrame = GetBuf(p_FmHc, &seqNum);387if (!p_HcFrame)388RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));389390physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);391392memset(p_HcFrame, 0, sizeof(t_HcFrame));393p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);394p_HcFrame->actionReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, updateCounter);395p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;396memcpy(&p_HcFrame->hcSpecificData.schemeRegs, p_SchemeRegs, sizeof(struct fman_kg_scheme_regs));397if (!updateCounter)398{399p_HcFrame->hcSpecificData.schemeRegs.kgse_dv0 = p_SchemeRegs->kgse_dv0;400p_HcFrame->hcSpecificData.schemeRegs.kgse_dv1 = p_SchemeRegs->kgse_dv1;401p_HcFrame->hcSpecificData.schemeRegs.kgse_ccbs = p_SchemeRegs->kgse_ccbs;402p_HcFrame->hcSpecificData.schemeRegs.kgse_mv = p_SchemeRegs->kgse_mv;403}404p_HcFrame->commandSequence = seqNum;405406BUILD_FD(sizeof(t_HcFrame));407408err = EnQFrm(p_FmHc, &fmFd, seqNum);409410PutBuf(p_FmHc, p_HcFrame, seqNum);411412if (err != E_OK)413RETURN_ERROR(MINOR, err, NO_MSG);414415return E_OK;416}417418t_Error FmHcPcdKgDeleteScheme(t_Handle h_FmHc, t_Handle h_Scheme)419{420t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;421t_Error err = E_OK;422t_HcFrame *p_HcFrame;423t_DpaaFD fmFd;424uint8_t physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);425uint32_t seqNum;426427p_HcFrame = GetBuf(p_FmHc, &seqNum);428if (!p_HcFrame)429RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));430431memset(p_HcFrame, 0, sizeof(t_HcFrame));432p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);433p_HcFrame->actionReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE);434p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;435memset(&p_HcFrame->hcSpecificData.schemeRegs, 0, sizeof(struct fman_kg_scheme_regs));436p_HcFrame->commandSequence = seqNum;437438BUILD_FD(sizeof(t_HcFrame));439440err = EnQFrm(p_FmHc, &fmFd, seqNum);441442PutBuf(p_FmHc, p_HcFrame, seqNum);443444if (err != E_OK)445RETURN_ERROR(MINOR, err, NO_MSG);446447return E_OK;448}449450t_Error FmHcPcdKgCcGetSetParams(t_Handle h_FmHc, t_Handle h_Scheme, uint32_t requiredAction, uint32_t value)451{452t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;453t_Error err = E_OK;454t_HcFrame *p_HcFrame;455t_DpaaFD fmFd;456uint8_t relativeSchemeId;457uint8_t physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);458uint32_t tmpReg32 = 0;459uint32_t seqNum;460461/* Scheme is locked by calling routine */462/* WARNING - this lock will not be efficient if other HC routine will attempt to change463* "kgse_mode" or "kgse_om" without locking scheme !464*/465466relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);467if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)468RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);469470if (!FmPcdKgGetRequiredActionFlag(p_FmHc->h_FmPcd, relativeSchemeId) ||471!(FmPcdKgGetRequiredAction(p_FmHc->h_FmPcd, relativeSchemeId) & requiredAction))472{473if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) &&474(FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_PLCR))475{476if ((FmPcdKgIsDirectPlcr(p_FmHc->h_FmPcd, relativeSchemeId) == FALSE) ||477(FmPcdKgIsDistrOnPlcrProfile(p_FmHc->h_FmPcd, relativeSchemeId) == TRUE))478RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("In this situation PP can not be with distribution and has to be shared"));479err = FmPcdPlcrCcGetSetParams(p_FmHc->h_FmPcd, FmPcdKgGetRelativeProfileId(p_FmHc->h_FmPcd, relativeSchemeId), requiredAction);480if (err)481RETURN_ERROR(MAJOR, err, NO_MSG);482}483else /* From here we deal with KG-Schemes only */484{485/* Pre change general code */486p_HcFrame = GetBuf(p_FmHc, &seqNum);487if (!p_HcFrame)488RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));489memset(p_HcFrame, 0, sizeof(t_HcFrame));490p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);491p_HcFrame->actionReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);492p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;493p_HcFrame->commandSequence = seqNum;494BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);495if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)496{497PutBuf(p_FmHc, p_HcFrame, seqNum);498RETURN_ERROR(MINOR, err, NO_MSG);499}500501/* specific change */502if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) &&503((FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_DONE) &&504(FmPcdKgGetDoneAction(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_ENQ_FRAME)))505{506tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode;507ASSERT_COND(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME));508p_HcFrame->hcSpecificData.schemeRegs.kgse_mode = tmpReg32 | NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;509}510511if ((requiredAction & UPDATE_KG_NIA_CC_WA) &&512(FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_CC))513{514tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode;515ASSERT_COND(tmpReg32 & (NIA_ENG_FM_CTL | NIA_FM_CTL_AC_CC));516tmpReg32 &= ~NIA_FM_CTL_AC_CC;517p_HcFrame->hcSpecificData.schemeRegs.kgse_mode = tmpReg32 | NIA_FM_CTL_AC_PRE_CC;518}519520if (requiredAction & UPDATE_KG_OPT_MODE)521p_HcFrame->hcSpecificData.schemeRegs.kgse_om = value;522523if (requiredAction & UPDATE_KG_NIA)524{525tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode;526tmpReg32 &= ~(NIA_ENG_MASK | NIA_AC_MASK);527tmpReg32 |= value;528p_HcFrame->hcSpecificData.schemeRegs.kgse_mode = tmpReg32;529}530531/* Post change general code */532p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);533p_HcFrame->actionReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);534p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;535536BUILD_FD(sizeof(t_HcFrame));537err = EnQFrm(p_FmHc, &fmFd, seqNum);538539PutBuf(p_FmHc, p_HcFrame, seqNum);540541if (err != E_OK)542RETURN_ERROR(MINOR, err, NO_MSG);543}544}545546return E_OK;547}548549uint32_t FmHcPcdKgGetSchemeCounter(t_Handle h_FmHc, t_Handle h_Scheme)550{551t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;552t_Error err;553t_HcFrame *p_HcFrame;554t_DpaaFD fmFd;555uint32_t retVal;556uint8_t relativeSchemeId;557uint8_t physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);558uint32_t seqNum;559560relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);561if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)562{563REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);564return 0;565}566567/* first read scheme and check that it is valid */568p_HcFrame = GetBuf(p_FmHc, &seqNum);569if (!p_HcFrame)570{571REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));572return 0;573}574memset(p_HcFrame, 0, sizeof(t_HcFrame));575p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);576p_HcFrame->actionReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);577p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;578p_HcFrame->commandSequence = seqNum;579580BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);581582err = EnQFrm(p_FmHc, &fmFd, seqNum);583if (err != E_OK)584{585PutBuf(p_FmHc, p_HcFrame, seqNum);586REPORT_ERROR(MINOR, err, NO_MSG);587return 0;588}589590if (!FmPcdKgHwSchemeIsValid(p_HcFrame->hcSpecificData.schemeRegs.kgse_mode))591{592PutBuf(p_FmHc, p_HcFrame, seqNum);593REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is invalid"));594return 0;595}596597retVal = p_HcFrame->hcSpecificData.schemeRegs.kgse_spc;598PutBuf(p_FmHc, p_HcFrame, seqNum);599600return retVal;601}602603t_Error FmHcPcdKgSetSchemeCounter(t_Handle h_FmHc, t_Handle h_Scheme, uint32_t value)604{605t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;606t_Error err = E_OK;607t_HcFrame *p_HcFrame;608t_DpaaFD fmFd;609uint8_t relativeSchemeId, physicalSchemeId;610uint32_t seqNum;611612physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);613relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);614if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)615RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);616617/* first read scheme and check that it is valid */618p_HcFrame = GetBuf(p_FmHc, &seqNum);619if (!p_HcFrame)620RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));621memset(p_HcFrame, 0, sizeof(t_HcFrame));622p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);623p_HcFrame->actionReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE);624p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_COUNTER;625/* write counter */626p_HcFrame->hcSpecificData.singleRegForWrite = value;627p_HcFrame->commandSequence = seqNum;628629BUILD_FD(sizeof(t_HcFrame));630631err = EnQFrm(p_FmHc, &fmFd, seqNum);632633PutBuf(p_FmHc, p_HcFrame, seqNum);634return err;635}636637t_Error FmHcPcdKgSetClsPlan(t_Handle h_FmHc, t_FmPcdKgInterModuleClsPlanSet *p_Set)638{639t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;640t_HcFrame *p_HcFrame;641t_DpaaFD fmFd;642uint8_t i, idx;643uint32_t seqNum;644t_Error err = E_OK;645646ASSERT_COND(p_FmHc);647648p_HcFrame = GetBuf(p_FmHc, &seqNum);649if (!p_HcFrame)650RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));651652for (i = p_Set->baseEntry; i < (p_Set->baseEntry+p_Set->numOfClsPlanEntries); i+=8)653{654memset(p_HcFrame, 0, sizeof(t_HcFrame));655p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);656p_HcFrame->actionReg = FmPcdKgBuildWriteClsPlanBlockActionReg((uint8_t)(i / CLS_PLAN_NUM_PER_GRP));657p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;658659idx = (uint8_t)(i - p_Set->baseEntry);660memcpy(__DEVOLATILE(uint32_t *, &p_HcFrame->hcSpecificData.clsPlanEntries), &p_Set->vectors[idx], CLS_PLAN_NUM_PER_GRP*sizeof(uint32_t));661p_HcFrame->commandSequence = seqNum;662663BUILD_FD(sizeof(t_HcFrame));664665if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)666{667PutBuf(p_FmHc, p_HcFrame, seqNum);668RETURN_ERROR(MINOR, err, NO_MSG);669}670}671672PutBuf(p_FmHc, p_HcFrame, seqNum);673return err;674}675676t_Error FmHcPcdKgDeleteClsPlan(t_Handle h_FmHc, uint8_t grpId)677{678t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;679t_FmPcdKgInterModuleClsPlanSet *p_ClsPlanSet;680681p_ClsPlanSet = (t_FmPcdKgInterModuleClsPlanSet *)XX_Malloc(sizeof(t_FmPcdKgInterModuleClsPlanSet));682if (!p_ClsPlanSet)683RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Classification plan set"));684685memset(p_ClsPlanSet, 0, sizeof(t_FmPcdKgInterModuleClsPlanSet));686687p_ClsPlanSet->baseEntry = FmPcdKgGetClsPlanGrpBase(p_FmHc->h_FmPcd, grpId);688p_ClsPlanSet->numOfClsPlanEntries = FmPcdKgGetClsPlanGrpSize(p_FmHc->h_FmPcd, grpId);689ASSERT_COND(p_ClsPlanSet->numOfClsPlanEntries <= FM_PCD_MAX_NUM_OF_CLS_PLANS);690691if (FmHcPcdKgSetClsPlan(p_FmHc, p_ClsPlanSet) != E_OK)692{693XX_Free(p_ClsPlanSet);694RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);695}696697XX_Free(p_ClsPlanSet);698FmPcdKgDestroyClsPlanGrp(p_FmHc->h_FmPcd, grpId);699700return E_OK;701}702703t_Error FmHcPcdCcCapwapTimeoutReassm(t_Handle h_FmHc, t_FmPcdCcCapwapReassmTimeoutParams *p_CcCapwapReassmTimeoutParams )704{705t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;706t_HcFrame *p_HcFrame;707t_DpaaFD fmFd;708t_Error err;709uint32_t seqNum;710711SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);712713p_HcFrame = GetBuf(p_FmHc, &seqNum);714if (!p_HcFrame)715RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));716717memset(p_HcFrame, 0, sizeof(t_HcFrame));718p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_CAPWAP_REASSM_TIMEOUT);719memcpy(&p_HcFrame->hcSpecificData.ccCapwapReassmTimeout, p_CcCapwapReassmTimeoutParams, sizeof(t_FmPcdCcCapwapReassmTimeoutParams));720p_HcFrame->commandSequence = seqNum;721BUILD_FD(sizeof(t_HcFrame));722723err = EnQFrm(p_FmHc, &fmFd, seqNum);724725PutBuf(p_FmHc, p_HcFrame, seqNum);726return err;727}728729t_Error FmHcPcdCcIpFragScratchPollCmd(t_Handle h_FmHc, bool fill, t_FmPcdCcFragScratchPoolCmdParams *p_FmPcdCcFragScratchPoolCmdParams)730{731t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;732t_HcFrame *p_HcFrame;733t_DpaaFD fmFd;734t_Error err;735uint32_t seqNum;736737SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);738739p_HcFrame = GetBuf(p_FmHc, &seqNum);740if (!p_HcFrame)741RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));742743memset(p_HcFrame, 0, sizeof(t_HcFrame));744745p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_IP_FRAG_INITIALIZATION);746p_HcFrame->actionReg = (uint32_t)(((fill == TRUE) ? 0 : 1) << HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_CMD_SHIFT);747p_HcFrame->actionReg |= p_FmPcdCcFragScratchPoolCmdParams->bufferPoolId << HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_BPID;748if (fill == TRUE)749{750p_HcFrame->extraReg = p_FmPcdCcFragScratchPoolCmdParams->numOfBuffers;751}752p_HcFrame->commandSequence = seqNum;753754BUILD_FD(sizeof(t_HcFrame));755if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)756{757PutBuf(p_FmHc, p_HcFrame, seqNum);758RETURN_ERROR(MINOR, err, NO_MSG);759}760761p_FmPcdCcFragScratchPoolCmdParams->numOfBuffers = p_HcFrame->extraReg;762763PutBuf(p_FmHc, p_HcFrame, seqNum);764return E_OK;765}766767t_Error FmHcPcdCcTimeoutReassm(t_Handle h_FmHc, t_FmPcdCcReassmTimeoutParams *p_CcReassmTimeoutParams, uint8_t *p_Result)768{769t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;770t_HcFrame *p_HcFrame;771t_DpaaFD fmFd;772t_Error err;773uint32_t seqNum;774775SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);776777p_HcFrame = GetBuf(p_FmHc, &seqNum);778if (!p_HcFrame)779RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));780781memset(p_HcFrame, 0, sizeof(t_HcFrame));782p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_REASSM_TIMEOUT);783p_HcFrame->actionReg = (uint32_t)((p_CcReassmTimeoutParams->activate ? 0 : 1) << HC_HCOR_ACTION_REG_REASSM_TIMEOUT_ACTIVE_SHIFT);784p_HcFrame->extraReg = (p_CcReassmTimeoutParams->tsbs << HC_HCOR_EXTRA_REG_REASSM_TIMEOUT_TSBS_SHIFT) | p_CcReassmTimeoutParams->iprcpt;785p_HcFrame->commandSequence = seqNum;786787BUILD_FD(sizeof(t_HcFrame));788if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)789{790PutBuf(p_FmHc, p_HcFrame, seqNum);791RETURN_ERROR(MINOR, err, NO_MSG);792}793794*p_Result = (uint8_t)795((p_HcFrame->actionReg >> HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_SHIFT) & HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_MASK);796797PutBuf(p_FmHc, p_HcFrame, seqNum);798return E_OK;799}800801t_Error FmHcPcdPlcrCcGetSetParams(t_Handle h_FmHc,uint16_t absoluteProfileId, uint32_t requiredAction)802{803t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;804t_HcFrame *p_HcFrame;805t_DpaaFD fmFd;806t_Error err;807uint32_t tmpReg32 = 0;808uint32_t requiredActionTmp, requiredActionFlag;809uint32_t seqNum;810811SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);812813/* Profile is locked by calling routine */814/* WARNING - this lock will not be efficient if other HC routine will attempt to change815* "fmpl_pegnia" "fmpl_peynia" or "fmpl_pernia" without locking Profile !816*/817818requiredActionTmp = FmPcdPlcrGetRequiredAction(p_FmHc->h_FmPcd, absoluteProfileId);819requiredActionFlag = FmPcdPlcrGetRequiredActionFlag(p_FmHc->h_FmPcd, absoluteProfileId);820821if (!requiredActionFlag || !(requiredActionTmp & requiredAction))822{823if (requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA)824{825p_HcFrame = GetBuf(p_FmHc, &seqNum);826if (!p_HcFrame)827RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));828/* first read scheme and check that it is valid */829memset(p_HcFrame, 0, sizeof(t_HcFrame));830p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);831p_HcFrame->actionReg = FmPcdPlcrBuildReadPlcrActionReg(absoluteProfileId);832p_HcFrame->extraReg = 0x00008000;833p_HcFrame->commandSequence = seqNum;834835BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);836837if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)838{839PutBuf(p_FmHc, p_HcFrame, seqNum);840RETURN_ERROR(MINOR, err, NO_MSG);841}842843tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_pegnia;844if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))845{846PutBuf(p_FmHc, p_HcFrame, seqNum);847RETURN_ERROR(MAJOR, E_INVALID_STATE,848("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));849}850851tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;852853p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);854p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);855p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(TRUE, FALSE, FALSE);856p_HcFrame->extraReg = 0x00008000;857p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;858859BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);860861if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)862{863PutBuf(p_FmHc, p_HcFrame, seqNum);864RETURN_ERROR(MINOR, err, NO_MSG);865}866867tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_peynia;868if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))869{870PutBuf(p_FmHc, p_HcFrame, seqNum);871RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));872}873874tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;875876p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);877p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);878p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(FALSE, TRUE, FALSE);879p_HcFrame->extraReg = 0x00008000;880p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;881882BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);883884if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)885{886PutBuf(p_FmHc, p_HcFrame, seqNum);887RETURN_ERROR(MINOR, err, NO_MSG);888}889890tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_pernia;891if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))892{893PutBuf(p_FmHc, p_HcFrame, seqNum);894RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));895}896897tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;898899p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);900p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);901p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(FALSE, FALSE, TRUE);902p_HcFrame->extraReg = 0x00008000;903p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;904905BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);906907if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)908{909PutBuf(p_FmHc, p_HcFrame, seqNum);910RETURN_ERROR(MINOR, err, NO_MSG);911}912913PutBuf(p_FmHc, p_HcFrame, seqNum);914}915}916917return E_OK;918}919920t_Error FmHcPcdPlcrSetProfile(t_Handle h_FmHc, t_Handle h_Profile, t_FmPcdPlcrProfileRegs *p_PlcrRegs)921{922t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;923t_Error err = E_OK;924uint16_t profileIndx;925t_HcFrame *p_HcFrame;926t_DpaaFD fmFd;927uint32_t seqNum;928929p_HcFrame = GetBuf(p_FmHc, &seqNum);930if (!p_HcFrame)931RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));932933profileIndx = FmPcdPlcrProfileGetAbsoluteId(h_Profile);934935memset(p_HcFrame, 0, sizeof(t_HcFrame));936p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);937p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionRegs(profileIndx);938p_HcFrame->extraReg = 0x00008000;939memcpy(&p_HcFrame->hcSpecificData.profileRegs, p_PlcrRegs, sizeof(t_FmPcdPlcrProfileRegs));940p_HcFrame->commandSequence = seqNum;941942BUILD_FD(sizeof(t_HcFrame));943944err = EnQFrm(p_FmHc, &fmFd, seqNum);945946PutBuf(p_FmHc, p_HcFrame, seqNum);947948if (err != E_OK)949RETURN_ERROR(MINOR, err, NO_MSG);950951return E_OK;952}953954t_Error FmHcPcdPlcrDeleteProfile(t_Handle h_FmHc, t_Handle h_Profile)955{956t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;957uint16_t absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile);958t_Error err = E_OK;959t_HcFrame *p_HcFrame;960t_DpaaFD fmFd;961uint32_t seqNum;962963p_HcFrame = GetBuf(p_FmHc, &seqNum);964if (!p_HcFrame)965RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));966memset(p_HcFrame, 0, sizeof(t_HcFrame));967p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);968p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);969p_HcFrame->actionReg |= 0x00008000;970p_HcFrame->extraReg = 0x00008000;971memset(&p_HcFrame->hcSpecificData.profileRegs, 0, sizeof(t_FmPcdPlcrProfileRegs));972p_HcFrame->commandSequence = seqNum;973974BUILD_FD(sizeof(t_HcFrame));975976err = EnQFrm(p_FmHc, &fmFd, seqNum);977978PutBuf(p_FmHc, p_HcFrame, seqNum);979980if (err != E_OK)981RETURN_ERROR(MINOR, err, NO_MSG);982983return E_OK;984}985986t_Error FmHcPcdPlcrSetProfileCounter(t_Handle h_FmHc, t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter, uint32_t value)987{988989t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;990uint16_t absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile);991t_Error err = E_OK;992t_HcFrame *p_HcFrame;993t_DpaaFD fmFd;994uint32_t seqNum;995996/* first read scheme and check that it is valid */997p_HcFrame = GetBuf(p_FmHc, &seqNum);998if (!p_HcFrame)999RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));1000memset(p_HcFrame, 0, sizeof(t_HcFrame));1001p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);1002p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);1003p_HcFrame->actionReg |= FmPcdPlcrBuildCounterProfileReg(counter);1004p_HcFrame->extraReg = 0x00008000;1005p_HcFrame->hcSpecificData.singleRegForWrite = value;1006p_HcFrame->commandSequence = seqNum;10071008BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);10091010err = EnQFrm(p_FmHc, &fmFd, seqNum);10111012PutBuf(p_FmHc, p_HcFrame, seqNum);10131014if (err != E_OK)1015RETURN_ERROR(MINOR, err, NO_MSG);10161017return E_OK;1018}10191020uint32_t FmHcPcdPlcrGetProfileCounter(t_Handle h_FmHc, t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter)1021{1022t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;1023uint16_t absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile);1024t_Error err;1025t_HcFrame *p_HcFrame;1026t_DpaaFD fmFd;1027uint32_t retVal = 0;1028uint32_t seqNum;10291030SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);10311032/* first read scheme and check that it is valid */1033p_HcFrame = GetBuf(p_FmHc, &seqNum);1034if (!p_HcFrame)1035{1036REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));1037return 0;1038}1039memset(p_HcFrame, 0, sizeof(t_HcFrame));1040p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);1041p_HcFrame->actionReg = FmPcdPlcrBuildReadPlcrActionReg(absoluteProfileId);1042p_HcFrame->extraReg = 0x00008000;1043p_HcFrame->commandSequence = seqNum;10441045BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);10461047err = EnQFrm(p_FmHc, &fmFd, seqNum);1048if (err != E_OK)1049{1050PutBuf(p_FmHc, p_HcFrame, seqNum);1051REPORT_ERROR(MINOR, err, NO_MSG);1052return 0;1053}10541055switch (counter)1056{1057case e_FM_PCD_PLCR_PROFILE_GREEN_PACKET_TOTAL_COUNTER:1058retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_pegpc;1059break;1060case e_FM_PCD_PLCR_PROFILE_YELLOW_PACKET_TOTAL_COUNTER:1061retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_peypc;1062break;1063case e_FM_PCD_PLCR_PROFILE_RED_PACKET_TOTAL_COUNTER:1064retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perpc;1065break;1066case e_FM_PCD_PLCR_PROFILE_RECOLOURED_YELLOW_PACKET_TOTAL_COUNTER:1067retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perypc;1068break;1069case e_FM_PCD_PLCR_PROFILE_RECOLOURED_RED_PACKET_TOTAL_COUNTER:1070retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perrpc;1071break;1072default:1073REPORT_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);1074}10751076PutBuf(p_FmHc, p_HcFrame, seqNum);1077return retVal;1078}10791080t_Error FmHcKgWriteSp(t_Handle h_FmHc, uint8_t hardwarePortId, uint32_t spReg, bool add)1081{1082t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;1083t_HcFrame *p_HcFrame;1084t_DpaaFD fmFd;1085t_Error err = E_OK;1086uint32_t seqNum;10871088ASSERT_COND(p_FmHc);10891090p_HcFrame = GetBuf(p_FmHc, &seqNum);1091if (!p_HcFrame)1092RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));1093memset(p_HcFrame, 0, sizeof(t_HcFrame));1094/* first read SP register */1095p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);1096p_HcFrame->actionReg = FmPcdKgBuildReadPortSchemeBindActionReg(hardwarePortId);1097p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;1098p_HcFrame->commandSequence = seqNum;10991100BUILD_FD(SIZE_OF_HC_FRAME_PORT_REGS);11011102if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)1103{1104PutBuf(p_FmHc, p_HcFrame, seqNum);1105RETURN_ERROR(MINOR, err, NO_MSG);1106}11071108/* spReg is the first reg, so we can use it both for read and for write */1109if (add)1110p_HcFrame->hcSpecificData.portRegsForRead.spReg |= spReg;1111else1112p_HcFrame->hcSpecificData.portRegsForRead.spReg &= ~spReg;11131114p_HcFrame->actionReg = FmPcdKgBuildWritePortSchemeBindActionReg(hardwarePortId);11151116BUILD_FD(sizeof(t_HcFrame));11171118err = EnQFrm(p_FmHc, &fmFd, seqNum);11191120PutBuf(p_FmHc, p_HcFrame, seqNum);11211122if (err != E_OK)1123RETURN_ERROR(MINOR, err, NO_MSG);11241125return E_OK;1126}11271128t_Error FmHcKgWriteCpp(t_Handle h_FmHc, uint8_t hardwarePortId, uint32_t cppReg)1129{1130t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;1131t_HcFrame *p_HcFrame;1132t_DpaaFD fmFd;1133t_Error err = E_OK;1134uint32_t seqNum;11351136ASSERT_COND(p_FmHc);11371138p_HcFrame = GetBuf(p_FmHc, &seqNum);1139if (!p_HcFrame)1140RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));1141memset(p_HcFrame, 0, sizeof(t_HcFrame));1142/* first read SP register */1143p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);1144p_HcFrame->actionReg = FmPcdKgBuildWritePortClsPlanBindActionReg(hardwarePortId);1145p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;1146p_HcFrame->hcSpecificData.singleRegForWrite = cppReg;1147p_HcFrame->commandSequence = seqNum;11481149BUILD_FD(sizeof(t_HcFrame));11501151err = EnQFrm(p_FmHc, &fmFd, seqNum);11521153PutBuf(p_FmHc, p_HcFrame, seqNum);11541155if (err != E_OK)1156RETURN_ERROR(MINOR, err, NO_MSG);11571158return E_OK;1159}11601161t_Error FmHcPcdCcDoDynamicChange(t_Handle h_FmHc, uint32_t oldAdAddrOffset, uint32_t newAdAddrOffset)1162{1163t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;1164t_HcFrame *p_HcFrame;1165t_DpaaFD fmFd;1166t_Error err = E_OK;1167uint32_t seqNum;11681169SANITY_CHECK_RETURN_ERROR(p_FmHc, E_INVALID_HANDLE);11701171p_HcFrame = GetBuf(p_FmHc, &seqNum);1172if (!p_HcFrame)1173RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));1174memset(p_HcFrame, 0, sizeof(t_HcFrame));11751176p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC);1177p_HcFrame->actionReg = newAdAddrOffset;1178p_HcFrame->actionReg |= 0xc0000000;1179p_HcFrame->extraReg = oldAdAddrOffset;1180p_HcFrame->commandSequence = seqNum;11811182BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);11831184err = EnQFrm(p_FmHc, &fmFd, seqNum);11851186PutBuf(p_FmHc, p_HcFrame, seqNum);11871188if (err != E_OK)1189RETURN_ERROR(MAJOR, err, NO_MSG);11901191return E_OK;1192}11931194t_Error FmHcPcdSync(t_Handle h_FmHc)1195{1196t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;1197t_HcFrame *p_HcFrame;1198t_DpaaFD fmFd;1199t_Error err = E_OK;1200uint32_t seqNum;12011202ASSERT_COND(p_FmHc);12031204p_HcFrame = GetBuf(p_FmHc, &seqNum);1205if (!p_HcFrame)1206RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));1207memset(p_HcFrame, 0, sizeof(t_HcFrame));1208/* first read SP register */1209p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_SYNC);1210p_HcFrame->actionReg = 0;1211p_HcFrame->extraReg = 0;1212p_HcFrame->commandSequence = seqNum;12131214BUILD_FD(sizeof(t_HcFrame));12151216err = EnQFrm(p_FmHc, &fmFd, seqNum);12171218PutBuf(p_FmHc, p_HcFrame, seqNum);12191220if (err != E_OK)1221RETURN_ERROR(MINOR, err, NO_MSG);12221223return E_OK;1224}12251226t_Handle FmHcGetPort(t_Handle h_FmHc)1227{1228t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;1229return p_FmHc->h_HcPortDev;1230}123112321233