xref: /freebsd/sys/contrib/ncsw/Peripherals/FM/Pcd/fm_cc.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 /******************************************************************************
350aeed3e9SJustin Hibbits  @File          fm_cc.c
360aeed3e9SJustin Hibbits 
37852ba100SJustin Hibbits  @Description   FM Coarse Classifier implementation
380aeed3e9SJustin Hibbits  *//***************************************************************************/
39852ba100SJustin Hibbits #include <sys/cdefs.h>
40852ba100SJustin Hibbits #include <sys/endian.h>
410aeed3e9SJustin Hibbits #include "std_ext.h"
420aeed3e9SJustin Hibbits #include "error_ext.h"
430aeed3e9SJustin Hibbits #include "string_ext.h"
440aeed3e9SJustin Hibbits #include "debug_ext.h"
450aeed3e9SJustin Hibbits #include "fm_pcd_ext.h"
460aeed3e9SJustin Hibbits #include "fm_muram_ext.h"
470aeed3e9SJustin Hibbits 
480aeed3e9SJustin Hibbits #include "fm_common.h"
49852ba100SJustin Hibbits #include "fm_pcd.h"
500aeed3e9SJustin Hibbits #include "fm_hc.h"
510aeed3e9SJustin Hibbits #include "fm_cc.h"
52852ba100SJustin Hibbits #include "crc64.h"
53852ba100SJustin Hibbits 
54852ba100SJustin Hibbits /****************************************/
55852ba100SJustin Hibbits /*       static functions               */
56852ba100SJustin Hibbits /****************************************/
570aeed3e9SJustin Hibbits 
580aeed3e9SJustin Hibbits 
CcRootTryLock(t_Handle h_FmPcdCcTree)59852ba100SJustin Hibbits static t_Error CcRootTryLock(t_Handle h_FmPcdCcTree)
600aeed3e9SJustin Hibbits {
61852ba100SJustin Hibbits     t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree;
620aeed3e9SJustin Hibbits 
63852ba100SJustin Hibbits     ASSERT_COND(h_FmPcdCcTree);
640aeed3e9SJustin Hibbits 
65852ba100SJustin Hibbits     if (FmPcdLockTryLock(p_FmPcdCcTree->p_Lock))
66852ba100SJustin Hibbits         return E_OK;
67852ba100SJustin Hibbits 
68852ba100SJustin Hibbits     return ERROR_CODE(E_BUSY);
690aeed3e9SJustin Hibbits }
700aeed3e9SJustin Hibbits 
CcRootReleaseLock(t_Handle h_FmPcdCcTree)71852ba100SJustin Hibbits static void CcRootReleaseLock(t_Handle h_FmPcdCcTree)
720aeed3e9SJustin Hibbits {
73852ba100SJustin Hibbits     t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree;
740aeed3e9SJustin Hibbits 
75852ba100SJustin Hibbits     ASSERT_COND(h_FmPcdCcTree);
760aeed3e9SJustin Hibbits 
77852ba100SJustin Hibbits     FmPcdLockUnlock(p_FmPcdCcTree->p_Lock);
780aeed3e9SJustin Hibbits }
790aeed3e9SJustin Hibbits 
UpdateNodeOwner(t_FmPcdCcNode * p_CcNode,bool add)80852ba100SJustin Hibbits static void UpdateNodeOwner(t_FmPcdCcNode *p_CcNode, bool add)
810aeed3e9SJustin Hibbits {
820aeed3e9SJustin Hibbits     uint32_t intFlags;
830aeed3e9SJustin Hibbits 
84852ba100SJustin Hibbits     ASSERT_COND(p_CcNode);
850aeed3e9SJustin Hibbits 
86852ba100SJustin Hibbits     intFlags = XX_LockIntrSpinlock(p_CcNode->h_Spinlock);
87852ba100SJustin Hibbits 
88852ba100SJustin Hibbits     if (add)
89852ba100SJustin Hibbits         p_CcNode->owners++;
90852ba100SJustin Hibbits     else
91852ba100SJustin Hibbits     {
92852ba100SJustin Hibbits         ASSERT_COND(p_CcNode->owners);
93852ba100SJustin Hibbits         p_CcNode->owners--;
94852ba100SJustin Hibbits     }
95852ba100SJustin Hibbits 
96852ba100SJustin Hibbits     XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
97852ba100SJustin Hibbits }
98852ba100SJustin Hibbits 
DequeueStatsObj(t_List * p_List)99852ba100SJustin Hibbits static __inline__ t_FmPcdStatsObj* DequeueStatsObj(t_List *p_List)
100852ba100SJustin Hibbits {
101852ba100SJustin Hibbits     t_FmPcdStatsObj *p_StatsObj = NULL;
102852ba100SJustin Hibbits     t_List *p_Next;
103852ba100SJustin Hibbits 
104852ba100SJustin Hibbits     if (!NCSW_LIST_IsEmpty(p_List))
105852ba100SJustin Hibbits     {
106852ba100SJustin Hibbits         p_Next = NCSW_LIST_FIRST(p_List);
107852ba100SJustin Hibbits         p_StatsObj = NCSW_LIST_OBJECT(p_Next, t_FmPcdStatsObj, node);
108852ba100SJustin Hibbits         ASSERT_COND(p_StatsObj);
109852ba100SJustin Hibbits         NCSW_LIST_DelAndInit(p_Next);
110852ba100SJustin Hibbits     }
111852ba100SJustin Hibbits 
112852ba100SJustin Hibbits     return p_StatsObj;
113852ba100SJustin Hibbits }
114852ba100SJustin Hibbits 
EnqueueStatsObj(t_List * p_List,t_FmPcdStatsObj * p_StatsObj)115852ba100SJustin Hibbits static __inline__ void EnqueueStatsObj(t_List *p_List,
116852ba100SJustin Hibbits                                        t_FmPcdStatsObj *p_StatsObj)
117852ba100SJustin Hibbits {
118852ba100SJustin Hibbits     NCSW_LIST_AddToTail(&p_StatsObj->node, p_List);
119852ba100SJustin Hibbits }
120852ba100SJustin Hibbits 
FreeStatObjects(t_List * p_List,t_Handle h_FmMuram)121852ba100SJustin Hibbits static void FreeStatObjects(t_List *p_List, t_Handle h_FmMuram)
122852ba100SJustin Hibbits {
123852ba100SJustin Hibbits     t_FmPcdStatsObj *p_StatsObj;
124852ba100SJustin Hibbits 
125852ba100SJustin Hibbits     while (!NCSW_LIST_IsEmpty(p_List))
126852ba100SJustin Hibbits     {
127852ba100SJustin Hibbits         p_StatsObj = DequeueStatsObj(p_List);
128852ba100SJustin Hibbits         ASSERT_COND(p_StatsObj);
129852ba100SJustin Hibbits 
130852ba100SJustin Hibbits         FM_MURAM_FreeMem(h_FmMuram, p_StatsObj->h_StatsAd);
131852ba100SJustin Hibbits         FM_MURAM_FreeMem(h_FmMuram, p_StatsObj->h_StatsCounters);
132852ba100SJustin Hibbits 
133852ba100SJustin Hibbits         XX_Free(p_StatsObj);
134852ba100SJustin Hibbits     }
135852ba100SJustin Hibbits }
136852ba100SJustin Hibbits 
GetStatsObj(t_FmPcdCcNode * p_CcNode)137852ba100SJustin Hibbits static t_FmPcdStatsObj* GetStatsObj(t_FmPcdCcNode *p_CcNode)
138852ba100SJustin Hibbits {
139852ba100SJustin Hibbits     t_FmPcdStatsObj* p_StatsObj;
140852ba100SJustin Hibbits     t_Handle h_FmMuram;
141852ba100SJustin Hibbits 
142852ba100SJustin Hibbits     ASSERT_COND(p_CcNode);
143852ba100SJustin Hibbits 
144852ba100SJustin Hibbits     /* If 'maxNumOfKeys' was passed, all statistics object were preallocated
145852ba100SJustin Hibbits      upon node initialization */
146852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
147852ba100SJustin Hibbits     {
148852ba100SJustin Hibbits         p_StatsObj = DequeueStatsObj(&p_CcNode->availableStatsLst);
1490aeed3e9SJustin Hibbits     }
1500aeed3e9SJustin Hibbits     else
1510aeed3e9SJustin Hibbits     {
152852ba100SJustin Hibbits         h_FmMuram = ((t_FmPcd *)(p_CcNode->h_FmPcd))->h_FmMuram;
153852ba100SJustin Hibbits         ASSERT_COND(h_FmMuram);
1540aeed3e9SJustin Hibbits 
155852ba100SJustin Hibbits         p_StatsObj = XX_Malloc(sizeof(t_FmPcdStatsObj));
156852ba100SJustin Hibbits         if (!p_StatsObj)
1570aeed3e9SJustin Hibbits         {
158852ba100SJustin Hibbits             REPORT_ERROR(MAJOR, E_NO_MEMORY, ("statistics object"));
1590aeed3e9SJustin Hibbits             return NULL;
1600aeed3e9SJustin Hibbits         }
1610aeed3e9SJustin Hibbits 
162852ba100SJustin Hibbits         p_StatsObj->h_StatsAd = (t_Handle)FM_MURAM_AllocMem(
163852ba100SJustin Hibbits                 h_FmMuram, FM_PCD_CC_AD_ENTRY_SIZE, FM_PCD_CC_AD_TABLE_ALIGN);
164852ba100SJustin Hibbits         if (!p_StatsObj->h_StatsAd)
1650aeed3e9SJustin Hibbits         {
166852ba100SJustin Hibbits             XX_Free(p_StatsObj);
167852ba100SJustin Hibbits             REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for statistics ADs"));
168852ba100SJustin Hibbits             return NULL;
169852ba100SJustin Hibbits         }
170852ba100SJustin Hibbits         MemSet8(p_StatsObj->h_StatsAd, 0, FM_PCD_CC_AD_ENTRY_SIZE);
171852ba100SJustin Hibbits 
172852ba100SJustin Hibbits         p_StatsObj->h_StatsCounters = (t_Handle)FM_MURAM_AllocMem(
173852ba100SJustin Hibbits                 h_FmMuram, p_CcNode->countersArraySize,
174852ba100SJustin Hibbits                 FM_PCD_CC_AD_TABLE_ALIGN);
175852ba100SJustin Hibbits         if (!p_StatsObj->h_StatsCounters)
176852ba100SJustin Hibbits         {
177852ba100SJustin Hibbits             FM_MURAM_FreeMem(h_FmMuram, p_StatsObj->h_StatsAd);
178852ba100SJustin Hibbits             XX_Free(p_StatsObj);
179852ba100SJustin Hibbits             REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for statistics counters"));
180852ba100SJustin Hibbits             return NULL;
181852ba100SJustin Hibbits         }
182852ba100SJustin Hibbits         MemSet8(p_StatsObj->h_StatsCounters, 0, p_CcNode->countersArraySize);
183852ba100SJustin Hibbits     }
184852ba100SJustin Hibbits 
185852ba100SJustin Hibbits     return p_StatsObj;
186852ba100SJustin Hibbits }
187852ba100SJustin Hibbits 
PutStatsObj(t_FmPcdCcNode * p_CcNode,t_FmPcdStatsObj * p_StatsObj)188852ba100SJustin Hibbits static void PutStatsObj(t_FmPcdCcNode *p_CcNode, t_FmPcdStatsObj *p_StatsObj)
189852ba100SJustin Hibbits {
190852ba100SJustin Hibbits     t_Handle h_FmMuram;
191852ba100SJustin Hibbits 
192852ba100SJustin Hibbits     ASSERT_COND(p_CcNode);
193852ba100SJustin Hibbits     ASSERT_COND(p_StatsObj);
194852ba100SJustin Hibbits 
195852ba100SJustin Hibbits     /* If 'maxNumOfKeys' was passed, all statistics object were preallocated
196852ba100SJustin Hibbits      upon node initialization and now will be enqueued back to the list */
197852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
198852ba100SJustin Hibbits     {
199852ba100SJustin Hibbits         /* Nullify counters */
200852ba100SJustin Hibbits         MemSet8(p_StatsObj->h_StatsCounters, 0, p_CcNode->countersArraySize);
201852ba100SJustin Hibbits 
202852ba100SJustin Hibbits         EnqueueStatsObj(&p_CcNode->availableStatsLst, p_StatsObj);
203852ba100SJustin Hibbits     }
204852ba100SJustin Hibbits     else
205852ba100SJustin Hibbits     {
206852ba100SJustin Hibbits         h_FmMuram = ((t_FmPcd *)(p_CcNode->h_FmPcd))->h_FmMuram;
207852ba100SJustin Hibbits         ASSERT_COND(h_FmMuram);
208852ba100SJustin Hibbits 
209852ba100SJustin Hibbits         FM_MURAM_FreeMem(h_FmMuram, p_StatsObj->h_StatsAd);
210852ba100SJustin Hibbits         FM_MURAM_FreeMem(h_FmMuram, p_StatsObj->h_StatsCounters);
211852ba100SJustin Hibbits 
212852ba100SJustin Hibbits         XX_Free(p_StatsObj);
213852ba100SJustin Hibbits     }
214852ba100SJustin Hibbits }
215852ba100SJustin Hibbits 
SetStatsCounters(t_AdOfTypeStats * p_StatsAd,uint32_t statsCountersAddr)216852ba100SJustin Hibbits static void SetStatsCounters(t_AdOfTypeStats *p_StatsAd,
217852ba100SJustin Hibbits                              uint32_t statsCountersAddr)
218852ba100SJustin Hibbits {
219852ba100SJustin Hibbits     uint32_t tmp = (statsCountersAddr & FM_PCD_AD_STATS_COUNTERS_ADDR_MASK);
220852ba100SJustin Hibbits 
221852ba100SJustin Hibbits     WRITE_UINT32(p_StatsAd->statsTableAddr, tmp);
222852ba100SJustin Hibbits }
223852ba100SJustin Hibbits 
224852ba100SJustin Hibbits 
UpdateStatsAd(t_FmPcdCcStatsParams * p_FmPcdCcStatsParams,t_Handle h_Ad,uint64_t physicalMuramBase)225852ba100SJustin Hibbits static void UpdateStatsAd(t_FmPcdCcStatsParams *p_FmPcdCcStatsParams,
226852ba100SJustin Hibbits                           t_Handle h_Ad, uint64_t physicalMuramBase)
227852ba100SJustin Hibbits {
228852ba100SJustin Hibbits     t_AdOfTypeStats *p_StatsAd;
229852ba100SJustin Hibbits     uint32_t statsCountersAddr, nextActionAddr, tmp;
230852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
231852ba100SJustin Hibbits     uint32_t frameLengthRangesAddr;
232852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
233852ba100SJustin Hibbits 
234852ba100SJustin Hibbits     p_StatsAd = (t_AdOfTypeStats *)p_FmPcdCcStatsParams->h_StatsAd;
235852ba100SJustin Hibbits 
236852ba100SJustin Hibbits     tmp = FM_PCD_AD_STATS_TYPE;
237852ba100SJustin Hibbits 
238852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
239852ba100SJustin Hibbits     if (p_FmPcdCcStatsParams->h_StatsFLRs)
240852ba100SJustin Hibbits     {
241852ba100SJustin Hibbits         frameLengthRangesAddr = (uint32_t)((XX_VirtToPhys(
242852ba100SJustin Hibbits                 p_FmPcdCcStatsParams->h_StatsFLRs) - physicalMuramBase));
243852ba100SJustin Hibbits         tmp |= (frameLengthRangesAddr & FM_PCD_AD_STATS_FLR_ADDR_MASK);
244852ba100SJustin Hibbits     }
245852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
246852ba100SJustin Hibbits     WRITE_UINT32(p_StatsAd->profileTableAddr, tmp);
247852ba100SJustin Hibbits 
248852ba100SJustin Hibbits     nextActionAddr = (uint32_t)((XX_VirtToPhys(h_Ad) - physicalMuramBase));
249852ba100SJustin Hibbits     tmp = 0;
250852ba100SJustin Hibbits     tmp |= (uint32_t)((nextActionAddr << FM_PCD_AD_STATS_NEXT_ACTION_SHIFT)
251852ba100SJustin Hibbits             & FM_PCD_AD_STATS_NEXT_ACTION_MASK);
252852ba100SJustin Hibbits     tmp |= (FM_PCD_AD_STATS_NAD_EN | FM_PCD_AD_STATS_OP_CODE);
253852ba100SJustin Hibbits 
254852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
255852ba100SJustin Hibbits     if (p_FmPcdCcStatsParams->h_StatsFLRs)
256852ba100SJustin Hibbits         tmp |= FM_PCD_AD_STATS_FLR_EN;
257852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
258852ba100SJustin Hibbits 
259852ba100SJustin Hibbits     WRITE_UINT32(p_StatsAd->nextActionIndx, tmp);
260852ba100SJustin Hibbits 
261852ba100SJustin Hibbits     statsCountersAddr = (uint32_t)((XX_VirtToPhys(
262852ba100SJustin Hibbits             p_FmPcdCcStatsParams->h_StatsCounters) - physicalMuramBase));
263852ba100SJustin Hibbits     SetStatsCounters(p_StatsAd, statsCountersAddr);
264852ba100SJustin Hibbits }
265852ba100SJustin Hibbits 
FillAdOfTypeContLookup(t_Handle h_Ad,t_FmPcdCcStatsParams * p_FmPcdCcStatsParams,t_Handle h_FmPcd,t_Handle p_CcNode,t_Handle h_Manip,t_Handle h_FrmReplic)266852ba100SJustin Hibbits static void FillAdOfTypeContLookup(t_Handle h_Ad,
267852ba100SJustin Hibbits                                    t_FmPcdCcStatsParams *p_FmPcdCcStatsParams,
268852ba100SJustin Hibbits                                    t_Handle h_FmPcd, t_Handle p_CcNode,
269852ba100SJustin Hibbits                                    t_Handle h_Manip, t_Handle h_FrmReplic)
270852ba100SJustin Hibbits {
271852ba100SJustin Hibbits     t_FmPcdCcNode *p_Node = (t_FmPcdCcNode *)p_CcNode;
272852ba100SJustin Hibbits     t_AdOfTypeContLookup *p_AdContLookup = (t_AdOfTypeContLookup *)h_Ad;
273852ba100SJustin Hibbits     t_Handle h_TmpAd;
274852ba100SJustin Hibbits     t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
275852ba100SJustin Hibbits     uint32_t tmpReg32;
276852ba100SJustin Hibbits     t_Handle p_AdNewPtr = NULL;
277852ba100SJustin Hibbits 
278852ba100SJustin Hibbits     UNUSED(h_Manip);
279852ba100SJustin Hibbits     UNUSED(h_FrmReplic);
280852ba100SJustin Hibbits 
281852ba100SJustin Hibbits     /* there are 3 cases handled in this routine of building a "Continue lookup" type AD.
282852ba100SJustin Hibbits      * Case 1: No Manip. The action descriptor is built within the match table.
283852ba100SJustin Hibbits      *         p_AdResult = p_AdNewPtr;
284852ba100SJustin Hibbits      * Case 2: Manip exists. A new AD is created - p_AdNewPtr. It is initialized
285852ba100SJustin Hibbits      *         either in the FmPcdManipUpdateAdResultForCc routine or it was already
286852ba100SJustin Hibbits      *         initialized and returned here.
287852ba100SJustin Hibbits      *         p_AdResult (within the match table) will be initialized after
288852ba100SJustin Hibbits      *         this routine returns and point to the existing AD.
289852ba100SJustin Hibbits      * Case 3: Manip exists. The action descriptor is built within the match table.
290852ba100SJustin Hibbits      *         FmPcdManipUpdateAdContLookupForCc returns a NULL p_AdNewPtr.
291852ba100SJustin Hibbits      */
292852ba100SJustin Hibbits 
293852ba100SJustin Hibbits     /* As default, the "new" ptr is the current one. i.e. the content of the result
294852ba100SJustin Hibbits      * AD will be written into the match table itself (case (1))*/
295852ba100SJustin Hibbits     p_AdNewPtr = p_AdContLookup;
296852ba100SJustin Hibbits 
297852ba100SJustin Hibbits     /* Initialize an action descriptor, if current statistics mode requires an Ad */
298852ba100SJustin Hibbits     if (p_FmPcdCcStatsParams)
299852ba100SJustin Hibbits     {
300852ba100SJustin Hibbits         ASSERT_COND(p_FmPcdCcStatsParams->h_StatsAd);
301852ba100SJustin Hibbits         ASSERT_COND(p_FmPcdCcStatsParams->h_StatsCounters);
302852ba100SJustin Hibbits 
303852ba100SJustin Hibbits         /* Swapping addresses between statistics Ad and the current lookup AD */
304852ba100SJustin Hibbits         h_TmpAd = p_FmPcdCcStatsParams->h_StatsAd;
305852ba100SJustin Hibbits         p_FmPcdCcStatsParams->h_StatsAd = h_Ad;
306852ba100SJustin Hibbits         h_Ad = h_TmpAd;
307852ba100SJustin Hibbits 
308852ba100SJustin Hibbits         p_AdNewPtr = h_Ad;
309852ba100SJustin Hibbits         p_AdContLookup = h_Ad;
310852ba100SJustin Hibbits 
311852ba100SJustin Hibbits         /* Init statistics Ad and connect current lookup AD as 'next action' from statistics Ad */
312852ba100SJustin Hibbits         UpdateStatsAd(p_FmPcdCcStatsParams, h_Ad, p_FmPcd->physicalMuramBase);
313852ba100SJustin Hibbits     }
314852ba100SJustin Hibbits 
315852ba100SJustin Hibbits #if DPAA_VERSION >= 11
316852ba100SJustin Hibbits     if (h_Manip && h_FrmReplic)
317852ba100SJustin Hibbits         FmPcdManipUpdateAdContLookupForCc(
318852ba100SJustin Hibbits                 h_Manip,
319852ba100SJustin Hibbits                 h_Ad,
320852ba100SJustin Hibbits                 &p_AdNewPtr,
321852ba100SJustin Hibbits                 (uint32_t)((XX_VirtToPhys(
322852ba100SJustin Hibbits                         FrmReplicGroupGetSourceTableDescriptor(h_FrmReplic))
323852ba100SJustin Hibbits                         - p_FmPcd->physicalMuramBase)));
324852ba100SJustin Hibbits     else
325852ba100SJustin Hibbits         if (h_FrmReplic)
326852ba100SJustin Hibbits             FrmReplicGroupUpdateAd(h_FrmReplic, h_Ad, &p_AdNewPtr);
327852ba100SJustin Hibbits         else
328852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
329852ba100SJustin Hibbits             if (h_Manip)
330852ba100SJustin Hibbits                 FmPcdManipUpdateAdContLookupForCc(
331852ba100SJustin Hibbits                         h_Manip,
332852ba100SJustin Hibbits                         h_Ad,
333852ba100SJustin Hibbits                         &p_AdNewPtr,
334852ba100SJustin Hibbits 
335852ba100SJustin Hibbits #ifdef FM_CAPWAP_SUPPORT
336852ba100SJustin Hibbits                         /*no check for opcode of manip - this step can be reached only with capwap_applic_specific*/
337852ba100SJustin Hibbits                         (uint32_t)((XX_VirtToPhys(p_Node->h_AdTable) - p_FmPcd->physicalMuramBase))
338852ba100SJustin Hibbits #else  /* not FM_CAPWAP_SUPPORT */
339852ba100SJustin Hibbits                         (uint32_t)((XX_VirtToPhys(p_Node->h_Ad)
340852ba100SJustin Hibbits                                 - p_FmPcd->physicalMuramBase))
341852ba100SJustin Hibbits #endif /* not FM_CAPWAP_SUPPORT */
342852ba100SJustin Hibbits                         );
343852ba100SJustin Hibbits 
344852ba100SJustin Hibbits     /* if (p_AdNewPtr = NULL) --> Done. (case (3)) */
345852ba100SJustin Hibbits     if (p_AdNewPtr)
346852ba100SJustin Hibbits     {
347852ba100SJustin Hibbits         /* cases (1) & (2) */
348852ba100SJustin Hibbits         tmpReg32 = 0;
349852ba100SJustin Hibbits         tmpReg32 |= FM_PCD_AD_CONT_LOOKUP_TYPE;
350852ba100SJustin Hibbits         tmpReg32 |=
351852ba100SJustin Hibbits                 p_Node->sizeOfExtraction ? ((p_Node->sizeOfExtraction - 1) << 24) :
352852ba100SJustin Hibbits                         0;
353852ba100SJustin Hibbits         tmpReg32 |= (uint32_t)(XX_VirtToPhys(p_Node->h_AdTable)
354852ba100SJustin Hibbits                 - p_FmPcd->physicalMuramBase);
355852ba100SJustin Hibbits         WRITE_UINT32(p_AdContLookup->ccAdBase, tmpReg32);
356852ba100SJustin Hibbits 
357852ba100SJustin Hibbits         tmpReg32 = 0;
358852ba100SJustin Hibbits         tmpReg32 |= p_Node->numOfKeys << 24;
359852ba100SJustin Hibbits         tmpReg32 |= (p_Node->lclMask ? FM_PCD_AD_CONT_LOOKUP_LCL_MASK : 0);
360852ba100SJustin Hibbits         tmpReg32 |=
361852ba100SJustin Hibbits                 p_Node->h_KeysMatchTable ? (uint32_t)(XX_VirtToPhys(
362852ba100SJustin Hibbits                         p_Node->h_KeysMatchTable) - p_FmPcd->physicalMuramBase) :
363852ba100SJustin Hibbits                         0;
364852ba100SJustin Hibbits         WRITE_UINT32(p_AdContLookup->matchTblPtr, tmpReg32);
365852ba100SJustin Hibbits 
366852ba100SJustin Hibbits         tmpReg32 = 0;
367852ba100SJustin Hibbits         tmpReg32 |= p_Node->prsArrayOffset << 24;
368852ba100SJustin Hibbits         tmpReg32 |= p_Node->offset << 16;
369852ba100SJustin Hibbits         tmpReg32 |= p_Node->parseCode;
370852ba100SJustin Hibbits         WRITE_UINT32(p_AdContLookup->pcAndOffsets, tmpReg32);
371852ba100SJustin Hibbits 
372852ba100SJustin Hibbits         MemCpy8((void*)&p_AdContLookup->gmask, p_Node->p_GlblMask,
373852ba100SJustin Hibbits                     CC_GLBL_MASK_SIZE);
374852ba100SJustin Hibbits     }
375852ba100SJustin Hibbits }
376852ba100SJustin Hibbits 
AllocAndFillAdForContLookupManip(t_Handle h_CcNode)377852ba100SJustin Hibbits static t_Error AllocAndFillAdForContLookupManip(t_Handle h_CcNode)
378852ba100SJustin Hibbits {
379852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
3800aeed3e9SJustin Hibbits     uint32_t intFlags;
3810aeed3e9SJustin Hibbits 
382852ba100SJustin Hibbits     ASSERT_COND(p_CcNode);
383852ba100SJustin Hibbits 
384852ba100SJustin Hibbits     intFlags = XX_LockIntrSpinlock(p_CcNode->h_Spinlock);
385852ba100SJustin Hibbits 
386852ba100SJustin Hibbits     if (!p_CcNode->h_Ad)
3870aeed3e9SJustin Hibbits     {
388852ba100SJustin Hibbits         if (p_CcNode->maxNumOfKeys)
389852ba100SJustin Hibbits             p_CcNode->h_Ad = p_CcNode->h_TmpAd;
390852ba100SJustin Hibbits         else
391852ba100SJustin Hibbits             p_CcNode->h_Ad = (t_Handle)FM_MURAM_AllocMem(
392852ba100SJustin Hibbits                     ((t_FmPcd *)(p_CcNode->h_FmPcd))->h_FmMuram,
393852ba100SJustin Hibbits                     FM_PCD_CC_AD_ENTRY_SIZE, FM_PCD_CC_AD_TABLE_ALIGN);
394852ba100SJustin Hibbits 
395852ba100SJustin Hibbits         XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
396852ba100SJustin Hibbits 
397852ba100SJustin Hibbits         if (!p_CcNode->h_Ad)
398852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_NO_MEMORY,
399852ba100SJustin Hibbits                          ("MURAM allocation for CC action descriptor"));
400852ba100SJustin Hibbits 
401852ba100SJustin Hibbits         MemSet8(p_CcNode->h_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);
402852ba100SJustin Hibbits 
403852ba100SJustin Hibbits         FillAdOfTypeContLookup(p_CcNode->h_Ad, NULL, p_CcNode->h_FmPcd,
404852ba100SJustin Hibbits                                p_CcNode, NULL, NULL);
405852ba100SJustin Hibbits     }
406852ba100SJustin Hibbits     else
407852ba100SJustin Hibbits         XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
408852ba100SJustin Hibbits 
409852ba100SJustin Hibbits     return E_OK;
4100aeed3e9SJustin Hibbits }
4110aeed3e9SJustin Hibbits 
SetRequiredAction1(t_Handle h_FmPcd,uint32_t requiredAction,t_FmPcdCcKeyAndNextEngineParams * p_CcKeyAndNextEngineParamsTmp,t_Handle h_AdTmp,uint16_t numOfEntries,t_Handle h_Tree)412852ba100SJustin Hibbits static t_Error SetRequiredAction1(
413852ba100SJustin Hibbits         t_Handle h_FmPcd, uint32_t requiredAction,
414852ba100SJustin Hibbits         t_FmPcdCcKeyAndNextEngineParams *p_CcKeyAndNextEngineParamsTmp,
4150aeed3e9SJustin Hibbits         t_Handle h_AdTmp, uint16_t numOfEntries, t_Handle h_Tree)
4160aeed3e9SJustin Hibbits {
4170aeed3e9SJustin Hibbits     t_AdOfTypeResult *p_AdTmp = (t_AdOfTypeResult *)h_AdTmp;
4180aeed3e9SJustin Hibbits     uint32_t tmpReg32;
4190aeed3e9SJustin Hibbits     t_Error err;
420852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode;
4210aeed3e9SJustin Hibbits     int i = 0;
4220aeed3e9SJustin Hibbits     uint16_t tmp = 0;
4230aeed3e9SJustin Hibbits     uint16_t profileId;
4240aeed3e9SJustin Hibbits     uint8_t relativeSchemeId, physicalSchemeId;
4250aeed3e9SJustin Hibbits     t_CcNodeInformation ccNodeInfo;
4260aeed3e9SJustin Hibbits 
4270aeed3e9SJustin Hibbits     for (i = 0; i < numOfEntries; i++)
4280aeed3e9SJustin Hibbits     {
4290aeed3e9SJustin Hibbits         if (i == 0)
4300aeed3e9SJustin Hibbits             h_AdTmp = PTR_MOVE(h_AdTmp, i*FM_PCD_CC_AD_ENTRY_SIZE);
4310aeed3e9SJustin Hibbits         else
4320aeed3e9SJustin Hibbits             h_AdTmp = PTR_MOVE(h_AdTmp, FM_PCD_CC_AD_ENTRY_SIZE);
4330aeed3e9SJustin Hibbits 
434852ba100SJustin Hibbits         switch (p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.nextEngine)
4350aeed3e9SJustin Hibbits         {
4360aeed3e9SJustin Hibbits             case (e_FM_PCD_CC):
4370aeed3e9SJustin Hibbits                 if (requiredAction)
4380aeed3e9SJustin Hibbits                 {
439852ba100SJustin Hibbits                     p_CcNode =
440852ba100SJustin Hibbits                             p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.ccParams.h_CcNode;
441852ba100SJustin Hibbits                     ASSERT_COND(p_CcNode);
442852ba100SJustin Hibbits                     if (p_CcNode->shadowAction == requiredAction)
4430aeed3e9SJustin Hibbits                         break;
444852ba100SJustin Hibbits                     if ((requiredAction & UPDATE_CC_WITH_TREE)
445852ba100SJustin Hibbits                             && !(p_CcNode->shadowAction & UPDATE_CC_WITH_TREE))
4460aeed3e9SJustin Hibbits                     {
4470aeed3e9SJustin Hibbits 
4480aeed3e9SJustin Hibbits                         memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
4490aeed3e9SJustin Hibbits                         ccNodeInfo.h_CcNode = h_Tree;
450852ba100SJustin Hibbits                         EnqueueNodeInfoToRelevantLst(&p_CcNode->ccTreesLst,
451852ba100SJustin Hibbits                                                      &ccNodeInfo, NULL);
452852ba100SJustin Hibbits                         p_CcKeyAndNextEngineParamsTmp[i].shadowAction |=
453852ba100SJustin Hibbits                                 UPDATE_CC_WITH_TREE;
4540aeed3e9SJustin Hibbits                     }
455852ba100SJustin Hibbits                     if ((requiredAction & UPDATE_CC_SHADOW_CLEAR)
456852ba100SJustin Hibbits                             && !(p_CcNode->shadowAction & UPDATE_CC_SHADOW_CLEAR))
4570aeed3e9SJustin Hibbits                     {
458852ba100SJustin Hibbits 
459852ba100SJustin Hibbits                         p_CcNode->shadowAction = 0;
4600aeed3e9SJustin Hibbits                     }
461852ba100SJustin Hibbits 
462852ba100SJustin Hibbits                     if ((requiredAction & UPDATE_CC_WITH_DELETE_TREE)
463852ba100SJustin Hibbits                             && !(p_CcNode->shadowAction
464852ba100SJustin Hibbits                                     & UPDATE_CC_WITH_DELETE_TREE))
465852ba100SJustin Hibbits                     {
466852ba100SJustin Hibbits                         DequeueNodeInfoFromRelevantLst(&p_CcNode->ccTreesLst,
467852ba100SJustin Hibbits                                                        h_Tree, NULL);
468852ba100SJustin Hibbits                         p_CcKeyAndNextEngineParamsTmp[i].shadowAction |=
469852ba100SJustin Hibbits                                 UPDATE_CC_WITH_DELETE_TREE;
470852ba100SJustin Hibbits                     }
471852ba100SJustin Hibbits                     if (p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.nextEngine
472852ba100SJustin Hibbits                             != e_FM_PCD_INVALID)
473852ba100SJustin Hibbits                         tmp = (uint8_t)(p_CcNode->numOfKeys + 1);
4740aeed3e9SJustin Hibbits                     else
475852ba100SJustin Hibbits                         tmp = p_CcNode->numOfKeys;
476852ba100SJustin Hibbits                     err = SetRequiredAction1(h_FmPcd, requiredAction,
477852ba100SJustin Hibbits                                              p_CcNode->keyAndNextEngineParams,
478852ba100SJustin Hibbits                                              p_CcNode->h_AdTable, tmp, h_Tree);
4790aeed3e9SJustin Hibbits                     if (err != E_OK)
4800aeed3e9SJustin Hibbits                         return err;
481852ba100SJustin Hibbits                     if (requiredAction != UPDATE_CC_SHADOW_CLEAR)
482852ba100SJustin Hibbits                         p_CcNode->shadowAction |= requiredAction;
4830aeed3e9SJustin Hibbits                 }
4840aeed3e9SJustin Hibbits                 break;
4850aeed3e9SJustin Hibbits 
4860aeed3e9SJustin Hibbits             case (e_FM_PCD_KG):
487852ba100SJustin Hibbits                 if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA)
488852ba100SJustin Hibbits                         && !(p_CcKeyAndNextEngineParamsTmp[i].shadowAction
489852ba100SJustin Hibbits                                 & UPDATE_NIA_ENQ_WITHOUT_DMA))
4900aeed3e9SJustin Hibbits                 {
491852ba100SJustin Hibbits                     physicalSchemeId =
492852ba100SJustin Hibbits                             FmPcdKgGetSchemeId(
493852ba100SJustin Hibbits                                     p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.kgParams.h_DirectScheme);
494852ba100SJustin Hibbits                     relativeSchemeId = FmPcdKgGetRelativeSchemeId(
495852ba100SJustin Hibbits                             h_FmPcd, physicalSchemeId);
4960aeed3e9SJustin Hibbits                     if (relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
4970aeed3e9SJustin Hibbits                         RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
498852ba100SJustin Hibbits                     if (!FmPcdKgIsSchemeValidSw(
499852ba100SJustin Hibbits                             p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.kgParams.h_DirectScheme))
500852ba100SJustin Hibbits                         RETURN_ERROR(MAJOR, E_INVALID_STATE,
501852ba100SJustin Hibbits                                      ("Invalid direct scheme."));
5020aeed3e9SJustin Hibbits                     if (!KgIsSchemeAlwaysDirect(h_FmPcd, relativeSchemeId))
503852ba100SJustin Hibbits                         RETURN_ERROR(
504852ba100SJustin Hibbits                                 MAJOR, E_INVALID_STATE,
505852ba100SJustin Hibbits                                 ("For this action scheme has to be direct."));
506852ba100SJustin Hibbits                     err =
507852ba100SJustin Hibbits                             FmPcdKgCcGetSetParams(
508852ba100SJustin Hibbits                                     h_FmPcd,
509852ba100SJustin Hibbits                                     p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.kgParams.h_DirectScheme,
510852ba100SJustin Hibbits                                     requiredAction, 0);
5110aeed3e9SJustin Hibbits                     if (err != E_OK)
5120aeed3e9SJustin Hibbits                         RETURN_ERROR(MAJOR, err, NO_MSG);
513852ba100SJustin Hibbits                     p_CcKeyAndNextEngineParamsTmp[i].shadowAction |=
514852ba100SJustin Hibbits                             requiredAction;
5150aeed3e9SJustin Hibbits                 }
5160aeed3e9SJustin Hibbits                 break;
5170aeed3e9SJustin Hibbits 
5180aeed3e9SJustin Hibbits             case (e_FM_PCD_PLCR):
519852ba100SJustin Hibbits                 if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA)
520852ba100SJustin Hibbits                         && !(p_CcKeyAndNextEngineParamsTmp[i].shadowAction
521852ba100SJustin Hibbits                                 & UPDATE_NIA_ENQ_WITHOUT_DMA))
5220aeed3e9SJustin Hibbits                 {
523852ba100SJustin Hibbits                     if (!p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.plcrParams.overrideParams)
524852ba100SJustin Hibbits                         RETURN_ERROR(
525852ba100SJustin Hibbits                                 MAJOR,
526852ba100SJustin Hibbits                                 E_NOT_SUPPORTED,
527852ba100SJustin Hibbits                                 ("In this initialization only overrideFqid can be initialized"));
528852ba100SJustin Hibbits                     if (!p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.plcrParams.sharedProfile)
529852ba100SJustin Hibbits                         RETURN_ERROR(
530852ba100SJustin Hibbits                                 MAJOR,
531852ba100SJustin Hibbits                                 E_NOT_SUPPORTED,
532852ba100SJustin Hibbits                                 ("In this initialization only overrideFqid can be initialized"));
533852ba100SJustin Hibbits                     err =
534852ba100SJustin Hibbits                             FmPcdPlcrGetAbsoluteIdByProfileParams(
535852ba100SJustin Hibbits                                     h_FmPcd,
536852ba100SJustin Hibbits                                     e_FM_PCD_PLCR_SHARED,
537852ba100SJustin Hibbits                                     NULL,
538852ba100SJustin Hibbits                                     p_CcKeyAndNextEngineParamsTmp[i].nextEngineParams.params.plcrParams.newRelativeProfileId,
539852ba100SJustin Hibbits                                     &profileId);
5400aeed3e9SJustin Hibbits                     if (err != E_OK)
5410aeed3e9SJustin Hibbits                         RETURN_ERROR(MAJOR, err, NO_MSG);
542852ba100SJustin Hibbits                     err = FmPcdPlcrCcGetSetParams(h_FmPcd, profileId,
543852ba100SJustin Hibbits                                                   requiredAction);
5440aeed3e9SJustin Hibbits                     if (err != E_OK)
5450aeed3e9SJustin Hibbits                         RETURN_ERROR(MAJOR, err, NO_MSG);
546852ba100SJustin Hibbits                     p_CcKeyAndNextEngineParamsTmp[i].shadowAction |=
547852ba100SJustin Hibbits                             requiredAction;
5480aeed3e9SJustin Hibbits                 }
5490aeed3e9SJustin Hibbits                 break;
5500aeed3e9SJustin Hibbits 
5510aeed3e9SJustin Hibbits             case (e_FM_PCD_DONE):
552852ba100SJustin Hibbits                 if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA)
553852ba100SJustin Hibbits                         && !(p_CcKeyAndNextEngineParamsTmp[i].shadowAction
554852ba100SJustin Hibbits                                 & UPDATE_NIA_ENQ_WITHOUT_DMA))
5550aeed3e9SJustin Hibbits                 {
5560aeed3e9SJustin Hibbits                     tmpReg32 = GET_UINT32(p_AdTmp->nia);
557852ba100SJustin Hibbits                     if ((tmpReg32 & GET_NIA_BMI_AC_ENQ_FRAME(h_FmPcd))
558852ba100SJustin Hibbits                             != GET_NIA_BMI_AC_ENQ_FRAME(h_FmPcd))
559852ba100SJustin Hibbits                         RETURN_ERROR(
560852ba100SJustin Hibbits                                 MAJOR,
561852ba100SJustin Hibbits                                 E_INVALID_STATE,
562852ba100SJustin Hibbits                                 ("Next engine was previously assigned not as PCD_DONE"));
5630aeed3e9SJustin Hibbits                     tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA;
5640aeed3e9SJustin Hibbits                     WRITE_UINT32(p_AdTmp->nia, tmpReg32);
565852ba100SJustin Hibbits                     p_CcKeyAndNextEngineParamsTmp[i].shadowAction |=
566852ba100SJustin Hibbits                             requiredAction;
5670aeed3e9SJustin Hibbits                 }
5680aeed3e9SJustin Hibbits                 break;
5690aeed3e9SJustin Hibbits 
5700aeed3e9SJustin Hibbits             default:
5710aeed3e9SJustin Hibbits                 break;
5720aeed3e9SJustin Hibbits         }
5730aeed3e9SJustin Hibbits     }
5740aeed3e9SJustin Hibbits 
5750aeed3e9SJustin Hibbits     return E_OK;
5760aeed3e9SJustin Hibbits }
5770aeed3e9SJustin Hibbits 
SetRequiredAction(t_Handle h_FmPcd,uint32_t requiredAction,t_FmPcdCcKeyAndNextEngineParams * p_CcKeyAndNextEngineParamsTmp,t_Handle h_AdTmp,uint16_t numOfEntries,t_Handle h_Tree)578852ba100SJustin Hibbits static t_Error SetRequiredAction(
579852ba100SJustin Hibbits         t_Handle h_FmPcd, uint32_t requiredAction,
580852ba100SJustin Hibbits         t_FmPcdCcKeyAndNextEngineParams *p_CcKeyAndNextEngineParamsTmp,
581852ba100SJustin Hibbits         t_Handle h_AdTmp, uint16_t numOfEntries, t_Handle h_Tree)
5820aeed3e9SJustin Hibbits {
583852ba100SJustin Hibbits     t_Error err = SetRequiredAction1(h_FmPcd, requiredAction,
584852ba100SJustin Hibbits                                      p_CcKeyAndNextEngineParamsTmp, h_AdTmp,
585852ba100SJustin Hibbits                                      numOfEntries, h_Tree);
586852ba100SJustin Hibbits     if (err != E_OK)
587852ba100SJustin Hibbits         return err;
588852ba100SJustin Hibbits     return SetRequiredAction1(h_FmPcd, UPDATE_CC_SHADOW_CLEAR,
589852ba100SJustin Hibbits                               p_CcKeyAndNextEngineParamsTmp, h_AdTmp,
590852ba100SJustin Hibbits                               numOfEntries, h_Tree);
591852ba100SJustin Hibbits }
592852ba100SJustin Hibbits 
ReleaseModifiedDataStructure(t_Handle h_FmPcd,t_List * h_FmPcdOldPointersLst,t_List * h_FmPcdNewPointersLst,t_FmPcdModifyCcKeyAdditionalParams * p_AdditionalParams,bool useShadowStructs)593852ba100SJustin Hibbits static t_Error ReleaseModifiedDataStructure(
594852ba100SJustin Hibbits         t_Handle h_FmPcd, t_List *h_FmPcdOldPointersLst,
595852ba100SJustin Hibbits         t_List *h_FmPcdNewPointersLst,
596852ba100SJustin Hibbits         t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalParams,
597852ba100SJustin Hibbits         bool useShadowStructs)
598852ba100SJustin Hibbits {
599852ba100SJustin Hibbits     t_List *p_Pos;
600852ba100SJustin Hibbits     t_Error err = E_OK;
601852ba100SJustin Hibbits     t_CcNodeInformation ccNodeInfo, *p_CcNodeInformation;
602852ba100SJustin Hibbits     t_Handle h_Muram;
603852ba100SJustin Hibbits     t_FmPcdCcNode *p_FmPcdCcNextNode, *p_FmPcdCcWorkingOnNode;
604852ba100SJustin Hibbits     t_List *p_UpdateLst;
605852ba100SJustin Hibbits     uint32_t intFlags;
606852ba100SJustin Hibbits 
607852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
608852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_AdditionalParams->h_CurrentNode,
609852ba100SJustin Hibbits                               E_INVALID_HANDLE);
610852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_FmPcdOldPointersLst, E_INVALID_HANDLE);
611852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_FmPcdNewPointersLst, E_INVALID_HANDLE);
612852ba100SJustin Hibbits 
613852ba100SJustin Hibbits     /* We don't update subtree of the new node with new tree because it was done in the previous stage */
614852ba100SJustin Hibbits     if (p_AdditionalParams->h_NodeForAdd)
615852ba100SJustin Hibbits     {
616852ba100SJustin Hibbits         p_FmPcdCcNextNode = (t_FmPcdCcNode*)p_AdditionalParams->h_NodeForAdd;
617852ba100SJustin Hibbits 
618852ba100SJustin Hibbits         if (!p_AdditionalParams->tree)
619852ba100SJustin Hibbits             p_UpdateLst = &p_FmPcdCcNextNode->ccPrevNodesLst;
620852ba100SJustin Hibbits         else
621852ba100SJustin Hibbits             p_UpdateLst = &p_FmPcdCcNextNode->ccTreeIdLst;
622852ba100SJustin Hibbits 
623852ba100SJustin Hibbits         p_CcNodeInformation = FindNodeInfoInReleventLst(
624852ba100SJustin Hibbits                 p_UpdateLst, p_AdditionalParams->h_CurrentNode,
625852ba100SJustin Hibbits                 p_FmPcdCcNextNode->h_Spinlock);
626852ba100SJustin Hibbits 
627852ba100SJustin Hibbits         if (p_CcNodeInformation)
628852ba100SJustin Hibbits             p_CcNodeInformation->index++;
629852ba100SJustin Hibbits         else
630852ba100SJustin Hibbits         {
631852ba100SJustin Hibbits             memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
632852ba100SJustin Hibbits             ccNodeInfo.h_CcNode = (t_Handle)p_AdditionalParams->h_CurrentNode;
633852ba100SJustin Hibbits             ccNodeInfo.index = 1;
634852ba100SJustin Hibbits             EnqueueNodeInfoToRelevantLst(p_UpdateLst, &ccNodeInfo,
635852ba100SJustin Hibbits                                          p_FmPcdCcNextNode->h_Spinlock);
636852ba100SJustin Hibbits         }
637852ba100SJustin Hibbits         if (p_AdditionalParams->h_ManipForAdd)
638852ba100SJustin Hibbits         {
639852ba100SJustin Hibbits             p_CcNodeInformation = FindNodeInfoInReleventLst(
640852ba100SJustin Hibbits                     FmPcdManipGetNodeLstPointedOnThisManip(
641852ba100SJustin Hibbits                             p_AdditionalParams->h_ManipForAdd),
642852ba100SJustin Hibbits                     p_AdditionalParams->h_CurrentNode,
643852ba100SJustin Hibbits                     FmPcdManipGetSpinlock(p_AdditionalParams->h_ManipForAdd));
644852ba100SJustin Hibbits 
645852ba100SJustin Hibbits             if (p_CcNodeInformation)
646852ba100SJustin Hibbits                 p_CcNodeInformation->index++;
647852ba100SJustin Hibbits             else
648852ba100SJustin Hibbits             {
649852ba100SJustin Hibbits                 memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
650852ba100SJustin Hibbits                 ccNodeInfo.h_CcNode =
651852ba100SJustin Hibbits                         (t_Handle)p_AdditionalParams->h_CurrentNode;
652852ba100SJustin Hibbits                 ccNodeInfo.index = 1;
653852ba100SJustin Hibbits                 EnqueueNodeInfoToRelevantLst(
654852ba100SJustin Hibbits                         FmPcdManipGetNodeLstPointedOnThisManip(
655852ba100SJustin Hibbits                                 p_AdditionalParams->h_ManipForAdd),
656852ba100SJustin Hibbits                         &ccNodeInfo,
657852ba100SJustin Hibbits                         FmPcdManipGetSpinlock(
658852ba100SJustin Hibbits                                 p_AdditionalParams->h_ManipForAdd));
659852ba100SJustin Hibbits             }
660852ba100SJustin Hibbits         }
661852ba100SJustin Hibbits     }
662852ba100SJustin Hibbits 
663852ba100SJustin Hibbits     if (p_AdditionalParams->h_NodeForRmv)
664852ba100SJustin Hibbits     {
665852ba100SJustin Hibbits         p_FmPcdCcNextNode = (t_FmPcdCcNode*)p_AdditionalParams->h_NodeForRmv;
666852ba100SJustin Hibbits 
667852ba100SJustin Hibbits         if (!p_AdditionalParams->tree)
668852ba100SJustin Hibbits         {
669852ba100SJustin Hibbits             p_UpdateLst = &p_FmPcdCcNextNode->ccPrevNodesLst;
670852ba100SJustin Hibbits             p_FmPcdCcWorkingOnNode =
671852ba100SJustin Hibbits                     (t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode);
672852ba100SJustin Hibbits 
673852ba100SJustin Hibbits             for (p_Pos = NCSW_LIST_FIRST(&p_FmPcdCcWorkingOnNode->ccTreesLst);
674852ba100SJustin Hibbits                     p_Pos != (&p_FmPcdCcWorkingOnNode->ccTreesLst); p_Pos =
675852ba100SJustin Hibbits                             NCSW_LIST_NEXT(p_Pos))
676852ba100SJustin Hibbits             {
677852ba100SJustin Hibbits                 p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
678852ba100SJustin Hibbits 
679852ba100SJustin Hibbits                 ASSERT_COND(p_CcNodeInformation->h_CcNode);
680852ba100SJustin Hibbits 
681852ba100SJustin Hibbits                 err =
682852ba100SJustin Hibbits                         SetRequiredAction(
683852ba100SJustin Hibbits                                 h_FmPcd,
684852ba100SJustin Hibbits                                 UPDATE_CC_WITH_DELETE_TREE,
685852ba100SJustin Hibbits                                 &((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->keyAndNextEngineParams[p_AdditionalParams->savedKeyIndex],
686852ba100SJustin Hibbits                                 PTR_MOVE(((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->h_AdTable, p_AdditionalParams->savedKeyIndex*FM_PCD_CC_AD_ENTRY_SIZE),
687852ba100SJustin Hibbits                                 1, p_CcNodeInformation->h_CcNode);
688852ba100SJustin Hibbits             }
689852ba100SJustin Hibbits         }
690852ba100SJustin Hibbits         else
691852ba100SJustin Hibbits         {
692852ba100SJustin Hibbits             p_UpdateLst = &p_FmPcdCcNextNode->ccTreeIdLst;
693852ba100SJustin Hibbits 
694852ba100SJustin Hibbits             err =
695852ba100SJustin Hibbits                     SetRequiredAction(
696852ba100SJustin Hibbits                             h_FmPcd,
697852ba100SJustin Hibbits                             UPDATE_CC_WITH_DELETE_TREE,
698852ba100SJustin Hibbits                             &((t_FmPcdCcTree *)(p_AdditionalParams->h_CurrentNode))->keyAndNextEngineParams[p_AdditionalParams->savedKeyIndex],
699852ba100SJustin Hibbits                             UINT_TO_PTR(((t_FmPcdCcTree *)(p_AdditionalParams->h_CurrentNode))->ccTreeBaseAddr + p_AdditionalParams->savedKeyIndex*FM_PCD_CC_AD_ENTRY_SIZE),
700852ba100SJustin Hibbits                             1, p_AdditionalParams->h_CurrentNode);
701852ba100SJustin Hibbits         }
702852ba100SJustin Hibbits         if (err)
703852ba100SJustin Hibbits             return err;
704852ba100SJustin Hibbits 
705852ba100SJustin Hibbits         /* We remove from the subtree of the removed node tree because it wasn't done in the previous stage
706852ba100SJustin Hibbits          Update ccPrevNodesLst or ccTreeIdLst of the removed node
707852ba100SJustin Hibbits          Update of the node owner */
708852ba100SJustin Hibbits         p_CcNodeInformation = FindNodeInfoInReleventLst(
709852ba100SJustin Hibbits                 p_UpdateLst, p_AdditionalParams->h_CurrentNode,
710852ba100SJustin Hibbits                 p_FmPcdCcNextNode->h_Spinlock);
711852ba100SJustin Hibbits 
712852ba100SJustin Hibbits         ASSERT_COND(p_CcNodeInformation);
713852ba100SJustin Hibbits         ASSERT_COND(p_CcNodeInformation->index);
714852ba100SJustin Hibbits 
715852ba100SJustin Hibbits         p_CcNodeInformation->index--;
716852ba100SJustin Hibbits 
717852ba100SJustin Hibbits         if (p_CcNodeInformation->index == 0)
718852ba100SJustin Hibbits             DequeueNodeInfoFromRelevantLst(p_UpdateLst,
719852ba100SJustin Hibbits                                            p_AdditionalParams->h_CurrentNode,
720852ba100SJustin Hibbits                                            p_FmPcdCcNextNode->h_Spinlock);
721852ba100SJustin Hibbits 
722852ba100SJustin Hibbits         UpdateNodeOwner(p_FmPcdCcNextNode, FALSE);
723852ba100SJustin Hibbits 
724852ba100SJustin Hibbits         if (p_AdditionalParams->h_ManipForRmv)
725852ba100SJustin Hibbits         {
726852ba100SJustin Hibbits             p_CcNodeInformation = FindNodeInfoInReleventLst(
727852ba100SJustin Hibbits                     FmPcdManipGetNodeLstPointedOnThisManip(
728852ba100SJustin Hibbits                             p_AdditionalParams->h_ManipForRmv),
729852ba100SJustin Hibbits                     p_AdditionalParams->h_CurrentNode,
730852ba100SJustin Hibbits                     FmPcdManipGetSpinlock(p_AdditionalParams->h_ManipForRmv));
731852ba100SJustin Hibbits 
732852ba100SJustin Hibbits             ASSERT_COND(p_CcNodeInformation);
733852ba100SJustin Hibbits             ASSERT_COND(p_CcNodeInformation->index);
734852ba100SJustin Hibbits 
735852ba100SJustin Hibbits             p_CcNodeInformation->index--;
736852ba100SJustin Hibbits 
737852ba100SJustin Hibbits             if (p_CcNodeInformation->index == 0)
738852ba100SJustin Hibbits                 DequeueNodeInfoFromRelevantLst(
739852ba100SJustin Hibbits                         FmPcdManipGetNodeLstPointedOnThisManip(
740852ba100SJustin Hibbits                                 p_AdditionalParams->h_ManipForRmv),
741852ba100SJustin Hibbits                         p_AdditionalParams->h_CurrentNode,
742852ba100SJustin Hibbits                         FmPcdManipGetSpinlock(
743852ba100SJustin Hibbits                                 p_AdditionalParams->h_ManipForRmv));
744852ba100SJustin Hibbits         }
745852ba100SJustin Hibbits     }
746852ba100SJustin Hibbits 
747852ba100SJustin Hibbits     if (p_AdditionalParams->h_ManipForRmv)
748852ba100SJustin Hibbits         FmPcdManipUpdateOwner(p_AdditionalParams->h_ManipForRmv, FALSE);
749852ba100SJustin Hibbits 
750852ba100SJustin Hibbits     if (p_AdditionalParams->p_StatsObjForRmv)
751852ba100SJustin Hibbits         PutStatsObj((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode),
752852ba100SJustin Hibbits                     p_AdditionalParams->p_StatsObjForRmv);
753852ba100SJustin Hibbits 
754852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
755852ba100SJustin Hibbits     if (p_AdditionalParams->h_FrmReplicForRmv)
756852ba100SJustin Hibbits         FrmReplicGroupUpdateOwner(p_AdditionalParams->h_FrmReplicForRmv,
757852ba100SJustin Hibbits                                   FALSE/* remove */);
758852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
759852ba100SJustin Hibbits 
760852ba100SJustin Hibbits     if (!useShadowStructs)
761852ba100SJustin Hibbits     {
762852ba100SJustin Hibbits         h_Muram = FmPcdGetMuramHandle(h_FmPcd);
763852ba100SJustin Hibbits         ASSERT_COND(h_Muram);
764852ba100SJustin Hibbits 
765852ba100SJustin Hibbits         if ((p_AdditionalParams->tree && !((t_FmPcd *)h_FmPcd)->p_CcShadow)
766852ba100SJustin Hibbits                 || (!p_AdditionalParams->tree
767852ba100SJustin Hibbits                         && !((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->maxNumOfKeys))
768852ba100SJustin Hibbits         {
769852ba100SJustin Hibbits             /* We release new AD which was allocated and updated for copy from to actual AD */
770852ba100SJustin Hibbits             for (p_Pos = NCSW_LIST_FIRST(h_FmPcdNewPointersLst);
771852ba100SJustin Hibbits                     p_Pos != (h_FmPcdNewPointersLst); p_Pos = NCSW_LIST_NEXT(p_Pos))
772852ba100SJustin Hibbits             {
773852ba100SJustin Hibbits 
774852ba100SJustin Hibbits                 p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
775852ba100SJustin Hibbits                 ASSERT_COND(p_CcNodeInformation->h_CcNode);
776852ba100SJustin Hibbits                 FM_MURAM_FreeMem(h_Muram, p_CcNodeInformation->h_CcNode);
777852ba100SJustin Hibbits             }
778852ba100SJustin Hibbits         }
779852ba100SJustin Hibbits 
780852ba100SJustin Hibbits         /* Free Old data structure if it has to be freed - new data structure was allocated*/
781852ba100SJustin Hibbits         if (p_AdditionalParams->p_AdTableOld)
782852ba100SJustin Hibbits             FM_MURAM_FreeMem(h_Muram, p_AdditionalParams->p_AdTableOld);
783852ba100SJustin Hibbits 
784852ba100SJustin Hibbits         if (p_AdditionalParams->p_KeysMatchTableOld)
785852ba100SJustin Hibbits             FM_MURAM_FreeMem(h_Muram, p_AdditionalParams->p_KeysMatchTableOld);
786852ba100SJustin Hibbits     }
787852ba100SJustin Hibbits 
788852ba100SJustin Hibbits     /* Update current modified node with changed fields if it's required*/
789852ba100SJustin Hibbits     if (!p_AdditionalParams->tree)
790852ba100SJustin Hibbits     {
791852ba100SJustin Hibbits         if (p_AdditionalParams->p_AdTableNew)
792852ba100SJustin Hibbits             ((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->h_AdTable =
793852ba100SJustin Hibbits                     p_AdditionalParams->p_AdTableNew;
794852ba100SJustin Hibbits 
795852ba100SJustin Hibbits         if (p_AdditionalParams->p_KeysMatchTableNew)
796852ba100SJustin Hibbits             ((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->h_KeysMatchTable =
797852ba100SJustin Hibbits                     p_AdditionalParams->p_KeysMatchTableNew;
798852ba100SJustin Hibbits 
799852ba100SJustin Hibbits         /* Locking node's spinlock before updating 'keys and next engine' structure,
800852ba100SJustin Hibbits          as it maybe used to retrieve keys statistics */
801852ba100SJustin Hibbits         intFlags =
802852ba100SJustin Hibbits                 XX_LockIntrSpinlock(
803852ba100SJustin Hibbits                         ((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->h_Spinlock);
804852ba100SJustin Hibbits 
805852ba100SJustin Hibbits         ((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->numOfKeys =
806852ba100SJustin Hibbits                 p_AdditionalParams->numOfKeys;
807852ba100SJustin Hibbits 
808852ba100SJustin Hibbits         memcpy(((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->keyAndNextEngineParams,
809852ba100SJustin Hibbits                &p_AdditionalParams->keyAndNextEngineParams,
810852ba100SJustin Hibbits                sizeof(t_FmPcdCcKeyAndNextEngineParams) * (CC_MAX_NUM_OF_KEYS));
811852ba100SJustin Hibbits 
812852ba100SJustin Hibbits         XX_UnlockIntrSpinlock(
813852ba100SJustin Hibbits                 ((t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode))->h_Spinlock,
814852ba100SJustin Hibbits                 intFlags);
815852ba100SJustin Hibbits     }
816852ba100SJustin Hibbits     else
817852ba100SJustin Hibbits     {
818852ba100SJustin Hibbits         uint8_t numEntries =
819852ba100SJustin Hibbits                 ((t_FmPcdCcTree *)(p_AdditionalParams->h_CurrentNode))->numOfEntries;
820852ba100SJustin Hibbits         ASSERT_COND(numEntries < FM_PCD_MAX_NUM_OF_CC_GROUPS);
821852ba100SJustin Hibbits         memcpy(&((t_FmPcdCcTree *)(p_AdditionalParams->h_CurrentNode))->keyAndNextEngineParams,
822852ba100SJustin Hibbits                &p_AdditionalParams->keyAndNextEngineParams,
823852ba100SJustin Hibbits                sizeof(t_FmPcdCcKeyAndNextEngineParams) * numEntries);
824852ba100SJustin Hibbits     }
825852ba100SJustin Hibbits 
826852ba100SJustin Hibbits     ReleaseLst(h_FmPcdOldPointersLst);
827852ba100SJustin Hibbits     ReleaseLst(h_FmPcdNewPointersLst);
828852ba100SJustin Hibbits 
829852ba100SJustin Hibbits     XX_Free(p_AdditionalParams);
830852ba100SJustin Hibbits 
831852ba100SJustin Hibbits     return E_OK;
832852ba100SJustin Hibbits }
833852ba100SJustin Hibbits 
BuildNewAd(t_Handle h_Ad,t_FmPcdModifyCcKeyAdditionalParams * p_FmPcdModifyCcKeyAdditionalParams,t_FmPcdCcNode * p_CcNode,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams)834852ba100SJustin Hibbits static t_Handle BuildNewAd(
835852ba100SJustin Hibbits         t_Handle h_Ad,
836852ba100SJustin Hibbits         t_FmPcdModifyCcKeyAdditionalParams *p_FmPcdModifyCcKeyAdditionalParams,
837852ba100SJustin Hibbits         t_FmPcdCcNode *p_CcNode,
838852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
839852ba100SJustin Hibbits {
840852ba100SJustin Hibbits     t_FmPcdCcNode *p_FmPcdCcNodeTmp;
841852ba100SJustin Hibbits     t_Handle h_OrigAd = NULL;
842852ba100SJustin Hibbits 
843852ba100SJustin Hibbits     p_FmPcdCcNodeTmp = (t_FmPcdCcNode*)XX_Malloc(sizeof(t_FmPcdCcNode));
844852ba100SJustin Hibbits     if (!p_FmPcdCcNodeTmp)
845852ba100SJustin Hibbits     {
846852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("p_FmPcdCcNodeTmp"));
847852ba100SJustin Hibbits         return NULL;
848852ba100SJustin Hibbits     }
849852ba100SJustin Hibbits     memset(p_FmPcdCcNodeTmp, 0, sizeof(t_FmPcdCcNode));
850852ba100SJustin Hibbits 
851852ba100SJustin Hibbits     p_FmPcdCcNodeTmp->numOfKeys = p_FmPcdModifyCcKeyAdditionalParams->numOfKeys;
852852ba100SJustin Hibbits     p_FmPcdCcNodeTmp->h_KeysMatchTable =
853852ba100SJustin Hibbits             p_FmPcdModifyCcKeyAdditionalParams->p_KeysMatchTableNew;
854852ba100SJustin Hibbits     p_FmPcdCcNodeTmp->h_AdTable =
855852ba100SJustin Hibbits             p_FmPcdModifyCcKeyAdditionalParams->p_AdTableNew;
856852ba100SJustin Hibbits 
857852ba100SJustin Hibbits     p_FmPcdCcNodeTmp->lclMask = p_CcNode->lclMask;
858852ba100SJustin Hibbits     p_FmPcdCcNodeTmp->parseCode = p_CcNode->parseCode;
859852ba100SJustin Hibbits     p_FmPcdCcNodeTmp->offset = p_CcNode->offset;
860852ba100SJustin Hibbits     p_FmPcdCcNodeTmp->prsArrayOffset = p_CcNode->prsArrayOffset;
861852ba100SJustin Hibbits     p_FmPcdCcNodeTmp->ctrlFlow = p_CcNode->ctrlFlow;
862852ba100SJustin Hibbits     p_FmPcdCcNodeTmp->ccKeySizeAccExtraction = p_CcNode->ccKeySizeAccExtraction;
863852ba100SJustin Hibbits     p_FmPcdCcNodeTmp->sizeOfExtraction = p_CcNode->sizeOfExtraction;
864852ba100SJustin Hibbits     p_FmPcdCcNodeTmp->glblMaskSize = p_CcNode->glblMaskSize;
865852ba100SJustin Hibbits     p_FmPcdCcNodeTmp->p_GlblMask = p_CcNode->p_GlblMask;
866852ba100SJustin Hibbits 
867852ba100SJustin Hibbits     if (p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_CC)
868852ba100SJustin Hibbits     {
869852ba100SJustin Hibbits         if (p_FmPcdCcNextEngineParams->h_Manip)
870852ba100SJustin Hibbits         {
871852ba100SJustin Hibbits             h_OrigAd = p_CcNode->h_Ad;
872852ba100SJustin Hibbits             if (AllocAndFillAdForContLookupManip(
873852ba100SJustin Hibbits                     p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode)
874852ba100SJustin Hibbits                     != E_OK)
875852ba100SJustin Hibbits             {
876852ba100SJustin Hibbits                 REPORT_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
877852ba100SJustin Hibbits                 XX_Free(p_FmPcdCcNodeTmp);
878852ba100SJustin Hibbits                 return NULL;
879852ba100SJustin Hibbits             }
880852ba100SJustin Hibbits         }
881852ba100SJustin Hibbits         FillAdOfTypeContLookup(h_Ad, NULL, p_CcNode->h_FmPcd, p_FmPcdCcNodeTmp,
882852ba100SJustin Hibbits                                h_OrigAd ? NULL : p_FmPcdCcNextEngineParams->h_Manip, NULL);
883852ba100SJustin Hibbits     }
884852ba100SJustin Hibbits 
885852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
886852ba100SJustin Hibbits     if ((p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_FR)
887852ba100SJustin Hibbits             && (p_FmPcdCcNextEngineParams->params.frParams.h_FrmReplic))
888852ba100SJustin Hibbits     {
889852ba100SJustin Hibbits         FillAdOfTypeContLookup(
890852ba100SJustin Hibbits                 h_Ad, NULL, p_CcNode->h_FmPcd, p_FmPcdCcNodeTmp,
891852ba100SJustin Hibbits                 p_FmPcdCcNextEngineParams->h_Manip,
892852ba100SJustin Hibbits                 p_FmPcdCcNextEngineParams->params.frParams.h_FrmReplic);
893852ba100SJustin Hibbits     }
894852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
895852ba100SJustin Hibbits 
896852ba100SJustin Hibbits     XX_Free(p_FmPcdCcNodeTmp);
897852ba100SJustin Hibbits 
898*aef13f05SJustin Hibbits     return NULL;
899852ba100SJustin Hibbits }
900852ba100SJustin Hibbits 
DynamicChangeHc(t_Handle h_FmPcd,t_List * h_OldPointersLst,t_List * h_NewPointersLst,t_FmPcdModifyCcKeyAdditionalParams * p_AdditionalParams,bool useShadowStructs)901852ba100SJustin Hibbits static t_Error DynamicChangeHc(
902852ba100SJustin Hibbits         t_Handle h_FmPcd, t_List *h_OldPointersLst, t_List *h_NewPointersLst,
903852ba100SJustin Hibbits         t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalParams,
904852ba100SJustin Hibbits         bool useShadowStructs)
905852ba100SJustin Hibbits {
906852ba100SJustin Hibbits     t_List *p_PosOld, *p_PosNew;
907852ba100SJustin Hibbits     uint32_t oldAdAddrOffset, newAdAddrOffset;
908852ba100SJustin Hibbits     uint16_t i = 0;
909852ba100SJustin Hibbits     t_Error err = E_OK;
910852ba100SJustin Hibbits     uint8_t numOfModifiedPtr;
911852ba100SJustin Hibbits 
912852ba100SJustin Hibbits     ASSERT_COND(h_FmPcd);
913852ba100SJustin Hibbits     ASSERT_COND(h_OldPointersLst);
914852ba100SJustin Hibbits     ASSERT_COND(h_NewPointersLst);
915852ba100SJustin Hibbits 
916852ba100SJustin Hibbits     numOfModifiedPtr = (uint8_t)NCSW_LIST_NumOfObjs(h_OldPointersLst);
917852ba100SJustin Hibbits 
918852ba100SJustin Hibbits     if (numOfModifiedPtr)
919852ba100SJustin Hibbits     {
920852ba100SJustin Hibbits         p_PosNew = NCSW_LIST_FIRST(h_NewPointersLst);
921852ba100SJustin Hibbits         p_PosOld = NCSW_LIST_FIRST(h_OldPointersLst);
922852ba100SJustin Hibbits 
923852ba100SJustin Hibbits         /* Retrieve address of new AD */
924852ba100SJustin Hibbits         newAdAddrOffset = FmPcdCcGetNodeAddrOffsetFromNodeInfo(h_FmPcd,
925852ba100SJustin Hibbits                                                                p_PosNew);
926852ba100SJustin Hibbits         if (newAdAddrOffset == (uint32_t)ILLEGAL_BASE)
927852ba100SJustin Hibbits         {
928852ba100SJustin Hibbits             ReleaseModifiedDataStructure(h_FmPcd, h_OldPointersLst,
929852ba100SJustin Hibbits                                          h_NewPointersLst,
930852ba100SJustin Hibbits                                          p_AdditionalParams, useShadowStructs);
931852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("New AD address"));
932852ba100SJustin Hibbits         }
933852ba100SJustin Hibbits 
934852ba100SJustin Hibbits         for (i = 0; i < numOfModifiedPtr; i++)
935852ba100SJustin Hibbits         {
936852ba100SJustin Hibbits             /* Retrieve address of current AD */
937852ba100SJustin Hibbits             oldAdAddrOffset = FmPcdCcGetNodeAddrOffsetFromNodeInfo(h_FmPcd,
938852ba100SJustin Hibbits                                                                    p_PosOld);
939852ba100SJustin Hibbits             if (oldAdAddrOffset == (uint32_t)ILLEGAL_BASE)
940852ba100SJustin Hibbits             {
941852ba100SJustin Hibbits                 ReleaseModifiedDataStructure(h_FmPcd, h_OldPointersLst,
942852ba100SJustin Hibbits                                              h_NewPointersLst,
943852ba100SJustin Hibbits                                              p_AdditionalParams,
944852ba100SJustin Hibbits                                              useShadowStructs);
945852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Old AD address"));
946852ba100SJustin Hibbits             }
947852ba100SJustin Hibbits 
948852ba100SJustin Hibbits             /* Invoke host command to copy from new AD to old AD */
949852ba100SJustin Hibbits             err = FmHcPcdCcDoDynamicChange(((t_FmPcd *)h_FmPcd)->h_Hc,
950852ba100SJustin Hibbits                                            oldAdAddrOffset, newAdAddrOffset);
951852ba100SJustin Hibbits             if (err)
952852ba100SJustin Hibbits             {
953852ba100SJustin Hibbits                 ReleaseModifiedDataStructure(h_FmPcd, h_OldPointersLst,
954852ba100SJustin Hibbits                                              h_NewPointersLst,
955852ba100SJustin Hibbits                                              p_AdditionalParams,
956852ba100SJustin Hibbits                                              useShadowStructs);
957852ba100SJustin Hibbits                 RETURN_ERROR(
958852ba100SJustin Hibbits                         MAJOR,
959852ba100SJustin Hibbits                         err,
960852ba100SJustin Hibbits                         ("For part of nodes changes are done - situation is danger"));
961852ba100SJustin Hibbits             }
962852ba100SJustin Hibbits 
963852ba100SJustin Hibbits             p_PosOld = NCSW_LIST_NEXT(p_PosOld);
964852ba100SJustin Hibbits         }
965852ba100SJustin Hibbits     }
966852ba100SJustin Hibbits     return E_OK;
967852ba100SJustin Hibbits }
968852ba100SJustin Hibbits 
DoDynamicChange(t_Handle h_FmPcd,t_List * h_OldPointersLst,t_List * h_NewPointersLst,t_FmPcdModifyCcKeyAdditionalParams * p_AdditionalParams,bool useShadowStructs)969852ba100SJustin Hibbits static t_Error DoDynamicChange(
970852ba100SJustin Hibbits         t_Handle h_FmPcd, t_List *h_OldPointersLst, t_List *h_NewPointersLst,
971852ba100SJustin Hibbits         t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalParams,
972852ba100SJustin Hibbits         bool useShadowStructs)
973852ba100SJustin Hibbits {
974852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode =
975852ba100SJustin Hibbits             (t_FmPcdCcNode *)(p_AdditionalParams->h_CurrentNode);
976852ba100SJustin Hibbits     t_List *p_PosNew;
9770aeed3e9SJustin Hibbits     t_CcNodeInformation *p_CcNodeInfo;
978852ba100SJustin Hibbits     t_FmPcdCcNextEngineParams nextEngineParams;
979852ba100SJustin Hibbits     t_Handle h_Ad;
980852ba100SJustin Hibbits     uint32_t keySize;
981852ba100SJustin Hibbits     t_Error err = E_OK;
982852ba100SJustin Hibbits     uint8_t numOfModifiedPtr;
983852ba100SJustin Hibbits 
984852ba100SJustin Hibbits     ASSERT_COND(h_FmPcd);
985852ba100SJustin Hibbits 
986852ba100SJustin Hibbits     memset(&nextEngineParams, 0, sizeof(t_FmPcdCcNextEngineParams));
987852ba100SJustin Hibbits 
988852ba100SJustin Hibbits     numOfModifiedPtr = (uint8_t)NCSW_LIST_NumOfObjs(h_OldPointersLst);
989852ba100SJustin Hibbits 
990852ba100SJustin Hibbits     if (numOfModifiedPtr)
991852ba100SJustin Hibbits     {
992852ba100SJustin Hibbits 
993852ba100SJustin Hibbits         p_PosNew = NCSW_LIST_FIRST(h_NewPointersLst);
994852ba100SJustin Hibbits 
995852ba100SJustin Hibbits         /* Invoke host-command to copy from the new Ad to existing Ads */
996852ba100SJustin Hibbits         err = DynamicChangeHc(h_FmPcd, h_OldPointersLst, h_NewPointersLst,
997852ba100SJustin Hibbits                               p_AdditionalParams, useShadowStructs);
998852ba100SJustin Hibbits         if (err)
999852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, err, NO_MSG);
1000852ba100SJustin Hibbits 
1001852ba100SJustin Hibbits 		if (useShadowStructs)
1002852ba100SJustin Hibbits 		{
1003852ba100SJustin Hibbits 			/* When the host-command above has ended, the old structures are 'free'and we can update
1004852ba100SJustin Hibbits 			 them by copying from the new shadow structures. */
1005852ba100SJustin Hibbits 			if (p_CcNode->lclMask)
1006852ba100SJustin Hibbits 				keySize = (uint32_t)(2 * p_CcNode->ccKeySizeAccExtraction);
1007852ba100SJustin Hibbits 			else
1008852ba100SJustin Hibbits 				keySize = p_CcNode->ccKeySizeAccExtraction;
1009852ba100SJustin Hibbits 
1010852ba100SJustin Hibbits 			MemCpy8(p_AdditionalParams->p_KeysMatchTableOld,
1011852ba100SJustin Hibbits 					   p_AdditionalParams->p_KeysMatchTableNew,
1012852ba100SJustin Hibbits 					   p_CcNode->maxNumOfKeys * keySize * sizeof(uint8_t));
1013852ba100SJustin Hibbits 
1014852ba100SJustin Hibbits 			MemCpy8(
1015852ba100SJustin Hibbits 					p_AdditionalParams->p_AdTableOld,
1016852ba100SJustin Hibbits 					p_AdditionalParams->p_AdTableNew,
1017852ba100SJustin Hibbits 					(uint32_t)((p_CcNode->maxNumOfKeys + 1)
1018852ba100SJustin Hibbits 							* FM_PCD_CC_AD_ENTRY_SIZE));
1019852ba100SJustin Hibbits 
1020852ba100SJustin Hibbits 			/* Retrieve the address of the allocated Ad */
1021852ba100SJustin Hibbits 			p_CcNodeInfo = CC_NODE_F_OBJECT(p_PosNew);
1022852ba100SJustin Hibbits 			h_Ad = p_CcNodeInfo->h_CcNode;
1023852ba100SJustin Hibbits 
1024852ba100SJustin Hibbits 			/* Build a new Ad that holds the old (now updated) structures */
1025852ba100SJustin Hibbits 			p_AdditionalParams->p_KeysMatchTableNew =
1026852ba100SJustin Hibbits 					p_AdditionalParams->p_KeysMatchTableOld;
1027852ba100SJustin Hibbits 			p_AdditionalParams->p_AdTableNew = p_AdditionalParams->p_AdTableOld;
1028852ba100SJustin Hibbits 
1029852ba100SJustin Hibbits 			nextEngineParams.nextEngine = e_FM_PCD_CC;
1030852ba100SJustin Hibbits 			nextEngineParams.params.ccParams.h_CcNode = (t_Handle)p_CcNode;
1031852ba100SJustin Hibbits 
1032852ba100SJustin Hibbits 			BuildNewAd(h_Ad, p_AdditionalParams, p_CcNode, &nextEngineParams);
1033852ba100SJustin Hibbits 
1034852ba100SJustin Hibbits 			/* HC to copy from the new Ad (old updated structures) to current Ad (uses shadow structures) */
1035852ba100SJustin Hibbits 			err = DynamicChangeHc(h_FmPcd, h_OldPointersLst, h_NewPointersLst,
1036852ba100SJustin Hibbits 								  p_AdditionalParams, useShadowStructs);
1037852ba100SJustin Hibbits 			if (err)
1038852ba100SJustin Hibbits 				RETURN_ERROR(MAJOR, err, NO_MSG);
1039852ba100SJustin Hibbits 		}
1040852ba100SJustin Hibbits     }
1041852ba100SJustin Hibbits 
1042852ba100SJustin Hibbits     err = ReleaseModifiedDataStructure(h_FmPcd, h_OldPointersLst,
1043852ba100SJustin Hibbits                                        h_NewPointersLst,
1044852ba100SJustin Hibbits                                        p_AdditionalParams, useShadowStructs);
1045852ba100SJustin Hibbits     if (err)
1046852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
1047852ba100SJustin Hibbits 
1048852ba100SJustin Hibbits     return E_OK;
1049852ba100SJustin Hibbits }
1050852ba100SJustin Hibbits 
1051852ba100SJustin Hibbits #ifdef FM_CAPWAP_SUPPORT
IsCapwapApplSpecific(t_Handle h_Node)1052852ba100SJustin Hibbits static bool IsCapwapApplSpecific(t_Handle h_Node)
1053852ba100SJustin Hibbits {
1054852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_Node;
1055852ba100SJustin Hibbits     bool isManipForCapwapApplSpecificBuild = FALSE;
1056852ba100SJustin Hibbits     int i = 0;
1057852ba100SJustin Hibbits 
1058852ba100SJustin Hibbits     ASSERT_COND(h_Node);
1059852ba100SJustin Hibbits     /* assumption that this function called only for INDEXED_FLOW_ID - so no miss*/
1060852ba100SJustin Hibbits     for (i = 0; i < p_CcNode->numOfKeys; i++)
1061852ba100SJustin Hibbits     {
1062852ba100SJustin Hibbits         if ( p_CcNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip &&
1063852ba100SJustin Hibbits                 FmPcdManipIsCapwapApplSpecific(p_CcNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip))
1064852ba100SJustin Hibbits         {
1065852ba100SJustin Hibbits             isManipForCapwapApplSpecificBuild = TRUE;
1066852ba100SJustin Hibbits             break;
1067852ba100SJustin Hibbits         }
1068852ba100SJustin Hibbits     }
1069852ba100SJustin Hibbits     return isManipForCapwapApplSpecificBuild;
1070852ba100SJustin Hibbits 
1071852ba100SJustin Hibbits }
1072852ba100SJustin Hibbits #endif /* FM_CAPWAP_SUPPORT */
1073852ba100SJustin Hibbits 
CcUpdateParam(t_Handle h_FmPcd,t_Handle h_PcdParams,t_Handle h_FmPort,t_FmPcdCcKeyAndNextEngineParams * p_CcKeyAndNextEngineParams,uint16_t numOfEntries,t_Handle h_Ad,bool validate,uint16_t level,t_Handle h_FmTree,bool modify)1074852ba100SJustin Hibbits static t_Error CcUpdateParam(
1075852ba100SJustin Hibbits         t_Handle h_FmPcd, t_Handle h_PcdParams, t_Handle h_FmPort,
1076852ba100SJustin Hibbits         t_FmPcdCcKeyAndNextEngineParams *p_CcKeyAndNextEngineParams,
1077852ba100SJustin Hibbits         uint16_t numOfEntries, t_Handle h_Ad, bool validate, uint16_t level,
1078852ba100SJustin Hibbits         t_Handle h_FmTree, bool modify)
1079852ba100SJustin Hibbits {
1080852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode;
10810aeed3e9SJustin Hibbits     t_Error err;
10820aeed3e9SJustin Hibbits     uint16_t tmp = 0;
10830aeed3e9SJustin Hibbits     int i = 0;
1084852ba100SJustin Hibbits     t_FmPcdCcTree *p_CcTree = (t_FmPcdCcTree *)h_FmTree;
10850aeed3e9SJustin Hibbits 
10860aeed3e9SJustin Hibbits     level++;
10870aeed3e9SJustin Hibbits 
1088852ba100SJustin Hibbits     if (p_CcTree->h_IpReassemblyManip)
1089852ba100SJustin Hibbits     {
1090852ba100SJustin Hibbits         err = FmPcdManipUpdate(h_FmPcd, h_PcdParams, h_FmPort,
1091852ba100SJustin Hibbits                                p_CcTree->h_IpReassemblyManip, NULL, validate,
1092852ba100SJustin Hibbits                                level, h_FmTree, modify);
1093852ba100SJustin Hibbits         if (err)
1094852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, err, NO_MSG);
1095852ba100SJustin Hibbits     }
1096852ba100SJustin Hibbits 
1097852ba100SJustin Hibbits     if (p_CcTree->h_CapwapReassemblyManip)
1098852ba100SJustin Hibbits     {
1099852ba100SJustin Hibbits         err = FmPcdManipUpdate(h_FmPcd, h_PcdParams, h_FmPort,
1100852ba100SJustin Hibbits                                p_CcTree->h_CapwapReassemblyManip, NULL, validate,
1101852ba100SJustin Hibbits                                level, h_FmTree, modify);
1102852ba100SJustin Hibbits         if (err)
1103852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, err, NO_MSG);
1104852ba100SJustin Hibbits     }
1105852ba100SJustin Hibbits 
11060aeed3e9SJustin Hibbits     if (numOfEntries)
11070aeed3e9SJustin Hibbits     {
11080aeed3e9SJustin Hibbits         for (i = 0; i < numOfEntries; i++)
11090aeed3e9SJustin Hibbits         {
11100aeed3e9SJustin Hibbits             if (i == 0)
11110aeed3e9SJustin Hibbits                 h_Ad = PTR_MOVE(h_Ad, i*FM_PCD_CC_AD_ENTRY_SIZE);
11120aeed3e9SJustin Hibbits             else
11130aeed3e9SJustin Hibbits                 h_Ad = PTR_MOVE(h_Ad, FM_PCD_CC_AD_ENTRY_SIZE);
11140aeed3e9SJustin Hibbits 
1115852ba100SJustin Hibbits             if (p_CcKeyAndNextEngineParams[i].nextEngineParams.nextEngine
1116852ba100SJustin Hibbits                     == e_FM_PCD_CC)
11170aeed3e9SJustin Hibbits             {
1118852ba100SJustin Hibbits                 p_CcNode =
1119852ba100SJustin Hibbits                         p_CcKeyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode;
1120852ba100SJustin Hibbits                 ASSERT_COND(p_CcNode);
1121852ba100SJustin Hibbits 
1122852ba100SJustin Hibbits                 if (p_CcKeyAndNextEngineParams[i].nextEngineParams.h_Manip)
11230aeed3e9SJustin Hibbits                 {
1124852ba100SJustin Hibbits                     err =
1125852ba100SJustin Hibbits                             FmPcdManipUpdate(
1126852ba100SJustin Hibbits                                     h_FmPcd,
1127852ba100SJustin Hibbits                                     NULL,
1128852ba100SJustin Hibbits                                     h_FmPort,
1129852ba100SJustin Hibbits                                     p_CcKeyAndNextEngineParams[i].nextEngineParams.h_Manip,
1130852ba100SJustin Hibbits                                     h_Ad, validate, level, h_FmTree, modify);
11310aeed3e9SJustin Hibbits                     if (err)
11320aeed3e9SJustin Hibbits                         RETURN_ERROR(MAJOR, err, NO_MSG);
11330aeed3e9SJustin Hibbits                 }
11340aeed3e9SJustin Hibbits 
1135852ba100SJustin Hibbits                 if (p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.nextEngine
1136852ba100SJustin Hibbits                         != e_FM_PCD_INVALID)
1137852ba100SJustin Hibbits                     tmp = (uint8_t)(p_CcNode->numOfKeys + 1);
11380aeed3e9SJustin Hibbits                 else
1139852ba100SJustin Hibbits                     tmp = p_CcNode->numOfKeys;
11400aeed3e9SJustin Hibbits 
1141852ba100SJustin Hibbits                 err = CcUpdateParam(h_FmPcd, h_PcdParams, h_FmPort,
1142852ba100SJustin Hibbits                                     p_CcNode->keyAndNextEngineParams, tmp,
1143852ba100SJustin Hibbits                                     p_CcNode->h_AdTable, validate, level,
1144852ba100SJustin Hibbits                                     h_FmTree, modify);
11450aeed3e9SJustin Hibbits                 if (err)
11460aeed3e9SJustin Hibbits                     RETURN_ERROR(MAJOR, err, NO_MSG);
11470aeed3e9SJustin Hibbits             }
11480aeed3e9SJustin Hibbits             else
11490aeed3e9SJustin Hibbits             {
1150852ba100SJustin Hibbits                 if (p_CcKeyAndNextEngineParams[i].nextEngineParams.h_Manip)
11510aeed3e9SJustin Hibbits                 {
1152852ba100SJustin Hibbits                     err =
1153852ba100SJustin Hibbits                             FmPcdManipUpdate(
1154852ba100SJustin Hibbits                                     h_FmPcd,
1155852ba100SJustin Hibbits                                     NULL,
1156852ba100SJustin Hibbits                                     h_FmPort,
1157852ba100SJustin Hibbits                                     p_CcKeyAndNextEngineParams[i].nextEngineParams.h_Manip,
1158852ba100SJustin Hibbits                                     h_Ad, validate, level, h_FmTree, modify);
11590aeed3e9SJustin Hibbits                     if (err)
11600aeed3e9SJustin Hibbits                         RETURN_ERROR(MAJOR, err, NO_MSG);
11610aeed3e9SJustin Hibbits                 }
11620aeed3e9SJustin Hibbits             }
11630aeed3e9SJustin Hibbits         }
11640aeed3e9SJustin Hibbits     }
11650aeed3e9SJustin Hibbits 
11660aeed3e9SJustin Hibbits     return E_OK;
11670aeed3e9SJustin Hibbits }
11680aeed3e9SJustin Hibbits 
IcDefineCode(t_FmPcdCcNodeParams * p_CcNodeParam)11690aeed3e9SJustin Hibbits static ccPrivateInfo_t IcDefineCode(t_FmPcdCcNodeParams *p_CcNodeParam)
11700aeed3e9SJustin Hibbits {
11710aeed3e9SJustin Hibbits     switch (p_CcNodeParam->extractCcParams.extractNonHdr.action)
11720aeed3e9SJustin Hibbits     {
11730aeed3e9SJustin Hibbits         case (e_FM_PCD_ACTION_EXACT_MATCH):
11740aeed3e9SJustin Hibbits             switch (p_CcNodeParam->extractCcParams.extractNonHdr.src)
11750aeed3e9SJustin Hibbits             {
11760aeed3e9SJustin Hibbits                 case (e_FM_PCD_EXTRACT_FROM_KEY):
11770aeed3e9SJustin Hibbits                     return CC_PRIVATE_INFO_IC_KEY_EXACT_MATCH;
11780aeed3e9SJustin Hibbits                 case (e_FM_PCD_EXTRACT_FROM_HASH):
11790aeed3e9SJustin Hibbits                     return CC_PRIVATE_INFO_IC_HASH_EXACT_MATCH;
11800aeed3e9SJustin Hibbits                 default:
11810aeed3e9SJustin Hibbits                     return CC_PRIVATE_INFO_NONE;
11820aeed3e9SJustin Hibbits             }
1183852ba100SJustin Hibbits 
11840aeed3e9SJustin Hibbits         case (e_FM_PCD_ACTION_INDEXED_LOOKUP):
11850aeed3e9SJustin Hibbits             switch (p_CcNodeParam->extractCcParams.extractNonHdr.src)
11860aeed3e9SJustin Hibbits             {
11870aeed3e9SJustin Hibbits                 case (e_FM_PCD_EXTRACT_FROM_HASH):
11880aeed3e9SJustin Hibbits                     return CC_PRIVATE_INFO_IC_HASH_INDEX_LOOKUP;
11890aeed3e9SJustin Hibbits                 case (e_FM_PCD_EXTRACT_FROM_FLOW_ID):
11900aeed3e9SJustin Hibbits                     return CC_PRIVATE_INFO_IC_DEQ_FQID_INDEX_LOOKUP;
11910aeed3e9SJustin Hibbits                 default:
11920aeed3e9SJustin Hibbits                     return CC_PRIVATE_INFO_NONE;
11930aeed3e9SJustin Hibbits             }
1194852ba100SJustin Hibbits 
11950aeed3e9SJustin Hibbits         default:
11960aeed3e9SJustin Hibbits             break;
11970aeed3e9SJustin Hibbits     }
1198852ba100SJustin Hibbits 
11990aeed3e9SJustin Hibbits     return CC_PRIVATE_INFO_NONE;
12000aeed3e9SJustin Hibbits }
12010aeed3e9SJustin Hibbits 
DequeueAdditionalInfoFromRelevantLst(t_List * p_List)1202852ba100SJustin Hibbits static t_CcNodeInformation * DequeueAdditionalInfoFromRelevantLst(
1203852ba100SJustin Hibbits         t_List *p_List)
12040aeed3e9SJustin Hibbits {
12050aeed3e9SJustin Hibbits     t_CcNodeInformation *p_CcNodeInfo = NULL;
12060aeed3e9SJustin Hibbits 
1207852ba100SJustin Hibbits     if (!NCSW_LIST_IsEmpty(p_List))
12080aeed3e9SJustin Hibbits     {
12090aeed3e9SJustin Hibbits         p_CcNodeInfo = CC_NODE_F_OBJECT(p_List->p_Next);
1210852ba100SJustin Hibbits         NCSW_LIST_DelAndInit(&p_CcNodeInfo->node);
12110aeed3e9SJustin Hibbits     }
1212852ba100SJustin Hibbits 
12130aeed3e9SJustin Hibbits     return p_CcNodeInfo;
12140aeed3e9SJustin Hibbits }
12150aeed3e9SJustin Hibbits 
ReleaseLst(t_List * p_List)1216852ba100SJustin Hibbits void ReleaseLst(t_List *p_List)
12170aeed3e9SJustin Hibbits {
12180aeed3e9SJustin Hibbits     t_CcNodeInformation *p_CcNodeInfo = NULL;
12190aeed3e9SJustin Hibbits 
1220852ba100SJustin Hibbits     if (!NCSW_LIST_IsEmpty(p_List))
12210aeed3e9SJustin Hibbits     {
12220aeed3e9SJustin Hibbits         p_CcNodeInfo = DequeueAdditionalInfoFromRelevantLst(p_List);
12230aeed3e9SJustin Hibbits         while (p_CcNodeInfo)
12240aeed3e9SJustin Hibbits         {
12250aeed3e9SJustin Hibbits             XX_Free(p_CcNodeInfo);
12260aeed3e9SJustin Hibbits             p_CcNodeInfo = DequeueAdditionalInfoFromRelevantLst(p_List);
12270aeed3e9SJustin Hibbits         }
12280aeed3e9SJustin Hibbits     }
1229852ba100SJustin Hibbits 
1230852ba100SJustin Hibbits     NCSW_LIST_Del(p_List);
12310aeed3e9SJustin Hibbits }
12320aeed3e9SJustin Hibbits 
DeleteNode(t_FmPcdCcNode * p_CcNode)1233852ba100SJustin Hibbits static void DeleteNode(t_FmPcdCcNode *p_CcNode)
12340aeed3e9SJustin Hibbits {
1235852ba100SJustin Hibbits     uint32_t i;
1236852ba100SJustin Hibbits 
1237852ba100SJustin Hibbits     if (!p_CcNode)
1238852ba100SJustin Hibbits         return;
1239852ba100SJustin Hibbits 
1240852ba100SJustin Hibbits     if (p_CcNode->p_GlblMask)
1241852ba100SJustin Hibbits     {
1242852ba100SJustin Hibbits         XX_Free(p_CcNode->p_GlblMask);
1243852ba100SJustin Hibbits         p_CcNode->p_GlblMask = NULL;
12440aeed3e9SJustin Hibbits     }
12450aeed3e9SJustin Hibbits 
1246852ba100SJustin Hibbits     if (p_CcNode->h_KeysMatchTable)
12470aeed3e9SJustin Hibbits     {
1248852ba100SJustin Hibbits         FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_CcNode->h_FmPcd),
1249852ba100SJustin Hibbits                          p_CcNode->h_KeysMatchTable);
1250852ba100SJustin Hibbits         p_CcNode->h_KeysMatchTable = NULL;
12510aeed3e9SJustin Hibbits     }
12520aeed3e9SJustin Hibbits 
1253852ba100SJustin Hibbits     if (p_CcNode->h_AdTable)
12540aeed3e9SJustin Hibbits     {
1255852ba100SJustin Hibbits         FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_CcNode->h_FmPcd),
1256852ba100SJustin Hibbits                          p_CcNode->h_AdTable);
1257852ba100SJustin Hibbits         p_CcNode->h_AdTable = NULL;
12580aeed3e9SJustin Hibbits     }
12590aeed3e9SJustin Hibbits 
1260852ba100SJustin Hibbits     if (p_CcNode->h_Ad)
1261852ba100SJustin Hibbits     {
1262852ba100SJustin Hibbits         FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_CcNode->h_FmPcd),
1263852ba100SJustin Hibbits                          p_CcNode->h_Ad);
1264852ba100SJustin Hibbits         p_CcNode->h_Ad = NULL;
1265852ba100SJustin Hibbits         p_CcNode->h_TmpAd = NULL;
12660aeed3e9SJustin Hibbits     }
1267852ba100SJustin Hibbits 
1268852ba100SJustin Hibbits     if (p_CcNode->h_StatsFLRs)
1269852ba100SJustin Hibbits     {
1270852ba100SJustin Hibbits         FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_CcNode->h_FmPcd),
1271852ba100SJustin Hibbits                          p_CcNode->h_StatsFLRs);
1272852ba100SJustin Hibbits         p_CcNode->h_StatsFLRs = NULL;
1273852ba100SJustin Hibbits     }
1274852ba100SJustin Hibbits 
1275852ba100SJustin Hibbits     if (p_CcNode->h_Spinlock)
1276852ba100SJustin Hibbits     {
1277852ba100SJustin Hibbits         XX_FreeSpinlock(p_CcNode->h_Spinlock);
1278852ba100SJustin Hibbits         p_CcNode->h_Spinlock = NULL;
1279852ba100SJustin Hibbits     }
1280852ba100SJustin Hibbits 
1281852ba100SJustin Hibbits     /* Restore the original counters pointer instead of the mutual pointer (mutual to all hash buckets) */
1282852ba100SJustin Hibbits     if (p_CcNode->isHashBucket
1283852ba100SJustin Hibbits             && (p_CcNode->statisticsMode != e_FM_PCD_CC_STATS_MODE_NONE))
1284852ba100SJustin Hibbits         p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].p_StatsObj->h_StatsCounters =
1285852ba100SJustin Hibbits                 p_CcNode->h_PrivMissStatsCounters;
1286852ba100SJustin Hibbits 
1287852ba100SJustin Hibbits     /* Releasing all currently used statistics objects, including 'miss' entry */
1288852ba100SJustin Hibbits     for (i = 0; i < p_CcNode->numOfKeys + 1; i++)
1289852ba100SJustin Hibbits         if (p_CcNode->keyAndNextEngineParams[i].p_StatsObj)
1290852ba100SJustin Hibbits             PutStatsObj(p_CcNode,
1291852ba100SJustin Hibbits                         p_CcNode->keyAndNextEngineParams[i].p_StatsObj);
1292852ba100SJustin Hibbits 
1293852ba100SJustin Hibbits     if (!NCSW_LIST_IsEmpty(&p_CcNode->availableStatsLst))
1294852ba100SJustin Hibbits     {
1295852ba100SJustin Hibbits         t_Handle h_FmMuram = FmPcdGetMuramHandle(p_CcNode->h_FmPcd);
1296852ba100SJustin Hibbits         ASSERT_COND(h_FmMuram);
1297852ba100SJustin Hibbits 
1298852ba100SJustin Hibbits         FreeStatObjects(&p_CcNode->availableStatsLst, h_FmMuram);
1299852ba100SJustin Hibbits     }
1300852ba100SJustin Hibbits 
1301852ba100SJustin Hibbits     NCSW_LIST_Del(&p_CcNode->availableStatsLst);
1302852ba100SJustin Hibbits 
1303852ba100SJustin Hibbits     ReleaseLst(&p_CcNode->ccPrevNodesLst);
1304852ba100SJustin Hibbits     ReleaseLst(&p_CcNode->ccTreeIdLst);
1305852ba100SJustin Hibbits     ReleaseLst(&p_CcNode->ccTreesLst);
1306852ba100SJustin Hibbits 
1307852ba100SJustin Hibbits     XX_Free(p_CcNode);
13080aeed3e9SJustin Hibbits }
13090aeed3e9SJustin Hibbits 
DeleteTree(t_FmPcdCcTree * p_FmPcdTree,t_FmPcd * p_FmPcd)13100aeed3e9SJustin Hibbits static void DeleteTree(t_FmPcdCcTree *p_FmPcdTree, t_FmPcd *p_FmPcd)
13110aeed3e9SJustin Hibbits {
13120aeed3e9SJustin Hibbits     if (p_FmPcdTree)
13130aeed3e9SJustin Hibbits     {
13140aeed3e9SJustin Hibbits         if (p_FmPcdTree->ccTreeBaseAddr)
13150aeed3e9SJustin Hibbits         {
1316852ba100SJustin Hibbits             FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_FmPcd),
1317852ba100SJustin Hibbits                              UINT_TO_PTR(p_FmPcdTree->ccTreeBaseAddr));
13180aeed3e9SJustin Hibbits             p_FmPcdTree->ccTreeBaseAddr = 0;
13190aeed3e9SJustin Hibbits         }
13200aeed3e9SJustin Hibbits 
13210aeed3e9SJustin Hibbits         ReleaseLst(&p_FmPcdTree->fmPortsLst);
13220aeed3e9SJustin Hibbits 
13230aeed3e9SJustin Hibbits         XX_Free(p_FmPcdTree);
13240aeed3e9SJustin Hibbits     }
13250aeed3e9SJustin Hibbits }
13260aeed3e9SJustin Hibbits 
GetCcExtractKeySize(uint8_t parseCodeRealSize,uint8_t * parseCodeCcSize)1327852ba100SJustin Hibbits static void GetCcExtractKeySize(uint8_t parseCodeRealSize,
1328852ba100SJustin Hibbits                                 uint8_t *parseCodeCcSize)
13290aeed3e9SJustin Hibbits {
13300aeed3e9SJustin Hibbits     if ((parseCodeRealSize > 0) && (parseCodeRealSize < 2))
13310aeed3e9SJustin Hibbits         *parseCodeCcSize = 1;
1332852ba100SJustin Hibbits     else
1333852ba100SJustin Hibbits         if (parseCodeRealSize == 2)
13340aeed3e9SJustin Hibbits             *parseCodeCcSize = 2;
1335852ba100SJustin Hibbits         else
1336852ba100SJustin Hibbits             if ((parseCodeRealSize > 2) && (parseCodeRealSize <= 4))
13370aeed3e9SJustin Hibbits                 *parseCodeCcSize = 4;
1338852ba100SJustin Hibbits             else
1339852ba100SJustin Hibbits                 if ((parseCodeRealSize > 4) && (parseCodeRealSize <= 8))
13400aeed3e9SJustin Hibbits                     *parseCodeCcSize = 8;
1341852ba100SJustin Hibbits                 else
1342852ba100SJustin Hibbits                     if ((parseCodeRealSize > 8) && (parseCodeRealSize <= 16))
13430aeed3e9SJustin Hibbits                         *parseCodeCcSize = 16;
1344852ba100SJustin Hibbits                     else
1345852ba100SJustin Hibbits                         if ((parseCodeRealSize > 16)
1346852ba100SJustin Hibbits                                 && (parseCodeRealSize <= 24))
13470aeed3e9SJustin Hibbits                             *parseCodeCcSize = 24;
1348852ba100SJustin Hibbits                         else
1349852ba100SJustin Hibbits                             if ((parseCodeRealSize > 24)
1350852ba100SJustin Hibbits                                     && (parseCodeRealSize <= 32))
13510aeed3e9SJustin Hibbits                                 *parseCodeCcSize = 32;
1352852ba100SJustin Hibbits                             else
1353852ba100SJustin Hibbits                                 if ((parseCodeRealSize > 32)
1354852ba100SJustin Hibbits                                         && (parseCodeRealSize <= 40))
13550aeed3e9SJustin Hibbits                                     *parseCodeCcSize = 40;
1356852ba100SJustin Hibbits                                 else
1357852ba100SJustin Hibbits                                     if ((parseCodeRealSize > 40)
1358852ba100SJustin Hibbits                                             && (parseCodeRealSize <= 48))
13590aeed3e9SJustin Hibbits                                         *parseCodeCcSize = 48;
1360852ba100SJustin Hibbits                                     else
1361852ba100SJustin Hibbits                                         if ((parseCodeRealSize > 48)
1362852ba100SJustin Hibbits                                                 && (parseCodeRealSize <= 56))
13630aeed3e9SJustin Hibbits                                             *parseCodeCcSize = 56;
13640aeed3e9SJustin Hibbits                                         else
13650aeed3e9SJustin Hibbits                                             *parseCodeCcSize = 0;
13660aeed3e9SJustin Hibbits }
13670aeed3e9SJustin Hibbits 
GetSizeHeaderField(e_NetHeaderType hdr,t_FmPcdFields field,uint8_t * parseCodeRealSize)1368852ba100SJustin Hibbits static void GetSizeHeaderField(e_NetHeaderType hdr, t_FmPcdFields field,
1369852ba100SJustin Hibbits 		                       uint8_t *parseCodeRealSize)
13700aeed3e9SJustin Hibbits {
13710aeed3e9SJustin Hibbits     switch (hdr)
13720aeed3e9SJustin Hibbits     {
13730aeed3e9SJustin Hibbits         case (HEADER_TYPE_ETH):
13740aeed3e9SJustin Hibbits             switch (field.eth)
13750aeed3e9SJustin Hibbits             {
13760aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_ETH_DA):
13770aeed3e9SJustin Hibbits                     *parseCodeRealSize = 6;
13780aeed3e9SJustin Hibbits                     break;
1379852ba100SJustin Hibbits 
13800aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_ETH_SA):
13810aeed3e9SJustin Hibbits                     *parseCodeRealSize = 6;
13820aeed3e9SJustin Hibbits                     break;
1383852ba100SJustin Hibbits 
13840aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_ETH_TYPE):
13850aeed3e9SJustin Hibbits                     *parseCodeRealSize = 2;
13860aeed3e9SJustin Hibbits                     break;
1387852ba100SJustin Hibbits 
13880aeed3e9SJustin Hibbits                 default:
13890aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported1"));
13900aeed3e9SJustin Hibbits                     *parseCodeRealSize = CC_SIZE_ILLEGAL;
13910aeed3e9SJustin Hibbits                     break;
13920aeed3e9SJustin Hibbits             }
13930aeed3e9SJustin Hibbits             break;
1394852ba100SJustin Hibbits 
13950aeed3e9SJustin Hibbits         case (HEADER_TYPE_PPPoE):
13960aeed3e9SJustin Hibbits             switch (field.pppoe)
13970aeed3e9SJustin Hibbits             {
13980aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_PPPoE_PID):
13990aeed3e9SJustin Hibbits                     *parseCodeRealSize = 2;
14000aeed3e9SJustin Hibbits                     break;
1401852ba100SJustin Hibbits 
14020aeed3e9SJustin Hibbits                 default:
14030aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported1"));
14040aeed3e9SJustin Hibbits                     *parseCodeRealSize = CC_SIZE_ILLEGAL;
14050aeed3e9SJustin Hibbits                     break;
14060aeed3e9SJustin Hibbits             }
14070aeed3e9SJustin Hibbits             break;
1408852ba100SJustin Hibbits 
14090aeed3e9SJustin Hibbits         case (HEADER_TYPE_VLAN):
14100aeed3e9SJustin Hibbits             switch (field.vlan)
14110aeed3e9SJustin Hibbits             {
14120aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_VLAN_TCI):
14130aeed3e9SJustin Hibbits                     *parseCodeRealSize = 2;
14140aeed3e9SJustin Hibbits                     break;
1415852ba100SJustin Hibbits 
14160aeed3e9SJustin Hibbits                 default:
14170aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported2"));
14180aeed3e9SJustin Hibbits                     *parseCodeRealSize = CC_SIZE_ILLEGAL;
14190aeed3e9SJustin Hibbits                     break;
14200aeed3e9SJustin Hibbits             }
14210aeed3e9SJustin Hibbits             break;
1422852ba100SJustin Hibbits 
14230aeed3e9SJustin Hibbits         case (HEADER_TYPE_MPLS):
14240aeed3e9SJustin Hibbits             switch (field.mpls)
14250aeed3e9SJustin Hibbits             {
14260aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_MPLS_LABEL_STACK):
14270aeed3e9SJustin Hibbits                     *parseCodeRealSize = 4;
14280aeed3e9SJustin Hibbits                     break;
1429852ba100SJustin Hibbits 
14300aeed3e9SJustin Hibbits                 default:
14310aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported3"));
14320aeed3e9SJustin Hibbits                     *parseCodeRealSize = CC_SIZE_ILLEGAL;
14330aeed3e9SJustin Hibbits                     break;
14340aeed3e9SJustin Hibbits             }
14350aeed3e9SJustin Hibbits             break;
1436852ba100SJustin Hibbits 
14370aeed3e9SJustin Hibbits         case (HEADER_TYPE_IPv4):
14380aeed3e9SJustin Hibbits             switch (field.ipv4)
14390aeed3e9SJustin Hibbits             {
14400aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv4_DST_IP):
14410aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv4_SRC_IP):
14420aeed3e9SJustin Hibbits                     *parseCodeRealSize = 4;
14430aeed3e9SJustin Hibbits                     break;
1444852ba100SJustin Hibbits 
14450aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv4_TOS):
14460aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv4_PROTO):
14470aeed3e9SJustin Hibbits                     *parseCodeRealSize = 1;
14480aeed3e9SJustin Hibbits                     break;
1449852ba100SJustin Hibbits 
1450852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_IPv4_DST_IP
1451852ba100SJustin Hibbits                         | NET_HEADER_FIELD_IPv4_SRC_IP):
14520aeed3e9SJustin Hibbits                     *parseCodeRealSize = 8;
14530aeed3e9SJustin Hibbits                     break;
1454852ba100SJustin Hibbits 
14550aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv4_TTL):
14560aeed3e9SJustin Hibbits                     *parseCodeRealSize = 1;
14570aeed3e9SJustin Hibbits                     break;
1458852ba100SJustin Hibbits 
14590aeed3e9SJustin Hibbits                 default:
14600aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported4"));
14610aeed3e9SJustin Hibbits                     *parseCodeRealSize = CC_SIZE_ILLEGAL;
14620aeed3e9SJustin Hibbits                     break;
14630aeed3e9SJustin Hibbits             }
14640aeed3e9SJustin Hibbits             break;
1465852ba100SJustin Hibbits 
14660aeed3e9SJustin Hibbits         case (HEADER_TYPE_IPv6):
14670aeed3e9SJustin Hibbits             switch (field.ipv6)
14680aeed3e9SJustin Hibbits             {
1469852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_IPv6_VER | NET_HEADER_FIELD_IPv6_FL
1470852ba100SJustin Hibbits                         | NET_HEADER_FIELD_IPv6_TC):
14710aeed3e9SJustin Hibbits                     *parseCodeRealSize = 4;
14720aeed3e9SJustin Hibbits                     break;
1473852ba100SJustin Hibbits 
14740aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv6_NEXT_HDR):
14750aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv6_HOP_LIMIT):
14760aeed3e9SJustin Hibbits                     *parseCodeRealSize = 1;
14770aeed3e9SJustin Hibbits                     break;
1478852ba100SJustin Hibbits 
14790aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv6_DST_IP):
14800aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv6_SRC_IP):
14810aeed3e9SJustin Hibbits                     *parseCodeRealSize = 16;
14820aeed3e9SJustin Hibbits                     break;
1483852ba100SJustin Hibbits 
14840aeed3e9SJustin Hibbits                 default:
14850aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported5"));
14860aeed3e9SJustin Hibbits                     *parseCodeRealSize = CC_SIZE_ILLEGAL;
14870aeed3e9SJustin Hibbits                     break;
14880aeed3e9SJustin Hibbits             }
14890aeed3e9SJustin Hibbits             break;
1490852ba100SJustin Hibbits 
1491852ba100SJustin Hibbits         case (HEADER_TYPE_IP):
1492852ba100SJustin Hibbits             switch (field.ip)
1493852ba100SJustin Hibbits             {
1494852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_IP_DSCP):
1495852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_IP_PROTO):
1496852ba100SJustin Hibbits                     *parseCodeRealSize = 1;
1497852ba100SJustin Hibbits                     break;
1498852ba100SJustin Hibbits 
1499852ba100SJustin Hibbits                 default:
1500852ba100SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported5"));
1501852ba100SJustin Hibbits                     *parseCodeRealSize = CC_SIZE_ILLEGAL;
1502852ba100SJustin Hibbits                     break;
1503852ba100SJustin Hibbits             }
1504852ba100SJustin Hibbits             break;
1505852ba100SJustin Hibbits 
15060aeed3e9SJustin Hibbits         case (HEADER_TYPE_GRE):
15070aeed3e9SJustin Hibbits             switch (field.gre)
15080aeed3e9SJustin Hibbits             {
15090aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_GRE_TYPE):
15100aeed3e9SJustin Hibbits                     *parseCodeRealSize = 2;
15110aeed3e9SJustin Hibbits                     break;
1512852ba100SJustin Hibbits 
15130aeed3e9SJustin Hibbits                 default:
15140aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported6"));
15150aeed3e9SJustin Hibbits                     *parseCodeRealSize = CC_SIZE_ILLEGAL;
15160aeed3e9SJustin Hibbits                     break;
15170aeed3e9SJustin Hibbits             }
15180aeed3e9SJustin Hibbits             break;
1519852ba100SJustin Hibbits 
15200aeed3e9SJustin Hibbits         case (HEADER_TYPE_MINENCAP):
15210aeed3e9SJustin Hibbits             switch (field.minencap)
15220aeed3e9SJustin Hibbits             {
15230aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_MINENCAP_TYPE):
15240aeed3e9SJustin Hibbits                     *parseCodeRealSize = 1;
15250aeed3e9SJustin Hibbits                     break;
1526852ba100SJustin Hibbits 
15270aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_MINENCAP_DST_IP):
15280aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_MINENCAP_SRC_IP):
15290aeed3e9SJustin Hibbits                     *parseCodeRealSize = 4;
15300aeed3e9SJustin Hibbits                     break;
1531852ba100SJustin Hibbits 
1532852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_MINENCAP_SRC_IP
1533852ba100SJustin Hibbits                         | NET_HEADER_FIELD_MINENCAP_DST_IP):
15340aeed3e9SJustin Hibbits                     *parseCodeRealSize = 8;
15350aeed3e9SJustin Hibbits                     break;
1536852ba100SJustin Hibbits 
15370aeed3e9SJustin Hibbits                 default:
15380aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported7"));
15390aeed3e9SJustin Hibbits                     *parseCodeRealSize = CC_SIZE_ILLEGAL;
15400aeed3e9SJustin Hibbits                     break;
15410aeed3e9SJustin Hibbits             }
15420aeed3e9SJustin Hibbits             break;
1543852ba100SJustin Hibbits 
15440aeed3e9SJustin Hibbits         case (HEADER_TYPE_TCP):
15450aeed3e9SJustin Hibbits             switch (field.tcp)
15460aeed3e9SJustin Hibbits             {
15470aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_TCP_PORT_SRC):
15480aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_TCP_PORT_DST):
15490aeed3e9SJustin Hibbits                     *parseCodeRealSize = 2;
15500aeed3e9SJustin Hibbits                     break;
1551852ba100SJustin Hibbits 
1552852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_TCP_PORT_SRC
1553852ba100SJustin Hibbits                         | NET_HEADER_FIELD_TCP_PORT_DST):
15540aeed3e9SJustin Hibbits                     *parseCodeRealSize = 4;
15550aeed3e9SJustin Hibbits                     break;
1556852ba100SJustin Hibbits 
15570aeed3e9SJustin Hibbits                 default:
15580aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported8"));
15590aeed3e9SJustin Hibbits                     *parseCodeRealSize = CC_SIZE_ILLEGAL;
15600aeed3e9SJustin Hibbits                     break;
15610aeed3e9SJustin Hibbits             }
15620aeed3e9SJustin Hibbits             break;
1563852ba100SJustin Hibbits 
15640aeed3e9SJustin Hibbits         case (HEADER_TYPE_UDP):
15650aeed3e9SJustin Hibbits             switch (field.udp)
15660aeed3e9SJustin Hibbits             {
15670aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_UDP_PORT_SRC):
15680aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_UDP_PORT_DST):
15690aeed3e9SJustin Hibbits                     *parseCodeRealSize = 2;
15700aeed3e9SJustin Hibbits                     break;
1571852ba100SJustin Hibbits 
1572852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_UDP_PORT_SRC
1573852ba100SJustin Hibbits                         | NET_HEADER_FIELD_UDP_PORT_DST):
15740aeed3e9SJustin Hibbits                     *parseCodeRealSize = 4;
15750aeed3e9SJustin Hibbits                     break;
1576852ba100SJustin Hibbits 
15770aeed3e9SJustin Hibbits                 default:
15780aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported9"));
15790aeed3e9SJustin Hibbits                     *parseCodeRealSize = CC_SIZE_ILLEGAL;
15800aeed3e9SJustin Hibbits                     break;
15810aeed3e9SJustin Hibbits             }
15820aeed3e9SJustin Hibbits             break;
1583852ba100SJustin Hibbits 
15840aeed3e9SJustin Hibbits         default:
15850aeed3e9SJustin Hibbits             REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported10"));
15860aeed3e9SJustin Hibbits             *parseCodeRealSize = CC_SIZE_ILLEGAL;
15870aeed3e9SJustin Hibbits             break;
15880aeed3e9SJustin Hibbits     }
15890aeed3e9SJustin Hibbits }
15900aeed3e9SJustin Hibbits 
ValidateNextEngineParams(t_Handle h_FmPcd,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams,e_FmPcdCcStatsMode statsMode)1591852ba100SJustin Hibbits t_Error ValidateNextEngineParams(
1592852ba100SJustin Hibbits         t_Handle h_FmPcd, t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams,
1593852ba100SJustin Hibbits         e_FmPcdCcStatsMode statsMode)
15940aeed3e9SJustin Hibbits {
15950aeed3e9SJustin Hibbits     uint16_t absoluteProfileId;
15960aeed3e9SJustin Hibbits     t_Error err = E_OK;
15970aeed3e9SJustin Hibbits     uint8_t relativeSchemeId;
15980aeed3e9SJustin Hibbits 
1599852ba100SJustin Hibbits     if ((statsMode == e_FM_PCD_CC_STATS_MODE_NONE)
1600852ba100SJustin Hibbits             && (p_FmPcdCcNextEngineParams->statisticsEn))
1601852ba100SJustin Hibbits         RETURN_ERROR(
1602852ba100SJustin Hibbits                 MAJOR,
1603852ba100SJustin Hibbits                 E_CONFLICT,
1604852ba100SJustin Hibbits                 ("Statistics are requested for a key, but statistics mode was set"
1605852ba100SJustin Hibbits                 "to 'NONE' upon initialization"));
1606852ba100SJustin Hibbits 
16070aeed3e9SJustin Hibbits     switch (p_FmPcdCcNextEngineParams->nextEngine)
16080aeed3e9SJustin Hibbits     {
16090aeed3e9SJustin Hibbits         case (e_FM_PCD_INVALID):
16100aeed3e9SJustin Hibbits             err = E_NOT_SUPPORTED;
16110aeed3e9SJustin Hibbits             break;
1612852ba100SJustin Hibbits 
16130aeed3e9SJustin Hibbits         case (e_FM_PCD_DONE):
1614852ba100SJustin Hibbits             if ((p_FmPcdCcNextEngineParams->params.enqueueParams.action
1615852ba100SJustin Hibbits                     == e_FM_PCD_ENQ_FRAME)
1616852ba100SJustin Hibbits                     && p_FmPcdCcNextEngineParams->params.enqueueParams.overrideFqid)
16170aeed3e9SJustin Hibbits             {
1618852ba100SJustin Hibbits                 if (!p_FmPcdCcNextEngineParams->params.enqueueParams.newFqid)
1619852ba100SJustin Hibbits                     RETURN_ERROR(
1620852ba100SJustin Hibbits                             MAJOR,
1621852ba100SJustin Hibbits                             E_CONFLICT,
1622852ba100SJustin Hibbits                             ("When overrideFqid is set, newFqid must not be zero"));
1623852ba100SJustin Hibbits                 if (p_FmPcdCcNextEngineParams->params.enqueueParams.newFqid
1624852ba100SJustin Hibbits                         & ~0x00FFFFFF)
1625852ba100SJustin Hibbits                     RETURN_ERROR(
1626852ba100SJustin Hibbits                             MAJOR, E_INVALID_VALUE,
1627852ba100SJustin Hibbits                             ("fqidForCtrlFlow must be between 1 and 2^24-1"));
16280aeed3e9SJustin Hibbits             }
16290aeed3e9SJustin Hibbits             break;
1630852ba100SJustin Hibbits 
16310aeed3e9SJustin Hibbits         case (e_FM_PCD_KG):
1632852ba100SJustin Hibbits             relativeSchemeId =
1633852ba100SJustin Hibbits                     FmPcdKgGetRelativeSchemeId(
1634852ba100SJustin Hibbits                             h_FmPcd,
1635852ba100SJustin Hibbits                             FmPcdKgGetSchemeId(
1636852ba100SJustin Hibbits                                     p_FmPcdCcNextEngineParams->params.kgParams.h_DirectScheme));
16370aeed3e9SJustin Hibbits             if (relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES)
16380aeed3e9SJustin Hibbits                 RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
1639852ba100SJustin Hibbits             if (!FmPcdKgIsSchemeValidSw(
1640852ba100SJustin Hibbits                     p_FmPcdCcNextEngineParams->params.kgParams.h_DirectScheme))
1641852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, E_INVALID_STATE,
1642852ba100SJustin Hibbits                              ("not valid schemeIndex in KG next engine param"));
16430aeed3e9SJustin Hibbits             if (!KgIsSchemeAlwaysDirect(h_FmPcd, relativeSchemeId))
1644852ba100SJustin Hibbits                 RETURN_ERROR(
1645852ba100SJustin Hibbits                         MAJOR,
1646852ba100SJustin Hibbits                         E_INVALID_STATE,
1647852ba100SJustin Hibbits                         ("CC Node may point only to a scheme that is always direct."));
16480aeed3e9SJustin Hibbits             break;
1649852ba100SJustin Hibbits 
16500aeed3e9SJustin Hibbits         case (e_FM_PCD_PLCR):
16510aeed3e9SJustin Hibbits             if (p_FmPcdCcNextEngineParams->params.plcrParams.overrideParams)
16520aeed3e9SJustin Hibbits             {
1653852ba100SJustin Hibbits                 /* if private policer profile, it may be uninitialized yet, therefore no checks are done at this stage */
16540aeed3e9SJustin Hibbits                 if (p_FmPcdCcNextEngineParams->params.plcrParams.sharedProfile)
16550aeed3e9SJustin Hibbits                 {
1656852ba100SJustin Hibbits                     err =
1657852ba100SJustin Hibbits                             FmPcdPlcrGetAbsoluteIdByProfileParams(
1658852ba100SJustin Hibbits                                     h_FmPcd,
1659852ba100SJustin Hibbits                                     e_FM_PCD_PLCR_SHARED,
1660852ba100SJustin Hibbits                                     NULL,
1661852ba100SJustin Hibbits                                     p_FmPcdCcNextEngineParams->params.plcrParams.newRelativeProfileId,
1662852ba100SJustin Hibbits                                     &absoluteProfileId);
16630aeed3e9SJustin Hibbits                     if (err)
1664852ba100SJustin Hibbits                         RETURN_ERROR(MAJOR, err,
1665852ba100SJustin Hibbits                                      ("Shared profile offset is out of range"));
16660aeed3e9SJustin Hibbits                     if (!FmPcdPlcrIsProfileValid(h_FmPcd, absoluteProfileId))
1667852ba100SJustin Hibbits                         RETURN_ERROR(MAJOR, E_INVALID_STATE,
1668852ba100SJustin Hibbits                                      ("Invalid profile"));
16690aeed3e9SJustin Hibbits                 }
16700aeed3e9SJustin Hibbits             }
16710aeed3e9SJustin Hibbits             break;
1672852ba100SJustin Hibbits 
1673852ba100SJustin Hibbits         case (e_FM_PCD_HASH):
1674852ba100SJustin Hibbits             p_FmPcdCcNextEngineParams->nextEngine = e_FM_PCD_CC;
16750aeed3e9SJustin Hibbits         case (e_FM_PCD_CC):
16760aeed3e9SJustin Hibbits             if (!p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode)
1677852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, E_NULL_POINTER,
1678852ba100SJustin Hibbits                              ("handler to next Node is NULL"));
16790aeed3e9SJustin Hibbits             break;
1680852ba100SJustin Hibbits 
1681852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
1682852ba100SJustin Hibbits         case (e_FM_PCD_FR):
1683852ba100SJustin Hibbits             if (!p_FmPcdCcNextEngineParams->params.frParams.h_FrmReplic)
1684852ba100SJustin Hibbits                 err = E_NOT_SUPPORTED;
1685852ba100SJustin Hibbits             break;
1686852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
1687852ba100SJustin Hibbits 
16880aeed3e9SJustin Hibbits         default:
1689852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_INVALID_STATE,
1690852ba100SJustin Hibbits                          ("Next engine is not correct"));
16910aeed3e9SJustin Hibbits     }
1692852ba100SJustin Hibbits 
1693852ba100SJustin Hibbits 
16940aeed3e9SJustin Hibbits     return err;
16950aeed3e9SJustin Hibbits }
16960aeed3e9SJustin Hibbits 
GetGenParseCode(e_FmPcdExtractFrom src,uint32_t offset,bool glblMask,uint8_t * parseArrayOffset,bool fromIc,ccPrivateInfo_t icCode)1697852ba100SJustin Hibbits static uint8_t GetGenParseCode(e_FmPcdExtractFrom src,
1698852ba100SJustin Hibbits                                uint32_t offset, bool glblMask,
1699852ba100SJustin Hibbits                                uint8_t *parseArrayOffset, bool fromIc,
1700852ba100SJustin Hibbits                                ccPrivateInfo_t icCode)
17010aeed3e9SJustin Hibbits {
17020aeed3e9SJustin Hibbits     if (!fromIc)
17030aeed3e9SJustin Hibbits     {
17040aeed3e9SJustin Hibbits         switch (src)
17050aeed3e9SJustin Hibbits         {
17060aeed3e9SJustin Hibbits             case (e_FM_PCD_EXTRACT_FROM_FRAME_START):
17070aeed3e9SJustin Hibbits                 if (glblMask)
17080aeed3e9SJustin Hibbits                     return CC_PC_GENERIC_WITH_MASK;
17090aeed3e9SJustin Hibbits                 else
17100aeed3e9SJustin Hibbits                     return CC_PC_GENERIC_WITHOUT_MASK;
1711852ba100SJustin Hibbits 
17120aeed3e9SJustin Hibbits             case (e_FM_PCD_EXTRACT_FROM_CURR_END_OF_PARSE):
17130aeed3e9SJustin Hibbits                 *parseArrayOffset = CC_PC_PR_NEXT_HEADER_OFFSET;
17140aeed3e9SJustin Hibbits                 if (offset)
17150aeed3e9SJustin Hibbits                     return CC_PR_OFFSET;
17160aeed3e9SJustin Hibbits                 else
17170aeed3e9SJustin Hibbits                     return CC_PR_WITHOUT_OFFSET;
1718852ba100SJustin Hibbits 
17190aeed3e9SJustin Hibbits             default:
17200aeed3e9SJustin Hibbits                 REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal 'extract from' src"));
17210aeed3e9SJustin Hibbits                 return CC_PC_ILLEGAL;
17220aeed3e9SJustin Hibbits         }
17230aeed3e9SJustin Hibbits     }
17240aeed3e9SJustin Hibbits     else
17250aeed3e9SJustin Hibbits     {
17260aeed3e9SJustin Hibbits         switch (icCode)
17270aeed3e9SJustin Hibbits         {
17280aeed3e9SJustin Hibbits             case (CC_PRIVATE_INFO_IC_KEY_EXACT_MATCH):
17290aeed3e9SJustin Hibbits                 *parseArrayOffset = 0x50;
17300aeed3e9SJustin Hibbits                 return CC_PC_GENERIC_IC_GMASK;
1731852ba100SJustin Hibbits 
17320aeed3e9SJustin Hibbits             case (CC_PRIVATE_INFO_IC_HASH_EXACT_MATCH):
17330aeed3e9SJustin Hibbits                 *parseArrayOffset = 0x48;
17340aeed3e9SJustin Hibbits                 return CC_PC_GENERIC_IC_GMASK;
1735852ba100SJustin Hibbits 
17360aeed3e9SJustin Hibbits             case (CC_PRIVATE_INFO_IC_HASH_INDEX_LOOKUP):
17370aeed3e9SJustin Hibbits                 *parseArrayOffset = 0x48;
17380aeed3e9SJustin Hibbits                 return CC_PC_GENERIC_IC_HASH_INDEXED;
1739852ba100SJustin Hibbits 
17400aeed3e9SJustin Hibbits             case (CC_PRIVATE_INFO_IC_DEQ_FQID_INDEX_LOOKUP):
17410aeed3e9SJustin Hibbits                 *parseArrayOffset = 0x16;
17420aeed3e9SJustin Hibbits                 return CC_PC_GENERIC_IC_HASH_INDEXED;
1743852ba100SJustin Hibbits 
17440aeed3e9SJustin Hibbits             default:
17450aeed3e9SJustin Hibbits                 REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal 'extract from' src"));
17460aeed3e9SJustin Hibbits                 break;
17470aeed3e9SJustin Hibbits         }
17480aeed3e9SJustin Hibbits     }
1749852ba100SJustin Hibbits 
17500aeed3e9SJustin Hibbits     return CC_PC_ILLEGAL;
17510aeed3e9SJustin Hibbits }
17520aeed3e9SJustin Hibbits 
GetFullFieldParseCode(e_NetHeaderType hdr,e_FmPcdHdrIndex index,t_FmPcdFields field)1753852ba100SJustin Hibbits static uint8_t GetFullFieldParseCode(e_NetHeaderType hdr, e_FmPcdHdrIndex index,
1754852ba100SJustin Hibbits                                      t_FmPcdFields field)
17550aeed3e9SJustin Hibbits {
17560aeed3e9SJustin Hibbits     switch (hdr)
17570aeed3e9SJustin Hibbits     {
17580aeed3e9SJustin Hibbits         case (HEADER_TYPE_NONE):
17590aeed3e9SJustin Hibbits             ASSERT_COND(FALSE);
17600aeed3e9SJustin Hibbits             return CC_PC_ILLEGAL;
17610aeed3e9SJustin Hibbits 
17620aeed3e9SJustin Hibbits         case (HEADER_TYPE_ETH):
17630aeed3e9SJustin Hibbits             switch (field.eth)
17640aeed3e9SJustin Hibbits             {
17650aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_ETH_DA):
17660aeed3e9SJustin Hibbits                     return CC_PC_FF_MACDST;
17670aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_ETH_SA):
17680aeed3e9SJustin Hibbits                     return CC_PC_FF_MACSRC;
17690aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_ETH_TYPE):
17700aeed3e9SJustin Hibbits                     return CC_PC_FF_ETYPE;
17710aeed3e9SJustin Hibbits                 default:
17720aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
17730aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
17740aeed3e9SJustin Hibbits             }
17750aeed3e9SJustin Hibbits 
17760aeed3e9SJustin Hibbits         case (HEADER_TYPE_VLAN):
17770aeed3e9SJustin Hibbits             switch (field.vlan)
17780aeed3e9SJustin Hibbits             {
17790aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_VLAN_TCI):
1780852ba100SJustin Hibbits                     if ((index == e_FM_PCD_HDR_INDEX_NONE)
1781852ba100SJustin Hibbits                             || (index == e_FM_PCD_HDR_INDEX_1))
17820aeed3e9SJustin Hibbits                         return CC_PC_FF_TCI1;
17830aeed3e9SJustin Hibbits                     if (index == e_FM_PCD_HDR_INDEX_LAST)
17840aeed3e9SJustin Hibbits                         return CC_PC_FF_TCI2;
17850aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
17860aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
17870aeed3e9SJustin Hibbits                 default:
17880aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
17890aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
17900aeed3e9SJustin Hibbits             }
17910aeed3e9SJustin Hibbits 
17920aeed3e9SJustin Hibbits         case (HEADER_TYPE_MPLS):
17930aeed3e9SJustin Hibbits             switch (field.mpls)
17940aeed3e9SJustin Hibbits             {
17950aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_MPLS_LABEL_STACK):
1796852ba100SJustin Hibbits                     if ((index == e_FM_PCD_HDR_INDEX_NONE)
1797852ba100SJustin Hibbits                             || (index == e_FM_PCD_HDR_INDEX_1))
17980aeed3e9SJustin Hibbits                         return CC_PC_FF_MPLS1;
17990aeed3e9SJustin Hibbits                     if (index == e_FM_PCD_HDR_INDEX_LAST)
18000aeed3e9SJustin Hibbits                         return CC_PC_FF_MPLS_LAST;
18010aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal MPLS index"));
18020aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
18030aeed3e9SJustin Hibbits                 default:
18040aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
18050aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
18060aeed3e9SJustin Hibbits             }
18070aeed3e9SJustin Hibbits 
18080aeed3e9SJustin Hibbits         case (HEADER_TYPE_IPv4):
18090aeed3e9SJustin Hibbits             switch (field.ipv4)
18100aeed3e9SJustin Hibbits             {
18110aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv4_DST_IP):
1812852ba100SJustin Hibbits                     if ((index == e_FM_PCD_HDR_INDEX_NONE)
1813852ba100SJustin Hibbits                             || (index == e_FM_PCD_HDR_INDEX_1))
18140aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV4DST1;
18150aeed3e9SJustin Hibbits                     if (index == e_FM_PCD_HDR_INDEX_2)
18160aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV4DST2;
18170aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
18180aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
18190aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv4_TOS):
1820852ba100SJustin Hibbits                     if ((index == e_FM_PCD_HDR_INDEX_NONE)
1821852ba100SJustin Hibbits                             || (index == e_FM_PCD_HDR_INDEX_1))
18220aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV4IPTOS_TC1;
18230aeed3e9SJustin Hibbits                     if (index == e_FM_PCD_HDR_INDEX_2)
18240aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV4IPTOS_TC2;
18250aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
18260aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
18270aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv4_PROTO):
1828852ba100SJustin Hibbits                     if ((index == e_FM_PCD_HDR_INDEX_NONE)
1829852ba100SJustin Hibbits                             || (index == e_FM_PCD_HDR_INDEX_1))
18300aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV4PTYPE1;
18310aeed3e9SJustin Hibbits                     if (index == e_FM_PCD_HDR_INDEX_2)
18320aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV4PTYPE2;
18330aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
18340aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
18350aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv4_SRC_IP):
1836852ba100SJustin Hibbits                     if ((index == e_FM_PCD_HDR_INDEX_NONE)
1837852ba100SJustin Hibbits                             || (index == e_FM_PCD_HDR_INDEX_1))
18380aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV4SRC1;
18390aeed3e9SJustin Hibbits                     if (index == e_FM_PCD_HDR_INDEX_2)
18400aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV4SRC2;
18410aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
18420aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
1843852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_IPv4_SRC_IP
1844852ba100SJustin Hibbits                         | NET_HEADER_FIELD_IPv4_DST_IP):
1845852ba100SJustin Hibbits                     if ((index == e_FM_PCD_HDR_INDEX_NONE)
1846852ba100SJustin Hibbits                             || (index == e_FM_PCD_HDR_INDEX_1))
18470aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV4SRC1_IPV4DST1;
18480aeed3e9SJustin Hibbits                     if (index == e_FM_PCD_HDR_INDEX_2)
18490aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV4SRC2_IPV4DST2;
18500aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
18510aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
18520aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv4_TTL):
18530aeed3e9SJustin Hibbits                     return CC_PC_FF_IPV4TTL;
18540aeed3e9SJustin Hibbits                 default:
18550aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
18560aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
18570aeed3e9SJustin Hibbits             }
18580aeed3e9SJustin Hibbits 
18590aeed3e9SJustin Hibbits         case (HEADER_TYPE_IPv6):
18600aeed3e9SJustin Hibbits             switch (field.ipv6)
18610aeed3e9SJustin Hibbits             {
1862852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_IPv6_VER | NET_HEADER_FIELD_IPv6_FL
1863852ba100SJustin Hibbits                         | NET_HEADER_FIELD_IPv6_TC):
1864852ba100SJustin Hibbits                     if ((index == e_FM_PCD_HDR_INDEX_NONE)
1865852ba100SJustin Hibbits                             || (index == e_FM_PCD_HDR_INDEX_1))
18660aeed3e9SJustin Hibbits                         return CC_PC_FF_IPTOS_IPV6TC1_IPV6FLOW1;
18670aeed3e9SJustin Hibbits                     if (index == e_FM_PCD_HDR_INDEX_2)
18680aeed3e9SJustin Hibbits                         return CC_PC_FF_IPTOS_IPV6TC2_IPV6FLOW2;
18690aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
18700aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
1871852ba100SJustin Hibbits 
18720aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv6_NEXT_HDR):
1873852ba100SJustin Hibbits                     if ((index == e_FM_PCD_HDR_INDEX_NONE)
1874852ba100SJustin Hibbits                             || (index == e_FM_PCD_HDR_INDEX_1))
18750aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV6PTYPE1;
18760aeed3e9SJustin Hibbits                     if (index == e_FM_PCD_HDR_INDEX_2)
18770aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV6PTYPE2;
1878852ba100SJustin Hibbits                     if (index == e_FM_PCD_HDR_INDEX_LAST)
1879852ba100SJustin Hibbits                         return CC_PC_FF_IPPID;
18800aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
18810aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
1882852ba100SJustin Hibbits 
18830aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv6_DST_IP):
1884852ba100SJustin Hibbits                     if ((index == e_FM_PCD_HDR_INDEX_NONE)
1885852ba100SJustin Hibbits                             || (index == e_FM_PCD_HDR_INDEX_1))
18860aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV6DST1;
18870aeed3e9SJustin Hibbits                     if (index == e_FM_PCD_HDR_INDEX_2)
18880aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV6DST2;
18890aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
18900aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
1891852ba100SJustin Hibbits 
18920aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv6_SRC_IP):
1893852ba100SJustin Hibbits                     if ((index == e_FM_PCD_HDR_INDEX_NONE)
1894852ba100SJustin Hibbits                             || (index == e_FM_PCD_HDR_INDEX_1))
18950aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV6SRC1;
18960aeed3e9SJustin Hibbits                     if (index == e_FM_PCD_HDR_INDEX_2)
18970aeed3e9SJustin Hibbits                         return CC_PC_FF_IPV6SRC2;
18980aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
18990aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
1900852ba100SJustin Hibbits 
19010aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_IPv6_HOP_LIMIT):
19020aeed3e9SJustin Hibbits                     return CC_PC_FF_IPV6HOP_LIMIT;
1903852ba100SJustin Hibbits 
1904852ba100SJustin Hibbits                 default:
1905852ba100SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
1906852ba100SJustin Hibbits                     return CC_PC_ILLEGAL;
1907852ba100SJustin Hibbits             }
1908852ba100SJustin Hibbits 
1909852ba100SJustin Hibbits         case (HEADER_TYPE_IP):
1910852ba100SJustin Hibbits             switch (field.ip)
1911852ba100SJustin Hibbits             {
1912852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_IP_DSCP):
1913852ba100SJustin Hibbits                     if ((index == e_FM_PCD_HDR_INDEX_NONE)
1914852ba100SJustin Hibbits                             || (index == e_FM_PCD_HDR_INDEX_1))
1915852ba100SJustin Hibbits                         return CC_PC_FF_IPDSCP;
1916852ba100SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IP index"));
1917852ba100SJustin Hibbits                     return CC_PC_ILLEGAL;
1918852ba100SJustin Hibbits 
1919852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_IP_PROTO):
1920852ba100SJustin Hibbits                     if (index == e_FM_PCD_HDR_INDEX_LAST)
1921852ba100SJustin Hibbits                         return CC_PC_FF_IPPID;
1922852ba100SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IP index"));
1923852ba100SJustin Hibbits                     return CC_PC_ILLEGAL;
1924852ba100SJustin Hibbits 
19250aeed3e9SJustin Hibbits                 default:
19260aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
19270aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
19280aeed3e9SJustin Hibbits             }
19290aeed3e9SJustin Hibbits 
19300aeed3e9SJustin Hibbits         case (HEADER_TYPE_GRE):
19310aeed3e9SJustin Hibbits             switch (field.gre)
19320aeed3e9SJustin Hibbits             {
19330aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_GRE_TYPE):
19340aeed3e9SJustin Hibbits                     return CC_PC_FF_GREPTYPE;
1935852ba100SJustin Hibbits 
19360aeed3e9SJustin Hibbits                 default:
19370aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
19380aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
19390aeed3e9SJustin Hibbits             }
1940852ba100SJustin Hibbits 
19410aeed3e9SJustin Hibbits         case (HEADER_TYPE_MINENCAP):
19420aeed3e9SJustin Hibbits             switch (field.minencap)
19430aeed3e9SJustin Hibbits             {
19440aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_MINENCAP_TYPE):
19450aeed3e9SJustin Hibbits                     return CC_PC_FF_MINENCAP_PTYPE;
1946852ba100SJustin Hibbits 
19470aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_MINENCAP_DST_IP):
19480aeed3e9SJustin Hibbits                     return CC_PC_FF_MINENCAP_IPDST;
1949852ba100SJustin Hibbits 
19500aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_MINENCAP_SRC_IP):
19510aeed3e9SJustin Hibbits                     return CC_PC_FF_MINENCAP_IPSRC;
1952852ba100SJustin Hibbits 
1953852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_MINENCAP_SRC_IP
1954852ba100SJustin Hibbits                         | NET_HEADER_FIELD_MINENCAP_DST_IP):
19550aeed3e9SJustin Hibbits                     return CC_PC_FF_MINENCAP_IPSRC_IPDST;
1956852ba100SJustin Hibbits 
19570aeed3e9SJustin Hibbits                 default:
19580aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
19590aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
19600aeed3e9SJustin Hibbits             }
19610aeed3e9SJustin Hibbits 
19620aeed3e9SJustin Hibbits         case (HEADER_TYPE_TCP):
19630aeed3e9SJustin Hibbits             switch (field.tcp)
19640aeed3e9SJustin Hibbits             {
19650aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_TCP_PORT_SRC):
19660aeed3e9SJustin Hibbits                     return CC_PC_FF_L4PSRC;
1967852ba100SJustin Hibbits 
19680aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_TCP_PORT_DST):
19690aeed3e9SJustin Hibbits                     return CC_PC_FF_L4PDST;
1970852ba100SJustin Hibbits 
1971852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_TCP_PORT_DST
1972852ba100SJustin Hibbits                         | NET_HEADER_FIELD_TCP_PORT_SRC):
19730aeed3e9SJustin Hibbits                     return CC_PC_FF_L4PSRC_L4PDST;
1974852ba100SJustin Hibbits 
19750aeed3e9SJustin Hibbits                 default:
19760aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
19770aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
19780aeed3e9SJustin Hibbits             }
19790aeed3e9SJustin Hibbits 
19800aeed3e9SJustin Hibbits         case (HEADER_TYPE_PPPoE):
19810aeed3e9SJustin Hibbits             switch (field.pppoe)
19820aeed3e9SJustin Hibbits             {
19830aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_PPPoE_PID):
19840aeed3e9SJustin Hibbits                     return CC_PC_FF_PPPPID;
1985852ba100SJustin Hibbits 
19860aeed3e9SJustin Hibbits                 default:
19870aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
19880aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
19890aeed3e9SJustin Hibbits             }
19900aeed3e9SJustin Hibbits 
19910aeed3e9SJustin Hibbits         case (HEADER_TYPE_UDP):
19920aeed3e9SJustin Hibbits             switch (field.udp)
19930aeed3e9SJustin Hibbits             {
19940aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_UDP_PORT_SRC):
19950aeed3e9SJustin Hibbits                     return CC_PC_FF_L4PSRC;
1996852ba100SJustin Hibbits 
19970aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_UDP_PORT_DST):
19980aeed3e9SJustin Hibbits                     return CC_PC_FF_L4PDST;
1999852ba100SJustin Hibbits 
2000852ba100SJustin Hibbits                 case (NET_HEADER_FIELD_UDP_PORT_DST
2001852ba100SJustin Hibbits                         | NET_HEADER_FIELD_UDP_PORT_SRC):
20020aeed3e9SJustin Hibbits                     return CC_PC_FF_L4PSRC_L4PDST;
2003852ba100SJustin Hibbits 
20040aeed3e9SJustin Hibbits                 default:
20050aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
20060aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
20070aeed3e9SJustin Hibbits             }
20080aeed3e9SJustin Hibbits 
20090aeed3e9SJustin Hibbits         default:
20100aeed3e9SJustin Hibbits             REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
20110aeed3e9SJustin Hibbits             return CC_PC_ILLEGAL;
20120aeed3e9SJustin Hibbits     }
20130aeed3e9SJustin Hibbits }
20140aeed3e9SJustin Hibbits 
GetPrParseCode(e_NetHeaderType hdr,e_FmPcdHdrIndex hdrIndex,uint32_t offset,bool glblMask,uint8_t * parseArrayOffset)2015852ba100SJustin Hibbits static uint8_t GetPrParseCode(e_NetHeaderType hdr, e_FmPcdHdrIndex hdrIndex,
2016852ba100SJustin Hibbits                               uint32_t offset, bool glblMask,
2017852ba100SJustin Hibbits                               uint8_t *parseArrayOffset)
20180aeed3e9SJustin Hibbits {
20190aeed3e9SJustin Hibbits     bool offsetRelevant = FALSE;
20200aeed3e9SJustin Hibbits 
20210aeed3e9SJustin Hibbits     if (offset)
20220aeed3e9SJustin Hibbits         offsetRelevant = TRUE;
20230aeed3e9SJustin Hibbits 
2024852ba100SJustin Hibbits     switch (hdr)
2025852ba100SJustin Hibbits     {
20260aeed3e9SJustin Hibbits         case (HEADER_TYPE_NONE):
20270aeed3e9SJustin Hibbits             ASSERT_COND(FALSE);
20280aeed3e9SJustin Hibbits             return CC_PC_ILLEGAL;
2029852ba100SJustin Hibbits 
20300aeed3e9SJustin Hibbits         case (HEADER_TYPE_ETH):
20310aeed3e9SJustin Hibbits             *parseArrayOffset = (uint8_t)CC_PC_PR_ETH_OFFSET;
20320aeed3e9SJustin Hibbits             break;
2033852ba100SJustin Hibbits 
20340aeed3e9SJustin Hibbits         case (HEADER_TYPE_USER_DEFINED_SHIM1):
20350aeed3e9SJustin Hibbits             if (offset || glblMask)
20360aeed3e9SJustin Hibbits                 *parseArrayOffset = (uint8_t)CC_PC_PR_USER_DEFINED_SHIM1_OFFSET;
20370aeed3e9SJustin Hibbits             else
20380aeed3e9SJustin Hibbits                 return CC_PC_PR_SHIM1;
20390aeed3e9SJustin Hibbits             break;
2040852ba100SJustin Hibbits 
20410aeed3e9SJustin Hibbits         case (HEADER_TYPE_USER_DEFINED_SHIM2):
20420aeed3e9SJustin Hibbits             if (offset || glblMask)
20430aeed3e9SJustin Hibbits                 *parseArrayOffset = (uint8_t)CC_PC_PR_USER_DEFINED_SHIM2_OFFSET;
20440aeed3e9SJustin Hibbits             else
20450aeed3e9SJustin Hibbits                 return CC_PC_PR_SHIM2;
20460aeed3e9SJustin Hibbits             break;
2047852ba100SJustin Hibbits 
20480aeed3e9SJustin Hibbits         case (HEADER_TYPE_LLC_SNAP):
20490aeed3e9SJustin Hibbits             *parseArrayOffset = CC_PC_PR_USER_LLC_SNAP_OFFSET;
20500aeed3e9SJustin Hibbits             break;
2051852ba100SJustin Hibbits 
20520aeed3e9SJustin Hibbits         case (HEADER_TYPE_PPPoE):
20530aeed3e9SJustin Hibbits             *parseArrayOffset = CC_PC_PR_PPPOE_OFFSET;
20540aeed3e9SJustin Hibbits             break;
2055852ba100SJustin Hibbits 
20560aeed3e9SJustin Hibbits         case (HEADER_TYPE_MPLS):
2057852ba100SJustin Hibbits             if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE)
2058852ba100SJustin Hibbits                     || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
20590aeed3e9SJustin Hibbits                 *parseArrayOffset = CC_PC_PR_MPLS1_OFFSET;
2060852ba100SJustin Hibbits             else
2061852ba100SJustin Hibbits                 if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)
20620aeed3e9SJustin Hibbits                     *parseArrayOffset = CC_PC_PR_MPLS_LAST_OFFSET;
20630aeed3e9SJustin Hibbits                 else
20640aeed3e9SJustin Hibbits                 {
20650aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal MPLS header index"));
20660aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
20670aeed3e9SJustin Hibbits                 }
20680aeed3e9SJustin Hibbits             break;
2069852ba100SJustin Hibbits 
20700aeed3e9SJustin Hibbits         case (HEADER_TYPE_IPv4):
20710aeed3e9SJustin Hibbits         case (HEADER_TYPE_IPv6):
2072852ba100SJustin Hibbits             if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE)
2073852ba100SJustin Hibbits                     || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
20740aeed3e9SJustin Hibbits                 *parseArrayOffset = CC_PC_PR_IP1_OFFSET;
2075852ba100SJustin Hibbits             else
2076852ba100SJustin Hibbits                 if (hdrIndex == e_FM_PCD_HDR_INDEX_2)
20770aeed3e9SJustin Hibbits                     *parseArrayOffset = CC_PC_PR_IP_LAST_OFFSET;
20780aeed3e9SJustin Hibbits                 else
20790aeed3e9SJustin Hibbits                 {
20800aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IP header index"));
20810aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
20820aeed3e9SJustin Hibbits                 }
20830aeed3e9SJustin Hibbits             break;
2084852ba100SJustin Hibbits 
20850aeed3e9SJustin Hibbits         case (HEADER_TYPE_MINENCAP):
20860aeed3e9SJustin Hibbits             *parseArrayOffset = CC_PC_PR_MINENC_OFFSET;
20870aeed3e9SJustin Hibbits             break;
2088852ba100SJustin Hibbits 
20890aeed3e9SJustin Hibbits         case (HEADER_TYPE_GRE):
20900aeed3e9SJustin Hibbits             *parseArrayOffset = CC_PC_PR_GRE_OFFSET;
20910aeed3e9SJustin Hibbits             break;
2092852ba100SJustin Hibbits 
20930aeed3e9SJustin Hibbits         case (HEADER_TYPE_TCP):
20940aeed3e9SJustin Hibbits         case (HEADER_TYPE_UDP):
20950aeed3e9SJustin Hibbits         case (HEADER_TYPE_IPSEC_AH):
20960aeed3e9SJustin Hibbits         case (HEADER_TYPE_IPSEC_ESP):
20970aeed3e9SJustin Hibbits         case (HEADER_TYPE_DCCP):
20980aeed3e9SJustin Hibbits         case (HEADER_TYPE_SCTP):
20990aeed3e9SJustin Hibbits             *parseArrayOffset = CC_PC_PR_L4_OFFSET;
21000aeed3e9SJustin Hibbits             break;
21010aeed3e9SJustin Hibbits 
21020aeed3e9SJustin Hibbits         default:
21030aeed3e9SJustin Hibbits             REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IP header for this type of operation"));
21040aeed3e9SJustin Hibbits             return CC_PC_ILLEGAL;
21050aeed3e9SJustin Hibbits     }
21060aeed3e9SJustin Hibbits 
21070aeed3e9SJustin Hibbits     if (offsetRelevant)
21080aeed3e9SJustin Hibbits         return CC_PR_OFFSET;
21090aeed3e9SJustin Hibbits     else
21100aeed3e9SJustin Hibbits         return CC_PR_WITHOUT_OFFSET;
21110aeed3e9SJustin Hibbits }
21120aeed3e9SJustin Hibbits 
GetFieldParseCode(e_NetHeaderType hdr,t_FmPcdFields field,uint32_t offset,uint8_t * parseArrayOffset,e_FmPcdHdrIndex hdrIndex)2113852ba100SJustin Hibbits static uint8_t GetFieldParseCode(e_NetHeaderType hdr, t_FmPcdFields field,
2114852ba100SJustin Hibbits                                  uint32_t offset, uint8_t *parseArrayOffset,
2115852ba100SJustin Hibbits                                  e_FmPcdHdrIndex hdrIndex)
21160aeed3e9SJustin Hibbits {
21170aeed3e9SJustin Hibbits     bool offsetRelevant = FALSE;
21180aeed3e9SJustin Hibbits 
21190aeed3e9SJustin Hibbits     if (offset)
21200aeed3e9SJustin Hibbits         offsetRelevant = TRUE;
21210aeed3e9SJustin Hibbits 
21220aeed3e9SJustin Hibbits     switch (hdr)
21230aeed3e9SJustin Hibbits     {
21240aeed3e9SJustin Hibbits         case (HEADER_TYPE_NONE):
21250aeed3e9SJustin Hibbits             ASSERT_COND(FALSE);
2126852ba100SJustin Hibbits                 break;
21270aeed3e9SJustin Hibbits         case (HEADER_TYPE_ETH):
21280aeed3e9SJustin Hibbits             switch (field.eth)
21290aeed3e9SJustin Hibbits             {
21300aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_ETH_TYPE):
21310aeed3e9SJustin Hibbits                     *parseArrayOffset = CC_PC_PR_ETYPE_LAST_OFFSET;
21320aeed3e9SJustin Hibbits                     break;
2133852ba100SJustin Hibbits 
21340aeed3e9SJustin Hibbits                 default:
21350aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
21360aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
21370aeed3e9SJustin Hibbits             }
21380aeed3e9SJustin Hibbits             break;
2139852ba100SJustin Hibbits 
21400aeed3e9SJustin Hibbits         case (HEADER_TYPE_VLAN):
21410aeed3e9SJustin Hibbits             switch (field.vlan)
21420aeed3e9SJustin Hibbits             {
21430aeed3e9SJustin Hibbits                 case (NET_HEADER_FIELD_VLAN_TCI):
2144852ba100SJustin Hibbits                     if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE)
2145852ba100SJustin Hibbits                             || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
21460aeed3e9SJustin Hibbits                         *parseArrayOffset = CC_PC_PR_VLAN1_OFFSET;
2147852ba100SJustin Hibbits                     else
2148852ba100SJustin Hibbits                         if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)
21490aeed3e9SJustin Hibbits                             *parseArrayOffset = CC_PC_PR_VLAN2_OFFSET;
21500aeed3e9SJustin Hibbits                     break;
2151852ba100SJustin Hibbits 
21520aeed3e9SJustin Hibbits                 default:
21530aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
21540aeed3e9SJustin Hibbits                     return CC_PC_ILLEGAL;
21550aeed3e9SJustin Hibbits             }
21560aeed3e9SJustin Hibbits             break;
2157852ba100SJustin Hibbits 
21580aeed3e9SJustin Hibbits         default:
21590aeed3e9SJustin Hibbits             REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal header "));
21600aeed3e9SJustin Hibbits             return CC_PC_ILLEGAL;
21610aeed3e9SJustin Hibbits     }
2162852ba100SJustin Hibbits 
21630aeed3e9SJustin Hibbits     if (offsetRelevant)
21640aeed3e9SJustin Hibbits         return CC_PR_OFFSET;
21650aeed3e9SJustin Hibbits     else
21660aeed3e9SJustin Hibbits         return CC_PR_WITHOUT_OFFSET;
21670aeed3e9SJustin Hibbits }
21680aeed3e9SJustin Hibbits 
FillAdOfTypeResult(t_Handle h_Ad,t_FmPcdCcStatsParams * p_FmPcdCcStatsParams,t_FmPcd * p_FmPcd,t_FmPcdCcNextEngineParams * p_CcNextEngineParams)2169852ba100SJustin Hibbits static void FillAdOfTypeResult(t_Handle h_Ad,
2170852ba100SJustin Hibbits                                t_FmPcdCcStatsParams *p_FmPcdCcStatsParams,
2171852ba100SJustin Hibbits                                t_FmPcd *p_FmPcd,
2172852ba100SJustin Hibbits                                t_FmPcdCcNextEngineParams *p_CcNextEngineParams)
21730aeed3e9SJustin Hibbits {
2174852ba100SJustin Hibbits     t_AdOfTypeResult *p_AdResult = (t_AdOfTypeResult *)h_Ad;
2175852ba100SJustin Hibbits     t_Handle h_TmpAd;
21760aeed3e9SJustin Hibbits     uint32_t tmp = 0, tmpNia = 0;
21770aeed3e9SJustin Hibbits     uint16_t profileId;
21780aeed3e9SJustin Hibbits     t_Handle p_AdNewPtr = NULL;
2179852ba100SJustin Hibbits     t_Error err = E_OK;
21800aeed3e9SJustin Hibbits 
2181852ba100SJustin Hibbits     /* There are 3 cases handled in this routine of building a "result" type AD.
2182852ba100SJustin Hibbits      * Case 1: No Manip. The action descriptor is built within the match table.
2183852ba100SJustin Hibbits      * Case 2: Manip exists. A new AD is created - p_AdNewPtr. It is initialized
2184852ba100SJustin Hibbits      *         either in the FmPcdManipUpdateAdResultForCc routine or it was already
2185852ba100SJustin Hibbits      *         initialized and returned here.
2186852ba100SJustin Hibbits      *         p_AdResult (within the match table) will be initialized after
2187852ba100SJustin Hibbits      *         this routine returns and point to the existing AD.
2188852ba100SJustin Hibbits      * Case 3: Manip exists. The action descriptor is built within the match table.
2189852ba100SJustin Hibbits      *         FmPcdManipUpdateAdResultForCc returns a NULL p_AdNewPtr.
2190852ba100SJustin Hibbits      *
2191852ba100SJustin Hibbits      * If statistics were enabled and the statistics mode of this node requires
2192852ba100SJustin Hibbits      * a statistics Ad, it will be placed after the result Ad and before the
2193852ba100SJustin Hibbits      * manip Ad, if manip Ad exists here.
2194852ba100SJustin Hibbits      */
2195852ba100SJustin Hibbits 
2196852ba100SJustin Hibbits     /* As default, the "new" ptr is the current one. i.e. the content of the result
2197852ba100SJustin Hibbits      * AD will be written into the match table itself (case (1))*/
21980aeed3e9SJustin Hibbits     p_AdNewPtr = p_AdResult;
21990aeed3e9SJustin Hibbits 
2200852ba100SJustin Hibbits     /* Initialize an action descriptor, if current statistics mode requires an Ad */
2201852ba100SJustin Hibbits     if (p_FmPcdCcStatsParams)
2202852ba100SJustin Hibbits     {
2203852ba100SJustin Hibbits         ASSERT_COND(p_FmPcdCcStatsParams->h_StatsAd);
2204852ba100SJustin Hibbits         ASSERT_COND(p_FmPcdCcStatsParams->h_StatsCounters);
22050aeed3e9SJustin Hibbits 
2206852ba100SJustin Hibbits         /* Swapping addresses between statistics Ad and the current lookup AD addresses */
2207852ba100SJustin Hibbits         h_TmpAd = p_FmPcdCcStatsParams->h_StatsAd;
2208852ba100SJustin Hibbits         p_FmPcdCcStatsParams->h_StatsAd = h_Ad;
2209852ba100SJustin Hibbits         h_Ad = h_TmpAd;
2210852ba100SJustin Hibbits 
2211852ba100SJustin Hibbits         p_AdNewPtr = h_Ad;
2212852ba100SJustin Hibbits         p_AdResult = h_Ad;
2213852ba100SJustin Hibbits 
2214852ba100SJustin Hibbits         /* Init statistics Ad and connect current lookup AD as 'next action' from statistics Ad */
2215852ba100SJustin Hibbits         UpdateStatsAd(p_FmPcdCcStatsParams, h_Ad, p_FmPcd->physicalMuramBase);
2216852ba100SJustin Hibbits     }
2217852ba100SJustin Hibbits 
2218852ba100SJustin Hibbits     /* Create manip and return p_AdNewPtr to either a new descriptor or NULL */
2219852ba100SJustin Hibbits     if (p_CcNextEngineParams->h_Manip)
2220852ba100SJustin Hibbits         FmPcdManipUpdateAdResultForCc(p_CcNextEngineParams->h_Manip,
2221852ba100SJustin Hibbits                                       p_CcNextEngineParams, h_Ad, &p_AdNewPtr);
2222852ba100SJustin Hibbits 
2223852ba100SJustin Hibbits     /* if (p_AdNewPtr = NULL) --> Done. (case (3)) */
22240aeed3e9SJustin Hibbits     if (p_AdNewPtr)
22250aeed3e9SJustin Hibbits     {
2226852ba100SJustin Hibbits         /* case (1) and (2) */
22270aeed3e9SJustin Hibbits         switch (p_CcNextEngineParams->nextEngine)
22280aeed3e9SJustin Hibbits         {
22290aeed3e9SJustin Hibbits             case (e_FM_PCD_DONE):
2230852ba100SJustin Hibbits                 if (p_CcNextEngineParams->params.enqueueParams.action
2231852ba100SJustin Hibbits                         == e_FM_PCD_ENQ_FRAME)
22320aeed3e9SJustin Hibbits                 {
22330aeed3e9SJustin Hibbits                     if (p_CcNextEngineParams->params.enqueueParams.overrideFqid)
22340aeed3e9SJustin Hibbits                     {
22350aeed3e9SJustin Hibbits                         tmp = FM_PCD_AD_RESULT_CONTRL_FLOW_TYPE;
2236852ba100SJustin Hibbits                         tmp |=
2237852ba100SJustin Hibbits                                 p_CcNextEngineParams->params.enqueueParams.newFqid;
2238852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2239852ba100SJustin Hibbits                         tmp |=
2240852ba100SJustin Hibbits                                 (p_CcNextEngineParams->params.enqueueParams.newRelativeStorageProfileId
2241852ba100SJustin Hibbits                                         & FM_PCD_AD_RESULT_VSP_MASK)
2242852ba100SJustin Hibbits                                         << FM_PCD_AD_RESULT_VSP_SHIFT;
2243852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
22440aeed3e9SJustin Hibbits                     }
22450aeed3e9SJustin Hibbits                     else
22460aeed3e9SJustin Hibbits                     {
22470aeed3e9SJustin Hibbits                         tmp = FM_PCD_AD_RESULT_DATA_FLOW_TYPE;
22480aeed3e9SJustin Hibbits                         tmp |= FM_PCD_AD_RESULT_PLCR_DIS;
22490aeed3e9SJustin Hibbits                     }
22500aeed3e9SJustin Hibbits                 }
2251852ba100SJustin Hibbits 
2252852ba100SJustin Hibbits                 if (p_CcNextEngineParams->params.enqueueParams.action
2253852ba100SJustin Hibbits                         == e_FM_PCD_DROP_FRAME)
2254852ba100SJustin Hibbits                     tmpNia |= GET_NIA_BMI_AC_DISCARD_FRAME(p_FmPcd);
22550aeed3e9SJustin Hibbits                 else
2256852ba100SJustin Hibbits                     tmpNia |= GET_NIA_BMI_AC_ENQ_FRAME(p_FmPcd);
22570aeed3e9SJustin Hibbits                 break;
2258852ba100SJustin Hibbits 
22590aeed3e9SJustin Hibbits             case (e_FM_PCD_KG):
22600aeed3e9SJustin Hibbits                 if (p_CcNextEngineParams->params.kgParams.overrideFqid)
22610aeed3e9SJustin Hibbits                 {
22620aeed3e9SJustin Hibbits                     tmp = FM_PCD_AD_RESULT_CONTRL_FLOW_TYPE;
22630aeed3e9SJustin Hibbits                     tmp |= p_CcNextEngineParams->params.kgParams.newFqid;
2264852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2265852ba100SJustin Hibbits                     tmp |=
2266852ba100SJustin Hibbits                             (p_CcNextEngineParams->params.kgParams.newRelativeStorageProfileId
2267852ba100SJustin Hibbits                                     & FM_PCD_AD_RESULT_VSP_MASK)
2268852ba100SJustin Hibbits                                     << FM_PCD_AD_RESULT_VSP_SHIFT;
2269852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
22700aeed3e9SJustin Hibbits                 }
22710aeed3e9SJustin Hibbits                 else
22720aeed3e9SJustin Hibbits                 {
22730aeed3e9SJustin Hibbits                     tmp = FM_PCD_AD_RESULT_DATA_FLOW_TYPE;
22740aeed3e9SJustin Hibbits                     tmp |= FM_PCD_AD_RESULT_PLCR_DIS;
22750aeed3e9SJustin Hibbits                 }
22760aeed3e9SJustin Hibbits                 tmpNia = NIA_KG_DIRECT;
22770aeed3e9SJustin Hibbits                 tmpNia |= NIA_ENG_KG;
2278852ba100SJustin Hibbits                 tmpNia |= NIA_KG_CC_EN;
2279852ba100SJustin Hibbits                 tmpNia |= FmPcdKgGetSchemeId(
2280852ba100SJustin Hibbits                         p_CcNextEngineParams->params.kgParams.h_DirectScheme);
22810aeed3e9SJustin Hibbits                 break;
2282852ba100SJustin Hibbits 
22830aeed3e9SJustin Hibbits             case (e_FM_PCD_PLCR):
22840aeed3e9SJustin Hibbits                 if (p_CcNextEngineParams->params.plcrParams.overrideParams)
22850aeed3e9SJustin Hibbits                 {
22860aeed3e9SJustin Hibbits                     tmp = FM_PCD_AD_RESULT_CONTRL_FLOW_TYPE;
22870aeed3e9SJustin Hibbits 
2288852ba100SJustin Hibbits                     /* if private policer profile, it may be uninitialized yet, therefore no checks are done at this stage */
22890aeed3e9SJustin Hibbits                     if (p_CcNextEngineParams->params.plcrParams.sharedProfile)
22900aeed3e9SJustin Hibbits                     {
22910aeed3e9SJustin Hibbits                         tmpNia |= NIA_PLCR_ABSOLUTE;
2292852ba100SJustin Hibbits                         err = FmPcdPlcrGetAbsoluteIdByProfileParams(
2293852ba100SJustin Hibbits                                 (t_Handle)p_FmPcd,
2294852ba100SJustin Hibbits                                 e_FM_PCD_PLCR_SHARED,
2295852ba100SJustin Hibbits                                 NULL,
2296852ba100SJustin Hibbits                                 p_CcNextEngineParams->params.plcrParams.newRelativeProfileId,
2297852ba100SJustin Hibbits                                 &profileId);
2298852ba100SJustin Hibbits 			if (err != E_OK)
2299852ba100SJustin Hibbits 				return;
2300852ba100SJustin Hibbits 
23010aeed3e9SJustin Hibbits                     }
23020aeed3e9SJustin Hibbits                     else
2303852ba100SJustin Hibbits                         profileId =
2304852ba100SJustin Hibbits                                 p_CcNextEngineParams->params.plcrParams.newRelativeProfileId;
23050aeed3e9SJustin Hibbits 
23060aeed3e9SJustin Hibbits                     tmp |= p_CcNextEngineParams->params.plcrParams.newFqid;
2307852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2308852ba100SJustin Hibbits                     tmp |=
2309852ba100SJustin Hibbits                             (p_CcNextEngineParams->params.plcrParams.newRelativeStorageProfileId
2310852ba100SJustin Hibbits                                     & FM_PCD_AD_RESULT_VSP_MASK)
2311852ba100SJustin Hibbits                                     << FM_PCD_AD_RESULT_VSP_SHIFT;
2312852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
2313852ba100SJustin Hibbits                     WRITE_UINT32(
2314852ba100SJustin Hibbits                             p_AdResult->plcrProfile,
2315852ba100SJustin Hibbits                             (uint32_t)((uint32_t)profileId << FM_PCD_AD_PROFILEID_FOR_CNTRL_SHIFT));
23160aeed3e9SJustin Hibbits                 }
23170aeed3e9SJustin Hibbits                 else
23180aeed3e9SJustin Hibbits                     tmp = FM_PCD_AD_RESULT_DATA_FLOW_TYPE;
2319852ba100SJustin Hibbits 
2320852ba100SJustin Hibbits                 tmpNia |=
2321852ba100SJustin Hibbits                         NIA_ENG_PLCR
2322852ba100SJustin Hibbits                                 | p_CcNextEngineParams->params.plcrParams.newRelativeProfileId;
23230aeed3e9SJustin Hibbits                 break;
2324852ba100SJustin Hibbits 
23250aeed3e9SJustin Hibbits             default:
23260aeed3e9SJustin Hibbits                 return;
2327852ba100SJustin Hibbits         }WRITE_UINT32(p_AdResult->fqid, tmp);
23280aeed3e9SJustin Hibbits 
23290aeed3e9SJustin Hibbits         if (p_CcNextEngineParams->h_Manip)
23300aeed3e9SJustin Hibbits         {
23310aeed3e9SJustin Hibbits             tmp = GET_UINT32(p_AdResult->plcrProfile);
2332852ba100SJustin Hibbits             tmp |= (uint32_t)(XX_VirtToPhys(p_AdNewPtr)
2333852ba100SJustin Hibbits                     - (p_FmPcd->physicalMuramBase)) >> 4;
23340aeed3e9SJustin Hibbits             WRITE_UINT32(p_AdResult->plcrProfile, tmp);
23350aeed3e9SJustin Hibbits 
23360aeed3e9SJustin Hibbits             tmpNia |= FM_PCD_AD_RESULT_EXTENDED_MODE;
23370aeed3e9SJustin Hibbits             tmpNia |= FM_PCD_AD_RESULT_NADEN;
23380aeed3e9SJustin Hibbits         }
23390aeed3e9SJustin Hibbits 
2340852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2341852ba100SJustin Hibbits         tmpNia |= FM_PCD_AD_RESULT_NO_OM_VSPE;
2342852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
23430aeed3e9SJustin Hibbits         WRITE_UINT32(p_AdResult->nia, tmpNia);
23440aeed3e9SJustin Hibbits     }
23450aeed3e9SJustin Hibbits }
23460aeed3e9SJustin Hibbits 
CcUpdateParams(t_Handle h_FmPcd,t_Handle h_PcdParams,t_Handle h_FmPort,t_Handle h_FmTree,bool validate)2347852ba100SJustin Hibbits static t_Error CcUpdateParams(t_Handle h_FmPcd, t_Handle h_PcdParams,
2348852ba100SJustin Hibbits                               t_Handle h_FmPort, t_Handle h_FmTree,
2349852ba100SJustin Hibbits                               bool validate)
23500aeed3e9SJustin Hibbits {
2351852ba100SJustin Hibbits     t_FmPcdCcTree *p_CcTree = (t_FmPcdCcTree *)h_FmTree;
23520aeed3e9SJustin Hibbits 
2353852ba100SJustin Hibbits     return CcUpdateParam(h_FmPcd, h_PcdParams, h_FmPort,
2354852ba100SJustin Hibbits                          p_CcTree->keyAndNextEngineParams,
2355852ba100SJustin Hibbits                          p_CcTree->numOfEntries,
2356852ba100SJustin Hibbits                          UINT_TO_PTR(p_CcTree->ccTreeBaseAddr), validate, 0,
2357852ba100SJustin Hibbits                          h_FmTree, FALSE);
23580aeed3e9SJustin Hibbits }
23590aeed3e9SJustin Hibbits 
23600aeed3e9SJustin Hibbits 
ReleaseNewNodeCommonPart(t_FmPcdModifyCcKeyAdditionalParams * p_AdditionalInfo)2361852ba100SJustin Hibbits static void ReleaseNewNodeCommonPart(
2362852ba100SJustin Hibbits         t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo)
23630aeed3e9SJustin Hibbits {
23640aeed3e9SJustin Hibbits     if (p_AdditionalInfo->p_AdTableNew)
2365852ba100SJustin Hibbits         FM_MURAM_FreeMem(
2366852ba100SJustin Hibbits                 FmPcdGetMuramHandle(
2367852ba100SJustin Hibbits                         ((t_FmPcdCcNode *)(p_AdditionalInfo->h_CurrentNode))->h_FmPcd),
2368852ba100SJustin Hibbits                 p_AdditionalInfo->p_AdTableNew);
2369852ba100SJustin Hibbits 
23700aeed3e9SJustin Hibbits     if (p_AdditionalInfo->p_KeysMatchTableNew)
2371852ba100SJustin Hibbits         FM_MURAM_FreeMem(
2372852ba100SJustin Hibbits                 FmPcdGetMuramHandle(
2373852ba100SJustin Hibbits                         ((t_FmPcdCcNode *)(p_AdditionalInfo->h_CurrentNode))->h_FmPcd),
2374852ba100SJustin Hibbits                 p_AdditionalInfo->p_KeysMatchTableNew);
23750aeed3e9SJustin Hibbits }
23760aeed3e9SJustin Hibbits 
UpdateGblMask(t_FmPcdCcNode * p_CcNode,uint8_t keySize,uint8_t * p_Mask)2377852ba100SJustin Hibbits static t_Error UpdateGblMask(t_FmPcdCcNode *p_CcNode, uint8_t keySize,
2378852ba100SJustin Hibbits                              uint8_t *p_Mask)
23790aeed3e9SJustin Hibbits {
2380852ba100SJustin Hibbits     uint8_t prvGlblMaskSize = p_CcNode->glblMaskSize;
2381852ba100SJustin Hibbits 
2382852ba100SJustin Hibbits     if (p_Mask && !p_CcNode->glblMaskUpdated && (keySize <= 4)
2383852ba100SJustin Hibbits             && !p_CcNode->lclMask)
23840aeed3e9SJustin Hibbits     {
2385852ba100SJustin Hibbits         if (p_CcNode->parseCode && (p_CcNode->parseCode != CC_PC_FF_TCI1)
2386852ba100SJustin Hibbits                 && (p_CcNode->parseCode != CC_PC_FF_TCI2)
2387852ba100SJustin Hibbits                 && (p_CcNode->parseCode != CC_PC_FF_MPLS1)
2388852ba100SJustin Hibbits                 && (p_CcNode->parseCode != CC_PC_FF_MPLS_LAST)
2389852ba100SJustin Hibbits                 && (p_CcNode->parseCode != CC_PC_FF_IPV4IPTOS_TC1)
2390852ba100SJustin Hibbits                 && (p_CcNode->parseCode != CC_PC_FF_IPV4IPTOS_TC2)
2391852ba100SJustin Hibbits                 && (p_CcNode->parseCode != CC_PC_FF_IPTOS_IPV6TC1_IPV6FLOW1)
2392852ba100SJustin Hibbits                 && (p_CcNode->parseCode != CC_PC_FF_IPDSCP)
2393852ba100SJustin Hibbits                 && (p_CcNode->parseCode != CC_PC_FF_IPTOS_IPV6TC2_IPV6FLOW2))
2394852ba100SJustin Hibbits         {
2395852ba100SJustin Hibbits             p_CcNode->glblMaskSize = 0;
2396852ba100SJustin Hibbits             p_CcNode->lclMask = TRUE;
23970aeed3e9SJustin Hibbits         }
2398852ba100SJustin Hibbits         else
23990aeed3e9SJustin Hibbits         {
2400852ba100SJustin Hibbits             memcpy(p_CcNode->p_GlblMask, p_Mask, (sizeof(uint8_t)) * keySize);
2401852ba100SJustin Hibbits             p_CcNode->glblMaskUpdated = TRUE;
2402852ba100SJustin Hibbits             p_CcNode->glblMaskSize = 4;
24030aeed3e9SJustin Hibbits         }
24040aeed3e9SJustin Hibbits     }
2405852ba100SJustin Hibbits     else
2406852ba100SJustin Hibbits         if (p_Mask && (keySize <= 4) && !p_CcNode->lclMask)
2407852ba100SJustin Hibbits         {
2408852ba100SJustin Hibbits             if (memcmp(p_CcNode->p_GlblMask, p_Mask, keySize) != 0)
2409852ba100SJustin Hibbits             {
2410852ba100SJustin Hibbits                 p_CcNode->lclMask = TRUE;
2411852ba100SJustin Hibbits                 p_CcNode->glblMaskSize = 0;
2412852ba100SJustin Hibbits             }
2413852ba100SJustin Hibbits         }
2414852ba100SJustin Hibbits         else
2415852ba100SJustin Hibbits             if (!p_Mask && p_CcNode->glblMaskUpdated && (keySize <= 4))
24160aeed3e9SJustin Hibbits             {
24170aeed3e9SJustin Hibbits                 uint32_t tmpMask = 0xffffffff;
2418852ba100SJustin Hibbits                 if (memcmp(p_CcNode->p_GlblMask, &tmpMask, 4) != 0)
24190aeed3e9SJustin Hibbits                 {
2420852ba100SJustin Hibbits                     p_CcNode->lclMask = TRUE;
2421852ba100SJustin Hibbits                     p_CcNode->glblMaskSize = 0;
24220aeed3e9SJustin Hibbits                 }
24230aeed3e9SJustin Hibbits             }
2424852ba100SJustin Hibbits             else
2425852ba100SJustin Hibbits                 if (p_Mask)
24260aeed3e9SJustin Hibbits                 {
2427852ba100SJustin Hibbits                     p_CcNode->lclMask = TRUE;
2428852ba100SJustin Hibbits                     p_CcNode->glblMaskSize = 0;
2429852ba100SJustin Hibbits                 }
2430852ba100SJustin Hibbits 
2431852ba100SJustin Hibbits     /* In static mode (maxNumOfKeys > 0), local mask is supported
2432852ba100SJustin Hibbits      only is mask support was enabled at initialization */
2433852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys && (!p_CcNode->maskSupport) && p_CcNode->lclMask)
2434852ba100SJustin Hibbits     {
2435852ba100SJustin Hibbits         p_CcNode->lclMask = FALSE;
2436852ba100SJustin Hibbits         p_CcNode->glblMaskSize = prvGlblMaskSize;
2437852ba100SJustin Hibbits         return ERROR_CODE(E_NOT_SUPPORTED);
24380aeed3e9SJustin Hibbits     }
24390aeed3e9SJustin Hibbits 
24400aeed3e9SJustin Hibbits     return E_OK;
24410aeed3e9SJustin Hibbits }
24420aeed3e9SJustin Hibbits 
GetNewAd(t_Handle h_FmPcdCcNodeOrTree,bool isTree)2443852ba100SJustin Hibbits static __inline__ t_Handle GetNewAd(t_Handle h_FmPcdCcNodeOrTree, bool isTree)
2444852ba100SJustin Hibbits {
2445852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
2446852ba100SJustin Hibbits     t_Handle h_Ad;
2447852ba100SJustin Hibbits 
2448852ba100SJustin Hibbits     if (isTree)
2449852ba100SJustin Hibbits         p_FmPcd = (t_FmPcd *)(((t_FmPcdCcTree *)h_FmPcdCcNodeOrTree)->h_FmPcd);
2450852ba100SJustin Hibbits     else
2451852ba100SJustin Hibbits         p_FmPcd = (t_FmPcd *)(((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->h_FmPcd);
2452852ba100SJustin Hibbits 
2453852ba100SJustin Hibbits     if ((isTree && p_FmPcd->p_CcShadow)
2454852ba100SJustin Hibbits             || (!isTree && ((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->maxNumOfKeys))
2455852ba100SJustin Hibbits     {
2456852ba100SJustin Hibbits         /* The allocated shadow is divided as follows:
2457852ba100SJustin Hibbits          0 . . .       16 . . .
2458852ba100SJustin Hibbits          ---------------------------------------------------
2459852ba100SJustin Hibbits          |   Shadow   |   Shadow Keys   |   Shadow Next    |
2460852ba100SJustin Hibbits          |     Ad     |   Match Table   |   Engine Table   |
2461852ba100SJustin Hibbits          | (16 bytes) | (maximal size)  |  (maximal size)  |
2462852ba100SJustin Hibbits          ---------------------------------------------------
2463852ba100SJustin Hibbits          */
2464852ba100SJustin Hibbits         if (!p_FmPcd->p_CcShadow)
2465852ba100SJustin Hibbits         {
2466852ba100SJustin Hibbits             REPORT_ERROR(MAJOR, E_NO_MEMORY, ("CC Shadow not allocated"));
2467852ba100SJustin Hibbits             return NULL;
2468852ba100SJustin Hibbits         }
2469852ba100SJustin Hibbits 
2470852ba100SJustin Hibbits         h_Ad = p_FmPcd->p_CcShadow;
2471852ba100SJustin Hibbits     }
2472852ba100SJustin Hibbits     else
2473852ba100SJustin Hibbits     {
2474852ba100SJustin Hibbits         h_Ad = (t_Handle)FM_MURAM_AllocMem(FmPcdGetMuramHandle(p_FmPcd),
2475852ba100SJustin Hibbits                                            FM_PCD_CC_AD_ENTRY_SIZE,
2476852ba100SJustin Hibbits                                            FM_PCD_CC_AD_TABLE_ALIGN);
2477852ba100SJustin Hibbits         if (!h_Ad)
2478852ba100SJustin Hibbits         {
2479852ba100SJustin Hibbits             REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC node action descriptor"));
2480852ba100SJustin Hibbits             return NULL;
2481852ba100SJustin Hibbits         }
2482852ba100SJustin Hibbits     }
2483852ba100SJustin Hibbits 
2484852ba100SJustin Hibbits     return h_Ad;
2485852ba100SJustin Hibbits }
2486852ba100SJustin Hibbits 
BuildNewNodeCommonPart(t_FmPcdCcNode * p_CcNode,int * size,t_FmPcdModifyCcKeyAdditionalParams * p_AdditionalInfo)2487852ba100SJustin Hibbits static t_Error BuildNewNodeCommonPart(
2488852ba100SJustin Hibbits         t_FmPcdCcNode *p_CcNode, int *size,
24890aeed3e9SJustin Hibbits         t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo)
24900aeed3e9SJustin Hibbits {
2491852ba100SJustin Hibbits     t_FmPcd *p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
24920aeed3e9SJustin Hibbits 
2493852ba100SJustin Hibbits     if (p_CcNode->lclMask)
2494852ba100SJustin Hibbits         *size = 2 * p_CcNode->ccKeySizeAccExtraction;
2495852ba100SJustin Hibbits     else
2496852ba100SJustin Hibbits         *size = p_CcNode->ccKeySizeAccExtraction;
2497852ba100SJustin Hibbits 
2498852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys == 0)
2499852ba100SJustin Hibbits     {
2500852ba100SJustin Hibbits         p_AdditionalInfo->p_AdTableNew = (t_Handle)FM_MURAM_AllocMem(
2501852ba100SJustin Hibbits                 FmPcdGetMuramHandle(p_FmPcd),
2502852ba100SJustin Hibbits                 (uint32_t)((p_AdditionalInfo->numOfKeys + 1)
2503852ba100SJustin Hibbits                         * FM_PCD_CC_AD_ENTRY_SIZE),
25040aeed3e9SJustin Hibbits                 FM_PCD_CC_AD_TABLE_ALIGN);
25050aeed3e9SJustin Hibbits         if (!p_AdditionalInfo->p_AdTableNew)
2506852ba100SJustin Hibbits             RETURN_ERROR(
2507852ba100SJustin Hibbits                     MAJOR, E_NO_MEMORY,
2508852ba100SJustin Hibbits                     ("MURAM allocation for CC node action descriptors table"));
25090aeed3e9SJustin Hibbits 
2510852ba100SJustin Hibbits         p_AdditionalInfo->p_KeysMatchTableNew = (t_Handle)FM_MURAM_AllocMem(
2511852ba100SJustin Hibbits                 FmPcdGetMuramHandle(p_FmPcd),
2512852ba100SJustin Hibbits                 (uint32_t)(*size * sizeof(uint8_t)
2513852ba100SJustin Hibbits                         * (p_AdditionalInfo->numOfKeys + 1)),
25140aeed3e9SJustin Hibbits                 FM_PCD_CC_KEYS_MATCH_TABLE_ALIGN);
25150aeed3e9SJustin Hibbits         if (!p_AdditionalInfo->p_KeysMatchTableNew)
25160aeed3e9SJustin Hibbits         {
2517852ba100SJustin Hibbits             FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_CcNode->h_FmPcd),
2518852ba100SJustin Hibbits                              p_AdditionalInfo->p_AdTableNew);
25190aeed3e9SJustin Hibbits             p_AdditionalInfo->p_AdTableNew = NULL;
2520852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_NO_MEMORY,
2521852ba100SJustin Hibbits                          ("MURAM allocation for CC node key match table"));
25220aeed3e9SJustin Hibbits         }
25230aeed3e9SJustin Hibbits 
2524852ba100SJustin Hibbits         MemSet8(
2525852ba100SJustin Hibbits                 (uint8_t*)p_AdditionalInfo->p_AdTableNew,
2526852ba100SJustin Hibbits                 0,
2527852ba100SJustin Hibbits                 (uint32_t)((p_AdditionalInfo->numOfKeys + 1)
2528852ba100SJustin Hibbits                         * FM_PCD_CC_AD_ENTRY_SIZE));
2529852ba100SJustin Hibbits         MemSet8((uint8_t*)p_AdditionalInfo->p_KeysMatchTableNew, 0,
2530852ba100SJustin Hibbits                    *size * sizeof(uint8_t) * (p_AdditionalInfo->numOfKeys + 1));
2531852ba100SJustin Hibbits     }
2532852ba100SJustin Hibbits     else
2533852ba100SJustin Hibbits     {
2534852ba100SJustin Hibbits         /* The allocated shadow is divided as follows:
2535852ba100SJustin Hibbits          0 . . .       16 . . .
2536852ba100SJustin Hibbits          ---------------------------------------------------
2537852ba100SJustin Hibbits          |   Shadow   |   Shadow Keys   |   Shadow Next    |
2538852ba100SJustin Hibbits          |     Ad     |   Match Table   |   Engine Table   |
2539852ba100SJustin Hibbits          | (16 bytes) | (maximal size)  |  (maximal size)  |
2540852ba100SJustin Hibbits          ---------------------------------------------------
2541852ba100SJustin Hibbits          */
2542852ba100SJustin Hibbits 
2543852ba100SJustin Hibbits         if (!p_FmPcd->p_CcShadow)
2544852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_NO_MEMORY, ("CC Shadow not allocated"));
2545852ba100SJustin Hibbits 
2546852ba100SJustin Hibbits         p_AdditionalInfo->p_KeysMatchTableNew =
2547852ba100SJustin Hibbits                 PTR_MOVE(p_FmPcd->p_CcShadow, FM_PCD_CC_AD_ENTRY_SIZE);
2548852ba100SJustin Hibbits         p_AdditionalInfo->p_AdTableNew =
2549852ba100SJustin Hibbits                 PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, p_CcNode->keysMatchTableMaxSize);
2550852ba100SJustin Hibbits 
2551852ba100SJustin Hibbits         MemSet8(
2552852ba100SJustin Hibbits                 (uint8_t*)p_AdditionalInfo->p_AdTableNew,
2553852ba100SJustin Hibbits                 0,
2554852ba100SJustin Hibbits                 (uint32_t)((p_CcNode->maxNumOfKeys + 1)
2555852ba100SJustin Hibbits                         * FM_PCD_CC_AD_ENTRY_SIZE));
2556852ba100SJustin Hibbits         MemSet8((uint8_t*)p_AdditionalInfo->p_KeysMatchTableNew, 0,
2557852ba100SJustin Hibbits                    (*size) * sizeof(uint8_t) * (p_CcNode->maxNumOfKeys));
2558852ba100SJustin Hibbits     }
2559852ba100SJustin Hibbits 
2560852ba100SJustin Hibbits     p_AdditionalInfo->p_AdTableOld = p_CcNode->h_AdTable;
2561852ba100SJustin Hibbits     p_AdditionalInfo->p_KeysMatchTableOld = p_CcNode->h_KeysMatchTable;
25620aeed3e9SJustin Hibbits 
25630aeed3e9SJustin Hibbits     return E_OK;
25640aeed3e9SJustin Hibbits }
25650aeed3e9SJustin Hibbits 
BuildNewNodeAddOrMdfyKeyAndNextEngine(t_Handle h_FmPcd,t_FmPcdCcNode * p_CcNode,uint16_t keyIndex,t_FmPcdCcKeyParams * p_KeyParams,t_FmPcdModifyCcKeyAdditionalParams * p_AdditionalInfo,bool add)2566852ba100SJustin Hibbits static t_Error BuildNewNodeAddOrMdfyKeyAndNextEngine(
2567852ba100SJustin Hibbits         t_Handle h_FmPcd, t_FmPcdCcNode *p_CcNode, uint16_t keyIndex,
2568852ba100SJustin Hibbits         t_FmPcdCcKeyParams *p_KeyParams,
2569852ba100SJustin Hibbits         t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo, bool add)
25700aeed3e9SJustin Hibbits {
25710aeed3e9SJustin Hibbits     t_Error err = E_OK;
25720aeed3e9SJustin Hibbits     t_Handle p_AdTableNewTmp, p_KeysMatchTableNewTmp;
25730aeed3e9SJustin Hibbits     t_Handle p_KeysMatchTableOldTmp, p_AdTableOldTmp;
25740aeed3e9SJustin Hibbits     int size;
25750aeed3e9SJustin Hibbits     int i = 0, j = 0;
25760aeed3e9SJustin Hibbits     t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
25770aeed3e9SJustin Hibbits     uint32_t requiredAction = 0;
25780aeed3e9SJustin Hibbits     bool prvLclMask;
25790aeed3e9SJustin Hibbits     t_CcNodeInformation *p_CcNodeInformation;
2580852ba100SJustin Hibbits     t_FmPcdCcStatsParams statsParams = { 0 };
25810aeed3e9SJustin Hibbits     t_List *p_Pos;
2582852ba100SJustin Hibbits     t_FmPcdStatsObj *p_StatsObj;
25830aeed3e9SJustin Hibbits 
2584852ba100SJustin Hibbits     /* Check that new NIA is legal */
2585852ba100SJustin Hibbits     err = ValidateNextEngineParams(h_FmPcd, &p_KeyParams->ccNextEngineParams,
2586852ba100SJustin Hibbits                                    p_CcNode->statisticsMode);
25870aeed3e9SJustin Hibbits     if (err)
25880aeed3e9SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
25890aeed3e9SJustin Hibbits 
2590852ba100SJustin Hibbits     prvLclMask = p_CcNode->lclMask;
25910aeed3e9SJustin Hibbits 
2592852ba100SJustin Hibbits     /* Check that new key is not require update of localMask */
2593852ba100SJustin Hibbits     err = UpdateGblMask(p_CcNode, p_CcNode->ccKeySizeAccExtraction,
25940aeed3e9SJustin Hibbits                         p_KeyParams->p_Mask);
25950aeed3e9SJustin Hibbits     if (err)
25960aeed3e9SJustin Hibbits         RETURN_ERROR(MAJOR, err, (NO_MSG));
25970aeed3e9SJustin Hibbits 
2598852ba100SJustin Hibbits     /* Update internal data structure with new next engine for the given index */
2599852ba100SJustin Hibbits     memcpy(&p_AdditionalInfo->keyAndNextEngineParams[keyIndex].nextEngineParams,
2600852ba100SJustin Hibbits            &p_KeyParams->ccNextEngineParams, sizeof(t_FmPcdCcNextEngineParams));
2601852ba100SJustin Hibbits 
2602852ba100SJustin Hibbits     memcpy(p_AdditionalInfo->keyAndNextEngineParams[keyIndex].key,
2603852ba100SJustin Hibbits            p_KeyParams->p_Key, p_CcNode->userSizeOfExtraction);
2604852ba100SJustin Hibbits 
2605852ba100SJustin Hibbits     if ((p_AdditionalInfo->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine
2606852ba100SJustin Hibbits             == e_FM_PCD_CC)
2607852ba100SJustin Hibbits             && p_AdditionalInfo->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip)
2608852ba100SJustin Hibbits     {
2609852ba100SJustin Hibbits         err =
2610852ba100SJustin Hibbits                 AllocAndFillAdForContLookupManip(
2611852ba100SJustin Hibbits                         p_AdditionalInfo->keyAndNextEngineParams[keyIndex].nextEngineParams.params.ccParams.h_CcNode);
2612852ba100SJustin Hibbits         if (err)
2613852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, err, (NO_MSG));
26140aeed3e9SJustin Hibbits     }
26150aeed3e9SJustin Hibbits 
2616852ba100SJustin Hibbits     if (p_KeyParams->p_Mask)
2617852ba100SJustin Hibbits         memcpy(p_AdditionalInfo->keyAndNextEngineParams[keyIndex].mask,
2618852ba100SJustin Hibbits                p_KeyParams->p_Mask, p_CcNode->userSizeOfExtraction);
2619852ba100SJustin Hibbits     else
2620852ba100SJustin Hibbits         memset(p_AdditionalInfo->keyAndNextEngineParams[keyIndex].mask, 0xFF,
2621852ba100SJustin Hibbits                p_CcNode->userSizeOfExtraction);
26220aeed3e9SJustin Hibbits 
2623852ba100SJustin Hibbits     /* Update numOfKeys */
2624852ba100SJustin Hibbits     if (add)
2625852ba100SJustin Hibbits         p_AdditionalInfo->numOfKeys = (uint8_t)(p_CcNode->numOfKeys + 1);
2626852ba100SJustin Hibbits     else
2627852ba100SJustin Hibbits         p_AdditionalInfo->numOfKeys = (uint8_t)p_CcNode->numOfKeys;
26280aeed3e9SJustin Hibbits 
2629852ba100SJustin Hibbits     /* Allocate new tables in MURAM: keys match table and action descriptors table */
2630852ba100SJustin Hibbits     err = BuildNewNodeCommonPart(p_CcNode, &size, p_AdditionalInfo);
2631852ba100SJustin Hibbits     if (err)
2632852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
26330aeed3e9SJustin Hibbits 
2634852ba100SJustin Hibbits     /* Check that manip is legal and what requiredAction is necessary for this manip */
2635852ba100SJustin Hibbits     if (p_KeyParams->ccNextEngineParams.h_Manip)
2636852ba100SJustin Hibbits     {
2637852ba100SJustin Hibbits         err = FmPcdManipCheckParamsForCcNextEngine(
2638852ba100SJustin Hibbits                 &p_KeyParams->ccNextEngineParams, &requiredAction);
2639852ba100SJustin Hibbits         if (err)
2640852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, err, (NO_MSG));
2641852ba100SJustin Hibbits     }
2642852ba100SJustin Hibbits 
2643852ba100SJustin Hibbits     p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction =
2644852ba100SJustin Hibbits             requiredAction;
2645852ba100SJustin Hibbits     p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction |=
2646852ba100SJustin Hibbits             UPDATE_CC_WITH_TREE;
2647852ba100SJustin Hibbits 
2648852ba100SJustin Hibbits     /* Update new Ad and new Key Table according to new requirement */
26490aeed3e9SJustin Hibbits     i = 0;
26500aeed3e9SJustin Hibbits     for (j = 0; j < p_AdditionalInfo->numOfKeys; j++)
26510aeed3e9SJustin Hibbits     {
2652852ba100SJustin Hibbits         p_AdTableNewTmp =
2653852ba100SJustin Hibbits                 PTR_MOVE(p_AdditionalInfo->p_AdTableNew, j*FM_PCD_CC_AD_ENTRY_SIZE);
2654852ba100SJustin Hibbits 
26550aeed3e9SJustin Hibbits         if (j == keyIndex)
26560aeed3e9SJustin Hibbits         {
2657852ba100SJustin Hibbits             if (p_KeyParams->ccNextEngineParams.statisticsEn)
2658852ba100SJustin Hibbits             {
2659852ba100SJustin Hibbits                 /* Allocate a statistics object that holds statistics AD and counters.
2660852ba100SJustin Hibbits                  - For added key - New statistics AD and counters pointer need to be allocated
2661852ba100SJustin Hibbits                  new statistics object. If statistics were enabled, we need to replace the
2662852ba100SJustin Hibbits                  existing descriptor with a new descriptor with nullified counters.
2663852ba100SJustin Hibbits                  */
2664852ba100SJustin Hibbits                 p_StatsObj = GetStatsObj(p_CcNode);
2665852ba100SJustin Hibbits                 ASSERT_COND(p_StatsObj);
2666852ba100SJustin Hibbits 
2667852ba100SJustin Hibbits                 /* Store allocated statistics object */
2668852ba100SJustin Hibbits                 ASSERT_COND(keyIndex < CC_MAX_NUM_OF_KEYS);
2669852ba100SJustin Hibbits                 p_AdditionalInfo->keyAndNextEngineParams[keyIndex].p_StatsObj =
2670852ba100SJustin Hibbits                         p_StatsObj;
2671852ba100SJustin Hibbits 
2672852ba100SJustin Hibbits                 statsParams.h_StatsAd = p_StatsObj->h_StatsAd;
2673852ba100SJustin Hibbits                 statsParams.h_StatsCounters = p_StatsObj->h_StatsCounters;
2674852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2675852ba100SJustin Hibbits                 statsParams.h_StatsFLRs = p_CcNode->h_StatsFLRs;
2676852ba100SJustin Hibbits 
2677852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
2678852ba100SJustin Hibbits 
2679852ba100SJustin Hibbits                 /* Building action descriptor for the received new key */
2680852ba100SJustin Hibbits                 NextStepAd(p_AdTableNewTmp, &statsParams,
2681852ba100SJustin Hibbits                            &p_KeyParams->ccNextEngineParams, p_FmPcd);
2682852ba100SJustin Hibbits             }
2683852ba100SJustin Hibbits             else
2684852ba100SJustin Hibbits             {
2685852ba100SJustin Hibbits                 /* Building action descriptor for the received new key */
2686852ba100SJustin Hibbits                 NextStepAd(p_AdTableNewTmp, NULL,
2687852ba100SJustin Hibbits                            &p_KeyParams->ccNextEngineParams, p_FmPcd);
2688852ba100SJustin Hibbits             }
2689852ba100SJustin Hibbits 
2690852ba100SJustin Hibbits             /* Copy the received new key into keys match table */
2691852ba100SJustin Hibbits             p_KeysMatchTableNewTmp =
2692852ba100SJustin Hibbits                     PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, j*size*sizeof(uint8_t));
2693852ba100SJustin Hibbits 
2694852ba100SJustin Hibbits             MemCpy8((void*)p_KeysMatchTableNewTmp, p_KeyParams->p_Key,
2695852ba100SJustin Hibbits                         p_CcNode->userSizeOfExtraction);
2696852ba100SJustin Hibbits 
2697852ba100SJustin Hibbits             /* Update mask for the received new key */
2698852ba100SJustin Hibbits             if (p_CcNode->lclMask)
26990aeed3e9SJustin Hibbits             {
27000aeed3e9SJustin Hibbits                 if (p_KeyParams->p_Mask)
2701852ba100SJustin Hibbits                 {
2702852ba100SJustin Hibbits                     MemCpy8(PTR_MOVE(p_KeysMatchTableNewTmp,
2703852ba100SJustin Hibbits                             p_CcNode->ccKeySizeAccExtraction),
2704852ba100SJustin Hibbits                                 p_KeyParams->p_Mask,
2705852ba100SJustin Hibbits                                 p_CcNode->userSizeOfExtraction);
27060aeed3e9SJustin Hibbits                 }
2707852ba100SJustin Hibbits                 else
2708852ba100SJustin Hibbits                     if (p_CcNode->ccKeySizeAccExtraction > 4)
2709852ba100SJustin Hibbits                     {
2710852ba100SJustin Hibbits                         MemSet8(PTR_MOVE(p_KeysMatchTableNewTmp,
2711852ba100SJustin Hibbits                                 p_CcNode->ccKeySizeAccExtraction),
2712852ba100SJustin Hibbits                                    0xff, p_CcNode->userSizeOfExtraction);
2713852ba100SJustin Hibbits                     }
2714852ba100SJustin Hibbits                     else
2715852ba100SJustin Hibbits                     {
2716852ba100SJustin Hibbits                         MemCpy8(PTR_MOVE(p_KeysMatchTableNewTmp,
2717852ba100SJustin Hibbits                                 p_CcNode->ccKeySizeAccExtraction),
2718852ba100SJustin Hibbits                                     p_CcNode->p_GlblMask,
2719852ba100SJustin Hibbits                                     p_CcNode->userSizeOfExtraction);
2720852ba100SJustin Hibbits                     }
2721852ba100SJustin Hibbits             }
2722852ba100SJustin Hibbits 
2723852ba100SJustin Hibbits             /* If key modification requested, the old entry is omitted and replaced by the new parameters */
27240aeed3e9SJustin Hibbits             if (!add)
27250aeed3e9SJustin Hibbits                 i++;
27260aeed3e9SJustin Hibbits         }
27270aeed3e9SJustin Hibbits         else
27280aeed3e9SJustin Hibbits         {
2729852ba100SJustin Hibbits             /* Copy existing action descriptors to the newly allocated Ad table */
2730852ba100SJustin Hibbits             p_AdTableOldTmp =
2731852ba100SJustin Hibbits                     PTR_MOVE(p_AdditionalInfo->p_AdTableOld, i*FM_PCD_CC_AD_ENTRY_SIZE);
2732852ba100SJustin Hibbits             MemCpy8(p_AdTableNewTmp, p_AdTableOldTmp,
2733852ba100SJustin Hibbits                        FM_PCD_CC_AD_ENTRY_SIZE);
27340aeed3e9SJustin Hibbits 
2735852ba100SJustin Hibbits             /* Copy existing keys and their masks to the newly allocated keys match table */
2736852ba100SJustin Hibbits             p_KeysMatchTableNewTmp =
2737852ba100SJustin Hibbits                     PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, j * size * sizeof(uint8_t));
2738852ba100SJustin Hibbits             p_KeysMatchTableOldTmp =
2739852ba100SJustin Hibbits                     PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableOld, i * size * sizeof(uint8_t));
2740852ba100SJustin Hibbits 
2741852ba100SJustin Hibbits             if (p_CcNode->lclMask)
27420aeed3e9SJustin Hibbits             {
27430aeed3e9SJustin Hibbits                 if (prvLclMask)
2744852ba100SJustin Hibbits                 {
2745852ba100SJustin Hibbits                     MemCpy8(
2746852ba100SJustin Hibbits                             PTR_MOVE(p_KeysMatchTableNewTmp, p_CcNode->ccKeySizeAccExtraction),
2747852ba100SJustin Hibbits                             PTR_MOVE(p_KeysMatchTableOldTmp, p_CcNode->ccKeySizeAccExtraction),
2748852ba100SJustin Hibbits                             p_CcNode->ccKeySizeAccExtraction);
2749852ba100SJustin Hibbits                 }
27500aeed3e9SJustin Hibbits                 else
27510aeed3e9SJustin Hibbits                 {
2752852ba100SJustin Hibbits                     p_KeysMatchTableOldTmp =
2753852ba100SJustin Hibbits                             PTR_MOVE(p_CcNode->h_KeysMatchTable,
2754852ba100SJustin Hibbits                                     i * (int)p_CcNode->ccKeySizeAccExtraction * sizeof(uint8_t));
27550aeed3e9SJustin Hibbits 
2756852ba100SJustin Hibbits                     if (p_CcNode->ccKeySizeAccExtraction > 4)
2757852ba100SJustin Hibbits                     {
2758852ba100SJustin Hibbits                         MemSet8(PTR_MOVE(p_KeysMatchTableNewTmp,
2759852ba100SJustin Hibbits                                 p_CcNode->ccKeySizeAccExtraction),
2760852ba100SJustin Hibbits                                    0xff, p_CcNode->userSizeOfExtraction);
2761852ba100SJustin Hibbits                     }
27620aeed3e9SJustin Hibbits                     else
2763852ba100SJustin Hibbits                     {
2764852ba100SJustin Hibbits                         MemCpy8(PTR_MOVE(p_KeysMatchTableNewTmp,
2765852ba100SJustin Hibbits                                 p_CcNode->ccKeySizeAccExtraction),
2766852ba100SJustin Hibbits                                    p_CcNode->p_GlblMask,
2767852ba100SJustin Hibbits                                    p_CcNode->userSizeOfExtraction);
27680aeed3e9SJustin Hibbits                     }
27690aeed3e9SJustin Hibbits                 }
2770852ba100SJustin Hibbits             }
2771852ba100SJustin Hibbits 
2772852ba100SJustin Hibbits             MemCpy8(p_KeysMatchTableNewTmp, p_KeysMatchTableOldTmp,
2773852ba100SJustin Hibbits                        p_CcNode->ccKeySizeAccExtraction);
2774852ba100SJustin Hibbits 
27750aeed3e9SJustin Hibbits             i++;
27760aeed3e9SJustin Hibbits         }
27770aeed3e9SJustin Hibbits     }
27780aeed3e9SJustin Hibbits 
2779852ba100SJustin Hibbits     /* Miss action descriptor */
2780852ba100SJustin Hibbits     p_AdTableNewTmp =
2781852ba100SJustin Hibbits             PTR_MOVE(p_AdditionalInfo->p_AdTableNew, j * FM_PCD_CC_AD_ENTRY_SIZE);
2782852ba100SJustin Hibbits     p_AdTableOldTmp =
2783852ba100SJustin Hibbits             PTR_MOVE(p_AdditionalInfo->p_AdTableOld, i * FM_PCD_CC_AD_ENTRY_SIZE);
2784852ba100SJustin Hibbits     MemCpy8(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE);
27850aeed3e9SJustin Hibbits 
2786852ba100SJustin Hibbits     if (!NCSW_LIST_IsEmpty(&p_CcNode->ccTreesLst))
27870aeed3e9SJustin Hibbits     {
2788852ba100SJustin Hibbits         NCSW_LIST_FOR_EACH(p_Pos, &p_CcNode->ccTreesLst)
27890aeed3e9SJustin Hibbits         {
27900aeed3e9SJustin Hibbits             p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
27910aeed3e9SJustin Hibbits             ASSERT_COND(p_CcNodeInformation->h_CcNode);
2792852ba100SJustin Hibbits             /* Update the manipulation which has to be updated from parameters of the port */
2793852ba100SJustin Hibbits             /* It's has to be updated with restrictions defined in the function */
2794852ba100SJustin Hibbits             err =
2795852ba100SJustin Hibbits                     SetRequiredAction(
2796852ba100SJustin Hibbits                             p_CcNode->h_FmPcd,
2797852ba100SJustin Hibbits                             p_CcNode->shadowAction
2798852ba100SJustin Hibbits                                     | p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction,
2799852ba100SJustin Hibbits                             &p_AdditionalInfo->keyAndNextEngineParams[keyIndex],
28000aeed3e9SJustin Hibbits                             PTR_MOVE(p_AdditionalInfo->p_AdTableNew, keyIndex*FM_PCD_CC_AD_ENTRY_SIZE),
2801852ba100SJustin Hibbits                             1, p_CcNodeInformation->h_CcNode);
28020aeed3e9SJustin Hibbits             if (err)
28030aeed3e9SJustin Hibbits                 RETURN_ERROR(MAJOR, err, (NO_MSG));
28040aeed3e9SJustin Hibbits 
2805852ba100SJustin Hibbits             err =
2806852ba100SJustin Hibbits                     CcUpdateParam(
2807852ba100SJustin Hibbits                             p_CcNode->h_FmPcd,
28080aeed3e9SJustin Hibbits                             NULL,
2809852ba100SJustin Hibbits                             NULL,
2810852ba100SJustin Hibbits                             &p_AdditionalInfo->keyAndNextEngineParams[keyIndex],
28110aeed3e9SJustin Hibbits                             1,
28120aeed3e9SJustin Hibbits                             PTR_MOVE(p_AdditionalInfo->p_AdTableNew, keyIndex*FM_PCD_CC_AD_ENTRY_SIZE),
2813852ba100SJustin Hibbits                             TRUE, p_CcNodeInformation->index,
2814852ba100SJustin Hibbits                             p_CcNodeInformation->h_CcNode, TRUE);
28150aeed3e9SJustin Hibbits             if (err)
28160aeed3e9SJustin Hibbits                 RETURN_ERROR(MAJOR, err, (NO_MSG));
28170aeed3e9SJustin Hibbits         }
28180aeed3e9SJustin Hibbits     }
28190aeed3e9SJustin Hibbits 
2820852ba100SJustin Hibbits     if (p_CcNode->lclMask)
2821852ba100SJustin Hibbits         memset(p_CcNode->p_GlblMask, 0xff, CC_GLBL_MASK_SIZE * sizeof(uint8_t));
28220aeed3e9SJustin Hibbits 
28230aeed3e9SJustin Hibbits     if (p_KeyParams->ccNextEngineParams.nextEngine == e_FM_PCD_CC)
2824852ba100SJustin Hibbits         p_AdditionalInfo->h_NodeForAdd =
2825852ba100SJustin Hibbits                 p_KeyParams->ccNextEngineParams.params.ccParams.h_CcNode;
2826852ba100SJustin Hibbits     if (p_KeyParams->ccNextEngineParams.h_Manip)
2827852ba100SJustin Hibbits         p_AdditionalInfo->h_ManipForAdd =
2828852ba100SJustin Hibbits                 p_KeyParams->ccNextEngineParams.h_Manip;
2829852ba100SJustin Hibbits 
2830852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2831852ba100SJustin Hibbits     if ((p_KeyParams->ccNextEngineParams.nextEngine == e_FM_PCD_FR)
2832852ba100SJustin Hibbits             && (p_KeyParams->ccNextEngineParams.params.frParams.h_FrmReplic))
2833852ba100SJustin Hibbits         p_AdditionalInfo->h_FrmReplicForAdd =
2834852ba100SJustin Hibbits                 p_KeyParams->ccNextEngineParams.params.frParams.h_FrmReplic;
2835852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
28360aeed3e9SJustin Hibbits 
28370aeed3e9SJustin Hibbits     if (!add)
28380aeed3e9SJustin Hibbits     {
2839852ba100SJustin Hibbits         if (p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine
2840852ba100SJustin Hibbits                 == e_FM_PCD_CC)
2841852ba100SJustin Hibbits             p_AdditionalInfo->h_NodeForRmv =
2842852ba100SJustin Hibbits                     p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.params.ccParams.h_CcNode;
2843852ba100SJustin Hibbits 
2844852ba100SJustin Hibbits         if (p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip)
2845852ba100SJustin Hibbits             p_AdditionalInfo->h_ManipForRmv =
2846852ba100SJustin Hibbits                     p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip;
2847852ba100SJustin Hibbits 
2848852ba100SJustin Hibbits         /* If statistics were previously enabled, store the old statistics object to be released */
2849852ba100SJustin Hibbits         if (p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj)
2850852ba100SJustin Hibbits         {
2851852ba100SJustin Hibbits             p_AdditionalInfo->p_StatsObjForRmv =
2852852ba100SJustin Hibbits                     p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj;
2853852ba100SJustin Hibbits         }
2854852ba100SJustin Hibbits 
2855852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2856852ba100SJustin Hibbits         if ((p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine
2857852ba100SJustin Hibbits                 == e_FM_PCD_FR)
2858852ba100SJustin Hibbits                 && (p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic))
2859852ba100SJustin Hibbits             p_AdditionalInfo->h_FrmReplicForRmv =
2860852ba100SJustin Hibbits                     p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic;
2861852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
28620aeed3e9SJustin Hibbits     }
28630aeed3e9SJustin Hibbits 
28640aeed3e9SJustin Hibbits     return E_OK;
28650aeed3e9SJustin Hibbits }
28660aeed3e9SJustin Hibbits 
BuildNewNodeRemoveKey(t_FmPcdCcNode * p_CcNode,uint16_t keyIndex,t_FmPcdModifyCcKeyAdditionalParams * p_AdditionalInfo)2867852ba100SJustin Hibbits static t_Error BuildNewNodeRemoveKey(
2868852ba100SJustin Hibbits         t_FmPcdCcNode *p_CcNode, uint16_t keyIndex,
2869852ba100SJustin Hibbits         t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo)
28700aeed3e9SJustin Hibbits {
28710aeed3e9SJustin Hibbits     int i = 0, j = 0;
28720aeed3e9SJustin Hibbits     t_Handle p_AdTableNewTmp, p_KeysMatchTableNewTmp;
28730aeed3e9SJustin Hibbits     t_Handle p_KeysMatchTableOldTmp, p_AdTableOldTmp;
28740aeed3e9SJustin Hibbits     int size;
28750aeed3e9SJustin Hibbits     t_Error err = E_OK;
28760aeed3e9SJustin Hibbits 
28770aeed3e9SJustin Hibbits     /*save new numOfKeys*/
2878852ba100SJustin Hibbits     p_AdditionalInfo->numOfKeys = (uint16_t)(p_CcNode->numOfKeys - 1);
28790aeed3e9SJustin Hibbits 
28800aeed3e9SJustin Hibbits     /*function which allocates in the memory new KeyTbl, AdTbl*/
2881852ba100SJustin Hibbits     err = BuildNewNodeCommonPart(p_CcNode, &size, p_AdditionalInfo);
28820aeed3e9SJustin Hibbits     if (err)
28830aeed3e9SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
28840aeed3e9SJustin Hibbits 
28850aeed3e9SJustin Hibbits     /*update new Ad and new Key Table according to new requirement*/
2886852ba100SJustin Hibbits     for (i = 0, j = 0; j < p_CcNode->numOfKeys; i++, j++)
28870aeed3e9SJustin Hibbits     {
28880aeed3e9SJustin Hibbits         if (j == keyIndex)
28890aeed3e9SJustin Hibbits             j++;
2890852ba100SJustin Hibbits 
2891852ba100SJustin Hibbits         if (j == p_CcNode->numOfKeys)
28920aeed3e9SJustin Hibbits             break;
2893852ba100SJustin Hibbits         p_AdTableNewTmp =
2894852ba100SJustin Hibbits                 PTR_MOVE(p_AdditionalInfo->p_AdTableNew, i * FM_PCD_CC_AD_ENTRY_SIZE);
2895852ba100SJustin Hibbits         p_AdTableOldTmp =
2896852ba100SJustin Hibbits                 PTR_MOVE(p_AdditionalInfo->p_AdTableOld, j * FM_PCD_CC_AD_ENTRY_SIZE);
2897852ba100SJustin Hibbits         MemCpy8(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE);
2898852ba100SJustin Hibbits 
2899852ba100SJustin Hibbits         p_KeysMatchTableOldTmp =
2900852ba100SJustin Hibbits                 PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableOld, j * size * sizeof(uint8_t));
2901852ba100SJustin Hibbits         p_KeysMatchTableNewTmp =
2902852ba100SJustin Hibbits                 PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, i * size * sizeof(uint8_t));
2903852ba100SJustin Hibbits         MemCpy8(p_KeysMatchTableNewTmp, p_KeysMatchTableOldTmp,
2904852ba100SJustin Hibbits                    size * sizeof(uint8_t));
29050aeed3e9SJustin Hibbits     }
29060aeed3e9SJustin Hibbits 
2907852ba100SJustin Hibbits     p_AdTableNewTmp =
2908852ba100SJustin Hibbits             PTR_MOVE(p_AdditionalInfo->p_AdTableNew, i * FM_PCD_CC_AD_ENTRY_SIZE);
2909852ba100SJustin Hibbits     p_AdTableOldTmp =
2910852ba100SJustin Hibbits             PTR_MOVE(p_AdditionalInfo->p_AdTableOld, j * FM_PCD_CC_AD_ENTRY_SIZE);
2911852ba100SJustin Hibbits     MemCpy8(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE);
29120aeed3e9SJustin Hibbits 
2913852ba100SJustin Hibbits     if (p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine
2914852ba100SJustin Hibbits             == e_FM_PCD_CC)
2915852ba100SJustin Hibbits         p_AdditionalInfo->h_NodeForRmv =
2916852ba100SJustin Hibbits                 p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.params.ccParams.h_CcNode;
2917852ba100SJustin Hibbits 
2918852ba100SJustin Hibbits     if (p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip)
2919852ba100SJustin Hibbits         p_AdditionalInfo->h_ManipForRmv =
2920852ba100SJustin Hibbits                 p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip;
2921852ba100SJustin Hibbits 
2922852ba100SJustin Hibbits     /* If statistics were previously enabled, store the old statistics object to be released */
2923852ba100SJustin Hibbits     if (p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj)
2924852ba100SJustin Hibbits     {
2925852ba100SJustin Hibbits         p_AdditionalInfo->p_StatsObjForRmv =
2926852ba100SJustin Hibbits                 p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj;
2927852ba100SJustin Hibbits     }
2928852ba100SJustin Hibbits 
2929852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
2930852ba100SJustin Hibbits     if ((p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine
2931852ba100SJustin Hibbits             == e_FM_PCD_FR)
2932852ba100SJustin Hibbits             && (p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic))
2933852ba100SJustin Hibbits         p_AdditionalInfo->h_FrmReplicForRmv =
2934852ba100SJustin Hibbits                 p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic;
2935852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
29360aeed3e9SJustin Hibbits 
29370aeed3e9SJustin Hibbits     return E_OK;
29380aeed3e9SJustin Hibbits }
29390aeed3e9SJustin Hibbits 
BuildNewNodeModifyKey(t_FmPcdCcNode * p_CcNode,uint16_t keyIndex,uint8_t * p_Key,uint8_t * p_Mask,t_FmPcdModifyCcKeyAdditionalParams * p_AdditionalInfo)2940852ba100SJustin Hibbits static t_Error BuildNewNodeModifyKey(
2941852ba100SJustin Hibbits         t_FmPcdCcNode *p_CcNode, uint16_t keyIndex, uint8_t *p_Key,
2942852ba100SJustin Hibbits         uint8_t *p_Mask, t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo)
29430aeed3e9SJustin Hibbits {
2944852ba100SJustin Hibbits     t_FmPcd *p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
29450aeed3e9SJustin Hibbits     t_Error err = E_OK;
29460aeed3e9SJustin Hibbits     t_Handle p_AdTableNewTmp, p_KeysMatchTableNewTmp;
29470aeed3e9SJustin Hibbits     t_Handle p_KeysMatchTableOldTmp, p_AdTableOldTmp;
29480aeed3e9SJustin Hibbits     int size;
29490aeed3e9SJustin Hibbits     int i = 0, j = 0;
29500aeed3e9SJustin Hibbits     bool prvLclMask;
2951852ba100SJustin Hibbits     t_FmPcdStatsObj *p_StatsObj, tmpStatsObj;
2952852ba100SJustin Hibbits     p_AdditionalInfo->numOfKeys = p_CcNode->numOfKeys;
29530aeed3e9SJustin Hibbits 
2954852ba100SJustin Hibbits     prvLclMask = p_CcNode->lclMask;
29550aeed3e9SJustin Hibbits 
2956852ba100SJustin Hibbits     /* Check that new key is not require update of localMask */
2957852ba100SJustin Hibbits     err = UpdateGblMask(p_CcNode, p_CcNode->ccKeySizeAccExtraction, p_Mask);
29580aeed3e9SJustin Hibbits     if (err)
2959852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, (NO_MSG));
2960852ba100SJustin Hibbits 
2961852ba100SJustin Hibbits     /* Update internal data structure with new next engine for the given index */
2962852ba100SJustin Hibbits     memcpy(p_AdditionalInfo->keyAndNextEngineParams[keyIndex].key, p_Key,
2963852ba100SJustin Hibbits            p_CcNode->userSizeOfExtraction);
2964852ba100SJustin Hibbits 
2965852ba100SJustin Hibbits     if (p_Mask)
2966852ba100SJustin Hibbits         memcpy(p_AdditionalInfo->keyAndNextEngineParams[keyIndex].mask, p_Mask,
2967852ba100SJustin Hibbits                p_CcNode->userSizeOfExtraction);
2968852ba100SJustin Hibbits     else
2969852ba100SJustin Hibbits         memset(p_AdditionalInfo->keyAndNextEngineParams[keyIndex].mask, 0xFF,
2970852ba100SJustin Hibbits                p_CcNode->userSizeOfExtraction);
29710aeed3e9SJustin Hibbits 
29720aeed3e9SJustin Hibbits     /*function which build in the memory new KeyTbl, AdTbl*/
2973852ba100SJustin Hibbits     err = BuildNewNodeCommonPart(p_CcNode, &size, p_AdditionalInfo);
29740aeed3e9SJustin Hibbits     if (err)
29750aeed3e9SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
29760aeed3e9SJustin Hibbits 
29770aeed3e9SJustin Hibbits     /*fill the New AdTable and New KeyTable*/
29780aeed3e9SJustin Hibbits     for (j = 0, i = 0; j < p_AdditionalInfo->numOfKeys; j++, i++)
29790aeed3e9SJustin Hibbits     {
2980852ba100SJustin Hibbits         p_AdTableNewTmp =
2981852ba100SJustin Hibbits                 PTR_MOVE(p_AdditionalInfo->p_AdTableNew, j*FM_PCD_CC_AD_ENTRY_SIZE);
2982852ba100SJustin Hibbits         p_AdTableOldTmp =
2983852ba100SJustin Hibbits                 PTR_MOVE(p_AdditionalInfo->p_AdTableOld, i*FM_PCD_CC_AD_ENTRY_SIZE);
2984852ba100SJustin Hibbits 
2985852ba100SJustin Hibbits         MemCpy8(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE);
2986852ba100SJustin Hibbits 
29870aeed3e9SJustin Hibbits         if (j == keyIndex)
29880aeed3e9SJustin Hibbits         {
2989852ba100SJustin Hibbits             ASSERT_COND(keyIndex < CC_MAX_NUM_OF_KEYS);
2990852ba100SJustin Hibbits             if (p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj)
2991852ba100SJustin Hibbits             {
2992852ba100SJustin Hibbits                 /* As statistics were enabled, we need to update the existing
2993852ba100SJustin Hibbits                  statistics descriptor with a new nullified counters. */
2994852ba100SJustin Hibbits                 p_StatsObj = GetStatsObj(p_CcNode);
2995852ba100SJustin Hibbits                 ASSERT_COND(p_StatsObj);
2996852ba100SJustin Hibbits 
2997852ba100SJustin Hibbits                 SetStatsCounters(
2998852ba100SJustin Hibbits                         p_AdTableNewTmp,
2999852ba100SJustin Hibbits                         (uint32_t)((XX_VirtToPhys(p_StatsObj->h_StatsCounters)
3000852ba100SJustin Hibbits                                 - p_FmPcd->physicalMuramBase)));
3001852ba100SJustin Hibbits 
3002852ba100SJustin Hibbits                 tmpStatsObj.h_StatsAd = p_StatsObj->h_StatsAd;
3003852ba100SJustin Hibbits                 tmpStatsObj.h_StatsCounters = p_StatsObj->h_StatsCounters;
3004852ba100SJustin Hibbits 
3005852ba100SJustin Hibbits                 /* As we need to replace only the counters, we build a new statistics
3006852ba100SJustin Hibbits                  object that holds the old AD and the new counters - this will be the
3007852ba100SJustin Hibbits                  currently used statistics object.
3008852ba100SJustin Hibbits                  The newly allocated AD is not required and may be released back to
3009852ba100SJustin Hibbits                  the available objects with the previous counters pointer. */
3010852ba100SJustin Hibbits                 p_StatsObj->h_StatsAd =
3011852ba100SJustin Hibbits                         p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj->h_StatsAd;
3012852ba100SJustin Hibbits 
3013852ba100SJustin Hibbits                 p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj->h_StatsAd =
3014852ba100SJustin Hibbits                         tmpStatsObj.h_StatsAd;
3015852ba100SJustin Hibbits 
3016852ba100SJustin Hibbits                 /* Store allocated statistics object */
3017852ba100SJustin Hibbits                 p_AdditionalInfo->keyAndNextEngineParams[keyIndex].p_StatsObj =
3018852ba100SJustin Hibbits                         p_StatsObj;
3019852ba100SJustin Hibbits 
3020852ba100SJustin Hibbits                 /* As statistics were previously enabled, store the old statistics object to be released */
3021852ba100SJustin Hibbits                 p_AdditionalInfo->p_StatsObjForRmv =
3022852ba100SJustin Hibbits                         p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj;
3023852ba100SJustin Hibbits             }
3024852ba100SJustin Hibbits 
3025852ba100SJustin Hibbits             p_KeysMatchTableNewTmp =
3026852ba100SJustin Hibbits                     PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, j * size * sizeof(uint8_t));
3027852ba100SJustin Hibbits 
3028852ba100SJustin Hibbits             MemCpy8(p_KeysMatchTableNewTmp, p_Key,
3029852ba100SJustin Hibbits                         p_CcNode->userSizeOfExtraction);
3030852ba100SJustin Hibbits 
3031852ba100SJustin Hibbits             if (p_CcNode->lclMask)
30320aeed3e9SJustin Hibbits             {
30330aeed3e9SJustin Hibbits                 if (p_Mask)
3034852ba100SJustin Hibbits                     MemCpy8(PTR_MOVE(p_KeysMatchTableNewTmp,
3035852ba100SJustin Hibbits                             p_CcNode->ccKeySizeAccExtraction),
3036852ba100SJustin Hibbits                                 p_Mask, p_CcNode->userSizeOfExtraction);
30370aeed3e9SJustin Hibbits                 else
3038852ba100SJustin Hibbits                     if (p_CcNode->ccKeySizeAccExtraction > 4)
3039852ba100SJustin Hibbits                         MemSet8(PTR_MOVE(p_KeysMatchTableNewTmp,
3040852ba100SJustin Hibbits                                 p_CcNode->ccKeySizeAccExtraction),
3041852ba100SJustin Hibbits                                    0xff, p_CcNode->userSizeOfExtraction);
3042852ba100SJustin Hibbits                     else
3043852ba100SJustin Hibbits                         MemCpy8(PTR_MOVE(p_KeysMatchTableNewTmp,
3044852ba100SJustin Hibbits                                 p_CcNode->ccKeySizeAccExtraction),
3045852ba100SJustin Hibbits                                     p_CcNode->p_GlblMask,
3046852ba100SJustin Hibbits                                     p_CcNode->userSizeOfExtraction);
30470aeed3e9SJustin Hibbits             }
30480aeed3e9SJustin Hibbits         }
30490aeed3e9SJustin Hibbits         else
30500aeed3e9SJustin Hibbits         {
3051852ba100SJustin Hibbits             p_KeysMatchTableNewTmp =
3052852ba100SJustin Hibbits                     PTR_MOVE(p_AdditionalInfo->p_KeysMatchTableNew, j * size * sizeof(uint8_t));
3053852ba100SJustin Hibbits             p_KeysMatchTableOldTmp =
3054852ba100SJustin Hibbits                     PTR_MOVE(p_CcNode->h_KeysMatchTable, i * size * sizeof(uint8_t));
3055852ba100SJustin Hibbits 
3056852ba100SJustin Hibbits             if (p_CcNode->lclMask)
30570aeed3e9SJustin Hibbits             {
30580aeed3e9SJustin Hibbits                 if (prvLclMask)
3059852ba100SJustin Hibbits                     MemCpy8(
3060852ba100SJustin Hibbits                             PTR_MOVE(p_KeysMatchTableNewTmp, p_CcNode->ccKeySizeAccExtraction),
3061852ba100SJustin Hibbits                             PTR_MOVE(p_KeysMatchTableOldTmp, p_CcNode->ccKeySizeAccExtraction),
3062852ba100SJustin Hibbits                             p_CcNode->userSizeOfExtraction);
30630aeed3e9SJustin Hibbits                 else
30640aeed3e9SJustin Hibbits                 {
3065852ba100SJustin Hibbits                     p_KeysMatchTableOldTmp =
3066852ba100SJustin Hibbits                             PTR_MOVE(p_CcNode->h_KeysMatchTable,
3067852ba100SJustin Hibbits                                      i * (int)p_CcNode->ccKeySizeAccExtraction * sizeof(uint8_t));
30680aeed3e9SJustin Hibbits 
3069852ba100SJustin Hibbits                     if (p_CcNode->ccKeySizeAccExtraction > 4)
3070852ba100SJustin Hibbits                         MemSet8(PTR_MOVE(p_KeysMatchTableNewTmp,
3071852ba100SJustin Hibbits                                 p_CcNode->ccKeySizeAccExtraction),
3072852ba100SJustin Hibbits                                    0xff, p_CcNode->userSizeOfExtraction);
30730aeed3e9SJustin Hibbits                     else
3074852ba100SJustin Hibbits                         MemCpy8(
3075852ba100SJustin Hibbits                                 PTR_MOVE(p_KeysMatchTableNewTmp, p_CcNode->ccKeySizeAccExtraction),
3076852ba100SJustin Hibbits                                 p_CcNode->p_GlblMask,
3077852ba100SJustin Hibbits                                 p_CcNode->userSizeOfExtraction);
30780aeed3e9SJustin Hibbits                 }
30790aeed3e9SJustin Hibbits             }
3080852ba100SJustin Hibbits             MemCpy8((void*)p_KeysMatchTableNewTmp, p_KeysMatchTableOldTmp,
3081852ba100SJustin Hibbits                        p_CcNode->ccKeySizeAccExtraction);
30820aeed3e9SJustin Hibbits         }
30830aeed3e9SJustin Hibbits     }
30840aeed3e9SJustin Hibbits 
3085852ba100SJustin Hibbits     p_AdTableNewTmp =
3086852ba100SJustin Hibbits             PTR_MOVE(p_AdditionalInfo->p_AdTableNew, j * FM_PCD_CC_AD_ENTRY_SIZE);
3087852ba100SJustin Hibbits     p_AdTableOldTmp = PTR_MOVE(p_CcNode->h_AdTable, i * FM_PCD_CC_AD_ENTRY_SIZE);
3088852ba100SJustin Hibbits 
3089852ba100SJustin Hibbits     MemCpy8(p_AdTableNewTmp, p_AdTableOldTmp, FM_PCD_CC_AD_ENTRY_SIZE);
30900aeed3e9SJustin Hibbits 
30910aeed3e9SJustin Hibbits     return E_OK;
30920aeed3e9SJustin Hibbits }
30930aeed3e9SJustin Hibbits 
BuildNewNodeModifyNextEngine(t_Handle h_FmPcd,t_Handle h_FmPcdCcNodeOrTree,uint16_t keyIndex,t_FmPcdCcNextEngineParams * p_CcNextEngineParams,t_List * h_OldLst,t_List * h_NewLst,t_FmPcdModifyCcKeyAdditionalParams * p_AdditionalInfo)3094852ba100SJustin Hibbits static t_Error BuildNewNodeModifyNextEngine(
3095852ba100SJustin Hibbits         t_Handle h_FmPcd, t_Handle h_FmPcdCcNodeOrTree, uint16_t keyIndex,
3096852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams *p_CcNextEngineParams, t_List *h_OldLst,
3097852ba100SJustin Hibbits         t_List *h_NewLst, t_FmPcdModifyCcKeyAdditionalParams *p_AdditionalInfo)
30980aeed3e9SJustin Hibbits {
30990aeed3e9SJustin Hibbits     t_Error err = E_OK;
31000aeed3e9SJustin Hibbits     uint32_t requiredAction = 0;
31010aeed3e9SJustin Hibbits     t_List *p_Pos;
31020aeed3e9SJustin Hibbits     t_CcNodeInformation *p_CcNodeInformation, ccNodeInfo;
31030aeed3e9SJustin Hibbits     t_Handle p_Ad;
31040aeed3e9SJustin Hibbits     t_FmPcdCcNode *p_FmPcdCcNode1 = NULL;
31050aeed3e9SJustin Hibbits     t_FmPcdCcTree *p_FmPcdCcTree = NULL;
3106852ba100SJustin Hibbits     t_FmPcdStatsObj *p_StatsObj;
3107852ba100SJustin Hibbits     t_FmPcdCcStatsParams statsParams = { 0 };
31080aeed3e9SJustin Hibbits 
31090aeed3e9SJustin Hibbits     ASSERT_COND(p_CcNextEngineParams);
3110852ba100SJustin Hibbits 
31110aeed3e9SJustin Hibbits     /* check that new NIA is legal */
3112852ba100SJustin Hibbits     if (!p_AdditionalInfo->tree)
3113852ba100SJustin Hibbits         err = ValidateNextEngineParams(
3114852ba100SJustin Hibbits                 h_FmPcd, p_CcNextEngineParams,
3115852ba100SJustin Hibbits                 ((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->statisticsMode);
3116852ba100SJustin Hibbits     else
3117852ba100SJustin Hibbits         /* Statistics are not supported for CC root */
3118852ba100SJustin Hibbits         err = ValidateNextEngineParams(h_FmPcd, p_CcNextEngineParams,
3119852ba100SJustin Hibbits                                        e_FM_PCD_CC_STATS_MODE_NONE);
31200aeed3e9SJustin Hibbits     if (err)
31210aeed3e9SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
31220aeed3e9SJustin Hibbits 
3123852ba100SJustin Hibbits     /* Update internal data structure for next engine per index (index - key) */
3124852ba100SJustin Hibbits     memcpy(&p_AdditionalInfo->keyAndNextEngineParams[keyIndex].nextEngineParams,
3125852ba100SJustin Hibbits            p_CcNextEngineParams, sizeof(t_FmPcdCcNextEngineParams));
31260aeed3e9SJustin Hibbits 
3127852ba100SJustin Hibbits     /* Check that manip is legal and what requiredAction is necessary for this manip */
31280aeed3e9SJustin Hibbits     if (p_CcNextEngineParams->h_Manip)
31290aeed3e9SJustin Hibbits     {
3130852ba100SJustin Hibbits         err = FmPcdManipCheckParamsForCcNextEngine(p_CcNextEngineParams,
3131852ba100SJustin Hibbits                                                    &requiredAction);
31320aeed3e9SJustin Hibbits         if (err)
31330aeed3e9SJustin Hibbits             RETURN_ERROR(MAJOR, err, (NO_MSG));
31340aeed3e9SJustin Hibbits     }
31350aeed3e9SJustin Hibbits 
31360aeed3e9SJustin Hibbits     if (!p_AdditionalInfo->tree)
31370aeed3e9SJustin Hibbits     {
31380aeed3e9SJustin Hibbits         p_FmPcdCcNode1 = (t_FmPcdCcNode *)h_FmPcdCcNodeOrTree;
3139852ba100SJustin Hibbits         p_AdditionalInfo->numOfKeys = p_FmPcdCcNode1->numOfKeys;
31400aeed3e9SJustin Hibbits         p_Ad = p_FmPcdCcNode1->h_AdTable;
3141852ba100SJustin Hibbits 
3142852ba100SJustin Hibbits         if (p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine
3143852ba100SJustin Hibbits                 == e_FM_PCD_CC)
3144852ba100SJustin Hibbits             p_AdditionalInfo->h_NodeForRmv =
3145852ba100SJustin Hibbits                     p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.params.ccParams.h_CcNode;
3146852ba100SJustin Hibbits 
3147852ba100SJustin Hibbits         if (p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip)
3148852ba100SJustin Hibbits             p_AdditionalInfo->h_ManipForRmv =
3149852ba100SJustin Hibbits                     p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip;
3150852ba100SJustin Hibbits 
3151852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
3152852ba100SJustin Hibbits         if ((p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine
3153852ba100SJustin Hibbits                 == e_FM_PCD_FR)
3154852ba100SJustin Hibbits                 && (p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic))
3155852ba100SJustin Hibbits             p_AdditionalInfo->h_FrmReplicForRmv =
3156852ba100SJustin Hibbits                     p_FmPcdCcNode1->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic;
3157852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
31580aeed3e9SJustin Hibbits     }
31590aeed3e9SJustin Hibbits     else
31600aeed3e9SJustin Hibbits     {
31610aeed3e9SJustin Hibbits         p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcNodeOrTree;
31620aeed3e9SJustin Hibbits         p_Ad = UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr);
3163852ba100SJustin Hibbits 
3164852ba100SJustin Hibbits         if (p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine
3165852ba100SJustin Hibbits                 == e_FM_PCD_CC)
3166852ba100SJustin Hibbits             p_AdditionalInfo->h_NodeForRmv =
3167852ba100SJustin Hibbits                     p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.params.ccParams.h_CcNode;
3168852ba100SJustin Hibbits 
3169852ba100SJustin Hibbits         if (p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip)
3170852ba100SJustin Hibbits             p_AdditionalInfo->h_ManipForRmv =
3171852ba100SJustin Hibbits                     p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.h_Manip;
3172852ba100SJustin Hibbits 
3173852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
3174852ba100SJustin Hibbits         if ((p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.nextEngine
3175852ba100SJustin Hibbits                 == e_FM_PCD_FR)
3176852ba100SJustin Hibbits                 && (p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic))
3177852ba100SJustin Hibbits             p_AdditionalInfo->h_FrmReplicForRmv =
3178852ba100SJustin Hibbits                     p_FmPcdCcTree->keyAndNextEngineParams[keyIndex].nextEngineParams.params.frParams.h_FrmReplic;
3179852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
31800aeed3e9SJustin Hibbits     }
3181852ba100SJustin Hibbits 
3182852ba100SJustin Hibbits     if ((p_CcNextEngineParams->nextEngine == e_FM_PCD_CC)
3183852ba100SJustin Hibbits             && p_CcNextEngineParams->h_Manip)
3184852ba100SJustin Hibbits     {
3185852ba100SJustin Hibbits         err = AllocAndFillAdForContLookupManip(
3186852ba100SJustin Hibbits                 p_CcNextEngineParams->params.ccParams.h_CcNode);
3187852ba100SJustin Hibbits         if (err)
3188852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, err, (NO_MSG));
3189852ba100SJustin Hibbits     }
3190852ba100SJustin Hibbits 
31910aeed3e9SJustin Hibbits     ASSERT_COND(p_Ad);
3192852ba100SJustin Hibbits 
31930aeed3e9SJustin Hibbits     memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
31940aeed3e9SJustin Hibbits     ccNodeInfo.h_CcNode = PTR_MOVE(p_Ad, keyIndex * FM_PCD_CC_AD_ENTRY_SIZE);
3195852ba100SJustin Hibbits 
3196852ba100SJustin Hibbits     /* If statistics were enabled, this Ad is the statistics Ad. Need to follow its
3197852ba100SJustin Hibbits      nextAction to retrieve the actual Nia-Ad. If statistics should remain enabled,
3198852ba100SJustin Hibbits      only the actual Nia-Ad should be modified. */
3199852ba100SJustin Hibbits     if ((!p_AdditionalInfo->tree)
3200852ba100SJustin Hibbits             && (((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->keyAndNextEngineParams[keyIndex].p_StatsObj)
3201852ba100SJustin Hibbits             && (p_CcNextEngineParams->statisticsEn))
3202852ba100SJustin Hibbits         ccNodeInfo.h_CcNode =
3203852ba100SJustin Hibbits                 ((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->keyAndNextEngineParams[keyIndex].p_StatsObj->h_StatsAd;
3204852ba100SJustin Hibbits 
3205852ba100SJustin Hibbits     EnqueueNodeInfoToRelevantLst(h_OldLst, &ccNodeInfo, NULL);
32060aeed3e9SJustin Hibbits 
32070aeed3e9SJustin Hibbits     memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
3208852ba100SJustin Hibbits     p_Ad = GetNewAd(h_FmPcdCcNodeOrTree, p_AdditionalInfo->tree);
32090aeed3e9SJustin Hibbits     if (!p_Ad)
3210852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_NO_MEMORY,
3211852ba100SJustin Hibbits                      ("MURAM allocation for CC node action descriptor"));
3212852ba100SJustin Hibbits     MemSet8((uint8_t *)p_Ad, 0, FM_PCD_CC_AD_ENTRY_SIZE);
32130aeed3e9SJustin Hibbits 
3214852ba100SJustin Hibbits     /* If statistics were not enabled before, but requested now -  Allocate a statistics
3215852ba100SJustin Hibbits      object that holds statistics AD and counters. */
3216852ba100SJustin Hibbits     if ((!p_AdditionalInfo->tree)
3217852ba100SJustin Hibbits             && (!((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->keyAndNextEngineParams[keyIndex].p_StatsObj)
3218852ba100SJustin Hibbits             && (p_CcNextEngineParams->statisticsEn))
3219852ba100SJustin Hibbits     {
3220852ba100SJustin Hibbits         p_StatsObj = GetStatsObj((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree);
3221852ba100SJustin Hibbits         ASSERT_COND(p_StatsObj);
3222852ba100SJustin Hibbits 
3223852ba100SJustin Hibbits         /* Store allocated statistics object */
3224852ba100SJustin Hibbits         p_AdditionalInfo->keyAndNextEngineParams[keyIndex].p_StatsObj =
3225852ba100SJustin Hibbits                 p_StatsObj;
3226852ba100SJustin Hibbits 
3227852ba100SJustin Hibbits         statsParams.h_StatsAd = p_StatsObj->h_StatsAd;
3228852ba100SJustin Hibbits         statsParams.h_StatsCounters = p_StatsObj->h_StatsCounters;
3229852ba100SJustin Hibbits 
3230852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
3231852ba100SJustin Hibbits         statsParams.h_StatsFLRs =
3232852ba100SJustin Hibbits                 ((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->h_StatsFLRs;
3233852ba100SJustin Hibbits 
3234852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
3235852ba100SJustin Hibbits 
3236852ba100SJustin Hibbits         NextStepAd(p_Ad, &statsParams, p_CcNextEngineParams, h_FmPcd);
3237852ba100SJustin Hibbits     }
3238852ba100SJustin Hibbits     else
3239852ba100SJustin Hibbits         NextStepAd(p_Ad, NULL, p_CcNextEngineParams, h_FmPcd);
3240852ba100SJustin Hibbits 
32410aeed3e9SJustin Hibbits     ccNodeInfo.h_CcNode = p_Ad;
3242852ba100SJustin Hibbits     EnqueueNodeInfoToRelevantLst(h_NewLst, &ccNodeInfo, NULL);
32430aeed3e9SJustin Hibbits 
3244852ba100SJustin Hibbits     p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction =
3245852ba100SJustin Hibbits             requiredAction;
3246852ba100SJustin Hibbits     p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction |=
3247852ba100SJustin Hibbits             UPDATE_CC_WITH_TREE;
32480aeed3e9SJustin Hibbits 
32490aeed3e9SJustin Hibbits     if (!p_AdditionalInfo->tree)
32500aeed3e9SJustin Hibbits     {
32510aeed3e9SJustin Hibbits         ASSERT_COND(p_FmPcdCcNode1);
3252852ba100SJustin Hibbits         if (!NCSW_LIST_IsEmpty(&p_FmPcdCcNode1->ccTreesLst))
32530aeed3e9SJustin Hibbits         {
3254852ba100SJustin Hibbits             NCSW_LIST_FOR_EACH(p_Pos, &p_FmPcdCcNode1->ccTreesLst)
32550aeed3e9SJustin Hibbits             {
32560aeed3e9SJustin Hibbits                 p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
3257852ba100SJustin Hibbits 
32580aeed3e9SJustin Hibbits                 ASSERT_COND(p_CcNodeInformation->h_CcNode);
3259852ba100SJustin Hibbits                 /* Update the manipulation which has to be updated from parameters of the port
3260852ba100SJustin Hibbits                  it's has to be updated with restrictions defined in the function */
3261852ba100SJustin Hibbits 
3262852ba100SJustin Hibbits                 err =
3263852ba100SJustin Hibbits                         SetRequiredAction(
3264852ba100SJustin Hibbits                                 p_FmPcdCcNode1->h_FmPcd,
3265852ba100SJustin Hibbits                                 p_FmPcdCcNode1->shadowAction
3266852ba100SJustin Hibbits                                         | p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction,
3267852ba100SJustin Hibbits                                 &p_AdditionalInfo->keyAndNextEngineParams[keyIndex],
32680aeed3e9SJustin Hibbits                                 p_Ad, 1, p_CcNodeInformation->h_CcNode);
32690aeed3e9SJustin Hibbits                 if (err)
32700aeed3e9SJustin Hibbits                     RETURN_ERROR(MAJOR, err, (NO_MSG));
3271852ba100SJustin Hibbits 
3272852ba100SJustin Hibbits                 err = CcUpdateParam(
3273852ba100SJustin Hibbits                         p_FmPcdCcNode1->h_FmPcd, NULL, NULL,
3274852ba100SJustin Hibbits                         &p_AdditionalInfo->keyAndNextEngineParams[keyIndex], 1,
3275852ba100SJustin Hibbits                         p_Ad, TRUE, p_CcNodeInformation->index,
3276852ba100SJustin Hibbits                         p_CcNodeInformation->h_CcNode, TRUE);
32770aeed3e9SJustin Hibbits                 if (err)
32780aeed3e9SJustin Hibbits                     RETURN_ERROR(MAJOR, err, (NO_MSG));
32790aeed3e9SJustin Hibbits             }
32800aeed3e9SJustin Hibbits         }
32810aeed3e9SJustin Hibbits     }
32820aeed3e9SJustin Hibbits     else
32830aeed3e9SJustin Hibbits     {
32840aeed3e9SJustin Hibbits         ASSERT_COND(p_FmPcdCcTree);
3285852ba100SJustin Hibbits 
3286852ba100SJustin Hibbits         err =
3287852ba100SJustin Hibbits                 SetRequiredAction(
3288852ba100SJustin Hibbits                         h_FmPcd,
3289852ba100SJustin Hibbits                         p_FmPcdCcTree->requiredAction
3290852ba100SJustin Hibbits                                 | p_AdditionalInfo->keyAndNextEngineParams[keyIndex].requiredAction,
3291852ba100SJustin Hibbits                         &p_AdditionalInfo->keyAndNextEngineParams[keyIndex],
32920aeed3e9SJustin Hibbits                         p_Ad, 1, (t_Handle)p_FmPcdCcTree);
32930aeed3e9SJustin Hibbits         if (err)
32940aeed3e9SJustin Hibbits             RETURN_ERROR(MAJOR, err, (NO_MSG));
3295852ba100SJustin Hibbits 
3296852ba100SJustin Hibbits         err = CcUpdateParam(h_FmPcd, NULL, NULL,
3297852ba100SJustin Hibbits                             &p_AdditionalInfo->keyAndNextEngineParams[keyIndex],
3298852ba100SJustin Hibbits                             1, p_Ad, TRUE, 0, (t_Handle)p_FmPcdCcTree, TRUE);
32990aeed3e9SJustin Hibbits         if (err)
33000aeed3e9SJustin Hibbits             RETURN_ERROR(MAJOR, err, (NO_MSG));
33010aeed3e9SJustin Hibbits     }
33020aeed3e9SJustin Hibbits 
33030aeed3e9SJustin Hibbits     if (p_CcNextEngineParams->nextEngine == e_FM_PCD_CC)
3304852ba100SJustin Hibbits         p_AdditionalInfo->h_NodeForAdd =
3305852ba100SJustin Hibbits                 p_CcNextEngineParams->params.ccParams.h_CcNode;
3306852ba100SJustin Hibbits     if (p_CcNextEngineParams->h_Manip)
3307852ba100SJustin Hibbits         p_AdditionalInfo->h_ManipForAdd = p_CcNextEngineParams->h_Manip;
3308852ba100SJustin Hibbits 
3309852ba100SJustin Hibbits     /* If statistics were previously enabled, but now are disabled,
3310852ba100SJustin Hibbits      store the old statistics object to be released */
3311852ba100SJustin Hibbits     if ((!p_AdditionalInfo->tree)
3312852ba100SJustin Hibbits             && (((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->keyAndNextEngineParams[keyIndex].p_StatsObj)
3313852ba100SJustin Hibbits             && (!p_CcNextEngineParams->statisticsEn))
3314852ba100SJustin Hibbits     {
3315852ba100SJustin Hibbits         p_AdditionalInfo->p_StatsObjForRmv =
3316852ba100SJustin Hibbits                 ((t_FmPcdCcNode *)h_FmPcdCcNodeOrTree)->keyAndNextEngineParams[keyIndex].p_StatsObj;
3317852ba100SJustin Hibbits 
3318852ba100SJustin Hibbits 
3319852ba100SJustin Hibbits         p_AdditionalInfo->keyAndNextEngineParams[keyIndex].p_StatsObj = NULL;
3320852ba100SJustin Hibbits     }
3321852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
3322852ba100SJustin Hibbits     if ((p_CcNextEngineParams->nextEngine == e_FM_PCD_FR)
3323852ba100SJustin Hibbits             && (p_CcNextEngineParams->params.frParams.h_FrmReplic))
3324852ba100SJustin Hibbits         p_AdditionalInfo->h_FrmReplicForAdd =
3325852ba100SJustin Hibbits                 p_CcNextEngineParams->params.frParams.h_FrmReplic;
3326852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
3327852ba100SJustin Hibbits 
33280aeed3e9SJustin Hibbits     return E_OK;
33290aeed3e9SJustin Hibbits }
33300aeed3e9SJustin Hibbits 
UpdateAdPtrOfNodesWhichPointsOnCrntMdfNode(t_FmPcdCcNode * p_CrntMdfNode,t_List * h_OldLst,t_FmPcdCcNextEngineParams ** p_NextEngineParams)3331852ba100SJustin Hibbits static void UpdateAdPtrOfNodesWhichPointsOnCrntMdfNode(
3332852ba100SJustin Hibbits         t_FmPcdCcNode *p_CrntMdfNode, t_List *h_OldLst,
3333852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams **p_NextEngineParams)
33340aeed3e9SJustin Hibbits {
33350aeed3e9SJustin Hibbits     t_CcNodeInformation *p_CcNodeInformation;
33360aeed3e9SJustin Hibbits     t_FmPcdCcNode *p_NodePtrOnCurrentMdfNode = NULL;
33370aeed3e9SJustin Hibbits     t_List *p_Pos;
33380aeed3e9SJustin Hibbits     int i = 0;
3339852ba100SJustin Hibbits     t_Handle p_AdTablePtOnCrntCurrentMdfNode/*, p_AdTableNewModified*/;
33400aeed3e9SJustin Hibbits     t_CcNodeInformation ccNodeInfo;
33410aeed3e9SJustin Hibbits 
3342852ba100SJustin Hibbits     NCSW_LIST_FOR_EACH(p_Pos, &p_CrntMdfNode->ccPrevNodesLst)
33430aeed3e9SJustin Hibbits     {
33440aeed3e9SJustin Hibbits         p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
3345852ba100SJustin Hibbits         p_NodePtrOnCurrentMdfNode =
3346852ba100SJustin Hibbits                 (t_FmPcdCcNode *)p_CcNodeInformation->h_CcNode;
3347852ba100SJustin Hibbits 
33480aeed3e9SJustin Hibbits         ASSERT_COND(p_NodePtrOnCurrentMdfNode);
3349852ba100SJustin Hibbits 
3350852ba100SJustin Hibbits         /* Search in the previous node which exact index points on this current modified node for getting AD */
33510aeed3e9SJustin Hibbits         for (i = 0; i < p_NodePtrOnCurrentMdfNode->numOfKeys + 1; i++)
33520aeed3e9SJustin Hibbits         {
3353852ba100SJustin Hibbits             if (p_NodePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams.nextEngine
3354852ba100SJustin Hibbits                     == e_FM_PCD_CC)
33550aeed3e9SJustin Hibbits             {
3356852ba100SJustin Hibbits                 if (p_NodePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode
3357852ba100SJustin Hibbits                         == (t_Handle)p_CrntMdfNode)
33580aeed3e9SJustin Hibbits                 {
3359852ba100SJustin Hibbits                     if (p_NodePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip)
3360852ba100SJustin Hibbits                         p_AdTablePtOnCrntCurrentMdfNode = p_CrntMdfNode->h_Ad;
3361852ba100SJustin Hibbits                     else
3362852ba100SJustin Hibbits                         if (p_NodePtrOnCurrentMdfNode->keyAndNextEngineParams[i].p_StatsObj)
3363852ba100SJustin Hibbits                             p_AdTablePtOnCrntCurrentMdfNode =
3364852ba100SJustin Hibbits                                     p_NodePtrOnCurrentMdfNode->keyAndNextEngineParams[i].p_StatsObj->h_StatsAd;
3365852ba100SJustin Hibbits                         else
3366852ba100SJustin Hibbits                             p_AdTablePtOnCrntCurrentMdfNode =
3367852ba100SJustin Hibbits                                     PTR_MOVE(p_NodePtrOnCurrentMdfNode->h_AdTable, i*FM_PCD_CC_AD_ENTRY_SIZE);
3368852ba100SJustin Hibbits 
33690aeed3e9SJustin Hibbits                     memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
33700aeed3e9SJustin Hibbits                     ccNodeInfo.h_CcNode = p_AdTablePtOnCrntCurrentMdfNode;
3371852ba100SJustin Hibbits                     EnqueueNodeInfoToRelevantLst(h_OldLst, &ccNodeInfo, NULL);
33720aeed3e9SJustin Hibbits 
3373852ba100SJustin Hibbits                     if (!(*p_NextEngineParams))
3374852ba100SJustin Hibbits                         *p_NextEngineParams =
3375852ba100SJustin Hibbits                                 &p_NodePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams;
33760aeed3e9SJustin Hibbits                 }
33770aeed3e9SJustin Hibbits             }
33780aeed3e9SJustin Hibbits         }
3379852ba100SJustin Hibbits 
33800aeed3e9SJustin Hibbits         ASSERT_COND(i != p_NodePtrOnCurrentMdfNode->numOfKeys);
33810aeed3e9SJustin Hibbits     }
33820aeed3e9SJustin Hibbits }
33830aeed3e9SJustin Hibbits 
UpdateAdPtrOfTreesWhichPointsOnCrntMdfNode(t_FmPcdCcNode * p_CrntMdfNode,t_List * h_OldLst,t_FmPcdCcNextEngineParams ** p_NextEngineParams)3384852ba100SJustin Hibbits static void UpdateAdPtrOfTreesWhichPointsOnCrntMdfNode(
3385852ba100SJustin Hibbits         t_FmPcdCcNode *p_CrntMdfNode, t_List *h_OldLst,
3386852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams **p_NextEngineParams)
33870aeed3e9SJustin Hibbits {
33880aeed3e9SJustin Hibbits     t_CcNodeInformation *p_CcNodeInformation;
33890aeed3e9SJustin Hibbits     t_FmPcdCcTree *p_TreePtrOnCurrentMdfNode = NULL;
33900aeed3e9SJustin Hibbits     t_List *p_Pos;
33910aeed3e9SJustin Hibbits     int i = 0;
3392852ba100SJustin Hibbits     t_Handle p_AdTableTmp;
33930aeed3e9SJustin Hibbits     t_CcNodeInformation ccNodeInfo;
33940aeed3e9SJustin Hibbits 
3395852ba100SJustin Hibbits     NCSW_LIST_FOR_EACH(p_Pos, &p_CrntMdfNode->ccTreeIdLst)
33960aeed3e9SJustin Hibbits     {
33970aeed3e9SJustin Hibbits         p_CcNodeInformation = CC_NODE_F_OBJECT(p_Pos);
3398852ba100SJustin Hibbits         p_TreePtrOnCurrentMdfNode =
3399852ba100SJustin Hibbits                 (t_FmPcdCcTree *)p_CcNodeInformation->h_CcNode;
34000aeed3e9SJustin Hibbits 
34010aeed3e9SJustin Hibbits         ASSERT_COND(p_TreePtrOnCurrentMdfNode);
3402852ba100SJustin Hibbits 
3403852ba100SJustin Hibbits         /*search in the trees which exact index points on this current modified node for getting AD */
34040aeed3e9SJustin Hibbits         for (i = 0; i < p_TreePtrOnCurrentMdfNode->numOfEntries; i++)
34050aeed3e9SJustin Hibbits         {
3406852ba100SJustin Hibbits             if (p_TreePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams.nextEngine
3407852ba100SJustin Hibbits                     == e_FM_PCD_CC)
34080aeed3e9SJustin Hibbits             {
3409852ba100SJustin Hibbits                 if (p_TreePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode
3410852ba100SJustin Hibbits                         == (t_Handle)p_CrntMdfNode)
34110aeed3e9SJustin Hibbits                 {
3412852ba100SJustin Hibbits                     p_AdTableTmp =
3413852ba100SJustin Hibbits                             UINT_TO_PTR(p_TreePtrOnCurrentMdfNode->ccTreeBaseAddr + i*FM_PCD_CC_AD_ENTRY_SIZE);
34140aeed3e9SJustin Hibbits                     memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
34150aeed3e9SJustin Hibbits                     ccNodeInfo.h_CcNode = p_AdTableTmp;
3416852ba100SJustin Hibbits                     EnqueueNodeInfoToRelevantLst(h_OldLst, &ccNodeInfo, NULL);
34170aeed3e9SJustin Hibbits 
3418852ba100SJustin Hibbits                     if (!(*p_NextEngineParams))
3419852ba100SJustin Hibbits                         *p_NextEngineParams =
3420852ba100SJustin Hibbits                                 &p_TreePtrOnCurrentMdfNode->keyAndNextEngineParams[i].nextEngineParams;
34210aeed3e9SJustin Hibbits                 }
34220aeed3e9SJustin Hibbits             }
34230aeed3e9SJustin Hibbits         }
3424852ba100SJustin Hibbits 
34250aeed3e9SJustin Hibbits         ASSERT_COND(i == p_TreePtrOnCurrentMdfNode->numOfEntries);
34260aeed3e9SJustin Hibbits     }
34270aeed3e9SJustin Hibbits }
34280aeed3e9SJustin Hibbits 
ModifyNodeCommonPart(t_Handle h_FmPcdCcNodeOrTree,uint16_t keyIndex,e_ModifyState modifyState,bool ttlCheck,bool hashCheck,bool tree)3429852ba100SJustin Hibbits static t_FmPcdModifyCcKeyAdditionalParams * ModifyNodeCommonPart(
3430852ba100SJustin Hibbits         t_Handle h_FmPcdCcNodeOrTree, uint16_t keyIndex,
3431852ba100SJustin Hibbits         e_ModifyState modifyState, bool ttlCheck, bool hashCheck, bool tree)
34320aeed3e9SJustin Hibbits {
34330aeed3e9SJustin Hibbits     t_FmPcdModifyCcKeyAdditionalParams *p_FmPcdModifyCcKeyAdditionalParams;
34340aeed3e9SJustin Hibbits     int i = 0, j = 0;
34350aeed3e9SJustin Hibbits     bool wasUpdate = FALSE;
3436852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = NULL;
34370aeed3e9SJustin Hibbits     t_FmPcdCcTree *p_FmPcdCcTree;
34380aeed3e9SJustin Hibbits     uint16_t numOfKeys;
3439852ba100SJustin Hibbits     t_FmPcdCcKeyAndNextEngineParams *p_KeyAndNextEngineParams;
34400aeed3e9SJustin Hibbits 
3441852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(h_FmPcdCcNodeOrTree, E_INVALID_HANDLE, NULL);
34420aeed3e9SJustin Hibbits 
34430aeed3e9SJustin Hibbits     if (!tree)
34440aeed3e9SJustin Hibbits     {
3445852ba100SJustin Hibbits         p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNodeOrTree;
3446852ba100SJustin Hibbits         numOfKeys = p_CcNode->numOfKeys;
34470aeed3e9SJustin Hibbits 
34480aeed3e9SJustin Hibbits         /* node has to be pointed by another node or tree */
3449852ba100SJustin Hibbits 
3450852ba100SJustin Hibbits         p_KeyAndNextEngineParams = (t_FmPcdCcKeyAndNextEngineParams *)XX_Malloc(
3451852ba100SJustin Hibbits                 sizeof(t_FmPcdCcKeyAndNextEngineParams) * (numOfKeys + 1));
3452852ba100SJustin Hibbits         if (!p_KeyAndNextEngineParams)
34530aeed3e9SJustin Hibbits         {
3454852ba100SJustin Hibbits             REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Next engine and required action structure"));
3455852ba100SJustin Hibbits             return NULL;
3456852ba100SJustin Hibbits         }
3457852ba100SJustin Hibbits         memcpy(p_KeyAndNextEngineParams, p_CcNode->keyAndNextEngineParams,
3458852ba100SJustin Hibbits                (numOfKeys + 1) * sizeof(t_FmPcdCcKeyAndNextEngineParams));
3459852ba100SJustin Hibbits 
3460852ba100SJustin Hibbits         if (ttlCheck)
3461852ba100SJustin Hibbits         {
3462852ba100SJustin Hibbits             if ((p_CcNode->parseCode == CC_PC_FF_IPV4TTL)
3463852ba100SJustin Hibbits                     || (p_CcNode->parseCode == CC_PC_FF_IPV6HOP_LIMIT))
3464852ba100SJustin Hibbits             {
3465852ba100SJustin Hibbits                 XX_Free(p_KeyAndNextEngineParams);
3466852ba100SJustin Hibbits                 REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("nodeId of CC_PC_FF_IPV4TTL or CC_PC_FF_IPV6HOP_LIMIT can not be used for this operation"));
3467852ba100SJustin Hibbits                 return NULL;
3468852ba100SJustin Hibbits             }
34690aeed3e9SJustin Hibbits         }
34700aeed3e9SJustin Hibbits 
3471852ba100SJustin Hibbits         if (hashCheck)
34720aeed3e9SJustin Hibbits         {
3473852ba100SJustin Hibbits             if (p_CcNode->parseCode == CC_PC_GENERIC_IC_HASH_INDEXED)
34740aeed3e9SJustin Hibbits             {
3475852ba100SJustin Hibbits                 XX_Free(p_KeyAndNextEngineParams);
3476852ba100SJustin Hibbits                 REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("nodeId of CC_PC_GENERIC_IC_HASH_INDEXED can not be used for this operation"));
3477852ba100SJustin Hibbits                 return NULL;
34780aeed3e9SJustin Hibbits             }
34790aeed3e9SJustin Hibbits         }
34800aeed3e9SJustin Hibbits     }
34810aeed3e9SJustin Hibbits     else
34820aeed3e9SJustin Hibbits     {
34830aeed3e9SJustin Hibbits         p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcNodeOrTree;
34840aeed3e9SJustin Hibbits         numOfKeys = p_FmPcdCcTree->numOfEntries;
3485852ba100SJustin Hibbits 
3486852ba100SJustin Hibbits         p_KeyAndNextEngineParams = (t_FmPcdCcKeyAndNextEngineParams *)XX_Malloc(
3487852ba100SJustin Hibbits                 sizeof(t_FmPcdCcKeyAndNextEngineParams)
3488852ba100SJustin Hibbits                         * FM_PCD_MAX_NUM_OF_CC_GROUPS);
3489852ba100SJustin Hibbits         if (!p_KeyAndNextEngineParams)
3490852ba100SJustin Hibbits         {
3491852ba100SJustin Hibbits             REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Next engine and required action structure"));
3492852ba100SJustin Hibbits             return NULL;
3493852ba100SJustin Hibbits         }
3494852ba100SJustin Hibbits         memcpy(p_KeyAndNextEngineParams,
3495852ba100SJustin Hibbits                p_FmPcdCcTree->keyAndNextEngineParams,
3496852ba100SJustin Hibbits                FM_PCD_MAX_NUM_OF_CC_GROUPS
3497852ba100SJustin Hibbits                        * sizeof(t_FmPcdCcKeyAndNextEngineParams));
34980aeed3e9SJustin Hibbits     }
34990aeed3e9SJustin Hibbits 
35000aeed3e9SJustin Hibbits     p_FmPcdModifyCcKeyAdditionalParams =
3501852ba100SJustin Hibbits             (t_FmPcdModifyCcKeyAdditionalParams *)XX_Malloc(
3502852ba100SJustin Hibbits                     sizeof(t_FmPcdModifyCcKeyAdditionalParams));
35030aeed3e9SJustin Hibbits     if (!p_FmPcdModifyCcKeyAdditionalParams)
35040aeed3e9SJustin Hibbits     {
3505852ba100SJustin Hibbits         XX_Free(p_KeyAndNextEngineParams);
3506852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Allocation of internal data structure FAILED"));
3507852ba100SJustin Hibbits         return NULL;
35080aeed3e9SJustin Hibbits     }
3509852ba100SJustin Hibbits     memset(p_FmPcdModifyCcKeyAdditionalParams, 0,
3510852ba100SJustin Hibbits            sizeof(t_FmPcdModifyCcKeyAdditionalParams));
35110aeed3e9SJustin Hibbits 
35120aeed3e9SJustin Hibbits     p_FmPcdModifyCcKeyAdditionalParams->h_CurrentNode = h_FmPcdCcNodeOrTree;
3513852ba100SJustin Hibbits     p_FmPcdModifyCcKeyAdditionalParams->savedKeyIndex = keyIndex;
35140aeed3e9SJustin Hibbits 
35150aeed3e9SJustin Hibbits     while (i < numOfKeys)
35160aeed3e9SJustin Hibbits     {
35170aeed3e9SJustin Hibbits         if ((j == keyIndex) && !wasUpdate)
35180aeed3e9SJustin Hibbits         {
35190aeed3e9SJustin Hibbits             if (modifyState == e_MODIFY_STATE_ADD)
35200aeed3e9SJustin Hibbits                 j++;
3521852ba100SJustin Hibbits             else
3522852ba100SJustin Hibbits                 if (modifyState == e_MODIFY_STATE_REMOVE)
35230aeed3e9SJustin Hibbits                     i++;
35240aeed3e9SJustin Hibbits             wasUpdate = TRUE;
35250aeed3e9SJustin Hibbits         }
35260aeed3e9SJustin Hibbits         else
35270aeed3e9SJustin Hibbits         {
3528852ba100SJustin Hibbits             memcpy(&p_FmPcdModifyCcKeyAdditionalParams->keyAndNextEngineParams[j],
3529852ba100SJustin Hibbits                    p_KeyAndNextEngineParams + i,
3530852ba100SJustin Hibbits                    sizeof(t_FmPcdCcKeyAndNextEngineParams));
35310aeed3e9SJustin Hibbits             i++;
35320aeed3e9SJustin Hibbits             j++;
35330aeed3e9SJustin Hibbits         }
35340aeed3e9SJustin Hibbits     }
35350aeed3e9SJustin Hibbits 
35360aeed3e9SJustin Hibbits     if (keyIndex == numOfKeys)
35370aeed3e9SJustin Hibbits     {
35380aeed3e9SJustin Hibbits         if (modifyState == e_MODIFY_STATE_ADD)
35390aeed3e9SJustin Hibbits             j++;
35400aeed3e9SJustin Hibbits     }
35410aeed3e9SJustin Hibbits 
3542852ba100SJustin Hibbits     memcpy(&p_FmPcdModifyCcKeyAdditionalParams->keyAndNextEngineParams[j],
3543852ba100SJustin Hibbits            p_KeyAndNextEngineParams + numOfKeys,
3544852ba100SJustin Hibbits            sizeof(t_FmPcdCcKeyAndNextEngineParams));
35450aeed3e9SJustin Hibbits 
3546852ba100SJustin Hibbits     XX_Free(p_KeyAndNextEngineParams);
35470aeed3e9SJustin Hibbits 
3548852ba100SJustin Hibbits     return p_FmPcdModifyCcKeyAdditionalParams;
35490aeed3e9SJustin Hibbits }
35500aeed3e9SJustin Hibbits 
UpdatePtrWhichPointOnCrntMdfNode(t_FmPcdCcNode * p_CcNode,t_FmPcdModifyCcKeyAdditionalParams * p_FmPcdModifyCcKeyAdditionalParams,t_List * h_OldLst,t_List * h_NewLst)3551852ba100SJustin Hibbits static t_Error UpdatePtrWhichPointOnCrntMdfNode(
3552852ba100SJustin Hibbits         t_FmPcdCcNode *p_CcNode,
3553852ba100SJustin Hibbits         t_FmPcdModifyCcKeyAdditionalParams *p_FmPcdModifyCcKeyAdditionalParams,
3554852ba100SJustin Hibbits         t_List *h_OldLst, t_List *h_NewLst)
35550aeed3e9SJustin Hibbits {
3556852ba100SJustin Hibbits     t_FmPcdCcNextEngineParams *p_NextEngineParams = NULL;
3557852ba100SJustin Hibbits     t_CcNodeInformation ccNodeInfo = { 0 };
3558852ba100SJustin Hibbits     t_Handle h_NewAd;
3559852ba100SJustin Hibbits     t_Handle h_OrigAd = NULL;
35600aeed3e9SJustin Hibbits 
3561852ba100SJustin Hibbits     /* Building a list of all action descriptors that point to the previous node */
3562852ba100SJustin Hibbits     if (!NCSW_LIST_IsEmpty(&p_CcNode->ccPrevNodesLst))
3563852ba100SJustin Hibbits         UpdateAdPtrOfNodesWhichPointsOnCrntMdfNode(p_CcNode, h_OldLst,
3564852ba100SJustin Hibbits                                                    &p_NextEngineParams);
35650aeed3e9SJustin Hibbits 
3566852ba100SJustin Hibbits     if (!NCSW_LIST_IsEmpty(&p_CcNode->ccTreeIdLst))
3567852ba100SJustin Hibbits         UpdateAdPtrOfTreesWhichPointsOnCrntMdfNode(p_CcNode, h_OldLst,
3568852ba100SJustin Hibbits                                                    &p_NextEngineParams);
3569852ba100SJustin Hibbits 
3570852ba100SJustin Hibbits     /* This node must be found as next engine of one of its previous nodes or trees*/
3571852ba100SJustin Hibbits     if (p_NextEngineParams)
3572852ba100SJustin Hibbits     {
3573852ba100SJustin Hibbits         /* Building a new action descriptor that points to the modified node */
3574852ba100SJustin Hibbits         h_NewAd = GetNewAd(p_CcNode, FALSE);
3575852ba100SJustin Hibbits         if (!h_NewAd)
3576852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_NO_MEMORY, NO_MSG);
3577852ba100SJustin Hibbits         MemSet8(h_NewAd, 0, FM_PCD_CC_AD_ENTRY_SIZE);
3578852ba100SJustin Hibbits 
3579852ba100SJustin Hibbits         h_OrigAd = p_CcNode->h_Ad;
3580852ba100SJustin Hibbits         BuildNewAd(h_NewAd, p_FmPcdModifyCcKeyAdditionalParams, p_CcNode,
3581852ba100SJustin Hibbits                    p_NextEngineParams);
3582852ba100SJustin Hibbits 
3583852ba100SJustin Hibbits         ccNodeInfo.h_CcNode = h_NewAd;
3584852ba100SJustin Hibbits         EnqueueNodeInfoToRelevantLst(h_NewLst, &ccNodeInfo, NULL);
3585852ba100SJustin Hibbits 
3586852ba100SJustin Hibbits         if (p_NextEngineParams->h_Manip && !h_OrigAd)
3587852ba100SJustin Hibbits             FmPcdManipUpdateOwner(p_NextEngineParams->h_Manip, FALSE);
3588852ba100SJustin Hibbits     }
35890aeed3e9SJustin Hibbits     return E_OK;
35900aeed3e9SJustin Hibbits }
35910aeed3e9SJustin Hibbits 
UpdateCcRootOwner(t_FmPcdCcTree * p_FmPcdCcTree,bool add)3592852ba100SJustin Hibbits static void UpdateCcRootOwner(t_FmPcdCcTree *p_FmPcdCcTree, bool add)
35930aeed3e9SJustin Hibbits {
35940aeed3e9SJustin Hibbits     ASSERT_COND(p_FmPcdCcTree);
35950aeed3e9SJustin Hibbits 
3596852ba100SJustin Hibbits     /* this routine must be protected by the calling routine! */
3597852ba100SJustin Hibbits 
35980aeed3e9SJustin Hibbits     if (add)
35990aeed3e9SJustin Hibbits         p_FmPcdCcTree->owners++;
36000aeed3e9SJustin Hibbits     else
36010aeed3e9SJustin Hibbits     {
36020aeed3e9SJustin Hibbits         ASSERT_COND(p_FmPcdCcTree->owners);
36030aeed3e9SJustin Hibbits         p_FmPcdCcTree->owners--;
36040aeed3e9SJustin Hibbits     }
36050aeed3e9SJustin Hibbits }
36060aeed3e9SJustin Hibbits 
CheckAndSetManipParamsWithCcNodeParams(t_FmPcdCcNode * p_CcNode)3607852ba100SJustin Hibbits static t_Error CheckAndSetManipParamsWithCcNodeParams(t_FmPcdCcNode *p_CcNode)
36080aeed3e9SJustin Hibbits {
36090aeed3e9SJustin Hibbits     t_Error err = E_OK;
36100aeed3e9SJustin Hibbits     int i = 0;
36110aeed3e9SJustin Hibbits 
3612852ba100SJustin Hibbits     for (i = 0; i < p_CcNode->numOfKeys; i++)
36130aeed3e9SJustin Hibbits     {
3614852ba100SJustin Hibbits         if (p_CcNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip)
36150aeed3e9SJustin Hibbits         {
3616852ba100SJustin Hibbits             err =
3617852ba100SJustin Hibbits                     FmPcdManipCheckParamsWithCcNodeParams(
3618852ba100SJustin Hibbits                             p_CcNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip,
3619852ba100SJustin Hibbits                             (t_Handle)p_CcNode);
36200aeed3e9SJustin Hibbits             if (err)
36210aeed3e9SJustin Hibbits                 return err;
36220aeed3e9SJustin Hibbits         }
36230aeed3e9SJustin Hibbits     }
36240aeed3e9SJustin Hibbits 
36250aeed3e9SJustin Hibbits     return err;
36260aeed3e9SJustin Hibbits }
ValidateAndCalcStatsParams(t_FmPcdCcNode * p_CcNode,t_FmPcdCcNodeParams * p_CcNodeParam,uint32_t * p_NumOfRanges,uint32_t * p_CountersArraySize)3627852ba100SJustin Hibbits static t_Error ValidateAndCalcStatsParams(t_FmPcdCcNode *p_CcNode,
3628852ba100SJustin Hibbits                                           t_FmPcdCcNodeParams *p_CcNodeParam,
3629852ba100SJustin Hibbits                                           uint32_t *p_NumOfRanges,
3630852ba100SJustin Hibbits                                           uint32_t *p_CountersArraySize)
36310aeed3e9SJustin Hibbits {
3632852ba100SJustin Hibbits     e_FmPcdCcStatsMode statisticsMode = p_CcNode->statisticsMode;
3633852ba100SJustin Hibbits     uint32_t i;
36340aeed3e9SJustin Hibbits 
3635852ba100SJustin Hibbits     UNUSED(p_CcNodeParam);
3636852ba100SJustin Hibbits 
3637852ba100SJustin Hibbits     switch (statisticsMode)
3638852ba100SJustin Hibbits     {
3639852ba100SJustin Hibbits         case e_FM_PCD_CC_STATS_MODE_NONE:
3640852ba100SJustin Hibbits             for (i = 0; i < p_CcNode->numOfKeys; i++)
3641852ba100SJustin Hibbits                 if (p_CcNodeParam->keysParams.keyParams[i].ccNextEngineParams.statisticsEn)
3642852ba100SJustin Hibbits                     RETURN_ERROR(
3643852ba100SJustin Hibbits                             MAJOR,
3644852ba100SJustin Hibbits                             E_INVALID_VALUE,
3645852ba100SJustin Hibbits                             ("Statistics cannot be enabled for key %d when statistics mode was set to 'NONE'", i));
3646852ba100SJustin Hibbits             return E_OK;
3647852ba100SJustin Hibbits 
3648852ba100SJustin Hibbits         case e_FM_PCD_CC_STATS_MODE_FRAME:
3649852ba100SJustin Hibbits         case e_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME:
3650852ba100SJustin Hibbits             *p_NumOfRanges = 1;
3651852ba100SJustin Hibbits             *p_CountersArraySize = 2 * FM_PCD_CC_STATS_COUNTER_SIZE;
3652852ba100SJustin Hibbits             return E_OK;
3653852ba100SJustin Hibbits 
3654852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
3655852ba100SJustin Hibbits         case e_FM_PCD_CC_STATS_MODE_RMON:
3656852ba100SJustin Hibbits         {
3657852ba100SJustin Hibbits             uint16_t *p_FrameLengthRanges =
3658852ba100SJustin Hibbits                     p_CcNodeParam->keysParams.frameLengthRanges;
3659852ba100SJustin Hibbits             uint32_t i;
3660852ba100SJustin Hibbits 
3661852ba100SJustin Hibbits             if (p_FrameLengthRanges[0] <= 0)
3662852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Statistics mode"));
3663852ba100SJustin Hibbits 
3664852ba100SJustin Hibbits             if (p_FrameLengthRanges[0] == 0xFFFF)
3665852ba100SJustin Hibbits             {
3666852ba100SJustin Hibbits                 *p_NumOfRanges = 1;
3667852ba100SJustin Hibbits                 *p_CountersArraySize = 2 * FM_PCD_CC_STATS_COUNTER_SIZE;
3668852ba100SJustin Hibbits                 return E_OK;
36690aeed3e9SJustin Hibbits             }
36700aeed3e9SJustin Hibbits 
3671852ba100SJustin Hibbits             for (i = 1; i < FM_PCD_CC_STATS_MAX_NUM_OF_FLR; i++)
3672852ba100SJustin Hibbits             {
3673852ba100SJustin Hibbits                 if (p_FrameLengthRanges[i - 1] >= p_FrameLengthRanges[i])
3674852ba100SJustin Hibbits                     RETURN_ERROR(
3675852ba100SJustin Hibbits                             MAJOR,
3676852ba100SJustin Hibbits                             E_INVALID_VALUE,
3677852ba100SJustin Hibbits                             ("Frame length range must be larger at least by 1 from preceding range"));
3678852ba100SJustin Hibbits 
3679852ba100SJustin Hibbits                 /* Stop when last range is reached */
3680852ba100SJustin Hibbits                 if (p_FrameLengthRanges[i] == 0xFFFF)
3681852ba100SJustin Hibbits                     break;
3682852ba100SJustin Hibbits             }
3683852ba100SJustin Hibbits 
3684852ba100SJustin Hibbits             if ((i >= FM_PCD_CC_STATS_MAX_NUM_OF_FLR)
3685852ba100SJustin Hibbits                     || (p_FrameLengthRanges[i] != 0xFFFF))
3686852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, E_INVALID_VALUE,
3687852ba100SJustin Hibbits                              ("Last Frame length range must be 0xFFFF"));
3688852ba100SJustin Hibbits 
3689852ba100SJustin Hibbits             *p_NumOfRanges = i + 1;
3690852ba100SJustin Hibbits 
3691852ba100SJustin Hibbits             /* Allocate an extra counter for byte count, as counters
3692852ba100SJustin Hibbits              array always begins with byte count */
3693852ba100SJustin Hibbits             *p_CountersArraySize = (*p_NumOfRanges + 1)
3694852ba100SJustin Hibbits                     * FM_PCD_CC_STATS_COUNTER_SIZE;
3695852ba100SJustin Hibbits 
3696852ba100SJustin Hibbits         }
3697852ba100SJustin Hibbits             return E_OK;
3698852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
3699852ba100SJustin Hibbits 
3700852ba100SJustin Hibbits         default:
3701852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Statistics mode"));
3702852ba100SJustin Hibbits     }
3703852ba100SJustin Hibbits }
3704852ba100SJustin Hibbits 
CheckParams(t_Handle h_FmPcd,t_FmPcdCcNodeParams * p_CcNodeParam,t_FmPcdCcNode * p_CcNode,bool * isKeyTblAlloc)3705852ba100SJustin Hibbits static t_Error CheckParams(t_Handle h_FmPcd, t_FmPcdCcNodeParams *p_CcNodeParam,
3706852ba100SJustin Hibbits                            t_FmPcdCcNode *p_CcNode, bool *isKeyTblAlloc)
37070aeed3e9SJustin Hibbits {
37080aeed3e9SJustin Hibbits     int tmp = 0;
37090aeed3e9SJustin Hibbits     t_FmPcdCcKeyParams *p_KeyParams;
37100aeed3e9SJustin Hibbits     t_Error err;
37110aeed3e9SJustin Hibbits     uint32_t requiredAction = 0;
37120aeed3e9SJustin Hibbits 
3713852ba100SJustin Hibbits     /* Validate statistics parameters */
3714852ba100SJustin Hibbits     err = ValidateAndCalcStatsParams(p_CcNode, p_CcNodeParam,
3715852ba100SJustin Hibbits                                      &(p_CcNode->numOfStatsFLRs),
3716852ba100SJustin Hibbits                                      &(p_CcNode->countersArraySize));
37170aeed3e9SJustin Hibbits     if (err)
3718852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, ("Invalid statistics parameters"));
37190aeed3e9SJustin Hibbits 
3720852ba100SJustin Hibbits     /* Validate next engine parameters on Miss */
3721852ba100SJustin Hibbits     err = ValidateNextEngineParams(
3722852ba100SJustin Hibbits             h_FmPcd, &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
3723852ba100SJustin Hibbits             p_CcNode->statisticsMode);
3724852ba100SJustin Hibbits     if (err)
3725852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err,
3726852ba100SJustin Hibbits                      ("For this node MissNextEngineParams are not valid"));
3727852ba100SJustin Hibbits 
37280aeed3e9SJustin Hibbits     if (p_CcNodeParam->keysParams.ccNextEngineParamsForMiss.h_Manip)
37290aeed3e9SJustin Hibbits     {
3730852ba100SJustin Hibbits         err = FmPcdManipCheckParamsForCcNextEngine(
3731852ba100SJustin Hibbits                 &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
3732852ba100SJustin Hibbits                 &requiredAction);
37330aeed3e9SJustin Hibbits         if (err)
37340aeed3e9SJustin Hibbits             RETURN_ERROR(MAJOR, err, (NO_MSG));
37350aeed3e9SJustin Hibbits     }
37360aeed3e9SJustin Hibbits 
3737852ba100SJustin Hibbits     memcpy(&p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams,
3738852ba100SJustin Hibbits            &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
3739852ba100SJustin Hibbits            sizeof(t_FmPcdCcNextEngineParams));
37400aeed3e9SJustin Hibbits 
3741852ba100SJustin Hibbits     p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].requiredAction =
3742852ba100SJustin Hibbits             requiredAction;
3743852ba100SJustin Hibbits 
3744852ba100SJustin Hibbits     if ((p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.nextEngine
3745852ba100SJustin Hibbits             == e_FM_PCD_CC)
3746852ba100SJustin Hibbits             && p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.h_Manip)
3747852ba100SJustin Hibbits     {
3748852ba100SJustin Hibbits         err =
3749852ba100SJustin Hibbits                 AllocAndFillAdForContLookupManip(
3750852ba100SJustin Hibbits                         p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.params.ccParams.h_CcNode);
3751852ba100SJustin Hibbits         if (err)
3752852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, err, (NO_MSG));
3753852ba100SJustin Hibbits     }
3754852ba100SJustin Hibbits 
3755852ba100SJustin Hibbits     for (tmp = 0; tmp < p_CcNode->numOfKeys; tmp++)
37560aeed3e9SJustin Hibbits     {
37570aeed3e9SJustin Hibbits         p_KeyParams = &p_CcNodeParam->keysParams.keyParams[tmp];
37580aeed3e9SJustin Hibbits 
37590aeed3e9SJustin Hibbits         if (!p_KeyParams->p_Key)
37600aeed3e9SJustin Hibbits             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("p_Key is not initialized"));
37610aeed3e9SJustin Hibbits 
3762852ba100SJustin Hibbits         err = ValidateNextEngineParams(h_FmPcd,
3763852ba100SJustin Hibbits                                        &p_KeyParams->ccNextEngineParams,
3764852ba100SJustin Hibbits                                        p_CcNode->statisticsMode);
37650aeed3e9SJustin Hibbits         if (err)
37660aeed3e9SJustin Hibbits             RETURN_ERROR(MAJOR, err, (NO_MSG));
37670aeed3e9SJustin Hibbits 
3768852ba100SJustin Hibbits         err = UpdateGblMask(p_CcNode, p_CcNodeParam->keysParams.keySize,
37690aeed3e9SJustin Hibbits                             p_KeyParams->p_Mask);
3770852ba100SJustin Hibbits         if (err)
3771852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, err, (NO_MSG));
37720aeed3e9SJustin Hibbits 
37730aeed3e9SJustin Hibbits         if (p_KeyParams->ccNextEngineParams.h_Manip)
37740aeed3e9SJustin Hibbits         {
3775852ba100SJustin Hibbits             err = FmPcdManipCheckParamsForCcNextEngine(
3776852ba100SJustin Hibbits                     &p_KeyParams->ccNextEngineParams, &requiredAction);
37770aeed3e9SJustin Hibbits             if (err)
37780aeed3e9SJustin Hibbits                 RETURN_ERROR(MAJOR, err, (NO_MSG));
37790aeed3e9SJustin Hibbits         }
37800aeed3e9SJustin Hibbits 
3781852ba100SJustin Hibbits         /* Store 'key' parameters - key, mask (if passed by the user) */
3782852ba100SJustin Hibbits         memcpy(p_CcNode->keyAndNextEngineParams[tmp].key, p_KeyParams->p_Key,
3783852ba100SJustin Hibbits                p_CcNodeParam->keysParams.keySize);
3784852ba100SJustin Hibbits 
3785852ba100SJustin Hibbits         if (p_KeyParams->p_Mask)
3786852ba100SJustin Hibbits             memcpy(p_CcNode->keyAndNextEngineParams[tmp].mask,
3787852ba100SJustin Hibbits                    p_KeyParams->p_Mask, p_CcNodeParam->keysParams.keySize);
3788852ba100SJustin Hibbits         else
3789852ba100SJustin Hibbits             memset((void *)(p_CcNode->keyAndNextEngineParams[tmp].mask), 0xFF,
3790852ba100SJustin Hibbits                    p_CcNodeParam->keysParams.keySize);
3791852ba100SJustin Hibbits 
3792852ba100SJustin Hibbits         /* Store next engine parameters */
3793852ba100SJustin Hibbits         memcpy(&p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams,
3794852ba100SJustin Hibbits                &p_KeyParams->ccNextEngineParams,
3795852ba100SJustin Hibbits                sizeof(t_FmPcdCcNextEngineParams));
3796852ba100SJustin Hibbits 
3797852ba100SJustin Hibbits         p_CcNode->keyAndNextEngineParams[tmp].requiredAction = requiredAction;
3798852ba100SJustin Hibbits 
3799852ba100SJustin Hibbits         if ((p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.nextEngine
3800852ba100SJustin Hibbits                 == e_FM_PCD_CC)
3801852ba100SJustin Hibbits                 && p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.h_Manip)
3802852ba100SJustin Hibbits         {
3803852ba100SJustin Hibbits             err =
3804852ba100SJustin Hibbits                     AllocAndFillAdForContLookupManip(
3805852ba100SJustin Hibbits                             p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.params.ccParams.h_CcNode);
3806852ba100SJustin Hibbits             if (err)
3807852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, err, (NO_MSG));
3808852ba100SJustin Hibbits         }
3809852ba100SJustin Hibbits     }
3810852ba100SJustin Hibbits 
3811852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
3812852ba100SJustin Hibbits     {
3813852ba100SJustin Hibbits         if (p_CcNode->maxNumOfKeys < p_CcNode->numOfKeys)
3814852ba100SJustin Hibbits             RETURN_ERROR(
3815852ba100SJustin Hibbits                     MAJOR,
3816852ba100SJustin Hibbits                     E_INVALID_VALUE,
3817852ba100SJustin Hibbits                     ("Number of keys exceed the provided maximal number of keys"));
38180aeed3e9SJustin Hibbits     }
38190aeed3e9SJustin Hibbits 
38200aeed3e9SJustin Hibbits     *isKeyTblAlloc = TRUE;
3821852ba100SJustin Hibbits 
38220aeed3e9SJustin Hibbits     return E_OK;
38230aeed3e9SJustin Hibbits }
38240aeed3e9SJustin Hibbits 
Ipv4TtlOrIpv6HopLimitCheckParams(t_Handle h_FmPcd,t_FmPcdCcNodeParams * p_CcNodeParam,t_FmPcdCcNode * p_CcNode,bool * isKeyTblAlloc)3825852ba100SJustin Hibbits static t_Error Ipv4TtlOrIpv6HopLimitCheckParams(
3826852ba100SJustin Hibbits         t_Handle h_FmPcd, t_FmPcdCcNodeParams *p_CcNodeParam,
3827852ba100SJustin Hibbits         t_FmPcdCcNode *p_CcNode, bool *isKeyTblAlloc)
38280aeed3e9SJustin Hibbits {
38290aeed3e9SJustin Hibbits     int tmp = 0;
38300aeed3e9SJustin Hibbits     t_FmPcdCcKeyParams *p_KeyParams;
38310aeed3e9SJustin Hibbits     t_Error err;
38320aeed3e9SJustin Hibbits     uint8_t key = 0x01;
38330aeed3e9SJustin Hibbits     uint32_t requiredAction = 0;
38340aeed3e9SJustin Hibbits 
3835852ba100SJustin Hibbits     if (p_CcNode->numOfKeys != 1)
3836852ba100SJustin Hibbits         RETURN_ERROR(
3837852ba100SJustin Hibbits                 MAJOR,
3838852ba100SJustin Hibbits                 E_INVALID_VALUE,
3839852ba100SJustin Hibbits                 ("For node of the type IPV4_TTL or IPV6_HOP_LIMIT the maximal supported 'numOfKeys' is 1"));
38400aeed3e9SJustin Hibbits 
3841852ba100SJustin Hibbits     if ((p_CcNodeParam->keysParams.maxNumOfKeys)
3842852ba100SJustin Hibbits             && (p_CcNodeParam->keysParams.maxNumOfKeys != 1))
3843852ba100SJustin Hibbits         RETURN_ERROR(
3844852ba100SJustin Hibbits                 MAJOR,
3845852ba100SJustin Hibbits                 E_INVALID_VALUE,
3846852ba100SJustin Hibbits                 ("For node of the type IPV4_TTL or IPV6_HOP_LIMIT the maximal supported 'maxNumOfKeys' is 1"));
3847852ba100SJustin Hibbits 
3848852ba100SJustin Hibbits     /* Validate statistics parameters */
3849852ba100SJustin Hibbits     err = ValidateAndCalcStatsParams(p_CcNode, p_CcNodeParam,
3850852ba100SJustin Hibbits                                      &(p_CcNode->numOfStatsFLRs),
3851852ba100SJustin Hibbits                                      &(p_CcNode->countersArraySize));
38520aeed3e9SJustin Hibbits     if (err)
3853852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, ("Invalid statistics parameters"));
38540aeed3e9SJustin Hibbits 
3855852ba100SJustin Hibbits     err = ValidateNextEngineParams(
3856852ba100SJustin Hibbits             h_FmPcd, &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
3857852ba100SJustin Hibbits             p_CcNodeParam->keysParams.statisticsMode);
3858852ba100SJustin Hibbits     if (err)
3859852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err,
3860852ba100SJustin Hibbits                      ("For this node MissNextEngineParams are not valid"));
3861852ba100SJustin Hibbits 
38620aeed3e9SJustin Hibbits     if (p_CcNodeParam->keysParams.ccNextEngineParamsForMiss.h_Manip)
38630aeed3e9SJustin Hibbits     {
3864852ba100SJustin Hibbits         err = FmPcdManipCheckParamsForCcNextEngine(
3865852ba100SJustin Hibbits                 &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
3866852ba100SJustin Hibbits                 &requiredAction);
38670aeed3e9SJustin Hibbits         if (err)
38680aeed3e9SJustin Hibbits             RETURN_ERROR(MAJOR, err, (NO_MSG));
38690aeed3e9SJustin Hibbits     }
38700aeed3e9SJustin Hibbits 
3871852ba100SJustin Hibbits     memcpy(&p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams,
3872852ba100SJustin Hibbits            &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
3873852ba100SJustin Hibbits            sizeof(t_FmPcdCcNextEngineParams));
38740aeed3e9SJustin Hibbits 
3875852ba100SJustin Hibbits     p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].requiredAction =
3876852ba100SJustin Hibbits             requiredAction;
3877852ba100SJustin Hibbits 
3878852ba100SJustin Hibbits     if ((p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.nextEngine
3879852ba100SJustin Hibbits             == e_FM_PCD_CC)
3880852ba100SJustin Hibbits             && p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.h_Manip)
3881852ba100SJustin Hibbits     {
3882852ba100SJustin Hibbits         err =
3883852ba100SJustin Hibbits                 AllocAndFillAdForContLookupManip(
3884852ba100SJustin Hibbits                         p_CcNode->keyAndNextEngineParams[p_CcNode->numOfKeys].nextEngineParams.params.ccParams.h_CcNode);
3885852ba100SJustin Hibbits         if (err)
3886852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, err, (NO_MSG));
3887852ba100SJustin Hibbits     }
3888852ba100SJustin Hibbits 
3889852ba100SJustin Hibbits     for (tmp = 0; tmp < p_CcNode->numOfKeys; tmp++)
38900aeed3e9SJustin Hibbits     {
38910aeed3e9SJustin Hibbits         p_KeyParams = &p_CcNodeParam->keysParams.keyParams[tmp];
3892852ba100SJustin Hibbits 
38930aeed3e9SJustin Hibbits         if (p_KeyParams->p_Mask)
3894852ba100SJustin Hibbits             RETURN_ERROR(
3895852ba100SJustin Hibbits                     MAJOR,
3896852ba100SJustin Hibbits                     E_INVALID_VALUE,
3897852ba100SJustin Hibbits                     ("For node of the type IPV4_TTL or IPV6_HOP_LIMIT p_Mask can not be initialized"));
3898852ba100SJustin Hibbits 
38990aeed3e9SJustin Hibbits         if (memcmp(p_KeyParams->p_Key, &key, 1) != 0)
3900852ba100SJustin Hibbits             RETURN_ERROR(
3901852ba100SJustin Hibbits                     MAJOR,
3902852ba100SJustin Hibbits                     E_INVALID_VALUE,
3903852ba100SJustin Hibbits                     ("For node of the type IPV4_TTL or IPV6_HOP_LIMIT p_Key has to be 1"));
3904852ba100SJustin Hibbits 
3905852ba100SJustin Hibbits         err = ValidateNextEngineParams(h_FmPcd,
3906852ba100SJustin Hibbits                                        &p_KeyParams->ccNextEngineParams,
3907852ba100SJustin Hibbits                                        p_CcNode->statisticsMode);
39080aeed3e9SJustin Hibbits         if (err)
39090aeed3e9SJustin Hibbits             RETURN_ERROR(MAJOR, err, (NO_MSG));
39100aeed3e9SJustin Hibbits 
39110aeed3e9SJustin Hibbits         if (p_KeyParams->ccNextEngineParams.h_Manip)
39120aeed3e9SJustin Hibbits         {
3913852ba100SJustin Hibbits             err = FmPcdManipCheckParamsForCcNextEngine(
3914852ba100SJustin Hibbits                     &p_KeyParams->ccNextEngineParams, &requiredAction);
39150aeed3e9SJustin Hibbits             if (err)
39160aeed3e9SJustin Hibbits                 RETURN_ERROR(MAJOR, err, (NO_MSG));
39170aeed3e9SJustin Hibbits         }
39180aeed3e9SJustin Hibbits 
3919852ba100SJustin Hibbits         /* Store 'key' parameters - key (fixed to 0x01), key size of 1 byte and full mask */
3920852ba100SJustin Hibbits         p_CcNode->keyAndNextEngineParams[tmp].key[0] = key;
3921852ba100SJustin Hibbits         p_CcNode->keyAndNextEngineParams[tmp].mask[0] = 0xFF;
3922852ba100SJustin Hibbits 
3923852ba100SJustin Hibbits         /* Store NextEngine parameters */
3924852ba100SJustin Hibbits         memcpy(&p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams,
3925852ba100SJustin Hibbits                &p_KeyParams->ccNextEngineParams,
3926852ba100SJustin Hibbits                sizeof(t_FmPcdCcNextEngineParams));
3927852ba100SJustin Hibbits 
3928852ba100SJustin Hibbits         if ((p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.nextEngine
3929852ba100SJustin Hibbits                 == e_FM_PCD_CC)
3930852ba100SJustin Hibbits                 && p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.h_Manip)
3931852ba100SJustin Hibbits         {
3932852ba100SJustin Hibbits             err =
3933852ba100SJustin Hibbits                     AllocAndFillAdForContLookupManip(
3934852ba100SJustin Hibbits                             p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.params.ccParams.h_CcNode);
3935852ba100SJustin Hibbits             if (err)
3936852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, err, (NO_MSG));
3937852ba100SJustin Hibbits         }
3938852ba100SJustin Hibbits         p_CcNode->keyAndNextEngineParams[tmp].requiredAction = requiredAction;
39390aeed3e9SJustin Hibbits     }
39400aeed3e9SJustin Hibbits 
39410aeed3e9SJustin Hibbits     *isKeyTblAlloc = FALSE;
3942852ba100SJustin Hibbits 
39430aeed3e9SJustin Hibbits     return E_OK;
39440aeed3e9SJustin Hibbits }
39450aeed3e9SJustin Hibbits 
IcHashIndexedCheckParams(t_Handle h_FmPcd,t_FmPcdCcNodeParams * p_CcNodeParam,t_FmPcdCcNode * p_CcNode,bool * isKeyTblAlloc)39460aeed3e9SJustin Hibbits static t_Error IcHashIndexedCheckParams(t_Handle h_FmPcd,
39470aeed3e9SJustin Hibbits                                         t_FmPcdCcNodeParams *p_CcNodeParam,
3948852ba100SJustin Hibbits                                         t_FmPcdCcNode *p_CcNode,
39490aeed3e9SJustin Hibbits                                         bool *isKeyTblAlloc)
39500aeed3e9SJustin Hibbits {
39510aeed3e9SJustin Hibbits     int tmp = 0, countOnes = 0;
39520aeed3e9SJustin Hibbits     t_FmPcdCcKeyParams *p_KeyParams;
39530aeed3e9SJustin Hibbits     t_Error err;
39540aeed3e9SJustin Hibbits     uint16_t glblMask = p_CcNodeParam->extractCcParams.extractNonHdr.icIndxMask;
39550aeed3e9SJustin Hibbits     uint16_t countMask = (uint16_t)(glblMask >> 4);
3956852ba100SJustin Hibbits     uint32_t requiredAction = 0;
39570aeed3e9SJustin Hibbits 
39580aeed3e9SJustin Hibbits     if (glblMask & 0x000f)
3959852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE,
3960852ba100SJustin Hibbits                      ("icIndxMask has to be with last nibble 0"));
39610aeed3e9SJustin Hibbits 
39620aeed3e9SJustin Hibbits     while (countMask)
39630aeed3e9SJustin Hibbits     {
39640aeed3e9SJustin Hibbits         countOnes++;
39650aeed3e9SJustin Hibbits         countMask = (uint16_t)(countMask >> 1);
39660aeed3e9SJustin Hibbits     }
39670aeed3e9SJustin Hibbits 
3968852ba100SJustin Hibbits     if (!POWER_OF_2(p_CcNode->numOfKeys))
3969852ba100SJustin Hibbits         RETURN_ERROR(
3970852ba100SJustin Hibbits                 MAJOR,
3971852ba100SJustin Hibbits                 E_INVALID_VALUE,
3972852ba100SJustin Hibbits                 ("For Node of the type INDEXED numOfKeys has to be powerOfTwo"));
39730aeed3e9SJustin Hibbits 
3974852ba100SJustin Hibbits     if (p_CcNode->numOfKeys != ((uint32_t)1 << countOnes))
3975852ba100SJustin Hibbits         RETURN_ERROR(
3976852ba100SJustin Hibbits                 MAJOR,
3977852ba100SJustin Hibbits                 E_INVALID_VALUE,
3978852ba100SJustin Hibbits                 ("For Node of the type IC_HASH_INDEXED numOfKeys has to be powerOfTwo"));
3979852ba100SJustin Hibbits 
3980852ba100SJustin Hibbits     if (p_CcNodeParam->keysParams.maxNumOfKeys
3981852ba100SJustin Hibbits             && (p_CcNodeParam->keysParams.maxNumOfKeys != p_CcNode->numOfKeys))
3982852ba100SJustin Hibbits         RETURN_ERROR(
3983852ba100SJustin Hibbits                 MAJOR,
3984852ba100SJustin Hibbits                 E_INVALID_VALUE,
3985852ba100SJustin Hibbits                 ("For Node of the type INDEXED 'maxNumOfKeys' should be 0 or equal 'numOfKeys'"));
3986852ba100SJustin Hibbits 
3987852ba100SJustin Hibbits     /* Validate statistics parameters */
3988852ba100SJustin Hibbits     err = ValidateAndCalcStatsParams(p_CcNode, p_CcNodeParam,
3989852ba100SJustin Hibbits                                      &(p_CcNode->numOfStatsFLRs),
3990852ba100SJustin Hibbits                                      &(p_CcNode->countersArraySize));
3991852ba100SJustin Hibbits     if (err)
3992852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, ("Invalid statistics parameters"));
3993852ba100SJustin Hibbits 
3994852ba100SJustin Hibbits     err = ValidateNextEngineParams(
3995852ba100SJustin Hibbits             h_FmPcd, &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
3996852ba100SJustin Hibbits             p_CcNode->statisticsMode);
39970aeed3e9SJustin Hibbits     if (GET_ERROR_TYPE(err) != E_NOT_SUPPORTED)
3998852ba100SJustin Hibbits         RETURN_ERROR(
3999852ba100SJustin Hibbits                 MAJOR,
4000852ba100SJustin Hibbits                 err,
4001852ba100SJustin Hibbits                 ("MissNextEngineParams for the node of the type IC_INDEX_HASH has to be UnInitialized"));
40020aeed3e9SJustin Hibbits 
4003852ba100SJustin Hibbits     for (tmp = 0; tmp < p_CcNode->numOfKeys; tmp++)
40040aeed3e9SJustin Hibbits     {
40050aeed3e9SJustin Hibbits         p_KeyParams = &p_CcNodeParam->keysParams.keyParams[tmp];
4006852ba100SJustin Hibbits 
40070aeed3e9SJustin Hibbits         if (p_KeyParams->p_Mask || p_KeyParams->p_Key)
4008852ba100SJustin Hibbits             RETURN_ERROR(
4009852ba100SJustin Hibbits                     MAJOR,
4010852ba100SJustin Hibbits                     E_INVALID_VALUE,
4011852ba100SJustin Hibbits                     ("For Node of the type IC_HASH_INDEXED p_Key or p_Mask has to be NULL"));
40120aeed3e9SJustin Hibbits 
40130aeed3e9SJustin Hibbits         if ((glblMask & (tmp * 16)) == (tmp * 16))
40140aeed3e9SJustin Hibbits         {
4015852ba100SJustin Hibbits             err = ValidateNextEngineParams(h_FmPcd,
4016852ba100SJustin Hibbits                                            &p_KeyParams->ccNextEngineParams,
4017852ba100SJustin Hibbits                                            p_CcNode->statisticsMode);
40180aeed3e9SJustin Hibbits             if (err)
4019852ba100SJustin Hibbits                 RETURN_ERROR(
4020852ba100SJustin Hibbits                         MAJOR,
4021852ba100SJustin Hibbits                         err,
4022852ba100SJustin Hibbits                         ("This index has to be initialized for the node of the type IC_INDEX_HASH according to settings of GlobalMask "));
40230aeed3e9SJustin Hibbits 
40240aeed3e9SJustin Hibbits             if (p_KeyParams->ccNextEngineParams.h_Manip)
40250aeed3e9SJustin Hibbits             {
4026852ba100SJustin Hibbits                 err = FmPcdManipCheckParamsForCcNextEngine(
4027852ba100SJustin Hibbits                         &p_KeyParams->ccNextEngineParams, &requiredAction);
4028852ba100SJustin Hibbits                 if (err)
4029852ba100SJustin Hibbits                     RETURN_ERROR(MAJOR, err, (NO_MSG));
4030852ba100SJustin Hibbits                 p_CcNode->keyAndNextEngineParams[tmp].requiredAction =
4031852ba100SJustin Hibbits                         requiredAction;
4032852ba100SJustin Hibbits             }
4033852ba100SJustin Hibbits 
4034852ba100SJustin Hibbits             memcpy(&p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams,
4035852ba100SJustin Hibbits                    &p_KeyParams->ccNextEngineParams,
4036852ba100SJustin Hibbits                    sizeof(t_FmPcdCcNextEngineParams));
4037852ba100SJustin Hibbits 
4038852ba100SJustin Hibbits             if ((p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.nextEngine
4039852ba100SJustin Hibbits                     == e_FM_PCD_CC)
4040852ba100SJustin Hibbits                     && p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.h_Manip)
4041852ba100SJustin Hibbits             {
4042852ba100SJustin Hibbits                 err =
4043852ba100SJustin Hibbits                         AllocAndFillAdForContLookupManip(
4044852ba100SJustin Hibbits                                 p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.params.ccParams.h_CcNode);
40450aeed3e9SJustin Hibbits                 if (err)
40460aeed3e9SJustin Hibbits                     RETURN_ERROR(MAJOR, err, (NO_MSG));
40470aeed3e9SJustin Hibbits             }
40480aeed3e9SJustin Hibbits         }
40490aeed3e9SJustin Hibbits         else
40500aeed3e9SJustin Hibbits         {
4051852ba100SJustin Hibbits             err = ValidateNextEngineParams(h_FmPcd,
4052852ba100SJustin Hibbits                                            &p_KeyParams->ccNextEngineParams,
4053852ba100SJustin Hibbits                                            p_CcNode->statisticsMode);
40540aeed3e9SJustin Hibbits             if (GET_ERROR_TYPE(err) != E_NOT_SUPPORTED)
4055852ba100SJustin Hibbits                 RETURN_ERROR(
4056852ba100SJustin Hibbits                         MAJOR,
4057852ba100SJustin Hibbits                         err,
4058852ba100SJustin Hibbits                         ("This index has to be UnInitialized for the node of the type IC_INDEX_HASH according to settings of GlobalMask"));
40590aeed3e9SJustin Hibbits         }
40600aeed3e9SJustin Hibbits     }
4061852ba100SJustin Hibbits 
40620aeed3e9SJustin Hibbits     *isKeyTblAlloc = FALSE;
4063852ba100SJustin Hibbits     glblMask = htobe16(glblMask);
4064852ba100SJustin Hibbits     memcpy(PTR_MOVE(p_CcNode->p_GlblMask, 2), &glblMask, 2);
40650aeed3e9SJustin Hibbits 
40660aeed3e9SJustin Hibbits     return E_OK;
40670aeed3e9SJustin Hibbits }
40680aeed3e9SJustin Hibbits 
ModifyNextEngineParamNode(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode,uint16_t keyIndex,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams)4069852ba100SJustin Hibbits static t_Error ModifyNextEngineParamNode(
4070852ba100SJustin Hibbits         t_Handle h_FmPcd, t_Handle h_FmPcdCcNode, uint16_t keyIndex,
4071852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
4072852ba100SJustin Hibbits {
4073852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNode;
4074852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
4075852ba100SJustin Hibbits     t_List h_OldPointersLst, h_NewPointersLst;
4076852ba100SJustin Hibbits     t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
4077852ba100SJustin Hibbits     t_Error err = E_OK;
4078852ba100SJustin Hibbits 
4079852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_VALUE);
4080852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
4081852ba100SJustin Hibbits 
4082852ba100SJustin Hibbits     if (keyIndex >= p_CcNode->numOfKeys)
4083852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE,
4084852ba100SJustin Hibbits                      ("keyIndex > previously cleared last index + 1"));
4085852ba100SJustin Hibbits 
4086852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
4087852ba100SJustin Hibbits 
4088852ba100SJustin Hibbits     INIT_LIST(&h_OldPointersLst);
4089852ba100SJustin Hibbits     INIT_LIST(&h_NewPointersLst);
4090852ba100SJustin Hibbits 
4091852ba100SJustin Hibbits     p_ModifyKeyParams = ModifyNodeCommonPart(p_CcNode, keyIndex,
4092852ba100SJustin Hibbits                                              e_MODIFY_STATE_CHANGE, FALSE,
4093852ba100SJustin Hibbits                                              FALSE, FALSE);
4094852ba100SJustin Hibbits     if (!p_ModifyKeyParams)
4095852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
4096852ba100SJustin Hibbits 
4097852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys
4098852ba100SJustin Hibbits             && !TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
4099852ba100SJustin Hibbits     {
4100852ba100SJustin Hibbits         XX_Free(p_ModifyKeyParams);
4101852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
4102852ba100SJustin Hibbits     }
4103852ba100SJustin Hibbits 
4104852ba100SJustin Hibbits     err = BuildNewNodeModifyNextEngine(h_FmPcd, p_CcNode, keyIndex,
4105852ba100SJustin Hibbits                                        p_FmPcdCcNextEngineParams,
4106852ba100SJustin Hibbits                                        &h_OldPointersLst, &h_NewPointersLst,
4107852ba100SJustin Hibbits                                        p_ModifyKeyParams);
4108852ba100SJustin Hibbits     if (err)
4109852ba100SJustin Hibbits     {
4110852ba100SJustin Hibbits         XX_Free(p_ModifyKeyParams);
4111852ba100SJustin Hibbits         if (p_CcNode->maxNumOfKeys)
4112852ba100SJustin Hibbits             RELEASE_LOCK(p_FmPcd->shadowLock);
4113852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
4114852ba100SJustin Hibbits     }
4115852ba100SJustin Hibbits 
4116852ba100SJustin Hibbits     err = DoDynamicChange(p_FmPcd, &h_OldPointersLst, &h_NewPointersLst,
4117852ba100SJustin Hibbits                           p_ModifyKeyParams, FALSE);
4118852ba100SJustin Hibbits 
4119852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
4120852ba100SJustin Hibbits         RELEASE_LOCK(p_FmPcd->shadowLock);
4121852ba100SJustin Hibbits 
4122852ba100SJustin Hibbits     return err;
4123852ba100SJustin Hibbits }
4124852ba100SJustin Hibbits 
FindKeyIndex(t_Handle h_CcNode,uint8_t keySize,uint8_t * p_Key,uint8_t * p_Mask,uint16_t * p_KeyIndex)4125852ba100SJustin Hibbits static t_Error FindKeyIndex(t_Handle h_CcNode, uint8_t keySize, uint8_t *p_Key,
4126852ba100SJustin Hibbits                             uint8_t *p_Mask, uint16_t *p_KeyIndex)
4127852ba100SJustin Hibbits {
4128852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
4129852ba100SJustin Hibbits     uint8_t tmpMask[FM_PCD_MAX_SIZE_OF_KEY];
4130852ba100SJustin Hibbits     uint16_t i;
4131852ba100SJustin Hibbits 
4132852ba100SJustin Hibbits     ASSERT_COND(p_Key);
4133852ba100SJustin Hibbits     ASSERT_COND(p_KeyIndex);
4134852ba100SJustin Hibbits     ASSERT_COND(keySize < FM_PCD_MAX_SIZE_OF_KEY);
4135852ba100SJustin Hibbits 
4136852ba100SJustin Hibbits     if (keySize != p_CcNode->userSizeOfExtraction)
4137852ba100SJustin Hibbits         RETURN_ERROR(
4138852ba100SJustin Hibbits                 MINOR, E_INVALID_VALUE,
4139852ba100SJustin Hibbits                 ("Key size doesn't match the extraction size of the node"));
4140852ba100SJustin Hibbits 
4141852ba100SJustin Hibbits     /* If user didn't pass a mask for this key, we'll look for full extraction mask */
4142852ba100SJustin Hibbits     if (!p_Mask)
4143852ba100SJustin Hibbits         memset(tmpMask, 0xFF, keySize);
4144852ba100SJustin Hibbits 
4145852ba100SJustin Hibbits     for (i = 0; i < p_CcNode->numOfKeys; i++)
4146852ba100SJustin Hibbits     {
4147852ba100SJustin Hibbits         /* Comparing received key */
4148852ba100SJustin Hibbits         if (memcmp(p_Key, p_CcNode->keyAndNextEngineParams[i].key, keySize)
4149852ba100SJustin Hibbits                 == 0)
4150852ba100SJustin Hibbits         {
4151852ba100SJustin Hibbits             if (p_Mask)
4152852ba100SJustin Hibbits             {
4153852ba100SJustin Hibbits                 /* If a user passed a mask for this key, it must match to the existing key's mask for a correct match */
4154852ba100SJustin Hibbits                 if (memcmp(p_Mask, p_CcNode->keyAndNextEngineParams[i].mask,
4155852ba100SJustin Hibbits                            keySize) == 0)
4156852ba100SJustin Hibbits                 {
4157852ba100SJustin Hibbits                     *p_KeyIndex = i;
4158852ba100SJustin Hibbits                     return E_OK;
4159852ba100SJustin Hibbits                 }
4160852ba100SJustin Hibbits             }
4161852ba100SJustin Hibbits             else
4162852ba100SJustin Hibbits             {
4163852ba100SJustin Hibbits                 /* If user didn't pass a mask for this key, check if the existing key mask is full extraction */
4164852ba100SJustin Hibbits                 if (memcmp(tmpMask, p_CcNode->keyAndNextEngineParams[i].mask,
4165852ba100SJustin Hibbits                            keySize) == 0)
4166852ba100SJustin Hibbits                 {
4167852ba100SJustin Hibbits                     *p_KeyIndex = i;
4168852ba100SJustin Hibbits                     return E_OK;
4169852ba100SJustin Hibbits                 }
4170852ba100SJustin Hibbits             }
4171852ba100SJustin Hibbits         }
4172852ba100SJustin Hibbits     }
4173852ba100SJustin Hibbits 
4174852ba100SJustin Hibbits     return ERROR_CODE(E_NOT_FOUND);
4175852ba100SJustin Hibbits }
4176852ba100SJustin Hibbits 
CalcAndUpdateCcShadow(t_FmPcdCcNode * p_CcNode,bool isKeyTblAlloc,uint32_t * p_MatchTableSize,uint32_t * p_AdTableSize)4177852ba100SJustin Hibbits static t_Error CalcAndUpdateCcShadow(t_FmPcdCcNode *p_CcNode,
4178852ba100SJustin Hibbits                                      bool isKeyTblAlloc,
4179852ba100SJustin Hibbits                                      uint32_t *p_MatchTableSize,
4180852ba100SJustin Hibbits                                      uint32_t *p_AdTableSize)
4181852ba100SJustin Hibbits {
4182852ba100SJustin Hibbits     uint32_t shadowSize;
4183852ba100SJustin Hibbits     t_Error err;
4184852ba100SJustin Hibbits 
4185852ba100SJustin Hibbits     /* Calculate keys table maximal size - each entry consists of a key and a mask,
4186852ba100SJustin Hibbits      (if local mask support is requested) */
4187852ba100SJustin Hibbits     *p_MatchTableSize = p_CcNode->ccKeySizeAccExtraction * sizeof(uint8_t)
4188852ba100SJustin Hibbits             * p_CcNode->maxNumOfKeys;
4189852ba100SJustin Hibbits 
4190852ba100SJustin Hibbits     if (p_CcNode->maskSupport)
4191852ba100SJustin Hibbits         *p_MatchTableSize *= 2;
4192852ba100SJustin Hibbits 
4193852ba100SJustin Hibbits     /* Calculate next action descriptors table, including one more entry for miss */
4194852ba100SJustin Hibbits     *p_AdTableSize = (uint32_t)((p_CcNode->maxNumOfKeys + 1)
4195852ba100SJustin Hibbits             * FM_PCD_CC_AD_ENTRY_SIZE);
4196852ba100SJustin Hibbits 
4197852ba100SJustin Hibbits     /* Calculate maximal shadow size of this node.
4198852ba100SJustin Hibbits      All shadow structures will be used for runtime modifications host command. If
4199852ba100SJustin Hibbits      keys table was allocated for this node, the keys table and next engines table may
4200852ba100SJustin Hibbits      be modified in run time (entries added or removed), so shadow tables are requires.
4201852ba100SJustin Hibbits      Otherwise, the only supported runtime modification is a specific next engine update
4202852ba100SJustin Hibbits      and this requires shadow memory of a single AD */
4203852ba100SJustin Hibbits 
4204852ba100SJustin Hibbits     /* Shadow size should be enough to hold the following 3 structures:
4205852ba100SJustin Hibbits      * 1 - an action descriptor */
4206852ba100SJustin Hibbits     shadowSize = FM_PCD_CC_AD_ENTRY_SIZE;
4207852ba100SJustin Hibbits 
4208852ba100SJustin Hibbits     /* 2 - keys match table, if was allocated for the current node */
4209852ba100SJustin Hibbits     if (isKeyTblAlloc)
4210852ba100SJustin Hibbits         shadowSize += *p_MatchTableSize;
4211852ba100SJustin Hibbits 
4212852ba100SJustin Hibbits     /* 3 - next action descriptors table */
4213852ba100SJustin Hibbits     shadowSize += *p_AdTableSize;
4214852ba100SJustin Hibbits 
4215852ba100SJustin Hibbits     /* Update shadow to the calculated size */
4216852ba100SJustin Hibbits     err = FmPcdUpdateCcShadow(p_CcNode->h_FmPcd, (uint32_t)shadowSize,
4217852ba100SJustin Hibbits                               FM_PCD_CC_AD_TABLE_ALIGN);
4218852ba100SJustin Hibbits     if (err != E_OK)
4219852ba100SJustin Hibbits     {
4220852ba100SJustin Hibbits         DeleteNode(p_CcNode);
4221852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC node shadow"));
4222852ba100SJustin Hibbits     }
4223852ba100SJustin Hibbits 
4224852ba100SJustin Hibbits     return E_OK;
4225852ba100SJustin Hibbits }
4226852ba100SJustin Hibbits 
AllocStatsObjs(t_FmPcdCcNode * p_CcNode)4227852ba100SJustin Hibbits static t_Error AllocStatsObjs(t_FmPcdCcNode *p_CcNode)
4228852ba100SJustin Hibbits {
4229852ba100SJustin Hibbits     t_FmPcdStatsObj *p_StatsObj;
4230852ba100SJustin Hibbits     t_Handle h_FmMuram, h_StatsAd, h_StatsCounters;
4231852ba100SJustin Hibbits     uint32_t i;
4232852ba100SJustin Hibbits 
4233852ba100SJustin Hibbits     h_FmMuram = FmPcdGetMuramHandle(p_CcNode->h_FmPcd);
4234852ba100SJustin Hibbits     if (!h_FmMuram)
4235852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("FM MURAM"));
4236852ba100SJustin Hibbits 
4237852ba100SJustin Hibbits     /* Allocate statistics ADs and statistics counter. An extra pair (AD + counters)
4238852ba100SJustin Hibbits      will be allocated to support runtime modifications */
4239852ba100SJustin Hibbits     for (i = 0; i < p_CcNode->maxNumOfKeys + 2; i++)
4240852ba100SJustin Hibbits     {
4241852ba100SJustin Hibbits         /* Allocate list object structure */
4242852ba100SJustin Hibbits         p_StatsObj = XX_Malloc(sizeof(t_FmPcdStatsObj));
4243852ba100SJustin Hibbits         if (!p_StatsObj)
4244852ba100SJustin Hibbits         {
4245852ba100SJustin Hibbits             FreeStatObjects(&p_CcNode->availableStatsLst, h_FmMuram);
4246852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Statistics object"));
4247852ba100SJustin Hibbits         }
4248852ba100SJustin Hibbits         memset(p_StatsObj, 0, sizeof(t_FmPcdStatsObj));
4249852ba100SJustin Hibbits 
4250852ba100SJustin Hibbits         /* Allocate statistics AD from MURAM */
4251852ba100SJustin Hibbits         h_StatsAd = (t_Handle)FM_MURAM_AllocMem(h_FmMuram,
4252852ba100SJustin Hibbits                                                 FM_PCD_CC_AD_ENTRY_SIZE,
4253852ba100SJustin Hibbits                                                 FM_PCD_CC_AD_TABLE_ALIGN);
4254852ba100SJustin Hibbits         if (!h_StatsAd)
4255852ba100SJustin Hibbits         {
4256852ba100SJustin Hibbits             FreeStatObjects(&p_CcNode->availableStatsLst, h_FmMuram);
4257852ba100SJustin Hibbits             XX_Free(p_StatsObj);
4258852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_NO_MEMORY,
4259852ba100SJustin Hibbits                          ("MURAM allocation for statistics ADs"));
4260852ba100SJustin Hibbits         }
4261852ba100SJustin Hibbits         MemSet8(h_StatsAd, 0, FM_PCD_CC_AD_ENTRY_SIZE);
4262852ba100SJustin Hibbits 
4263852ba100SJustin Hibbits         /* Allocate statistics counters from MURAM */
4264852ba100SJustin Hibbits         h_StatsCounters = (t_Handle)FM_MURAM_AllocMem(
4265852ba100SJustin Hibbits                 h_FmMuram, p_CcNode->countersArraySize,
4266852ba100SJustin Hibbits                 FM_PCD_CC_AD_TABLE_ALIGN);
4267852ba100SJustin Hibbits         if (!h_StatsCounters)
4268852ba100SJustin Hibbits         {
4269852ba100SJustin Hibbits             FreeStatObjects(&p_CcNode->availableStatsLst, h_FmMuram);
4270852ba100SJustin Hibbits             FM_MURAM_FreeMem(h_FmMuram, h_StatsAd);
4271852ba100SJustin Hibbits             XX_Free(p_StatsObj);
4272852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_NO_MEMORY,
4273852ba100SJustin Hibbits                          ("MURAM allocation for statistics counters"));
4274852ba100SJustin Hibbits         }
4275852ba100SJustin Hibbits         MemSet8(h_StatsCounters, 0, p_CcNode->countersArraySize);
4276852ba100SJustin Hibbits 
4277852ba100SJustin Hibbits         p_StatsObj->h_StatsAd = h_StatsAd;
4278852ba100SJustin Hibbits         p_StatsObj->h_StatsCounters = h_StatsCounters;
4279852ba100SJustin Hibbits 
4280852ba100SJustin Hibbits         EnqueueStatsObj(&p_CcNode->availableStatsLst, p_StatsObj);
4281852ba100SJustin Hibbits     }
4282852ba100SJustin Hibbits 
4283852ba100SJustin Hibbits     return E_OK;
4284852ba100SJustin Hibbits }
4285852ba100SJustin Hibbits 
MatchTableGetKeyStatistics(t_FmPcdCcNode * p_CcNode,uint16_t keyIndex,t_FmPcdCcKeyStatistics * p_KeyStatistics)4286852ba100SJustin Hibbits static t_Error MatchTableGetKeyStatistics(
4287852ba100SJustin Hibbits         t_FmPcdCcNode *p_CcNode, uint16_t keyIndex,
4288852ba100SJustin Hibbits         t_FmPcdCcKeyStatistics *p_KeyStatistics)
4289852ba100SJustin Hibbits {
4290852ba100SJustin Hibbits     uint32_t *p_StatsCounters, i;
4291852ba100SJustin Hibbits 
4292852ba100SJustin Hibbits     if (p_CcNode->statisticsMode == e_FM_PCD_CC_STATS_MODE_NONE)
4293852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE,
4294852ba100SJustin Hibbits                      ("Statistics were not enabled for this match table"));
4295852ba100SJustin Hibbits 
4296852ba100SJustin Hibbits     if (!p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj)
4297852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE,
4298852ba100SJustin Hibbits                      ("Statistics were not enabled for this key"));
4299852ba100SJustin Hibbits 
4300852ba100SJustin Hibbits     memset(p_KeyStatistics, 0, sizeof(t_FmPcdCcKeyStatistics));
4301852ba100SJustin Hibbits 
4302852ba100SJustin Hibbits     p_StatsCounters =
4303852ba100SJustin Hibbits             p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj->h_StatsCounters;
4304852ba100SJustin Hibbits     ASSERT_COND(p_StatsCounters);
4305852ba100SJustin Hibbits 
4306852ba100SJustin Hibbits     p_KeyStatistics->byteCount = GET_UINT32(*p_StatsCounters);
4307852ba100SJustin Hibbits 
4308852ba100SJustin Hibbits     for (i = 1; i <= p_CcNode->numOfStatsFLRs; i++)
4309852ba100SJustin Hibbits     {
4310852ba100SJustin Hibbits         p_StatsCounters =
4311852ba100SJustin Hibbits                 PTR_MOVE(p_StatsCounters, FM_PCD_CC_STATS_COUNTER_SIZE);
4312852ba100SJustin Hibbits 
4313852ba100SJustin Hibbits         p_KeyStatistics->frameCount += GET_UINT32(*p_StatsCounters);
4314852ba100SJustin Hibbits 
4315852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
4316852ba100SJustin Hibbits         p_KeyStatistics->frameLengthRangeCount[i - 1] =
4317852ba100SJustin Hibbits                 GET_UINT32(*p_StatsCounters);
4318852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
4319852ba100SJustin Hibbits     }
4320852ba100SJustin Hibbits 
4321852ba100SJustin Hibbits     return E_OK;
4322852ba100SJustin Hibbits }
4323852ba100SJustin Hibbits 
MatchTableSet(t_Handle h_FmPcd,t_FmPcdCcNode * p_CcNode,t_FmPcdCcNodeParams * p_CcNodeParam)4324852ba100SJustin Hibbits static t_Error MatchTableSet(t_Handle h_FmPcd, t_FmPcdCcNode *p_CcNode,
4325852ba100SJustin Hibbits                              t_FmPcdCcNodeParams *p_CcNodeParam)
4326852ba100SJustin Hibbits {
4327852ba100SJustin Hibbits     t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
4328852ba100SJustin Hibbits     t_FmPcdCcNode *p_FmPcdCcNextNode;
4329852ba100SJustin Hibbits     t_Error err = E_OK;
4330852ba100SJustin Hibbits     uint32_t tmp, keySize;
4331852ba100SJustin Hibbits     bool glblMask = FALSE;
4332852ba100SJustin Hibbits     t_FmPcdCcKeyParams *p_KeyParams;
4333852ba100SJustin Hibbits     t_Handle h_FmMuram, p_KeysMatchTblTmp, p_AdTableTmp;
4334852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
4335852ba100SJustin Hibbits     t_Handle h_StatsFLRs;
4336852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
4337852ba100SJustin Hibbits     bool fullField = FALSE;
4338852ba100SJustin Hibbits     ccPrivateInfo_t icCode = CC_PRIVATE_INFO_NONE;
4339852ba100SJustin Hibbits     bool isKeyTblAlloc, fromIc = FALSE;
4340852ba100SJustin Hibbits     uint32_t matchTableSize, adTableSize;
4341852ba100SJustin Hibbits     t_CcNodeInformation ccNodeInfo, *p_CcInformation;
4342852ba100SJustin Hibbits     t_FmPcdStatsObj *p_StatsObj;
4343852ba100SJustin Hibbits     t_FmPcdCcStatsParams statsParams = { 0 };
4344852ba100SJustin Hibbits     t_Handle h_Manip;
4345852ba100SJustin Hibbits 
4346852ba100SJustin Hibbits     ASSERT_COND(h_FmPcd);
4347852ba100SJustin Hibbits     ASSERT_COND(p_CcNode);
4348852ba100SJustin Hibbits     ASSERT_COND(p_CcNodeParam);
4349852ba100SJustin Hibbits 
4350852ba100SJustin Hibbits     p_CcNode->p_GlblMask = (t_Handle)XX_Malloc(
4351852ba100SJustin Hibbits             CC_GLBL_MASK_SIZE * sizeof(uint8_t));
4352852ba100SJustin Hibbits     memset(p_CcNode->p_GlblMask, 0, CC_GLBL_MASK_SIZE * sizeof(uint8_t));
4353852ba100SJustin Hibbits 
4354852ba100SJustin Hibbits     p_CcNode->h_FmPcd = h_FmPcd;
4355852ba100SJustin Hibbits     p_CcNode->numOfKeys = p_CcNodeParam->keysParams.numOfKeys;
4356852ba100SJustin Hibbits     p_CcNode->maxNumOfKeys = p_CcNodeParam->keysParams.maxNumOfKeys;
4357852ba100SJustin Hibbits     p_CcNode->maskSupport = p_CcNodeParam->keysParams.maskSupport;
4358852ba100SJustin Hibbits     p_CcNode->statisticsMode = p_CcNodeParam->keysParams.statisticsMode;
4359852ba100SJustin Hibbits 
4360852ba100SJustin Hibbits     /* For backward compatibility - even if statistics mode is nullified,
4361852ba100SJustin Hibbits      we'll fix it to frame mode so we can support per-key request for
4362852ba100SJustin Hibbits      statistics using 'statisticsEn' in next engine parameters */
4363852ba100SJustin Hibbits     if (!p_CcNode->maxNumOfKeys
4364852ba100SJustin Hibbits             && (p_CcNode->statisticsMode == e_FM_PCD_CC_STATS_MODE_NONE))
4365852ba100SJustin Hibbits         p_CcNode->statisticsMode = e_FM_PCD_CC_STATS_MODE_FRAME;
4366852ba100SJustin Hibbits 
4367852ba100SJustin Hibbits     h_FmMuram = FmPcdGetMuramHandle(h_FmPcd);
4368852ba100SJustin Hibbits     if (!h_FmMuram)
4369852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("FM MURAM"));
4370852ba100SJustin Hibbits 
4371852ba100SJustin Hibbits     INIT_LIST(&p_CcNode->ccPrevNodesLst);
4372852ba100SJustin Hibbits     INIT_LIST(&p_CcNode->ccTreeIdLst);
4373852ba100SJustin Hibbits     INIT_LIST(&p_CcNode->ccTreesLst);
4374852ba100SJustin Hibbits     INIT_LIST(&p_CcNode->availableStatsLst);
4375852ba100SJustin Hibbits 
4376852ba100SJustin Hibbits     p_CcNode->h_Spinlock = XX_InitSpinlock();
4377852ba100SJustin Hibbits     if (!p_CcNode->h_Spinlock)
4378852ba100SJustin Hibbits     {
4379852ba100SJustin Hibbits         DeleteNode(p_CcNode);
4380852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("CC node spinlock"));
4381852ba100SJustin Hibbits     }
4382852ba100SJustin Hibbits 
4383852ba100SJustin Hibbits     if ((p_CcNodeParam->extractCcParams.type == e_FM_PCD_EXTRACT_BY_HDR)
4384852ba100SJustin Hibbits             && ((p_CcNodeParam->extractCcParams.extractByHdr.hdr
4385852ba100SJustin Hibbits                     == HEADER_TYPE_IPv4)
4386852ba100SJustin Hibbits                     || (p_CcNodeParam->extractCcParams.extractByHdr.hdr
4387852ba100SJustin Hibbits                             == HEADER_TYPE_IPv6))
4388852ba100SJustin Hibbits             && (p_CcNodeParam->extractCcParams.extractByHdr.type
4389852ba100SJustin Hibbits                     == e_FM_PCD_EXTRACT_FULL_FIELD)
4390852ba100SJustin Hibbits             && ((p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fullField.ipv6
4391852ba100SJustin Hibbits                     == NET_HEADER_FIELD_IPv6_HOP_LIMIT)
4392852ba100SJustin Hibbits                     || (p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fullField.ipv4
4393852ba100SJustin Hibbits                             == NET_HEADER_FIELD_IPv4_TTL)))
4394852ba100SJustin Hibbits     {
4395852ba100SJustin Hibbits         err = Ipv4TtlOrIpv6HopLimitCheckParams(h_FmPcd, p_CcNodeParam, p_CcNode,
4396852ba100SJustin Hibbits                                                &isKeyTblAlloc);
4397852ba100SJustin Hibbits         glblMask = FALSE;
4398852ba100SJustin Hibbits     }
4399852ba100SJustin Hibbits     else
4400852ba100SJustin Hibbits         if ((p_CcNodeParam->extractCcParams.type == e_FM_PCD_EXTRACT_NON_HDR)
4401852ba100SJustin Hibbits                 && ((p_CcNodeParam->extractCcParams.extractNonHdr.src
4402852ba100SJustin Hibbits                         == e_FM_PCD_EXTRACT_FROM_KEY)
4403852ba100SJustin Hibbits                         || (p_CcNodeParam->extractCcParams.extractNonHdr.src
4404852ba100SJustin Hibbits                                 == e_FM_PCD_EXTRACT_FROM_HASH)
4405852ba100SJustin Hibbits                         || (p_CcNodeParam->extractCcParams.extractNonHdr.src
4406852ba100SJustin Hibbits                                 == e_FM_PCD_EXTRACT_FROM_FLOW_ID)))
4407852ba100SJustin Hibbits         {
4408852ba100SJustin Hibbits             if ((p_CcNodeParam->extractCcParams.extractNonHdr.src
4409852ba100SJustin Hibbits                     == e_FM_PCD_EXTRACT_FROM_FLOW_ID)
4410852ba100SJustin Hibbits                     && (p_CcNodeParam->extractCcParams.extractNonHdr.offset != 0))
4411852ba100SJustin Hibbits             {
4412852ba100SJustin Hibbits                 DeleteNode(p_CcNode);
4413852ba100SJustin Hibbits                 RETURN_ERROR(
4414852ba100SJustin Hibbits                         MAJOR,
4415852ba100SJustin Hibbits                         E_INVALID_VALUE,
4416852ba100SJustin Hibbits                         ("In the case of the extraction from e_FM_PCD_EXTRACT_FROM_FLOW_ID offset has to be 0"));
4417852ba100SJustin Hibbits             }
4418852ba100SJustin Hibbits 
4419852ba100SJustin Hibbits             icCode = IcDefineCode(p_CcNodeParam);
4420852ba100SJustin Hibbits             fromIc = TRUE;
4421852ba100SJustin Hibbits             if (icCode == CC_PRIVATE_INFO_NONE)
4422852ba100SJustin Hibbits             {
4423852ba100SJustin Hibbits                 DeleteNode(p_CcNode);
4424852ba100SJustin Hibbits                 RETURN_ERROR(
4425852ba100SJustin Hibbits                         MAJOR,
4426852ba100SJustin Hibbits                         E_INVALID_STATE,
4427852ba100SJustin Hibbits                         ("user asked extraction from IC and field in internal context or action wasn't initialized in the right way"));
4428852ba100SJustin Hibbits             }
4429852ba100SJustin Hibbits 
4430852ba100SJustin Hibbits             if ((icCode == CC_PRIVATE_INFO_IC_DEQ_FQID_INDEX_LOOKUP)
4431852ba100SJustin Hibbits                     || (icCode == CC_PRIVATE_INFO_IC_HASH_INDEX_LOOKUP))
4432852ba100SJustin Hibbits             {
4433852ba100SJustin Hibbits                 err = IcHashIndexedCheckParams(h_FmPcd, p_CcNodeParam, p_CcNode,
4434852ba100SJustin Hibbits                                                &isKeyTblAlloc);
4435852ba100SJustin Hibbits                 glblMask = TRUE;
4436852ba100SJustin Hibbits             }
4437852ba100SJustin Hibbits             else
4438852ba100SJustin Hibbits             {
4439852ba100SJustin Hibbits                 err = CheckParams(h_FmPcd, p_CcNodeParam, p_CcNode,
4440852ba100SJustin Hibbits                                   &isKeyTblAlloc);
4441852ba100SJustin Hibbits                 if (p_CcNode->glblMaskSize)
4442852ba100SJustin Hibbits                     glblMask = TRUE;
4443852ba100SJustin Hibbits             }
4444852ba100SJustin Hibbits         }
4445852ba100SJustin Hibbits         else
4446852ba100SJustin Hibbits         {
4447852ba100SJustin Hibbits             err = CheckParams(h_FmPcd, p_CcNodeParam, p_CcNode, &isKeyTblAlloc);
4448852ba100SJustin Hibbits             if (p_CcNode->glblMaskSize)
4449852ba100SJustin Hibbits                 glblMask = TRUE;
4450852ba100SJustin Hibbits         }
4451852ba100SJustin Hibbits 
4452852ba100SJustin Hibbits     if (err)
4453852ba100SJustin Hibbits     {
4454852ba100SJustin Hibbits         DeleteNode(p_CcNode);
4455852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
4456852ba100SJustin Hibbits     }
4457852ba100SJustin Hibbits 
4458852ba100SJustin Hibbits     switch (p_CcNodeParam->extractCcParams.type)
4459852ba100SJustin Hibbits     {
4460852ba100SJustin Hibbits         case (e_FM_PCD_EXTRACT_BY_HDR):
4461852ba100SJustin Hibbits             switch (p_CcNodeParam->extractCcParams.extractByHdr.type)
4462852ba100SJustin Hibbits             {
4463852ba100SJustin Hibbits                 case (e_FM_PCD_EXTRACT_FULL_FIELD):
4464852ba100SJustin Hibbits                     p_CcNode->parseCode =
4465852ba100SJustin Hibbits                             GetFullFieldParseCode(
4466852ba100SJustin Hibbits                                     p_CcNodeParam->extractCcParams.extractByHdr.hdr,
4467852ba100SJustin Hibbits                                     p_CcNodeParam->extractCcParams.extractByHdr.hdrIndex,
4468852ba100SJustin Hibbits                                     p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fullField);
4469852ba100SJustin Hibbits                     GetSizeHeaderField(
4470852ba100SJustin Hibbits                             p_CcNodeParam->extractCcParams.extractByHdr.hdr,
4471852ba100SJustin Hibbits                             p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fullField,
4472852ba100SJustin Hibbits                             &p_CcNode->sizeOfExtraction);
4473852ba100SJustin Hibbits                     fullField = TRUE;
4474852ba100SJustin Hibbits                     if ((p_CcNode->parseCode != CC_PC_FF_TCI1)
4475852ba100SJustin Hibbits                             && (p_CcNode->parseCode != CC_PC_FF_TCI2)
4476852ba100SJustin Hibbits                             && (p_CcNode->parseCode != CC_PC_FF_MPLS1)
4477852ba100SJustin Hibbits                             && (p_CcNode->parseCode != CC_PC_FF_MPLS_LAST)
4478852ba100SJustin Hibbits                             && (p_CcNode->parseCode != CC_PC_FF_IPV4IPTOS_TC1)
4479852ba100SJustin Hibbits                             && (p_CcNode->parseCode != CC_PC_FF_IPV4IPTOS_TC2)
4480852ba100SJustin Hibbits                             && (p_CcNode->parseCode
4481852ba100SJustin Hibbits                                     != CC_PC_FF_IPTOS_IPV6TC1_IPV6FLOW1)
4482852ba100SJustin Hibbits                             && (p_CcNode->parseCode != CC_PC_FF_IPDSCP)
4483852ba100SJustin Hibbits                             && (p_CcNode->parseCode
4484852ba100SJustin Hibbits                                     != CC_PC_FF_IPTOS_IPV6TC2_IPV6FLOW2)
4485852ba100SJustin Hibbits                             && glblMask)
4486852ba100SJustin Hibbits                     {
4487852ba100SJustin Hibbits                         glblMask = FALSE;
4488852ba100SJustin Hibbits                         p_CcNode->glblMaskSize = 4;
4489852ba100SJustin Hibbits                         p_CcNode->lclMask = TRUE;
4490852ba100SJustin Hibbits                     }
4491852ba100SJustin Hibbits                     break;
4492852ba100SJustin Hibbits 
4493852ba100SJustin Hibbits                 case (e_FM_PCD_EXTRACT_FROM_HDR):
4494852ba100SJustin Hibbits                     p_CcNode->sizeOfExtraction =
4495852ba100SJustin Hibbits                             p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromHdr.size;
4496852ba100SJustin Hibbits                     p_CcNode->offset =
4497852ba100SJustin Hibbits                             p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromHdr.offset;
4498852ba100SJustin Hibbits                     p_CcNode->userOffset =
4499852ba100SJustin Hibbits                             p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromHdr.offset;
4500852ba100SJustin Hibbits                     p_CcNode->parseCode =
4501852ba100SJustin Hibbits                             GetPrParseCode(
4502852ba100SJustin Hibbits                                     p_CcNodeParam->extractCcParams.extractByHdr.hdr,
4503852ba100SJustin Hibbits                                     p_CcNodeParam->extractCcParams.extractByHdr.hdrIndex,
4504852ba100SJustin Hibbits                                     p_CcNode->offset, glblMask,
4505852ba100SJustin Hibbits                                     &p_CcNode->prsArrayOffset);
4506852ba100SJustin Hibbits                     break;
4507852ba100SJustin Hibbits 
4508852ba100SJustin Hibbits                 case (e_FM_PCD_EXTRACT_FROM_FIELD):
4509852ba100SJustin Hibbits                     p_CcNode->offset =
4510852ba100SJustin Hibbits                             p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromField.offset;
4511852ba100SJustin Hibbits                     p_CcNode->userOffset =
4512852ba100SJustin Hibbits                             p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromField.offset;
4513852ba100SJustin Hibbits                     p_CcNode->sizeOfExtraction =
4514852ba100SJustin Hibbits                             p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromField.size;
4515852ba100SJustin Hibbits                     p_CcNode->parseCode =
4516852ba100SJustin Hibbits                             GetFieldParseCode(
4517852ba100SJustin Hibbits                                     p_CcNodeParam->extractCcParams.extractByHdr.hdr,
4518852ba100SJustin Hibbits                                     p_CcNodeParam->extractCcParams.extractByHdr.extractByHdrType.fromField.field,
4519852ba100SJustin Hibbits                                     p_CcNode->offset,
4520852ba100SJustin Hibbits                                     &p_CcNode->prsArrayOffset,
4521852ba100SJustin Hibbits                                     p_CcNodeParam->extractCcParams.extractByHdr.hdrIndex);
4522852ba100SJustin Hibbits                     break;
4523852ba100SJustin Hibbits 
4524852ba100SJustin Hibbits                 default:
4525852ba100SJustin Hibbits                     DeleteNode(p_CcNode);
4526852ba100SJustin Hibbits                     RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
4527852ba100SJustin Hibbits             }
4528852ba100SJustin Hibbits             break;
4529852ba100SJustin Hibbits 
4530852ba100SJustin Hibbits         case (e_FM_PCD_EXTRACT_NON_HDR):
4531852ba100SJustin Hibbits             /* get the field code for the generic extract */
4532852ba100SJustin Hibbits             p_CcNode->sizeOfExtraction =
4533852ba100SJustin Hibbits                     p_CcNodeParam->extractCcParams.extractNonHdr.size;
4534852ba100SJustin Hibbits             p_CcNode->offset =
4535852ba100SJustin Hibbits                     p_CcNodeParam->extractCcParams.extractNonHdr.offset;
4536852ba100SJustin Hibbits             p_CcNode->userOffset =
4537852ba100SJustin Hibbits                     p_CcNodeParam->extractCcParams.extractNonHdr.offset;
4538852ba100SJustin Hibbits             p_CcNode->parseCode = GetGenParseCode(
4539852ba100SJustin Hibbits                     p_CcNodeParam->extractCcParams.extractNonHdr.src,
4540852ba100SJustin Hibbits                     p_CcNode->offset, glblMask, &p_CcNode->prsArrayOffset,
4541852ba100SJustin Hibbits                     fromIc, icCode);
4542852ba100SJustin Hibbits 
4543852ba100SJustin Hibbits             if (p_CcNode->parseCode == CC_PC_GENERIC_IC_HASH_INDEXED)
4544852ba100SJustin Hibbits             {
4545852ba100SJustin Hibbits                 if ((p_CcNode->offset + p_CcNode->sizeOfExtraction) > 8)
4546852ba100SJustin Hibbits                 {
4547852ba100SJustin Hibbits                     DeleteNode(p_CcNode);
4548852ba100SJustin Hibbits                     RETURN_ERROR(
4549852ba100SJustin Hibbits                             MAJOR,
4550852ba100SJustin Hibbits                             E_INVALID_SELECTION,
4551852ba100SJustin Hibbits                             ("when node of the type CC_PC_GENERIC_IC_HASH_INDEXED offset + size can not be bigger then size of HASH 64 bits (8 bytes)"));
4552852ba100SJustin Hibbits                 }
4553852ba100SJustin Hibbits             }
4554852ba100SJustin Hibbits             if ((p_CcNode->parseCode == CC_PC_GENERIC_IC_GMASK)
4555852ba100SJustin Hibbits                     || (p_CcNode->parseCode == CC_PC_GENERIC_IC_HASH_INDEXED))
4556852ba100SJustin Hibbits             {
4557852ba100SJustin Hibbits                 p_CcNode->offset += p_CcNode->prsArrayOffset;
4558852ba100SJustin Hibbits                 p_CcNode->prsArrayOffset = 0;
4559852ba100SJustin Hibbits             }
4560852ba100SJustin Hibbits             break;
4561852ba100SJustin Hibbits 
4562852ba100SJustin Hibbits         default:
4563852ba100SJustin Hibbits             DeleteNode(p_CcNode);
4564852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
4565852ba100SJustin Hibbits     }
4566852ba100SJustin Hibbits 
4567852ba100SJustin Hibbits     if (p_CcNode->parseCode == CC_PC_ILLEGAL)
4568852ba100SJustin Hibbits     {
4569852ba100SJustin Hibbits         DeleteNode(p_CcNode);
4570852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("illegal extraction type"));
4571852ba100SJustin Hibbits     }
4572852ba100SJustin Hibbits 
4573852ba100SJustin Hibbits     if ((p_CcNode->sizeOfExtraction > FM_PCD_MAX_SIZE_OF_KEY)
4574852ba100SJustin Hibbits             || !p_CcNode->sizeOfExtraction)
4575852ba100SJustin Hibbits     {
4576852ba100SJustin Hibbits         DeleteNode(p_CcNode);
4577852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE,
4578852ba100SJustin Hibbits                      ("sizeOfExatrction can not be greater than 56 and not 0"));
4579852ba100SJustin Hibbits     }
4580852ba100SJustin Hibbits 
4581852ba100SJustin Hibbits     if (p_CcNodeParam->keysParams.keySize != p_CcNode->sizeOfExtraction)
4582852ba100SJustin Hibbits     {
4583852ba100SJustin Hibbits         DeleteNode(p_CcNode);
4584852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE,
4585852ba100SJustin Hibbits                      ("keySize has to be equal to sizeOfExtraction"));
4586852ba100SJustin Hibbits     }
4587852ba100SJustin Hibbits 
4588852ba100SJustin Hibbits     p_CcNode->userSizeOfExtraction = p_CcNode->sizeOfExtraction;
4589852ba100SJustin Hibbits 
4590852ba100SJustin Hibbits     if (!glblMask)
4591852ba100SJustin Hibbits         memset(p_CcNode->p_GlblMask, 0xff, CC_GLBL_MASK_SIZE * sizeof(uint8_t));
4592852ba100SJustin Hibbits 
4593852ba100SJustin Hibbits     err = CheckAndSetManipParamsWithCcNodeParams(p_CcNode);
4594852ba100SJustin Hibbits     if (err != E_OK)
4595852ba100SJustin Hibbits     {
4596852ba100SJustin Hibbits         DeleteNode(p_CcNode);
4597852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE,
4598852ba100SJustin Hibbits                      ("keySize has to be equal to sizeOfExtraction"));
4599852ba100SJustin Hibbits     }
4600852ba100SJustin Hibbits 
4601852ba100SJustin Hibbits     /* Calculating matching table entry size by rounding up the user-defined size of extraction to valid entry size */
4602852ba100SJustin Hibbits     GetCcExtractKeySize(p_CcNode->sizeOfExtraction,
4603852ba100SJustin Hibbits                         &p_CcNode->ccKeySizeAccExtraction);
4604852ba100SJustin Hibbits 
4605852ba100SJustin Hibbits     /* If local mask is used, it is stored next to each key in the keys match table */
4606852ba100SJustin Hibbits     if (p_CcNode->lclMask)
4607852ba100SJustin Hibbits         keySize = (uint32_t)(2 * p_CcNode->ccKeySizeAccExtraction);
4608852ba100SJustin Hibbits     else
4609852ba100SJustin Hibbits         keySize = p_CcNode->ccKeySizeAccExtraction;
4610852ba100SJustin Hibbits 
4611852ba100SJustin Hibbits     /* Update CC shadow with maximal size required by this node */
4612852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
4613852ba100SJustin Hibbits     {
4614852ba100SJustin Hibbits         err = CalcAndUpdateCcShadow(p_CcNode, isKeyTblAlloc, &matchTableSize,
4615852ba100SJustin Hibbits                                     &adTableSize);
4616852ba100SJustin Hibbits         if (err != E_OK)
4617852ba100SJustin Hibbits         {
4618852ba100SJustin Hibbits             DeleteNode(p_CcNode);
4619852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, err, NO_MSG);
4620852ba100SJustin Hibbits         }
4621852ba100SJustin Hibbits 
4622852ba100SJustin Hibbits         p_CcNode->keysMatchTableMaxSize = matchTableSize;
4623852ba100SJustin Hibbits 
4624852ba100SJustin Hibbits         if (p_CcNode->statisticsMode != e_FM_PCD_CC_STATS_MODE_NONE)
4625852ba100SJustin Hibbits         {
4626852ba100SJustin Hibbits             err = AllocStatsObjs(p_CcNode);
4627852ba100SJustin Hibbits             if (err != E_OK)
4628852ba100SJustin Hibbits             {
4629852ba100SJustin Hibbits                 DeleteNode(p_CcNode);
4630852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, err, NO_MSG);
4631852ba100SJustin Hibbits             }
4632852ba100SJustin Hibbits         }
4633852ba100SJustin Hibbits 
4634852ba100SJustin Hibbits         /* If manipulation will be initialized before this node, it will use the table
4635852ba100SJustin Hibbits          descriptor in the AD table of previous node and this node will need an extra
4636852ba100SJustin Hibbits          AD as his table descriptor. */
4637852ba100SJustin Hibbits         p_CcNode->h_TmpAd = (t_Handle)FM_MURAM_AllocMem(
4638852ba100SJustin Hibbits                 h_FmMuram, FM_PCD_CC_AD_ENTRY_SIZE, FM_PCD_CC_AD_TABLE_ALIGN);
4639852ba100SJustin Hibbits         if (!p_CcNode->h_TmpAd)
4640852ba100SJustin Hibbits         {
4641852ba100SJustin Hibbits             DeleteNode(p_CcNode);
4642852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_NO_MEMORY,
4643852ba100SJustin Hibbits                          ("MURAM allocation for CC action descriptor"));
4644852ba100SJustin Hibbits         }
4645852ba100SJustin Hibbits     }
4646852ba100SJustin Hibbits     else
4647852ba100SJustin Hibbits     {
4648852ba100SJustin Hibbits         matchTableSize = (uint32_t)(keySize * sizeof(uint8_t)
4649852ba100SJustin Hibbits                 * (p_CcNode->numOfKeys + 1));
4650852ba100SJustin Hibbits         adTableSize = (uint32_t)(FM_PCD_CC_AD_ENTRY_SIZE
4651852ba100SJustin Hibbits                 * (p_CcNode->numOfKeys + 1));
4652852ba100SJustin Hibbits     }
4653852ba100SJustin Hibbits 
4654852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
4655852ba100SJustin Hibbits     switch (p_CcNode->statisticsMode)
4656852ba100SJustin Hibbits     {
4657852ba100SJustin Hibbits 
4658852ba100SJustin Hibbits         case e_FM_PCD_CC_STATS_MODE_RMON:
4659852ba100SJustin Hibbits             /* If RMON statistics or RMON conditional statistics modes are requested,
4660852ba100SJustin Hibbits              allocate frame length ranges array */
4661852ba100SJustin Hibbits             p_CcNode->h_StatsFLRs = FM_MURAM_AllocMem(
4662852ba100SJustin Hibbits                     h_FmMuram,
4663852ba100SJustin Hibbits                     (uint32_t)(p_CcNode->numOfStatsFLRs)
4664852ba100SJustin Hibbits                             * FM_PCD_CC_STATS_FLR_SIZE,
4665852ba100SJustin Hibbits                     FM_PCD_CC_AD_TABLE_ALIGN);
4666852ba100SJustin Hibbits 
4667852ba100SJustin Hibbits             if (!p_CcNode->h_StatsFLRs)
4668852ba100SJustin Hibbits             {
4669852ba100SJustin Hibbits                 DeleteNode(p_CcNode);
4670852ba100SJustin Hibbits                 RETURN_ERROR(
4671852ba100SJustin Hibbits                         MAJOR, E_NO_MEMORY,
4672852ba100SJustin Hibbits                         ("MURAM allocation for CC frame length ranges array"));
4673852ba100SJustin Hibbits             }
4674852ba100SJustin Hibbits 
4675852ba100SJustin Hibbits             /* Initialize using value received from the user */
4676852ba100SJustin Hibbits             for (tmp = 0; tmp < p_CcNode->numOfStatsFLRs; tmp++)
4677852ba100SJustin Hibbits             {
4678852ba100SJustin Hibbits                 uint16_t flr =
4679852ba100SJustin Hibbits                          cpu_to_be16(p_CcNodeParam->keysParams.frameLengthRanges[tmp]);
4680852ba100SJustin Hibbits 
4681852ba100SJustin Hibbits                 h_StatsFLRs =
4682852ba100SJustin Hibbits                         PTR_MOVE(p_CcNode->h_StatsFLRs, tmp * FM_PCD_CC_STATS_FLR_SIZE);
4683852ba100SJustin Hibbits 
4684852ba100SJustin Hibbits                 MemCpy8(h_StatsFLRs,
4685852ba100SJustin Hibbits                             &flr,
4686852ba100SJustin Hibbits                             FM_PCD_CC_STATS_FLR_SIZE);
4687852ba100SJustin Hibbits             }
4688852ba100SJustin Hibbits             break;
4689852ba100SJustin Hibbits 
4690852ba100SJustin Hibbits         default:
4691852ba100SJustin Hibbits             break;
4692852ba100SJustin Hibbits     }
4693852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
4694852ba100SJustin Hibbits 
4695852ba100SJustin Hibbits     /* Allocate keys match table. Not required for some CC nodes, for example for IPv4 TTL
4696852ba100SJustin Hibbits      identification, IPv6 hop count identification, etc. */
4697852ba100SJustin Hibbits     if (isKeyTblAlloc)
4698852ba100SJustin Hibbits     {
4699852ba100SJustin Hibbits         p_CcNode->h_KeysMatchTable = (t_Handle)FM_MURAM_AllocMem(
4700852ba100SJustin Hibbits                 h_FmMuram, matchTableSize, FM_PCD_CC_KEYS_MATCH_TABLE_ALIGN);
4701852ba100SJustin Hibbits         if (!p_CcNode->h_KeysMatchTable)
4702852ba100SJustin Hibbits         {
4703852ba100SJustin Hibbits             DeleteNode(p_CcNode);
4704852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_NO_MEMORY,
4705852ba100SJustin Hibbits                          ("MURAM allocation for CC node key match table"));
4706852ba100SJustin Hibbits         }
4707852ba100SJustin Hibbits         MemSet8((uint8_t *)p_CcNode->h_KeysMatchTable, 0, matchTableSize);
4708852ba100SJustin Hibbits     }
4709852ba100SJustin Hibbits 
4710852ba100SJustin Hibbits     /* Allocate action descriptors table */
4711852ba100SJustin Hibbits     p_CcNode->h_AdTable = (t_Handle)FM_MURAM_AllocMem(h_FmMuram, adTableSize,
4712852ba100SJustin Hibbits                                                       FM_PCD_CC_AD_TABLE_ALIGN);
4713852ba100SJustin Hibbits     if (!p_CcNode->h_AdTable)
4714852ba100SJustin Hibbits     {
4715852ba100SJustin Hibbits         DeleteNode(p_CcNode);
4716852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_NO_MEMORY,
4717852ba100SJustin Hibbits                      ("MURAM allocation for CC node action descriptors table"));
4718852ba100SJustin Hibbits     }
4719852ba100SJustin Hibbits     MemSet8((uint8_t *)p_CcNode->h_AdTable, 0, adTableSize);
4720852ba100SJustin Hibbits 
4721852ba100SJustin Hibbits     p_KeysMatchTblTmp = p_CcNode->h_KeysMatchTable;
4722852ba100SJustin Hibbits     p_AdTableTmp = p_CcNode->h_AdTable;
4723852ba100SJustin Hibbits 
4724852ba100SJustin Hibbits     /* For each key, create the key and the next step AD */
4725852ba100SJustin Hibbits     for (tmp = 0; tmp < p_CcNode->numOfKeys; tmp++)
4726852ba100SJustin Hibbits     {
4727852ba100SJustin Hibbits         p_KeyParams = &p_CcNodeParam->keysParams.keyParams[tmp];
4728852ba100SJustin Hibbits 
4729852ba100SJustin Hibbits         if (p_KeysMatchTblTmp)
4730852ba100SJustin Hibbits         {
4731852ba100SJustin Hibbits             /* Copy the key */
4732852ba100SJustin Hibbits             MemCpy8((void*)p_KeysMatchTblTmp, p_KeyParams->p_Key,
4733852ba100SJustin Hibbits                         p_CcNode->sizeOfExtraction);
4734852ba100SJustin Hibbits 
4735852ba100SJustin Hibbits             /* Copy the key mask or initialize it to 0xFF..F */
4736852ba100SJustin Hibbits             if (p_CcNode->lclMask && p_KeyParams->p_Mask)
4737852ba100SJustin Hibbits             {
4738852ba100SJustin Hibbits                 MemCpy8(PTR_MOVE(p_KeysMatchTblTmp,
4739852ba100SJustin Hibbits                         p_CcNode->ccKeySizeAccExtraction), /* User's size of extraction rounded up to a valid matching table entry size */
4740852ba100SJustin Hibbits                             p_KeyParams->p_Mask, p_CcNode->sizeOfExtraction); /* Exact size of extraction as received from the user */
4741852ba100SJustin Hibbits             }
4742852ba100SJustin Hibbits             else
4743852ba100SJustin Hibbits                 if (p_CcNode->lclMask)
4744852ba100SJustin Hibbits                 {
4745852ba100SJustin Hibbits                     MemSet8(PTR_MOVE(p_KeysMatchTblTmp,
4746852ba100SJustin Hibbits                             p_CcNode->ccKeySizeAccExtraction), /* User's size of extraction rounded up to a valid matching table entry size */
4747852ba100SJustin Hibbits                                0xff, p_CcNode->sizeOfExtraction); /* Exact size of extraction as received from the user */
4748852ba100SJustin Hibbits                 }
4749852ba100SJustin Hibbits 
4750852ba100SJustin Hibbits             p_KeysMatchTblTmp =
4751852ba100SJustin Hibbits                     PTR_MOVE(p_KeysMatchTblTmp, keySize * sizeof(uint8_t));
4752852ba100SJustin Hibbits         }
4753852ba100SJustin Hibbits 
4754852ba100SJustin Hibbits         /* Create the next action descriptor in the match table */
4755852ba100SJustin Hibbits         if (p_KeyParams->ccNextEngineParams.statisticsEn)
4756852ba100SJustin Hibbits         {
4757852ba100SJustin Hibbits             p_StatsObj = GetStatsObj(p_CcNode);
4758852ba100SJustin Hibbits             ASSERT_COND(p_StatsObj);
4759852ba100SJustin Hibbits 
4760852ba100SJustin Hibbits             statsParams.h_StatsAd = p_StatsObj->h_StatsAd;
4761852ba100SJustin Hibbits             statsParams.h_StatsCounters = p_StatsObj->h_StatsCounters;
4762852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
4763852ba100SJustin Hibbits             statsParams.h_StatsFLRs = p_CcNode->h_StatsFLRs;
4764852ba100SJustin Hibbits 
4765852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
4766852ba100SJustin Hibbits             NextStepAd(p_AdTableTmp, &statsParams,
4767852ba100SJustin Hibbits                        &p_KeyParams->ccNextEngineParams, p_FmPcd);
4768852ba100SJustin Hibbits 
4769852ba100SJustin Hibbits             p_CcNode->keyAndNextEngineParams[tmp].p_StatsObj = p_StatsObj;
4770852ba100SJustin Hibbits         }
4771852ba100SJustin Hibbits         else
4772852ba100SJustin Hibbits         {
4773852ba100SJustin Hibbits             NextStepAd(p_AdTableTmp, NULL, &p_KeyParams->ccNextEngineParams,
4774852ba100SJustin Hibbits                        p_FmPcd);
4775852ba100SJustin Hibbits 
4776852ba100SJustin Hibbits             p_CcNode->keyAndNextEngineParams[tmp].p_StatsObj = NULL;
4777852ba100SJustin Hibbits         }
4778852ba100SJustin Hibbits 
4779852ba100SJustin Hibbits         p_AdTableTmp = PTR_MOVE(p_AdTableTmp, FM_PCD_CC_AD_ENTRY_SIZE);
4780852ba100SJustin Hibbits     }
4781852ba100SJustin Hibbits 
4782852ba100SJustin Hibbits     /* Update next engine for the 'miss' entry */
4783852ba100SJustin Hibbits     if (p_CcNodeParam->keysParams.ccNextEngineParamsForMiss.statisticsEn)
4784852ba100SJustin Hibbits     {
4785852ba100SJustin Hibbits         p_StatsObj = GetStatsObj(p_CcNode);
4786852ba100SJustin Hibbits         ASSERT_COND(p_StatsObj);
4787852ba100SJustin Hibbits 
4788852ba100SJustin Hibbits         /* All 'bucket' nodes of a hash table should share the same statistics counters,
4789852ba100SJustin Hibbits          allocated by the hash table. So, if this node is a bucket of a hash table,
4790852ba100SJustin Hibbits          we'll replace the locally allocated counters with the shared counters. */
4791852ba100SJustin Hibbits         if (p_CcNode->isHashBucket)
4792852ba100SJustin Hibbits         {
4793852ba100SJustin Hibbits             ASSERT_COND(p_CcNode->h_MissStatsCounters);
4794852ba100SJustin Hibbits 
4795852ba100SJustin Hibbits             /* Store original counters pointer and replace it with mutual preallocated pointer */
4796852ba100SJustin Hibbits             p_CcNode->h_PrivMissStatsCounters = p_StatsObj->h_StatsCounters;
4797852ba100SJustin Hibbits             p_StatsObj->h_StatsCounters = p_CcNode->h_MissStatsCounters;
4798852ba100SJustin Hibbits         }
4799852ba100SJustin Hibbits 
4800852ba100SJustin Hibbits         statsParams.h_StatsAd = p_StatsObj->h_StatsAd;
4801852ba100SJustin Hibbits         statsParams.h_StatsCounters = p_StatsObj->h_StatsCounters;
4802852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
4803852ba100SJustin Hibbits         statsParams.h_StatsFLRs = p_CcNode->h_StatsFLRs;
4804852ba100SJustin Hibbits 
4805852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
4806852ba100SJustin Hibbits 
4807852ba100SJustin Hibbits         NextStepAd(p_AdTableTmp, &statsParams,
4808852ba100SJustin Hibbits                    &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
4809852ba100SJustin Hibbits                    p_FmPcd);
4810852ba100SJustin Hibbits 
4811852ba100SJustin Hibbits         p_CcNode->keyAndNextEngineParams[tmp].p_StatsObj = p_StatsObj;
4812852ba100SJustin Hibbits     }
4813852ba100SJustin Hibbits     else
4814852ba100SJustin Hibbits     {
4815852ba100SJustin Hibbits         NextStepAd(p_AdTableTmp, NULL,
4816852ba100SJustin Hibbits                    &p_CcNodeParam->keysParams.ccNextEngineParamsForMiss,
4817852ba100SJustin Hibbits                    p_FmPcd);
4818852ba100SJustin Hibbits 
4819852ba100SJustin Hibbits         p_CcNode->keyAndNextEngineParams[tmp].p_StatsObj = NULL;
4820852ba100SJustin Hibbits     }
4821852ba100SJustin Hibbits 
4822852ba100SJustin Hibbits     /* This parameter will be used to initialize the "key length" field in the action descriptor
4823852ba100SJustin Hibbits      that points to this node and it should be 0 for full field extraction */
4824852ba100SJustin Hibbits     if (fullField == TRUE)
4825852ba100SJustin Hibbits         p_CcNode->sizeOfExtraction = 0;
4826852ba100SJustin Hibbits 
4827852ba100SJustin Hibbits     for (tmp = 0; tmp < MIN(p_CcNode->numOfKeys + 1, CC_MAX_NUM_OF_KEYS); tmp++)
4828852ba100SJustin Hibbits     {
4829852ba100SJustin Hibbits         if (p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.nextEngine
4830852ba100SJustin Hibbits                 == e_FM_PCD_CC)
4831852ba100SJustin Hibbits         {
4832852ba100SJustin Hibbits             p_FmPcdCcNextNode =
4833852ba100SJustin Hibbits                     (t_FmPcdCcNode*)p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.params.ccParams.h_CcNode;
4834852ba100SJustin Hibbits             p_CcInformation = FindNodeInfoInReleventLst(
4835852ba100SJustin Hibbits                     &p_FmPcdCcNextNode->ccPrevNodesLst, (t_Handle)p_CcNode,
4836852ba100SJustin Hibbits                     p_FmPcdCcNextNode->h_Spinlock);
4837852ba100SJustin Hibbits             if (!p_CcInformation)
4838852ba100SJustin Hibbits             {
4839852ba100SJustin Hibbits                 memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
4840852ba100SJustin Hibbits                 ccNodeInfo.h_CcNode = (t_Handle)p_CcNode;
4841852ba100SJustin Hibbits                 ccNodeInfo.index = 1;
4842852ba100SJustin Hibbits                 EnqueueNodeInfoToRelevantLst(&p_FmPcdCcNextNode->ccPrevNodesLst,
4843852ba100SJustin Hibbits                                              &ccNodeInfo,
4844852ba100SJustin Hibbits                                              p_FmPcdCcNextNode->h_Spinlock);
4845852ba100SJustin Hibbits             }
4846852ba100SJustin Hibbits             else
4847852ba100SJustin Hibbits                 p_CcInformation->index++;
4848852ba100SJustin Hibbits 
4849852ba100SJustin Hibbits             if (p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.h_Manip)
4850852ba100SJustin Hibbits             {
4851852ba100SJustin Hibbits                 h_Manip =
4852852ba100SJustin Hibbits                         p_CcNode->keyAndNextEngineParams[tmp].nextEngineParams.h_Manip;
4853852ba100SJustin Hibbits                 p_CcInformation = FindNodeInfoInReleventLst(
4854852ba100SJustin Hibbits                         FmPcdManipGetNodeLstPointedOnThisManip(h_Manip),
4855852ba100SJustin Hibbits                         (t_Handle)p_CcNode, FmPcdManipGetSpinlock(h_Manip));
4856852ba100SJustin Hibbits                 if (!p_CcInformation)
4857852ba100SJustin Hibbits                 {
4858852ba100SJustin Hibbits                     memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
4859852ba100SJustin Hibbits                     ccNodeInfo.h_CcNode = (t_Handle)p_CcNode;
4860852ba100SJustin Hibbits                     ccNodeInfo.index = 1;
4861852ba100SJustin Hibbits                     EnqueueNodeInfoToRelevantLst(
4862852ba100SJustin Hibbits                             FmPcdManipGetNodeLstPointedOnThisManip(h_Manip),
4863852ba100SJustin Hibbits                             &ccNodeInfo, FmPcdManipGetSpinlock(h_Manip));
4864852ba100SJustin Hibbits                 }
4865852ba100SJustin Hibbits                 else
4866852ba100SJustin Hibbits                     p_CcInformation->index++;
4867852ba100SJustin Hibbits             }
4868852ba100SJustin Hibbits         }
4869852ba100SJustin Hibbits     }
4870852ba100SJustin Hibbits 
4871852ba100SJustin Hibbits     p_AdTableTmp = p_CcNode->h_AdTable;
4872852ba100SJustin Hibbits 
4873852ba100SJustin Hibbits     if (!FmPcdLockTryLockAll(h_FmPcd))
4874852ba100SJustin Hibbits     {
4875852ba100SJustin Hibbits         FM_PCD_MatchTableDelete((t_Handle)p_CcNode);
4876852ba100SJustin Hibbits         DBG(TRACE, ("FmPcdLockTryLockAll failed"));
4877852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
4878852ba100SJustin Hibbits     }
4879852ba100SJustin Hibbits 
4880852ba100SJustin Hibbits     /* Required action for each next engine */
4881852ba100SJustin Hibbits     for (tmp = 0; tmp < MIN(p_CcNode->numOfKeys + 1, CC_MAX_NUM_OF_KEYS); tmp++)
4882852ba100SJustin Hibbits     {
4883852ba100SJustin Hibbits         if (p_CcNode->keyAndNextEngineParams[tmp].requiredAction)
4884852ba100SJustin Hibbits         {
4885852ba100SJustin Hibbits             err = SetRequiredAction(
4886852ba100SJustin Hibbits                     h_FmPcd,
4887852ba100SJustin Hibbits                     p_CcNode->keyAndNextEngineParams[tmp].requiredAction,
4888852ba100SJustin Hibbits                     &p_CcNode->keyAndNextEngineParams[tmp], p_AdTableTmp, 1,
4889852ba100SJustin Hibbits                     NULL);
4890852ba100SJustin Hibbits             if (err)
4891852ba100SJustin Hibbits             {
4892852ba100SJustin Hibbits                 FmPcdLockUnlockAll(h_FmPcd);
4893852ba100SJustin Hibbits                 FM_PCD_MatchTableDelete((t_Handle)p_CcNode);
4894852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, err, NO_MSG);
4895852ba100SJustin Hibbits             }
4896852ba100SJustin Hibbits             p_AdTableTmp = PTR_MOVE(p_AdTableTmp, FM_PCD_CC_AD_ENTRY_SIZE);
4897852ba100SJustin Hibbits         }
4898852ba100SJustin Hibbits     }
4899852ba100SJustin Hibbits 
4900852ba100SJustin Hibbits     FmPcdLockUnlockAll(h_FmPcd);
4901852ba100SJustin Hibbits 
4902852ba100SJustin Hibbits     return E_OK;
4903852ba100SJustin Hibbits }
4904852ba100SJustin Hibbits /************************** End of static functions **************************/
4905852ba100SJustin Hibbits 
4906852ba100SJustin Hibbits /*****************************************************************************/
4907852ba100SJustin Hibbits /*              Inter-module API routines                                    */
4908852ba100SJustin Hibbits /*****************************************************************************/
4909852ba100SJustin Hibbits 
FindNodeInfoInReleventLst(t_List * p_List,t_Handle h_Info,t_Handle h_Spinlock)4910852ba100SJustin Hibbits t_CcNodeInformation* FindNodeInfoInReleventLst(t_List *p_List, t_Handle h_Info,
4911852ba100SJustin Hibbits                                                t_Handle h_Spinlock)
4912852ba100SJustin Hibbits {
4913852ba100SJustin Hibbits     t_CcNodeInformation *p_CcInformation;
4914852ba100SJustin Hibbits     t_List *p_Pos;
4915852ba100SJustin Hibbits     uint32_t intFlags;
4916852ba100SJustin Hibbits 
4917852ba100SJustin Hibbits     intFlags = XX_LockIntrSpinlock(h_Spinlock);
4918852ba100SJustin Hibbits 
4919852ba100SJustin Hibbits     for (p_Pos = NCSW_LIST_FIRST(p_List); p_Pos != (p_List);
4920852ba100SJustin Hibbits             p_Pos = NCSW_LIST_NEXT(p_Pos))
4921852ba100SJustin Hibbits     {
4922852ba100SJustin Hibbits         p_CcInformation = CC_NODE_F_OBJECT(p_Pos);
4923852ba100SJustin Hibbits 
4924852ba100SJustin Hibbits         ASSERT_COND(p_CcInformation->h_CcNode);
4925852ba100SJustin Hibbits 
4926852ba100SJustin Hibbits         if (p_CcInformation->h_CcNode == h_Info)
4927852ba100SJustin Hibbits         {
4928852ba100SJustin Hibbits             XX_UnlockIntrSpinlock(h_Spinlock, intFlags);
4929852ba100SJustin Hibbits             return p_CcInformation;
4930852ba100SJustin Hibbits         }
4931852ba100SJustin Hibbits     }
4932852ba100SJustin Hibbits 
4933852ba100SJustin Hibbits     XX_UnlockIntrSpinlock(h_Spinlock, intFlags);
4934852ba100SJustin Hibbits 
4935852ba100SJustin Hibbits     return NULL;
4936852ba100SJustin Hibbits }
4937852ba100SJustin Hibbits 
EnqueueNodeInfoToRelevantLst(t_List * p_List,t_CcNodeInformation * p_CcInfo,t_Handle h_Spinlock)4938852ba100SJustin Hibbits void EnqueueNodeInfoToRelevantLst(t_List *p_List, t_CcNodeInformation *p_CcInfo,
4939852ba100SJustin Hibbits                                   t_Handle h_Spinlock)
4940852ba100SJustin Hibbits {
4941852ba100SJustin Hibbits     t_CcNodeInformation *p_CcInformation;
4942852ba100SJustin Hibbits     uint32_t intFlags = 0;
4943852ba100SJustin Hibbits 
4944852ba100SJustin Hibbits     p_CcInformation = (t_CcNodeInformation *)XX_Malloc(
4945852ba100SJustin Hibbits             sizeof(t_CcNodeInformation));
4946852ba100SJustin Hibbits 
4947852ba100SJustin Hibbits     if (p_CcInformation)
4948852ba100SJustin Hibbits     {
4949852ba100SJustin Hibbits         memset(p_CcInformation, 0, sizeof(t_CcNodeInformation));
4950852ba100SJustin Hibbits         memcpy(p_CcInformation, p_CcInfo, sizeof(t_CcNodeInformation));
4951852ba100SJustin Hibbits         INIT_LIST(&p_CcInformation->node);
4952852ba100SJustin Hibbits 
4953852ba100SJustin Hibbits         if (h_Spinlock)
4954852ba100SJustin Hibbits             intFlags = XX_LockIntrSpinlock(h_Spinlock);
4955852ba100SJustin Hibbits 
4956852ba100SJustin Hibbits         NCSW_LIST_AddToTail(&p_CcInformation->node, p_List);
4957852ba100SJustin Hibbits 
4958852ba100SJustin Hibbits         if (h_Spinlock)
4959852ba100SJustin Hibbits             XX_UnlockIntrSpinlock(h_Spinlock, intFlags);
4960852ba100SJustin Hibbits     }
4961852ba100SJustin Hibbits     else
4962852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("CC Node Information"));
4963852ba100SJustin Hibbits }
4964852ba100SJustin Hibbits 
DequeueNodeInfoFromRelevantLst(t_List * p_List,t_Handle h_Info,t_Handle h_Spinlock)4965852ba100SJustin Hibbits void DequeueNodeInfoFromRelevantLst(t_List *p_List, t_Handle h_Info,
4966852ba100SJustin Hibbits                                     t_Handle h_Spinlock)
4967852ba100SJustin Hibbits {
4968852ba100SJustin Hibbits     t_CcNodeInformation *p_CcInformation = NULL;
4969852ba100SJustin Hibbits     uint32_t intFlags = 0;
4970852ba100SJustin Hibbits     t_List *p_Pos;
4971852ba100SJustin Hibbits 
4972852ba100SJustin Hibbits     if (h_Spinlock)
4973852ba100SJustin Hibbits         intFlags = XX_LockIntrSpinlock(h_Spinlock);
4974852ba100SJustin Hibbits 
4975852ba100SJustin Hibbits     if (NCSW_LIST_IsEmpty(p_List))
4976852ba100SJustin Hibbits     {
4977852ba100SJustin Hibbits         XX_RestoreAllIntr(intFlags);
4978852ba100SJustin Hibbits         return;
4979852ba100SJustin Hibbits     }
4980852ba100SJustin Hibbits 
4981852ba100SJustin Hibbits     for (p_Pos = NCSW_LIST_FIRST(p_List); p_Pos != (p_List);
4982852ba100SJustin Hibbits             p_Pos = NCSW_LIST_NEXT(p_Pos))
4983852ba100SJustin Hibbits     {
4984852ba100SJustin Hibbits         p_CcInformation = CC_NODE_F_OBJECT(p_Pos);
4985852ba100SJustin Hibbits         ASSERT_COND(p_CcInformation);
4986852ba100SJustin Hibbits         ASSERT_COND(p_CcInformation->h_CcNode);
4987852ba100SJustin Hibbits         if (p_CcInformation->h_CcNode == h_Info)
4988852ba100SJustin Hibbits             break;
4989852ba100SJustin Hibbits     }
4990852ba100SJustin Hibbits 
4991852ba100SJustin Hibbits     if (p_CcInformation)
4992852ba100SJustin Hibbits     {
4993852ba100SJustin Hibbits         NCSW_LIST_DelAndInit(&p_CcInformation->node);
4994852ba100SJustin Hibbits         XX_Free(p_CcInformation);
4995852ba100SJustin Hibbits     }
4996852ba100SJustin Hibbits 
4997852ba100SJustin Hibbits     if (h_Spinlock)
4998852ba100SJustin Hibbits         XX_UnlockIntrSpinlock(h_Spinlock, intFlags);
4999852ba100SJustin Hibbits }
5000852ba100SJustin Hibbits 
NextStepAd(t_Handle h_Ad,t_FmPcdCcStatsParams * p_FmPcdCcStatsParams,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams,t_FmPcd * p_FmPcd)5001852ba100SJustin Hibbits void NextStepAd(t_Handle h_Ad, t_FmPcdCcStatsParams *p_FmPcdCcStatsParams,
5002852ba100SJustin Hibbits                 t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams,
5003852ba100SJustin Hibbits                 t_FmPcd *p_FmPcd)
5004852ba100SJustin Hibbits {
5005852ba100SJustin Hibbits     switch (p_FmPcdCcNextEngineParams->nextEngine)
5006852ba100SJustin Hibbits     {
5007852ba100SJustin Hibbits         case (e_FM_PCD_KG):
5008852ba100SJustin Hibbits         case (e_FM_PCD_PLCR):
5009852ba100SJustin Hibbits         case (e_FM_PCD_DONE):
5010852ba100SJustin Hibbits             /* if NIA is not CC, create a "result" type AD */
5011852ba100SJustin Hibbits             FillAdOfTypeResult(h_Ad, p_FmPcdCcStatsParams, p_FmPcd,
5012852ba100SJustin Hibbits                                p_FmPcdCcNextEngineParams);
5013852ba100SJustin Hibbits             break;
5014852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
5015852ba100SJustin Hibbits         case (e_FM_PCD_FR):
5016852ba100SJustin Hibbits             if (p_FmPcdCcNextEngineParams->params.frParams.h_FrmReplic)
5017852ba100SJustin Hibbits             {
5018852ba100SJustin Hibbits                 FillAdOfTypeContLookup(
5019852ba100SJustin Hibbits                         h_Ad, p_FmPcdCcStatsParams, p_FmPcd,
5020852ba100SJustin Hibbits                         p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode,
5021852ba100SJustin Hibbits                         p_FmPcdCcNextEngineParams->h_Manip,
5022852ba100SJustin Hibbits                         p_FmPcdCcNextEngineParams->params.frParams.h_FrmReplic);
5023852ba100SJustin Hibbits                 FrmReplicGroupUpdateOwner(
5024852ba100SJustin Hibbits                         p_FmPcdCcNextEngineParams->params.frParams.h_FrmReplic,
5025852ba100SJustin Hibbits                         TRUE/* add */);
5026852ba100SJustin Hibbits             }
5027852ba100SJustin Hibbits             break;
5028852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
5029852ba100SJustin Hibbits 
5030852ba100SJustin Hibbits         case (e_FM_PCD_CC):
5031852ba100SJustin Hibbits             /* if NIA is not CC, create a TD to continue the CC lookup */
5032852ba100SJustin Hibbits             FillAdOfTypeContLookup(
5033852ba100SJustin Hibbits                     h_Ad, p_FmPcdCcStatsParams, p_FmPcd,
5034852ba100SJustin Hibbits                     p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode,
5035852ba100SJustin Hibbits                     p_FmPcdCcNextEngineParams->h_Manip, NULL);
5036852ba100SJustin Hibbits 
5037852ba100SJustin Hibbits             UpdateNodeOwner(p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode,
5038852ba100SJustin Hibbits                             TRUE);
5039852ba100SJustin Hibbits             break;
5040852ba100SJustin Hibbits 
5041852ba100SJustin Hibbits         default:
5042852ba100SJustin Hibbits             return;
5043852ba100SJustin Hibbits     }
5044852ba100SJustin Hibbits }
5045852ba100SJustin Hibbits 
FmPcdCcTreeAddIPR(t_Handle h_FmPcd,t_Handle h_FmTree,t_Handle h_NetEnv,t_Handle h_IpReassemblyManip,bool createSchemes)5046852ba100SJustin Hibbits t_Error FmPcdCcTreeAddIPR(t_Handle h_FmPcd, t_Handle h_FmTree,
5047852ba100SJustin Hibbits                           t_Handle h_NetEnv, t_Handle h_IpReassemblyManip,
5048852ba100SJustin Hibbits                           bool createSchemes)
5049852ba100SJustin Hibbits {
5050852ba100SJustin Hibbits     t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmTree;
5051852ba100SJustin Hibbits     t_FmPcdCcNextEngineParams nextEngineParams;
5052852ba100SJustin Hibbits     t_NetEnvParams netEnvParams;
5053852ba100SJustin Hibbits     t_Handle h_Ad;
5054852ba100SJustin Hibbits     bool isIpv6Present;
5055852ba100SJustin Hibbits     uint8_t ipv4GroupId, ipv6GroupId;
5056852ba100SJustin Hibbits     t_Error err;
5057852ba100SJustin Hibbits 
5058852ba100SJustin Hibbits     ASSERT_COND(p_FmPcdCcTree);
5059852ba100SJustin Hibbits 
5060852ba100SJustin Hibbits     /* this routine must be protected by the calling routine! */
5061852ba100SJustin Hibbits 
5062852ba100SJustin Hibbits     memset(&nextEngineParams, 0, sizeof(t_FmPcdCcNextEngineParams));
5063852ba100SJustin Hibbits     memset(&netEnvParams, 0, sizeof(t_NetEnvParams));
5064852ba100SJustin Hibbits 
5065852ba100SJustin Hibbits     h_Ad = UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr);
5066852ba100SJustin Hibbits 
5067852ba100SJustin Hibbits     isIpv6Present = FmPcdManipIpReassmIsIpv6Hdr(h_IpReassemblyManip);
5068852ba100SJustin Hibbits 
5069852ba100SJustin Hibbits     if (isIpv6Present
5070852ba100SJustin Hibbits             && (p_FmPcdCcTree->numOfEntries > (FM_PCD_MAX_NUM_OF_CC_GROUPS - 2)))
5071852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("need two free entries for IPR"));
5072852ba100SJustin Hibbits 
5073852ba100SJustin Hibbits     if (p_FmPcdCcTree->numOfEntries > (FM_PCD_MAX_NUM_OF_CC_GROUPS - 1))
5074852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("need two free entries for IPR"));
5075852ba100SJustin Hibbits 
5076852ba100SJustin Hibbits     nextEngineParams.nextEngine = e_FM_PCD_DONE;
5077852ba100SJustin Hibbits     nextEngineParams.h_Manip = h_IpReassemblyManip;
5078852ba100SJustin Hibbits 
5079852ba100SJustin Hibbits     /* Lock tree */
5080852ba100SJustin Hibbits     err = CcRootTryLock(p_FmPcdCcTree);
5081852ba100SJustin Hibbits     if (err)
5082852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
5083852ba100SJustin Hibbits 
5084852ba100SJustin Hibbits     if (p_FmPcdCcTree->h_IpReassemblyManip == h_IpReassemblyManip)
5085852ba100SJustin Hibbits     {
5086852ba100SJustin Hibbits         CcRootReleaseLock(p_FmPcdCcTree);
5087852ba100SJustin Hibbits         return E_OK;
5088852ba100SJustin Hibbits     }
5089852ba100SJustin Hibbits 
5090852ba100SJustin Hibbits     if ((p_FmPcdCcTree->h_IpReassemblyManip)
5091852ba100SJustin Hibbits             && (p_FmPcdCcTree->h_IpReassemblyManip != h_IpReassemblyManip))
5092852ba100SJustin Hibbits     {
5093852ba100SJustin Hibbits         CcRootReleaseLock(p_FmPcdCcTree);
5094852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE,
5095852ba100SJustin Hibbits                      ("This tree was previously updated with different IPR"));
5096852ba100SJustin Hibbits     }
5097852ba100SJustin Hibbits 
5098852ba100SJustin Hibbits     /* Initialize IPR for the first time for this tree */
5099852ba100SJustin Hibbits     if (isIpv6Present)
5100852ba100SJustin Hibbits     {
5101852ba100SJustin Hibbits         ipv6GroupId = p_FmPcdCcTree->numOfGrps++;
5102852ba100SJustin Hibbits         p_FmPcdCcTree->fmPcdGroupParam[ipv6GroupId].baseGroupEntry =
5103852ba100SJustin Hibbits                 (FM_PCD_MAX_NUM_OF_CC_GROUPS - 2);
5104852ba100SJustin Hibbits 
5105852ba100SJustin Hibbits         if (createSchemes)
5106852ba100SJustin Hibbits         {
5107852ba100SJustin Hibbits             err = FmPcdManipBuildIpReassmScheme(h_FmPcd, h_NetEnv,
5108852ba100SJustin Hibbits                                                 p_FmPcdCcTree,
5109852ba100SJustin Hibbits                                                 h_IpReassemblyManip, FALSE,
5110852ba100SJustin Hibbits                                                 ipv6GroupId);
5111852ba100SJustin Hibbits             if (err)
5112852ba100SJustin Hibbits             {
5113852ba100SJustin Hibbits                 p_FmPcdCcTree->numOfGrps--;
5114852ba100SJustin Hibbits                 CcRootReleaseLock(p_FmPcdCcTree);
5115852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, err, NO_MSG);
5116852ba100SJustin Hibbits             }
5117852ba100SJustin Hibbits         }
5118852ba100SJustin Hibbits 
5119852ba100SJustin Hibbits         NextStepAd(
5120852ba100SJustin Hibbits                 PTR_MOVE(h_Ad, (FM_PCD_MAX_NUM_OF_CC_GROUPS-2) * FM_PCD_CC_AD_ENTRY_SIZE),
5121852ba100SJustin Hibbits                 NULL, &nextEngineParams, h_FmPcd);
5122852ba100SJustin Hibbits     }
5123852ba100SJustin Hibbits 
5124852ba100SJustin Hibbits     ipv4GroupId = p_FmPcdCcTree->numOfGrps++;
5125852ba100SJustin Hibbits     p_FmPcdCcTree->fmPcdGroupParam[ipv4GroupId].totalBitsMask = 0;
5126852ba100SJustin Hibbits     p_FmPcdCcTree->fmPcdGroupParam[ipv4GroupId].baseGroupEntry =
5127852ba100SJustin Hibbits             (FM_PCD_MAX_NUM_OF_CC_GROUPS - 1);
5128852ba100SJustin Hibbits 
5129852ba100SJustin Hibbits     if (createSchemes)
5130852ba100SJustin Hibbits     {
5131852ba100SJustin Hibbits         err = FmPcdManipBuildIpReassmScheme(h_FmPcd, h_NetEnv, p_FmPcdCcTree,
5132852ba100SJustin Hibbits                                             h_IpReassemblyManip, TRUE,
5133852ba100SJustin Hibbits                                             ipv4GroupId);
5134852ba100SJustin Hibbits         if (err)
5135852ba100SJustin Hibbits         {
5136852ba100SJustin Hibbits             p_FmPcdCcTree->numOfGrps--;
5137852ba100SJustin Hibbits             if (isIpv6Present)
5138852ba100SJustin Hibbits             {
5139852ba100SJustin Hibbits                 p_FmPcdCcTree->numOfGrps--;
5140852ba100SJustin Hibbits                 FmPcdManipDeleteIpReassmSchemes(h_IpReassemblyManip);
5141852ba100SJustin Hibbits             }
5142852ba100SJustin Hibbits             CcRootReleaseLock(p_FmPcdCcTree);
5143852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, err, NO_MSG);
5144852ba100SJustin Hibbits         }
5145852ba100SJustin Hibbits     }
5146852ba100SJustin Hibbits 
5147852ba100SJustin Hibbits     NextStepAd(
5148852ba100SJustin Hibbits             PTR_MOVE(h_Ad, (FM_PCD_MAX_NUM_OF_CC_GROUPS-1) * FM_PCD_CC_AD_ENTRY_SIZE),
5149852ba100SJustin Hibbits             NULL, &nextEngineParams, h_FmPcd);
5150852ba100SJustin Hibbits 
5151852ba100SJustin Hibbits     p_FmPcdCcTree->h_IpReassemblyManip = h_IpReassemblyManip;
5152852ba100SJustin Hibbits 
5153852ba100SJustin Hibbits     CcRootReleaseLock(p_FmPcdCcTree);
5154852ba100SJustin Hibbits 
5155852ba100SJustin Hibbits     return E_OK;
5156852ba100SJustin Hibbits }
5157852ba100SJustin Hibbits 
FmPcdCcTreeAddCPR(t_Handle h_FmPcd,t_Handle h_FmTree,t_Handle h_NetEnv,t_Handle h_ReassemblyManip,bool createSchemes)5158852ba100SJustin Hibbits t_Error FmPcdCcTreeAddCPR(t_Handle h_FmPcd, t_Handle h_FmTree,
5159852ba100SJustin Hibbits                           t_Handle h_NetEnv, t_Handle h_ReassemblyManip,
5160852ba100SJustin Hibbits                           bool createSchemes)
5161852ba100SJustin Hibbits {
5162852ba100SJustin Hibbits     t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmTree;
5163852ba100SJustin Hibbits     t_FmPcdCcNextEngineParams nextEngineParams;
5164852ba100SJustin Hibbits     t_NetEnvParams netEnvParams;
5165852ba100SJustin Hibbits     t_Handle h_Ad;
5166852ba100SJustin Hibbits     uint8_t groupId;
5167852ba100SJustin Hibbits     t_Error err;
5168852ba100SJustin Hibbits 
5169852ba100SJustin Hibbits     ASSERT_COND(p_FmPcdCcTree);
5170852ba100SJustin Hibbits 
5171852ba100SJustin Hibbits     /* this routine must be protected by the calling routine! */
5172852ba100SJustin Hibbits     memset(&nextEngineParams, 0, sizeof(t_FmPcdCcNextEngineParams));
5173852ba100SJustin Hibbits     memset(&netEnvParams, 0, sizeof(t_NetEnvParams));
5174852ba100SJustin Hibbits 
5175852ba100SJustin Hibbits     h_Ad = UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr);
5176852ba100SJustin Hibbits 
5177852ba100SJustin Hibbits     if (p_FmPcdCcTree->numOfEntries > (FM_PCD_MAX_NUM_OF_CC_GROUPS - 1))
5178852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("need one free entries for CPR"));
5179852ba100SJustin Hibbits 
5180852ba100SJustin Hibbits     nextEngineParams.nextEngine = e_FM_PCD_DONE;
5181852ba100SJustin Hibbits     nextEngineParams.h_Manip = h_ReassemblyManip;
5182852ba100SJustin Hibbits 
5183852ba100SJustin Hibbits     /* Lock tree */
5184852ba100SJustin Hibbits     err = CcRootTryLock(p_FmPcdCcTree);
5185852ba100SJustin Hibbits     if (err)
5186852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
5187852ba100SJustin Hibbits 
5188852ba100SJustin Hibbits     if (p_FmPcdCcTree->h_CapwapReassemblyManip == h_ReassemblyManip)
5189852ba100SJustin Hibbits     {
5190852ba100SJustin Hibbits         CcRootReleaseLock(p_FmPcdCcTree);
5191852ba100SJustin Hibbits         return E_OK;
5192852ba100SJustin Hibbits     }
5193852ba100SJustin Hibbits 
5194852ba100SJustin Hibbits     if ((p_FmPcdCcTree->h_CapwapReassemblyManip)
5195852ba100SJustin Hibbits             && (p_FmPcdCcTree->h_CapwapReassemblyManip != h_ReassemblyManip))
5196852ba100SJustin Hibbits     {
5197852ba100SJustin Hibbits         CcRootReleaseLock(p_FmPcdCcTree);
5198852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE,
5199852ba100SJustin Hibbits                      ("This tree was previously updated with different CPR"));
5200852ba100SJustin Hibbits     }
5201852ba100SJustin Hibbits 
5202852ba100SJustin Hibbits     groupId = p_FmPcdCcTree->numOfGrps++;
5203852ba100SJustin Hibbits     p_FmPcdCcTree->fmPcdGroupParam[groupId].baseGroupEntry =
5204852ba100SJustin Hibbits             (FM_PCD_MAX_NUM_OF_CC_GROUPS - 1);
5205852ba100SJustin Hibbits 
5206852ba100SJustin Hibbits     if (createSchemes)
5207852ba100SJustin Hibbits     {
5208852ba100SJustin Hibbits         err = FmPcdManipBuildCapwapReassmScheme(h_FmPcd, h_NetEnv,
5209852ba100SJustin Hibbits                                                 p_FmPcdCcTree,
5210852ba100SJustin Hibbits                                                 h_ReassemblyManip, groupId);
5211852ba100SJustin Hibbits         if (err)
5212852ba100SJustin Hibbits         {
5213852ba100SJustin Hibbits             p_FmPcdCcTree->numOfGrps--;
5214852ba100SJustin Hibbits             CcRootReleaseLock(p_FmPcdCcTree);
5215852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, err, NO_MSG);
5216852ba100SJustin Hibbits         }
5217852ba100SJustin Hibbits     }
5218852ba100SJustin Hibbits 
5219852ba100SJustin Hibbits     NextStepAd(
5220852ba100SJustin Hibbits             PTR_MOVE(h_Ad, (FM_PCD_MAX_NUM_OF_CC_GROUPS-1) * FM_PCD_CC_AD_ENTRY_SIZE),
5221852ba100SJustin Hibbits             NULL, &nextEngineParams, h_FmPcd);
5222852ba100SJustin Hibbits 
5223852ba100SJustin Hibbits     p_FmPcdCcTree->h_CapwapReassemblyManip = h_ReassemblyManip;
5224852ba100SJustin Hibbits 
5225852ba100SJustin Hibbits     CcRootReleaseLock(p_FmPcdCcTree);
5226852ba100SJustin Hibbits 
5227852ba100SJustin Hibbits     return E_OK;
5228852ba100SJustin Hibbits }
5229852ba100SJustin Hibbits 
FmPcdCcTreeGetSavedManipParams(t_Handle h_FmTree)5230852ba100SJustin Hibbits t_Handle FmPcdCcTreeGetSavedManipParams(t_Handle h_FmTree)
5231852ba100SJustin Hibbits {
5232852ba100SJustin Hibbits     t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmTree;
5233852ba100SJustin Hibbits 
5234852ba100SJustin Hibbits     ASSERT_COND(p_FmPcdCcTree);
5235852ba100SJustin Hibbits 
5236852ba100SJustin Hibbits     return p_FmPcdCcTree->h_FmPcdCcSavedManipParams;
5237852ba100SJustin Hibbits }
5238852ba100SJustin Hibbits 
FmPcdCcTreeSetSavedManipParams(t_Handle h_FmTree,t_Handle h_SavedManipParams)5239852ba100SJustin Hibbits void FmPcdCcTreeSetSavedManipParams(t_Handle h_FmTree,
5240852ba100SJustin Hibbits                                     t_Handle h_SavedManipParams)
5241852ba100SJustin Hibbits {
5242852ba100SJustin Hibbits     t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmTree;
5243852ba100SJustin Hibbits 
5244852ba100SJustin Hibbits     ASSERT_COND(p_FmPcdCcTree);
5245852ba100SJustin Hibbits 
5246852ba100SJustin Hibbits     p_FmPcdCcTree->h_FmPcdCcSavedManipParams = h_SavedManipParams;
5247852ba100SJustin Hibbits }
5248852ba100SJustin Hibbits 
FmPcdCcGetParseCode(t_Handle h_CcNode)5249852ba100SJustin Hibbits uint8_t FmPcdCcGetParseCode(t_Handle h_CcNode)
5250852ba100SJustin Hibbits {
5251852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
5252852ba100SJustin Hibbits 
5253852ba100SJustin Hibbits     ASSERT_COND(p_CcNode);
5254852ba100SJustin Hibbits 
5255852ba100SJustin Hibbits     return p_CcNode->parseCode;
5256852ba100SJustin Hibbits }
5257852ba100SJustin Hibbits 
FmPcdCcGetOffset(t_Handle h_CcNode)5258852ba100SJustin Hibbits uint8_t FmPcdCcGetOffset(t_Handle h_CcNode)
5259852ba100SJustin Hibbits {
5260852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
5261852ba100SJustin Hibbits 
5262852ba100SJustin Hibbits     ASSERT_COND(p_CcNode);
5263852ba100SJustin Hibbits 
5264852ba100SJustin Hibbits     return p_CcNode->offset;
5265852ba100SJustin Hibbits }
5266852ba100SJustin Hibbits 
FmPcdCcGetNumOfKeys(t_Handle h_CcNode)5267852ba100SJustin Hibbits uint16_t FmPcdCcGetNumOfKeys(t_Handle h_CcNode)
5268852ba100SJustin Hibbits {
5269852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
5270852ba100SJustin Hibbits 
5271852ba100SJustin Hibbits     ASSERT_COND(p_CcNode);
5272852ba100SJustin Hibbits 
5273852ba100SJustin Hibbits     return p_CcNode->numOfKeys;
5274852ba100SJustin Hibbits }
5275852ba100SJustin Hibbits 
FmPcdCcModifyNextEngineParamTree(t_Handle h_FmPcd,t_Handle h_FmPcdCcTree,uint8_t grpId,uint8_t index,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams)5276852ba100SJustin Hibbits t_Error FmPcdCcModifyNextEngineParamTree(
5277852ba100SJustin Hibbits         t_Handle h_FmPcd, t_Handle h_FmPcdCcTree, uint8_t grpId, uint8_t index,
5278852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
52790aeed3e9SJustin Hibbits {
52800aeed3e9SJustin Hibbits     t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree;
5281852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
5282852ba100SJustin Hibbits     t_List h_OldPointersLst, h_NewPointersLst;
52830aeed3e9SJustin Hibbits     uint16_t keyIndex;
52840aeed3e9SJustin Hibbits     t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
5285852ba100SJustin Hibbits     t_Error err = E_OK;
52860aeed3e9SJustin Hibbits 
5287852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
5288852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_FmPcdCcTree, E_INVALID_HANDLE);
52890aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR((grpId <= 7), E_INVALID_VALUE);
52900aeed3e9SJustin Hibbits 
52910aeed3e9SJustin Hibbits     if (grpId >= p_FmPcdCcTree->numOfGrps)
5292852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_HANDLE,
5293852ba100SJustin Hibbits                      ("grpId you asked > numOfGroup of relevant tree"));
52940aeed3e9SJustin Hibbits 
52950aeed3e9SJustin Hibbits     if (index >= p_FmPcdCcTree->fmPcdGroupParam[grpId].numOfEntriesInGroup)
52960aeed3e9SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("index > numOfEntriesInGroup"));
52970aeed3e9SJustin Hibbits 
5298852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)h_FmPcd;
52990aeed3e9SJustin Hibbits 
5300852ba100SJustin Hibbits     INIT_LIST(&h_OldPointersLst);
5301852ba100SJustin Hibbits     INIT_LIST(&h_NewPointersLst);
5302852ba100SJustin Hibbits 
5303852ba100SJustin Hibbits     keyIndex = (uint16_t)(p_FmPcdCcTree->fmPcdGroupParam[grpId].baseGroupEntry
5304852ba100SJustin Hibbits             + index);
5305852ba100SJustin Hibbits 
5306852ba100SJustin Hibbits     p_ModifyKeyParams = ModifyNodeCommonPart(p_FmPcdCcTree, keyIndex,
5307852ba100SJustin Hibbits                                              e_MODIFY_STATE_CHANGE, FALSE,
5308852ba100SJustin Hibbits                                              FALSE, TRUE);
5309852ba100SJustin Hibbits     if (!p_ModifyKeyParams)
53100aeed3e9SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
53110aeed3e9SJustin Hibbits 
53120aeed3e9SJustin Hibbits     p_ModifyKeyParams->tree = TRUE;
53130aeed3e9SJustin Hibbits 
5314852ba100SJustin Hibbits     if (p_FmPcd->p_CcShadow
5315852ba100SJustin Hibbits             && !TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
53160aeed3e9SJustin Hibbits     {
53170aeed3e9SJustin Hibbits         XX_Free(p_ModifyKeyParams);
5318852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
53190aeed3e9SJustin Hibbits     }
53200aeed3e9SJustin Hibbits 
5321852ba100SJustin Hibbits     err = BuildNewNodeModifyNextEngine(p_FmPcd, p_FmPcdCcTree, keyIndex,
5322852ba100SJustin Hibbits                                        p_FmPcdCcNextEngineParams,
5323852ba100SJustin Hibbits                                        &h_OldPointersLst, &h_NewPointersLst,
5324852ba100SJustin Hibbits                                        p_ModifyKeyParams);
53250aeed3e9SJustin Hibbits     if (err)
53260aeed3e9SJustin Hibbits     {
53270aeed3e9SJustin Hibbits         XX_Free(p_ModifyKeyParams);
53280aeed3e9SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
53290aeed3e9SJustin Hibbits     }
53300aeed3e9SJustin Hibbits 
5331852ba100SJustin Hibbits     err = DoDynamicChange(p_FmPcd, &h_OldPointersLst, &h_NewPointersLst,
5332852ba100SJustin Hibbits                           p_ModifyKeyParams, FALSE);
53330aeed3e9SJustin Hibbits 
5334852ba100SJustin Hibbits     if (p_FmPcd->p_CcShadow)
5335852ba100SJustin Hibbits         RELEASE_LOCK(p_FmPcd->shadowLock);
53360aeed3e9SJustin Hibbits 
53370aeed3e9SJustin Hibbits     return err;
53380aeed3e9SJustin Hibbits 
53390aeed3e9SJustin Hibbits }
53400aeed3e9SJustin Hibbits 
FmPcdCcRemoveKey(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode,uint16_t keyIndex)5341852ba100SJustin Hibbits t_Error FmPcdCcRemoveKey(t_Handle h_FmPcd, t_Handle h_FmPcdCcNode,
5342852ba100SJustin Hibbits                          uint16_t keyIndex)
53430aeed3e9SJustin Hibbits {
53440aeed3e9SJustin Hibbits 
5345852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNode;
5346852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
5347852ba100SJustin Hibbits     t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
5348852ba100SJustin Hibbits     t_List h_OldPointersLst, h_NewPointersLst;
5349852ba100SJustin Hibbits     bool useShadowStructs = FALSE;
5350852ba100SJustin Hibbits     t_Error err = E_OK;
5351852ba100SJustin Hibbits 
5352852ba100SJustin Hibbits     if (keyIndex >= p_CcNode->numOfKeys)
5353852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE,
5354852ba100SJustin Hibbits                      ("impossible to remove key when numOfKeys <= keyIndex"));
5355852ba100SJustin Hibbits 
5356852ba100SJustin Hibbits     if (p_CcNode->h_FmPcd != h_FmPcd)
5357852ba100SJustin Hibbits         RETURN_ERROR(
5358852ba100SJustin Hibbits                 MAJOR,
5359852ba100SJustin Hibbits                 E_INVALID_VALUE,
5360852ba100SJustin Hibbits                 ("handler to FmPcd is different from the handle provided at node initialization time"));
5361852ba100SJustin Hibbits 
5362852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
5363852ba100SJustin Hibbits 
5364852ba100SJustin Hibbits     INIT_LIST(&h_OldPointersLst);
5365852ba100SJustin Hibbits     INIT_LIST(&h_NewPointersLst);
5366852ba100SJustin Hibbits 
5367852ba100SJustin Hibbits     p_ModifyKeyParams = ModifyNodeCommonPart(p_CcNode, keyIndex,
5368852ba100SJustin Hibbits                                              e_MODIFY_STATE_REMOVE, TRUE, TRUE,
5369852ba100SJustin Hibbits                                              FALSE);
5370852ba100SJustin Hibbits     if (!p_ModifyKeyParams)
5371852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
5372852ba100SJustin Hibbits 
5373852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
5374852ba100SJustin Hibbits     {
5375852ba100SJustin Hibbits         if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
5376852ba100SJustin Hibbits         {
5377852ba100SJustin Hibbits             XX_Free(p_ModifyKeyParams);
5378852ba100SJustin Hibbits             return ERROR_CODE(E_BUSY);
53790aeed3e9SJustin Hibbits         }
53800aeed3e9SJustin Hibbits 
5381852ba100SJustin Hibbits         useShadowStructs = TRUE;
5382852ba100SJustin Hibbits     }
53830aeed3e9SJustin Hibbits 
5384852ba100SJustin Hibbits     err = BuildNewNodeRemoveKey(p_CcNode, keyIndex, p_ModifyKeyParams);
5385852ba100SJustin Hibbits     if (err)
53860aeed3e9SJustin Hibbits     {
5387852ba100SJustin Hibbits         XX_Free(p_ModifyKeyParams);
5388852ba100SJustin Hibbits         if (p_CcNode->maxNumOfKeys)
5389852ba100SJustin Hibbits             RELEASE_LOCK(p_FmPcd->shadowLock);
5390852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
5391852ba100SJustin Hibbits     }
5392852ba100SJustin Hibbits 
5393852ba100SJustin Hibbits     err = UpdatePtrWhichPointOnCrntMdfNode(p_CcNode, p_ModifyKeyParams,
5394852ba100SJustin Hibbits                                            &h_OldPointersLst,
5395852ba100SJustin Hibbits                                            &h_NewPointersLst);
5396852ba100SJustin Hibbits     if (err)
5397852ba100SJustin Hibbits     {
5398852ba100SJustin Hibbits         ReleaseNewNodeCommonPart(p_ModifyKeyParams);
5399852ba100SJustin Hibbits         XX_Free(p_ModifyKeyParams);
5400852ba100SJustin Hibbits         if (p_CcNode->maxNumOfKeys)
5401852ba100SJustin Hibbits             RELEASE_LOCK(p_FmPcd->shadowLock);
5402852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
5403852ba100SJustin Hibbits     }
5404852ba100SJustin Hibbits 
5405852ba100SJustin Hibbits     err = DoDynamicChange(p_FmPcd, &h_OldPointersLst, &h_NewPointersLst,
5406852ba100SJustin Hibbits                           p_ModifyKeyParams, useShadowStructs);
5407852ba100SJustin Hibbits 
5408852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
5409852ba100SJustin Hibbits         RELEASE_LOCK(p_FmPcd->shadowLock);
5410852ba100SJustin Hibbits 
5411852ba100SJustin Hibbits     return err;
5412852ba100SJustin Hibbits }
5413852ba100SJustin Hibbits 
FmPcdCcModifyKey(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode,uint16_t keyIndex,uint8_t keySize,uint8_t * p_Key,uint8_t * p_Mask)5414852ba100SJustin Hibbits t_Error FmPcdCcModifyKey(t_Handle h_FmPcd, t_Handle h_FmPcdCcNode,
5415852ba100SJustin Hibbits                          uint16_t keyIndex, uint8_t keySize, uint8_t *p_Key,
5416852ba100SJustin Hibbits                          uint8_t *p_Mask)
5417852ba100SJustin Hibbits {
5418852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNode;
5419852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
5420852ba100SJustin Hibbits     t_List h_OldPointersLst, h_NewPointersLst;
5421852ba100SJustin Hibbits     t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
5422852ba100SJustin Hibbits     uint16_t tmpKeyIndex;
5423852ba100SJustin Hibbits     bool useShadowStructs = FALSE;
5424852ba100SJustin Hibbits     t_Error err = E_OK;
5425852ba100SJustin Hibbits 
5426852ba100SJustin Hibbits     if (keyIndex >= p_CcNode->numOfKeys)
5427852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE,
5428852ba100SJustin Hibbits                      ("keyIndex > previously cleared last index + 1"));
5429852ba100SJustin Hibbits 
5430852ba100SJustin Hibbits     if (keySize != p_CcNode->userSizeOfExtraction)
5431852ba100SJustin Hibbits         RETURN_ERROR(
5432852ba100SJustin Hibbits                 MAJOR,
5433852ba100SJustin Hibbits                 E_INVALID_VALUE,
5434852ba100SJustin Hibbits                 ("size for ModifyKey has to be the same as defined in SetNode"));
5435852ba100SJustin Hibbits 
5436852ba100SJustin Hibbits     if (p_CcNode->h_FmPcd != h_FmPcd)
5437852ba100SJustin Hibbits         RETURN_ERROR(
5438852ba100SJustin Hibbits                 MAJOR,
5439852ba100SJustin Hibbits                 E_INVALID_VALUE,
5440852ba100SJustin Hibbits                 ("handler to FmPcd is different from the handle provided at node initialization time"));
5441852ba100SJustin Hibbits 
5442852ba100SJustin Hibbits     err = FindKeyIndex(h_FmPcdCcNode, keySize, p_Key, p_Mask, &tmpKeyIndex);
5443852ba100SJustin Hibbits     if (GET_ERROR_TYPE(err) != E_NOT_FOUND)
5444852ba100SJustin Hibbits         RETURN_ERROR(
5445852ba100SJustin Hibbits                 MINOR,
5446852ba100SJustin Hibbits                 E_ALREADY_EXISTS,
5447852ba100SJustin Hibbits                 ("The received key and mask pair was already found in the match table of the provided node"));
5448852ba100SJustin Hibbits 
5449852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
5450852ba100SJustin Hibbits 
5451852ba100SJustin Hibbits     INIT_LIST(&h_OldPointersLst);
5452852ba100SJustin Hibbits     INIT_LIST(&h_NewPointersLst);
5453852ba100SJustin Hibbits 
5454852ba100SJustin Hibbits     p_ModifyKeyParams = ModifyNodeCommonPart(p_CcNode, keyIndex,
5455852ba100SJustin Hibbits                                              e_MODIFY_STATE_CHANGE, TRUE, TRUE,
5456852ba100SJustin Hibbits                                              FALSE);
5457852ba100SJustin Hibbits     if (!p_ModifyKeyParams)
5458852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
5459852ba100SJustin Hibbits 
5460852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
5461852ba100SJustin Hibbits     {
5462852ba100SJustin Hibbits         if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
5463852ba100SJustin Hibbits         {
5464852ba100SJustin Hibbits             XX_Free(p_ModifyKeyParams);
5465852ba100SJustin Hibbits             return ERROR_CODE(E_BUSY);
5466852ba100SJustin Hibbits         }
5467852ba100SJustin Hibbits 
5468852ba100SJustin Hibbits         useShadowStructs = TRUE;
5469852ba100SJustin Hibbits     }
5470852ba100SJustin Hibbits 
5471852ba100SJustin Hibbits     err = BuildNewNodeModifyKey(p_CcNode, keyIndex, p_Key, p_Mask,
5472852ba100SJustin Hibbits                                 p_ModifyKeyParams);
5473852ba100SJustin Hibbits     if (err)
5474852ba100SJustin Hibbits     {
5475852ba100SJustin Hibbits         XX_Free(p_ModifyKeyParams);
5476852ba100SJustin Hibbits         if (p_CcNode->maxNumOfKeys)
5477852ba100SJustin Hibbits             RELEASE_LOCK(p_FmPcd->shadowLock);
5478852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
5479852ba100SJustin Hibbits     }
5480852ba100SJustin Hibbits 
5481852ba100SJustin Hibbits     err = UpdatePtrWhichPointOnCrntMdfNode(p_CcNode, p_ModifyKeyParams,
5482852ba100SJustin Hibbits                                            &h_OldPointersLst,
5483852ba100SJustin Hibbits                                            &h_NewPointersLst);
5484852ba100SJustin Hibbits     if (err)
5485852ba100SJustin Hibbits     {
5486852ba100SJustin Hibbits         ReleaseNewNodeCommonPart(p_ModifyKeyParams);
5487852ba100SJustin Hibbits         XX_Free(p_ModifyKeyParams);
5488852ba100SJustin Hibbits         if (p_CcNode->maxNumOfKeys)
5489852ba100SJustin Hibbits             RELEASE_LOCK(p_FmPcd->shadowLock);
5490852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
5491852ba100SJustin Hibbits     }
5492852ba100SJustin Hibbits 
5493852ba100SJustin Hibbits     err = DoDynamicChange(p_FmPcd, &h_OldPointersLst, &h_NewPointersLst,
5494852ba100SJustin Hibbits                           p_ModifyKeyParams, useShadowStructs);
5495852ba100SJustin Hibbits 
5496852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
5497852ba100SJustin Hibbits         RELEASE_LOCK(p_FmPcd->shadowLock);
5498852ba100SJustin Hibbits 
5499852ba100SJustin Hibbits     return err;
5500852ba100SJustin Hibbits }
5501852ba100SJustin Hibbits 
FmPcdCcModifyMissNextEngineParamNode(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams)5502852ba100SJustin Hibbits t_Error FmPcdCcModifyMissNextEngineParamNode(
5503852ba100SJustin Hibbits         t_Handle h_FmPcd, t_Handle h_FmPcdCcNode,
5504852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
5505852ba100SJustin Hibbits {
5506852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNode;
5507852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
5508852ba100SJustin Hibbits     t_List h_OldPointersLst, h_NewPointersLst;
5509852ba100SJustin Hibbits     uint16_t keyIndex;
5510852ba100SJustin Hibbits     t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
5511852ba100SJustin Hibbits     t_Error err = E_OK;
5512852ba100SJustin Hibbits 
5513852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_VALUE);
5514852ba100SJustin Hibbits 
5515852ba100SJustin Hibbits     keyIndex = p_CcNode->numOfKeys;
5516852ba100SJustin Hibbits 
5517852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
5518852ba100SJustin Hibbits 
5519852ba100SJustin Hibbits     INIT_LIST(&h_OldPointersLst);
5520852ba100SJustin Hibbits     INIT_LIST(&h_NewPointersLst);
5521852ba100SJustin Hibbits 
5522852ba100SJustin Hibbits     p_ModifyKeyParams = ModifyNodeCommonPart(p_CcNode, keyIndex,
5523852ba100SJustin Hibbits                                              e_MODIFY_STATE_CHANGE, FALSE, TRUE,
5524852ba100SJustin Hibbits                                              FALSE);
5525852ba100SJustin Hibbits     if (!p_ModifyKeyParams)
5526852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
5527852ba100SJustin Hibbits 
5528852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys
5529852ba100SJustin Hibbits             && !TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
5530852ba100SJustin Hibbits     {
5531852ba100SJustin Hibbits         XX_Free(p_ModifyKeyParams);
5532852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
5533852ba100SJustin Hibbits     }
5534852ba100SJustin Hibbits 
5535852ba100SJustin Hibbits     err = BuildNewNodeModifyNextEngine(h_FmPcd, p_CcNode, keyIndex,
5536852ba100SJustin Hibbits                                        p_FmPcdCcNextEngineParams,
5537852ba100SJustin Hibbits                                        &h_OldPointersLst, &h_NewPointersLst,
5538852ba100SJustin Hibbits                                        p_ModifyKeyParams);
5539852ba100SJustin Hibbits     if (err)
5540852ba100SJustin Hibbits     {
5541852ba100SJustin Hibbits         XX_Free(p_ModifyKeyParams);
5542852ba100SJustin Hibbits         if (p_CcNode->maxNumOfKeys)
5543852ba100SJustin Hibbits             RELEASE_LOCK(p_FmPcd->shadowLock);
5544852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
5545852ba100SJustin Hibbits     }
5546852ba100SJustin Hibbits 
5547852ba100SJustin Hibbits     err = DoDynamicChange(p_FmPcd, &h_OldPointersLst, &h_NewPointersLst,
5548852ba100SJustin Hibbits                           p_ModifyKeyParams, FALSE);
5549852ba100SJustin Hibbits 
5550852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
5551852ba100SJustin Hibbits         RELEASE_LOCK(p_FmPcd->shadowLock);
5552852ba100SJustin Hibbits 
5553852ba100SJustin Hibbits     return err;
5554852ba100SJustin Hibbits }
5555852ba100SJustin Hibbits 
FmPcdCcAddKey(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode,uint16_t keyIndex,uint8_t keySize,t_FmPcdCcKeyParams * p_FmPcdCcKeyParams)5556852ba100SJustin Hibbits t_Error FmPcdCcAddKey(t_Handle h_FmPcd, t_Handle h_FmPcdCcNode,
5557852ba100SJustin Hibbits                       uint16_t keyIndex, uint8_t keySize,
5558852ba100SJustin Hibbits                       t_FmPcdCcKeyParams *p_FmPcdCcKeyParams)
5559852ba100SJustin Hibbits {
5560852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNode;
5561852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
5562852ba100SJustin Hibbits     t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
5563852ba100SJustin Hibbits     t_List h_OldPointersLst, h_NewPointersLst;
5564852ba100SJustin Hibbits     bool useShadowStructs = FALSE;
5565852ba100SJustin Hibbits     uint16_t tmpKeyIndex;
5566852ba100SJustin Hibbits     t_Error err = E_OK;
5567852ba100SJustin Hibbits 
5568852ba100SJustin Hibbits     if (keyIndex > p_CcNode->numOfKeys)
5569852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_NOT_IN_RANGE,
5570852ba100SJustin Hibbits                      ("keyIndex > previously cleared last index + 1"));
5571852ba100SJustin Hibbits 
5572852ba100SJustin Hibbits     if (keySize != p_CcNode->userSizeOfExtraction)
5573852ba100SJustin Hibbits         RETURN_ERROR(
5574852ba100SJustin Hibbits                 MAJOR,
5575852ba100SJustin Hibbits                 E_INVALID_VALUE,
5576852ba100SJustin Hibbits                 ("keySize has to be defined as it was defined in initialization step"));
5577852ba100SJustin Hibbits 
5578852ba100SJustin Hibbits     if (p_CcNode->h_FmPcd != h_FmPcd)
5579852ba100SJustin Hibbits         RETURN_ERROR(
5580852ba100SJustin Hibbits                 MAJOR,
5581852ba100SJustin Hibbits                 E_INVALID_VALUE,
5582852ba100SJustin Hibbits                 ("handler to FmPcd is different from the handle provided at node initialization time"));
5583852ba100SJustin Hibbits 
5584852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
5585852ba100SJustin Hibbits     {
5586852ba100SJustin Hibbits         if (p_CcNode->numOfKeys == p_CcNode->maxNumOfKeys)
5587852ba100SJustin Hibbits             RETURN_ERROR(
5588852ba100SJustin Hibbits                     MAJOR,
5589852ba100SJustin Hibbits                     E_FULL,
5590852ba100SJustin Hibbits                     ("number of keys exceeds the maximal number of keys provided at node initialization time"));
55910aeed3e9SJustin Hibbits     }
55920aeed3e9SJustin Hibbits     else
5593852ba100SJustin Hibbits         if (p_CcNode->numOfKeys == FM_PCD_MAX_NUM_OF_KEYS)
5594852ba100SJustin Hibbits             RETURN_ERROR(
5595852ba100SJustin Hibbits                     MAJOR,
5596852ba100SJustin Hibbits                     E_INVALID_VALUE,
5597852ba100SJustin Hibbits                     ("number of keys can not be larger than %d", FM_PCD_MAX_NUM_OF_KEYS));
55980aeed3e9SJustin Hibbits 
5599852ba100SJustin Hibbits     err = FindKeyIndex(h_FmPcdCcNode, keySize, p_FmPcdCcKeyParams->p_Key,
5600852ba100SJustin Hibbits                        p_FmPcdCcKeyParams->p_Mask, &tmpKeyIndex);
5601852ba100SJustin Hibbits     if (GET_ERROR_TYPE(err) != E_NOT_FOUND)
5602852ba100SJustin Hibbits         RETURN_ERROR(
5603852ba100SJustin Hibbits                 MAJOR,
5604852ba100SJustin Hibbits                 E_ALREADY_EXISTS,
5605852ba100SJustin Hibbits                 ("The received key and mask pair was already found in the match table of the provided node"));
56060aeed3e9SJustin Hibbits 
5607852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
5608852ba100SJustin Hibbits 
5609852ba100SJustin Hibbits     INIT_LIST(&h_OldPointersLst);
5610852ba100SJustin Hibbits     INIT_LIST(&h_NewPointersLst);
5611852ba100SJustin Hibbits 
5612852ba100SJustin Hibbits     p_ModifyKeyParams = ModifyNodeCommonPart(p_CcNode, keyIndex,
5613852ba100SJustin Hibbits                                              e_MODIFY_STATE_ADD, TRUE, TRUE,
5614852ba100SJustin Hibbits                                              FALSE);
5615852ba100SJustin Hibbits     if (!p_ModifyKeyParams)
5616852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
5617852ba100SJustin Hibbits 
5618852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
5619852ba100SJustin Hibbits     {
5620852ba100SJustin Hibbits         if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
5621852ba100SJustin Hibbits         {
5622852ba100SJustin Hibbits             XX_Free(p_ModifyKeyParams);
5623852ba100SJustin Hibbits             return ERROR_CODE(E_BUSY);
56240aeed3e9SJustin Hibbits         }
56250aeed3e9SJustin Hibbits 
5626852ba100SJustin Hibbits         useShadowStructs = TRUE;
5627852ba100SJustin Hibbits     }
5628852ba100SJustin Hibbits 
5629852ba100SJustin Hibbits     err = BuildNewNodeAddOrMdfyKeyAndNextEngine(h_FmPcd, p_CcNode, keyIndex,
5630852ba100SJustin Hibbits                                                 p_FmPcdCcKeyParams,
5631852ba100SJustin Hibbits                                                 p_ModifyKeyParams, TRUE);
5632852ba100SJustin Hibbits     if (err)
5633852ba100SJustin Hibbits     {
5634852ba100SJustin Hibbits         ReleaseNewNodeCommonPart(p_ModifyKeyParams);
5635852ba100SJustin Hibbits         XX_Free(p_ModifyKeyParams);
5636852ba100SJustin Hibbits         if (p_CcNode->maxNumOfKeys)
5637852ba100SJustin Hibbits             RELEASE_LOCK(p_FmPcd->shadowLock);
5638852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
5639852ba100SJustin Hibbits     }
5640852ba100SJustin Hibbits 
5641852ba100SJustin Hibbits     err = UpdatePtrWhichPointOnCrntMdfNode(p_CcNode, p_ModifyKeyParams,
5642852ba100SJustin Hibbits                                            &h_OldPointersLst,
5643852ba100SJustin Hibbits                                            &h_NewPointersLst);
5644852ba100SJustin Hibbits     if (err)
5645852ba100SJustin Hibbits     {
5646852ba100SJustin Hibbits         ReleaseNewNodeCommonPart(p_ModifyKeyParams);
5647852ba100SJustin Hibbits         XX_Free(p_ModifyKeyParams);
5648852ba100SJustin Hibbits         if (p_CcNode->maxNumOfKeys)
5649852ba100SJustin Hibbits             RELEASE_LOCK(p_FmPcd->shadowLock);
5650852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
5651852ba100SJustin Hibbits     }
5652852ba100SJustin Hibbits 
5653852ba100SJustin Hibbits     err = DoDynamicChange(p_FmPcd, &h_OldPointersLst, &h_NewPointersLst,
5654852ba100SJustin Hibbits                           p_ModifyKeyParams, useShadowStructs);
5655852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
5656852ba100SJustin Hibbits         RELEASE_LOCK(p_FmPcd->shadowLock);
5657852ba100SJustin Hibbits 
5658852ba100SJustin Hibbits     return err;
5659852ba100SJustin Hibbits }
5660852ba100SJustin Hibbits 
FmPcdCcModifyKeyAndNextEngine(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode,uint16_t keyIndex,uint8_t keySize,t_FmPcdCcKeyParams * p_FmPcdCcKeyParams)5661852ba100SJustin Hibbits t_Error FmPcdCcModifyKeyAndNextEngine(t_Handle h_FmPcd, t_Handle h_FmPcdCcNode,
5662852ba100SJustin Hibbits                                       uint16_t keyIndex, uint8_t keySize,
5663852ba100SJustin Hibbits                                       t_FmPcdCcKeyParams *p_FmPcdCcKeyParams)
5664852ba100SJustin Hibbits {
5665852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNode;
5666852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
5667852ba100SJustin Hibbits     t_List h_OldPointersLst, h_NewPointersLst;
5668852ba100SJustin Hibbits     t_FmPcdModifyCcKeyAdditionalParams *p_ModifyKeyParams;
5669852ba100SJustin Hibbits     uint16_t tmpKeyIndex;
5670852ba100SJustin Hibbits     bool useShadowStructs = FALSE;
5671852ba100SJustin Hibbits     t_Error err = E_OK;
5672852ba100SJustin Hibbits 
5673852ba100SJustin Hibbits     if (keyIndex > p_CcNode->numOfKeys)
5674852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE,
5675852ba100SJustin Hibbits                      ("keyIndex > previously cleared last index + 1"));
5676852ba100SJustin Hibbits 
5677852ba100SJustin Hibbits     if (keySize != p_CcNode->userSizeOfExtraction)
5678852ba100SJustin Hibbits         RETURN_ERROR(
5679852ba100SJustin Hibbits                 MAJOR,
5680852ba100SJustin Hibbits                 E_INVALID_VALUE,
5681852ba100SJustin Hibbits                 ("keySize has to be defined as it was defined in initialization step"));
5682852ba100SJustin Hibbits 
5683852ba100SJustin Hibbits     if (p_CcNode->h_FmPcd != h_FmPcd)
5684852ba100SJustin Hibbits         RETURN_ERROR(
5685852ba100SJustin Hibbits                 MAJOR,
5686852ba100SJustin Hibbits                 E_INVALID_VALUE,
5687852ba100SJustin Hibbits                 ("handler to FmPcd is different from the handle provided at node initialization time"));
5688852ba100SJustin Hibbits 
5689852ba100SJustin Hibbits     err = FindKeyIndex(h_FmPcdCcNode, keySize, p_FmPcdCcKeyParams->p_Key,
5690852ba100SJustin Hibbits                        p_FmPcdCcKeyParams->p_Mask, &tmpKeyIndex);
5691852ba100SJustin Hibbits     if (GET_ERROR_TYPE(err) != E_NOT_FOUND)
5692852ba100SJustin Hibbits         RETURN_ERROR(
5693852ba100SJustin Hibbits                 MINOR,
5694852ba100SJustin Hibbits                 E_ALREADY_EXISTS,
5695852ba100SJustin Hibbits                 ("The received key and mask pair was already found in the match table of the provided node"));
5696852ba100SJustin Hibbits 
5697852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
5698852ba100SJustin Hibbits 
5699852ba100SJustin Hibbits     INIT_LIST(&h_OldPointersLst);
5700852ba100SJustin Hibbits     INIT_LIST(&h_NewPointersLst);
5701852ba100SJustin Hibbits 
5702852ba100SJustin Hibbits     p_ModifyKeyParams = ModifyNodeCommonPart(p_CcNode, keyIndex,
5703852ba100SJustin Hibbits                                              e_MODIFY_STATE_CHANGE, TRUE, TRUE,
5704852ba100SJustin Hibbits                                              FALSE);
5705852ba100SJustin Hibbits     if (!p_ModifyKeyParams)
5706852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
5707852ba100SJustin Hibbits 
5708852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
5709852ba100SJustin Hibbits     {
5710852ba100SJustin Hibbits         if (!TRY_LOCK(p_FmPcd->h_ShadowSpinlock, &p_FmPcd->shadowLock))
5711852ba100SJustin Hibbits         {
5712852ba100SJustin Hibbits             XX_Free(p_ModifyKeyParams);
5713852ba100SJustin Hibbits             return ERROR_CODE(E_BUSY);
5714852ba100SJustin Hibbits         }
5715852ba100SJustin Hibbits 
5716852ba100SJustin Hibbits         useShadowStructs = TRUE;
5717852ba100SJustin Hibbits     }
5718852ba100SJustin Hibbits 
5719852ba100SJustin Hibbits     err = BuildNewNodeAddOrMdfyKeyAndNextEngine(h_FmPcd, p_CcNode, keyIndex,
5720852ba100SJustin Hibbits                                                 p_FmPcdCcKeyParams,
5721852ba100SJustin Hibbits                                                 p_ModifyKeyParams, FALSE);
5722852ba100SJustin Hibbits     if (err)
5723852ba100SJustin Hibbits     {
5724852ba100SJustin Hibbits         ReleaseNewNodeCommonPart(p_ModifyKeyParams);
5725852ba100SJustin Hibbits         XX_Free(p_ModifyKeyParams);
5726852ba100SJustin Hibbits         if (p_CcNode->maxNumOfKeys)
5727852ba100SJustin Hibbits             RELEASE_LOCK(p_FmPcd->shadowLock);
5728852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
5729852ba100SJustin Hibbits     }
5730852ba100SJustin Hibbits 
5731852ba100SJustin Hibbits     err = UpdatePtrWhichPointOnCrntMdfNode(p_CcNode, p_ModifyKeyParams,
5732852ba100SJustin Hibbits                                            &h_OldPointersLst,
5733852ba100SJustin Hibbits                                            &h_NewPointersLst);
5734852ba100SJustin Hibbits     if (err)
5735852ba100SJustin Hibbits     {
5736852ba100SJustin Hibbits         ReleaseNewNodeCommonPart(p_ModifyKeyParams);
5737852ba100SJustin Hibbits         XX_Free(p_ModifyKeyParams);
5738852ba100SJustin Hibbits         if (p_CcNode->maxNumOfKeys)
5739852ba100SJustin Hibbits             RELEASE_LOCK(p_FmPcd->shadowLock);
5740852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
5741852ba100SJustin Hibbits     }
5742852ba100SJustin Hibbits 
5743852ba100SJustin Hibbits     err = DoDynamicChange(p_FmPcd, &h_OldPointersLst, &h_NewPointersLst,
5744852ba100SJustin Hibbits                           p_ModifyKeyParams, useShadowStructs);
5745852ba100SJustin Hibbits 
5746852ba100SJustin Hibbits     if (p_CcNode->maxNumOfKeys)
5747852ba100SJustin Hibbits         RELEASE_LOCK(p_FmPcd->shadowLock);
5748852ba100SJustin Hibbits 
5749852ba100SJustin Hibbits     return err;
5750852ba100SJustin Hibbits }
5751852ba100SJustin Hibbits 
FmPcdCcGetNodeAddrOffsetFromNodeInfo(t_Handle h_FmPcd,t_Handle h_Pointer)5752852ba100SJustin Hibbits uint32_t FmPcdCcGetNodeAddrOffsetFromNodeInfo(t_Handle h_FmPcd,
5753852ba100SJustin Hibbits                                               t_Handle h_Pointer)
57540aeed3e9SJustin Hibbits {
57550aeed3e9SJustin Hibbits     t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
57560aeed3e9SJustin Hibbits     t_CcNodeInformation *p_CcNodeInfo;
57570aeed3e9SJustin Hibbits 
5758852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE,
5759852ba100SJustin Hibbits                               (uint32_t)ILLEGAL_BASE);
57600aeed3e9SJustin Hibbits 
57610aeed3e9SJustin Hibbits     p_CcNodeInfo = CC_NODE_F_OBJECT(h_Pointer);
5762852ba100SJustin Hibbits 
5763852ba100SJustin Hibbits     return (uint32_t)(XX_VirtToPhys(p_CcNodeInfo->h_CcNode)
5764852ba100SJustin Hibbits             - p_FmPcd->physicalMuramBase);
57650aeed3e9SJustin Hibbits }
57660aeed3e9SJustin Hibbits 
FmPcdCcGetGrpParams(t_Handle h_FmPcdCcTree,uint8_t grpId,uint32_t * p_GrpBits,uint8_t * p_GrpBase)5767852ba100SJustin Hibbits t_Error FmPcdCcGetGrpParams(t_Handle h_FmPcdCcTree, uint8_t grpId,
5768852ba100SJustin Hibbits                             uint32_t *p_GrpBits, uint8_t *p_GrpBase)
57690aeed3e9SJustin Hibbits {
57700aeed3e9SJustin Hibbits     t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree;
57710aeed3e9SJustin Hibbits 
57720aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_FmPcdCcTree, E_INVALID_HANDLE);
57730aeed3e9SJustin Hibbits 
57740aeed3e9SJustin Hibbits     if (grpId >= p_FmPcdCcTree->numOfGrps)
5775852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_HANDLE,
5776852ba100SJustin Hibbits                      ("grpId you asked > numOfGroup of relevant tree"));
5777852ba100SJustin Hibbits 
57780aeed3e9SJustin Hibbits     *p_GrpBits = p_FmPcdCcTree->fmPcdGroupParam[grpId].totalBitsMask;
57790aeed3e9SJustin Hibbits     *p_GrpBase = p_FmPcdCcTree->fmPcdGroupParam[grpId].baseGroupEntry;
5780852ba100SJustin Hibbits 
57810aeed3e9SJustin Hibbits     return E_OK;
57820aeed3e9SJustin Hibbits }
57830aeed3e9SJustin Hibbits 
FmPcdCcBindTree(t_Handle h_FmPcd,t_Handle h_PcdParams,t_Handle h_FmPcdCcTree,uint32_t * p_Offset,t_Handle h_FmPort)5784852ba100SJustin Hibbits t_Error FmPcdCcBindTree(t_Handle h_FmPcd, t_Handle h_PcdParams,
5785852ba100SJustin Hibbits                         t_Handle h_FmPcdCcTree, uint32_t *p_Offset,
5786852ba100SJustin Hibbits                         t_Handle h_FmPort)
57870aeed3e9SJustin Hibbits {
57880aeed3e9SJustin Hibbits     t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
57890aeed3e9SJustin Hibbits     t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree;
57900aeed3e9SJustin Hibbits     t_Error err = E_OK;
57910aeed3e9SJustin Hibbits 
5792852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
5793852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_FmPcdCcTree, E_INVALID_HANDLE);
57940aeed3e9SJustin Hibbits 
5795852ba100SJustin Hibbits     /* this routine must be protected by the calling routine by locking all PCD modules! */
57960aeed3e9SJustin Hibbits 
5797852ba100SJustin Hibbits     err = CcUpdateParams(h_FmPcd, h_PcdParams, h_FmPort, h_FmPcdCcTree, TRUE);
57980aeed3e9SJustin Hibbits 
5799852ba100SJustin Hibbits     if (err == E_OK)
5800852ba100SJustin Hibbits         UpdateCcRootOwner(p_FmPcdCcTree, TRUE);
5801852ba100SJustin Hibbits 
5802852ba100SJustin Hibbits     *p_Offset = (uint32_t)(XX_VirtToPhys(
5803852ba100SJustin Hibbits             UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr))
5804852ba100SJustin Hibbits             - p_FmPcd->physicalMuramBase);
58050aeed3e9SJustin Hibbits 
58060aeed3e9SJustin Hibbits     return err;
58070aeed3e9SJustin Hibbits }
58080aeed3e9SJustin Hibbits 
FmPcdCcUnbindTree(t_Handle h_FmPcd,t_Handle h_FmPcdCcTree)58090aeed3e9SJustin Hibbits t_Error FmPcdCcUnbindTree(t_Handle h_FmPcd, t_Handle h_FmPcdCcTree)
58100aeed3e9SJustin Hibbits {
58110aeed3e9SJustin Hibbits     t_FmPcdCcTree *p_FmPcdCcTree = (t_FmPcdCcTree *)h_FmPcdCcTree;
58120aeed3e9SJustin Hibbits 
5813852ba100SJustin Hibbits     /* this routine must be protected by the calling routine by locking all PCD modules! */
5814852ba100SJustin Hibbits 
58150aeed3e9SJustin Hibbits     UNUSED(h_FmPcd);
58160aeed3e9SJustin Hibbits 
5817852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_FmPcdCcTree, E_INVALID_HANDLE);
58180aeed3e9SJustin Hibbits 
5819852ba100SJustin Hibbits     UpdateCcRootOwner(p_FmPcdCcTree, FALSE);
58200aeed3e9SJustin Hibbits 
58210aeed3e9SJustin Hibbits     return E_OK;
58220aeed3e9SJustin Hibbits }
58230aeed3e9SJustin Hibbits 
FmPcdCcNodeTreeTryLock(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode,t_List * p_List)5824852ba100SJustin Hibbits t_Error FmPcdCcNodeTreeTryLock(t_Handle h_FmPcd, t_Handle h_FmPcdCcNode,
5825852ba100SJustin Hibbits                                t_List *p_List)
58260aeed3e9SJustin Hibbits {
5827852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_FmPcdCcNode;
5828852ba100SJustin Hibbits     t_List *p_Pos, *p_Tmp;
58290aeed3e9SJustin Hibbits     t_CcNodeInformation *p_CcNodeInfo, nodeInfo;
5830852ba100SJustin Hibbits     uint32_t intFlags;
58310aeed3e9SJustin Hibbits     t_Error err = E_OK;
58320aeed3e9SJustin Hibbits 
5833852ba100SJustin Hibbits     intFlags = FmPcdLock(h_FmPcd);
58340aeed3e9SJustin Hibbits 
5835852ba100SJustin Hibbits     NCSW_LIST_FOR_EACH(p_Pos, &p_CcNode->ccTreesLst)
58360aeed3e9SJustin Hibbits     {
58370aeed3e9SJustin Hibbits         p_CcNodeInfo = CC_NODE_F_OBJECT(p_Pos);
58380aeed3e9SJustin Hibbits         ASSERT_COND(p_CcNodeInfo->h_CcNode);
5839852ba100SJustin Hibbits 
5840852ba100SJustin Hibbits         err = CcRootTryLock(p_CcNodeInfo->h_CcNode);
5841852ba100SJustin Hibbits 
5842852ba100SJustin Hibbits         if (err)
58430aeed3e9SJustin Hibbits         {
5844852ba100SJustin Hibbits             NCSW_LIST_FOR_EACH(p_Tmp, &p_CcNode->ccTreesLst)
5845852ba100SJustin Hibbits             {
5846852ba100SJustin Hibbits                 if (p_Tmp == p_Pos)
5847852ba100SJustin Hibbits                     break;
5848852ba100SJustin Hibbits 
5849852ba100SJustin Hibbits                 CcRootReleaseLock(p_CcNodeInfo->h_CcNode);
5850852ba100SJustin Hibbits             }
5851852ba100SJustin Hibbits             break;
5852852ba100SJustin Hibbits         }
5853852ba100SJustin Hibbits 
58540aeed3e9SJustin Hibbits         memset(&nodeInfo, 0, sizeof(t_CcNodeInformation));
58550aeed3e9SJustin Hibbits         nodeInfo.h_CcNode = p_CcNodeInfo->h_CcNode;
5856852ba100SJustin Hibbits         EnqueueNodeInfoToRelevantLst(p_List, &nodeInfo, NULL);
58570aeed3e9SJustin Hibbits     }
5858852ba100SJustin Hibbits 
5859852ba100SJustin Hibbits     FmPcdUnlock(h_FmPcd, intFlags);
5860852ba100SJustin Hibbits     CORE_MemoryBarrier();
58610aeed3e9SJustin Hibbits 
58620aeed3e9SJustin Hibbits     return err;
58630aeed3e9SJustin Hibbits }
58640aeed3e9SJustin Hibbits 
FmPcdCcNodeTreeReleaseLock(t_Handle h_FmPcd,t_List * p_List)5865852ba100SJustin Hibbits void FmPcdCcNodeTreeReleaseLock(t_Handle h_FmPcd, t_List *p_List)
5866852ba100SJustin Hibbits {
5867852ba100SJustin Hibbits     t_List *p_Pos;
5868852ba100SJustin Hibbits     t_CcNodeInformation *p_CcNodeInfo;
5869852ba100SJustin Hibbits     t_Handle h_FmPcdCcTree;
5870852ba100SJustin Hibbits     uint32_t intFlags;
5871852ba100SJustin Hibbits 
5872852ba100SJustin Hibbits     intFlags = FmPcdLock(h_FmPcd);
5873852ba100SJustin Hibbits 
5874852ba100SJustin Hibbits     NCSW_LIST_FOR_EACH(p_Pos, p_List)
5875852ba100SJustin Hibbits     {
5876852ba100SJustin Hibbits         p_CcNodeInfo = CC_NODE_F_OBJECT(p_Pos);
5877852ba100SJustin Hibbits         h_FmPcdCcTree = p_CcNodeInfo->h_CcNode;
5878852ba100SJustin Hibbits         CcRootReleaseLock(h_FmPcdCcTree);
5879852ba100SJustin Hibbits     }
5880852ba100SJustin Hibbits 
5881852ba100SJustin Hibbits     ReleaseLst(p_List);
5882852ba100SJustin Hibbits 
5883852ba100SJustin Hibbits     FmPcdUnlock(h_FmPcd, intFlags);
5884852ba100SJustin Hibbits     CORE_MemoryBarrier();
5885852ba100SJustin Hibbits }
5886852ba100SJustin Hibbits 
FmPcdUpdateCcShadow(t_FmPcd * p_FmPcd,uint32_t size,uint32_t align)5887852ba100SJustin Hibbits t_Error FmPcdUpdateCcShadow(t_FmPcd *p_FmPcd, uint32_t size, uint32_t align)
5888852ba100SJustin Hibbits {
5889852ba100SJustin Hibbits     uint32_t intFlags;
5890852ba100SJustin Hibbits     uint32_t newSize = 0, newAlign = 0;
5891852ba100SJustin Hibbits     bool allocFail = FALSE;
5892852ba100SJustin Hibbits 
5893852ba100SJustin Hibbits     ASSERT_COND(p_FmPcd);
5894852ba100SJustin Hibbits 
5895852ba100SJustin Hibbits     if (!size)
5896852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("size must be larger then 0"));
5897852ba100SJustin Hibbits 
5898852ba100SJustin Hibbits     if (!POWER_OF_2(align))
5899852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("alignment must be power of 2"));
5900852ba100SJustin Hibbits 
5901852ba100SJustin Hibbits     newSize = p_FmPcd->ccShadowSize;
5902852ba100SJustin Hibbits     newAlign = p_FmPcd->ccShadowAlign;
5903852ba100SJustin Hibbits 
5904852ba100SJustin Hibbits     /* Check if current shadow is large enough to hold the requested size */
5905852ba100SJustin Hibbits     if (size > p_FmPcd->ccShadowSize)
5906852ba100SJustin Hibbits         newSize = size;
5907852ba100SJustin Hibbits 
5908852ba100SJustin Hibbits     /* Check if current shadow matches the requested alignment */
5909852ba100SJustin Hibbits     if (align > p_FmPcd->ccShadowAlign)
5910852ba100SJustin Hibbits         newAlign = align;
5911852ba100SJustin Hibbits 
5912852ba100SJustin Hibbits     /* If a bigger shadow size or bigger shadow alignment are required,
5913852ba100SJustin Hibbits      a new shadow will be allocated */
5914852ba100SJustin Hibbits     if ((newSize != p_FmPcd->ccShadowSize)
5915852ba100SJustin Hibbits             || (newAlign != p_FmPcd->ccShadowAlign))
5916852ba100SJustin Hibbits     {
5917852ba100SJustin Hibbits         intFlags = FmPcdLock(p_FmPcd);
5918852ba100SJustin Hibbits 
5919852ba100SJustin Hibbits         if (p_FmPcd->p_CcShadow)
5920852ba100SJustin Hibbits         {
5921852ba100SJustin Hibbits             FM_MURAM_FreeMem(FmPcdGetMuramHandle(p_FmPcd), p_FmPcd->p_CcShadow);
5922852ba100SJustin Hibbits             p_FmPcd->ccShadowSize = 0;
5923852ba100SJustin Hibbits             p_FmPcd->ccShadowAlign = 0;
5924852ba100SJustin Hibbits         }
5925852ba100SJustin Hibbits 
5926852ba100SJustin Hibbits         p_FmPcd->p_CcShadow = FM_MURAM_AllocMem(FmPcdGetMuramHandle(p_FmPcd),
5927852ba100SJustin Hibbits                                                 newSize, newAlign);
5928852ba100SJustin Hibbits         if (!p_FmPcd->p_CcShadow)
5929852ba100SJustin Hibbits         {
5930852ba100SJustin Hibbits             allocFail = TRUE;
5931852ba100SJustin Hibbits 
5932852ba100SJustin Hibbits             /* If new shadow size allocation failed,
5933852ba100SJustin Hibbits              re-allocate with previous parameters */
5934852ba100SJustin Hibbits             p_FmPcd->p_CcShadow = FM_MURAM_AllocMem(
5935852ba100SJustin Hibbits                     FmPcdGetMuramHandle(p_FmPcd), p_FmPcd->ccShadowSize,
5936852ba100SJustin Hibbits                     p_FmPcd->ccShadowAlign);
5937852ba100SJustin Hibbits         }
5938852ba100SJustin Hibbits 
5939852ba100SJustin Hibbits         FmPcdUnlock(p_FmPcd, intFlags);
5940852ba100SJustin Hibbits 
5941852ba100SJustin Hibbits         if (allocFail)
5942852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_NO_MEMORY,
5943852ba100SJustin Hibbits                          ("MURAM allocation for CC Shadow memory"));
5944852ba100SJustin Hibbits 
5945852ba100SJustin Hibbits         p_FmPcd->ccShadowSize = newSize;
5946852ba100SJustin Hibbits         p_FmPcd->ccShadowAlign = newAlign;
5947852ba100SJustin Hibbits     }
5948852ba100SJustin Hibbits 
5949852ba100SJustin Hibbits     return E_OK;
5950852ba100SJustin Hibbits }
5951852ba100SJustin Hibbits 
5952852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
FmPcdCcGetAdTablesThatPointOnReplicGroup(t_Handle h_Node,t_Handle h_ReplicGroup,t_List * p_AdTables,uint32_t * p_NumOfAdTables)5953852ba100SJustin Hibbits void FmPcdCcGetAdTablesThatPointOnReplicGroup(t_Handle h_Node,
5954852ba100SJustin Hibbits                                               t_Handle h_ReplicGroup,
5955852ba100SJustin Hibbits                                               t_List *p_AdTables,
5956852ba100SJustin Hibbits                                               uint32_t *p_NumOfAdTables)
5957852ba100SJustin Hibbits {
5958852ba100SJustin Hibbits     t_FmPcdCcNode *p_CurrentNode = (t_FmPcdCcNode *)h_Node;
5959852ba100SJustin Hibbits     int i = 0;
5960852ba100SJustin Hibbits     void * p_AdTable;
5961852ba100SJustin Hibbits     t_CcNodeInformation ccNodeInfo;
5962852ba100SJustin Hibbits 
5963852ba100SJustin Hibbits     ASSERT_COND(h_Node);
5964852ba100SJustin Hibbits     *p_NumOfAdTables = 0;
5965852ba100SJustin Hibbits 
5966852ba100SJustin Hibbits     /* search in the current node which exact index points on this current replicator group for getting AD */
5967852ba100SJustin Hibbits     for (i = 0; i < p_CurrentNode->numOfKeys + 1; i++)
5968852ba100SJustin Hibbits     {
5969852ba100SJustin Hibbits         if ((p_CurrentNode->keyAndNextEngineParams[i].nextEngineParams.nextEngine
5970852ba100SJustin Hibbits                 == e_FM_PCD_FR)
5971852ba100SJustin Hibbits                 && ((p_CurrentNode->keyAndNextEngineParams[i].nextEngineParams.params.frParams.h_FrmReplic
5972852ba100SJustin Hibbits                         == (t_Handle)h_ReplicGroup)))
5973852ba100SJustin Hibbits         {
5974852ba100SJustin Hibbits             /* save the current ad table in the list */
5975852ba100SJustin Hibbits             /* this entry uses the input replicator group */
5976852ba100SJustin Hibbits             p_AdTable =
5977852ba100SJustin Hibbits                     PTR_MOVE(p_CurrentNode->h_AdTable, i*FM_PCD_CC_AD_ENTRY_SIZE);
5978852ba100SJustin Hibbits             memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
5979852ba100SJustin Hibbits             ccNodeInfo.h_CcNode = p_AdTable;
5980852ba100SJustin Hibbits             EnqueueNodeInfoToRelevantLst(p_AdTables, &ccNodeInfo, NULL);
5981852ba100SJustin Hibbits             (*p_NumOfAdTables)++;
5982852ba100SJustin Hibbits         }
5983852ba100SJustin Hibbits     }
5984852ba100SJustin Hibbits 
5985852ba100SJustin Hibbits     ASSERT_COND(i != p_CurrentNode->numOfKeys);
5986852ba100SJustin Hibbits }
5987852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
5988852ba100SJustin Hibbits /*********************** End of inter-module routines ************************/
5989852ba100SJustin Hibbits 
5990852ba100SJustin Hibbits /****************************************/
5991852ba100SJustin Hibbits /*       API Init unit functions        */
5992852ba100SJustin Hibbits /****************************************/
5993852ba100SJustin Hibbits 
FM_PCD_CcRootBuild(t_Handle h_FmPcd,t_FmPcdCcTreeParams * p_PcdGroupsParam)5994852ba100SJustin Hibbits t_Handle FM_PCD_CcRootBuild(t_Handle h_FmPcd,
5995852ba100SJustin Hibbits                             t_FmPcdCcTreeParams *p_PcdGroupsParam)
59960aeed3e9SJustin Hibbits {
59970aeed3e9SJustin Hibbits     t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
59980aeed3e9SJustin Hibbits     t_Error err = E_OK;
59990aeed3e9SJustin Hibbits     int i = 0, j = 0, k = 0;
60000aeed3e9SJustin Hibbits     t_FmPcdCcTree *p_FmPcdCcTree;
60010aeed3e9SJustin Hibbits     uint8_t numOfEntries;
60020aeed3e9SJustin Hibbits     t_Handle p_CcTreeTmp;
60030aeed3e9SJustin Hibbits     t_FmPcdCcGrpParams *p_FmPcdCcGroupParams;
6004852ba100SJustin Hibbits     t_FmPcdCcKeyAndNextEngineParams *p_Params, *p_KeyAndNextEngineParams;
60050aeed3e9SJustin Hibbits     t_NetEnvParams netEnvParams;
60060aeed3e9SJustin Hibbits     uint8_t lastOne = 0;
60070aeed3e9SJustin Hibbits     uint32_t requiredAction = 0;
60080aeed3e9SJustin Hibbits     t_FmPcdCcNode *p_FmPcdCcNextNode;
60090aeed3e9SJustin Hibbits     t_CcNodeInformation ccNodeInfo, *p_CcInformation;
60100aeed3e9SJustin Hibbits 
60110aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, NULL);
60120aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(p_PcdGroupsParam, E_INVALID_HANDLE, NULL);
60130aeed3e9SJustin Hibbits 
60140aeed3e9SJustin Hibbits     if (p_PcdGroupsParam->numOfGrps > FM_PCD_MAX_NUM_OF_CC_GROUPS)
60150aeed3e9SJustin Hibbits     {
60160aeed3e9SJustin Hibbits         REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("numOfGrps should not exceed %d", FM_PCD_MAX_NUM_OF_CC_GROUPS));
60170aeed3e9SJustin Hibbits         return NULL;
60180aeed3e9SJustin Hibbits     }
60190aeed3e9SJustin Hibbits 
60200aeed3e9SJustin Hibbits     p_FmPcdCcTree = (t_FmPcdCcTree*)XX_Malloc(sizeof(t_FmPcdCcTree));
60210aeed3e9SJustin Hibbits     if (!p_FmPcdCcTree)
60220aeed3e9SJustin Hibbits     {
60230aeed3e9SJustin Hibbits         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("PCD tree structure"));
60240aeed3e9SJustin Hibbits         return NULL;
60250aeed3e9SJustin Hibbits     }
60260aeed3e9SJustin Hibbits     memset(p_FmPcdCcTree, 0, sizeof(t_FmPcdCcTree));
6027852ba100SJustin Hibbits     p_FmPcdCcTree->h_FmPcd = h_FmPcd;
6028852ba100SJustin Hibbits 
6029852ba100SJustin Hibbits     p_Params = (t_FmPcdCcKeyAndNextEngineParams*)XX_Malloc(
6030852ba100SJustin Hibbits             FM_PCD_MAX_NUM_OF_CC_GROUPS
6031852ba100SJustin Hibbits                     * sizeof(t_FmPcdCcKeyAndNextEngineParams));
6032852ba100SJustin Hibbits     memset(p_Params,
6033852ba100SJustin Hibbits            0,
6034852ba100SJustin Hibbits            FM_PCD_MAX_NUM_OF_CC_GROUPS
6035852ba100SJustin Hibbits                    * sizeof(t_FmPcdCcKeyAndNextEngineParams));
60360aeed3e9SJustin Hibbits 
60370aeed3e9SJustin Hibbits     INIT_LIST(&p_FmPcdCcTree->fmPortsLst);
60380aeed3e9SJustin Hibbits 
6039852ba100SJustin Hibbits #ifdef FM_CAPWAP_SUPPORT
6040852ba100SJustin Hibbits     if ((p_PcdGroupsParam->numOfGrps == 1) &&
6041852ba100SJustin Hibbits             (p_PcdGroupsParam->ccGrpParams[0].numOfDistinctionUnits == 0) &&
6042852ba100SJustin Hibbits             (p_PcdGroupsParam->ccGrpParams[0].nextEnginePerEntriesInGrp[0].nextEngine == e_FM_PCD_CC) &&
6043852ba100SJustin Hibbits             p_PcdGroupsParam->ccGrpParams[0].nextEnginePerEntriesInGrp[0].params.ccParams.h_CcNode &&
6044852ba100SJustin Hibbits             IsCapwapApplSpecific(p_PcdGroupsParam->ccGrpParams[0].nextEnginePerEntriesInGrp[0].params.ccParams.h_CcNode))
6045852ba100SJustin Hibbits     {
6046852ba100SJustin Hibbits         p_PcdGroupsParam->ccGrpParams[0].nextEnginePerEntriesInGrp[0].h_Manip = FmPcdManipApplSpecificBuild();
6047852ba100SJustin Hibbits         if (!p_PcdGroupsParam->ccGrpParams[0].nextEnginePerEntriesInGrp[0].h_Manip)
6048852ba100SJustin Hibbits         {
6049852ba100SJustin Hibbits             DeleteTree(p_FmPcdCcTree,p_FmPcd);
6050852ba100SJustin Hibbits             XX_Free(p_Params);
6051852ba100SJustin Hibbits             REPORT_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
6052852ba100SJustin Hibbits             return NULL;
6053852ba100SJustin Hibbits         }
6054852ba100SJustin Hibbits     }
6055852ba100SJustin Hibbits #endif /* FM_CAPWAP_SUPPORT */
6056852ba100SJustin Hibbits 
60570aeed3e9SJustin Hibbits     numOfEntries = 0;
6058852ba100SJustin Hibbits     p_FmPcdCcTree->netEnvId = FmPcdGetNetEnvId(p_PcdGroupsParam->h_NetEnv);
6059852ba100SJustin Hibbits 
60600aeed3e9SJustin Hibbits     for (i = 0; i < p_PcdGroupsParam->numOfGrps; i++)
60610aeed3e9SJustin Hibbits     {
60620aeed3e9SJustin Hibbits         p_FmPcdCcGroupParams = &p_PcdGroupsParam->ccGrpParams[i];
60630aeed3e9SJustin Hibbits 
6064852ba100SJustin Hibbits         if (p_FmPcdCcGroupParams->numOfDistinctionUnits
6065852ba100SJustin Hibbits                 > FM_PCD_MAX_NUM_OF_CC_UNITS)
60660aeed3e9SJustin Hibbits         {
60670aeed3e9SJustin Hibbits             DeleteTree(p_FmPcdCcTree, p_FmPcd);
6068852ba100SJustin Hibbits             XX_Free(p_Params);
60690aeed3e9SJustin Hibbits             REPORT_ERROR(MAJOR, E_INVALID_VALUE,
60700aeed3e9SJustin Hibbits                     ("numOfDistinctionUnits (group %d) should not exceed %d", i, FM_PCD_MAX_NUM_OF_CC_UNITS));
60710aeed3e9SJustin Hibbits             return NULL;
60720aeed3e9SJustin Hibbits         }
60730aeed3e9SJustin Hibbits 
60740aeed3e9SJustin Hibbits         p_FmPcdCcTree->fmPcdGroupParam[i].baseGroupEntry = numOfEntries;
6075852ba100SJustin Hibbits         p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup = (uint8_t)(0x01
6076852ba100SJustin Hibbits                 << p_FmPcdCcGroupParams->numOfDistinctionUnits);
60770aeed3e9SJustin Hibbits         numOfEntries += p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup;
6078852ba100SJustin Hibbits         if (numOfEntries > FM_PCD_MAX_NUM_OF_CC_GROUPS)
60790aeed3e9SJustin Hibbits         {
60800aeed3e9SJustin Hibbits             DeleteTree(p_FmPcdCcTree, p_FmPcd);
6081852ba100SJustin Hibbits             XX_Free(p_Params);
6082852ba100SJustin Hibbits             REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("numOfEntries can not be larger than %d", FM_PCD_MAX_NUM_OF_CC_GROUPS));
60830aeed3e9SJustin Hibbits             return NULL;
60840aeed3e9SJustin Hibbits         }
6085852ba100SJustin Hibbits 
60860aeed3e9SJustin Hibbits         if (lastOne)
60870aeed3e9SJustin Hibbits         {
60880aeed3e9SJustin Hibbits             if (p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup > lastOne)
60890aeed3e9SJustin Hibbits             {
60900aeed3e9SJustin Hibbits                 DeleteTree(p_FmPcdCcTree, p_FmPcd);
6091852ba100SJustin Hibbits                 XX_Free(p_Params);
60920aeed3e9SJustin Hibbits                 REPORT_ERROR(MAJOR, E_CONFLICT, ("numOfEntries per group must be set in descending order"));
60930aeed3e9SJustin Hibbits                 return NULL;
60940aeed3e9SJustin Hibbits             }
60950aeed3e9SJustin Hibbits         }
60960aeed3e9SJustin Hibbits 
60970aeed3e9SJustin Hibbits         lastOne = p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup;
60980aeed3e9SJustin Hibbits 
60990aeed3e9SJustin Hibbits         netEnvParams.netEnvId = p_FmPcdCcTree->netEnvId;
6100852ba100SJustin Hibbits         netEnvParams.numOfDistinctionUnits =
6101852ba100SJustin Hibbits                 p_FmPcdCcGroupParams->numOfDistinctionUnits;
6102852ba100SJustin Hibbits 
6103852ba100SJustin Hibbits         memcpy(netEnvParams.unitIds, &p_FmPcdCcGroupParams->unitIds,
6104852ba100SJustin Hibbits                (sizeof(uint8_t)) * p_FmPcdCcGroupParams->numOfDistinctionUnits);
6105852ba100SJustin Hibbits 
61060aeed3e9SJustin Hibbits         err = PcdGetUnitsVector(p_FmPcd, &netEnvParams);
61070aeed3e9SJustin Hibbits         if (err)
61080aeed3e9SJustin Hibbits         {
61090aeed3e9SJustin Hibbits             DeleteTree(p_FmPcdCcTree, p_FmPcd);
6110852ba100SJustin Hibbits             XX_Free(p_Params);
61110aeed3e9SJustin Hibbits             REPORT_ERROR(MAJOR, err, NO_MSG);
61120aeed3e9SJustin Hibbits             return NULL;
61130aeed3e9SJustin Hibbits         }
61140aeed3e9SJustin Hibbits 
61150aeed3e9SJustin Hibbits         p_FmPcdCcTree->fmPcdGroupParam[i].totalBitsMask = netEnvParams.vector;
6116852ba100SJustin Hibbits         for (j = 0; j < p_FmPcdCcTree->fmPcdGroupParam[i].numOfEntriesInGroup;
6117852ba100SJustin Hibbits                 j++)
61180aeed3e9SJustin Hibbits         {
6119852ba100SJustin Hibbits             err = ValidateNextEngineParams(
6120852ba100SJustin Hibbits                     h_FmPcd,
6121852ba100SJustin Hibbits                     &p_FmPcdCcGroupParams->nextEnginePerEntriesInGrp[j],
6122852ba100SJustin Hibbits                     e_FM_PCD_CC_STATS_MODE_NONE);
61230aeed3e9SJustin Hibbits             if (err)
61240aeed3e9SJustin Hibbits             {
61250aeed3e9SJustin Hibbits                 DeleteTree(p_FmPcdCcTree, p_FmPcd);
6126852ba100SJustin Hibbits                 XX_Free(p_Params);
61270aeed3e9SJustin Hibbits                 REPORT_ERROR(MAJOR, err, (NO_MSG));
61280aeed3e9SJustin Hibbits                 return NULL;
61290aeed3e9SJustin Hibbits             }
61300aeed3e9SJustin Hibbits 
61310aeed3e9SJustin Hibbits             if (p_FmPcdCcGroupParams->nextEnginePerEntriesInGrp[j].h_Manip)
61320aeed3e9SJustin Hibbits             {
6133852ba100SJustin Hibbits                 err = FmPcdManipCheckParamsForCcNextEngine(
6134852ba100SJustin Hibbits                         &p_FmPcdCcGroupParams->nextEnginePerEntriesInGrp[j],
6135852ba100SJustin Hibbits                         &requiredAction);
61360aeed3e9SJustin Hibbits                 if (err)
61370aeed3e9SJustin Hibbits                 {
61380aeed3e9SJustin Hibbits                     DeleteTree(p_FmPcdCcTree, p_FmPcd);
6139852ba100SJustin Hibbits                     XX_Free(p_Params);
61400aeed3e9SJustin Hibbits                     REPORT_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
61410aeed3e9SJustin Hibbits                     return NULL;
61420aeed3e9SJustin Hibbits                 }
61430aeed3e9SJustin Hibbits             }
6144852ba100SJustin Hibbits             p_KeyAndNextEngineParams = p_Params + k;
61450aeed3e9SJustin Hibbits 
6146852ba100SJustin Hibbits             memcpy(&p_KeyAndNextEngineParams->nextEngineParams,
6147852ba100SJustin Hibbits                    &p_FmPcdCcGroupParams->nextEnginePerEntriesInGrp[j],
6148852ba100SJustin Hibbits                    sizeof(t_FmPcdCcNextEngineParams));
6149852ba100SJustin Hibbits 
6150852ba100SJustin Hibbits             if ((p_KeyAndNextEngineParams->nextEngineParams.nextEngine
6151852ba100SJustin Hibbits                     == e_FM_PCD_CC)
6152852ba100SJustin Hibbits                     && p_KeyAndNextEngineParams->nextEngineParams.h_Manip)
6153852ba100SJustin Hibbits             {
6154852ba100SJustin Hibbits                 err =
6155852ba100SJustin Hibbits                         AllocAndFillAdForContLookupManip(
6156852ba100SJustin Hibbits                                 p_KeyAndNextEngineParams->nextEngineParams.params.ccParams.h_CcNode);
6157852ba100SJustin Hibbits                 if (err)
6158852ba100SJustin Hibbits                 {
6159852ba100SJustin Hibbits                     DeleteTree(p_FmPcdCcTree, p_FmPcd);
6160852ba100SJustin Hibbits                     XX_Free(p_Params);
6161852ba100SJustin Hibbits                     REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC Tree"));
6162852ba100SJustin Hibbits                     return NULL;
6163852ba100SJustin Hibbits                 }
6164852ba100SJustin Hibbits             }
6165852ba100SJustin Hibbits 
61660aeed3e9SJustin Hibbits             requiredAction |= UPDATE_CC_WITH_TREE;
6167852ba100SJustin Hibbits             p_KeyAndNextEngineParams->requiredAction = requiredAction;
6168852ba100SJustin Hibbits 
61690aeed3e9SJustin Hibbits             k++;
61700aeed3e9SJustin Hibbits         }
61710aeed3e9SJustin Hibbits     }
61720aeed3e9SJustin Hibbits 
61730aeed3e9SJustin Hibbits     p_FmPcdCcTree->numOfEntries = (uint8_t)k;
61740aeed3e9SJustin Hibbits     p_FmPcdCcTree->numOfGrps = p_PcdGroupsParam->numOfGrps;
6175852ba100SJustin Hibbits 
61760aeed3e9SJustin Hibbits     p_FmPcdCcTree->ccTreeBaseAddr =
61770aeed3e9SJustin Hibbits             PTR_TO_UINT(FM_MURAM_AllocMem(FmPcdGetMuramHandle(h_FmPcd),
6178852ba100SJustin Hibbits                             (uint32_t)( FM_PCD_MAX_NUM_OF_CC_GROUPS * FM_PCD_CC_AD_ENTRY_SIZE),
6179852ba100SJustin Hibbits                             FM_PCD_CC_TREE_ADDR_ALIGN));
61800aeed3e9SJustin Hibbits     if (!p_FmPcdCcTree->ccTreeBaseAddr)
61810aeed3e9SJustin Hibbits     {
61820aeed3e9SJustin Hibbits         DeleteTree(p_FmPcdCcTree, p_FmPcd);
6183852ba100SJustin Hibbits         XX_Free(p_Params);
6184852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for CC Tree"));
61850aeed3e9SJustin Hibbits         return NULL;
61860aeed3e9SJustin Hibbits     }
6187852ba100SJustin Hibbits     MemSet8(
6188852ba100SJustin Hibbits             UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr), 0,
6189852ba100SJustin Hibbits             (uint32_t)(FM_PCD_MAX_NUM_OF_CC_GROUPS * FM_PCD_CC_AD_ENTRY_SIZE));
61900aeed3e9SJustin Hibbits 
61910aeed3e9SJustin Hibbits     p_CcTreeTmp = UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr);
61920aeed3e9SJustin Hibbits 
61930aeed3e9SJustin Hibbits     for (i = 0; i < numOfEntries; i++)
61940aeed3e9SJustin Hibbits     {
6195852ba100SJustin Hibbits         p_KeyAndNextEngineParams = p_Params + i;
6196852ba100SJustin Hibbits 
6197852ba100SJustin Hibbits         NextStepAd(p_CcTreeTmp, NULL,
6198852ba100SJustin Hibbits                    &p_KeyAndNextEngineParams->nextEngineParams, p_FmPcd);
6199852ba100SJustin Hibbits 
62000aeed3e9SJustin Hibbits         p_CcTreeTmp = PTR_MOVE(p_CcTreeTmp, FM_PCD_CC_AD_ENTRY_SIZE);
6201852ba100SJustin Hibbits 
6202852ba100SJustin Hibbits         memcpy(&p_FmPcdCcTree->keyAndNextEngineParams[i],
6203852ba100SJustin Hibbits                p_KeyAndNextEngineParams,
6204852ba100SJustin Hibbits                sizeof(t_FmPcdCcKeyAndNextEngineParams));
6205852ba100SJustin Hibbits 
6206852ba100SJustin Hibbits         if (p_FmPcdCcTree->keyAndNextEngineParams[i].nextEngineParams.nextEngine
6207852ba100SJustin Hibbits                 == e_FM_PCD_CC)
62080aeed3e9SJustin Hibbits         {
6209852ba100SJustin Hibbits             p_FmPcdCcNextNode =
6210852ba100SJustin Hibbits                     (t_FmPcdCcNode*)p_FmPcdCcTree->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode;
6211852ba100SJustin Hibbits             p_CcInformation = FindNodeInfoInReleventLst(
6212852ba100SJustin Hibbits                     &p_FmPcdCcNextNode->ccTreeIdLst, (t_Handle)p_FmPcdCcTree,
6213852ba100SJustin Hibbits                     p_FmPcdCcNextNode->h_Spinlock);
6214852ba100SJustin Hibbits 
6215852ba100SJustin Hibbits             if (!p_CcInformation)
62160aeed3e9SJustin Hibbits             {
62170aeed3e9SJustin Hibbits                 memset(&ccNodeInfo, 0, sizeof(t_CcNodeInformation));
62180aeed3e9SJustin Hibbits                 ccNodeInfo.h_CcNode = (t_Handle)p_FmPcdCcTree;
62190aeed3e9SJustin Hibbits                 ccNodeInfo.index = 1;
6220852ba100SJustin Hibbits                 EnqueueNodeInfoToRelevantLst(&p_FmPcdCcNextNode->ccTreeIdLst,
6221852ba100SJustin Hibbits                                              &ccNodeInfo,
6222852ba100SJustin Hibbits                                              p_FmPcdCcNextNode->h_Spinlock);
62230aeed3e9SJustin Hibbits             }
62240aeed3e9SJustin Hibbits             else
62250aeed3e9SJustin Hibbits                 p_CcInformation->index++;
62260aeed3e9SJustin Hibbits         }
62270aeed3e9SJustin Hibbits     }
62280aeed3e9SJustin Hibbits 
62290aeed3e9SJustin Hibbits     FmPcdIncNetEnvOwners(h_FmPcd, p_FmPcdCcTree->netEnvId);
62300aeed3e9SJustin Hibbits     p_CcTreeTmp = UINT_TO_PTR(p_FmPcdCcTree->ccTreeBaseAddr);
62310aeed3e9SJustin Hibbits 
6232852ba100SJustin Hibbits     if (!FmPcdLockTryLockAll(p_FmPcd))
62330aeed3e9SJustin Hibbits     {
6234852ba100SJustin Hibbits         FM_PCD_CcRootDelete(p_FmPcdCcTree);
6235852ba100SJustin Hibbits         XX_Free(p_Params);
6236852ba100SJustin Hibbits         DBG(TRACE, ("FmPcdLockTryLockAll failed"));
6237852ba100SJustin Hibbits         return NULL;
62380aeed3e9SJustin Hibbits     }
62390aeed3e9SJustin Hibbits 
62400aeed3e9SJustin Hibbits     for (i = 0; i < numOfEntries; i++)
62410aeed3e9SJustin Hibbits     {
6242852ba100SJustin Hibbits         if (p_FmPcdCcTree->keyAndNextEngineParams[i].requiredAction)
62430aeed3e9SJustin Hibbits         {
6244852ba100SJustin Hibbits             err = SetRequiredAction(
6245852ba100SJustin Hibbits                     h_FmPcd,
6246852ba100SJustin Hibbits                     p_FmPcdCcTree->keyAndNextEngineParams[i].requiredAction,
6247852ba100SJustin Hibbits                     &p_FmPcdCcTree->keyAndNextEngineParams[i], p_CcTreeTmp, 1,
6248852ba100SJustin Hibbits                     p_FmPcdCcTree);
62490aeed3e9SJustin Hibbits             if (err)
62500aeed3e9SJustin Hibbits             {
6251852ba100SJustin Hibbits                 FmPcdLockUnlockAll(p_FmPcd);
6252852ba100SJustin Hibbits                 FM_PCD_CcRootDelete(p_FmPcdCcTree);
6253852ba100SJustin Hibbits                 XX_Free(p_Params);
62540aeed3e9SJustin Hibbits                 REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory"));
62550aeed3e9SJustin Hibbits                 return NULL;
62560aeed3e9SJustin Hibbits             }
62570aeed3e9SJustin Hibbits             p_CcTreeTmp = PTR_MOVE(p_CcTreeTmp, FM_PCD_CC_AD_ENTRY_SIZE);
62580aeed3e9SJustin Hibbits         }
62590aeed3e9SJustin Hibbits     }
62600aeed3e9SJustin Hibbits 
6261852ba100SJustin Hibbits     FmPcdLockUnlockAll(p_FmPcd);
6262852ba100SJustin Hibbits     p_FmPcdCcTree->p_Lock = FmPcdAcquireLock(p_FmPcd);
6263852ba100SJustin Hibbits     if (!p_FmPcdCcTree->p_Lock)
6264852ba100SJustin Hibbits     {
6265852ba100SJustin Hibbits         FM_PCD_CcRootDelete(p_FmPcdCcTree);
6266852ba100SJustin Hibbits         XX_Free(p_Params);
6267852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM CC lock"));
6268852ba100SJustin Hibbits         return NULL;
6269852ba100SJustin Hibbits     }
6270852ba100SJustin Hibbits 
6271852ba100SJustin Hibbits     XX_Free(p_Params);
6272852ba100SJustin Hibbits 
62730aeed3e9SJustin Hibbits     return p_FmPcdCcTree;
62740aeed3e9SJustin Hibbits }
62750aeed3e9SJustin Hibbits 
FM_PCD_CcRootDelete(t_Handle h_CcTree)6276852ba100SJustin Hibbits t_Error FM_PCD_CcRootDelete(t_Handle h_CcTree)
62770aeed3e9SJustin Hibbits {
6278852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
62790aeed3e9SJustin Hibbits     t_FmPcdCcTree *p_CcTree = (t_FmPcdCcTree *)h_CcTree;
62800aeed3e9SJustin Hibbits     int i = 0;
62810aeed3e9SJustin Hibbits 
62820aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcTree, E_INVALID_STATE);
6283852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcTree->h_FmPcd;
6284852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
62850aeed3e9SJustin Hibbits 
6286852ba100SJustin Hibbits     FmPcdDecNetEnvOwners(p_FmPcd, p_CcTree->netEnvId);
62870aeed3e9SJustin Hibbits 
62880aeed3e9SJustin Hibbits     if (p_CcTree->owners)
6289852ba100SJustin Hibbits         RETURN_ERROR(
6290852ba100SJustin Hibbits                 MAJOR,
6291852ba100SJustin Hibbits                 E_INVALID_SELECTION,
6292852ba100SJustin Hibbits                 ("the tree with this ID can not be removed because this tree is occupied, first - unbind this tree"));
6293852ba100SJustin Hibbits 
6294852ba100SJustin Hibbits     /* Delete ip-reassembly schemes if exist */
6295852ba100SJustin Hibbits     if (p_CcTree->h_IpReassemblyManip)
6296852ba100SJustin Hibbits     {
6297852ba100SJustin Hibbits         FmPcdManipDeleteIpReassmSchemes(p_CcTree->h_IpReassemblyManip);
6298852ba100SJustin Hibbits         FmPcdManipUpdateOwner(p_CcTree->h_IpReassemblyManip, FALSE);
6299852ba100SJustin Hibbits     }
6300852ba100SJustin Hibbits 
6301852ba100SJustin Hibbits     /* Delete capwap-reassembly schemes if exist */
6302852ba100SJustin Hibbits     if (p_CcTree->h_CapwapReassemblyManip)
6303852ba100SJustin Hibbits     {
6304852ba100SJustin Hibbits         FmPcdManipDeleteCapwapReassmSchemes(p_CcTree->h_CapwapReassemblyManip);
6305852ba100SJustin Hibbits         FmPcdManipUpdateOwner(p_CcTree->h_CapwapReassemblyManip, FALSE);
6306852ba100SJustin Hibbits     }
63070aeed3e9SJustin Hibbits 
63080aeed3e9SJustin Hibbits     for (i = 0; i < p_CcTree->numOfEntries; i++)
63090aeed3e9SJustin Hibbits     {
6310852ba100SJustin Hibbits         if (p_CcTree->keyAndNextEngineParams[i].nextEngineParams.nextEngine
6311852ba100SJustin Hibbits                 == e_FM_PCD_CC)
6312852ba100SJustin Hibbits             UpdateNodeOwner(
6313852ba100SJustin Hibbits                     p_CcTree->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode,
6314852ba100SJustin Hibbits                     FALSE);
6315852ba100SJustin Hibbits 
6316852ba100SJustin Hibbits         if (p_CcTree->keyAndNextEngineParams[i].nextEngineParams.h_Manip)
6317852ba100SJustin Hibbits             FmPcdManipUpdateOwner(
6318852ba100SJustin Hibbits                     p_CcTree->keyAndNextEngineParams[i].nextEngineParams.h_Manip,
6319852ba100SJustin Hibbits                     FALSE);
6320852ba100SJustin Hibbits 
6321852ba100SJustin Hibbits #ifdef FM_CAPWAP_SUPPORT
6322852ba100SJustin Hibbits         if ((p_CcTree->numOfGrps == 1) &&
6323852ba100SJustin Hibbits                 (p_CcTree->fmPcdGroupParam[0].numOfEntriesInGroup == 1) &&
6324852ba100SJustin Hibbits                 (p_CcTree->keyAndNextEngineParams[0].nextEngineParams.nextEngine == e_FM_PCD_CC) &&
6325852ba100SJustin Hibbits                 p_CcTree->keyAndNextEngineParams[0].nextEngineParams.params.ccParams.h_CcNode &&
6326852ba100SJustin Hibbits                 IsCapwapApplSpecific(p_CcTree->keyAndNextEngineParams[0].nextEngineParams.params.ccParams.h_CcNode))
6327852ba100SJustin Hibbits         {
6328852ba100SJustin Hibbits             if (FM_PCD_ManipNodeDelete(p_CcTree->keyAndNextEngineParams[0].nextEngineParams.h_Manip) != E_OK)
6329852ba100SJustin Hibbits             return E_INVALID_STATE;
6330852ba100SJustin Hibbits         }
6331852ba100SJustin Hibbits #endif /* FM_CAPWAP_SUPPORT */
6332852ba100SJustin Hibbits 
6333852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
6334852ba100SJustin Hibbits         if ((p_CcTree->keyAndNextEngineParams[i].nextEngineParams.nextEngine
6335852ba100SJustin Hibbits                 == e_FM_PCD_FR)
6336852ba100SJustin Hibbits                 && (p_CcTree->keyAndNextEngineParams[i].nextEngineParams.params.frParams.h_FrmReplic))
6337852ba100SJustin Hibbits             FrmReplicGroupUpdateOwner(
6338852ba100SJustin Hibbits                     p_CcTree->keyAndNextEngineParams[i].nextEngineParams.params.frParams.h_FrmReplic,
6339852ba100SJustin Hibbits                     FALSE);
6340852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
63410aeed3e9SJustin Hibbits     }
63420aeed3e9SJustin Hibbits 
6343852ba100SJustin Hibbits     if (p_CcTree->p_Lock)
6344852ba100SJustin Hibbits         FmPcdReleaseLock(p_CcTree->h_FmPcd, p_CcTree->p_Lock);
63450aeed3e9SJustin Hibbits 
63460aeed3e9SJustin Hibbits     DeleteTree(p_CcTree, p_FmPcd);
6347852ba100SJustin Hibbits 
63480aeed3e9SJustin Hibbits     return E_OK;
63490aeed3e9SJustin Hibbits }
63500aeed3e9SJustin Hibbits 
FM_PCD_CcRootModifyNextEngine(t_Handle h_CcTree,uint8_t grpId,uint8_t index,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams)6351852ba100SJustin Hibbits t_Error FM_PCD_CcRootModifyNextEngine(
6352852ba100SJustin Hibbits         t_Handle h_CcTree, uint8_t grpId, uint8_t index,
6353852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
63540aeed3e9SJustin Hibbits {
6355852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
6356852ba100SJustin Hibbits     t_FmPcdCcTree *p_CcTree = (t_FmPcdCcTree *)h_CcTree;
63570aeed3e9SJustin Hibbits     t_Error err = E_OK;
6358852ba100SJustin Hibbits 
6359852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
6360852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcTree, E_INVALID_STATE);
6361852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcTree->h_FmPcd;
6362852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
6363852ba100SJustin Hibbits 
6364852ba100SJustin Hibbits     if (!FmPcdLockTryLockAll(p_FmPcd))
6365852ba100SJustin Hibbits     {
6366852ba100SJustin Hibbits         DBG(TRACE, ("FmPcdLockTryLockAll failed"));
6367852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6368852ba100SJustin Hibbits     }
6369852ba100SJustin Hibbits 
6370852ba100SJustin Hibbits     err = FmPcdCcModifyNextEngineParamTree(p_FmPcd, p_CcTree, grpId, index,
6371852ba100SJustin Hibbits                                            p_FmPcdCcNextEngineParams);
6372852ba100SJustin Hibbits     FmPcdLockUnlockAll(p_FmPcd);
6373852ba100SJustin Hibbits 
6374852ba100SJustin Hibbits     if (err)
6375852ba100SJustin Hibbits     {
6376852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
6377852ba100SJustin Hibbits     }
6378852ba100SJustin Hibbits 
6379852ba100SJustin Hibbits     return E_OK;
6380852ba100SJustin Hibbits }
6381852ba100SJustin Hibbits 
FM_PCD_MatchTableSet(t_Handle h_FmPcd,t_FmPcdCcNodeParams * p_CcNodeParam)6382852ba100SJustin Hibbits t_Handle FM_PCD_MatchTableSet(t_Handle h_FmPcd,
6383852ba100SJustin Hibbits                               t_FmPcdCcNodeParams *p_CcNodeParam)
6384852ba100SJustin Hibbits {
6385852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode;
6386852ba100SJustin Hibbits     t_Error err;
63870aeed3e9SJustin Hibbits 
63880aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, NULL);
6389852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(p_CcNodeParam, E_NULL_POINTER, NULL);
63900aeed3e9SJustin Hibbits 
6391852ba100SJustin Hibbits     p_CcNode = (t_FmPcdCcNode*)XX_Malloc(sizeof(t_FmPcdCcNode));
6392852ba100SJustin Hibbits     if (!p_CcNode)
63930aeed3e9SJustin Hibbits     {
63940aeed3e9SJustin Hibbits         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("No memory"));
63950aeed3e9SJustin Hibbits         return NULL;
63960aeed3e9SJustin Hibbits     }
6397852ba100SJustin Hibbits     memset(p_CcNode, 0, sizeof(t_FmPcdCcNode));
63980aeed3e9SJustin Hibbits 
6399852ba100SJustin Hibbits     err = MatchTableSet(h_FmPcd, p_CcNode, p_CcNodeParam);
64000aeed3e9SJustin Hibbits 
6401852ba100SJustin Hibbits     switch(GET_ERROR_TYPE(err)
6402852ba100SJustin Hibbits )    {
6403852ba100SJustin Hibbits         case E_OK:
64040aeed3e9SJustin Hibbits         break;
64050aeed3e9SJustin Hibbits 
6406852ba100SJustin Hibbits         case E_BUSY:
6407852ba100SJustin Hibbits         DBG(TRACE, ("E_BUSY error"));
64080aeed3e9SJustin Hibbits         return NULL;
64090aeed3e9SJustin Hibbits 
64100aeed3e9SJustin Hibbits         default:
64110aeed3e9SJustin Hibbits         REPORT_ERROR(MAJOR, err, NO_MSG);
64120aeed3e9SJustin Hibbits         return NULL;
64130aeed3e9SJustin Hibbits     }
64140aeed3e9SJustin Hibbits 
6415852ba100SJustin Hibbits     return p_CcNode;
64160aeed3e9SJustin Hibbits }
64170aeed3e9SJustin Hibbits 
FM_PCD_MatchTableDelete(t_Handle h_CcNode)6418852ba100SJustin Hibbits t_Error FM_PCD_MatchTableDelete(t_Handle h_CcNode)
64190aeed3e9SJustin Hibbits {
64200aeed3e9SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
64210aeed3e9SJustin Hibbits     int i = 0;
64220aeed3e9SJustin Hibbits 
6423852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
6424852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode->h_FmPcd, E_INVALID_HANDLE);
64250aeed3e9SJustin Hibbits 
64260aeed3e9SJustin Hibbits     if (p_CcNode->owners)
6427852ba100SJustin Hibbits         RETURN_ERROR(
6428852ba100SJustin Hibbits                 MAJOR,
6429852ba100SJustin Hibbits                 E_INVALID_STATE,
6430852ba100SJustin Hibbits                 ("This node cannot be removed because it is occupied; first unbind this node"));
64310aeed3e9SJustin Hibbits 
64320aeed3e9SJustin Hibbits     for (i = 0; i < p_CcNode->numOfKeys; i++)
6433852ba100SJustin Hibbits         if (p_CcNode->keyAndNextEngineParams[i].nextEngineParams.nextEngine
6434852ba100SJustin Hibbits                 == e_FM_PCD_CC)
6435852ba100SJustin Hibbits             UpdateNodeOwner(
6436852ba100SJustin Hibbits                     p_CcNode->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode,
6437852ba100SJustin Hibbits                     FALSE);
64380aeed3e9SJustin Hibbits 
6439852ba100SJustin Hibbits     if (p_CcNode->keyAndNextEngineParams[i].nextEngineParams.nextEngine
6440852ba100SJustin Hibbits             == e_FM_PCD_CC)
6441852ba100SJustin Hibbits         UpdateNodeOwner(
6442852ba100SJustin Hibbits                 p_CcNode->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode,
6443852ba100SJustin Hibbits                 FALSE);
64440aeed3e9SJustin Hibbits 
6445852ba100SJustin Hibbits     /* Handle also Miss entry */
6446852ba100SJustin Hibbits     for (i = 0; i < p_CcNode->numOfKeys + 1; i++)
64470aeed3e9SJustin Hibbits     {
6448852ba100SJustin Hibbits         if (p_CcNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip)
6449852ba100SJustin Hibbits             FmPcdManipUpdateOwner(
6450852ba100SJustin Hibbits                     p_CcNode->keyAndNextEngineParams[i].nextEngineParams.h_Manip,
6451852ba100SJustin Hibbits                     FALSE);
6452852ba100SJustin Hibbits 
6453852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
6454852ba100SJustin Hibbits         if ((p_CcNode->keyAndNextEngineParams[i].nextEngineParams.nextEngine
6455852ba100SJustin Hibbits                 == e_FM_PCD_FR)
6456852ba100SJustin Hibbits                 && (p_CcNode->keyAndNextEngineParams[i].nextEngineParams.params.frParams.h_FrmReplic))
6457852ba100SJustin Hibbits         {
6458852ba100SJustin Hibbits             FrmReplicGroupUpdateOwner(
6459852ba100SJustin Hibbits                     p_CcNode->keyAndNextEngineParams[i].nextEngineParams.params.frParams.h_FrmReplic,
6460852ba100SJustin Hibbits                     FALSE);
64610aeed3e9SJustin Hibbits         }
6462852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
6463852ba100SJustin Hibbits     }
64640aeed3e9SJustin Hibbits 
64650aeed3e9SJustin Hibbits     DeleteNode(p_CcNode);
64660aeed3e9SJustin Hibbits 
64670aeed3e9SJustin Hibbits     return E_OK;
64680aeed3e9SJustin Hibbits }
64690aeed3e9SJustin Hibbits 
FM_PCD_MatchTableAddKey(t_Handle h_CcNode,uint16_t keyIndex,uint8_t keySize,t_FmPcdCcKeyParams * p_KeyParams)6470852ba100SJustin Hibbits t_Error FM_PCD_MatchTableAddKey(t_Handle h_CcNode, uint16_t keyIndex,
6471852ba100SJustin Hibbits                                 uint8_t keySize,
6472852ba100SJustin Hibbits                                 t_FmPcdCcKeyParams *p_KeyParams)
64730aeed3e9SJustin Hibbits {
6474852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
6475852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
6476852ba100SJustin Hibbits     t_Error err = E_OK;
64770aeed3e9SJustin Hibbits 
6478852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_KeyParams, E_NULL_POINTER);
6479852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
6480852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
6481852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
64820aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
64830aeed3e9SJustin Hibbits 
6484852ba100SJustin Hibbits     if (keyIndex == FM_PCD_LAST_KEY_INDEX)
6485852ba100SJustin Hibbits         keyIndex = p_CcNode->numOfKeys;
6486852ba100SJustin Hibbits 
6487852ba100SJustin Hibbits     if (!FmPcdLockTryLockAll(p_FmPcd))
6488852ba100SJustin Hibbits     {
6489852ba100SJustin Hibbits         DBG(TRACE, ("FmPcdLockTryLockAll failed"));
6490852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
64910aeed3e9SJustin Hibbits     }
64920aeed3e9SJustin Hibbits 
6493852ba100SJustin Hibbits     err = FmPcdCcAddKey(p_FmPcd, p_CcNode, keyIndex, keySize, p_KeyParams);
64940aeed3e9SJustin Hibbits 
6495852ba100SJustin Hibbits     FmPcdLockUnlockAll(p_FmPcd);
6496852ba100SJustin Hibbits 
6497852ba100SJustin Hibbits     switch(GET_ERROR_TYPE(err)
6498852ba100SJustin Hibbits )    {
6499852ba100SJustin Hibbits         case E_OK:
6500852ba100SJustin Hibbits         return E_OK;
6501852ba100SJustin Hibbits 
6502852ba100SJustin Hibbits         case E_BUSY:
6503852ba100SJustin Hibbits         DBG(TRACE, ("E_BUSY error"));
6504852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6505852ba100SJustin Hibbits 
6506852ba100SJustin Hibbits         default:
6507852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
6508852ba100SJustin Hibbits     }
6509852ba100SJustin Hibbits }
6510852ba100SJustin Hibbits 
FM_PCD_MatchTableRemoveKey(t_Handle h_CcNode,uint16_t keyIndex)6511852ba100SJustin Hibbits t_Error FM_PCD_MatchTableRemoveKey(t_Handle h_CcNode, uint16_t keyIndex)
6512852ba100SJustin Hibbits {
6513852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
6514852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
6515852ba100SJustin Hibbits     t_Error err = E_OK;
6516852ba100SJustin Hibbits 
6517852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
6518852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
6519852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
65200aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
65210aeed3e9SJustin Hibbits 
6522852ba100SJustin Hibbits     if (!FmPcdLockTryLockAll(p_FmPcd))
6523852ba100SJustin Hibbits     {
6524852ba100SJustin Hibbits         DBG(TRACE, ("FmPcdLockTryLockAll failed"));
6525852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
65260aeed3e9SJustin Hibbits     }
65270aeed3e9SJustin Hibbits 
6528852ba100SJustin Hibbits     err = FmPcdCcRemoveKey(p_FmPcd, p_CcNode, keyIndex);
65290aeed3e9SJustin Hibbits 
6530852ba100SJustin Hibbits     FmPcdLockUnlockAll(p_FmPcd);
6531852ba100SJustin Hibbits 
6532852ba100SJustin Hibbits     switch(GET_ERROR_TYPE(err)
6533852ba100SJustin Hibbits )    {
6534852ba100SJustin Hibbits         case E_OK:
6535852ba100SJustin Hibbits         return E_OK;
6536852ba100SJustin Hibbits 
6537852ba100SJustin Hibbits         case E_BUSY:
6538852ba100SJustin Hibbits         DBG(TRACE, ("E_BUSY error"));
6539852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6540852ba100SJustin Hibbits 
6541852ba100SJustin Hibbits         default:
6542852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
6543852ba100SJustin Hibbits     }
6544852ba100SJustin Hibbits 
6545852ba100SJustin Hibbits     return E_OK;
6546852ba100SJustin Hibbits }
6547852ba100SJustin Hibbits 
FM_PCD_MatchTableModifyKey(t_Handle h_CcNode,uint16_t keyIndex,uint8_t keySize,uint8_t * p_Key,uint8_t * p_Mask)6548852ba100SJustin Hibbits t_Error FM_PCD_MatchTableModifyKey(t_Handle h_CcNode, uint16_t keyIndex,
6549852ba100SJustin Hibbits                                    uint8_t keySize, uint8_t *p_Key,
6550852ba100SJustin Hibbits                                    uint8_t *p_Mask)
6551852ba100SJustin Hibbits {
6552852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
6553852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
6554852ba100SJustin Hibbits     t_Error err = E_OK;
6555852ba100SJustin Hibbits 
6556852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
6557852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
6558852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
6559852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
65600aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
65610aeed3e9SJustin Hibbits 
6562852ba100SJustin Hibbits 
6563852ba100SJustin Hibbits     if (!FmPcdLockTryLockAll(p_FmPcd))
6564852ba100SJustin Hibbits     {
6565852ba100SJustin Hibbits         DBG(TRACE, ("FmPcdLockTryLockAll failed"));
6566852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
65670aeed3e9SJustin Hibbits     }
65680aeed3e9SJustin Hibbits 
6569852ba100SJustin Hibbits     err = FmPcdCcModifyKey(p_FmPcd, p_CcNode, keyIndex, keySize, p_Key, p_Mask);
65700aeed3e9SJustin Hibbits 
6571852ba100SJustin Hibbits     FmPcdLockUnlockAll(p_FmPcd);
6572852ba100SJustin Hibbits 
6573852ba100SJustin Hibbits     switch(GET_ERROR_TYPE(err)
6574852ba100SJustin Hibbits )    {
6575852ba100SJustin Hibbits         case E_OK:
6576852ba100SJustin Hibbits         return E_OK;
6577852ba100SJustin Hibbits 
6578852ba100SJustin Hibbits         case E_BUSY:
6579852ba100SJustin Hibbits         DBG(TRACE, ("E_BUSY error"));
6580852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6581852ba100SJustin Hibbits 
6582852ba100SJustin Hibbits         default:
6583852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
6584852ba100SJustin Hibbits     }
6585852ba100SJustin Hibbits }
6586852ba100SJustin Hibbits 
FM_PCD_MatchTableModifyNextEngine(t_Handle h_CcNode,uint16_t keyIndex,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams)6587852ba100SJustin Hibbits t_Error FM_PCD_MatchTableModifyNextEngine(
6588852ba100SJustin Hibbits         t_Handle h_CcNode, uint16_t keyIndex,
6589852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
6590852ba100SJustin Hibbits {
6591852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
6592852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
6593852ba100SJustin Hibbits     t_Error err = E_OK;
6594852ba100SJustin Hibbits 
6595852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
6596852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
6597852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
6598852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
65990aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
66000aeed3e9SJustin Hibbits 
6601852ba100SJustin Hibbits     if (!FmPcdLockTryLockAll(p_FmPcd))
6602852ba100SJustin Hibbits     {
6603852ba100SJustin Hibbits         DBG(TRACE, ("FmPcdLockTryLockAll failed"));
6604852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
66050aeed3e9SJustin Hibbits     }
66060aeed3e9SJustin Hibbits 
6607852ba100SJustin Hibbits     err = ModifyNextEngineParamNode(p_FmPcd, p_CcNode, keyIndex,
6608852ba100SJustin Hibbits                                     p_FmPcdCcNextEngineParams);
66090aeed3e9SJustin Hibbits 
6610852ba100SJustin Hibbits     FmPcdLockUnlockAll(p_FmPcd);
6611852ba100SJustin Hibbits 
6612852ba100SJustin Hibbits     switch(GET_ERROR_TYPE(err)
6613852ba100SJustin Hibbits )    {
6614852ba100SJustin Hibbits         case E_OK:
6615852ba100SJustin Hibbits         return E_OK;
6616852ba100SJustin Hibbits 
6617852ba100SJustin Hibbits         case E_BUSY:
6618852ba100SJustin Hibbits         DBG(TRACE, ("E_BUSY error"));
6619852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6620852ba100SJustin Hibbits 
6621852ba100SJustin Hibbits         default:
6622852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
6623852ba100SJustin Hibbits     }
6624852ba100SJustin Hibbits }
6625852ba100SJustin Hibbits 
FM_PCD_MatchTableModifyMissNextEngine(t_Handle h_CcNode,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams)6626852ba100SJustin Hibbits t_Error FM_PCD_MatchTableModifyMissNextEngine(
6627852ba100SJustin Hibbits         t_Handle h_CcNode, t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
6628852ba100SJustin Hibbits {
6629852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
6630852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
6631852ba100SJustin Hibbits     t_Error err = E_OK;
6632852ba100SJustin Hibbits 
6633852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
6634852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
6635852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
6636852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
66370aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
66380aeed3e9SJustin Hibbits 
6639852ba100SJustin Hibbits     if (!FmPcdLockTryLockAll(p_FmPcd))
6640852ba100SJustin Hibbits     {
6641852ba100SJustin Hibbits         DBG(TRACE, ("FmPcdLockTryLockAll failed"));
6642852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
66430aeed3e9SJustin Hibbits     }
66440aeed3e9SJustin Hibbits 
6645852ba100SJustin Hibbits     err = FmPcdCcModifyMissNextEngineParamNode(p_FmPcd, p_CcNode,
6646852ba100SJustin Hibbits                                                p_FmPcdCcNextEngineParams);
66470aeed3e9SJustin Hibbits 
6648852ba100SJustin Hibbits     FmPcdLockUnlockAll(p_FmPcd);
6649852ba100SJustin Hibbits 
6650852ba100SJustin Hibbits     switch(GET_ERROR_TYPE(err)
6651852ba100SJustin Hibbits )    {
6652852ba100SJustin Hibbits         case E_OK:
6653852ba100SJustin Hibbits         return E_OK;
6654852ba100SJustin Hibbits 
6655852ba100SJustin Hibbits         case E_BUSY:
6656852ba100SJustin Hibbits         DBG(TRACE, ("E_BUSY error"));
6657852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6658852ba100SJustin Hibbits 
6659852ba100SJustin Hibbits         default:
6660852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
6661852ba100SJustin Hibbits     }
6662852ba100SJustin Hibbits }
6663852ba100SJustin Hibbits 
FM_PCD_MatchTableModifyKeyAndNextEngine(t_Handle h_CcNode,uint16_t keyIndex,uint8_t keySize,t_FmPcdCcKeyParams * p_KeyParams)6664852ba100SJustin Hibbits t_Error FM_PCD_MatchTableModifyKeyAndNextEngine(t_Handle h_CcNode,
6665852ba100SJustin Hibbits                                                 uint16_t keyIndex,
6666852ba100SJustin Hibbits                                                 uint8_t keySize,
6667852ba100SJustin Hibbits                                                 t_FmPcdCcKeyParams *p_KeyParams)
6668852ba100SJustin Hibbits {
6669852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
6670852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
6671852ba100SJustin Hibbits     t_Error err = E_OK;
6672852ba100SJustin Hibbits 
6673852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_KeyParams, E_NULL_POINTER);
6674852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
6675852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
6676852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
66770aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
66780aeed3e9SJustin Hibbits 
6679852ba100SJustin Hibbits     if (!FmPcdLockTryLockAll(p_FmPcd))
6680852ba100SJustin Hibbits     {
6681852ba100SJustin Hibbits         DBG(TRACE, ("FmPcdLockTryLockAll failed"));
6682852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
66830aeed3e9SJustin Hibbits     }
66840aeed3e9SJustin Hibbits 
6685852ba100SJustin Hibbits     err = FmPcdCcModifyKeyAndNextEngine(p_FmPcd, p_CcNode, keyIndex, keySize,
6686852ba100SJustin Hibbits                                         p_KeyParams);
66870aeed3e9SJustin Hibbits 
6688852ba100SJustin Hibbits     FmPcdLockUnlockAll(p_FmPcd);
6689852ba100SJustin Hibbits 
6690852ba100SJustin Hibbits     switch(GET_ERROR_TYPE(err)
6691852ba100SJustin Hibbits )    {
6692852ba100SJustin Hibbits         case E_OK:
6693852ba100SJustin Hibbits         return E_OK;
6694852ba100SJustin Hibbits 
6695852ba100SJustin Hibbits         case E_BUSY:
6696852ba100SJustin Hibbits         DBG(TRACE, ("E_BUSY error"));
6697852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6698852ba100SJustin Hibbits 
6699852ba100SJustin Hibbits         default:
6700852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
6701852ba100SJustin Hibbits     }
6702852ba100SJustin Hibbits }
6703852ba100SJustin Hibbits 
FM_PCD_MatchTableFindNRemoveKey(t_Handle h_CcNode,uint8_t keySize,uint8_t * p_Key,uint8_t * p_Mask)6704852ba100SJustin Hibbits t_Error FM_PCD_MatchTableFindNRemoveKey(t_Handle h_CcNode, uint8_t keySize,
6705852ba100SJustin Hibbits                                         uint8_t *p_Key, uint8_t *p_Mask)
6706852ba100SJustin Hibbits {
6707852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
6708852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
6709852ba100SJustin Hibbits     uint16_t keyIndex;
6710852ba100SJustin Hibbits     t_Error err;
6711852ba100SJustin Hibbits 
6712852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
6713852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
6714852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
6715852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
67160aeed3e9SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
67170aeed3e9SJustin Hibbits 
6718852ba100SJustin Hibbits     if (!FmPcdLockTryLockAll(p_FmPcd))
6719852ba100SJustin Hibbits     {
6720852ba100SJustin Hibbits         DBG(TRACE, ("FmPcdLockTryLockAll failed"));
6721852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
67220aeed3e9SJustin Hibbits     }
67230aeed3e9SJustin Hibbits 
6724852ba100SJustin Hibbits     err = FindKeyIndex(p_CcNode, keySize, p_Key, p_Mask, &keyIndex);
6725852ba100SJustin Hibbits     if (GET_ERROR_TYPE(err) != E_OK)
67260aeed3e9SJustin Hibbits     {
6727852ba100SJustin Hibbits         FmPcdLockUnlockAll(p_FmPcd);
6728852ba100SJustin Hibbits         RETURN_ERROR(
6729852ba100SJustin Hibbits                 MAJOR,
6730852ba100SJustin Hibbits                 err,
6731852ba100SJustin Hibbits                 ("The received key and mask pair was not found in the match table of the provided node"));
6732852ba100SJustin Hibbits     }
67330aeed3e9SJustin Hibbits 
6734852ba100SJustin Hibbits     err = FmPcdCcRemoveKey(p_FmPcd, p_CcNode, keyIndex);
67350aeed3e9SJustin Hibbits 
6736852ba100SJustin Hibbits     FmPcdLockUnlockAll(p_FmPcd);
6737852ba100SJustin Hibbits 
6738852ba100SJustin Hibbits     switch(GET_ERROR_TYPE(err)
6739852ba100SJustin Hibbits )    {
6740852ba100SJustin Hibbits         case E_OK:
6741852ba100SJustin Hibbits         return E_OK;
6742852ba100SJustin Hibbits 
6743852ba100SJustin Hibbits         case E_BUSY:
6744852ba100SJustin Hibbits         DBG(TRACE, ("E_BUSY error"));
6745852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6746852ba100SJustin Hibbits 
6747852ba100SJustin Hibbits         default:
6748852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
6749852ba100SJustin Hibbits     }
6750852ba100SJustin Hibbits }
6751852ba100SJustin Hibbits 
FM_PCD_MatchTableFindNModifyNextEngine(t_Handle h_CcNode,uint8_t keySize,uint8_t * p_Key,uint8_t * p_Mask,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams)6752852ba100SJustin Hibbits t_Error FM_PCD_MatchTableFindNModifyNextEngine(
6753852ba100SJustin Hibbits         t_Handle h_CcNode, uint8_t keySize, uint8_t *p_Key, uint8_t *p_Mask,
6754852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
67550aeed3e9SJustin Hibbits {
6756852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
6757852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
6758852ba100SJustin Hibbits     uint16_t keyIndex;
6759852ba100SJustin Hibbits     t_Error err;
6760852ba100SJustin Hibbits 
6761852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
6762852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
6763852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
6764852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
6765852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
6766852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
6767852ba100SJustin Hibbits 
6768852ba100SJustin Hibbits     if (!FmPcdLockTryLockAll(p_FmPcd))
6769852ba100SJustin Hibbits     {
6770852ba100SJustin Hibbits         DBG(TRACE, ("FmPcdLockTryLockAll failed"));
6771852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6772852ba100SJustin Hibbits     }
6773852ba100SJustin Hibbits 
6774852ba100SJustin Hibbits     err = FindKeyIndex(p_CcNode, keySize, p_Key, p_Mask, &keyIndex);
6775852ba100SJustin Hibbits     if (GET_ERROR_TYPE(err) != E_OK)
6776852ba100SJustin Hibbits     {
6777852ba100SJustin Hibbits         FmPcdLockUnlockAll(p_FmPcd);
6778852ba100SJustin Hibbits         RETURN_ERROR(
6779852ba100SJustin Hibbits                 MAJOR,
6780852ba100SJustin Hibbits                 err,
6781852ba100SJustin Hibbits                 ("The received key and mask pair was not found in the match table of the provided node"));
6782852ba100SJustin Hibbits     }
6783852ba100SJustin Hibbits 
6784852ba100SJustin Hibbits     err = ModifyNextEngineParamNode(p_FmPcd, p_CcNode, keyIndex,
6785852ba100SJustin Hibbits                                     p_FmPcdCcNextEngineParams);
6786852ba100SJustin Hibbits 
6787852ba100SJustin Hibbits     FmPcdLockUnlockAll(p_FmPcd);
6788852ba100SJustin Hibbits 
6789852ba100SJustin Hibbits     switch(GET_ERROR_TYPE(err)
6790852ba100SJustin Hibbits )    {
6791852ba100SJustin Hibbits         case E_OK:
6792852ba100SJustin Hibbits         return E_OK;
6793852ba100SJustin Hibbits 
6794852ba100SJustin Hibbits         case E_BUSY:
6795852ba100SJustin Hibbits         DBG(TRACE, ("E_BUSY error"));
6796852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6797852ba100SJustin Hibbits 
6798852ba100SJustin Hibbits         default:
6799852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
6800852ba100SJustin Hibbits     }
6801852ba100SJustin Hibbits }
6802852ba100SJustin Hibbits 
FM_PCD_MatchTableFindNModifyKeyAndNextEngine(t_Handle h_CcNode,uint8_t keySize,uint8_t * p_Key,uint8_t * p_Mask,t_FmPcdCcKeyParams * p_KeyParams)6803852ba100SJustin Hibbits t_Error FM_PCD_MatchTableFindNModifyKeyAndNextEngine(
6804852ba100SJustin Hibbits         t_Handle h_CcNode, uint8_t keySize, uint8_t *p_Key, uint8_t *p_Mask,
6805852ba100SJustin Hibbits         t_FmPcdCcKeyParams *p_KeyParams)
6806852ba100SJustin Hibbits {
6807852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
6808852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
6809852ba100SJustin Hibbits     uint16_t keyIndex;
6810852ba100SJustin Hibbits     t_Error err;
6811852ba100SJustin Hibbits 
6812852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
6813852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_KeyParams, E_NULL_POINTER);
6814852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
6815852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
6816852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
6817852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
6818852ba100SJustin Hibbits 
6819852ba100SJustin Hibbits     if (!FmPcdLockTryLockAll(p_FmPcd))
6820852ba100SJustin Hibbits     {
6821852ba100SJustin Hibbits         DBG(TRACE, ("FmPcdLockTryLockAll failed"));
6822852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6823852ba100SJustin Hibbits     }
6824852ba100SJustin Hibbits 
6825852ba100SJustin Hibbits     err = FindKeyIndex(p_CcNode, keySize, p_Key, p_Mask, &keyIndex);
6826852ba100SJustin Hibbits     if (GET_ERROR_TYPE(err) != E_OK)
6827852ba100SJustin Hibbits     {
6828852ba100SJustin Hibbits         FmPcdLockUnlockAll(p_FmPcd);
6829852ba100SJustin Hibbits         RETURN_ERROR(
6830852ba100SJustin Hibbits                 MAJOR,
6831852ba100SJustin Hibbits                 err,
6832852ba100SJustin Hibbits                 ("The received key and mask pair was not found in the match table of the provided node"));
6833852ba100SJustin Hibbits     }
6834852ba100SJustin Hibbits 
6835852ba100SJustin Hibbits     err = FmPcdCcModifyKeyAndNextEngine(p_FmPcd, h_CcNode, keyIndex, keySize,
6836852ba100SJustin Hibbits                                         p_KeyParams);
6837852ba100SJustin Hibbits 
6838852ba100SJustin Hibbits     FmPcdLockUnlockAll(p_FmPcd);
6839852ba100SJustin Hibbits 
6840852ba100SJustin Hibbits     switch(GET_ERROR_TYPE(err)
6841852ba100SJustin Hibbits )    {
6842852ba100SJustin Hibbits         case E_OK:
6843852ba100SJustin Hibbits         return E_OK;
6844852ba100SJustin Hibbits 
6845852ba100SJustin Hibbits         case E_BUSY:
6846852ba100SJustin Hibbits         DBG(TRACE, ("E_BUSY error"));
6847852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6848852ba100SJustin Hibbits 
6849852ba100SJustin Hibbits         default:
6850852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
6851852ba100SJustin Hibbits     }
6852852ba100SJustin Hibbits }
6853852ba100SJustin Hibbits 
FM_PCD_MatchTableFindNModifyKey(t_Handle h_CcNode,uint8_t keySize,uint8_t * p_Key,uint8_t * p_Mask,uint8_t * p_NewKey,uint8_t * p_NewMask)6854852ba100SJustin Hibbits t_Error FM_PCD_MatchTableFindNModifyKey(t_Handle h_CcNode, uint8_t keySize,
6855852ba100SJustin Hibbits                                         uint8_t *p_Key, uint8_t *p_Mask,
6856852ba100SJustin Hibbits                                         uint8_t *p_NewKey, uint8_t *p_NewMask)
6857852ba100SJustin Hibbits {
6858852ba100SJustin Hibbits     t_FmPcd *p_FmPcd;
6859852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
6860852ba100SJustin Hibbits     t_List h_List;
6861852ba100SJustin Hibbits     uint16_t keyIndex;
6862852ba100SJustin Hibbits     t_Error err;
6863852ba100SJustin Hibbits 
6864852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
6865852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_NewKey, E_NULL_POINTER);
6866852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
6867852ba100SJustin Hibbits     p_FmPcd = (t_FmPcd *)p_CcNode->h_FmPcd;
6868852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
6869852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_HANDLE);
6870852ba100SJustin Hibbits 
6871852ba100SJustin Hibbits     INIT_LIST(&h_List);
6872852ba100SJustin Hibbits 
6873852ba100SJustin Hibbits     err = FmPcdCcNodeTreeTryLock(p_FmPcd, p_CcNode, &h_List);
6874852ba100SJustin Hibbits     if (err)
6875852ba100SJustin Hibbits     {
6876852ba100SJustin Hibbits         DBG(TRACE, ("Node's trees lock failed"));
6877852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6878852ba100SJustin Hibbits     }
6879852ba100SJustin Hibbits 
6880852ba100SJustin Hibbits     err = FindKeyIndex(p_CcNode, keySize, p_Key, p_Mask, &keyIndex);
6881852ba100SJustin Hibbits     if (GET_ERROR_TYPE(err) != E_OK)
6882852ba100SJustin Hibbits     {
6883852ba100SJustin Hibbits         FmPcdCcNodeTreeReleaseLock(p_FmPcd, &h_List);
6884852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err,
6885852ba100SJustin Hibbits                      ("The received key and mask pair was not found in the "
6886852ba100SJustin Hibbits                      "match table of the provided node"));
6887852ba100SJustin Hibbits     }
6888852ba100SJustin Hibbits 
6889852ba100SJustin Hibbits     err = FmPcdCcModifyKey(p_FmPcd, p_CcNode, keyIndex, keySize, p_NewKey,
6890852ba100SJustin Hibbits                            p_NewMask);
6891852ba100SJustin Hibbits 
6892852ba100SJustin Hibbits     FmPcdCcNodeTreeReleaseLock(p_FmPcd, &h_List);
6893852ba100SJustin Hibbits 
6894852ba100SJustin Hibbits     switch(GET_ERROR_TYPE(err)
6895852ba100SJustin Hibbits )    {
6896852ba100SJustin Hibbits         case E_OK:
6897852ba100SJustin Hibbits         return E_OK;
6898852ba100SJustin Hibbits 
6899852ba100SJustin Hibbits         case E_BUSY:
6900852ba100SJustin Hibbits         DBG(TRACE, ("E_BUSY error"));
6901852ba100SJustin Hibbits         return ERROR_CODE(E_BUSY);
6902852ba100SJustin Hibbits 
6903852ba100SJustin Hibbits         default:
6904852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
6905852ba100SJustin Hibbits     }
6906852ba100SJustin Hibbits }
6907852ba100SJustin Hibbits 
FM_PCD_MatchTableGetNextEngine(t_Handle h_CcNode,uint16_t keyIndex,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams)6908852ba100SJustin Hibbits t_Error FM_PCD_MatchTableGetNextEngine(
6909852ba100SJustin Hibbits         t_Handle h_CcNode, uint16_t keyIndex,
6910852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
6911852ba100SJustin Hibbits {
6912852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
6913852ba100SJustin Hibbits 
6914852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNode, E_INVALID_HANDLE);
6915852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
6916852ba100SJustin Hibbits 
6917852ba100SJustin Hibbits     if (keyIndex >= p_CcNode->numOfKeys)
6918852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE,
6919852ba100SJustin Hibbits                      ("keyIndex exceeds current number of keys"));
6920852ba100SJustin Hibbits 
6921852ba100SJustin Hibbits     if (keyIndex > (FM_PCD_MAX_NUM_OF_KEYS - 1))
6922852ba100SJustin Hibbits         RETURN_ERROR(
6923852ba100SJustin Hibbits                 MAJOR,
6924852ba100SJustin Hibbits                 E_INVALID_VALUE,
6925852ba100SJustin Hibbits                 ("keyIndex can not be larger than %d", (FM_PCD_MAX_NUM_OF_KEYS - 1)));
6926852ba100SJustin Hibbits 
6927852ba100SJustin Hibbits     memcpy(p_FmPcdCcNextEngineParams,
6928852ba100SJustin Hibbits            &p_CcNode->keyAndNextEngineParams[keyIndex].nextEngineParams,
6929852ba100SJustin Hibbits            sizeof(t_FmPcdCcNextEngineParams));
6930852ba100SJustin Hibbits 
6931852ba100SJustin Hibbits     return E_OK;
6932852ba100SJustin Hibbits }
6933852ba100SJustin Hibbits 
6934852ba100SJustin Hibbits 
FM_PCD_MatchTableGetKeyCounter(t_Handle h_CcNode,uint16_t keyIndex)6935852ba100SJustin Hibbits uint32_t FM_PCD_MatchTableGetKeyCounter(t_Handle h_CcNode, uint16_t keyIndex)
6936852ba100SJustin Hibbits {
6937852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
6938852ba100SJustin Hibbits     uint32_t *p_StatsCounters, frameCount;
6939852ba100SJustin Hibbits     uint32_t intFlags;
6940852ba100SJustin Hibbits 
6941852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(p_CcNode, E_INVALID_HANDLE, 0);
6942852ba100SJustin Hibbits 
6943852ba100SJustin Hibbits     if (p_CcNode->statisticsMode == e_FM_PCD_CC_STATS_MODE_NONE)
6944852ba100SJustin Hibbits     {
6945852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Statistics were not enabled for this match table"));
69460aeed3e9SJustin Hibbits         return 0;
69470aeed3e9SJustin Hibbits     }
69480aeed3e9SJustin Hibbits 
6949852ba100SJustin Hibbits     if ((p_CcNode->statisticsMode != e_FM_PCD_CC_STATS_MODE_FRAME)
6950852ba100SJustin Hibbits             && (p_CcNode->statisticsMode
6951852ba100SJustin Hibbits                     != e_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME))
69520aeed3e9SJustin Hibbits     {
6953852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Frame count is not supported in the statistics mode of this match table"));
69540aeed3e9SJustin Hibbits         return 0;
69550aeed3e9SJustin Hibbits     }
69560aeed3e9SJustin Hibbits 
6957852ba100SJustin Hibbits     intFlags = XX_LockIntrSpinlock(p_CcNode->h_Spinlock);
6958852ba100SJustin Hibbits 
6959852ba100SJustin Hibbits     if (keyIndex >= p_CcNode->numOfKeys)
69600aeed3e9SJustin Hibbits     {
6961852ba100SJustin Hibbits         XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
6962852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_INVALID_STATE, ("The provided keyIndex exceeds the number of keys in this match table"));
69630aeed3e9SJustin Hibbits         return 0;
69640aeed3e9SJustin Hibbits     }
69650aeed3e9SJustin Hibbits 
6966852ba100SJustin Hibbits     if (!p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj)
6967852ba100SJustin Hibbits     {
6968852ba100SJustin Hibbits         XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
6969852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Statistics were not enabled for this key"));
6970852ba100SJustin Hibbits         return 0;
6971852ba100SJustin Hibbits     }
6972852ba100SJustin Hibbits 
6973852ba100SJustin Hibbits     p_StatsCounters =
6974852ba100SJustin Hibbits             p_CcNode->keyAndNextEngineParams[keyIndex].p_StatsObj->h_StatsCounters;
6975852ba100SJustin Hibbits     ASSERT_COND(p_StatsCounters);
6976852ba100SJustin Hibbits 
6977852ba100SJustin Hibbits     /* The first counter is byte counter, so we need to advance to the next counter */
6978852ba100SJustin Hibbits     frameCount = GET_UINT32(*(uint32_t *)(PTR_MOVE(p_StatsCounters,
6979852ba100SJustin Hibbits                             FM_PCD_CC_STATS_COUNTER_SIZE)));
6980852ba100SJustin Hibbits 
6981852ba100SJustin Hibbits     XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
6982852ba100SJustin Hibbits 
6983852ba100SJustin Hibbits     return frameCount;
6984852ba100SJustin Hibbits }
6985852ba100SJustin Hibbits 
FM_PCD_MatchTableGetKeyStatistics(t_Handle h_CcNode,uint16_t keyIndex,t_FmPcdCcKeyStatistics * p_KeyStatistics)6986852ba100SJustin Hibbits t_Error FM_PCD_MatchTableGetKeyStatistics(
6987852ba100SJustin Hibbits         t_Handle h_CcNode, uint16_t keyIndex,
6988852ba100SJustin Hibbits         t_FmPcdCcKeyStatistics *p_KeyStatistics)
6989852ba100SJustin Hibbits {
6990852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
6991852ba100SJustin Hibbits     uint32_t intFlags;
6992852ba100SJustin Hibbits     t_Error err;
6993852ba100SJustin Hibbits 
6994852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_CcNode, E_INVALID_HANDLE);
6995852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_KeyStatistics, E_NULL_POINTER);
6996852ba100SJustin Hibbits 
6997852ba100SJustin Hibbits     intFlags = XX_LockIntrSpinlock(p_CcNode->h_Spinlock);
6998852ba100SJustin Hibbits 
6999852ba100SJustin Hibbits     if (keyIndex >= p_CcNode->numOfKeys)
7000852ba100SJustin Hibbits         RETURN_ERROR(
7001852ba100SJustin Hibbits                 MAJOR,
7002852ba100SJustin Hibbits                 E_INVALID_STATE,
7003852ba100SJustin Hibbits                 ("The provided keyIndex exceeds the number of keys in this match table"));
7004852ba100SJustin Hibbits 
7005852ba100SJustin Hibbits     err = MatchTableGetKeyStatistics(p_CcNode, keyIndex, p_KeyStatistics);
7006852ba100SJustin Hibbits 
7007852ba100SJustin Hibbits     XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
7008852ba100SJustin Hibbits 
7009852ba100SJustin Hibbits     if (err != E_OK)
7010852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
7011852ba100SJustin Hibbits 
7012852ba100SJustin Hibbits     return E_OK;
7013852ba100SJustin Hibbits }
7014852ba100SJustin Hibbits 
FM_PCD_MatchTableGetMissStatistics(t_Handle h_CcNode,t_FmPcdCcKeyStatistics * p_MissStatistics)7015852ba100SJustin Hibbits t_Error FM_PCD_MatchTableGetMissStatistics(
7016852ba100SJustin Hibbits         t_Handle h_CcNode, t_FmPcdCcKeyStatistics *p_MissStatistics)
7017852ba100SJustin Hibbits {
7018852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
7019852ba100SJustin Hibbits     uint32_t intFlags;
7020852ba100SJustin Hibbits     t_Error err;
7021852ba100SJustin Hibbits 
7022852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_CcNode, E_INVALID_HANDLE);
7023852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_MissStatistics, E_NULL_POINTER);
7024852ba100SJustin Hibbits 
7025852ba100SJustin Hibbits     intFlags = XX_LockIntrSpinlock(p_CcNode->h_Spinlock);
7026852ba100SJustin Hibbits 
7027852ba100SJustin Hibbits     err = MatchTableGetKeyStatistics(p_CcNode, p_CcNode->numOfKeys,
7028852ba100SJustin Hibbits                                      p_MissStatistics);
7029852ba100SJustin Hibbits 
7030852ba100SJustin Hibbits     XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
7031852ba100SJustin Hibbits 
7032852ba100SJustin Hibbits     if (err != E_OK)
7033852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
7034852ba100SJustin Hibbits 
7035852ba100SJustin Hibbits     return E_OK;
7036852ba100SJustin Hibbits }
7037852ba100SJustin Hibbits 
FM_PCD_MatchTableFindNGetKeyStatistics(t_Handle h_CcNode,uint8_t keySize,uint8_t * p_Key,uint8_t * p_Mask,t_FmPcdCcKeyStatistics * p_KeyStatistics)7038852ba100SJustin Hibbits t_Error FM_PCD_MatchTableFindNGetKeyStatistics(
7039852ba100SJustin Hibbits         t_Handle h_CcNode, uint8_t keySize, uint8_t *p_Key, uint8_t *p_Mask,
7040852ba100SJustin Hibbits         t_FmPcdCcKeyStatistics *p_KeyStatistics)
7041852ba100SJustin Hibbits {
7042852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
7043852ba100SJustin Hibbits     uint16_t keyIndex;
7044852ba100SJustin Hibbits     uint32_t intFlags;
7045852ba100SJustin Hibbits     t_Error err;
7046852ba100SJustin Hibbits 
7047852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
7048852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_KeyStatistics, E_NULL_POINTER);
7049852ba100SJustin Hibbits 
7050852ba100SJustin Hibbits     intFlags = XX_LockIntrSpinlock(p_CcNode->h_Spinlock);
7051852ba100SJustin Hibbits 
7052852ba100SJustin Hibbits     err = FindKeyIndex(p_CcNode, keySize, p_Key, p_Mask, &keyIndex);
7053852ba100SJustin Hibbits     if (GET_ERROR_TYPE(err) != E_OK)
7054852ba100SJustin Hibbits     {
7055852ba100SJustin Hibbits         XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
7056852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err,
7057852ba100SJustin Hibbits                      ("The received key and mask pair was not found in the "
7058852ba100SJustin Hibbits                      "match table of the provided node"));
7059852ba100SJustin Hibbits     }
7060852ba100SJustin Hibbits 
7061852ba100SJustin Hibbits     ASSERT_COND(keyIndex < p_CcNode->numOfKeys);
7062852ba100SJustin Hibbits 
7063852ba100SJustin Hibbits     err = MatchTableGetKeyStatistics(p_CcNode, keyIndex, p_KeyStatistics);
7064852ba100SJustin Hibbits 
7065852ba100SJustin Hibbits     XX_UnlockIntrSpinlock(p_CcNode->h_Spinlock, intFlags);
7066852ba100SJustin Hibbits 
7067852ba100SJustin Hibbits     if (err != E_OK)
7068852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
7069852ba100SJustin Hibbits 
7070852ba100SJustin Hibbits     return E_OK;
7071852ba100SJustin Hibbits }
7072852ba100SJustin Hibbits 
FM_PCD_MatchTableGetIndexedHashBucket(t_Handle h_CcNode,uint8_t keySize,uint8_t * p_Key,uint8_t hashShift,t_Handle * p_CcNodeBucketHandle,uint8_t * p_BucketIndex,uint16_t * p_LastIndex)7073852ba100SJustin Hibbits t_Error FM_PCD_MatchTableGetIndexedHashBucket(t_Handle h_CcNode,
7074852ba100SJustin Hibbits                                               uint8_t keySize, uint8_t *p_Key,
7075852ba100SJustin Hibbits                                               uint8_t hashShift,
7076852ba100SJustin Hibbits                                               t_Handle *p_CcNodeBucketHandle,
7077852ba100SJustin Hibbits                                               uint8_t *p_BucketIndex,
7078852ba100SJustin Hibbits                                               uint16_t *p_LastIndex)
7079852ba100SJustin Hibbits {
7080852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode = (t_FmPcdCcNode *)h_CcNode;
7081852ba100SJustin Hibbits     uint16_t glblMask;
7082852ba100SJustin Hibbits     uint64_t crc64 = 0;
7083852ba100SJustin Hibbits 
7084852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_CcNode, E_INVALID_HANDLE);
7085852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(
7086852ba100SJustin Hibbits             p_CcNode->parseCode == CC_PC_GENERIC_IC_HASH_INDEXED,
7087852ba100SJustin Hibbits             E_INVALID_STATE);
7088852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
7089852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_CcNodeBucketHandle, E_NULL_POINTER);
7090852ba100SJustin Hibbits 
7091852ba100SJustin Hibbits     memcpy(&glblMask, PTR_MOVE(p_CcNode->p_GlblMask, 2), 2);
7092852ba100SJustin Hibbits     glblMask = be16toh(glblMask);
7093852ba100SJustin Hibbits 
7094852ba100SJustin Hibbits     crc64 = crc64_init();
7095852ba100SJustin Hibbits     crc64 = crc64_compute(p_Key, keySize, crc64);
7096852ba100SJustin Hibbits     crc64 >>= hashShift;
7097852ba100SJustin Hibbits 
7098852ba100SJustin Hibbits     *p_BucketIndex = (uint8_t)(((crc64 >> (8 * (6 - p_CcNode->userOffset)))
7099852ba100SJustin Hibbits             & glblMask) >> 4);
7100852ba100SJustin Hibbits     if (*p_BucketIndex >= p_CcNode->numOfKeys)
7101852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NOT_IN_RANGE, ("bucket index!"));
7102852ba100SJustin Hibbits 
7103852ba100SJustin Hibbits     *p_CcNodeBucketHandle =
7104852ba100SJustin Hibbits             p_CcNode->keyAndNextEngineParams[*p_BucketIndex].nextEngineParams.params.ccParams.h_CcNode;
7105852ba100SJustin Hibbits     if (!*p_CcNodeBucketHandle)
7106852ba100SJustin Hibbits         RETURN_ERROR(MINOR, E_NOT_FOUND, ("bucket!"));
7107852ba100SJustin Hibbits 
7108852ba100SJustin Hibbits     *p_LastIndex = ((t_FmPcdCcNode *)*p_CcNodeBucketHandle)->numOfKeys;
7109852ba100SJustin Hibbits 
7110852ba100SJustin Hibbits     return E_OK;
7111852ba100SJustin Hibbits }
7112852ba100SJustin Hibbits 
FM_PCD_HashTableSet(t_Handle h_FmPcd,t_FmPcdHashTableParams * p_Param)7113852ba100SJustin Hibbits t_Handle FM_PCD_HashTableSet(t_Handle h_FmPcd, t_FmPcdHashTableParams *p_Param)
7114852ba100SJustin Hibbits {
7115852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNodeHashTbl;
7116852ba100SJustin Hibbits     t_FmPcdCcNodeParams *p_IndxHashCcNodeParam, *p_ExactMatchCcNodeParam;
7117852ba100SJustin Hibbits     t_FmPcdCcNode *p_CcNode;
7118852ba100SJustin Hibbits     t_Handle h_MissStatsCounters = NULL;
7119852ba100SJustin Hibbits     t_FmPcdCcKeyParams *p_HashKeyParams;
7120852ba100SJustin Hibbits     int i;
7121852ba100SJustin Hibbits     uint16_t numOfSets, numOfWays, countMask, onesCount = 0;
7122852ba100SJustin Hibbits     bool statsEnForMiss = FALSE;
7123852ba100SJustin Hibbits     t_Error err;
7124852ba100SJustin Hibbits 
7125852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, NULL);
7126852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(p_Param, E_NULL_POINTER, NULL);
7127852ba100SJustin Hibbits 
7128852ba100SJustin Hibbits     if (p_Param->maxNumOfKeys == 0)
7129852ba100SJustin Hibbits     {
7130852ba100SJustin Hibbits         REPORT_ERROR(MINOR, E_INVALID_VALUE, ("Max number of keys must be higher then 0"));
7131852ba100SJustin Hibbits         return NULL;
7132852ba100SJustin Hibbits     }
7133852ba100SJustin Hibbits 
7134852ba100SJustin Hibbits     if (p_Param->hashResMask == 0)
7135852ba100SJustin Hibbits     {
7136852ba100SJustin Hibbits         REPORT_ERROR(MINOR, E_INVALID_VALUE, ("Hash result mask must differ from 0"));
7137852ba100SJustin Hibbits         return NULL;
7138852ba100SJustin Hibbits     }
7139852ba100SJustin Hibbits 
7140852ba100SJustin Hibbits     /*Fix: QorIQ SDK / QSDK-2131*/
7141852ba100SJustin Hibbits     if (p_Param->ccNextEngineParamsForMiss.nextEngine == e_FM_PCD_INVALID)
7142852ba100SJustin Hibbits     {
7143852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("Next PCD Engine for on-miss entry is invalid. On-miss entry is always required. You can use e_FM_PCD_DONE."));
7144852ba100SJustin Hibbits         return NULL;
7145852ba100SJustin Hibbits     }
7146852ba100SJustin Hibbits 
7147852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
7148852ba100SJustin Hibbits     if (p_Param->statisticsMode == e_FM_PCD_CC_STATS_MODE_RMON)
7149852ba100SJustin Hibbits     {
7150852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_INVALID_VALUE,
7151852ba100SJustin Hibbits                 ("RMON statistics mode is not supported for hash table"));
7152852ba100SJustin Hibbits         return NULL;
7153852ba100SJustin Hibbits     }
7154852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
7155852ba100SJustin Hibbits 
7156852ba100SJustin Hibbits     p_ExactMatchCcNodeParam = (t_FmPcdCcNodeParams*)XX_Malloc(
7157852ba100SJustin Hibbits             sizeof(t_FmPcdCcNodeParams));
7158852ba100SJustin Hibbits     if (!p_ExactMatchCcNodeParam)
7159852ba100SJustin Hibbits     {
7160852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("p_ExactMatchCcNodeParam"));
7161852ba100SJustin Hibbits         return NULL;
7162852ba100SJustin Hibbits     }
7163852ba100SJustin Hibbits     memset(p_ExactMatchCcNodeParam, 0, sizeof(t_FmPcdCcNodeParams));
7164852ba100SJustin Hibbits 
7165852ba100SJustin Hibbits     p_IndxHashCcNodeParam = (t_FmPcdCcNodeParams*)XX_Malloc(
7166852ba100SJustin Hibbits             sizeof(t_FmPcdCcNodeParams));
7167852ba100SJustin Hibbits     if (!p_IndxHashCcNodeParam)
7168852ba100SJustin Hibbits     {
7169852ba100SJustin Hibbits         XX_Free(p_ExactMatchCcNodeParam);
7170852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("p_IndxHashCcNodeParam"));
7171852ba100SJustin Hibbits         return NULL;
7172852ba100SJustin Hibbits     }
7173852ba100SJustin Hibbits     memset(p_IndxHashCcNodeParam, 0, sizeof(t_FmPcdCcNodeParams));
7174852ba100SJustin Hibbits 
7175852ba100SJustin Hibbits     /* Calculate number of sets and number of ways of the hash table */
7176852ba100SJustin Hibbits     countMask = (uint16_t)(p_Param->hashResMask >> 4);
7177852ba100SJustin Hibbits     while (countMask)
7178852ba100SJustin Hibbits     {
7179852ba100SJustin Hibbits         onesCount++;
7180852ba100SJustin Hibbits         countMask = (uint16_t)(countMask >> 1);
7181852ba100SJustin Hibbits     }
7182852ba100SJustin Hibbits 
7183852ba100SJustin Hibbits     numOfSets = (uint16_t)(1 << onesCount);
7184852ba100SJustin Hibbits     numOfWays = (uint16_t)DIV_CEIL(p_Param->maxNumOfKeys, numOfSets);
7185852ba100SJustin Hibbits 
7186852ba100SJustin Hibbits     if (p_Param->maxNumOfKeys % numOfSets)
7187852ba100SJustin Hibbits         DBG(INFO, ("'maxNumOfKeys' is not a multiple of hash number of ways, so number of ways will be rounded up"));
7188852ba100SJustin Hibbits 
7189852ba100SJustin Hibbits     if ((p_Param->statisticsMode == e_FM_PCD_CC_STATS_MODE_FRAME)
7190852ba100SJustin Hibbits             || (p_Param->statisticsMode == e_FM_PCD_CC_STATS_MODE_BYTE_AND_FRAME))
7191852ba100SJustin Hibbits     {
7192852ba100SJustin Hibbits         /* Allocating a statistics counters table that will be used by all
7193852ba100SJustin Hibbits          'miss' entries of the hash table */
7194852ba100SJustin Hibbits         h_MissStatsCounters = (t_Handle)FM_MURAM_AllocMem(
7195852ba100SJustin Hibbits                 FmPcdGetMuramHandle(h_FmPcd), 2 * FM_PCD_CC_STATS_COUNTER_SIZE,
7196852ba100SJustin Hibbits                 FM_PCD_CC_AD_TABLE_ALIGN);
7197852ba100SJustin Hibbits         if (!h_MissStatsCounters)
7198852ba100SJustin Hibbits         {
7199852ba100SJustin Hibbits             REPORT_ERROR(MAJOR, E_NO_MEMORY, ("MURAM allocation for statistics table for hash miss"));
7200852ba100SJustin Hibbits             XX_Free(p_IndxHashCcNodeParam);
7201852ba100SJustin Hibbits             XX_Free(p_ExactMatchCcNodeParam);
7202852ba100SJustin Hibbits             return NULL;
7203852ba100SJustin Hibbits         }
7204852ba100SJustin Hibbits         memset(h_MissStatsCounters, 0, (2 * FM_PCD_CC_STATS_COUNTER_SIZE));
7205852ba100SJustin Hibbits 
7206852ba100SJustin Hibbits         /* Always enable statistics for 'miss', so that a statistics AD will be
7207852ba100SJustin Hibbits          initialized from the start. We'll store the requested 'statistics enable'
7208852ba100SJustin Hibbits          value and it will be used when statistics are read by the user. */
7209852ba100SJustin Hibbits         statsEnForMiss = p_Param->ccNextEngineParamsForMiss.statisticsEn;
7210852ba100SJustin Hibbits         p_Param->ccNextEngineParamsForMiss.statisticsEn = TRUE;
7211852ba100SJustin Hibbits     }
7212852ba100SJustin Hibbits 
7213852ba100SJustin Hibbits     /* Building exact-match node params, will be used to create the hash buckets */
7214852ba100SJustin Hibbits     p_ExactMatchCcNodeParam->extractCcParams.type = e_FM_PCD_EXTRACT_NON_HDR;
7215852ba100SJustin Hibbits 
7216852ba100SJustin Hibbits     p_ExactMatchCcNodeParam->extractCcParams.extractNonHdr.src =
7217852ba100SJustin Hibbits             e_FM_PCD_EXTRACT_FROM_KEY;
7218852ba100SJustin Hibbits     p_ExactMatchCcNodeParam->extractCcParams.extractNonHdr.action =
7219852ba100SJustin Hibbits             e_FM_PCD_ACTION_EXACT_MATCH;
7220852ba100SJustin Hibbits     p_ExactMatchCcNodeParam->extractCcParams.extractNonHdr.offset = 0;
7221852ba100SJustin Hibbits     p_ExactMatchCcNodeParam->extractCcParams.extractNonHdr.size =
7222852ba100SJustin Hibbits             p_Param->matchKeySize;
7223852ba100SJustin Hibbits 
7224852ba100SJustin Hibbits     p_ExactMatchCcNodeParam->keysParams.maxNumOfKeys = numOfWays;
7225852ba100SJustin Hibbits     p_ExactMatchCcNodeParam->keysParams.maskSupport = FALSE;
7226852ba100SJustin Hibbits     p_ExactMatchCcNodeParam->keysParams.statisticsMode =
7227852ba100SJustin Hibbits             p_Param->statisticsMode;
7228852ba100SJustin Hibbits     p_ExactMatchCcNodeParam->keysParams.numOfKeys = 0;
7229852ba100SJustin Hibbits     p_ExactMatchCcNodeParam->keysParams.keySize = p_Param->matchKeySize;
7230852ba100SJustin Hibbits     p_ExactMatchCcNodeParam->keysParams.ccNextEngineParamsForMiss =
7231852ba100SJustin Hibbits             p_Param->ccNextEngineParamsForMiss;
7232852ba100SJustin Hibbits 
7233852ba100SJustin Hibbits     p_HashKeyParams = p_IndxHashCcNodeParam->keysParams.keyParams;
7234852ba100SJustin Hibbits 
7235852ba100SJustin Hibbits     for (i = 0; i < numOfSets; i++)
7236852ba100SJustin Hibbits     {
7237852ba100SJustin Hibbits         /* Each exact-match node will be marked as a 'bucket' and provided with
7238852ba100SJustin Hibbits            a pointer to statistics counters, to be used for 'miss' entry
7239852ba100SJustin Hibbits            statistics */
7240852ba100SJustin Hibbits         p_CcNode = (t_FmPcdCcNode *)XX_Malloc(sizeof(t_FmPcdCcNode));
7241852ba100SJustin Hibbits         if (!p_CcNode)
7242852ba100SJustin Hibbits             break;
7243852ba100SJustin Hibbits         memset(p_CcNode, 0, sizeof(t_FmPcdCcNode));
7244852ba100SJustin Hibbits 
7245852ba100SJustin Hibbits         p_CcNode->isHashBucket = TRUE;
7246852ba100SJustin Hibbits         p_CcNode->h_MissStatsCounters = h_MissStatsCounters;
7247852ba100SJustin Hibbits 
7248852ba100SJustin Hibbits         err = MatchTableSet(h_FmPcd, p_CcNode, p_ExactMatchCcNodeParam);
7249852ba100SJustin Hibbits         if (err)
7250852ba100SJustin Hibbits             break;
7251852ba100SJustin Hibbits 
7252852ba100SJustin Hibbits         p_HashKeyParams[i].ccNextEngineParams.nextEngine = e_FM_PCD_CC;
7253852ba100SJustin Hibbits         p_HashKeyParams[i].ccNextEngineParams.statisticsEn = FALSE;
7254852ba100SJustin Hibbits         p_HashKeyParams[i].ccNextEngineParams.params.ccParams.h_CcNode =
7255852ba100SJustin Hibbits                 p_CcNode;
7256852ba100SJustin Hibbits     }
7257852ba100SJustin Hibbits 
7258852ba100SJustin Hibbits     if (i < numOfSets)
7259852ba100SJustin Hibbits     {
7260852ba100SJustin Hibbits         for (i = i - 1; i >= 0; i--)
7261852ba100SJustin Hibbits             FM_PCD_MatchTableDelete(
7262852ba100SJustin Hibbits                     p_HashKeyParams[i].ccNextEngineParams.params.ccParams.h_CcNode);
7263852ba100SJustin Hibbits 
7264852ba100SJustin Hibbits         FM_MURAM_FreeMem(FmPcdGetMuramHandle(h_FmPcd), h_MissStatsCounters);
7265852ba100SJustin Hibbits 
7266852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_NULL_POINTER, NO_MSG);
7267852ba100SJustin Hibbits         XX_Free(p_IndxHashCcNodeParam);
7268852ba100SJustin Hibbits         XX_Free(p_ExactMatchCcNodeParam);
7269852ba100SJustin Hibbits         return NULL;
7270852ba100SJustin Hibbits     }
7271852ba100SJustin Hibbits 
7272852ba100SJustin Hibbits     /* Creating indexed-hash CC node */
7273852ba100SJustin Hibbits     p_IndxHashCcNodeParam->extractCcParams.type = e_FM_PCD_EXTRACT_NON_HDR;
7274852ba100SJustin Hibbits     p_IndxHashCcNodeParam->extractCcParams.extractNonHdr.src =
7275852ba100SJustin Hibbits             e_FM_PCD_EXTRACT_FROM_HASH;
7276852ba100SJustin Hibbits     p_IndxHashCcNodeParam->extractCcParams.extractNonHdr.action =
7277852ba100SJustin Hibbits             e_FM_PCD_ACTION_INDEXED_LOOKUP;
7278852ba100SJustin Hibbits     p_IndxHashCcNodeParam->extractCcParams.extractNonHdr.icIndxMask =
7279852ba100SJustin Hibbits             p_Param->hashResMask;
7280852ba100SJustin Hibbits     p_IndxHashCcNodeParam->extractCcParams.extractNonHdr.offset =
7281852ba100SJustin Hibbits             p_Param->hashShift;
7282852ba100SJustin Hibbits     p_IndxHashCcNodeParam->extractCcParams.extractNonHdr.size = 2;
7283852ba100SJustin Hibbits 
7284852ba100SJustin Hibbits     p_IndxHashCcNodeParam->keysParams.maxNumOfKeys = numOfSets;
7285852ba100SJustin Hibbits     p_IndxHashCcNodeParam->keysParams.maskSupport = FALSE;
7286852ba100SJustin Hibbits     p_IndxHashCcNodeParam->keysParams.statisticsMode =
7287852ba100SJustin Hibbits             e_FM_PCD_CC_STATS_MODE_NONE;
7288852ba100SJustin Hibbits     /* Number of keys of this node is number of sets of the hash */
7289852ba100SJustin Hibbits     p_IndxHashCcNodeParam->keysParams.numOfKeys = numOfSets;
7290852ba100SJustin Hibbits     p_IndxHashCcNodeParam->keysParams.keySize = 2;
7291852ba100SJustin Hibbits 
7292852ba100SJustin Hibbits     p_CcNodeHashTbl = FM_PCD_MatchTableSet(h_FmPcd, p_IndxHashCcNodeParam);
7293852ba100SJustin Hibbits 
7294852ba100SJustin Hibbits     if (p_CcNodeHashTbl)
7295852ba100SJustin Hibbits     {
7296852ba100SJustin Hibbits         p_CcNodeHashTbl->kgHashShift = p_Param->kgHashShift;
7297852ba100SJustin Hibbits 
7298852ba100SJustin Hibbits         /* Storing the allocated counters for buckets 'miss' in the hash table
7299852ba100SJustin Hibbits          and if statistics for miss were enabled. */
7300852ba100SJustin Hibbits         p_CcNodeHashTbl->h_MissStatsCounters = h_MissStatsCounters;
7301852ba100SJustin Hibbits         p_CcNodeHashTbl->statsEnForMiss = statsEnForMiss;
7302852ba100SJustin Hibbits     }
7303852ba100SJustin Hibbits 
7304852ba100SJustin Hibbits     XX_Free(p_IndxHashCcNodeParam);
7305852ba100SJustin Hibbits     XX_Free(p_ExactMatchCcNodeParam);
7306852ba100SJustin Hibbits 
7307852ba100SJustin Hibbits     return p_CcNodeHashTbl;
7308852ba100SJustin Hibbits }
7309852ba100SJustin Hibbits 
FM_PCD_HashTableDelete(t_Handle h_HashTbl)7310852ba100SJustin Hibbits t_Error FM_PCD_HashTableDelete(t_Handle h_HashTbl)
7311852ba100SJustin Hibbits {
7312852ba100SJustin Hibbits     t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
7313852ba100SJustin Hibbits     t_Handle h_FmPcd;
7314852ba100SJustin Hibbits     t_Handle *p_HashBuckets, h_MissStatsCounters;
7315852ba100SJustin Hibbits     uint16_t i, numOfBuckets;
7316852ba100SJustin Hibbits     t_Error err;
7317852ba100SJustin Hibbits 
7318852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_HashTbl, E_INVALID_HANDLE);
7319852ba100SJustin Hibbits 
7320852ba100SJustin Hibbits     /* Store all hash buckets before the hash is freed */
7321852ba100SJustin Hibbits     numOfBuckets = p_HashTbl->numOfKeys;
7322852ba100SJustin Hibbits 
7323852ba100SJustin Hibbits     p_HashBuckets = (t_Handle *)XX_Malloc(numOfBuckets * sizeof(t_Handle));
7324852ba100SJustin Hibbits     if (!p_HashBuckets)
7325852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_NO_MEMORY, NO_MSG);
7326852ba100SJustin Hibbits 
7327852ba100SJustin Hibbits     for (i = 0; i < numOfBuckets; i++)
7328852ba100SJustin Hibbits         p_HashBuckets[i] =
7329852ba100SJustin Hibbits                 p_HashTbl->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode;
7330852ba100SJustin Hibbits 
7331852ba100SJustin Hibbits     h_FmPcd = p_HashTbl->h_FmPcd;
7332852ba100SJustin Hibbits     h_MissStatsCounters = p_HashTbl->h_MissStatsCounters;
7333852ba100SJustin Hibbits 
7334852ba100SJustin Hibbits     /* Free the hash */
7335852ba100SJustin Hibbits     err = FM_PCD_MatchTableDelete(p_HashTbl);
7336852ba100SJustin Hibbits 
7337852ba100SJustin Hibbits     /* Free each hash bucket */
7338852ba100SJustin Hibbits     for (i = 0; i < numOfBuckets; i++)
7339852ba100SJustin Hibbits         err |= FM_PCD_MatchTableDelete(p_HashBuckets[i]);
7340852ba100SJustin Hibbits 
7341852ba100SJustin Hibbits     XX_Free(p_HashBuckets);
7342852ba100SJustin Hibbits 
7343852ba100SJustin Hibbits     /* Free statistics counters for 'miss', if these were allocated */
7344852ba100SJustin Hibbits     if (h_MissStatsCounters)
7345852ba100SJustin Hibbits         FM_MURAM_FreeMem(FmPcdGetMuramHandle(h_FmPcd), h_MissStatsCounters);
7346852ba100SJustin Hibbits 
7347852ba100SJustin Hibbits     if (err)
7348852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
7349852ba100SJustin Hibbits 
7350852ba100SJustin Hibbits     return E_OK;
7351852ba100SJustin Hibbits }
7352852ba100SJustin Hibbits 
FM_PCD_HashTableAddKey(t_Handle h_HashTbl,uint8_t keySize,t_FmPcdCcKeyParams * p_KeyParams)7353852ba100SJustin Hibbits t_Error FM_PCD_HashTableAddKey(t_Handle h_HashTbl, uint8_t keySize,
7354852ba100SJustin Hibbits                                t_FmPcdCcKeyParams *p_KeyParams)
7355852ba100SJustin Hibbits {
7356852ba100SJustin Hibbits     t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
7357852ba100SJustin Hibbits     t_Handle h_HashBucket;
7358852ba100SJustin Hibbits     uint8_t bucketIndex;
7359852ba100SJustin Hibbits     uint16_t lastIndex;
7360852ba100SJustin Hibbits     t_Error err;
7361852ba100SJustin Hibbits 
7362852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_HashTbl, E_INVALID_HANDLE);
7363852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_KeyParams, E_NULL_POINTER);
7364852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_KeyParams->p_Key, E_NULL_POINTER);
7365852ba100SJustin Hibbits 
7366852ba100SJustin Hibbits     if (p_KeyParams->p_Mask)
7367852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE,
7368852ba100SJustin Hibbits                      ("Keys masks not supported for hash table"));
7369852ba100SJustin Hibbits 
7370852ba100SJustin Hibbits     err = FM_PCD_MatchTableGetIndexedHashBucket(p_HashTbl, keySize,
7371852ba100SJustin Hibbits                                                 p_KeyParams->p_Key,
7372852ba100SJustin Hibbits                                                 p_HashTbl->kgHashShift,
7373852ba100SJustin Hibbits                                                 &h_HashBucket, &bucketIndex,
7374852ba100SJustin Hibbits                                                 &lastIndex);
7375852ba100SJustin Hibbits     if (err)
7376852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
7377852ba100SJustin Hibbits 
7378852ba100SJustin Hibbits     return FM_PCD_MatchTableAddKey(h_HashBucket, FM_PCD_LAST_KEY_INDEX, keySize,
7379852ba100SJustin Hibbits                                    p_KeyParams);
7380852ba100SJustin Hibbits }
7381852ba100SJustin Hibbits 
FM_PCD_HashTableRemoveKey(t_Handle h_HashTbl,uint8_t keySize,uint8_t * p_Key)7382852ba100SJustin Hibbits t_Error FM_PCD_HashTableRemoveKey(t_Handle h_HashTbl, uint8_t keySize,
7383852ba100SJustin Hibbits                                   uint8_t *p_Key)
7384852ba100SJustin Hibbits {
7385852ba100SJustin Hibbits     t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
7386852ba100SJustin Hibbits     t_Handle h_HashBucket;
7387852ba100SJustin Hibbits     uint8_t bucketIndex;
7388852ba100SJustin Hibbits     uint16_t lastIndex;
7389852ba100SJustin Hibbits     t_Error err;
7390852ba100SJustin Hibbits 
7391852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_HashTbl, E_INVALID_HANDLE);
7392852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
7393852ba100SJustin Hibbits 
7394852ba100SJustin Hibbits     err = FM_PCD_MatchTableGetIndexedHashBucket(p_HashTbl, keySize, p_Key,
7395852ba100SJustin Hibbits                                                 p_HashTbl->kgHashShift,
7396852ba100SJustin Hibbits                                                 &h_HashBucket, &bucketIndex,
7397852ba100SJustin Hibbits                                                 &lastIndex);
7398852ba100SJustin Hibbits     if (err)
7399852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
7400852ba100SJustin Hibbits 
7401852ba100SJustin Hibbits     return FM_PCD_MatchTableFindNRemoveKey(h_HashBucket, keySize, p_Key, NULL);
7402852ba100SJustin Hibbits }
7403852ba100SJustin Hibbits 
FM_PCD_HashTableModifyNextEngine(t_Handle h_HashTbl,uint8_t keySize,uint8_t * p_Key,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams)7404852ba100SJustin Hibbits t_Error FM_PCD_HashTableModifyNextEngine(
7405852ba100SJustin Hibbits         t_Handle h_HashTbl, uint8_t keySize, uint8_t *p_Key,
7406852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
7407852ba100SJustin Hibbits {
7408852ba100SJustin Hibbits     t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
7409852ba100SJustin Hibbits     t_Handle h_HashBucket;
7410852ba100SJustin Hibbits     uint8_t bucketIndex;
7411852ba100SJustin Hibbits     uint16_t lastIndex;
7412852ba100SJustin Hibbits     t_Error err;
7413852ba100SJustin Hibbits 
7414852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_HashTbl, E_INVALID_HANDLE);
7415852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
7416852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
7417852ba100SJustin Hibbits 
7418852ba100SJustin Hibbits     err = FM_PCD_MatchTableGetIndexedHashBucket(p_HashTbl, keySize, p_Key,
7419852ba100SJustin Hibbits                                                 p_HashTbl->kgHashShift,
7420852ba100SJustin Hibbits                                                 &h_HashBucket, &bucketIndex,
7421852ba100SJustin Hibbits                                                 &lastIndex);
7422852ba100SJustin Hibbits     if (err)
7423852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
7424852ba100SJustin Hibbits 
7425852ba100SJustin Hibbits     return FM_PCD_MatchTableFindNModifyNextEngine(h_HashBucket, keySize, p_Key,
7426852ba100SJustin Hibbits                                                   NULL,
7427852ba100SJustin Hibbits                                                   p_FmPcdCcNextEngineParams);
7428852ba100SJustin Hibbits }
7429852ba100SJustin Hibbits 
FM_PCD_HashTableModifyMissNextEngine(t_Handle h_HashTbl,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams)7430852ba100SJustin Hibbits t_Error FM_PCD_HashTableModifyMissNextEngine(
7431852ba100SJustin Hibbits         t_Handle h_HashTbl,
7432852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
7433852ba100SJustin Hibbits {
7434852ba100SJustin Hibbits     t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
7435852ba100SJustin Hibbits     t_Handle h_HashBucket;
7436852ba100SJustin Hibbits     uint8_t i;
7437852ba100SJustin Hibbits     bool nullifyMissStats = FALSE;
7438852ba100SJustin Hibbits     t_Error err;
7439852ba100SJustin Hibbits 
7440852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_HashTbl, E_INVALID_HANDLE);
7441852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmPcdCcNextEngineParams, E_NULL_POINTER);
7442852ba100SJustin Hibbits 
7443852ba100SJustin Hibbits     if ((!p_HashTbl->h_MissStatsCounters)
7444852ba100SJustin Hibbits             && (p_FmPcdCcNextEngineParams->statisticsEn))
7445852ba100SJustin Hibbits         RETURN_ERROR(
7446852ba100SJustin Hibbits                 MAJOR,
7447852ba100SJustin Hibbits                 E_CONFLICT,
7448852ba100SJustin Hibbits                 ("Statistics are requested for a key, but statistics mode was set"
7449852ba100SJustin Hibbits                 "to 'NONE' upon initialization"));
7450852ba100SJustin Hibbits 
7451852ba100SJustin Hibbits     if (p_HashTbl->h_MissStatsCounters)
7452852ba100SJustin Hibbits     {
7453852ba100SJustin Hibbits         if ((!p_HashTbl->statsEnForMiss)
7454852ba100SJustin Hibbits                 && (p_FmPcdCcNextEngineParams->statisticsEn))
7455852ba100SJustin Hibbits             nullifyMissStats = TRUE;
7456852ba100SJustin Hibbits 
7457852ba100SJustin Hibbits         if ((p_HashTbl->statsEnForMiss)
7458852ba100SJustin Hibbits                 && (!p_FmPcdCcNextEngineParams->statisticsEn))
7459852ba100SJustin Hibbits         {
7460852ba100SJustin Hibbits             p_HashTbl->statsEnForMiss = FALSE;
7461852ba100SJustin Hibbits             p_FmPcdCcNextEngineParams->statisticsEn = TRUE;
7462852ba100SJustin Hibbits         }
7463852ba100SJustin Hibbits     }
7464852ba100SJustin Hibbits 
7465852ba100SJustin Hibbits     for (i = 0; i < p_HashTbl->numOfKeys; i++)
7466852ba100SJustin Hibbits     {
7467852ba100SJustin Hibbits         h_HashBucket =
7468852ba100SJustin Hibbits                 p_HashTbl->keyAndNextEngineParams[i].nextEngineParams.params.ccParams.h_CcNode;
7469852ba100SJustin Hibbits 
7470852ba100SJustin Hibbits         err = FM_PCD_MatchTableModifyMissNextEngine(h_HashBucket,
7471852ba100SJustin Hibbits                                                     p_FmPcdCcNextEngineParams);
7472852ba100SJustin Hibbits         if (err)
7473852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, err, NO_MSG);
7474852ba100SJustin Hibbits     }
7475852ba100SJustin Hibbits 
7476852ba100SJustin Hibbits     if (nullifyMissStats)
7477852ba100SJustin Hibbits     {
7478852ba100SJustin Hibbits         memset(p_HashTbl->h_MissStatsCounters, 0,
7479852ba100SJustin Hibbits                (2 * FM_PCD_CC_STATS_COUNTER_SIZE));
7480852ba100SJustin Hibbits         memset(p_HashTbl->h_MissStatsCounters, 0,
7481852ba100SJustin Hibbits                (2 * FM_PCD_CC_STATS_COUNTER_SIZE));
7482852ba100SJustin Hibbits         p_HashTbl->statsEnForMiss = TRUE;
7483852ba100SJustin Hibbits     }
7484852ba100SJustin Hibbits 
7485852ba100SJustin Hibbits     return E_OK;
7486852ba100SJustin Hibbits }
7487852ba100SJustin Hibbits 
7488852ba100SJustin Hibbits 
FM_PCD_HashTableGetMissNextEngine(t_Handle h_HashTbl,t_FmPcdCcNextEngineParams * p_FmPcdCcNextEngineParams)7489852ba100SJustin Hibbits t_Error FM_PCD_HashTableGetMissNextEngine(
7490852ba100SJustin Hibbits         t_Handle h_HashTbl,
7491852ba100SJustin Hibbits         t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
7492852ba100SJustin Hibbits {
7493852ba100SJustin Hibbits     t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
7494852ba100SJustin Hibbits     t_FmPcdCcNode *p_HashBucket;
7495852ba100SJustin Hibbits 
7496852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_HashTbl, E_INVALID_HANDLE);
7497852ba100SJustin Hibbits 
7498852ba100SJustin Hibbits     /* Miss next engine of each bucket was initialized with the next engine of the hash table */
7499852ba100SJustin Hibbits     p_HashBucket =
7500852ba100SJustin Hibbits             p_HashTbl->keyAndNextEngineParams[0].nextEngineParams.params.ccParams.h_CcNode;
7501852ba100SJustin Hibbits 
7502852ba100SJustin Hibbits     memcpy(p_FmPcdCcNextEngineParams,
7503852ba100SJustin Hibbits            &p_HashBucket->keyAndNextEngineParams[p_HashBucket->numOfKeys].nextEngineParams,
7504852ba100SJustin Hibbits            sizeof(t_FmPcdCcNextEngineParams));
7505852ba100SJustin Hibbits 
7506852ba100SJustin Hibbits     return E_OK;
7507852ba100SJustin Hibbits }
7508852ba100SJustin Hibbits 
FM_PCD_HashTableFindNGetKeyStatistics(t_Handle h_HashTbl,uint8_t keySize,uint8_t * p_Key,t_FmPcdCcKeyStatistics * p_KeyStatistics)7509852ba100SJustin Hibbits t_Error FM_PCD_HashTableFindNGetKeyStatistics(
7510852ba100SJustin Hibbits         t_Handle h_HashTbl, uint8_t keySize, uint8_t *p_Key,
7511852ba100SJustin Hibbits         t_FmPcdCcKeyStatistics *p_KeyStatistics)
7512852ba100SJustin Hibbits {
7513852ba100SJustin Hibbits     t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
7514852ba100SJustin Hibbits     t_Handle h_HashBucket;
7515852ba100SJustin Hibbits     uint8_t bucketIndex;
7516852ba100SJustin Hibbits     uint16_t lastIndex;
7517852ba100SJustin Hibbits     t_Error err;
7518852ba100SJustin Hibbits 
7519852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_HashTbl, E_INVALID_HANDLE);
7520852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_Key, E_NULL_POINTER);
7521852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_KeyStatistics, E_NULL_POINTER);
7522852ba100SJustin Hibbits 
7523852ba100SJustin Hibbits     err = FM_PCD_MatchTableGetIndexedHashBucket(p_HashTbl, keySize, p_Key,
7524852ba100SJustin Hibbits                                                 p_HashTbl->kgHashShift,
7525852ba100SJustin Hibbits                                                 &h_HashBucket, &bucketIndex,
7526852ba100SJustin Hibbits                                                 &lastIndex);
7527852ba100SJustin Hibbits     if (err)
7528852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
7529852ba100SJustin Hibbits 
7530852ba100SJustin Hibbits     return FM_PCD_MatchTableFindNGetKeyStatistics(h_HashBucket, keySize, p_Key,
7531852ba100SJustin Hibbits                                                   NULL, p_KeyStatistics);
7532852ba100SJustin Hibbits }
7533852ba100SJustin Hibbits 
FM_PCD_HashTableGetMissStatistics(t_Handle h_HashTbl,t_FmPcdCcKeyStatistics * p_MissStatistics)7534852ba100SJustin Hibbits t_Error FM_PCD_HashTableGetMissStatistics(
7535852ba100SJustin Hibbits         t_Handle h_HashTbl, t_FmPcdCcKeyStatistics *p_MissStatistics)
7536852ba100SJustin Hibbits {
7537852ba100SJustin Hibbits     t_FmPcdCcNode *p_HashTbl = (t_FmPcdCcNode *)h_HashTbl;
7538852ba100SJustin Hibbits     t_Handle h_HashBucket;
7539852ba100SJustin Hibbits 
7540852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_HashTbl, E_INVALID_HANDLE);
7541852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_MissStatistics, E_NULL_POINTER);
7542852ba100SJustin Hibbits 
7543852ba100SJustin Hibbits     if (!p_HashTbl->statsEnForMiss)
7544852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_STATE,
7545852ba100SJustin Hibbits                      ("Statistics were not enabled for miss"));
7546852ba100SJustin Hibbits 
7547852ba100SJustin Hibbits     h_HashBucket =
7548852ba100SJustin Hibbits             p_HashTbl->keyAndNextEngineParams[0].nextEngineParams.params.ccParams.h_CcNode;
7549852ba100SJustin Hibbits 
7550852ba100SJustin Hibbits     return FM_PCD_MatchTableGetMissStatistics(h_HashBucket, p_MissStatistics);
75510aeed3e9SJustin Hibbits }
7552