xref: /freebsd/sys/contrib/ncsw/Peripherals/FM/HC/hc.c (revision c5c3ba6b43cac20dc9432eac15758d41cb2b8b1f)
1852ba100SJustin Hibbits /*
2852ba100SJustin Hibbits  * Copyright 2008-2012 Freescale Semiconductor Inc.
30aeed3e9SJustin Hibbits  *
40aeed3e9SJustin Hibbits  * Redistribution and use in source and binary forms, with or without
50aeed3e9SJustin Hibbits  * modification, are permitted provided that the following conditions are met:
60aeed3e9SJustin Hibbits  *     * Redistributions of source code must retain the above copyright
70aeed3e9SJustin Hibbits  *       notice, this list of conditions and the following disclaimer.
80aeed3e9SJustin Hibbits  *     * Redistributions in binary form must reproduce the above copyright
90aeed3e9SJustin Hibbits  *       notice, this list of conditions and the following disclaimer in the
100aeed3e9SJustin Hibbits  *       documentation and/or other materials provided with the distribution.
110aeed3e9SJustin Hibbits  *     * Neither the name of Freescale Semiconductor nor the
120aeed3e9SJustin Hibbits  *       names of its contributors may be used to endorse or promote products
130aeed3e9SJustin Hibbits  *       derived from this software without specific prior written permission.
140aeed3e9SJustin Hibbits  *
150aeed3e9SJustin Hibbits  *
160aeed3e9SJustin Hibbits  * ALTERNATIVELY, this software may be distributed under the terms of the
170aeed3e9SJustin Hibbits  * GNU General Public License ("GPL") as published by the Free Software
180aeed3e9SJustin Hibbits  * Foundation, either version 2 of that License or (at your option) any
190aeed3e9SJustin Hibbits  * later version.
200aeed3e9SJustin Hibbits  *
210aeed3e9SJustin Hibbits  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
220aeed3e9SJustin Hibbits  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
230aeed3e9SJustin Hibbits  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
240aeed3e9SJustin Hibbits  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
250aeed3e9SJustin Hibbits  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
260aeed3e9SJustin Hibbits  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
270aeed3e9SJustin Hibbits  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
280aeed3e9SJustin Hibbits  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
290aeed3e9SJustin Hibbits  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
300aeed3e9SJustin Hibbits  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
310aeed3e9SJustin Hibbits  */
320aeed3e9SJustin Hibbits 
33852ba100SJustin Hibbits 
340aeed3e9SJustin Hibbits #include "std_ext.h"
350aeed3e9SJustin Hibbits #include "error_ext.h"
360aeed3e9SJustin Hibbits #include "sprint_ext.h"
370aeed3e9SJustin Hibbits #include "string_ext.h"
380aeed3e9SJustin Hibbits 
390aeed3e9SJustin Hibbits #include "fm_common.h"
400aeed3e9SJustin Hibbits #include "fm_hc.h"
410aeed3e9SJustin Hibbits 
420aeed3e9SJustin Hibbits 
43852ba100SJustin Hibbits /**************************************************************************//**
44852ba100SJustin Hibbits  @Description       defaults
45852ba100SJustin Hibbits *//***************************************************************************/
46852ba100SJustin Hibbits #define DEFAULT_dataMemId                                       0
47852ba100SJustin Hibbits 
480aeed3e9SJustin Hibbits #define HC_HCOR_OPCODE_PLCR_PRFL                                0x0
490aeed3e9SJustin Hibbits #define HC_HCOR_OPCODE_KG_SCM                                   0x1
500aeed3e9SJustin Hibbits #define HC_HCOR_OPCODE_SYNC                                     0x2
510aeed3e9SJustin Hibbits #define HC_HCOR_OPCODE_CC                                       0x3
52852ba100SJustin Hibbits #define HC_HCOR_OPCODE_CC_AGE_MASK                              0x4
530aeed3e9SJustin Hibbits #define HC_HCOR_OPCODE_CC_CAPWAP_REASSM_TIMEOUT                 0x5
54852ba100SJustin Hibbits #define HC_HCOR_OPCODE_CC_REASSM_TIMEOUT                        0x10
55852ba100SJustin Hibbits #define HC_HCOR_OPCODE_CC_IP_FRAG_INITIALIZATION                0x11
56852ba100SJustin Hibbits #define HC_HCOR_OPCODE_CC_UPDATE_WITH_AGING                     0x13
57852ba100SJustin Hibbits #define HC_HCOR_ACTION_REG_REASSM_TIMEOUT_ACTIVE_SHIFT          24
58852ba100SJustin Hibbits #define HC_HCOR_EXTRA_REG_REASSM_TIMEOUT_TSBS_SHIFT             24
59852ba100SJustin Hibbits #define HC_HCOR_EXTRA_REG_CC_AGING_ADD                          0x80000000
60852ba100SJustin Hibbits #define HC_HCOR_EXTRA_REG_CC_AGING_REMOVE                       0x40000000
61852ba100SJustin Hibbits #define HC_HCOR_EXTRA_REG_CC_AGING_CHANGE_MASK                  0xC0000000
62852ba100SJustin Hibbits #define HC_HCOR_EXTRA_REG_CC_REMOVE_INDX_SHIFT                  24
63852ba100SJustin Hibbits #define HC_HCOR_EXTRA_REG_CC_REMOVE_INDX_MASK                   0x1F000000
64852ba100SJustin Hibbits #define HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_SHIFT             16
65852ba100SJustin Hibbits #define HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_MASK              0xF
66852ba100SJustin Hibbits #define HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_CMD_SHIFT       24
67852ba100SJustin Hibbits #define HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_BPID            16
680aeed3e9SJustin Hibbits 
690aeed3e9SJustin Hibbits #define HC_HCOR_GBL                         0x20000000
700aeed3e9SJustin Hibbits 
71852ba100SJustin Hibbits #define HC_HCOR_KG_SCHEME_COUNTER           0x00000400
72852ba100SJustin Hibbits 
73852ba100SJustin Hibbits #if (DPAA_VERSION == 10)
74852ba100SJustin Hibbits #define HC_HCOR_KG_SCHEME_REGS_MASK         0xFFFFF800
75852ba100SJustin Hibbits #else
76852ba100SJustin Hibbits #define HC_HCOR_KG_SCHEME_REGS_MASK         0xFFFFFE00
77852ba100SJustin Hibbits #endif /* (DPAA_VERSION == 10) */
78852ba100SJustin Hibbits 
79852ba100SJustin Hibbits #define SIZE_OF_HC_FRAME_PORT_REGS          (sizeof(t_HcFrame)-sizeof(struct fman_kg_scheme_regs)+sizeof(t_FmPcdKgPortRegs))
800aeed3e9SJustin Hibbits #define SIZE_OF_HC_FRAME_SCHEME_REGS        sizeof(t_HcFrame)
81852ba100SJustin Hibbits #define SIZE_OF_HC_FRAME_PROFILES_REGS      (sizeof(t_HcFrame)-sizeof(struct fman_kg_scheme_regs)+sizeof(t_FmPcdPlcrProfileRegs))
82852ba100SJustin Hibbits #define SIZE_OF_HC_FRAME_PROFILE_CNT        (sizeof(t_HcFrame)-sizeof(t_FmPcdPlcrProfileRegs)+sizeof(uint32_t))
830aeed3e9SJustin Hibbits #define SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC 16
840aeed3e9SJustin Hibbits 
85852ba100SJustin Hibbits #define HC_CMD_POOL_SIZE                    (INTG_MAX_NUM_OF_CORES)
86852ba100SJustin Hibbits 
870aeed3e9SJustin Hibbits #define BUILD_FD(len)                     \
880aeed3e9SJustin Hibbits do {                                      \
890aeed3e9SJustin Hibbits     memset(&fmFd, 0, sizeof(t_DpaaFD));   \
900aeed3e9SJustin Hibbits     DPAA_FD_SET_ADDR(&fmFd, p_HcFrame);   \
910aeed3e9SJustin Hibbits     DPAA_FD_SET_OFFSET(&fmFd, 0);         \
920aeed3e9SJustin Hibbits     DPAA_FD_SET_LENGTH(&fmFd, len);       \
930aeed3e9SJustin Hibbits } while (0)
940aeed3e9SJustin Hibbits 
950aeed3e9SJustin Hibbits 
960aeed3e9SJustin Hibbits #if defined(__MWERKS__) && !defined(__GNUC__)
970aeed3e9SJustin Hibbits #pragma pack(push,1)
980aeed3e9SJustin Hibbits #endif /* defined(__MWERKS__) && ... */
990aeed3e9SJustin Hibbits 
100852ba100SJustin Hibbits typedef struct t_FmPcdKgPortRegs {
1010aeed3e9SJustin Hibbits     volatile uint32_t                       spReg;
1020aeed3e9SJustin Hibbits     volatile uint32_t                       cppReg;
103852ba100SJustin Hibbits } t_FmPcdKgPortRegs;
1040aeed3e9SJustin Hibbits 
105852ba100SJustin Hibbits typedef struct t_HcFrame {
1060aeed3e9SJustin Hibbits     volatile uint32_t                           opcode;
1070aeed3e9SJustin Hibbits     volatile uint32_t                           actionReg;
1080aeed3e9SJustin Hibbits     volatile uint32_t                           extraReg;
1090aeed3e9SJustin Hibbits     volatile uint32_t                           commandSequence;
1100aeed3e9SJustin Hibbits     union {
111852ba100SJustin Hibbits         struct fman_kg_scheme_regs              schemeRegs;
112852ba100SJustin Hibbits         struct fman_kg_scheme_regs              schemeRegsWithoutCounter;
113852ba100SJustin Hibbits         t_FmPcdPlcrProfileRegs                  profileRegs;
1140aeed3e9SJustin Hibbits         volatile uint32_t                       singleRegForWrite;    /* for writing SP, CPP, profile counter */
1150aeed3e9SJustin Hibbits         t_FmPcdKgPortRegs                       portRegsForRead;
1160aeed3e9SJustin Hibbits         volatile uint32_t                       clsPlanEntries[CLS_PLAN_NUM_PER_GRP];
1170aeed3e9SJustin Hibbits         t_FmPcdCcCapwapReassmTimeoutParams      ccCapwapReassmTimeout;
118852ba100SJustin Hibbits         t_FmPcdCcReassmTimeoutParams            ccReassmTimeout;
1190aeed3e9SJustin Hibbits     } hcSpecificData;
120852ba100SJustin Hibbits } t_HcFrame;
1210aeed3e9SJustin Hibbits 
1220aeed3e9SJustin Hibbits #if defined(__MWERKS__) && !defined(__GNUC__)
1230aeed3e9SJustin Hibbits #pragma pack(pop)
1240aeed3e9SJustin Hibbits #endif /* defined(__MWERKS__) && ... */
1250aeed3e9SJustin Hibbits 
1260aeed3e9SJustin Hibbits 
1270aeed3e9SJustin Hibbits typedef struct t_FmHc {
1280aeed3e9SJustin Hibbits     t_Handle                    h_FmPcd;
1290aeed3e9SJustin Hibbits     t_Handle                    h_HcPortDev;
1300aeed3e9SJustin Hibbits     t_FmPcdQmEnqueueCallback    *f_QmEnqueue;     /**< A callback for enqueuing frames to the QM */
1310aeed3e9SJustin Hibbits     t_Handle                    h_QmArg;          /**< A handle to the QM module */
132852ba100SJustin Hibbits     uint8_t                     dataMemId;        /**< Memory partition ID for data buffers */
1330aeed3e9SJustin Hibbits 
134852ba100SJustin Hibbits     uint32_t                    seqNum[HC_CMD_POOL_SIZE];   /* FIFO of seqNum to use when
135852ba100SJustin Hibbits                                                                taking buffer */
136852ba100SJustin Hibbits     uint32_t                    nextSeqNumLocation;         /* seqNum location in seqNum[] for next buffer */
137852ba100SJustin Hibbits     volatile bool               enqueued[HC_CMD_POOL_SIZE]; /* HC is active - frame is enqueued
138852ba100SJustin Hibbits                                                                and not confirmed yet */
139852ba100SJustin Hibbits     t_HcFrame                   *p_Frm[HC_CMD_POOL_SIZE];
1400aeed3e9SJustin Hibbits } t_FmHc;
1410aeed3e9SJustin Hibbits 
1420aeed3e9SJustin Hibbits 
FillBufPool(t_FmHc * p_FmHc)143852ba100SJustin Hibbits static t_Error FillBufPool(t_FmHc *p_FmHc)
144852ba100SJustin Hibbits {
145852ba100SJustin Hibbits     uint32_t i;
146852ba100SJustin Hibbits 
147852ba100SJustin Hibbits     ASSERT_COND(p_FmHc);
148852ba100SJustin Hibbits 
149852ba100SJustin Hibbits     for (i = 0; i < HC_CMD_POOL_SIZE; i++)
150852ba100SJustin Hibbits     {
151852ba100SJustin Hibbits #ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004
152852ba100SJustin Hibbits         p_FmHc->p_Frm[i] = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + (16 - (sizeof(t_FmHc) % 16))),
153852ba100SJustin Hibbits                                                        p_FmHc->dataMemId,
154852ba100SJustin Hibbits                                                        16);
155852ba100SJustin Hibbits #else
156852ba100SJustin Hibbits         p_FmHc->p_Frm[i] = (t_HcFrame *)XX_MallocSmart(sizeof(t_HcFrame),
157852ba100SJustin Hibbits                                                        p_FmHc->dataMemId,
158852ba100SJustin Hibbits                                                        16);
159852ba100SJustin Hibbits #endif /* FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004 */
160852ba100SJustin Hibbits         if (!p_FmHc->p_Frm[i])
161852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_NO_MEMORY, ("FM HC frames!"));
162852ba100SJustin Hibbits     }
163852ba100SJustin Hibbits 
164852ba100SJustin Hibbits     /* Initialize FIFO of seqNum to use during GetBuf */
165852ba100SJustin Hibbits     for (i = 0; i < HC_CMD_POOL_SIZE; i++)
166852ba100SJustin Hibbits     {
167852ba100SJustin Hibbits         p_FmHc->seqNum[i] = i;
168852ba100SJustin Hibbits     }
169852ba100SJustin Hibbits     p_FmHc->nextSeqNumLocation = 0;
170852ba100SJustin Hibbits 
171852ba100SJustin Hibbits     return E_OK;
172852ba100SJustin Hibbits }
173852ba100SJustin Hibbits 
GetBuf(t_FmHc * p_FmHc,uint32_t * p_SeqNum)174852ba100SJustin Hibbits static __inline__ t_HcFrame * GetBuf(t_FmHc *p_FmHc, uint32_t *p_SeqNum)
175852ba100SJustin Hibbits {
176852ba100SJustin Hibbits     uint32_t    intFlags;
177852ba100SJustin Hibbits 
178852ba100SJustin Hibbits     ASSERT_COND(p_FmHc);
179852ba100SJustin Hibbits 
180852ba100SJustin Hibbits     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
181852ba100SJustin Hibbits 
182852ba100SJustin Hibbits     if (p_FmHc->nextSeqNumLocation == HC_CMD_POOL_SIZE)
183852ba100SJustin Hibbits     {
184852ba100SJustin Hibbits         /* No more buffers */
185852ba100SJustin Hibbits         FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
186852ba100SJustin Hibbits         return NULL;
187852ba100SJustin Hibbits     }
188852ba100SJustin Hibbits 
189852ba100SJustin Hibbits     *p_SeqNum = p_FmHc->seqNum[p_FmHc->nextSeqNumLocation];
190852ba100SJustin Hibbits     p_FmHc->nextSeqNumLocation++;
191852ba100SJustin Hibbits 
192852ba100SJustin Hibbits     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
193852ba100SJustin Hibbits     return p_FmHc->p_Frm[*p_SeqNum];
194852ba100SJustin Hibbits }
195852ba100SJustin Hibbits 
PutBuf(t_FmHc * p_FmHc,t_HcFrame * p_Buf,uint32_t seqNum)196852ba100SJustin Hibbits static __inline__ void PutBuf(t_FmHc *p_FmHc, t_HcFrame *p_Buf, uint32_t seqNum)
197852ba100SJustin Hibbits {
198852ba100SJustin Hibbits     uint32_t    intFlags;
199852ba100SJustin Hibbits 
200852ba100SJustin Hibbits     UNUSED(p_Buf);
201852ba100SJustin Hibbits 
202852ba100SJustin Hibbits     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
203852ba100SJustin Hibbits     ASSERT_COND(p_FmHc->nextSeqNumLocation);
204852ba100SJustin Hibbits     p_FmHc->nextSeqNumLocation--;
205852ba100SJustin Hibbits     p_FmHc->seqNum[p_FmHc->nextSeqNumLocation] = seqNum;
206852ba100SJustin Hibbits     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
207852ba100SJustin Hibbits }
208852ba100SJustin Hibbits 
EnQFrm(t_FmHc * p_FmHc,t_DpaaFD * p_FmFd,uint32_t seqNum)209852ba100SJustin Hibbits static __inline__ t_Error EnQFrm(t_FmHc *p_FmHc, t_DpaaFD *p_FmFd, uint32_t seqNum)
2100aeed3e9SJustin Hibbits {
2110aeed3e9SJustin Hibbits     t_Error     err = E_OK;
2120aeed3e9SJustin Hibbits     uint32_t    intFlags;
2130aeed3e9SJustin Hibbits     uint32_t    timeout=100;
2140aeed3e9SJustin Hibbits 
2150aeed3e9SJustin Hibbits     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
216852ba100SJustin Hibbits     ASSERT_COND(!p_FmHc->enqueued[seqNum]);
217852ba100SJustin Hibbits     p_FmHc->enqueued[seqNum] = TRUE;
2180aeed3e9SJustin Hibbits     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
219852ba100SJustin Hibbits     DBG(TRACE, ("Send Hc, SeqNum %d, buff@0x%x, fd offset 0x%x",
220852ba100SJustin Hibbits                 seqNum,
221852ba100SJustin Hibbits                 DPAA_FD_GET_ADDR(p_FmFd),
222852ba100SJustin Hibbits                 DPAA_FD_GET_OFFSET(p_FmFd)));
2230aeed3e9SJustin Hibbits     err = p_FmHc->f_QmEnqueue(p_FmHc->h_QmArg, (void *)p_FmFd);
2240aeed3e9SJustin Hibbits     if (err)
2250aeed3e9SJustin Hibbits         RETURN_ERROR(MINOR, err, ("HC enqueue failed"));
2260aeed3e9SJustin Hibbits 
227852ba100SJustin Hibbits     while (p_FmHc->enqueued[seqNum] && --timeout)
2280aeed3e9SJustin Hibbits         XX_UDelay(100);
2290aeed3e9SJustin Hibbits 
2300aeed3e9SJustin Hibbits     if (!timeout)
2310aeed3e9SJustin Hibbits         RETURN_ERROR(MINOR, E_TIMEOUT, ("HC Callback, timeout exceeded"));
2320aeed3e9SJustin Hibbits 
2330aeed3e9SJustin Hibbits     return err;
2340aeed3e9SJustin Hibbits }
2350aeed3e9SJustin Hibbits 
2360aeed3e9SJustin Hibbits 
FmHcConfigAndInit(t_FmHcParams * p_FmHcParams)2370aeed3e9SJustin Hibbits t_Handle FmHcConfigAndInit(t_FmHcParams *p_FmHcParams)
2380aeed3e9SJustin Hibbits {
2390aeed3e9SJustin Hibbits     t_FmHc          *p_FmHc;
2400aeed3e9SJustin Hibbits     t_FmPortParams  fmPortParam;
241852ba100SJustin Hibbits     t_Error         err;
2420aeed3e9SJustin Hibbits 
2430aeed3e9SJustin Hibbits     p_FmHc = (t_FmHc *)XX_Malloc(sizeof(t_FmHc));
2440aeed3e9SJustin Hibbits     if (!p_FmHc)
2450aeed3e9SJustin Hibbits     {
2460aeed3e9SJustin Hibbits         REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC obj"));
2470aeed3e9SJustin Hibbits         return NULL;
2480aeed3e9SJustin Hibbits     }
2490aeed3e9SJustin Hibbits     memset(p_FmHc,0,sizeof(t_FmHc));
2500aeed3e9SJustin Hibbits 
2510aeed3e9SJustin Hibbits     p_FmHc->h_FmPcd             = p_FmHcParams->h_FmPcd;
2520aeed3e9SJustin Hibbits     p_FmHc->f_QmEnqueue         = p_FmHcParams->params.f_QmEnqueue;
2530aeed3e9SJustin Hibbits     p_FmHc->h_QmArg             = p_FmHcParams->params.h_QmArg;
254852ba100SJustin Hibbits     p_FmHc->dataMemId           = DEFAULT_dataMemId;
255852ba100SJustin Hibbits 
256852ba100SJustin Hibbits     err = FillBufPool(p_FmHc);
257852ba100SJustin Hibbits     if (err != E_OK)
258852ba100SJustin Hibbits     {
259852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, err, NO_MSG);
260852ba100SJustin Hibbits         FmHcFree(p_FmHc);
261852ba100SJustin Hibbits         return NULL;
262852ba100SJustin Hibbits     }
2630aeed3e9SJustin Hibbits 
2640aeed3e9SJustin Hibbits     if (!FmIsMaster(p_FmHcParams->h_Fm))
2650aeed3e9SJustin Hibbits         return (t_Handle)p_FmHc;
2660aeed3e9SJustin Hibbits 
2670aeed3e9SJustin Hibbits     memset(&fmPortParam, 0, sizeof(fmPortParam));
2680aeed3e9SJustin Hibbits     fmPortParam.baseAddr    = p_FmHcParams->params.portBaseAddr;
2690aeed3e9SJustin Hibbits     fmPortParam.portType    = e_FM_PORT_TYPE_OH_HOST_COMMAND;
2700aeed3e9SJustin Hibbits     fmPortParam.portId      = p_FmHcParams->params.portId;
2710aeed3e9SJustin Hibbits     fmPortParam.liodnBase   = p_FmHcParams->params.liodnBase;
2720aeed3e9SJustin Hibbits     fmPortParam.h_Fm        = p_FmHcParams->h_Fm;
2730aeed3e9SJustin Hibbits 
2740aeed3e9SJustin Hibbits     fmPortParam.specificParams.nonRxParams.errFqid      = p_FmHcParams->params.errFqid;
2750aeed3e9SJustin Hibbits     fmPortParam.specificParams.nonRxParams.dfltFqid     = p_FmHcParams->params.confFqid;
2760aeed3e9SJustin Hibbits     fmPortParam.specificParams.nonRxParams.qmChannel    = p_FmHcParams->params.qmChannel;
2770aeed3e9SJustin Hibbits 
2780aeed3e9SJustin Hibbits     p_FmHc->h_HcPortDev = FM_PORT_Config(&fmPortParam);
2790aeed3e9SJustin Hibbits     if (!p_FmHc->h_HcPortDev)
2800aeed3e9SJustin Hibbits     {
2810aeed3e9SJustin Hibbits         REPORT_ERROR(MAJOR, E_INVALID_HANDLE, ("FM HC port!"));
2820aeed3e9SJustin Hibbits         XX_Free(p_FmHc);
2830aeed3e9SJustin Hibbits         return NULL;
2840aeed3e9SJustin Hibbits     }
2850aeed3e9SJustin Hibbits 
286852ba100SJustin Hibbits     err = FM_PORT_ConfigMaxFrameLength(p_FmHc->h_HcPortDev,
287852ba100SJustin Hibbits                                        (uint16_t)sizeof(t_HcFrame));
288852ba100SJustin Hibbits 
289852ba100SJustin Hibbits     if (err != E_OK)
2900aeed3e9SJustin Hibbits     {
291852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, err, ("FM HC port init!"));
2920aeed3e9SJustin Hibbits         FmHcFree(p_FmHc);
2930aeed3e9SJustin Hibbits         return NULL;
2940aeed3e9SJustin Hibbits     }
2950aeed3e9SJustin Hibbits 
296852ba100SJustin Hibbits     /* final init */
297852ba100SJustin Hibbits     err = FM_PORT_Init(p_FmHc->h_HcPortDev);
298852ba100SJustin Hibbits     if (err != E_OK)
2990aeed3e9SJustin Hibbits     {
300852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, err, ("FM HC port init!"));
301852ba100SJustin Hibbits         FmHcFree(p_FmHc);
302852ba100SJustin Hibbits         return NULL;
303852ba100SJustin Hibbits     }
304852ba100SJustin Hibbits 
305852ba100SJustin Hibbits     err = FM_PORT_Enable(p_FmHc->h_HcPortDev);
306852ba100SJustin Hibbits     if (err != E_OK)
307852ba100SJustin Hibbits     {
308852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, err, ("FM HC port enable!"));
3090aeed3e9SJustin Hibbits         FmHcFree(p_FmHc);
3100aeed3e9SJustin Hibbits         return NULL;
3110aeed3e9SJustin Hibbits     }
3120aeed3e9SJustin Hibbits 
3130aeed3e9SJustin Hibbits     return (t_Handle)p_FmHc;
3140aeed3e9SJustin Hibbits }
3150aeed3e9SJustin Hibbits 
FmHcFree(t_Handle h_FmHc)3160aeed3e9SJustin Hibbits void FmHcFree(t_Handle h_FmHc)
3170aeed3e9SJustin Hibbits {
3180aeed3e9SJustin Hibbits     t_FmHc  *p_FmHc = (t_FmHc*)h_FmHc;
319852ba100SJustin Hibbits     int     i;
3200aeed3e9SJustin Hibbits 
3210aeed3e9SJustin Hibbits     if (!p_FmHc)
3220aeed3e9SJustin Hibbits         return;
3230aeed3e9SJustin Hibbits 
324852ba100SJustin Hibbits     for (i=0; i<HC_CMD_POOL_SIZE; i++)
325852ba100SJustin Hibbits         if (p_FmHc->p_Frm[i])
326852ba100SJustin Hibbits             XX_FreeSmart(p_FmHc->p_Frm[i]);
327852ba100SJustin Hibbits         else
328852ba100SJustin Hibbits             break;
329852ba100SJustin Hibbits 
3300aeed3e9SJustin Hibbits     if (p_FmHc->h_HcPortDev)
3310aeed3e9SJustin Hibbits         FM_PORT_Free(p_FmHc->h_HcPortDev);
3320aeed3e9SJustin Hibbits 
3330aeed3e9SJustin Hibbits     XX_Free(p_FmHc);
3340aeed3e9SJustin Hibbits }
3350aeed3e9SJustin Hibbits 
336852ba100SJustin Hibbits /*****************************************************************************/
FmHcSetFramesDataMemory(t_Handle h_FmHc,uint8_t memId)337852ba100SJustin Hibbits t_Error FmHcSetFramesDataMemory(t_Handle h_FmHc,
338852ba100SJustin Hibbits                                 uint8_t  memId)
3390aeed3e9SJustin Hibbits {
3400aeed3e9SJustin Hibbits     t_FmHc  *p_FmHc = (t_FmHc*)h_FmHc;
341852ba100SJustin Hibbits     int     i;
3420aeed3e9SJustin Hibbits 
3430aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmHc, E_INVALID_HANDLE);
3440aeed3e9SJustin Hibbits 
345852ba100SJustin Hibbits     p_FmHc->dataMemId            = memId;
3460aeed3e9SJustin Hibbits 
347852ba100SJustin Hibbits     for (i=0; i<HC_CMD_POOL_SIZE; i++)
348852ba100SJustin Hibbits         if (p_FmHc->p_Frm[i])
349852ba100SJustin Hibbits             XX_FreeSmart(p_FmHc->p_Frm[i]);
350852ba100SJustin Hibbits 
351852ba100SJustin Hibbits     return FillBufPool(p_FmHc);
3520aeed3e9SJustin Hibbits }
3530aeed3e9SJustin Hibbits 
FmHcTxConf(t_Handle h_FmHc,t_DpaaFD * p_Fd)3540aeed3e9SJustin Hibbits void FmHcTxConf(t_Handle h_FmHc, t_DpaaFD *p_Fd)
3550aeed3e9SJustin Hibbits {
3560aeed3e9SJustin Hibbits     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
3570aeed3e9SJustin Hibbits     t_HcFrame   *p_HcFrame;
3580aeed3e9SJustin Hibbits     uint32_t    intFlags;
3590aeed3e9SJustin Hibbits 
3600aeed3e9SJustin Hibbits     ASSERT_COND(p_FmHc);
3610aeed3e9SJustin Hibbits 
3620aeed3e9SJustin Hibbits     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
3630aeed3e9SJustin Hibbits     p_HcFrame  = (t_HcFrame *)PTR_MOVE(DPAA_FD_GET_ADDR(p_Fd), DPAA_FD_GET_OFFSET(p_Fd));
3640aeed3e9SJustin Hibbits 
3650aeed3e9SJustin Hibbits     DBG(TRACE, ("Hc Conf, SeqNum %d, FD@0x%x, fd offset 0x%x",
3660aeed3e9SJustin Hibbits                 p_HcFrame->commandSequence, DPAA_FD_GET_ADDR(p_Fd), DPAA_FD_GET_OFFSET(p_Fd)));
3670aeed3e9SJustin Hibbits 
368852ba100SJustin Hibbits     if (!(p_FmHc->enqueued[p_HcFrame->commandSequence]))
3690aeed3e9SJustin Hibbits         REPORT_ERROR(MINOR, E_INVALID_FRAME, ("Not an Host-Command frame received!"));
3700aeed3e9SJustin Hibbits     else
371852ba100SJustin Hibbits         p_FmHc->enqueued[p_HcFrame->commandSequence] = FALSE;
3720aeed3e9SJustin Hibbits     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
3730aeed3e9SJustin Hibbits }
3740aeed3e9SJustin Hibbits 
FmHcPcdKgSetScheme(t_Handle h_FmHc,t_Handle h_Scheme,struct fman_kg_scheme_regs * p_SchemeRegs,bool updateCounter)375852ba100SJustin Hibbits t_Error FmHcPcdKgSetScheme(t_Handle                    h_FmHc,
376852ba100SJustin Hibbits                            t_Handle                    h_Scheme,
377852ba100SJustin Hibbits                            struct fman_kg_scheme_regs  *p_SchemeRegs,
378852ba100SJustin Hibbits                            bool                        updateCounter)
3790aeed3e9SJustin Hibbits {
3800aeed3e9SJustin Hibbits     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
3810aeed3e9SJustin Hibbits     t_Error                             err = E_OK;
3820aeed3e9SJustin Hibbits     t_HcFrame                           *p_HcFrame;
3830aeed3e9SJustin Hibbits     t_DpaaFD                            fmFd;
384852ba100SJustin Hibbits     uint8_t                             physicalSchemeId;
385852ba100SJustin Hibbits     uint32_t                            seqNum;
3860aeed3e9SJustin Hibbits 
387852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
3880aeed3e9SJustin Hibbits     if (!p_HcFrame)
389852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
3900aeed3e9SJustin Hibbits 
391852ba100SJustin Hibbits     physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
3920aeed3e9SJustin Hibbits 
3930aeed3e9SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
3940aeed3e9SJustin Hibbits     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
395852ba100SJustin Hibbits     p_HcFrame->actionReg  = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, updateCounter);
396852ba100SJustin Hibbits     p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
397852ba100SJustin Hibbits     memcpy(&p_HcFrame->hcSpecificData.schemeRegs, p_SchemeRegs, sizeof(struct fman_kg_scheme_regs));
398852ba100SJustin Hibbits     if (!updateCounter)
3990aeed3e9SJustin Hibbits     {
400852ba100SJustin Hibbits         p_HcFrame->hcSpecificData.schemeRegs.kgse_dv0   = p_SchemeRegs->kgse_dv0;
401852ba100SJustin Hibbits         p_HcFrame->hcSpecificData.schemeRegs.kgse_dv1   = p_SchemeRegs->kgse_dv1;
402852ba100SJustin Hibbits         p_HcFrame->hcSpecificData.schemeRegs.kgse_ccbs  = p_SchemeRegs->kgse_ccbs;
403852ba100SJustin Hibbits         p_HcFrame->hcSpecificData.schemeRegs.kgse_mv    = p_SchemeRegs->kgse_mv;
4040aeed3e9SJustin Hibbits     }
405852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
4060aeed3e9SJustin Hibbits 
4070aeed3e9SJustin Hibbits     BUILD_FD(sizeof(t_HcFrame));
4080aeed3e9SJustin Hibbits 
409852ba100SJustin Hibbits     err = EnQFrm(p_FmHc, &fmFd, seqNum);
4100aeed3e9SJustin Hibbits 
411852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
4120aeed3e9SJustin Hibbits 
413852ba100SJustin Hibbits     if (err != E_OK)
414852ba100SJustin Hibbits         RETURN_ERROR(MINOR, err, NO_MSG);
4150aeed3e9SJustin Hibbits 
416852ba100SJustin Hibbits     return E_OK;
4170aeed3e9SJustin Hibbits }
4180aeed3e9SJustin Hibbits 
FmHcPcdKgDeleteScheme(t_Handle h_FmHc,t_Handle h_Scheme)4190aeed3e9SJustin Hibbits t_Error FmHcPcdKgDeleteScheme(t_Handle h_FmHc, t_Handle h_Scheme)
4200aeed3e9SJustin Hibbits {
4210aeed3e9SJustin Hibbits     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
4220aeed3e9SJustin Hibbits     t_Error     err = E_OK;
4230aeed3e9SJustin Hibbits     t_HcFrame   *p_HcFrame;
4240aeed3e9SJustin Hibbits     t_DpaaFD    fmFd;
425852ba100SJustin Hibbits     uint8_t     physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
426852ba100SJustin Hibbits     uint32_t    seqNum;
4270aeed3e9SJustin Hibbits 
428852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
4290aeed3e9SJustin Hibbits     if (!p_HcFrame)
430852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
431852ba100SJustin Hibbits 
4320aeed3e9SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
4330aeed3e9SJustin Hibbits     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
4340aeed3e9SJustin Hibbits     p_HcFrame->actionReg  = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE);
435852ba100SJustin Hibbits     p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
436852ba100SJustin Hibbits     memset(&p_HcFrame->hcSpecificData.schemeRegs, 0, sizeof(struct fman_kg_scheme_regs));
437852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
4380aeed3e9SJustin Hibbits 
4390aeed3e9SJustin Hibbits     BUILD_FD(sizeof(t_HcFrame));
4400aeed3e9SJustin Hibbits 
441852ba100SJustin Hibbits     err = EnQFrm(p_FmHc, &fmFd, seqNum);
442852ba100SJustin Hibbits 
443852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
444852ba100SJustin Hibbits 
445852ba100SJustin Hibbits     if (err != E_OK)
4460aeed3e9SJustin Hibbits         RETURN_ERROR(MINOR, err, NO_MSG);
4470aeed3e9SJustin Hibbits 
4480aeed3e9SJustin Hibbits     return E_OK;
4490aeed3e9SJustin Hibbits }
4500aeed3e9SJustin Hibbits 
FmHcPcdKgCcGetSetParams(t_Handle h_FmHc,t_Handle h_Scheme,uint32_t requiredAction,uint32_t value)451852ba100SJustin Hibbits t_Error FmHcPcdKgCcGetSetParams(t_Handle h_FmHc, t_Handle  h_Scheme, uint32_t requiredAction, uint32_t value)
4520aeed3e9SJustin Hibbits {
4530aeed3e9SJustin Hibbits     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
4540aeed3e9SJustin Hibbits     t_Error     err = E_OK;
4550aeed3e9SJustin Hibbits     t_HcFrame   *p_HcFrame;
4560aeed3e9SJustin Hibbits     t_DpaaFD    fmFd;
4570aeed3e9SJustin Hibbits     uint8_t     relativeSchemeId;
458852ba100SJustin Hibbits     uint8_t     physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
4590aeed3e9SJustin Hibbits     uint32_t    tmpReg32 = 0;
460852ba100SJustin Hibbits     uint32_t    seqNum;
461852ba100SJustin Hibbits 
462852ba100SJustin Hibbits     /* Scheme is locked by calling routine */
463852ba100SJustin Hibbits     /* WARNING - this lock will not be efficient if other HC routine will attempt to change
464852ba100SJustin Hibbits      * "kgse_mode" or "kgse_om" without locking scheme !
465852ba100SJustin Hibbits      */
4660aeed3e9SJustin Hibbits 
4670aeed3e9SJustin Hibbits     relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
4680aeed3e9SJustin Hibbits     if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
4690aeed3e9SJustin Hibbits         RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
4700aeed3e9SJustin Hibbits 
471852ba100SJustin Hibbits     if (!FmPcdKgGetRequiredActionFlag(p_FmHc->h_FmPcd, relativeSchemeId) ||
4720aeed3e9SJustin Hibbits        !(FmPcdKgGetRequiredAction(p_FmHc->h_FmPcd, relativeSchemeId) & requiredAction))
4730aeed3e9SJustin Hibbits     {
474852ba100SJustin Hibbits         if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) &&
475852ba100SJustin Hibbits             (FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_PLCR))
4760aeed3e9SJustin Hibbits             {
477852ba100SJustin Hibbits                 if ((FmPcdKgIsDirectPlcr(p_FmHc->h_FmPcd, relativeSchemeId) == FALSE) ||
478852ba100SJustin Hibbits                     (FmPcdKgIsDistrOnPlcrProfile(p_FmHc->h_FmPcd, relativeSchemeId) == TRUE))
479852ba100SJustin Hibbits                     RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("In this situation PP can not be with distribution and has to be shared"));
480852ba100SJustin Hibbits                 err = FmPcdPlcrCcGetSetParams(p_FmHc->h_FmPcd, FmPcdKgGetRelativeProfileId(p_FmHc->h_FmPcd, relativeSchemeId), requiredAction);
481852ba100SJustin Hibbits                 if (err)
482852ba100SJustin Hibbits                     RETURN_ERROR(MAJOR, err, NO_MSG);
4830aeed3e9SJustin Hibbits             }
484852ba100SJustin Hibbits         else /* From here we deal with KG-Schemes only */
485852ba100SJustin Hibbits         {
486852ba100SJustin Hibbits             /* Pre change general code */
487852ba100SJustin Hibbits             p_HcFrame = GetBuf(p_FmHc, &seqNum);
488852ba100SJustin Hibbits             if (!p_HcFrame)
489852ba100SJustin Hibbits                 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
4900aeed3e9SJustin Hibbits             memset(p_HcFrame, 0, sizeof(t_HcFrame));
4910aeed3e9SJustin Hibbits             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
4920aeed3e9SJustin Hibbits             p_HcFrame->actionReg  = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
493852ba100SJustin Hibbits             p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
494852ba100SJustin Hibbits             p_HcFrame->commandSequence = seqNum;
4950aeed3e9SJustin Hibbits             BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
496852ba100SJustin Hibbits             if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
4970aeed3e9SJustin Hibbits             {
498852ba100SJustin Hibbits                 PutBuf(p_FmHc, p_HcFrame, seqNum);
4990aeed3e9SJustin Hibbits                 RETURN_ERROR(MINOR, err, NO_MSG);
5000aeed3e9SJustin Hibbits             }
5010aeed3e9SJustin Hibbits 
502852ba100SJustin Hibbits             /* specific change */
503852ba100SJustin Hibbits             if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) &&
504852ba100SJustin Hibbits                 ((FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_DONE) &&
505852ba100SJustin Hibbits                  (FmPcdKgGetDoneAction(p_FmHc->h_FmPcd, relativeSchemeId) ==  e_FM_PCD_ENQ_FRAME)))
5060aeed3e9SJustin Hibbits             {
5070aeed3e9SJustin Hibbits                 tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode;
5080aeed3e9SJustin Hibbits                 ASSERT_COND(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME));
5090aeed3e9SJustin Hibbits                 p_HcFrame->hcSpecificData.schemeRegs.kgse_mode =  tmpReg32 | NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
510852ba100SJustin Hibbits             }
5110aeed3e9SJustin Hibbits 
512852ba100SJustin Hibbits             if ((requiredAction & UPDATE_KG_NIA_CC_WA) &&
513852ba100SJustin Hibbits                 (FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_CC))
514852ba100SJustin Hibbits             {
515852ba100SJustin Hibbits                 tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode;
516852ba100SJustin Hibbits                 ASSERT_COND(tmpReg32 & (NIA_ENG_FM_CTL | NIA_FM_CTL_AC_CC));
517852ba100SJustin Hibbits                 tmpReg32 &= ~NIA_FM_CTL_AC_CC;
518852ba100SJustin Hibbits                 p_HcFrame->hcSpecificData.schemeRegs.kgse_mode =  tmpReg32 | NIA_FM_CTL_AC_PRE_CC;
519852ba100SJustin Hibbits             }
520852ba100SJustin Hibbits 
521852ba100SJustin Hibbits             if (requiredAction & UPDATE_KG_OPT_MODE)
522852ba100SJustin Hibbits                 p_HcFrame->hcSpecificData.schemeRegs.kgse_om = value;
523852ba100SJustin Hibbits 
524852ba100SJustin Hibbits             if (requiredAction & UPDATE_KG_NIA)
525852ba100SJustin Hibbits             {
526852ba100SJustin Hibbits                 tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode;
527852ba100SJustin Hibbits                 tmpReg32 &= ~(NIA_ENG_MASK | NIA_AC_MASK);
528852ba100SJustin Hibbits                 tmpReg32 |= value;
529852ba100SJustin Hibbits                 p_HcFrame->hcSpecificData.schemeRegs.kgse_mode = tmpReg32;
530852ba100SJustin Hibbits             }
531852ba100SJustin Hibbits 
532852ba100SJustin Hibbits             /* Post change general code */
5330aeed3e9SJustin Hibbits             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
5340aeed3e9SJustin Hibbits             p_HcFrame->actionReg  = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
535852ba100SJustin Hibbits             p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
5360aeed3e9SJustin Hibbits 
5370aeed3e9SJustin Hibbits             BUILD_FD(sizeof(t_HcFrame));
538852ba100SJustin Hibbits             err = EnQFrm(p_FmHc, &fmFd, seqNum);
5390aeed3e9SJustin Hibbits 
540852ba100SJustin Hibbits             PutBuf(p_FmHc, p_HcFrame, seqNum);
541852ba100SJustin Hibbits 
542852ba100SJustin Hibbits             if (err != E_OK)
5430aeed3e9SJustin Hibbits                 RETURN_ERROR(MINOR, err, NO_MSG);
5440aeed3e9SJustin Hibbits         }
5450aeed3e9SJustin Hibbits     }
5460aeed3e9SJustin Hibbits 
5470aeed3e9SJustin Hibbits     return E_OK;
5480aeed3e9SJustin Hibbits }
5490aeed3e9SJustin Hibbits 
FmHcPcdKgGetSchemeCounter(t_Handle h_FmHc,t_Handle h_Scheme)5500aeed3e9SJustin Hibbits uint32_t  FmHcPcdKgGetSchemeCounter(t_Handle h_FmHc, t_Handle h_Scheme)
5510aeed3e9SJustin Hibbits {
5520aeed3e9SJustin Hibbits     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
553852ba100SJustin Hibbits     t_Error     err;
5540aeed3e9SJustin Hibbits     t_HcFrame   *p_HcFrame;
5550aeed3e9SJustin Hibbits     t_DpaaFD    fmFd;
5560aeed3e9SJustin Hibbits     uint32_t    retVal;
5570aeed3e9SJustin Hibbits     uint8_t     relativeSchemeId;
558852ba100SJustin Hibbits     uint8_t     physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
559852ba100SJustin Hibbits     uint32_t    seqNum;
5600aeed3e9SJustin Hibbits 
5610aeed3e9SJustin Hibbits     relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
5620aeed3e9SJustin Hibbits     if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
5630aeed3e9SJustin Hibbits     {
5640aeed3e9SJustin Hibbits         REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
5650aeed3e9SJustin Hibbits         return 0;
5660aeed3e9SJustin Hibbits     }
5670aeed3e9SJustin Hibbits 
5680aeed3e9SJustin Hibbits     /* first read scheme and check that it is valid */
569852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
5700aeed3e9SJustin Hibbits     if (!p_HcFrame)
5710aeed3e9SJustin Hibbits     {
572852ba100SJustin Hibbits         REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
5730aeed3e9SJustin Hibbits         return 0;
5740aeed3e9SJustin Hibbits     }
5750aeed3e9SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
5760aeed3e9SJustin Hibbits     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
5770aeed3e9SJustin Hibbits     p_HcFrame->actionReg  = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
578852ba100SJustin Hibbits     p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
579852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
5800aeed3e9SJustin Hibbits 
5810aeed3e9SJustin Hibbits     BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
5820aeed3e9SJustin Hibbits 
583852ba100SJustin Hibbits     err = EnQFrm(p_FmHc, &fmFd, seqNum);
584852ba100SJustin Hibbits     if (err != E_OK)
5850aeed3e9SJustin Hibbits     {
586852ba100SJustin Hibbits         PutBuf(p_FmHc, p_HcFrame, seqNum);
5870aeed3e9SJustin Hibbits         REPORT_ERROR(MINOR, err, NO_MSG);
5880aeed3e9SJustin Hibbits         return 0;
5890aeed3e9SJustin Hibbits     }
5900aeed3e9SJustin Hibbits 
5910aeed3e9SJustin Hibbits     if (!FmPcdKgHwSchemeIsValid(p_HcFrame->hcSpecificData.schemeRegs.kgse_mode))
5920aeed3e9SJustin Hibbits     {
593852ba100SJustin Hibbits         PutBuf(p_FmHc, p_HcFrame, seqNum);
5940aeed3e9SJustin Hibbits         REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is invalid"));
5950aeed3e9SJustin Hibbits         return 0;
5960aeed3e9SJustin Hibbits     }
5970aeed3e9SJustin Hibbits 
5980aeed3e9SJustin Hibbits     retVal = p_HcFrame->hcSpecificData.schemeRegs.kgse_spc;
599852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
6000aeed3e9SJustin Hibbits 
6010aeed3e9SJustin Hibbits     return retVal;
6020aeed3e9SJustin Hibbits }
6030aeed3e9SJustin Hibbits 
FmHcPcdKgSetSchemeCounter(t_Handle h_FmHc,t_Handle h_Scheme,uint32_t value)6040aeed3e9SJustin Hibbits t_Error  FmHcPcdKgSetSchemeCounter(t_Handle h_FmHc, t_Handle h_Scheme, uint32_t value)
6050aeed3e9SJustin Hibbits {
6060aeed3e9SJustin Hibbits     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
6070aeed3e9SJustin Hibbits     t_Error     err = E_OK;
6080aeed3e9SJustin Hibbits     t_HcFrame   *p_HcFrame;
6090aeed3e9SJustin Hibbits     t_DpaaFD    fmFd;
610852ba100SJustin Hibbits     uint8_t     relativeSchemeId, physicalSchemeId;
611852ba100SJustin Hibbits     uint32_t    seqNum;
6120aeed3e9SJustin Hibbits 
613852ba100SJustin Hibbits     physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
6140aeed3e9SJustin Hibbits     relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
6150aeed3e9SJustin Hibbits     if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
6160aeed3e9SJustin Hibbits         RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
6170aeed3e9SJustin Hibbits 
6180aeed3e9SJustin Hibbits     /* first read scheme and check that it is valid */
619852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
6200aeed3e9SJustin Hibbits     if (!p_HcFrame)
621852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
6220aeed3e9SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
6230aeed3e9SJustin Hibbits     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
6240aeed3e9SJustin Hibbits     p_HcFrame->actionReg  = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE);
625852ba100SJustin Hibbits     p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_COUNTER;
6260aeed3e9SJustin Hibbits     /* write counter */
627852ba100SJustin Hibbits     p_HcFrame->hcSpecificData.singleRegForWrite = value;
628852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
6290aeed3e9SJustin Hibbits 
6300aeed3e9SJustin Hibbits     BUILD_FD(sizeof(t_HcFrame));
6310aeed3e9SJustin Hibbits 
632852ba100SJustin Hibbits     err = EnQFrm(p_FmHc, &fmFd, seqNum);
6330aeed3e9SJustin Hibbits 
634852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
6350aeed3e9SJustin Hibbits     return err;
6360aeed3e9SJustin Hibbits }
6370aeed3e9SJustin Hibbits 
FmHcPcdKgSetClsPlan(t_Handle h_FmHc,t_FmPcdKgInterModuleClsPlanSet * p_Set)6380aeed3e9SJustin Hibbits t_Error FmHcPcdKgSetClsPlan(t_Handle h_FmHc, t_FmPcdKgInterModuleClsPlanSet *p_Set)
6390aeed3e9SJustin Hibbits {
6400aeed3e9SJustin Hibbits     t_FmHc                  *p_FmHc = (t_FmHc*)h_FmHc;
6410aeed3e9SJustin Hibbits     t_HcFrame               *p_HcFrame;
6420aeed3e9SJustin Hibbits     t_DpaaFD                fmFd;
643852ba100SJustin Hibbits     uint8_t                 i, idx;
644852ba100SJustin Hibbits     uint32_t                seqNum;
6450aeed3e9SJustin Hibbits     t_Error                 err = E_OK;
6460aeed3e9SJustin Hibbits 
6470aeed3e9SJustin Hibbits     ASSERT_COND(p_FmHc);
6480aeed3e9SJustin Hibbits 
649852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
6500aeed3e9SJustin Hibbits     if (!p_HcFrame)
651852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
6520aeed3e9SJustin Hibbits 
653852ba100SJustin Hibbits     for (i = p_Set->baseEntry; i < (p_Set->baseEntry+p_Set->numOfClsPlanEntries); i+=8)
6540aeed3e9SJustin Hibbits     {
6550aeed3e9SJustin Hibbits         memset(p_HcFrame, 0, sizeof(t_HcFrame));
6560aeed3e9SJustin Hibbits         p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
6570aeed3e9SJustin Hibbits         p_HcFrame->actionReg  = FmPcdKgBuildWriteClsPlanBlockActionReg((uint8_t)(i / CLS_PLAN_NUM_PER_GRP));
658852ba100SJustin Hibbits         p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
659852ba100SJustin Hibbits 
660852ba100SJustin Hibbits         idx = (uint8_t)(i - p_Set->baseEntry);
661*aef13f05SJustin Hibbits         memcpy(__DEVOLATILE(uint32_t *, &p_HcFrame->hcSpecificData.clsPlanEntries), &p_Set->vectors[idx], CLS_PLAN_NUM_PER_GRP*sizeof(uint32_t));
662852ba100SJustin Hibbits         p_HcFrame->commandSequence = seqNum;
6630aeed3e9SJustin Hibbits 
6640aeed3e9SJustin Hibbits         BUILD_FD(sizeof(t_HcFrame));
6650aeed3e9SJustin Hibbits 
666852ba100SJustin Hibbits         if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
6670aeed3e9SJustin Hibbits         {
668852ba100SJustin Hibbits             PutBuf(p_FmHc, p_HcFrame, seqNum);
6690aeed3e9SJustin Hibbits             RETURN_ERROR(MINOR, err, NO_MSG);
6700aeed3e9SJustin Hibbits         }
6710aeed3e9SJustin Hibbits     }
6720aeed3e9SJustin Hibbits 
673852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
6740aeed3e9SJustin Hibbits     return err;
6750aeed3e9SJustin Hibbits }
6760aeed3e9SJustin Hibbits 
FmHcPcdKgDeleteClsPlan(t_Handle h_FmHc,uint8_t grpId)6770aeed3e9SJustin Hibbits t_Error FmHcPcdKgDeleteClsPlan(t_Handle h_FmHc, uint8_t  grpId)
6780aeed3e9SJustin Hibbits {
6790aeed3e9SJustin Hibbits     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
6800aeed3e9SJustin Hibbits     t_FmPcdKgInterModuleClsPlanSet      *p_ClsPlanSet;
6810aeed3e9SJustin Hibbits 
6820aeed3e9SJustin Hibbits     p_ClsPlanSet = (t_FmPcdKgInterModuleClsPlanSet *)XX_Malloc(sizeof(t_FmPcdKgInterModuleClsPlanSet));
6830aeed3e9SJustin Hibbits     if (!p_ClsPlanSet)
684852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Classification plan set"));
685852ba100SJustin Hibbits 
6860aeed3e9SJustin Hibbits     memset(p_ClsPlanSet, 0, sizeof(t_FmPcdKgInterModuleClsPlanSet));
6870aeed3e9SJustin Hibbits 
6880aeed3e9SJustin Hibbits     p_ClsPlanSet->baseEntry = FmPcdKgGetClsPlanGrpBase(p_FmHc->h_FmPcd, grpId);
6890aeed3e9SJustin Hibbits     p_ClsPlanSet->numOfClsPlanEntries = FmPcdKgGetClsPlanGrpSize(p_FmHc->h_FmPcd, grpId);
6900aeed3e9SJustin Hibbits     ASSERT_COND(p_ClsPlanSet->numOfClsPlanEntries <= FM_PCD_MAX_NUM_OF_CLS_PLANS);
6910aeed3e9SJustin Hibbits 
6920aeed3e9SJustin Hibbits     if (FmHcPcdKgSetClsPlan(p_FmHc, p_ClsPlanSet) != E_OK)
693852ba100SJustin Hibbits     {
6940aeed3e9SJustin Hibbits         XX_Free(p_ClsPlanSet);
695852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
696852ba100SJustin Hibbits     }
6970aeed3e9SJustin Hibbits 
698852ba100SJustin Hibbits     XX_Free(p_ClsPlanSet);
6990aeed3e9SJustin Hibbits     FmPcdKgDestroyClsPlanGrp(p_FmHc->h_FmPcd, grpId);
7000aeed3e9SJustin Hibbits 
7010aeed3e9SJustin Hibbits     return E_OK;
7020aeed3e9SJustin Hibbits }
7030aeed3e9SJustin Hibbits 
FmHcPcdCcCapwapTimeoutReassm(t_Handle h_FmHc,t_FmPcdCcCapwapReassmTimeoutParams * p_CcCapwapReassmTimeoutParams)7040aeed3e9SJustin Hibbits t_Error FmHcPcdCcCapwapTimeoutReassm(t_Handle h_FmHc, t_FmPcdCcCapwapReassmTimeoutParams *p_CcCapwapReassmTimeoutParams )
7050aeed3e9SJustin Hibbits {
7060aeed3e9SJustin Hibbits     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
7070aeed3e9SJustin Hibbits     t_HcFrame                           *p_HcFrame;
7080aeed3e9SJustin Hibbits     t_DpaaFD                            fmFd;
7090aeed3e9SJustin Hibbits     t_Error                             err;
710852ba100SJustin Hibbits     uint32_t                            seqNum;
7110aeed3e9SJustin Hibbits 
7120aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
7130aeed3e9SJustin Hibbits 
714852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
7150aeed3e9SJustin Hibbits     if (!p_HcFrame)
716852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
717852ba100SJustin Hibbits 
7180aeed3e9SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
7190aeed3e9SJustin Hibbits     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_CAPWAP_REASSM_TIMEOUT);
7200aeed3e9SJustin Hibbits     memcpy(&p_HcFrame->hcSpecificData.ccCapwapReassmTimeout, p_CcCapwapReassmTimeoutParams, sizeof(t_FmPcdCcCapwapReassmTimeoutParams));
721852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
7220aeed3e9SJustin Hibbits     BUILD_FD(sizeof(t_HcFrame));
7230aeed3e9SJustin Hibbits 
724852ba100SJustin Hibbits     err = EnQFrm(p_FmHc, &fmFd, seqNum);
7250aeed3e9SJustin Hibbits 
726852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
7270aeed3e9SJustin Hibbits     return err;
7280aeed3e9SJustin Hibbits }
7290aeed3e9SJustin Hibbits 
FmHcPcdCcIpFragScratchPollCmd(t_Handle h_FmHc,bool fill,t_FmPcdCcFragScratchPoolCmdParams * p_FmPcdCcFragScratchPoolCmdParams)730852ba100SJustin Hibbits t_Error FmHcPcdCcIpFragScratchPollCmd(t_Handle h_FmHc, bool fill, t_FmPcdCcFragScratchPoolCmdParams *p_FmPcdCcFragScratchPoolCmdParams)
731852ba100SJustin Hibbits {
732852ba100SJustin Hibbits     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
733852ba100SJustin Hibbits     t_HcFrame                           *p_HcFrame;
734852ba100SJustin Hibbits     t_DpaaFD                            fmFd;
735852ba100SJustin Hibbits     t_Error                             err;
736852ba100SJustin Hibbits     uint32_t                            seqNum;
737852ba100SJustin Hibbits 
738852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
739852ba100SJustin Hibbits 
740852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
741852ba100SJustin Hibbits     if (!p_HcFrame)
742852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
743852ba100SJustin Hibbits 
744852ba100SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
745852ba100SJustin Hibbits 
746852ba100SJustin Hibbits     p_HcFrame->opcode     = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_IP_FRAG_INITIALIZATION);
747852ba100SJustin Hibbits     p_HcFrame->actionReg  = (uint32_t)(((fill == TRUE) ? 0 : 1) << HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_CMD_SHIFT);
748852ba100SJustin Hibbits     p_HcFrame->actionReg |= p_FmPcdCcFragScratchPoolCmdParams->bufferPoolId << HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_BPID;
749852ba100SJustin Hibbits     if (fill == TRUE)
750852ba100SJustin Hibbits     {
751852ba100SJustin Hibbits         p_HcFrame->extraReg   = p_FmPcdCcFragScratchPoolCmdParams->numOfBuffers;
752852ba100SJustin Hibbits     }
753852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
754852ba100SJustin Hibbits 
755852ba100SJustin Hibbits     BUILD_FD(sizeof(t_HcFrame));
756852ba100SJustin Hibbits     if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
757852ba100SJustin Hibbits     {
758852ba100SJustin Hibbits         PutBuf(p_FmHc, p_HcFrame, seqNum);
759852ba100SJustin Hibbits         RETURN_ERROR(MINOR, err, NO_MSG);
760852ba100SJustin Hibbits     }
761852ba100SJustin Hibbits 
762852ba100SJustin Hibbits     p_FmPcdCcFragScratchPoolCmdParams->numOfBuffers = p_HcFrame->extraReg;
763852ba100SJustin Hibbits 
764852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
765852ba100SJustin Hibbits     return E_OK;
766852ba100SJustin Hibbits }
767852ba100SJustin Hibbits 
FmHcPcdCcTimeoutReassm(t_Handle h_FmHc,t_FmPcdCcReassmTimeoutParams * p_CcReassmTimeoutParams,uint8_t * p_Result)768852ba100SJustin Hibbits t_Error FmHcPcdCcTimeoutReassm(t_Handle h_FmHc, t_FmPcdCcReassmTimeoutParams *p_CcReassmTimeoutParams, uint8_t *p_Result)
769852ba100SJustin Hibbits {
770852ba100SJustin Hibbits     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
771852ba100SJustin Hibbits     t_HcFrame                           *p_HcFrame;
772852ba100SJustin Hibbits     t_DpaaFD                            fmFd;
773852ba100SJustin Hibbits     t_Error                             err;
774852ba100SJustin Hibbits     uint32_t                            seqNum;
775852ba100SJustin Hibbits 
776852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
777852ba100SJustin Hibbits 
778852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
779852ba100SJustin Hibbits     if (!p_HcFrame)
780852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
781852ba100SJustin Hibbits 
782852ba100SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
783852ba100SJustin Hibbits     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_REASSM_TIMEOUT);
784852ba100SJustin Hibbits     p_HcFrame->actionReg = (uint32_t)((p_CcReassmTimeoutParams->activate ? 0 : 1) << HC_HCOR_ACTION_REG_REASSM_TIMEOUT_ACTIVE_SHIFT);
785852ba100SJustin Hibbits     p_HcFrame->extraReg = (p_CcReassmTimeoutParams->tsbs << HC_HCOR_EXTRA_REG_REASSM_TIMEOUT_TSBS_SHIFT) | p_CcReassmTimeoutParams->iprcpt;
786852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
787852ba100SJustin Hibbits 
788852ba100SJustin Hibbits     BUILD_FD(sizeof(t_HcFrame));
789852ba100SJustin Hibbits     if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
790852ba100SJustin Hibbits     {
791852ba100SJustin Hibbits         PutBuf(p_FmHc, p_HcFrame, seqNum);
792852ba100SJustin Hibbits         RETURN_ERROR(MINOR, err, NO_MSG);
793852ba100SJustin Hibbits     }
794852ba100SJustin Hibbits 
795852ba100SJustin Hibbits     *p_Result = (uint8_t)
796852ba100SJustin Hibbits         ((p_HcFrame->actionReg >> HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_SHIFT) & HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_MASK);
797852ba100SJustin Hibbits 
798852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
799852ba100SJustin Hibbits     return E_OK;
800852ba100SJustin Hibbits }
8010aeed3e9SJustin Hibbits 
FmHcPcdPlcrCcGetSetParams(t_Handle h_FmHc,uint16_t absoluteProfileId,uint32_t requiredAction)8020aeed3e9SJustin Hibbits t_Error FmHcPcdPlcrCcGetSetParams(t_Handle h_FmHc,uint16_t absoluteProfileId, uint32_t requiredAction)
8030aeed3e9SJustin Hibbits {
8040aeed3e9SJustin Hibbits     t_FmHc              *p_FmHc = (t_FmHc*)h_FmHc;
8050aeed3e9SJustin Hibbits     t_HcFrame           *p_HcFrame;
8060aeed3e9SJustin Hibbits     t_DpaaFD            fmFd;
8070aeed3e9SJustin Hibbits     t_Error             err;
8080aeed3e9SJustin Hibbits     uint32_t            tmpReg32 = 0;
809852ba100SJustin Hibbits     uint32_t            requiredActionTmp, requiredActionFlag;
810852ba100SJustin Hibbits     uint32_t            seqNum;
8110aeed3e9SJustin Hibbits 
8120aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
8130aeed3e9SJustin Hibbits 
814852ba100SJustin Hibbits     /* Profile is locked by calling routine */
815852ba100SJustin Hibbits     /* WARNING - this lock will not be efficient if other HC routine will attempt to change
816852ba100SJustin Hibbits      * "fmpl_pegnia" "fmpl_peynia" or "fmpl_pernia" without locking Profile !
817852ba100SJustin Hibbits      */
8180aeed3e9SJustin Hibbits 
8190aeed3e9SJustin Hibbits     requiredActionTmp = FmPcdPlcrGetRequiredAction(p_FmHc->h_FmPcd, absoluteProfileId);
820852ba100SJustin Hibbits     requiredActionFlag = FmPcdPlcrGetRequiredActionFlag(p_FmHc->h_FmPcd, absoluteProfileId);
8210aeed3e9SJustin Hibbits 
822852ba100SJustin Hibbits     if (!requiredActionFlag || !(requiredActionTmp & requiredAction))
8230aeed3e9SJustin Hibbits     {
8240aeed3e9SJustin Hibbits         if (requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA)
8250aeed3e9SJustin Hibbits         {
826852ba100SJustin Hibbits             p_HcFrame = GetBuf(p_FmHc, &seqNum);
8270aeed3e9SJustin Hibbits             if (!p_HcFrame)
828852ba100SJustin Hibbits                 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
8290aeed3e9SJustin Hibbits             /* first read scheme and check that it is valid */
8300aeed3e9SJustin Hibbits             memset(p_HcFrame, 0, sizeof(t_HcFrame));
8310aeed3e9SJustin Hibbits             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
8320aeed3e9SJustin Hibbits             p_HcFrame->actionReg  = FmPcdPlcrBuildReadPlcrActionReg(absoluteProfileId);
8330aeed3e9SJustin Hibbits             p_HcFrame->extraReg = 0x00008000;
834852ba100SJustin Hibbits             p_HcFrame->commandSequence = seqNum;
8350aeed3e9SJustin Hibbits 
8360aeed3e9SJustin Hibbits             BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
8370aeed3e9SJustin Hibbits 
838852ba100SJustin Hibbits             if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
8390aeed3e9SJustin Hibbits             {
840852ba100SJustin Hibbits                 PutBuf(p_FmHc, p_HcFrame, seqNum);
8410aeed3e9SJustin Hibbits                 RETURN_ERROR(MINOR, err, NO_MSG);
8420aeed3e9SJustin Hibbits             }
8430aeed3e9SJustin Hibbits 
8440aeed3e9SJustin Hibbits             tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_pegnia;
8450aeed3e9SJustin Hibbits             if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
8460aeed3e9SJustin Hibbits             {
847852ba100SJustin Hibbits                 PutBuf(p_FmHc, p_HcFrame, seqNum);
848852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, E_INVALID_STATE,
849852ba100SJustin Hibbits                              ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
8500aeed3e9SJustin Hibbits             }
851852ba100SJustin Hibbits 
8520aeed3e9SJustin Hibbits             tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
8530aeed3e9SJustin Hibbits 
8540aeed3e9SJustin Hibbits             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
8550aeed3e9SJustin Hibbits             p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
8560aeed3e9SJustin Hibbits             p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(TRUE, FALSE, FALSE);
8570aeed3e9SJustin Hibbits             p_HcFrame->extraReg = 0x00008000;
8580aeed3e9SJustin Hibbits             p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;
8590aeed3e9SJustin Hibbits 
8600aeed3e9SJustin Hibbits             BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
8610aeed3e9SJustin Hibbits 
862852ba100SJustin Hibbits             if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
8630aeed3e9SJustin Hibbits             {
864852ba100SJustin Hibbits                 PutBuf(p_FmHc, p_HcFrame, seqNum);
8650aeed3e9SJustin Hibbits                 RETURN_ERROR(MINOR, err, NO_MSG);
8660aeed3e9SJustin Hibbits             }
8670aeed3e9SJustin Hibbits 
8680aeed3e9SJustin Hibbits             tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_peynia;
8690aeed3e9SJustin Hibbits             if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
8700aeed3e9SJustin Hibbits             {
871852ba100SJustin Hibbits                 PutBuf(p_FmHc, p_HcFrame, seqNum);
8720aeed3e9SJustin Hibbits                 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
8730aeed3e9SJustin Hibbits             }
874852ba100SJustin Hibbits 
8750aeed3e9SJustin Hibbits             tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
8760aeed3e9SJustin Hibbits 
8770aeed3e9SJustin Hibbits             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
8780aeed3e9SJustin Hibbits             p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
8790aeed3e9SJustin Hibbits             p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(FALSE, TRUE, FALSE);
8800aeed3e9SJustin Hibbits             p_HcFrame->extraReg = 0x00008000;
8810aeed3e9SJustin Hibbits             p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;
8820aeed3e9SJustin Hibbits 
8830aeed3e9SJustin Hibbits             BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
8840aeed3e9SJustin Hibbits 
885852ba100SJustin Hibbits             if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
8860aeed3e9SJustin Hibbits             {
887852ba100SJustin Hibbits                 PutBuf(p_FmHc, p_HcFrame, seqNum);
8880aeed3e9SJustin Hibbits                 RETURN_ERROR(MINOR, err, NO_MSG);
8890aeed3e9SJustin Hibbits             }
8900aeed3e9SJustin Hibbits 
8910aeed3e9SJustin Hibbits             tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_pernia;
8920aeed3e9SJustin Hibbits             if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
8930aeed3e9SJustin Hibbits             {
894852ba100SJustin Hibbits                 PutBuf(p_FmHc, p_HcFrame, seqNum);
8950aeed3e9SJustin Hibbits                 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
8960aeed3e9SJustin Hibbits             }
897852ba100SJustin Hibbits 
8980aeed3e9SJustin Hibbits             tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
8990aeed3e9SJustin Hibbits 
9000aeed3e9SJustin Hibbits             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
9010aeed3e9SJustin Hibbits             p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
9020aeed3e9SJustin Hibbits             p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(FALSE, FALSE, TRUE);
9030aeed3e9SJustin Hibbits             p_HcFrame->extraReg = 0x00008000;
9040aeed3e9SJustin Hibbits             p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;
9050aeed3e9SJustin Hibbits 
9060aeed3e9SJustin Hibbits             BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
9070aeed3e9SJustin Hibbits 
908852ba100SJustin Hibbits             if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
9090aeed3e9SJustin Hibbits             {
910852ba100SJustin Hibbits                 PutBuf(p_FmHc, p_HcFrame, seqNum);
9110aeed3e9SJustin Hibbits                 RETURN_ERROR(MINOR, err, NO_MSG);
9120aeed3e9SJustin Hibbits             }
913852ba100SJustin Hibbits 
914852ba100SJustin Hibbits             PutBuf(p_FmHc, p_HcFrame, seqNum);
9150aeed3e9SJustin Hibbits         }
9160aeed3e9SJustin Hibbits     }
9170aeed3e9SJustin Hibbits 
9180aeed3e9SJustin Hibbits     return E_OK;
9190aeed3e9SJustin Hibbits }
9200aeed3e9SJustin Hibbits 
FmHcPcdPlcrSetProfile(t_Handle h_FmHc,t_Handle h_Profile,t_FmPcdPlcrProfileRegs * p_PlcrRegs)921852ba100SJustin Hibbits t_Error FmHcPcdPlcrSetProfile(t_Handle h_FmHc, t_Handle h_Profile, t_FmPcdPlcrProfileRegs *p_PlcrRegs)
9220aeed3e9SJustin Hibbits {
9230aeed3e9SJustin Hibbits     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
9240aeed3e9SJustin Hibbits     t_Error                             err = E_OK;
9250aeed3e9SJustin Hibbits     uint16_t                            profileIndx;
9260aeed3e9SJustin Hibbits     t_HcFrame                           *p_HcFrame;
9270aeed3e9SJustin Hibbits     t_DpaaFD                            fmFd;
928852ba100SJustin Hibbits     uint32_t                            seqNum;
9290aeed3e9SJustin Hibbits 
930852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
9310aeed3e9SJustin Hibbits     if (!p_HcFrame)
932852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
9330aeed3e9SJustin Hibbits 
934852ba100SJustin Hibbits     profileIndx = FmPcdPlcrProfileGetAbsoluteId(h_Profile);
9350aeed3e9SJustin Hibbits 
9360aeed3e9SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
9370aeed3e9SJustin Hibbits     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
9380aeed3e9SJustin Hibbits     p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionRegs(profileIndx);
9390aeed3e9SJustin Hibbits     p_HcFrame->extraReg = 0x00008000;
940852ba100SJustin Hibbits     memcpy(&p_HcFrame->hcSpecificData.profileRegs, p_PlcrRegs, sizeof(t_FmPcdPlcrProfileRegs));
941852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
9420aeed3e9SJustin Hibbits 
9430aeed3e9SJustin Hibbits     BUILD_FD(sizeof(t_HcFrame));
9440aeed3e9SJustin Hibbits 
945852ba100SJustin Hibbits     err = EnQFrm(p_FmHc, &fmFd, seqNum);
9460aeed3e9SJustin Hibbits 
947852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
9480aeed3e9SJustin Hibbits 
949852ba100SJustin Hibbits     if (err != E_OK)
950852ba100SJustin Hibbits         RETURN_ERROR(MINOR, err, NO_MSG);
9510aeed3e9SJustin Hibbits 
952852ba100SJustin Hibbits     return E_OK;
9530aeed3e9SJustin Hibbits }
9540aeed3e9SJustin Hibbits 
FmHcPcdPlcrDeleteProfile(t_Handle h_FmHc,t_Handle h_Profile)9550aeed3e9SJustin Hibbits t_Error FmHcPcdPlcrDeleteProfile(t_Handle h_FmHc, t_Handle h_Profile)
9560aeed3e9SJustin Hibbits {
9570aeed3e9SJustin Hibbits     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
958852ba100SJustin Hibbits     uint16_t    absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile);
9590aeed3e9SJustin Hibbits     t_Error     err = E_OK;
9600aeed3e9SJustin Hibbits     t_HcFrame   *p_HcFrame;
9610aeed3e9SJustin Hibbits     t_DpaaFD    fmFd;
962852ba100SJustin Hibbits     uint32_t    seqNum;
9630aeed3e9SJustin Hibbits 
964852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
9650aeed3e9SJustin Hibbits     if (!p_HcFrame)
966852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
9670aeed3e9SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
9680aeed3e9SJustin Hibbits     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
9690aeed3e9SJustin Hibbits     p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
9700aeed3e9SJustin Hibbits     p_HcFrame->actionReg  |= 0x00008000;
9710aeed3e9SJustin Hibbits     p_HcFrame->extraReg = 0x00008000;
972852ba100SJustin Hibbits     memset(&p_HcFrame->hcSpecificData.profileRegs, 0, sizeof(t_FmPcdPlcrProfileRegs));
973852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
9740aeed3e9SJustin Hibbits 
9750aeed3e9SJustin Hibbits     BUILD_FD(sizeof(t_HcFrame));
9760aeed3e9SJustin Hibbits 
977852ba100SJustin Hibbits     err = EnQFrm(p_FmHc, &fmFd, seqNum);
978852ba100SJustin Hibbits 
979852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
980852ba100SJustin Hibbits 
981852ba100SJustin Hibbits     if (err != E_OK)
9820aeed3e9SJustin Hibbits         RETURN_ERROR(MINOR, err, NO_MSG);
9830aeed3e9SJustin Hibbits 
9840aeed3e9SJustin Hibbits     return E_OK;
9850aeed3e9SJustin Hibbits }
9860aeed3e9SJustin Hibbits 
FmHcPcdPlcrSetProfileCounter(t_Handle h_FmHc,t_Handle h_Profile,e_FmPcdPlcrProfileCounters counter,uint32_t value)9870aeed3e9SJustin Hibbits t_Error  FmHcPcdPlcrSetProfileCounter(t_Handle h_FmHc, t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter, uint32_t value)
9880aeed3e9SJustin Hibbits {
9890aeed3e9SJustin Hibbits 
9900aeed3e9SJustin Hibbits     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
991852ba100SJustin Hibbits     uint16_t    absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile);
9920aeed3e9SJustin Hibbits     t_Error     err = E_OK;
9930aeed3e9SJustin Hibbits     t_HcFrame   *p_HcFrame;
9940aeed3e9SJustin Hibbits     t_DpaaFD    fmFd;
995852ba100SJustin Hibbits     uint32_t    seqNum;
9960aeed3e9SJustin Hibbits 
9970aeed3e9SJustin Hibbits     /* first read scheme and check that it is valid */
998852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
9990aeed3e9SJustin Hibbits     if (!p_HcFrame)
1000852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
10010aeed3e9SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
10020aeed3e9SJustin Hibbits     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
10030aeed3e9SJustin Hibbits     p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
10040aeed3e9SJustin Hibbits     p_HcFrame->actionReg |= FmPcdPlcrBuildCounterProfileReg(counter);
10050aeed3e9SJustin Hibbits     p_HcFrame->extraReg = 0x00008000;
10060aeed3e9SJustin Hibbits     p_HcFrame->hcSpecificData.singleRegForWrite = value;
1007852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
10080aeed3e9SJustin Hibbits 
10090aeed3e9SJustin Hibbits     BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
10100aeed3e9SJustin Hibbits 
1011852ba100SJustin Hibbits     err = EnQFrm(p_FmHc, &fmFd, seqNum);
1012852ba100SJustin Hibbits 
1013852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
1014852ba100SJustin Hibbits 
1015852ba100SJustin Hibbits     if (err != E_OK)
10160aeed3e9SJustin Hibbits         RETURN_ERROR(MINOR, err, NO_MSG);
10170aeed3e9SJustin Hibbits 
10180aeed3e9SJustin Hibbits     return E_OK;
10190aeed3e9SJustin Hibbits }
10200aeed3e9SJustin Hibbits 
FmHcPcdPlcrGetProfileCounter(t_Handle h_FmHc,t_Handle h_Profile,e_FmPcdPlcrProfileCounters counter)10210aeed3e9SJustin Hibbits uint32_t FmHcPcdPlcrGetProfileCounter(t_Handle h_FmHc, t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter)
10220aeed3e9SJustin Hibbits {
10230aeed3e9SJustin Hibbits     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
1024852ba100SJustin Hibbits     uint16_t    absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile);
1025852ba100SJustin Hibbits     t_Error     err;
10260aeed3e9SJustin Hibbits     t_HcFrame   *p_HcFrame;
10270aeed3e9SJustin Hibbits     t_DpaaFD    fmFd;
10280aeed3e9SJustin Hibbits     uint32_t    retVal = 0;
1029852ba100SJustin Hibbits     uint32_t    seqNum;
10300aeed3e9SJustin Hibbits 
10310aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
10320aeed3e9SJustin Hibbits 
10330aeed3e9SJustin Hibbits     /* first read scheme and check that it is valid */
1034852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
10350aeed3e9SJustin Hibbits     if (!p_HcFrame)
10360aeed3e9SJustin Hibbits     {
1037852ba100SJustin Hibbits         REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
10380aeed3e9SJustin Hibbits         return 0;
10390aeed3e9SJustin Hibbits     }
10400aeed3e9SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
10410aeed3e9SJustin Hibbits     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
10420aeed3e9SJustin Hibbits     p_HcFrame->actionReg  = FmPcdPlcrBuildReadPlcrActionReg(absoluteProfileId);
10430aeed3e9SJustin Hibbits     p_HcFrame->extraReg = 0x00008000;
1044852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
10450aeed3e9SJustin Hibbits 
10460aeed3e9SJustin Hibbits     BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
10470aeed3e9SJustin Hibbits 
1048852ba100SJustin Hibbits     err = EnQFrm(p_FmHc, &fmFd, seqNum);
1049852ba100SJustin Hibbits     if (err != E_OK)
10500aeed3e9SJustin Hibbits     {
1051852ba100SJustin Hibbits         PutBuf(p_FmHc, p_HcFrame, seqNum);
10520aeed3e9SJustin Hibbits         REPORT_ERROR(MINOR, err, NO_MSG);
10530aeed3e9SJustin Hibbits         return 0;
10540aeed3e9SJustin Hibbits     }
10550aeed3e9SJustin Hibbits 
10560aeed3e9SJustin Hibbits     switch (counter)
10570aeed3e9SJustin Hibbits     {
10580aeed3e9SJustin Hibbits         case e_FM_PCD_PLCR_PROFILE_GREEN_PACKET_TOTAL_COUNTER:
10590aeed3e9SJustin Hibbits             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_pegpc;
10600aeed3e9SJustin Hibbits             break;
10610aeed3e9SJustin Hibbits         case e_FM_PCD_PLCR_PROFILE_YELLOW_PACKET_TOTAL_COUNTER:
10620aeed3e9SJustin Hibbits             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_peypc;
10630aeed3e9SJustin Hibbits             break;
10640aeed3e9SJustin Hibbits         case e_FM_PCD_PLCR_PROFILE_RED_PACKET_TOTAL_COUNTER:
10650aeed3e9SJustin Hibbits             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perpc;
10660aeed3e9SJustin Hibbits             break;
10670aeed3e9SJustin Hibbits         case e_FM_PCD_PLCR_PROFILE_RECOLOURED_YELLOW_PACKET_TOTAL_COUNTER:
10680aeed3e9SJustin Hibbits             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perypc;
10690aeed3e9SJustin Hibbits             break;
10700aeed3e9SJustin Hibbits         case e_FM_PCD_PLCR_PROFILE_RECOLOURED_RED_PACKET_TOTAL_COUNTER:
10710aeed3e9SJustin Hibbits             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perrpc;
10720aeed3e9SJustin Hibbits             break;
10730aeed3e9SJustin Hibbits         default:
10740aeed3e9SJustin Hibbits             REPORT_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
10750aeed3e9SJustin Hibbits     }
10760aeed3e9SJustin Hibbits 
1077852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
10780aeed3e9SJustin Hibbits     return retVal;
10790aeed3e9SJustin Hibbits }
10800aeed3e9SJustin Hibbits 
FmHcKgWriteSp(t_Handle h_FmHc,uint8_t hardwarePortId,uint32_t spReg,bool add)10810aeed3e9SJustin Hibbits t_Error FmHcKgWriteSp(t_Handle h_FmHc, uint8_t hardwarePortId, uint32_t spReg, bool add)
10820aeed3e9SJustin Hibbits {
10830aeed3e9SJustin Hibbits     t_FmHc                  *p_FmHc = (t_FmHc*)h_FmHc;
10840aeed3e9SJustin Hibbits     t_HcFrame               *p_HcFrame;
10850aeed3e9SJustin Hibbits     t_DpaaFD                fmFd;
10860aeed3e9SJustin Hibbits     t_Error                 err = E_OK;
1087852ba100SJustin Hibbits     uint32_t                seqNum;
10880aeed3e9SJustin Hibbits 
10890aeed3e9SJustin Hibbits     ASSERT_COND(p_FmHc);
10900aeed3e9SJustin Hibbits 
1091852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
10920aeed3e9SJustin Hibbits     if (!p_HcFrame)
1093852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
10940aeed3e9SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
10950aeed3e9SJustin Hibbits     /* first read SP register */
10960aeed3e9SJustin Hibbits     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
10970aeed3e9SJustin Hibbits     p_HcFrame->actionReg  = FmPcdKgBuildReadPortSchemeBindActionReg(hardwarePortId);
1098852ba100SJustin Hibbits     p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
1099852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
11000aeed3e9SJustin Hibbits 
11010aeed3e9SJustin Hibbits     BUILD_FD(SIZE_OF_HC_FRAME_PORT_REGS);
11020aeed3e9SJustin Hibbits 
1103852ba100SJustin Hibbits     if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
11040aeed3e9SJustin Hibbits     {
1105852ba100SJustin Hibbits         PutBuf(p_FmHc, p_HcFrame, seqNum);
11060aeed3e9SJustin Hibbits         RETURN_ERROR(MINOR, err, NO_MSG);
11070aeed3e9SJustin Hibbits     }
11080aeed3e9SJustin Hibbits 
11090aeed3e9SJustin Hibbits     /* spReg is the first reg, so we can use it both for read and for write */
11100aeed3e9SJustin Hibbits     if (add)
11110aeed3e9SJustin Hibbits         p_HcFrame->hcSpecificData.portRegsForRead.spReg |= spReg;
11120aeed3e9SJustin Hibbits     else
11130aeed3e9SJustin Hibbits         p_HcFrame->hcSpecificData.portRegsForRead.spReg &= ~spReg;
11140aeed3e9SJustin Hibbits 
11150aeed3e9SJustin Hibbits     p_HcFrame->actionReg  = FmPcdKgBuildWritePortSchemeBindActionReg(hardwarePortId);
11160aeed3e9SJustin Hibbits 
11170aeed3e9SJustin Hibbits     BUILD_FD(sizeof(t_HcFrame));
11180aeed3e9SJustin Hibbits 
1119852ba100SJustin Hibbits     err = EnQFrm(p_FmHc, &fmFd, seqNum);
11200aeed3e9SJustin Hibbits 
1121852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
1122852ba100SJustin Hibbits 
1123852ba100SJustin Hibbits     if (err != E_OK)
1124852ba100SJustin Hibbits         RETURN_ERROR(MINOR, err, NO_MSG);
11250aeed3e9SJustin Hibbits 
11260aeed3e9SJustin Hibbits     return E_OK;
11270aeed3e9SJustin Hibbits }
11280aeed3e9SJustin Hibbits 
FmHcKgWriteCpp(t_Handle h_FmHc,uint8_t hardwarePortId,uint32_t cppReg)11290aeed3e9SJustin Hibbits t_Error FmHcKgWriteCpp(t_Handle h_FmHc, uint8_t hardwarePortId, uint32_t cppReg)
11300aeed3e9SJustin Hibbits {
11310aeed3e9SJustin Hibbits     t_FmHc                  *p_FmHc = (t_FmHc*)h_FmHc;
11320aeed3e9SJustin Hibbits     t_HcFrame               *p_HcFrame;
11330aeed3e9SJustin Hibbits     t_DpaaFD                fmFd;
11340aeed3e9SJustin Hibbits     t_Error                 err = E_OK;
1135852ba100SJustin Hibbits     uint32_t                seqNum;
11360aeed3e9SJustin Hibbits 
11370aeed3e9SJustin Hibbits     ASSERT_COND(p_FmHc);
11380aeed3e9SJustin Hibbits 
1139852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
11400aeed3e9SJustin Hibbits     if (!p_HcFrame)
1141852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
11420aeed3e9SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
11430aeed3e9SJustin Hibbits     /* first read SP register */
11440aeed3e9SJustin Hibbits     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
11450aeed3e9SJustin Hibbits     p_HcFrame->actionReg  = FmPcdKgBuildWritePortClsPlanBindActionReg(hardwarePortId);
1146852ba100SJustin Hibbits     p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
11470aeed3e9SJustin Hibbits     p_HcFrame->hcSpecificData.singleRegForWrite = cppReg;
1148852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
11490aeed3e9SJustin Hibbits 
11500aeed3e9SJustin Hibbits     BUILD_FD(sizeof(t_HcFrame));
11510aeed3e9SJustin Hibbits 
1152852ba100SJustin Hibbits     err = EnQFrm(p_FmHc, &fmFd, seqNum);
11530aeed3e9SJustin Hibbits 
1154852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
1155852ba100SJustin Hibbits 
1156852ba100SJustin Hibbits     if (err != E_OK)
1157852ba100SJustin Hibbits         RETURN_ERROR(MINOR, err, NO_MSG);
11580aeed3e9SJustin Hibbits 
11590aeed3e9SJustin Hibbits     return E_OK;
11600aeed3e9SJustin Hibbits }
11610aeed3e9SJustin Hibbits 
FmHcPcdCcDoDynamicChange(t_Handle h_FmHc,uint32_t oldAdAddrOffset,uint32_t newAdAddrOffset)1162852ba100SJustin Hibbits t_Error FmHcPcdCcDoDynamicChange(t_Handle h_FmHc, uint32_t oldAdAddrOffset, uint32_t newAdAddrOffset)
1163852ba100SJustin Hibbits {
1164852ba100SJustin Hibbits     t_FmHc                  *p_FmHc = (t_FmHc*)h_FmHc;
1165852ba100SJustin Hibbits     t_HcFrame               *p_HcFrame;
1166852ba100SJustin Hibbits     t_DpaaFD                fmFd;
1167852ba100SJustin Hibbits     t_Error                 err = E_OK;
1168852ba100SJustin Hibbits     uint32_t                seqNum;
1169852ba100SJustin Hibbits 
1170852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmHc, E_INVALID_HANDLE);
1171852ba100SJustin Hibbits 
1172852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
1173852ba100SJustin Hibbits     if (!p_HcFrame)
1174852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
1175852ba100SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1176852ba100SJustin Hibbits 
1177852ba100SJustin Hibbits     p_HcFrame->opcode     = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC);
1178852ba100SJustin Hibbits     p_HcFrame->actionReg  = newAdAddrOffset;
1179852ba100SJustin Hibbits     p_HcFrame->actionReg |= 0xc0000000;
1180852ba100SJustin Hibbits     p_HcFrame->extraReg   = oldAdAddrOffset;
1181852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
1182852ba100SJustin Hibbits 
1183852ba100SJustin Hibbits     BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
1184852ba100SJustin Hibbits 
1185852ba100SJustin Hibbits     err = EnQFrm(p_FmHc, &fmFd, seqNum);
1186852ba100SJustin Hibbits 
1187852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
1188852ba100SJustin Hibbits 
1189852ba100SJustin Hibbits     if (err != E_OK)
1190852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
1191852ba100SJustin Hibbits 
1192852ba100SJustin Hibbits     return E_OK;
1193852ba100SJustin Hibbits }
1194852ba100SJustin Hibbits 
FmHcPcdSync(t_Handle h_FmHc)1195852ba100SJustin Hibbits t_Error FmHcPcdSync(t_Handle h_FmHc)
1196852ba100SJustin Hibbits {
1197852ba100SJustin Hibbits     t_FmHc                  *p_FmHc = (t_FmHc*)h_FmHc;
1198852ba100SJustin Hibbits     t_HcFrame               *p_HcFrame;
1199852ba100SJustin Hibbits     t_DpaaFD                fmFd;
1200852ba100SJustin Hibbits     t_Error                 err = E_OK;
1201852ba100SJustin Hibbits     uint32_t                seqNum;
1202852ba100SJustin Hibbits 
1203852ba100SJustin Hibbits     ASSERT_COND(p_FmHc);
1204852ba100SJustin Hibbits 
1205852ba100SJustin Hibbits     p_HcFrame = GetBuf(p_FmHc, &seqNum);
1206852ba100SJustin Hibbits     if (!p_HcFrame)
1207852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
1208852ba100SJustin Hibbits     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1209852ba100SJustin Hibbits     /* first read SP register */
1210852ba100SJustin Hibbits     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_SYNC);
1211852ba100SJustin Hibbits     p_HcFrame->actionReg = 0;
1212852ba100SJustin Hibbits     p_HcFrame->extraReg = 0;
1213852ba100SJustin Hibbits     p_HcFrame->commandSequence = seqNum;
1214852ba100SJustin Hibbits 
1215852ba100SJustin Hibbits     BUILD_FD(sizeof(t_HcFrame));
1216852ba100SJustin Hibbits 
1217852ba100SJustin Hibbits     err = EnQFrm(p_FmHc, &fmFd, seqNum);
1218852ba100SJustin Hibbits 
1219852ba100SJustin Hibbits     PutBuf(p_FmHc, p_HcFrame, seqNum);
1220852ba100SJustin Hibbits 
1221852ba100SJustin Hibbits     if (err != E_OK)
1222852ba100SJustin Hibbits         RETURN_ERROR(MINOR, err, NO_MSG);
1223852ba100SJustin Hibbits 
1224852ba100SJustin Hibbits     return E_OK;
1225852ba100SJustin Hibbits }
1226852ba100SJustin Hibbits 
FmHcGetPort(t_Handle h_FmHc)1227852ba100SJustin Hibbits t_Handle    FmHcGetPort(t_Handle h_FmHc)
1228852ba100SJustin Hibbits {
1229852ba100SJustin Hibbits     t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
1230852ba100SJustin Hibbits     return p_FmHc->h_HcPortDev;
1231852ba100SJustin Hibbits }
1232