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 180 typedef 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 196 typedef 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 204 typedef 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 212 typedef 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 220 typedef 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 235 typedef struct t_FmPcdStatsObj 236 { 237 t_Handle h_StatsAd; 238 t_Handle h_StatsCounters; 239 t_List node; 240 } t_FmPcdStatsObj; 241 242 typedef 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 255 typedef 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 268 typedef 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 291 typedef struct 292 { 293 t_Handle h_Manip; 294 t_Handle h_CcNode; 295 } t_CcNextEngineInfo; 296 297 typedef 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 358 typedef struct 359 { 360 t_FmPcdCcNode *p_FmPcdCcNode; 361 bool occupied; 362 uint16_t owners; 363 volatile bool lock; 364 } t_FmPcdCcNodeArray; 365 366 typedef struct 367 { 368 uint8_t numOfEntriesInGroup; 369 uint32_t totalBitsMask; 370 uint8_t baseGroupEntry; 371 } t_FmPcdCcGroupParam; 372 373 typedef 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 394 t_Error FmPcdCcNodeTreeTryLock(t_Handle h_FmPcd,t_Handle h_FmPcdCcNode, t_List *p_List); 395 void FmPcdCcNodeTreeReleaseLock(t_Handle h_FmPcd, t_List *p_List); 396 t_Error FmPcdUpdateCcShadow (t_FmPcd *p_FmPcd, uint32_t size, uint32_t align); 397 398 399 #endif /* __FM_CC_H */ 400