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