xref: /freebsd/sys/contrib/ncsw/Peripherals/FM/HC/hc.c (revision fe75646a0234a261c0013bf1840fdac4acaf0cec)
1 /*
2  * Copyright 2008-2012 Freescale Semiconductor Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above copyright
9  *       notice, this list of conditions and the following disclaimer in the
10  *       documentation and/or other materials provided with the distribution.
11  *     * Neither the name of Freescale Semiconductor nor the
12  *       names of its contributors may be used to endorse or promote products
13  *       derived from this software without specific prior written permission.
14  *
15  *
16  * ALTERNATIVELY, this software may be distributed under the terms of the
17  * GNU General Public License ("GPL") as published by the Free Software
18  * Foundation, either version 2 of that License or (at your option) any
19  * later version.
20  *
21  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 
34 #include "std_ext.h"
35 #include "error_ext.h"
36 #include "sprint_ext.h"
37 #include "string_ext.h"
38 
39 #include "fm_common.h"
40 #include "fm_hc.h"
41 
42 
43 /**************************************************************************//**
44  @Description       defaults
45 *//***************************************************************************/
46 #define DEFAULT_dataMemId                                       0
47 
48 #define HC_HCOR_OPCODE_PLCR_PRFL                                0x0
49 #define HC_HCOR_OPCODE_KG_SCM                                   0x1
50 #define HC_HCOR_OPCODE_SYNC                                     0x2
51 #define HC_HCOR_OPCODE_CC                                       0x3
52 #define HC_HCOR_OPCODE_CC_AGE_MASK                              0x4
53 #define HC_HCOR_OPCODE_CC_CAPWAP_REASSM_TIMEOUT                 0x5
54 #define HC_HCOR_OPCODE_CC_REASSM_TIMEOUT                        0x10
55 #define HC_HCOR_OPCODE_CC_IP_FRAG_INITIALIZATION                0x11
56 #define HC_HCOR_OPCODE_CC_UPDATE_WITH_AGING                     0x13
57 #define HC_HCOR_ACTION_REG_REASSM_TIMEOUT_ACTIVE_SHIFT          24
58 #define HC_HCOR_EXTRA_REG_REASSM_TIMEOUT_TSBS_SHIFT             24
59 #define HC_HCOR_EXTRA_REG_CC_AGING_ADD                          0x80000000
60 #define HC_HCOR_EXTRA_REG_CC_AGING_REMOVE                       0x40000000
61 #define HC_HCOR_EXTRA_REG_CC_AGING_CHANGE_MASK                  0xC0000000
62 #define HC_HCOR_EXTRA_REG_CC_REMOVE_INDX_SHIFT                  24
63 #define HC_HCOR_EXTRA_REG_CC_REMOVE_INDX_MASK                   0x1F000000
64 #define HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_SHIFT             16
65 #define HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_MASK              0xF
66 #define HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_CMD_SHIFT       24
67 #define HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_BPID            16
68 
69 #define HC_HCOR_GBL                         0x20000000
70 
71 #define HC_HCOR_KG_SCHEME_COUNTER           0x00000400
72 
73 #if (DPAA_VERSION == 10)
74 #define HC_HCOR_KG_SCHEME_REGS_MASK         0xFFFFF800
75 #else
76 #define HC_HCOR_KG_SCHEME_REGS_MASK         0xFFFFFE00
77 #endif /* (DPAA_VERSION == 10) */
78 
79 #define SIZE_OF_HC_FRAME_PORT_REGS          (sizeof(t_HcFrame)-sizeof(struct fman_kg_scheme_regs)+sizeof(t_FmPcdKgPortRegs))
80 #define SIZE_OF_HC_FRAME_SCHEME_REGS        sizeof(t_HcFrame)
81 #define SIZE_OF_HC_FRAME_PROFILES_REGS      (sizeof(t_HcFrame)-sizeof(struct fman_kg_scheme_regs)+sizeof(t_FmPcdPlcrProfileRegs))
82 #define SIZE_OF_HC_FRAME_PROFILE_CNT        (sizeof(t_HcFrame)-sizeof(t_FmPcdPlcrProfileRegs)+sizeof(uint32_t))
83 #define SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC 16
84 
85 #define HC_CMD_POOL_SIZE                    (INTG_MAX_NUM_OF_CORES)
86 
87 #define BUILD_FD(len)                     \
88 do {                                      \
89     memset(&fmFd, 0, sizeof(t_DpaaFD));   \
90     DPAA_FD_SET_ADDR(&fmFd, p_HcFrame);   \
91     DPAA_FD_SET_OFFSET(&fmFd, 0);         \
92     DPAA_FD_SET_LENGTH(&fmFd, len);       \
93 } while (0)
94 
95 
96 #if defined(__MWERKS__) && !defined(__GNUC__)
97 #pragma pack(push,1)
98 #endif /* defined(__MWERKS__) && ... */
99 
100 typedef struct t_FmPcdKgPortRegs {
101     volatile uint32_t                       spReg;
102     volatile uint32_t                       cppReg;
103 } t_FmPcdKgPortRegs;
104 
105 typedef struct t_HcFrame {
106     volatile uint32_t                           opcode;
107     volatile uint32_t                           actionReg;
108     volatile uint32_t                           extraReg;
109     volatile uint32_t                           commandSequence;
110     union {
111         struct fman_kg_scheme_regs              schemeRegs;
112         struct fman_kg_scheme_regs              schemeRegsWithoutCounter;
113         t_FmPcdPlcrProfileRegs                  profileRegs;
114         volatile uint32_t                       singleRegForWrite;    /* for writing SP, CPP, profile counter */
115         t_FmPcdKgPortRegs                       portRegsForRead;
116         volatile uint32_t                       clsPlanEntries[CLS_PLAN_NUM_PER_GRP];
117         t_FmPcdCcCapwapReassmTimeoutParams      ccCapwapReassmTimeout;
118         t_FmPcdCcReassmTimeoutParams            ccReassmTimeout;
119     } hcSpecificData;
120 } t_HcFrame;
121 
122 #if defined(__MWERKS__) && !defined(__GNUC__)
123 #pragma pack(pop)
124 #endif /* defined(__MWERKS__) && ... */
125 
126 
127 typedef struct t_FmHc {
128     t_Handle                    h_FmPcd;
129     t_Handle                    h_HcPortDev;
130     t_FmPcdQmEnqueueCallback    *f_QmEnqueue;     /**< A callback for enqueuing frames to the QM */
131     t_Handle                    h_QmArg;          /**< A handle to the QM module */
132     uint8_t                     dataMemId;        /**< Memory partition ID for data buffers */
133 
134     uint32_t                    seqNum[HC_CMD_POOL_SIZE];   /* FIFO of seqNum to use when
135                                                                taking buffer */
136     uint32_t                    nextSeqNumLocation;         /* seqNum location in seqNum[] for next buffer */
137     volatile bool               enqueued[HC_CMD_POOL_SIZE]; /* HC is active - frame is enqueued
138                                                                and not confirmed yet */
139     t_HcFrame                   *p_Frm[HC_CMD_POOL_SIZE];
140 } t_FmHc;
141 
142 
143 static t_Error FillBufPool(t_FmHc *p_FmHc)
144 {
145     uint32_t i;
146 
147     ASSERT_COND(p_FmHc);
148 
149     for (i = 0; i < HC_CMD_POOL_SIZE; i++)
150     {
151 #ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004
152         p_FmHc->p_Frm[i] = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + (16 - (sizeof(t_FmHc) % 16))),
153                                                        p_FmHc->dataMemId,
154                                                        16);
155 #else
156         p_FmHc->p_Frm[i] = (t_HcFrame *)XX_MallocSmart(sizeof(t_HcFrame),
157                                                        p_FmHc->dataMemId,
158                                                        16);
159 #endif /* FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004 */
160         if (!p_FmHc->p_Frm[i])
161             RETURN_ERROR(MAJOR, E_NO_MEMORY, ("FM HC frames!"));
162     }
163 
164     /* Initialize FIFO of seqNum to use during GetBuf */
165     for (i = 0; i < HC_CMD_POOL_SIZE; i++)
166     {
167         p_FmHc->seqNum[i] = i;
168     }
169     p_FmHc->nextSeqNumLocation = 0;
170 
171     return E_OK;
172 }
173 
174 static __inline__ t_HcFrame * GetBuf(t_FmHc *p_FmHc, uint32_t *p_SeqNum)
175 {
176     uint32_t    intFlags;
177 
178     ASSERT_COND(p_FmHc);
179 
180     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
181 
182     if (p_FmHc->nextSeqNumLocation == HC_CMD_POOL_SIZE)
183     {
184         /* No more buffers */
185         FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
186         return NULL;
187     }
188 
189     *p_SeqNum = p_FmHc->seqNum[p_FmHc->nextSeqNumLocation];
190     p_FmHc->nextSeqNumLocation++;
191 
192     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
193     return p_FmHc->p_Frm[*p_SeqNum];
194 }
195 
196 static __inline__ void PutBuf(t_FmHc *p_FmHc, t_HcFrame *p_Buf, uint32_t seqNum)
197 {
198     uint32_t    intFlags;
199 
200     UNUSED(p_Buf);
201 
202     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
203     ASSERT_COND(p_FmHc->nextSeqNumLocation);
204     p_FmHc->nextSeqNumLocation--;
205     p_FmHc->seqNum[p_FmHc->nextSeqNumLocation] = seqNum;
206     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
207 }
208 
209 static __inline__ t_Error EnQFrm(t_FmHc *p_FmHc, t_DpaaFD *p_FmFd, uint32_t seqNum)
210 {
211     t_Error     err = E_OK;
212     uint32_t    intFlags;
213     uint32_t    timeout=100;
214 
215     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
216     ASSERT_COND(!p_FmHc->enqueued[seqNum]);
217     p_FmHc->enqueued[seqNum] = TRUE;
218     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
219     DBG(TRACE, ("Send Hc, SeqNum %d, buff@0x%x, fd offset 0x%x",
220                 seqNum,
221                 DPAA_FD_GET_ADDR(p_FmFd),
222                 DPAA_FD_GET_OFFSET(p_FmFd)));
223     err = p_FmHc->f_QmEnqueue(p_FmHc->h_QmArg, (void *)p_FmFd);
224     if (err)
225         RETURN_ERROR(MINOR, err, ("HC enqueue failed"));
226 
227     while (p_FmHc->enqueued[seqNum] && --timeout)
228         XX_UDelay(100);
229 
230     if (!timeout)
231         RETURN_ERROR(MINOR, E_TIMEOUT, ("HC Callback, timeout exceeded"));
232 
233     return err;
234 }
235 
236 
237 t_Handle FmHcConfigAndInit(t_FmHcParams *p_FmHcParams)
238 {
239     t_FmHc          *p_FmHc;
240     t_FmPortParams  fmPortParam;
241     t_Error         err;
242 
243     p_FmHc = (t_FmHc *)XX_Malloc(sizeof(t_FmHc));
244     if (!p_FmHc)
245     {
246         REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC obj"));
247         return NULL;
248     }
249     memset(p_FmHc,0,sizeof(t_FmHc));
250 
251     p_FmHc->h_FmPcd             = p_FmHcParams->h_FmPcd;
252     p_FmHc->f_QmEnqueue         = p_FmHcParams->params.f_QmEnqueue;
253     p_FmHc->h_QmArg             = p_FmHcParams->params.h_QmArg;
254     p_FmHc->dataMemId           = DEFAULT_dataMemId;
255 
256     err = FillBufPool(p_FmHc);
257     if (err != E_OK)
258     {
259         REPORT_ERROR(MAJOR, err, NO_MSG);
260         FmHcFree(p_FmHc);
261         return NULL;
262     }
263 
264     if (!FmIsMaster(p_FmHcParams->h_Fm))
265         return (t_Handle)p_FmHc;
266 
267     memset(&fmPortParam, 0, sizeof(fmPortParam));
268     fmPortParam.baseAddr    = p_FmHcParams->params.portBaseAddr;
269     fmPortParam.portType    = e_FM_PORT_TYPE_OH_HOST_COMMAND;
270     fmPortParam.portId      = p_FmHcParams->params.portId;
271     fmPortParam.liodnBase   = p_FmHcParams->params.liodnBase;
272     fmPortParam.h_Fm        = p_FmHcParams->h_Fm;
273 
274     fmPortParam.specificParams.nonRxParams.errFqid      = p_FmHcParams->params.errFqid;
275     fmPortParam.specificParams.nonRxParams.dfltFqid     = p_FmHcParams->params.confFqid;
276     fmPortParam.specificParams.nonRxParams.qmChannel    = p_FmHcParams->params.qmChannel;
277 
278     p_FmHc->h_HcPortDev = FM_PORT_Config(&fmPortParam);
279     if (!p_FmHc->h_HcPortDev)
280     {
281         REPORT_ERROR(MAJOR, E_INVALID_HANDLE, ("FM HC port!"));
282         XX_Free(p_FmHc);
283         return NULL;
284     }
285 
286     err = FM_PORT_ConfigMaxFrameLength(p_FmHc->h_HcPortDev,
287                                        (uint16_t)sizeof(t_HcFrame));
288 
289     if (err != E_OK)
290     {
291         REPORT_ERROR(MAJOR, err, ("FM HC port init!"));
292         FmHcFree(p_FmHc);
293         return NULL;
294     }
295 
296     /* final init */
297     err = FM_PORT_Init(p_FmHc->h_HcPortDev);
298     if (err != E_OK)
299     {
300         REPORT_ERROR(MAJOR, err, ("FM HC port init!"));
301         FmHcFree(p_FmHc);
302         return NULL;
303     }
304 
305     err = FM_PORT_Enable(p_FmHc->h_HcPortDev);
306     if (err != E_OK)
307     {
308         REPORT_ERROR(MAJOR, err, ("FM HC port enable!"));
309         FmHcFree(p_FmHc);
310         return NULL;
311     }
312 
313     return (t_Handle)p_FmHc;
314 }
315 
316 void FmHcFree(t_Handle h_FmHc)
317 {
318     t_FmHc  *p_FmHc = (t_FmHc*)h_FmHc;
319     int     i;
320 
321     if (!p_FmHc)
322         return;
323 
324     for (i=0; i<HC_CMD_POOL_SIZE; i++)
325         if (p_FmHc->p_Frm[i])
326             XX_FreeSmart(p_FmHc->p_Frm[i]);
327         else
328             break;
329 
330     if (p_FmHc->h_HcPortDev)
331         FM_PORT_Free(p_FmHc->h_HcPortDev);
332 
333     XX_Free(p_FmHc);
334 }
335 
336 /*****************************************************************************/
337 t_Error FmHcSetFramesDataMemory(t_Handle h_FmHc,
338                                 uint8_t  memId)
339 {
340     t_FmHc  *p_FmHc = (t_FmHc*)h_FmHc;
341     int     i;
342 
343     SANITY_CHECK_RETURN_ERROR(p_FmHc, E_INVALID_HANDLE);
344 
345     p_FmHc->dataMemId            = memId;
346 
347     for (i=0; i<HC_CMD_POOL_SIZE; i++)
348         if (p_FmHc->p_Frm[i])
349             XX_FreeSmart(p_FmHc->p_Frm[i]);
350 
351     return FillBufPool(p_FmHc);
352 }
353 
354 void FmHcTxConf(t_Handle h_FmHc, t_DpaaFD *p_Fd)
355 {
356     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
357     t_HcFrame   *p_HcFrame;
358     uint32_t    intFlags;
359 
360     ASSERT_COND(p_FmHc);
361 
362     intFlags = FmPcdLock(p_FmHc->h_FmPcd);
363     p_HcFrame  = (t_HcFrame *)PTR_MOVE(DPAA_FD_GET_ADDR(p_Fd), DPAA_FD_GET_OFFSET(p_Fd));
364 
365     DBG(TRACE, ("Hc Conf, SeqNum %d, FD@0x%x, fd offset 0x%x",
366                 p_HcFrame->commandSequence, DPAA_FD_GET_ADDR(p_Fd), DPAA_FD_GET_OFFSET(p_Fd)));
367 
368     if (!(p_FmHc->enqueued[p_HcFrame->commandSequence]))
369         REPORT_ERROR(MINOR, E_INVALID_FRAME, ("Not an Host-Command frame received!"));
370     else
371         p_FmHc->enqueued[p_HcFrame->commandSequence] = FALSE;
372     FmPcdUnlock(p_FmHc->h_FmPcd, intFlags);
373 }
374 
375 t_Error FmHcPcdKgSetScheme(t_Handle                    h_FmHc,
376                            t_Handle                    h_Scheme,
377                            struct fman_kg_scheme_regs  *p_SchemeRegs,
378                            bool                        updateCounter)
379 {
380     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
381     t_Error                             err = E_OK;
382     t_HcFrame                           *p_HcFrame;
383     t_DpaaFD                            fmFd;
384     uint8_t                             physicalSchemeId;
385     uint32_t                            seqNum;
386 
387     p_HcFrame = GetBuf(p_FmHc, &seqNum);
388     if (!p_HcFrame)
389         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
390 
391     physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
392 
393     memset(p_HcFrame, 0, sizeof(t_HcFrame));
394     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
395     p_HcFrame->actionReg  = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, updateCounter);
396     p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
397     memcpy(&p_HcFrame->hcSpecificData.schemeRegs, p_SchemeRegs, sizeof(struct fman_kg_scheme_regs));
398     if (!updateCounter)
399     {
400         p_HcFrame->hcSpecificData.schemeRegs.kgse_dv0   = p_SchemeRegs->kgse_dv0;
401         p_HcFrame->hcSpecificData.schemeRegs.kgse_dv1   = p_SchemeRegs->kgse_dv1;
402         p_HcFrame->hcSpecificData.schemeRegs.kgse_ccbs  = p_SchemeRegs->kgse_ccbs;
403         p_HcFrame->hcSpecificData.schemeRegs.kgse_mv    = p_SchemeRegs->kgse_mv;
404     }
405     p_HcFrame->commandSequence = seqNum;
406 
407     BUILD_FD(sizeof(t_HcFrame));
408 
409     err = EnQFrm(p_FmHc, &fmFd, seqNum);
410 
411     PutBuf(p_FmHc, p_HcFrame, seqNum);
412 
413     if (err != E_OK)
414         RETURN_ERROR(MINOR, err, NO_MSG);
415 
416     return E_OK;
417 }
418 
419 t_Error FmHcPcdKgDeleteScheme(t_Handle h_FmHc, t_Handle h_Scheme)
420 {
421     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
422     t_Error     err = E_OK;
423     t_HcFrame   *p_HcFrame;
424     t_DpaaFD    fmFd;
425     uint8_t     physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
426     uint32_t    seqNum;
427 
428     p_HcFrame = GetBuf(p_FmHc, &seqNum);
429     if (!p_HcFrame)
430         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
431 
432     memset(p_HcFrame, 0, sizeof(t_HcFrame));
433     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
434     p_HcFrame->actionReg  = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE);
435     p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
436     memset(&p_HcFrame->hcSpecificData.schemeRegs, 0, sizeof(struct fman_kg_scheme_regs));
437     p_HcFrame->commandSequence = seqNum;
438 
439     BUILD_FD(sizeof(t_HcFrame));
440 
441     err = EnQFrm(p_FmHc, &fmFd, seqNum);
442 
443     PutBuf(p_FmHc, p_HcFrame, seqNum);
444 
445     if (err != E_OK)
446         RETURN_ERROR(MINOR, err, NO_MSG);
447 
448     return E_OK;
449 }
450 
451 t_Error FmHcPcdKgCcGetSetParams(t_Handle h_FmHc, t_Handle  h_Scheme, uint32_t requiredAction, uint32_t value)
452 {
453     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
454     t_Error     err = E_OK;
455     t_HcFrame   *p_HcFrame;
456     t_DpaaFD    fmFd;
457     uint8_t     relativeSchemeId;
458     uint8_t     physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
459     uint32_t    tmpReg32 = 0;
460     uint32_t    seqNum;
461 
462     /* Scheme is locked by calling routine */
463     /* WARNING - this lock will not be efficient if other HC routine will attempt to change
464      * "kgse_mode" or "kgse_om" without locking scheme !
465      */
466 
467     relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
468     if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
469         RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
470 
471     if (!FmPcdKgGetRequiredActionFlag(p_FmHc->h_FmPcd, relativeSchemeId) ||
472        !(FmPcdKgGetRequiredAction(p_FmHc->h_FmPcd, relativeSchemeId) & requiredAction))
473     {
474         if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) &&
475             (FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_PLCR))
476             {
477                 if ((FmPcdKgIsDirectPlcr(p_FmHc->h_FmPcd, relativeSchemeId) == FALSE) ||
478                     (FmPcdKgIsDistrOnPlcrProfile(p_FmHc->h_FmPcd, relativeSchemeId) == TRUE))
479                     RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("In this situation PP can not be with distribution and has to be shared"));
480                 err = FmPcdPlcrCcGetSetParams(p_FmHc->h_FmPcd, FmPcdKgGetRelativeProfileId(p_FmHc->h_FmPcd, relativeSchemeId), requiredAction);
481                 if (err)
482                     RETURN_ERROR(MAJOR, err, NO_MSG);
483             }
484         else /* From here we deal with KG-Schemes only */
485         {
486             /* Pre change general code */
487             p_HcFrame = GetBuf(p_FmHc, &seqNum);
488             if (!p_HcFrame)
489                 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
490             memset(p_HcFrame, 0, sizeof(t_HcFrame));
491             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
492             p_HcFrame->actionReg  = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
493             p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
494             p_HcFrame->commandSequence = seqNum;
495             BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
496             if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
497             {
498                 PutBuf(p_FmHc, p_HcFrame, seqNum);
499                 RETURN_ERROR(MINOR, err, NO_MSG);
500             }
501 
502             /* specific change */
503             if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) &&
504                 ((FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_DONE) &&
505                  (FmPcdKgGetDoneAction(p_FmHc->h_FmPcd, relativeSchemeId) ==  e_FM_PCD_ENQ_FRAME)))
506             {
507                 tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode;
508                 ASSERT_COND(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME));
509                 p_HcFrame->hcSpecificData.schemeRegs.kgse_mode =  tmpReg32 | NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
510             }
511 
512             if ((requiredAction & UPDATE_KG_NIA_CC_WA) &&
513                 (FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_CC))
514             {
515                 tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode;
516                 ASSERT_COND(tmpReg32 & (NIA_ENG_FM_CTL | NIA_FM_CTL_AC_CC));
517                 tmpReg32 &= ~NIA_FM_CTL_AC_CC;
518                 p_HcFrame->hcSpecificData.schemeRegs.kgse_mode =  tmpReg32 | NIA_FM_CTL_AC_PRE_CC;
519             }
520 
521             if (requiredAction & UPDATE_KG_OPT_MODE)
522                 p_HcFrame->hcSpecificData.schemeRegs.kgse_om = value;
523 
524             if (requiredAction & UPDATE_KG_NIA)
525             {
526                 tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode;
527                 tmpReg32 &= ~(NIA_ENG_MASK | NIA_AC_MASK);
528                 tmpReg32 |= value;
529                 p_HcFrame->hcSpecificData.schemeRegs.kgse_mode = tmpReg32;
530             }
531 
532             /* Post change general code */
533             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
534             p_HcFrame->actionReg  = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
535             p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
536 
537             BUILD_FD(sizeof(t_HcFrame));
538             err = EnQFrm(p_FmHc, &fmFd, seqNum);
539 
540             PutBuf(p_FmHc, p_HcFrame, seqNum);
541 
542             if (err != E_OK)
543                 RETURN_ERROR(MINOR, err, NO_MSG);
544         }
545     }
546 
547     return E_OK;
548 }
549 
550 uint32_t  FmHcPcdKgGetSchemeCounter(t_Handle h_FmHc, t_Handle h_Scheme)
551 {
552     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
553     t_Error     err;
554     t_HcFrame   *p_HcFrame;
555     t_DpaaFD    fmFd;
556     uint32_t    retVal;
557     uint8_t     relativeSchemeId;
558     uint8_t     physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
559     uint32_t    seqNum;
560 
561     relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
562     if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
563     {
564         REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
565         return 0;
566     }
567 
568     /* first read scheme and check that it is valid */
569     p_HcFrame = GetBuf(p_FmHc, &seqNum);
570     if (!p_HcFrame)
571     {
572         REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
573         return 0;
574     }
575     memset(p_HcFrame, 0, sizeof(t_HcFrame));
576     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
577     p_HcFrame->actionReg  = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
578     p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
579     p_HcFrame->commandSequence = seqNum;
580 
581     BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
582 
583     err = EnQFrm(p_FmHc, &fmFd, seqNum);
584     if (err != E_OK)
585     {
586         PutBuf(p_FmHc, p_HcFrame, seqNum);
587         REPORT_ERROR(MINOR, err, NO_MSG);
588         return 0;
589     }
590 
591     if (!FmPcdKgHwSchemeIsValid(p_HcFrame->hcSpecificData.schemeRegs.kgse_mode))
592     {
593         PutBuf(p_FmHc, p_HcFrame, seqNum);
594         REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is invalid"));
595         return 0;
596     }
597 
598     retVal = p_HcFrame->hcSpecificData.schemeRegs.kgse_spc;
599     PutBuf(p_FmHc, p_HcFrame, seqNum);
600 
601     return retVal;
602 }
603 
604 t_Error  FmHcPcdKgSetSchemeCounter(t_Handle h_FmHc, t_Handle h_Scheme, uint32_t value)
605 {
606     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
607     t_Error     err = E_OK;
608     t_HcFrame   *p_HcFrame;
609     t_DpaaFD    fmFd;
610     uint8_t     relativeSchemeId, physicalSchemeId;
611     uint32_t    seqNum;
612 
613     physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme);
614     relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId);
615     if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
616         RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
617 
618     /* first read scheme and check that it is valid */
619     p_HcFrame = GetBuf(p_FmHc, &seqNum);
620     if (!p_HcFrame)
621         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
622     memset(p_HcFrame, 0, sizeof(t_HcFrame));
623     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
624     p_HcFrame->actionReg  = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE);
625     p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_COUNTER;
626     /* write counter */
627     p_HcFrame->hcSpecificData.singleRegForWrite = value;
628     p_HcFrame->commandSequence = seqNum;
629 
630     BUILD_FD(sizeof(t_HcFrame));
631 
632     err = EnQFrm(p_FmHc, &fmFd, seqNum);
633 
634     PutBuf(p_FmHc, p_HcFrame, seqNum);
635     return err;
636 }
637 
638 t_Error FmHcPcdKgSetClsPlan(t_Handle h_FmHc, t_FmPcdKgInterModuleClsPlanSet *p_Set)
639 {
640     t_FmHc                  *p_FmHc = (t_FmHc*)h_FmHc;
641     t_HcFrame               *p_HcFrame;
642     t_DpaaFD                fmFd;
643     uint8_t                 i, idx;
644     uint32_t                seqNum;
645     t_Error                 err = E_OK;
646 
647     ASSERT_COND(p_FmHc);
648 
649     p_HcFrame = GetBuf(p_FmHc, &seqNum);
650     if (!p_HcFrame)
651         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
652 
653     for (i = p_Set->baseEntry; i < (p_Set->baseEntry+p_Set->numOfClsPlanEntries); i+=8)
654     {
655         memset(p_HcFrame, 0, sizeof(t_HcFrame));
656         p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
657         p_HcFrame->actionReg  = FmPcdKgBuildWriteClsPlanBlockActionReg((uint8_t)(i / CLS_PLAN_NUM_PER_GRP));
658         p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
659 
660         idx = (uint8_t)(i - p_Set->baseEntry);
661         memcpy(__DEVOLATILE(uint32_t *, &p_HcFrame->hcSpecificData.clsPlanEntries), &p_Set->vectors[idx], CLS_PLAN_NUM_PER_GRP*sizeof(uint32_t));
662         p_HcFrame->commandSequence = seqNum;
663 
664         BUILD_FD(sizeof(t_HcFrame));
665 
666         if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
667         {
668             PutBuf(p_FmHc, p_HcFrame, seqNum);
669             RETURN_ERROR(MINOR, err, NO_MSG);
670         }
671     }
672 
673     PutBuf(p_FmHc, p_HcFrame, seqNum);
674     return err;
675 }
676 
677 t_Error FmHcPcdKgDeleteClsPlan(t_Handle h_FmHc, uint8_t  grpId)
678 {
679     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
680     t_FmPcdKgInterModuleClsPlanSet      *p_ClsPlanSet;
681 
682     p_ClsPlanSet = (t_FmPcdKgInterModuleClsPlanSet *)XX_Malloc(sizeof(t_FmPcdKgInterModuleClsPlanSet));
683     if (!p_ClsPlanSet)
684         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Classification plan set"));
685 
686     memset(p_ClsPlanSet, 0, sizeof(t_FmPcdKgInterModuleClsPlanSet));
687 
688     p_ClsPlanSet->baseEntry = FmPcdKgGetClsPlanGrpBase(p_FmHc->h_FmPcd, grpId);
689     p_ClsPlanSet->numOfClsPlanEntries = FmPcdKgGetClsPlanGrpSize(p_FmHc->h_FmPcd, grpId);
690     ASSERT_COND(p_ClsPlanSet->numOfClsPlanEntries <= FM_PCD_MAX_NUM_OF_CLS_PLANS);
691 
692     if (FmHcPcdKgSetClsPlan(p_FmHc, p_ClsPlanSet) != E_OK)
693     {
694         XX_Free(p_ClsPlanSet);
695         RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
696     }
697 
698     XX_Free(p_ClsPlanSet);
699     FmPcdKgDestroyClsPlanGrp(p_FmHc->h_FmPcd, grpId);
700 
701     return E_OK;
702 }
703 
704 t_Error FmHcPcdCcCapwapTimeoutReassm(t_Handle h_FmHc, t_FmPcdCcCapwapReassmTimeoutParams *p_CcCapwapReassmTimeoutParams )
705 {
706     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
707     t_HcFrame                           *p_HcFrame;
708     t_DpaaFD                            fmFd;
709     t_Error                             err;
710     uint32_t                            seqNum;
711 
712     SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
713 
714     p_HcFrame = GetBuf(p_FmHc, &seqNum);
715     if (!p_HcFrame)
716         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
717 
718     memset(p_HcFrame, 0, sizeof(t_HcFrame));
719     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_CAPWAP_REASSM_TIMEOUT);
720     memcpy(&p_HcFrame->hcSpecificData.ccCapwapReassmTimeout, p_CcCapwapReassmTimeoutParams, sizeof(t_FmPcdCcCapwapReassmTimeoutParams));
721     p_HcFrame->commandSequence = seqNum;
722     BUILD_FD(sizeof(t_HcFrame));
723 
724     err = EnQFrm(p_FmHc, &fmFd, seqNum);
725 
726     PutBuf(p_FmHc, p_HcFrame, seqNum);
727     return err;
728 }
729 
730 t_Error FmHcPcdCcIpFragScratchPollCmd(t_Handle h_FmHc, bool fill, t_FmPcdCcFragScratchPoolCmdParams *p_FmPcdCcFragScratchPoolCmdParams)
731 {
732     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
733     t_HcFrame                           *p_HcFrame;
734     t_DpaaFD                            fmFd;
735     t_Error                             err;
736     uint32_t                            seqNum;
737 
738     SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
739 
740     p_HcFrame = GetBuf(p_FmHc, &seqNum);
741     if (!p_HcFrame)
742         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
743 
744     memset(p_HcFrame, 0, sizeof(t_HcFrame));
745 
746     p_HcFrame->opcode     = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_IP_FRAG_INITIALIZATION);
747     p_HcFrame->actionReg  = (uint32_t)(((fill == TRUE) ? 0 : 1) << HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_CMD_SHIFT);
748     p_HcFrame->actionReg |= p_FmPcdCcFragScratchPoolCmdParams->bufferPoolId << HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_BPID;
749     if (fill == TRUE)
750     {
751         p_HcFrame->extraReg   = p_FmPcdCcFragScratchPoolCmdParams->numOfBuffers;
752     }
753     p_HcFrame->commandSequence = seqNum;
754 
755     BUILD_FD(sizeof(t_HcFrame));
756     if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
757     {
758         PutBuf(p_FmHc, p_HcFrame, seqNum);
759         RETURN_ERROR(MINOR, err, NO_MSG);
760     }
761 
762     p_FmPcdCcFragScratchPoolCmdParams->numOfBuffers = p_HcFrame->extraReg;
763 
764     PutBuf(p_FmHc, p_HcFrame, seqNum);
765     return E_OK;
766 }
767 
768 t_Error FmHcPcdCcTimeoutReassm(t_Handle h_FmHc, t_FmPcdCcReassmTimeoutParams *p_CcReassmTimeoutParams, uint8_t *p_Result)
769 {
770     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
771     t_HcFrame                           *p_HcFrame;
772     t_DpaaFD                            fmFd;
773     t_Error                             err;
774     uint32_t                            seqNum;
775 
776     SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
777 
778     p_HcFrame = GetBuf(p_FmHc, &seqNum);
779     if (!p_HcFrame)
780         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
781 
782     memset(p_HcFrame, 0, sizeof(t_HcFrame));
783     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_REASSM_TIMEOUT);
784     p_HcFrame->actionReg = (uint32_t)((p_CcReassmTimeoutParams->activate ? 0 : 1) << HC_HCOR_ACTION_REG_REASSM_TIMEOUT_ACTIVE_SHIFT);
785     p_HcFrame->extraReg = (p_CcReassmTimeoutParams->tsbs << HC_HCOR_EXTRA_REG_REASSM_TIMEOUT_TSBS_SHIFT) | p_CcReassmTimeoutParams->iprcpt;
786     p_HcFrame->commandSequence = seqNum;
787 
788     BUILD_FD(sizeof(t_HcFrame));
789     if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
790     {
791         PutBuf(p_FmHc, p_HcFrame, seqNum);
792         RETURN_ERROR(MINOR, err, NO_MSG);
793     }
794 
795     *p_Result = (uint8_t)
796         ((p_HcFrame->actionReg >> HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_SHIFT) & HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_MASK);
797 
798     PutBuf(p_FmHc, p_HcFrame, seqNum);
799     return E_OK;
800 }
801 
802 t_Error FmHcPcdPlcrCcGetSetParams(t_Handle h_FmHc,uint16_t absoluteProfileId, uint32_t requiredAction)
803 {
804     t_FmHc              *p_FmHc = (t_FmHc*)h_FmHc;
805     t_HcFrame           *p_HcFrame;
806     t_DpaaFD            fmFd;
807     t_Error             err;
808     uint32_t            tmpReg32 = 0;
809     uint32_t            requiredActionTmp, requiredActionFlag;
810     uint32_t            seqNum;
811 
812     SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
813 
814     /* Profile is locked by calling routine */
815     /* WARNING - this lock will not be efficient if other HC routine will attempt to change
816      * "fmpl_pegnia" "fmpl_peynia" or "fmpl_pernia" without locking Profile !
817      */
818 
819     requiredActionTmp = FmPcdPlcrGetRequiredAction(p_FmHc->h_FmPcd, absoluteProfileId);
820     requiredActionFlag = FmPcdPlcrGetRequiredActionFlag(p_FmHc->h_FmPcd, absoluteProfileId);
821 
822     if (!requiredActionFlag || !(requiredActionTmp & requiredAction))
823     {
824         if (requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA)
825         {
826             p_HcFrame = GetBuf(p_FmHc, &seqNum);
827             if (!p_HcFrame)
828                 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
829             /* first read scheme and check that it is valid */
830             memset(p_HcFrame, 0, sizeof(t_HcFrame));
831             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
832             p_HcFrame->actionReg  = FmPcdPlcrBuildReadPlcrActionReg(absoluteProfileId);
833             p_HcFrame->extraReg = 0x00008000;
834             p_HcFrame->commandSequence = seqNum;
835 
836             BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
837 
838             if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
839             {
840                 PutBuf(p_FmHc, p_HcFrame, seqNum);
841                 RETURN_ERROR(MINOR, err, NO_MSG);
842             }
843 
844             tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_pegnia;
845             if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
846             {
847                 PutBuf(p_FmHc, p_HcFrame, seqNum);
848                 RETURN_ERROR(MAJOR, E_INVALID_STATE,
849                              ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
850             }
851 
852             tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
853 
854             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
855             p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
856             p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(TRUE, FALSE, FALSE);
857             p_HcFrame->extraReg = 0x00008000;
858             p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;
859 
860             BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
861 
862             if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
863             {
864                 PutBuf(p_FmHc, p_HcFrame, seqNum);
865                 RETURN_ERROR(MINOR, err, NO_MSG);
866             }
867 
868             tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_peynia;
869             if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
870             {
871                 PutBuf(p_FmHc, p_HcFrame, seqNum);
872                 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
873             }
874 
875             tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
876 
877             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
878             p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
879             p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(FALSE, TRUE, FALSE);
880             p_HcFrame->extraReg = 0x00008000;
881             p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;
882 
883             BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
884 
885             if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
886             {
887                 PutBuf(p_FmHc, p_HcFrame, seqNum);
888                 RETURN_ERROR(MINOR, err, NO_MSG);
889             }
890 
891             tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_pernia;
892             if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)))
893             {
894                 PutBuf(p_FmHc, p_HcFrame, seqNum);
895                 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE"));
896             }
897 
898             tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
899 
900             p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
901             p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
902             p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(FALSE, FALSE, TRUE);
903             p_HcFrame->extraReg = 0x00008000;
904             p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32;
905 
906             BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
907 
908             if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
909             {
910                 PutBuf(p_FmHc, p_HcFrame, seqNum);
911                 RETURN_ERROR(MINOR, err, NO_MSG);
912             }
913 
914             PutBuf(p_FmHc, p_HcFrame, seqNum);
915         }
916     }
917 
918     return E_OK;
919 }
920 
921 t_Error FmHcPcdPlcrSetProfile(t_Handle h_FmHc, t_Handle h_Profile, t_FmPcdPlcrProfileRegs *p_PlcrRegs)
922 {
923     t_FmHc                              *p_FmHc = (t_FmHc*)h_FmHc;
924     t_Error                             err = E_OK;
925     uint16_t                            profileIndx;
926     t_HcFrame                           *p_HcFrame;
927     t_DpaaFD                            fmFd;
928     uint32_t                            seqNum;
929 
930     p_HcFrame = GetBuf(p_FmHc, &seqNum);
931     if (!p_HcFrame)
932         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
933 
934     profileIndx = FmPcdPlcrProfileGetAbsoluteId(h_Profile);
935 
936     memset(p_HcFrame, 0, sizeof(t_HcFrame));
937     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
938     p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionRegs(profileIndx);
939     p_HcFrame->extraReg = 0x00008000;
940     memcpy(&p_HcFrame->hcSpecificData.profileRegs, p_PlcrRegs, sizeof(t_FmPcdPlcrProfileRegs));
941     p_HcFrame->commandSequence = seqNum;
942 
943     BUILD_FD(sizeof(t_HcFrame));
944 
945     err = EnQFrm(p_FmHc, &fmFd, seqNum);
946 
947     PutBuf(p_FmHc, p_HcFrame, seqNum);
948 
949     if (err != E_OK)
950         RETURN_ERROR(MINOR, err, NO_MSG);
951 
952     return E_OK;
953 }
954 
955 t_Error FmHcPcdPlcrDeleteProfile(t_Handle h_FmHc, t_Handle h_Profile)
956 {
957     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
958     uint16_t    absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile);
959     t_Error     err = E_OK;
960     t_HcFrame   *p_HcFrame;
961     t_DpaaFD    fmFd;
962     uint32_t    seqNum;
963 
964     p_HcFrame = GetBuf(p_FmHc, &seqNum);
965     if (!p_HcFrame)
966         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
967     memset(p_HcFrame, 0, sizeof(t_HcFrame));
968     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
969     p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
970     p_HcFrame->actionReg  |= 0x00008000;
971     p_HcFrame->extraReg = 0x00008000;
972     memset(&p_HcFrame->hcSpecificData.profileRegs, 0, sizeof(t_FmPcdPlcrProfileRegs));
973     p_HcFrame->commandSequence = seqNum;
974 
975     BUILD_FD(sizeof(t_HcFrame));
976 
977     err = EnQFrm(p_FmHc, &fmFd, seqNum);
978 
979     PutBuf(p_FmHc, p_HcFrame, seqNum);
980 
981     if (err != E_OK)
982         RETURN_ERROR(MINOR, err, NO_MSG);
983 
984     return E_OK;
985 }
986 
987 t_Error  FmHcPcdPlcrSetProfileCounter(t_Handle h_FmHc, t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter, uint32_t value)
988 {
989 
990     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
991     uint16_t    absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile);
992     t_Error     err = E_OK;
993     t_HcFrame   *p_HcFrame;
994     t_DpaaFD    fmFd;
995     uint32_t    seqNum;
996 
997     /* first read scheme and check that it is valid */
998     p_HcFrame = GetBuf(p_FmHc, &seqNum);
999     if (!p_HcFrame)
1000         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
1001     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1002     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
1003     p_HcFrame->actionReg  = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId);
1004     p_HcFrame->actionReg |= FmPcdPlcrBuildCounterProfileReg(counter);
1005     p_HcFrame->extraReg = 0x00008000;
1006     p_HcFrame->hcSpecificData.singleRegForWrite = value;
1007     p_HcFrame->commandSequence = seqNum;
1008 
1009     BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT);
1010 
1011     err = EnQFrm(p_FmHc, &fmFd, seqNum);
1012 
1013     PutBuf(p_FmHc, p_HcFrame, seqNum);
1014 
1015     if (err != E_OK)
1016         RETURN_ERROR(MINOR, err, NO_MSG);
1017 
1018     return E_OK;
1019 }
1020 
1021 uint32_t FmHcPcdPlcrGetProfileCounter(t_Handle h_FmHc, t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter)
1022 {
1023     t_FmHc      *p_FmHc = (t_FmHc*)h_FmHc;
1024     uint16_t    absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile);
1025     t_Error     err;
1026     t_HcFrame   *p_HcFrame;
1027     t_DpaaFD    fmFd;
1028     uint32_t    retVal = 0;
1029     uint32_t    seqNum;
1030 
1031     SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0);
1032 
1033     /* first read scheme and check that it is valid */
1034     p_HcFrame = GetBuf(p_FmHc, &seqNum);
1035     if (!p_HcFrame)
1036     {
1037         REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
1038         return 0;
1039     }
1040     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1041     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL);
1042     p_HcFrame->actionReg  = FmPcdPlcrBuildReadPlcrActionReg(absoluteProfileId);
1043     p_HcFrame->extraReg = 0x00008000;
1044     p_HcFrame->commandSequence = seqNum;
1045 
1046     BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
1047 
1048     err = EnQFrm(p_FmHc, &fmFd, seqNum);
1049     if (err != E_OK)
1050     {
1051         PutBuf(p_FmHc, p_HcFrame, seqNum);
1052         REPORT_ERROR(MINOR, err, NO_MSG);
1053         return 0;
1054     }
1055 
1056     switch (counter)
1057     {
1058         case e_FM_PCD_PLCR_PROFILE_GREEN_PACKET_TOTAL_COUNTER:
1059             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_pegpc;
1060             break;
1061         case e_FM_PCD_PLCR_PROFILE_YELLOW_PACKET_TOTAL_COUNTER:
1062             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_peypc;
1063             break;
1064         case e_FM_PCD_PLCR_PROFILE_RED_PACKET_TOTAL_COUNTER:
1065             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perpc;
1066             break;
1067         case e_FM_PCD_PLCR_PROFILE_RECOLOURED_YELLOW_PACKET_TOTAL_COUNTER:
1068             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perypc;
1069             break;
1070         case e_FM_PCD_PLCR_PROFILE_RECOLOURED_RED_PACKET_TOTAL_COUNTER:
1071             retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perrpc;
1072             break;
1073         default:
1074             REPORT_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
1075     }
1076 
1077     PutBuf(p_FmHc, p_HcFrame, seqNum);
1078     return retVal;
1079 }
1080 
1081 t_Error FmHcKgWriteSp(t_Handle h_FmHc, uint8_t hardwarePortId, uint32_t spReg, bool add)
1082 {
1083     t_FmHc                  *p_FmHc = (t_FmHc*)h_FmHc;
1084     t_HcFrame               *p_HcFrame;
1085     t_DpaaFD                fmFd;
1086     t_Error                 err = E_OK;
1087     uint32_t                seqNum;
1088 
1089     ASSERT_COND(p_FmHc);
1090 
1091     p_HcFrame = GetBuf(p_FmHc, &seqNum);
1092     if (!p_HcFrame)
1093         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
1094     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1095     /* first read SP register */
1096     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
1097     p_HcFrame->actionReg  = FmPcdKgBuildReadPortSchemeBindActionReg(hardwarePortId);
1098     p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
1099     p_HcFrame->commandSequence = seqNum;
1100 
1101     BUILD_FD(SIZE_OF_HC_FRAME_PORT_REGS);
1102 
1103     if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK)
1104     {
1105         PutBuf(p_FmHc, p_HcFrame, seqNum);
1106         RETURN_ERROR(MINOR, err, NO_MSG);
1107     }
1108 
1109     /* spReg is the first reg, so we can use it both for read and for write */
1110     if (add)
1111         p_HcFrame->hcSpecificData.portRegsForRead.spReg |= spReg;
1112     else
1113         p_HcFrame->hcSpecificData.portRegsForRead.spReg &= ~spReg;
1114 
1115     p_HcFrame->actionReg  = FmPcdKgBuildWritePortSchemeBindActionReg(hardwarePortId);
1116 
1117     BUILD_FD(sizeof(t_HcFrame));
1118 
1119     err = EnQFrm(p_FmHc, &fmFd, seqNum);
1120 
1121     PutBuf(p_FmHc, p_HcFrame, seqNum);
1122 
1123     if (err != E_OK)
1124         RETURN_ERROR(MINOR, err, NO_MSG);
1125 
1126     return E_OK;
1127 }
1128 
1129 t_Error FmHcKgWriteCpp(t_Handle h_FmHc, uint8_t hardwarePortId, uint32_t cppReg)
1130 {
1131     t_FmHc                  *p_FmHc = (t_FmHc*)h_FmHc;
1132     t_HcFrame               *p_HcFrame;
1133     t_DpaaFD                fmFd;
1134     t_Error                 err = E_OK;
1135     uint32_t                seqNum;
1136 
1137     ASSERT_COND(p_FmHc);
1138 
1139     p_HcFrame = GetBuf(p_FmHc, &seqNum);
1140     if (!p_HcFrame)
1141         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
1142     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1143     /* first read SP register */
1144     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM);
1145     p_HcFrame->actionReg  = FmPcdKgBuildWritePortClsPlanBindActionReg(hardwarePortId);
1146     p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK;
1147     p_HcFrame->hcSpecificData.singleRegForWrite = cppReg;
1148     p_HcFrame->commandSequence = seqNum;
1149 
1150     BUILD_FD(sizeof(t_HcFrame));
1151 
1152     err = EnQFrm(p_FmHc, &fmFd, seqNum);
1153 
1154     PutBuf(p_FmHc, p_HcFrame, seqNum);
1155 
1156     if (err != E_OK)
1157         RETURN_ERROR(MINOR, err, NO_MSG);
1158 
1159     return E_OK;
1160 }
1161 
1162 t_Error FmHcPcdCcDoDynamicChange(t_Handle h_FmHc, uint32_t oldAdAddrOffset, uint32_t newAdAddrOffset)
1163 {
1164     t_FmHc                  *p_FmHc = (t_FmHc*)h_FmHc;
1165     t_HcFrame               *p_HcFrame;
1166     t_DpaaFD                fmFd;
1167     t_Error                 err = E_OK;
1168     uint32_t                seqNum;
1169 
1170     SANITY_CHECK_RETURN_ERROR(p_FmHc, E_INVALID_HANDLE);
1171 
1172     p_HcFrame = GetBuf(p_FmHc, &seqNum);
1173     if (!p_HcFrame)
1174         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
1175     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1176 
1177     p_HcFrame->opcode     = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC);
1178     p_HcFrame->actionReg  = newAdAddrOffset;
1179     p_HcFrame->actionReg |= 0xc0000000;
1180     p_HcFrame->extraReg   = oldAdAddrOffset;
1181     p_HcFrame->commandSequence = seqNum;
1182 
1183     BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC);
1184 
1185     err = EnQFrm(p_FmHc, &fmFd, seqNum);
1186 
1187     PutBuf(p_FmHc, p_HcFrame, seqNum);
1188 
1189     if (err != E_OK)
1190         RETURN_ERROR(MAJOR, err, NO_MSG);
1191 
1192     return E_OK;
1193 }
1194 
1195 t_Error FmHcPcdSync(t_Handle h_FmHc)
1196 {
1197     t_FmHc                  *p_FmHc = (t_FmHc*)h_FmHc;
1198     t_HcFrame               *p_HcFrame;
1199     t_DpaaFD                fmFd;
1200     t_Error                 err = E_OK;
1201     uint32_t                seqNum;
1202 
1203     ASSERT_COND(p_FmHc);
1204 
1205     p_HcFrame = GetBuf(p_FmHc, &seqNum);
1206     if (!p_HcFrame)
1207         RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object"));
1208     memset(p_HcFrame, 0, sizeof(t_HcFrame));
1209     /* first read SP register */
1210     p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_SYNC);
1211     p_HcFrame->actionReg = 0;
1212     p_HcFrame->extraReg = 0;
1213     p_HcFrame->commandSequence = seqNum;
1214 
1215     BUILD_FD(sizeof(t_HcFrame));
1216 
1217     err = EnQFrm(p_FmHc, &fmFd, seqNum);
1218 
1219     PutBuf(p_FmHc, p_HcFrame, seqNum);
1220 
1221     if (err != E_OK)
1222         RETURN_ERROR(MINOR, err, NO_MSG);
1223 
1224     return E_OK;
1225 }
1226 
1227 t_Handle    FmHcGetPort(t_Handle h_FmHc)
1228 {
1229     t_FmHc *p_FmHc = (t_FmHc*)h_FmHc;
1230     return p_FmHc->h_HcPortDev;
1231 }
1232