1/*
2 * Copyright 2008-2012 Freescale Semiconductor Inc.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *     * Redistributions of source code must retain the above copyright
7 *       notice, this list of conditions and the following disclaimer.
8 *     * Redistributions in binary form must reproduce the above copyright
9 *       notice, this list of conditions and the following disclaimer in the
10 *       documentation and/or other materials provided with the distribution.
11 *     * Neither the name of Freescale Semiconductor nor the
12 *       names of its contributors may be used to endorse or promote products
13 *       derived from this software without specific prior written permission.
14 *
15 *
16 * ALTERNATIVELY, this software may be distributed under the terms of the
17 * GNU General Public License ("GPL") as published by the Free Software
18 * Foundation, either version 2 of that License or (at your option) any
19 * later version.
20 *
21 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33
34/******************************************************************************
35 @File          fm_cc.h
36
37 @Description   FM PCD CC ...
38*//***************************************************************************/
39#ifndef __FM_CC_H
40#define __FM_CC_H
41
42#include "std_ext.h"
43#include "error_ext.h"
44#include "list_ext.h"
45
46#include "fm_pcd.h"
47
48
49/***********************************************************************/
50/*          Coarse classification defines                              */
51/***********************************************************************/
52
53#define CC_MAX_NUM_OF_KEYS                  (FM_PCD_MAX_NUM_OF_KEYS + 1)
54
55#define CC_PC_FF_MACDST                     0x00
56#define CC_PC_FF_MACSRC                     0x01
57#define CC_PC_FF_ETYPE                      0x02
58
59#define CC_PC_FF_TCI1                       0x03
60#define CC_PC_FF_TCI2                       0x04
61
62#define CC_PC_FF_MPLS1                      0x06
63#define CC_PC_FF_MPLS_LAST                  0x07
64
65#define CC_PC_FF_IPV4DST1                   0x08
66#define CC_PC_FF_IPV4DST2                   0x16
67#define CC_PC_FF_IPV4IPTOS_TC1              0x09
68#define CC_PC_FF_IPV4IPTOS_TC2              0x17
69#define CC_PC_FF_IPV4PTYPE1                 0x0A
70#define CC_PC_FF_IPV4PTYPE2                 0x18
71#define CC_PC_FF_IPV4SRC1                   0x0b
72#define CC_PC_FF_IPV4SRC2                   0x19
73#define CC_PC_FF_IPV4SRC1_IPV4DST1          0x0c
74#define CC_PC_FF_IPV4SRC2_IPV4DST2          0x1a
75#define CC_PC_FF_IPV4TTL                    0x29
76
77
78#define CC_PC_FF_IPTOS_IPV6TC1_IPV6FLOW1    0x0d /*TODO - CLASS - what is it? TOS*/
79#define CC_PC_FF_IPTOS_IPV6TC2_IPV6FLOW2    0x1b
80#define CC_PC_FF_IPV6PTYPE1                 0x0e
81#define CC_PC_FF_IPV6PTYPE2                 0x1c
82#define CC_PC_FF_IPV6DST1                   0x0f
83#define CC_PC_FF_IPV6DST2                   0x1d
84#define CC_PC_FF_IPV6SRC1                   0x10
85#define CC_PC_FF_IPV6SRC2                   0x1e
86#define CC_PC_FF_IPV6HOP_LIMIT              0x2a
87#define CC_PC_FF_IPPID                      0x24
88#define CC_PC_FF_IPDSCP                     0x76
89
90#define CC_PC_FF_GREPTYPE                   0x11
91
92#define CC_PC_FF_MINENCAP_PTYPE             0x12
93#define CC_PC_FF_MINENCAP_IPDST             0x13
94#define CC_PC_FF_MINENCAP_IPSRC             0x14
95#define CC_PC_FF_MINENCAP_IPSRC_IPDST       0x15
96
97#define CC_PC_FF_L4PSRC                     0x1f
98#define CC_PC_FF_L4PDST                     0x20
99#define CC_PC_FF_L4PSRC_L4PDST              0x21
100
101#define CC_PC_FF_PPPPID                     0x05
102
103#define CC_PC_PR_SHIM1                      0x22
104#define CC_PC_PR_SHIM2                      0x23
105
106#define CC_PC_GENERIC_WITHOUT_MASK          0x27
107#define CC_PC_GENERIC_WITH_MASK             0x28
108#define CC_PC_GENERIC_IC_GMASK              0x2B
109#define CC_PC_GENERIC_IC_HASH_INDEXED       0x2C
110#define CC_PC_GENERIC_IC_AGING_MASK         0x2D
111
112#define CC_PR_OFFSET                        0x25
113#define CC_PR_WITHOUT_OFFSET                0x26
114
115#define CC_PC_PR_ETH_OFFSET                 19
116#define CC_PC_PR_USER_DEFINED_SHIM1_OFFSET  16
117#define CC_PC_PR_USER_DEFINED_SHIM2_OFFSET  17
118#define CC_PC_PR_USER_LLC_SNAP_OFFSET       20
119#define CC_PC_PR_VLAN1_OFFSET               21
120#define CC_PC_PR_VLAN2_OFFSET               22
121#define CC_PC_PR_PPPOE_OFFSET               24
122#define CC_PC_PR_MPLS1_OFFSET               25
123#define CC_PC_PR_MPLS_LAST_OFFSET           26
124#define CC_PC_PR_IP1_OFFSET                 27
125#define CC_PC_PR_IP_LAST_OFFSET             28
126#define CC_PC_PR_MINENC_OFFSET              28
127#define CC_PC_PR_L4_OFFSET                  30
128#define CC_PC_PR_GRE_OFFSET                 29
129#define CC_PC_PR_ETYPE_LAST_OFFSET          23
130#define CC_PC_PR_NEXT_HEADER_OFFSET         31
131
132#define CC_PC_ILLEGAL                       0xff
133#define CC_SIZE_ILLEGAL                     0
134
135#define FM_PCD_CC_KEYS_MATCH_TABLE_ALIGN    16
136#define FM_PCD_CC_AD_TABLE_ALIGN            16
137#define FM_PCD_CC_AD_ENTRY_SIZE             16
138#define FM_PCD_CC_NUM_OF_KEYS               255
139#define FM_PCD_CC_TREE_ADDR_ALIGN           256
140
141#define FM_PCD_AD_RESULT_CONTRL_FLOW_TYPE   0x00000000
142#define FM_PCD_AD_RESULT_DATA_FLOW_TYPE     0x80000000
143#define FM_PCD_AD_RESULT_PLCR_DIS           0x20000000
144#define FM_PCD_AD_RESULT_EXTENDED_MODE      0x80000000
145#define FM_PCD_AD_RESULT_NADEN              0x20000000
146#define FM_PCD_AD_RESULT_STATISTICS_EN      0x40000000
147
148#define FM_PCD_AD_CONT_LOOKUP_TYPE          0x40000000
149#define FM_PCD_AD_CONT_LOOKUP_LCL_MASK      0x00800000
150
151#define FM_PCD_AD_STATS_TYPE                0x40000000
152#define FM_PCD_AD_STATS_FLR_ADDR_MASK       0x00FFFFFF
153#define FM_PCD_AD_STATS_COUNTERS_ADDR_MASK  0x00FFFFFF
154#define FM_PCD_AD_STATS_NEXT_ACTION_MASK    0xFFFF0000
155#define FM_PCD_AD_STATS_NEXT_ACTION_SHIFT   12
156#define FM_PCD_AD_STATS_NAD_EN              0x00008000
157#define FM_PCD_AD_STATS_OP_CODE             0x00000036
158#define FM_PCD_AD_STATS_FLR_EN              0x00004000
159#define FM_PCD_AD_STATS_COND_EN             0x00002000
160
161
162
163#define FM_PCD_AD_BYPASS_TYPE               0xc0000000
164
165#define FM_PCD_AD_TYPE_MASK                 0xc0000000
166#define FM_PCD_AD_OPCODE_MASK               0x0000000f
167
168#define FM_PCD_AD_PROFILEID_FOR_CNTRL_SHIFT 16
169#if (DPAA_VERSION >= 11)
170#define FM_PCD_AD_RESULT_VSP_SHIFT           24
171#define FM_PCD_AD_RESULT_NO_OM_VSPE          0x02000000
172#define FM_PCD_AD_RESULT_VSP_MASK            0x3f
173#define FM_PCD_AD_NCSPFQIDM_MASK             0x80000000
174#endif /* (DPAA_VERSION >= 11) */
175
176#define GLBL_MASK_FOR_HASH_INDEXED          0xfff00000
177#define CC_GLBL_MASK_SIZE                   4
178#define CC_AGING_MASK_SIZE                  4
179
180typedef uint32_t ccPrivateInfo_t; /**< private info of CC: */
181
182#define CC_PRIVATE_INFO_NONE                       0
183#define CC_PRIVATE_INFO_IC_HASH_INDEX_LOOKUP       0x80000000
184#define CC_PRIVATE_INFO_IC_HASH_EXACT_MATCH        0x40000000
185#define CC_PRIVATE_INFO_IC_KEY_EXACT_MATCH         0x20000000
186#define CC_PRIVATE_INFO_IC_DEQ_FQID_INDEX_LOOKUP   0x10000000
187
188#define CC_BUILD_AGING_MASK(numOfKeys)      ((((1LL << ((numOfKeys) + 1)) - 1)) << (31 - (numOfKeys)))
189/***********************************************************************/
190/*          Memory map                                                 */
191/***********************************************************************/
192#if defined(__MWERKS__) && !defined(__GNUC__)
193#pragma pack(push,1)
194#endif /* defined(__MWERKS__) && ... */
195
196typedef struct
197{
198    volatile uint32_t fqid;
199    volatile uint32_t plcrProfile;
200    volatile uint32_t nia;
201    volatile uint32_t res;
202} t_AdOfTypeResult;
203
204typedef struct
205{
206    volatile uint32_t ccAdBase;
207    volatile uint32_t matchTblPtr;
208    volatile uint32_t pcAndOffsets;
209    volatile uint32_t gmask;
210} t_AdOfTypeContLookup;
211
212typedef struct
213{
214    volatile uint32_t profileTableAddr;
215    volatile uint32_t reserved;
216    volatile uint32_t nextActionIndx;
217    volatile uint32_t statsTableAddr;
218} t_AdOfTypeStats;
219
220typedef union
221{
222    volatile t_AdOfTypeResult        adResult;
223    volatile t_AdOfTypeContLookup    adContLookup;
224} t_Ad;
225
226#if defined(__MWERKS__) && !defined(__GNUC__)
227#pragma pack(pop)
228#endif /* defined(__MWERKS__) && ... */
229
230
231/***********************************************************************/
232/*  Driver's internal structures                                       */
233/***********************************************************************/
234
235typedef struct t_FmPcdStatsObj
236{
237    t_Handle        h_StatsAd;
238    t_Handle        h_StatsCounters;
239    t_List          node;
240} t_FmPcdStatsObj;
241
242typedef struct
243{
244    uint8_t                     key[FM_PCD_MAX_SIZE_OF_KEY];
245    uint8_t                     mask[FM_PCD_MAX_SIZE_OF_KEY];
246
247    t_FmPcdCcNextEngineParams   nextEngineParams;
248    uint32_t                    requiredAction;
249    uint32_t                    shadowAction;
250
251    t_FmPcdStatsObj             *p_StatsObj;
252
253} t_FmPcdCcKeyAndNextEngineParams;
254
255typedef struct
256{
257    t_Handle        p_Ad;
258    e_FmPcdEngine   fmPcdEngine;
259    bool            adAllocated;
260    bool            isTree;
261
262    uint32_t        myInfo;
263    t_List          *h_CcNextNodesLst;
264    t_Handle        h_AdditionalInfo;
265    t_Handle        h_Node;
266} t_FmPcdModifyCcAdditionalParams;
267
268typedef struct
269{
270    t_Handle            p_AdTableNew;
271    t_Handle            p_KeysMatchTableNew;
272    t_Handle            p_AdTableOld;
273    t_Handle            p_KeysMatchTableOld;
274    uint16_t            numOfKeys;
275    t_Handle            h_CurrentNode;
276    uint16_t            savedKeyIndex;
277    t_Handle            h_NodeForAdd;
278    t_Handle            h_NodeForRmv;
279    t_Handle            h_ManipForRmv;
280    t_Handle            h_ManipForAdd;
281    t_FmPcdStatsObj     *p_StatsObjForRmv;
282#if (DPAA_VERSION >= 11)
283    t_Handle            h_FrmReplicForAdd;
284    t_Handle            h_FrmReplicForRmv;
285#endif /* (DPAA_VERSION >= 11) */
286    bool                tree;
287
288    t_FmPcdCcKeyAndNextEngineParams  keyAndNextEngineParams[CC_MAX_NUM_OF_KEYS];
289} t_FmPcdModifyCcKeyAdditionalParams;
290
291typedef struct
292{
293    t_Handle    h_Manip;
294    t_Handle    h_CcNode;
295} t_CcNextEngineInfo;
296
297typedef struct
298{
299    uint16_t            numOfKeys;
300    uint16_t            maxNumOfKeys;
301
302    bool                maskSupport;
303    uint32_t            keysMatchTableMaxSize;
304
305    e_FmPcdCcStatsMode  statisticsMode;
306    uint32_t            numOfStatsFLRs;
307    uint32_t            countersArraySize;
308
309    bool                isHashBucket;               /**< Valid for match table node that is a bucket of a hash table only */
310    t_Handle            h_MissStatsCounters;        /**< Valid for hash table node and match table that is a bucket;
311                                                         Holds the statistics counters allocated by the hash table and
312                                                         are shared by all hash table buckets; */
313    t_Handle            h_PrivMissStatsCounters;    /**< Valid for match table node that is a bucket of a hash table only;
314                                                         Holds the statistics counters that were allocated for this node
315                                                         and replaced by the shared counters (allocated by the hash table); */
316    bool                statsEnForMiss;             /**< Valid for hash table node only; TRUE is statistics are currently
317                                                         enabled for hash 'miss', FALSE otherwise; This parameter effects the
318                                                         returned statistics count to user, statistics AD always present for 'miss'
319                                                         for all hash buckets; */
320    bool                glblMaskUpdated;
321    t_Handle            p_GlblMask;
322    bool                lclMask;
323    uint8_t             parseCode;
324    uint8_t             offset;
325    uint8_t             prsArrayOffset;
326    bool                ctrlFlow;
327    uint16_t            owners;
328
329    uint8_t             ccKeySizeAccExtraction;
330    uint8_t             sizeOfExtraction;
331    uint8_t             glblMaskSize;
332
333    t_Handle            h_KeysMatchTable;
334    t_Handle            h_AdTable;
335    t_Handle            h_StatsAds;
336    t_Handle            h_TmpAd;
337    t_Handle            h_Ad;
338    t_Handle            h_StatsFLRs;
339
340    t_List              availableStatsLst;
341
342    t_List              ccPrevNodesLst;
343
344    t_List              ccTreeIdLst;
345    t_List              ccTreesLst;
346
347    t_Handle            h_FmPcd;
348    uint32_t            shadowAction;
349    uint8_t             userSizeOfExtraction;
350    uint8_t             userOffset;
351    uint8_t             kgHashShift;            /* used in hash-table */
352
353    t_Handle            h_Spinlock;
354
355    t_FmPcdCcKeyAndNextEngineParams keyAndNextEngineParams[CC_MAX_NUM_OF_KEYS];
356} t_FmPcdCcNode;
357
358typedef struct
359{
360    t_FmPcdCcNode       *p_FmPcdCcNode;
361    bool                occupied;
362    uint16_t            owners;
363    volatile bool       lock;
364} t_FmPcdCcNodeArray;
365
366typedef struct
367{
368    uint8_t             numOfEntriesInGroup;
369    uint32_t            totalBitsMask;
370    uint8_t             baseGroupEntry;
371} t_FmPcdCcGroupParam;
372
373typedef struct
374{
375    t_Handle            h_FmPcd;
376    uint8_t             netEnvId;
377    uintptr_t           ccTreeBaseAddr;
378    uint8_t             numOfGrps;
379    t_FmPcdCcGroupParam fmPcdGroupParam[FM_PCD_MAX_NUM_OF_CC_GROUPS];
380    t_List              fmPortsLst;
381    t_FmPcdLock         *p_Lock;
382    uint8_t             numOfEntries;
383    uint16_t            owners;
384    t_Handle            h_FmPcdCcSavedManipParams;
385    bool                modifiedState;
386    uint32_t            requiredAction;
387    t_Handle            h_IpReassemblyManip;
388    t_Handle            h_CapwapReassemblyManip;
389
390    t_FmPcdCcKeyAndNextEngineParams keyAndNextEngineParams[FM_PCD_MAX_NUM_OF_CC_GROUPS];
391} t_FmPcdCcTree;
392
393
394t_Error     FmPcdCcNodeTreeTryLock(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode, t_List *p_List);
395void        FmPcdCcNodeTreeReleaseLock(t_Handle h_FmPcd, t_List *p_List);
396t_Error     FmPcdUpdateCcShadow (t_FmPcd *p_FmPcd, uint32_t size, uint32_t align);
397
398
399#endif /* __FM_CC_H */
400