1*852ba100SJustin Hibbits /*
2*852ba100SJustin 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
33*852ba100SJustin Hibbits
340aeed3e9SJustin Hibbits /******************************************************************************
350aeed3e9SJustin Hibbits @File fm_kg.c
360aeed3e9SJustin Hibbits
370aeed3e9SJustin Hibbits @Description FM PCD ...
380aeed3e9SJustin Hibbits *//***************************************************************************/
390aeed3e9SJustin Hibbits #include "std_ext.h"
400aeed3e9SJustin Hibbits #include "error_ext.h"
410aeed3e9SJustin Hibbits #include "string_ext.h"
420aeed3e9SJustin Hibbits #include "debug_ext.h"
430aeed3e9SJustin Hibbits #include "net_ext.h"
440aeed3e9SJustin Hibbits #include "fm_port_ext.h"
450aeed3e9SJustin Hibbits
460aeed3e9SJustin Hibbits #include "fm_common.h"
470aeed3e9SJustin Hibbits #include "fm_pcd.h"
480aeed3e9SJustin Hibbits #include "fm_hc.h"
490aeed3e9SJustin Hibbits #include "fm_pcd_ipc.h"
50*852ba100SJustin Hibbits #include "fm_kg.h"
51*852ba100SJustin Hibbits #include "fsl_fman_kg.h"
520aeed3e9SJustin Hibbits
530aeed3e9SJustin Hibbits
54*852ba100SJustin Hibbits /****************************************/
55*852ba100SJustin Hibbits /* static functions */
56*852ba100SJustin Hibbits /****************************************/
57*852ba100SJustin Hibbits
KgHwLock(t_Handle h_FmPcdKg)58*852ba100SJustin Hibbits static uint32_t KgHwLock(t_Handle h_FmPcdKg)
590aeed3e9SJustin Hibbits {
60*852ba100SJustin Hibbits ASSERT_COND(h_FmPcdKg);
61*852ba100SJustin Hibbits return XX_LockIntrSpinlock(((t_FmPcdKg *)h_FmPcdKg)->h_HwSpinlock);
62*852ba100SJustin Hibbits }
63*852ba100SJustin Hibbits
KgHwUnlock(t_Handle h_FmPcdKg,uint32_t intFlags)64*852ba100SJustin Hibbits static void KgHwUnlock(t_Handle h_FmPcdKg, uint32_t intFlags)
65*852ba100SJustin Hibbits {
66*852ba100SJustin Hibbits ASSERT_COND(h_FmPcdKg);
67*852ba100SJustin Hibbits XX_UnlockIntrSpinlock(((t_FmPcdKg *)h_FmPcdKg)->h_HwSpinlock, intFlags);
68*852ba100SJustin Hibbits }
69*852ba100SJustin Hibbits
KgSchemeLock(t_Handle h_Scheme)70*852ba100SJustin Hibbits static uint32_t KgSchemeLock(t_Handle h_Scheme)
71*852ba100SJustin Hibbits {
72*852ba100SJustin Hibbits ASSERT_COND(h_Scheme);
73*852ba100SJustin Hibbits return FmPcdLockSpinlock(((t_FmPcdKgScheme *)h_Scheme)->p_Lock);
74*852ba100SJustin Hibbits }
75*852ba100SJustin Hibbits
KgSchemeUnlock(t_Handle h_Scheme,uint32_t intFlags)76*852ba100SJustin Hibbits static void KgSchemeUnlock(t_Handle h_Scheme, uint32_t intFlags)
77*852ba100SJustin Hibbits {
78*852ba100SJustin Hibbits ASSERT_COND(h_Scheme);
79*852ba100SJustin Hibbits FmPcdUnlockSpinlock(((t_FmPcdKgScheme *)h_Scheme)->p_Lock, intFlags);
80*852ba100SJustin Hibbits }
81*852ba100SJustin Hibbits
KgSchemeFlagTryLock(t_Handle h_Scheme)82*852ba100SJustin Hibbits static bool KgSchemeFlagTryLock(t_Handle h_Scheme)
83*852ba100SJustin Hibbits {
84*852ba100SJustin Hibbits ASSERT_COND(h_Scheme);
85*852ba100SJustin Hibbits return FmPcdLockTryLock(((t_FmPcdKgScheme *)h_Scheme)->p_Lock);
86*852ba100SJustin Hibbits }
87*852ba100SJustin Hibbits
KgSchemeFlagUnlock(t_Handle h_Scheme)88*852ba100SJustin Hibbits static void KgSchemeFlagUnlock(t_Handle h_Scheme)
89*852ba100SJustin Hibbits {
90*852ba100SJustin Hibbits ASSERT_COND(h_Scheme);
91*852ba100SJustin Hibbits FmPcdLockUnlock(((t_FmPcdKgScheme *)h_Scheme)->p_Lock);
92*852ba100SJustin Hibbits }
93*852ba100SJustin Hibbits
WriteKgarWait(t_FmPcd * p_FmPcd,uint32_t fmkg_ar)94*852ba100SJustin Hibbits static t_Error WriteKgarWait(t_FmPcd *p_FmPcd, uint32_t fmkg_ar)
95*852ba100SJustin Hibbits {
96*852ba100SJustin Hibbits
97*852ba100SJustin Hibbits struct fman_kg_regs *regs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
98*852ba100SJustin Hibbits
99*852ba100SJustin Hibbits if (fman_kg_write_ar_wait(regs, fmkg_ar))
1000aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Keygen scheme access violation"));
101*852ba100SJustin Hibbits
1020aeed3e9SJustin Hibbits return E_OK;
1030aeed3e9SJustin Hibbits }
1040aeed3e9SJustin Hibbits
GetGenericSwDefault(t_FmPcdKgExtractDflt swDefaults[],uint8_t numOfSwDefaults,uint8_t code)1050aeed3e9SJustin Hibbits static e_FmPcdKgExtractDfltSelect GetGenericSwDefault(t_FmPcdKgExtractDflt swDefaults[], uint8_t numOfSwDefaults, uint8_t code)
1060aeed3e9SJustin Hibbits {
1070aeed3e9SJustin Hibbits int i;
1080aeed3e9SJustin Hibbits
1090aeed3e9SJustin Hibbits switch (code)
1100aeed3e9SJustin Hibbits {
1110aeed3e9SJustin Hibbits case (KG_SCH_GEN_PARSE_RESULT_N_FQID):
1120aeed3e9SJustin Hibbits case (KG_SCH_GEN_DEFAULT):
1130aeed3e9SJustin Hibbits case (KG_SCH_GEN_NEXTHDR):
1140aeed3e9SJustin Hibbits for (i=0 ; i<numOfSwDefaults ; i++)
1150aeed3e9SJustin Hibbits if (swDefaults[i].type == e_FM_PCD_KG_GENERIC_NOT_FROM_DATA)
1160aeed3e9SJustin Hibbits return swDefaults[i].dfltSelect;
117*852ba100SJustin Hibbits break;
1180aeed3e9SJustin Hibbits case (KG_SCH_GEN_SHIM1):
1190aeed3e9SJustin Hibbits case (KG_SCH_GEN_SHIM2):
1200aeed3e9SJustin Hibbits case (KG_SCH_GEN_IP_PID_NO_V):
1210aeed3e9SJustin Hibbits case (KG_SCH_GEN_ETH_NO_V):
1220aeed3e9SJustin Hibbits case (KG_SCH_GEN_SNAP_NO_V):
1230aeed3e9SJustin Hibbits case (KG_SCH_GEN_VLAN1_NO_V):
1240aeed3e9SJustin Hibbits case (KG_SCH_GEN_VLAN2_NO_V):
1250aeed3e9SJustin Hibbits case (KG_SCH_GEN_ETH_TYPE_NO_V):
1260aeed3e9SJustin Hibbits case (KG_SCH_GEN_PPP_NO_V):
1270aeed3e9SJustin Hibbits case (KG_SCH_GEN_MPLS1_NO_V):
1280aeed3e9SJustin Hibbits case (KG_SCH_GEN_MPLS_LAST_NO_V):
1290aeed3e9SJustin Hibbits case (KG_SCH_GEN_L3_NO_V):
1300aeed3e9SJustin Hibbits case (KG_SCH_GEN_IP2_NO_V):
1310aeed3e9SJustin Hibbits case (KG_SCH_GEN_GRE_NO_V):
1320aeed3e9SJustin Hibbits case (KG_SCH_GEN_L4_NO_V):
1330aeed3e9SJustin Hibbits for (i=0 ; i<numOfSwDefaults ; i++)
1340aeed3e9SJustin Hibbits if (swDefaults[i].type == e_FM_PCD_KG_GENERIC_FROM_DATA_NO_V)
1350aeed3e9SJustin Hibbits return swDefaults[i].dfltSelect;
136*852ba100SJustin Hibbits break;
1370aeed3e9SJustin Hibbits case (KG_SCH_GEN_START_OF_FRM):
1380aeed3e9SJustin Hibbits case (KG_SCH_GEN_ETH):
1390aeed3e9SJustin Hibbits case (KG_SCH_GEN_SNAP):
1400aeed3e9SJustin Hibbits case (KG_SCH_GEN_VLAN1):
1410aeed3e9SJustin Hibbits case (KG_SCH_GEN_VLAN2):
1420aeed3e9SJustin Hibbits case (KG_SCH_GEN_ETH_TYPE):
1430aeed3e9SJustin Hibbits case (KG_SCH_GEN_PPP):
1440aeed3e9SJustin Hibbits case (KG_SCH_GEN_MPLS1):
1450aeed3e9SJustin Hibbits case (KG_SCH_GEN_MPLS2):
1460aeed3e9SJustin Hibbits case (KG_SCH_GEN_MPLS3):
1470aeed3e9SJustin Hibbits case (KG_SCH_GEN_MPLS_LAST):
1480aeed3e9SJustin Hibbits case (KG_SCH_GEN_IPV4):
1490aeed3e9SJustin Hibbits case (KG_SCH_GEN_IPV6):
1500aeed3e9SJustin Hibbits case (KG_SCH_GEN_IPV4_TUNNELED):
1510aeed3e9SJustin Hibbits case (KG_SCH_GEN_IPV6_TUNNELED):
1520aeed3e9SJustin Hibbits case (KG_SCH_GEN_MIN_ENCAP):
1530aeed3e9SJustin Hibbits case (KG_SCH_GEN_GRE):
1540aeed3e9SJustin Hibbits case (KG_SCH_GEN_TCP):
1550aeed3e9SJustin Hibbits case (KG_SCH_GEN_UDP):
1560aeed3e9SJustin Hibbits case (KG_SCH_GEN_IPSEC_AH):
1570aeed3e9SJustin Hibbits case (KG_SCH_GEN_SCTP):
1580aeed3e9SJustin Hibbits case (KG_SCH_GEN_DCCP):
1590aeed3e9SJustin Hibbits case (KG_SCH_GEN_IPSEC_ESP):
1600aeed3e9SJustin Hibbits for (i=0 ; i<numOfSwDefaults ; i++)
1610aeed3e9SJustin Hibbits if (swDefaults[i].type == e_FM_PCD_KG_GENERIC_FROM_DATA)
1620aeed3e9SJustin Hibbits return swDefaults[i].dfltSelect;
163*852ba100SJustin Hibbits break;
1640aeed3e9SJustin Hibbits default:
165*852ba100SJustin Hibbits break;
1660aeed3e9SJustin Hibbits }
167*852ba100SJustin Hibbits
168*852ba100SJustin Hibbits return e_FM_PCD_KG_DFLT_ILLEGAL;
1690aeed3e9SJustin Hibbits }
1700aeed3e9SJustin Hibbits
GetGenCode(e_FmPcdExtractFrom src,uint8_t * p_Offset)1710aeed3e9SJustin Hibbits static uint8_t GetGenCode(e_FmPcdExtractFrom src, uint8_t *p_Offset)
1720aeed3e9SJustin Hibbits {
1730aeed3e9SJustin Hibbits *p_Offset = 0;
1740aeed3e9SJustin Hibbits
1750aeed3e9SJustin Hibbits switch (src)
1760aeed3e9SJustin Hibbits {
1770aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_FROM_FRAME_START):
1780aeed3e9SJustin Hibbits return KG_SCH_GEN_START_OF_FRM;
1790aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_FROM_DFLT_VALUE):
1800aeed3e9SJustin Hibbits return KG_SCH_GEN_DEFAULT;
1810aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_FROM_PARSE_RESULT):
1820aeed3e9SJustin Hibbits return KG_SCH_GEN_PARSE_RESULT_N_FQID;
1830aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_FROM_ENQ_FQID):
1840aeed3e9SJustin Hibbits *p_Offset = 32;
1850aeed3e9SJustin Hibbits return KG_SCH_GEN_PARSE_RESULT_N_FQID;
1860aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_FROM_CURR_END_OF_PARSE):
1870aeed3e9SJustin Hibbits return KG_SCH_GEN_NEXTHDR;
1880aeed3e9SJustin Hibbits default:
1890aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal 'extract from' src"));
1900aeed3e9SJustin Hibbits return 0;
1910aeed3e9SJustin Hibbits }
1920aeed3e9SJustin Hibbits }
1930aeed3e9SJustin Hibbits
GetGenHdrCode(e_NetHeaderType hdr,e_FmPcdHdrIndex hdrIndex,bool ignoreProtocolValidation)1940aeed3e9SJustin Hibbits static uint8_t GetGenHdrCode(e_NetHeaderType hdr, e_FmPcdHdrIndex hdrIndex, bool ignoreProtocolValidation)
1950aeed3e9SJustin Hibbits {
1960aeed3e9SJustin Hibbits if (!ignoreProtocolValidation)
1970aeed3e9SJustin Hibbits switch (hdr)
1980aeed3e9SJustin Hibbits {
1990aeed3e9SJustin Hibbits case (HEADER_TYPE_NONE):
2000aeed3e9SJustin Hibbits ASSERT_COND(FALSE);
2010aeed3e9SJustin Hibbits case (HEADER_TYPE_ETH):
2020aeed3e9SJustin Hibbits return KG_SCH_GEN_ETH;
2030aeed3e9SJustin Hibbits case (HEADER_TYPE_LLC_SNAP):
2040aeed3e9SJustin Hibbits return KG_SCH_GEN_SNAP;
2050aeed3e9SJustin Hibbits case (HEADER_TYPE_PPPoE):
2060aeed3e9SJustin Hibbits return KG_SCH_GEN_PPP;
2070aeed3e9SJustin Hibbits case (HEADER_TYPE_MPLS):
2080aeed3e9SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
2090aeed3e9SJustin Hibbits return KG_SCH_GEN_MPLS1;
2100aeed3e9SJustin Hibbits if (hdrIndex == e_FM_PCD_HDR_INDEX_2)
2110aeed3e9SJustin Hibbits return KG_SCH_GEN_MPLS2;
2120aeed3e9SJustin Hibbits if (hdrIndex == e_FM_PCD_HDR_INDEX_3)
2130aeed3e9SJustin Hibbits return KG_SCH_GEN_MPLS3;
2140aeed3e9SJustin Hibbits if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)
2150aeed3e9SJustin Hibbits return KG_SCH_GEN_MPLS_LAST;
2160aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal MPLS header index"));
2170aeed3e9SJustin Hibbits return 0;
2180aeed3e9SJustin Hibbits case (HEADER_TYPE_IPv4):
2190aeed3e9SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
2200aeed3e9SJustin Hibbits return KG_SCH_GEN_IPV4;
221*852ba100SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_2) || (hdrIndex == e_FM_PCD_HDR_INDEX_LAST))
2220aeed3e9SJustin Hibbits return KG_SCH_GEN_IPV4_TUNNELED;
2230aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 header index"));
2240aeed3e9SJustin Hibbits return 0;
2250aeed3e9SJustin Hibbits case (HEADER_TYPE_IPv6):
2260aeed3e9SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
2270aeed3e9SJustin Hibbits return KG_SCH_GEN_IPV6;
228*852ba100SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_2) || (hdrIndex == e_FM_PCD_HDR_INDEX_LAST))
2290aeed3e9SJustin Hibbits return KG_SCH_GEN_IPV6_TUNNELED;
2300aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 header index"));
2310aeed3e9SJustin Hibbits return 0;
2320aeed3e9SJustin Hibbits case (HEADER_TYPE_GRE):
2330aeed3e9SJustin Hibbits return KG_SCH_GEN_GRE;
2340aeed3e9SJustin Hibbits case (HEADER_TYPE_TCP):
2350aeed3e9SJustin Hibbits return KG_SCH_GEN_TCP;
2360aeed3e9SJustin Hibbits case (HEADER_TYPE_UDP):
2370aeed3e9SJustin Hibbits return KG_SCH_GEN_UDP;
2380aeed3e9SJustin Hibbits case (HEADER_TYPE_IPSEC_AH):
2390aeed3e9SJustin Hibbits return KG_SCH_GEN_IPSEC_AH;
2400aeed3e9SJustin Hibbits case (HEADER_TYPE_IPSEC_ESP):
2410aeed3e9SJustin Hibbits return KG_SCH_GEN_IPSEC_ESP;
2420aeed3e9SJustin Hibbits case (HEADER_TYPE_SCTP):
2430aeed3e9SJustin Hibbits return KG_SCH_GEN_SCTP;
2440aeed3e9SJustin Hibbits case (HEADER_TYPE_DCCP):
2450aeed3e9SJustin Hibbits return KG_SCH_GEN_DCCP;
2460aeed3e9SJustin Hibbits default:
2470aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
2480aeed3e9SJustin Hibbits return 0;
2490aeed3e9SJustin Hibbits }
2500aeed3e9SJustin Hibbits else
2510aeed3e9SJustin Hibbits switch (hdr)
2520aeed3e9SJustin Hibbits {
2530aeed3e9SJustin Hibbits case (HEADER_TYPE_NONE):
2540aeed3e9SJustin Hibbits ASSERT_COND(FALSE);
2550aeed3e9SJustin Hibbits case (HEADER_TYPE_ETH):
2560aeed3e9SJustin Hibbits return KG_SCH_GEN_ETH_NO_V;
2570aeed3e9SJustin Hibbits case (HEADER_TYPE_LLC_SNAP):
2580aeed3e9SJustin Hibbits return KG_SCH_GEN_SNAP_NO_V;
2590aeed3e9SJustin Hibbits case (HEADER_TYPE_PPPoE):
2600aeed3e9SJustin Hibbits return KG_SCH_GEN_PPP_NO_V;
2610aeed3e9SJustin Hibbits case (HEADER_TYPE_MPLS):
2620aeed3e9SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
2630aeed3e9SJustin Hibbits return KG_SCH_GEN_MPLS1_NO_V;
2640aeed3e9SJustin Hibbits if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)
2650aeed3e9SJustin Hibbits return KG_SCH_GEN_MPLS_LAST_NO_V;
2660aeed3e9SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_2) || (hdrIndex == e_FM_PCD_HDR_INDEX_3) )
2670aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Indexed MPLS Extraction not supported"));
2680aeed3e9SJustin Hibbits else
2690aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal MPLS header index"));
2700aeed3e9SJustin Hibbits return 0;
2710aeed3e9SJustin Hibbits case (HEADER_TYPE_IPv4):
2720aeed3e9SJustin Hibbits case (HEADER_TYPE_IPv6):
2730aeed3e9SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
2740aeed3e9SJustin Hibbits return KG_SCH_GEN_L3_NO_V;
275*852ba100SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_2) || (hdrIndex == e_FM_PCD_HDR_INDEX_LAST))
2760aeed3e9SJustin Hibbits return KG_SCH_GEN_IP2_NO_V;
2770aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IP header index"));
2780aeed3e9SJustin Hibbits case (HEADER_TYPE_MINENCAP):
2790aeed3e9SJustin Hibbits return KG_SCH_GEN_IP2_NO_V;
2800aeed3e9SJustin Hibbits case (HEADER_TYPE_USER_DEFINED_L3):
2810aeed3e9SJustin Hibbits return KG_SCH_GEN_L3_NO_V;
2820aeed3e9SJustin Hibbits case (HEADER_TYPE_GRE):
2830aeed3e9SJustin Hibbits return KG_SCH_GEN_GRE_NO_V;
2840aeed3e9SJustin Hibbits case (HEADER_TYPE_TCP):
2850aeed3e9SJustin Hibbits case (HEADER_TYPE_UDP):
2860aeed3e9SJustin Hibbits case (HEADER_TYPE_IPSEC_AH):
2870aeed3e9SJustin Hibbits case (HEADER_TYPE_IPSEC_ESP):
2880aeed3e9SJustin Hibbits case (HEADER_TYPE_SCTP):
2890aeed3e9SJustin Hibbits case (HEADER_TYPE_DCCP):
2900aeed3e9SJustin Hibbits return KG_SCH_GEN_L4_NO_V;
2910aeed3e9SJustin Hibbits case (HEADER_TYPE_USER_DEFINED_SHIM1):
2920aeed3e9SJustin Hibbits return KG_SCH_GEN_SHIM1;
2930aeed3e9SJustin Hibbits case (HEADER_TYPE_USER_DEFINED_SHIM2):
2940aeed3e9SJustin Hibbits return KG_SCH_GEN_SHIM2;
2950aeed3e9SJustin Hibbits default:
2960aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
2970aeed3e9SJustin Hibbits return 0;
2980aeed3e9SJustin Hibbits }
2990aeed3e9SJustin Hibbits }
GetGenFieldCode(e_NetHeaderType hdr,t_FmPcdFields field,bool ignoreProtocolValidation,e_FmPcdHdrIndex hdrIndex)3000aeed3e9SJustin Hibbits static t_GenericCodes GetGenFieldCode(e_NetHeaderType hdr, t_FmPcdFields field, bool ignoreProtocolValidation, e_FmPcdHdrIndex hdrIndex)
3010aeed3e9SJustin Hibbits {
3020aeed3e9SJustin Hibbits if (!ignoreProtocolValidation)
3030aeed3e9SJustin Hibbits switch (hdr)
3040aeed3e9SJustin Hibbits {
3050aeed3e9SJustin Hibbits case (HEADER_TYPE_NONE):
3060aeed3e9SJustin Hibbits ASSERT_COND(FALSE);
307*852ba100SJustin Hibbits break;
3080aeed3e9SJustin Hibbits case (HEADER_TYPE_ETH):
3090aeed3e9SJustin Hibbits switch (field.eth)
3100aeed3e9SJustin Hibbits {
3110aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_ETH_TYPE):
3120aeed3e9SJustin Hibbits return KG_SCH_GEN_ETH_TYPE;
3130aeed3e9SJustin Hibbits default:
3140aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
3150aeed3e9SJustin Hibbits return 0;
3160aeed3e9SJustin Hibbits }
317*852ba100SJustin Hibbits break;
3180aeed3e9SJustin Hibbits case (HEADER_TYPE_VLAN):
3190aeed3e9SJustin Hibbits switch (field.vlan)
3200aeed3e9SJustin Hibbits {
3210aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_VLAN_TCI):
3220aeed3e9SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
3230aeed3e9SJustin Hibbits return KG_SCH_GEN_VLAN1;
3240aeed3e9SJustin Hibbits if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)
3250aeed3e9SJustin Hibbits return KG_SCH_GEN_VLAN2;
3260aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal VLAN header index"));
3270aeed3e9SJustin Hibbits return 0;
3280aeed3e9SJustin Hibbits }
329*852ba100SJustin Hibbits break;
3300aeed3e9SJustin Hibbits case (HEADER_TYPE_MPLS):
3310aeed3e9SJustin Hibbits case (HEADER_TYPE_IPSEC_AH):
3320aeed3e9SJustin Hibbits case (HEADER_TYPE_IPSEC_ESP):
3330aeed3e9SJustin Hibbits case (HEADER_TYPE_LLC_SNAP):
3340aeed3e9SJustin Hibbits case (HEADER_TYPE_PPPoE):
3350aeed3e9SJustin Hibbits case (HEADER_TYPE_IPv4):
3360aeed3e9SJustin Hibbits case (HEADER_TYPE_IPv6):
3370aeed3e9SJustin Hibbits case (HEADER_TYPE_GRE):
3380aeed3e9SJustin Hibbits case (HEADER_TYPE_MINENCAP):
3390aeed3e9SJustin Hibbits case (HEADER_TYPE_USER_DEFINED_L3):
3400aeed3e9SJustin Hibbits case (HEADER_TYPE_TCP):
3410aeed3e9SJustin Hibbits case (HEADER_TYPE_UDP):
3420aeed3e9SJustin Hibbits case (HEADER_TYPE_SCTP):
3430aeed3e9SJustin Hibbits case (HEADER_TYPE_DCCP):
3440aeed3e9SJustin Hibbits case (HEADER_TYPE_USER_DEFINED_L4):
3450aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
3460aeed3e9SJustin Hibbits return 0;
347*852ba100SJustin Hibbits default:
348*852ba100SJustin Hibbits break;
349*852ba100SJustin Hibbits
3500aeed3e9SJustin Hibbits }
3510aeed3e9SJustin Hibbits else
3520aeed3e9SJustin Hibbits switch (hdr)
3530aeed3e9SJustin Hibbits {
3540aeed3e9SJustin Hibbits case (HEADER_TYPE_NONE):
3550aeed3e9SJustin Hibbits ASSERT_COND(FALSE);
356*852ba100SJustin Hibbits break;
3570aeed3e9SJustin Hibbits case (HEADER_TYPE_ETH):
3580aeed3e9SJustin Hibbits switch (field.eth)
3590aeed3e9SJustin Hibbits {
3600aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_ETH_TYPE):
3610aeed3e9SJustin Hibbits return KG_SCH_GEN_ETH_TYPE_NO_V;
3620aeed3e9SJustin Hibbits default:
3630aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
3640aeed3e9SJustin Hibbits return 0;
3650aeed3e9SJustin Hibbits }
366*852ba100SJustin Hibbits break;
3670aeed3e9SJustin Hibbits case (HEADER_TYPE_VLAN):
3680aeed3e9SJustin Hibbits switch (field.vlan)
3690aeed3e9SJustin Hibbits {
3700aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_VLAN_TCI) :
3710aeed3e9SJustin Hibbits if ((hdrIndex == e_FM_PCD_HDR_INDEX_NONE) || (hdrIndex == e_FM_PCD_HDR_INDEX_1))
3720aeed3e9SJustin Hibbits return KG_SCH_GEN_VLAN1_NO_V;
3730aeed3e9SJustin Hibbits if (hdrIndex == e_FM_PCD_HDR_INDEX_LAST)
3740aeed3e9SJustin Hibbits return KG_SCH_GEN_VLAN2_NO_V;
3750aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal VLAN header index"));
3760aeed3e9SJustin Hibbits return 0;
3770aeed3e9SJustin Hibbits }
378*852ba100SJustin Hibbits break;
3790aeed3e9SJustin Hibbits case (HEADER_TYPE_IPv4):
3800aeed3e9SJustin Hibbits switch (field.ipv4)
3810aeed3e9SJustin Hibbits {
3820aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_IPv4_PROTO):
3830aeed3e9SJustin Hibbits return KG_SCH_GEN_IP_PID_NO_V;
3840aeed3e9SJustin Hibbits default:
3850aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
3860aeed3e9SJustin Hibbits return 0;
3870aeed3e9SJustin Hibbits }
388*852ba100SJustin Hibbits break;
3890aeed3e9SJustin Hibbits case (HEADER_TYPE_IPv6):
3900aeed3e9SJustin Hibbits switch (field.ipv6)
3910aeed3e9SJustin Hibbits {
3920aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_IPv6_NEXT_HDR):
3930aeed3e9SJustin Hibbits return KG_SCH_GEN_IP_PID_NO_V;
3940aeed3e9SJustin Hibbits default:
3950aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
3960aeed3e9SJustin Hibbits return 0;
3970aeed3e9SJustin Hibbits }
398*852ba100SJustin Hibbits break;
3990aeed3e9SJustin Hibbits case (HEADER_TYPE_MPLS):
4000aeed3e9SJustin Hibbits case (HEADER_TYPE_LLC_SNAP):
4010aeed3e9SJustin Hibbits case (HEADER_TYPE_PPPoE):
4020aeed3e9SJustin Hibbits case (HEADER_TYPE_GRE):
4030aeed3e9SJustin Hibbits case (HEADER_TYPE_MINENCAP):
4040aeed3e9SJustin Hibbits case (HEADER_TYPE_USER_DEFINED_L3):
4050aeed3e9SJustin Hibbits case (HEADER_TYPE_TCP):
4060aeed3e9SJustin Hibbits case (HEADER_TYPE_UDP):
4070aeed3e9SJustin Hibbits case (HEADER_TYPE_IPSEC_AH):
4080aeed3e9SJustin Hibbits case (HEADER_TYPE_IPSEC_ESP):
4090aeed3e9SJustin Hibbits case (HEADER_TYPE_SCTP):
4100aeed3e9SJustin Hibbits case (HEADER_TYPE_DCCP):
4110aeed3e9SJustin Hibbits case (HEADER_TYPE_USER_DEFINED_L4):
4120aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
4130aeed3e9SJustin Hibbits return 0;
4140aeed3e9SJustin Hibbits default:
415*852ba100SJustin Hibbits break;
416*852ba100SJustin Hibbits }
4170aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Header not supported"));
4180aeed3e9SJustin Hibbits return 0;
4190aeed3e9SJustin Hibbits }
4200aeed3e9SJustin Hibbits
GetKnownProtMask(t_FmPcd * p_FmPcd,e_NetHeaderType hdr,e_FmPcdHdrIndex index,t_FmPcdFields field)421*852ba100SJustin Hibbits static t_KnownFieldsMasks GetKnownProtMask(t_FmPcd *p_FmPcd, e_NetHeaderType hdr, e_FmPcdHdrIndex index, t_FmPcdFields field)
4220aeed3e9SJustin Hibbits {
423*852ba100SJustin Hibbits UNUSED(p_FmPcd);
424*852ba100SJustin Hibbits
4250aeed3e9SJustin Hibbits switch (hdr)
4260aeed3e9SJustin Hibbits {
4270aeed3e9SJustin Hibbits case (HEADER_TYPE_NONE):
4280aeed3e9SJustin Hibbits ASSERT_COND(FALSE);
429*852ba100SJustin Hibbits break;
4300aeed3e9SJustin Hibbits case (HEADER_TYPE_ETH):
4310aeed3e9SJustin Hibbits switch (field.eth)
4320aeed3e9SJustin Hibbits {
4330aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_ETH_DA):
4340aeed3e9SJustin Hibbits return KG_SCH_KN_MACDST;
4350aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_ETH_SA):
4360aeed3e9SJustin Hibbits return KG_SCH_KN_MACSRC;
4370aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_ETH_TYPE):
4380aeed3e9SJustin Hibbits return KG_SCH_KN_ETYPE;
4390aeed3e9SJustin Hibbits default:
4400aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
4410aeed3e9SJustin Hibbits return 0;
4420aeed3e9SJustin Hibbits }
4430aeed3e9SJustin Hibbits case (HEADER_TYPE_LLC_SNAP):
4440aeed3e9SJustin Hibbits switch (field.llcSnap)
4450aeed3e9SJustin Hibbits {
4460aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_LLC_SNAP_TYPE):
4470aeed3e9SJustin Hibbits return KG_SCH_KN_ETYPE;
4480aeed3e9SJustin Hibbits default:
4490aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
4500aeed3e9SJustin Hibbits return 0;
4510aeed3e9SJustin Hibbits }
4520aeed3e9SJustin Hibbits case (HEADER_TYPE_VLAN):
4530aeed3e9SJustin Hibbits switch (field.vlan)
4540aeed3e9SJustin Hibbits {
4550aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_VLAN_TCI):
4560aeed3e9SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
4570aeed3e9SJustin Hibbits return KG_SCH_KN_TCI1;
4580aeed3e9SJustin Hibbits if (index == e_FM_PCD_HDR_INDEX_LAST)
4590aeed3e9SJustin Hibbits return KG_SCH_KN_TCI2;
4600aeed3e9SJustin Hibbits else
4610aeed3e9SJustin Hibbits {
4620aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
4630aeed3e9SJustin Hibbits return 0;
4640aeed3e9SJustin Hibbits }
4650aeed3e9SJustin Hibbits default:
4660aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
4670aeed3e9SJustin Hibbits return 0;
4680aeed3e9SJustin Hibbits }
4690aeed3e9SJustin Hibbits case (HEADER_TYPE_MPLS):
4700aeed3e9SJustin Hibbits switch (field.mpls)
4710aeed3e9SJustin Hibbits {
4720aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_MPLS_LABEL_STACK):
4730aeed3e9SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
4740aeed3e9SJustin Hibbits return KG_SCH_KN_MPLS1;
4750aeed3e9SJustin Hibbits if (index == e_FM_PCD_HDR_INDEX_2)
4760aeed3e9SJustin Hibbits return KG_SCH_KN_MPLS2;
4770aeed3e9SJustin Hibbits if (index == e_FM_PCD_HDR_INDEX_LAST)
4780aeed3e9SJustin Hibbits return KG_SCH_KN_MPLS_LAST;
4790aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal MPLS index"));
4800aeed3e9SJustin Hibbits return 0;
4810aeed3e9SJustin Hibbits default:
4820aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
4830aeed3e9SJustin Hibbits return 0;
4840aeed3e9SJustin Hibbits }
4850aeed3e9SJustin Hibbits case (HEADER_TYPE_IPv4):
4860aeed3e9SJustin Hibbits switch (field.ipv4)
4870aeed3e9SJustin Hibbits {
4880aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_IPv4_SRC_IP):
4890aeed3e9SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
4900aeed3e9SJustin Hibbits return KG_SCH_KN_IPSRC1;
491*852ba100SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_2) || (index == e_FM_PCD_HDR_INDEX_LAST))
4920aeed3e9SJustin Hibbits return KG_SCH_KN_IPSRC2;
4930aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
4940aeed3e9SJustin Hibbits return 0;
4950aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_IPv4_DST_IP):
4960aeed3e9SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
4970aeed3e9SJustin Hibbits return KG_SCH_KN_IPDST1;
498*852ba100SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_2) || (index == e_FM_PCD_HDR_INDEX_LAST))
4990aeed3e9SJustin Hibbits return KG_SCH_KN_IPDST2;
5000aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
5010aeed3e9SJustin Hibbits return 0;
5020aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_IPv4_PROTO):
5030aeed3e9SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
5040aeed3e9SJustin Hibbits return KG_SCH_KN_PTYPE1;
505*852ba100SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_2) || (index == e_FM_PCD_HDR_INDEX_LAST))
5060aeed3e9SJustin Hibbits return KG_SCH_KN_PTYPE2;
5070aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
5080aeed3e9SJustin Hibbits return 0;
5090aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_IPv4_TOS):
5100aeed3e9SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
5110aeed3e9SJustin Hibbits return KG_SCH_KN_IPTOS_TC1;
512*852ba100SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_2) || (index == e_FM_PCD_HDR_INDEX_LAST))
5130aeed3e9SJustin Hibbits return KG_SCH_KN_IPTOS_TC2;
5140aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv4 index"));
5150aeed3e9SJustin Hibbits return 0;
5160aeed3e9SJustin Hibbits default:
5170aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
5180aeed3e9SJustin Hibbits return 0;
5190aeed3e9SJustin Hibbits }
5200aeed3e9SJustin Hibbits case (HEADER_TYPE_IPv6):
5210aeed3e9SJustin Hibbits switch (field.ipv6)
5220aeed3e9SJustin Hibbits {
5230aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_IPv6_SRC_IP):
5240aeed3e9SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
5250aeed3e9SJustin Hibbits return KG_SCH_KN_IPSRC1;
526*852ba100SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_2) || (index == e_FM_PCD_HDR_INDEX_LAST))
5270aeed3e9SJustin Hibbits return KG_SCH_KN_IPSRC2;
5280aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
5290aeed3e9SJustin Hibbits return 0;
5300aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_IPv6_DST_IP):
5310aeed3e9SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
5320aeed3e9SJustin Hibbits return KG_SCH_KN_IPDST1;
533*852ba100SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_2) || (index == e_FM_PCD_HDR_INDEX_LAST))
5340aeed3e9SJustin Hibbits return KG_SCH_KN_IPDST2;
5350aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
5360aeed3e9SJustin Hibbits return 0;
5370aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_IPv6_NEXT_HDR):
5380aeed3e9SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
5390aeed3e9SJustin Hibbits return KG_SCH_KN_PTYPE1;
5400aeed3e9SJustin Hibbits if (index == e_FM_PCD_HDR_INDEX_2)
5410aeed3e9SJustin Hibbits return KG_SCH_KN_PTYPE2;
542*852ba100SJustin Hibbits if (index == e_FM_PCD_HDR_INDEX_LAST)
543*852ba100SJustin Hibbits #ifdef FM_KG_NO_IPPID_SUPPORT
544*852ba100SJustin Hibbits if (p_FmPcd->fmRevInfo.majorRev < 6)
545*852ba100SJustin Hibbits return KG_SCH_KN_PTYPE2;
546*852ba100SJustin Hibbits #endif /* FM_KG_NO_IPPID_SUPPORT */
547*852ba100SJustin Hibbits return KG_SCH_KN_IPPID;
5480aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
5490aeed3e9SJustin Hibbits return 0;
5500aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_IPv6_VER | NET_HEADER_FIELD_IPv6_FL | NET_HEADER_FIELD_IPv6_TC):
5510aeed3e9SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
5520aeed3e9SJustin Hibbits return (KG_SCH_KN_IPV6FL1 | KG_SCH_KN_IPTOS_TC1);
553*852ba100SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_2) || (index == e_FM_PCD_HDR_INDEX_LAST))
5540aeed3e9SJustin Hibbits return (KG_SCH_KN_IPV6FL2 | KG_SCH_KN_IPTOS_TC2);
5550aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
5560aeed3e9SJustin Hibbits return 0;
557*852ba100SJustin Hibbits case (NET_HEADER_FIELD_IPv6_VER | NET_HEADER_FIELD_IPv6_TC):
558*852ba100SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
559*852ba100SJustin Hibbits return KG_SCH_KN_IPTOS_TC1;
560*852ba100SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_2) || (index == e_FM_PCD_HDR_INDEX_LAST))
561*852ba100SJustin Hibbits return KG_SCH_KN_IPTOS_TC2;
562*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
563*852ba100SJustin Hibbits return 0;
564*852ba100SJustin Hibbits case (NET_HEADER_FIELD_IPv6_FL):
565*852ba100SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_NONE) || (index == e_FM_PCD_HDR_INDEX_1))
566*852ba100SJustin Hibbits return KG_SCH_KN_IPV6FL1;
567*852ba100SJustin Hibbits if ((index == e_FM_PCD_HDR_INDEX_2) || (index == e_FM_PCD_HDR_INDEX_LAST))
568*852ba100SJustin Hibbits return KG_SCH_KN_IPV6FL2;
569*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal IPv6 index"));
570*852ba100SJustin Hibbits return 0;
5710aeed3e9SJustin Hibbits default:
5720aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
5730aeed3e9SJustin Hibbits return 0;
5740aeed3e9SJustin Hibbits }
5750aeed3e9SJustin Hibbits case (HEADER_TYPE_GRE):
5760aeed3e9SJustin Hibbits switch (field.gre)
5770aeed3e9SJustin Hibbits {
5780aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_GRE_TYPE):
5790aeed3e9SJustin Hibbits return KG_SCH_KN_GREPTYPE;
5800aeed3e9SJustin Hibbits default:
5810aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
5820aeed3e9SJustin Hibbits return 0;
5830aeed3e9SJustin Hibbits }
5840aeed3e9SJustin Hibbits case (HEADER_TYPE_MINENCAP):
5850aeed3e9SJustin Hibbits switch (field.minencap)
5860aeed3e9SJustin Hibbits {
5870aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_MINENCAP_SRC_IP):
5880aeed3e9SJustin Hibbits return KG_SCH_KN_IPSRC2;
5890aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_MINENCAP_DST_IP):
5900aeed3e9SJustin Hibbits return KG_SCH_KN_IPDST2;
5910aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_MINENCAP_TYPE):
5920aeed3e9SJustin Hibbits return KG_SCH_KN_PTYPE2;
5930aeed3e9SJustin Hibbits default:
5940aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
5950aeed3e9SJustin Hibbits return 0;
5960aeed3e9SJustin Hibbits }
5970aeed3e9SJustin Hibbits case (HEADER_TYPE_TCP):
5980aeed3e9SJustin Hibbits switch (field.tcp)
5990aeed3e9SJustin Hibbits {
6000aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_TCP_PORT_SRC):
6010aeed3e9SJustin Hibbits return KG_SCH_KN_L4PSRC;
6020aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_TCP_PORT_DST):
6030aeed3e9SJustin Hibbits return KG_SCH_KN_L4PDST;
6040aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_TCP_FLAGS):
6050aeed3e9SJustin Hibbits return KG_SCH_KN_TFLG;
6060aeed3e9SJustin Hibbits default:
6070aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
6080aeed3e9SJustin Hibbits return 0;
6090aeed3e9SJustin Hibbits }
6100aeed3e9SJustin Hibbits case (HEADER_TYPE_UDP):
6110aeed3e9SJustin Hibbits switch (field.udp)
6120aeed3e9SJustin Hibbits {
6130aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_PORT_SRC):
6140aeed3e9SJustin Hibbits return KG_SCH_KN_L4PSRC;
6150aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_PORT_DST):
6160aeed3e9SJustin Hibbits return KG_SCH_KN_L4PDST;
6170aeed3e9SJustin Hibbits default:
6180aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
6190aeed3e9SJustin Hibbits return 0;
6200aeed3e9SJustin Hibbits }
6210aeed3e9SJustin Hibbits case (HEADER_TYPE_IPSEC_AH):
6220aeed3e9SJustin Hibbits switch (field.ipsecAh)
6230aeed3e9SJustin Hibbits {
6240aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_IPSEC_AH_SPI):
6250aeed3e9SJustin Hibbits return KG_SCH_KN_IPSEC_SPI;
6260aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_IPSEC_AH_NH):
6270aeed3e9SJustin Hibbits return KG_SCH_KN_IPSEC_NH;
6280aeed3e9SJustin Hibbits default:
6290aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
6300aeed3e9SJustin Hibbits return 0;
6310aeed3e9SJustin Hibbits }
6320aeed3e9SJustin Hibbits case (HEADER_TYPE_IPSEC_ESP):
6330aeed3e9SJustin Hibbits switch (field.ipsecEsp)
6340aeed3e9SJustin Hibbits {
6350aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_IPSEC_ESP_SPI):
6360aeed3e9SJustin Hibbits return KG_SCH_KN_IPSEC_SPI;
6370aeed3e9SJustin Hibbits default:
6380aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
6390aeed3e9SJustin Hibbits return 0;
6400aeed3e9SJustin Hibbits }
6410aeed3e9SJustin Hibbits case (HEADER_TYPE_SCTP):
6420aeed3e9SJustin Hibbits switch (field.sctp)
6430aeed3e9SJustin Hibbits {
6440aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_SCTP_PORT_SRC):
6450aeed3e9SJustin Hibbits return KG_SCH_KN_L4PSRC;
6460aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_SCTP_PORT_DST):
6470aeed3e9SJustin Hibbits return KG_SCH_KN_L4PDST;
6480aeed3e9SJustin Hibbits default:
6490aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
6500aeed3e9SJustin Hibbits return 0;
6510aeed3e9SJustin Hibbits }
6520aeed3e9SJustin Hibbits case (HEADER_TYPE_DCCP):
6530aeed3e9SJustin Hibbits switch (field.dccp)
6540aeed3e9SJustin Hibbits {
6550aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_DCCP_PORT_SRC):
6560aeed3e9SJustin Hibbits return KG_SCH_KN_L4PSRC;
6570aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_DCCP_PORT_DST):
6580aeed3e9SJustin Hibbits return KG_SCH_KN_L4PDST;
6590aeed3e9SJustin Hibbits default:
6600aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
6610aeed3e9SJustin Hibbits return 0;
6620aeed3e9SJustin Hibbits }
6630aeed3e9SJustin Hibbits case (HEADER_TYPE_PPPoE):
6640aeed3e9SJustin Hibbits switch (field.pppoe)
6650aeed3e9SJustin Hibbits {
6660aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_PPPoE_PID):
6670aeed3e9SJustin Hibbits return KG_SCH_KN_PPPID;
6680aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_PPPoE_SID):
6690aeed3e9SJustin Hibbits return KG_SCH_KN_PPPSID;
6700aeed3e9SJustin Hibbits default:
6710aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
6720aeed3e9SJustin Hibbits return 0;
6730aeed3e9SJustin Hibbits }
6740aeed3e9SJustin Hibbits default:
675*852ba100SJustin Hibbits break;
676*852ba100SJustin Hibbits
677*852ba100SJustin Hibbits }
678*852ba100SJustin Hibbits
6790aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Extraction not supported"));
6800aeed3e9SJustin Hibbits return 0;
6810aeed3e9SJustin Hibbits }
6820aeed3e9SJustin Hibbits
6830aeed3e9SJustin Hibbits
GetKnownFieldId(uint32_t bitMask)6840aeed3e9SJustin Hibbits static uint8_t GetKnownFieldId(uint32_t bitMask)
6850aeed3e9SJustin Hibbits {
6860aeed3e9SJustin Hibbits uint8_t cnt = 0;
6870aeed3e9SJustin Hibbits
6880aeed3e9SJustin Hibbits while (bitMask)
6890aeed3e9SJustin Hibbits if (bitMask & 0x80000000)
6900aeed3e9SJustin Hibbits break;
6910aeed3e9SJustin Hibbits else
6920aeed3e9SJustin Hibbits {
6930aeed3e9SJustin Hibbits cnt++;
6940aeed3e9SJustin Hibbits bitMask <<= 1;
6950aeed3e9SJustin Hibbits }
6960aeed3e9SJustin Hibbits return cnt;
6970aeed3e9SJustin Hibbits
6980aeed3e9SJustin Hibbits }
6990aeed3e9SJustin Hibbits
GetExtractedOrMask(uint8_t bitOffset,bool fqid)7000aeed3e9SJustin Hibbits static uint8_t GetExtractedOrMask(uint8_t bitOffset, bool fqid)
7010aeed3e9SJustin Hibbits {
7020aeed3e9SJustin Hibbits uint8_t i, mask, numOfOnesToClear, walking1Mask = 1;
7030aeed3e9SJustin Hibbits
7040aeed3e9SJustin Hibbits /* bitOffset 1-7 --> mask 0x1-0x7F */
7050aeed3e9SJustin Hibbits if (bitOffset<8)
7060aeed3e9SJustin Hibbits {
7070aeed3e9SJustin Hibbits mask = 0;
7080aeed3e9SJustin Hibbits for (i = 0 ; i < bitOffset ; i++, walking1Mask <<= 1)
7090aeed3e9SJustin Hibbits mask |= walking1Mask;
7100aeed3e9SJustin Hibbits }
7110aeed3e9SJustin Hibbits else
7120aeed3e9SJustin Hibbits {
7130aeed3e9SJustin Hibbits mask = 0xFF;
7140aeed3e9SJustin Hibbits numOfOnesToClear = 0;
7150aeed3e9SJustin Hibbits if (fqid && bitOffset>24)
7160aeed3e9SJustin Hibbits /* bitOffset 25-31 --> mask 0xFE-0x80 */
7170aeed3e9SJustin Hibbits numOfOnesToClear = (uint8_t)(bitOffset-24);
7180aeed3e9SJustin Hibbits else
7190aeed3e9SJustin Hibbits /* bitOffset 9-15 --> mask 0xFE-0x80 */
7200aeed3e9SJustin Hibbits if (!fqid && bitOffset>8)
7210aeed3e9SJustin Hibbits numOfOnesToClear = (uint8_t)(bitOffset-8);
7220aeed3e9SJustin Hibbits for (i = 0 ; i < numOfOnesToClear ; i++, walking1Mask <<= 1)
7230aeed3e9SJustin Hibbits mask &= ~walking1Mask;
7240aeed3e9SJustin Hibbits /* bitOffset 8-24 for FQID, 8 for PP --> no mask (0xFF)*/
7250aeed3e9SJustin Hibbits }
7260aeed3e9SJustin Hibbits return mask;
7270aeed3e9SJustin Hibbits }
7280aeed3e9SJustin Hibbits
IncSchemeOwners(t_FmPcd * p_FmPcd,t_FmPcdKgInterModuleBindPortToSchemes * p_BindPort)729*852ba100SJustin Hibbits static void IncSchemeOwners(t_FmPcd *p_FmPcd, t_FmPcdKgInterModuleBindPortToSchemes *p_BindPort)
7300aeed3e9SJustin Hibbits {
731*852ba100SJustin Hibbits t_FmPcdKg *p_FmPcdKg;
7320aeed3e9SJustin Hibbits t_FmPcdKgScheme *p_Scheme;
733*852ba100SJustin Hibbits uint32_t intFlags;
734*852ba100SJustin Hibbits uint8_t relativeSchemeId;
735*852ba100SJustin Hibbits int i;
7360aeed3e9SJustin Hibbits
737*852ba100SJustin Hibbits p_FmPcdKg = p_FmPcd->p_FmPcdKg;
7380aeed3e9SJustin Hibbits
739*852ba100SJustin Hibbits /* for each scheme - update owners counters */
7400aeed3e9SJustin Hibbits for (i = 0; i < p_BindPort->numOfSchemes; i++)
7410aeed3e9SJustin Hibbits {
7420aeed3e9SJustin Hibbits relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmPcd, p_BindPort->schemesIds[i]);
743*852ba100SJustin Hibbits ASSERT_COND(relativeSchemeId < FM_PCD_KG_NUM_OF_SCHEMES);
7440aeed3e9SJustin Hibbits
745*852ba100SJustin Hibbits p_Scheme = &p_FmPcdKg->schemes[relativeSchemeId];
7460aeed3e9SJustin Hibbits
7470aeed3e9SJustin Hibbits /* increment owners number */
748*852ba100SJustin Hibbits intFlags = KgSchemeLock(p_Scheme);
7490aeed3e9SJustin Hibbits p_Scheme->owners++;
750*852ba100SJustin Hibbits KgSchemeUnlock(p_Scheme, intFlags);
7510aeed3e9SJustin Hibbits }
7520aeed3e9SJustin Hibbits }
7530aeed3e9SJustin Hibbits
DecSchemeOwners(t_FmPcd * p_FmPcd,t_FmPcdKgInterModuleBindPortToSchemes * p_BindPort)754*852ba100SJustin Hibbits static void DecSchemeOwners(t_FmPcd *p_FmPcd, t_FmPcdKgInterModuleBindPortToSchemes *p_BindPort)
7550aeed3e9SJustin Hibbits {
756*852ba100SJustin Hibbits t_FmPcdKg *p_FmPcdKg;
7570aeed3e9SJustin Hibbits t_FmPcdKgScheme *p_Scheme;
758*852ba100SJustin Hibbits uint32_t intFlags;
759*852ba100SJustin Hibbits uint8_t relativeSchemeId;
760*852ba100SJustin Hibbits int i;
761*852ba100SJustin Hibbits
762*852ba100SJustin Hibbits p_FmPcdKg = p_FmPcd->p_FmPcdKg;
7630aeed3e9SJustin Hibbits
7640aeed3e9SJustin Hibbits /* for each scheme - update owners counters */
7650aeed3e9SJustin Hibbits for (i = 0; i < p_BindPort->numOfSchemes; i++)
7660aeed3e9SJustin Hibbits {
767*852ba100SJustin Hibbits relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmPcd, p_BindPort->schemesIds[i]);
768*852ba100SJustin Hibbits ASSERT_COND(relativeSchemeId < FM_PCD_KG_NUM_OF_SCHEMES);
769*852ba100SJustin Hibbits
770*852ba100SJustin Hibbits p_Scheme = &p_FmPcdKg->schemes[relativeSchemeId];
7710aeed3e9SJustin Hibbits
7720aeed3e9SJustin Hibbits /* increment owners number */
7730aeed3e9SJustin Hibbits ASSERT_COND(p_Scheme->owners);
774*852ba100SJustin Hibbits intFlags = KgSchemeLock(p_Scheme);
7750aeed3e9SJustin Hibbits p_Scheme->owners--;
776*852ba100SJustin Hibbits KgSchemeUnlock(p_Scheme, intFlags);
777*852ba100SJustin Hibbits }
778*852ba100SJustin Hibbits }
779*852ba100SJustin Hibbits
UpdateRequiredActionFlag(t_FmPcdKgScheme * p_Scheme,bool set)780*852ba100SJustin Hibbits static void UpdateRequiredActionFlag(t_FmPcdKgScheme *p_Scheme, bool set)
781*852ba100SJustin Hibbits {
782*852ba100SJustin Hibbits /* this routine is locked by the calling routine */
783*852ba100SJustin Hibbits ASSERT_COND(p_Scheme);
784*852ba100SJustin Hibbits ASSERT_COND(p_Scheme->valid);
785*852ba100SJustin Hibbits
786*852ba100SJustin Hibbits if (set)
787*852ba100SJustin Hibbits p_Scheme->requiredActionFlag = TRUE;
788*852ba100SJustin Hibbits else
789*852ba100SJustin Hibbits {
790*852ba100SJustin Hibbits p_Scheme->requiredAction = 0;
791*852ba100SJustin Hibbits p_Scheme->requiredActionFlag = FALSE;
7920aeed3e9SJustin Hibbits }
7930aeed3e9SJustin Hibbits }
7940aeed3e9SJustin Hibbits
KgWriteSp(t_FmPcd * p_FmPcd,uint8_t hardwarePortId,uint32_t spReg,bool add)7950aeed3e9SJustin Hibbits static t_Error KgWriteSp(t_FmPcd *p_FmPcd, uint8_t hardwarePortId, uint32_t spReg, bool add)
7960aeed3e9SJustin Hibbits {
797*852ba100SJustin Hibbits struct fman_kg_regs *p_KgRegs;
798*852ba100SJustin Hibbits
799*852ba100SJustin Hibbits uint32_t tmpKgarReg = 0, intFlags;
8000aeed3e9SJustin Hibbits t_Error err = E_OK;
8010aeed3e9SJustin Hibbits
802*852ba100SJustin Hibbits /* The calling routine had locked the port, so for each port only one core can access
803*852ba100SJustin Hibbits * (so we don't need a lock here) */
804*852ba100SJustin Hibbits
8050aeed3e9SJustin Hibbits if (p_FmPcd->h_Hc)
8060aeed3e9SJustin Hibbits return FmHcKgWriteSp(p_FmPcd->h_Hc, hardwarePortId, spReg, add);
8070aeed3e9SJustin Hibbits
808*852ba100SJustin Hibbits p_KgRegs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
8090aeed3e9SJustin Hibbits
8100aeed3e9SJustin Hibbits tmpKgarReg = FmPcdKgBuildReadPortSchemeBindActionReg(hardwarePortId);
811*852ba100SJustin Hibbits /* lock a common KG reg */
812*852ba100SJustin Hibbits intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
8130aeed3e9SJustin Hibbits err = WriteKgarWait(p_FmPcd, tmpKgarReg);
8140aeed3e9SJustin Hibbits if (err)
8150aeed3e9SJustin Hibbits {
816*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
8170aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, err, NO_MSG);
8180aeed3e9SJustin Hibbits }
8190aeed3e9SJustin Hibbits
820*852ba100SJustin Hibbits fman_kg_write_sp(p_KgRegs, spReg, add);
8210aeed3e9SJustin Hibbits
8220aeed3e9SJustin Hibbits tmpKgarReg = FmPcdKgBuildWritePortSchemeBindActionReg(hardwarePortId);
8230aeed3e9SJustin Hibbits
8240aeed3e9SJustin Hibbits err = WriteKgarWait(p_FmPcd, tmpKgarReg);
825*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
8260aeed3e9SJustin Hibbits return err;
8270aeed3e9SJustin Hibbits }
8280aeed3e9SJustin Hibbits
KgWriteCpp(t_FmPcd * p_FmPcd,uint8_t hardwarePortId,uint32_t cppReg)8290aeed3e9SJustin Hibbits static t_Error KgWriteCpp(t_FmPcd *p_FmPcd, uint8_t hardwarePortId, uint32_t cppReg)
8300aeed3e9SJustin Hibbits {
831*852ba100SJustin Hibbits struct fman_kg_regs *p_KgRegs;
8320aeed3e9SJustin Hibbits uint32_t tmpKgarReg, intFlags;
8330aeed3e9SJustin Hibbits t_Error err;
8340aeed3e9SJustin Hibbits
835*852ba100SJustin Hibbits p_KgRegs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
836*852ba100SJustin Hibbits
8370aeed3e9SJustin Hibbits if (p_FmPcd->h_Hc)
838*852ba100SJustin Hibbits {
839*852ba100SJustin Hibbits err = FmHcKgWriteCpp(p_FmPcd->h_Hc, hardwarePortId, cppReg);
840*852ba100SJustin Hibbits return err;
841*852ba100SJustin Hibbits }
8420aeed3e9SJustin Hibbits
843*852ba100SJustin Hibbits intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
844*852ba100SJustin Hibbits fman_kg_write_cpp(p_KgRegs, cppReg);
8450aeed3e9SJustin Hibbits tmpKgarReg = FmPcdKgBuildWritePortClsPlanBindActionReg(hardwarePortId);
8460aeed3e9SJustin Hibbits err = WriteKgarWait(p_FmPcd, tmpKgarReg);
847*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
8480aeed3e9SJustin Hibbits
8490aeed3e9SJustin Hibbits return err;
8500aeed3e9SJustin Hibbits }
8510aeed3e9SJustin Hibbits
BuildCppReg(t_FmPcd * p_FmPcd,uint8_t clsPlanGrpId)852*852ba100SJustin Hibbits static uint32_t BuildCppReg(t_FmPcd *p_FmPcd, uint8_t clsPlanGrpId)
853*852ba100SJustin Hibbits {
854*852ba100SJustin Hibbits uint32_t tmpKgpeCpp;
855*852ba100SJustin Hibbits
856*852ba100SJustin Hibbits tmpKgpeCpp = (uint32_t)(p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrpId].baseEntry / 8);
857*852ba100SJustin Hibbits tmpKgpeCpp |= (uint32_t)(((p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrpId].sizeOfGrp / 8) - 1) << FM_KG_PE_CPP_MASK_SHIFT);
858*852ba100SJustin Hibbits
859*852ba100SJustin Hibbits return tmpKgpeCpp;
860*852ba100SJustin Hibbits }
861*852ba100SJustin Hibbits
BindPortToClsPlanGrp(t_FmPcd * p_FmPcd,uint8_t hardwarePortId,uint8_t clsPlanGrpId)862*852ba100SJustin Hibbits static t_Error BindPortToClsPlanGrp(t_FmPcd *p_FmPcd, uint8_t hardwarePortId, uint8_t clsPlanGrpId)
863*852ba100SJustin Hibbits {
864*852ba100SJustin Hibbits uint32_t tmpKgpeCpp = 0;
865*852ba100SJustin Hibbits
866*852ba100SJustin Hibbits tmpKgpeCpp = BuildCppReg(p_FmPcd, clsPlanGrpId);
867*852ba100SJustin Hibbits return KgWriteCpp(p_FmPcd, hardwarePortId, tmpKgpeCpp);
868*852ba100SJustin Hibbits }
869*852ba100SJustin Hibbits
UnbindPortToClsPlanGrp(t_FmPcd * p_FmPcd,uint8_t hardwarePortId)870*852ba100SJustin Hibbits static void UnbindPortToClsPlanGrp(t_FmPcd *p_FmPcd, uint8_t hardwarePortId)
8710aeed3e9SJustin Hibbits {
8720aeed3e9SJustin Hibbits KgWriteCpp(p_FmPcd, hardwarePortId, 0);
8730aeed3e9SJustin Hibbits }
8740aeed3e9SJustin Hibbits
875*852ba100SJustin Hibbits #if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
ReadClsPlanBlockActionReg(uint8_t grpId)876*852ba100SJustin Hibbits static uint32_t __attribute__((unused)) ReadClsPlanBlockActionReg(uint8_t grpId)
8770aeed3e9SJustin Hibbits {
878*852ba100SJustin Hibbits return (uint32_t)(FM_KG_KGAR_GO |
879*852ba100SJustin Hibbits FM_KG_KGAR_READ |
880*852ba100SJustin Hibbits FM_PCD_KG_KGAR_SEL_CLS_PLAN_ENTRY |
881*852ba100SJustin Hibbits DUMMY_PORT_ID |
882*852ba100SJustin Hibbits ((uint32_t)grpId << FM_PCD_KG_KGAR_NUM_SHIFT) |
883*852ba100SJustin Hibbits FM_PCD_KG_KGAR_WSEL_MASK);
8840aeed3e9SJustin Hibbits
885*852ba100SJustin Hibbits /* if we ever want to write 1 by 1, use:
886*852ba100SJustin Hibbits sel = (uint8_t)(0x01 << (7- (entryId % CLS_PLAN_NUM_PER_GRP)));
887*852ba100SJustin Hibbits */
8880aeed3e9SJustin Hibbits }
889*852ba100SJustin Hibbits #endif /* (defined(DEBUG_ERRORS) && ... */
8900aeed3e9SJustin Hibbits
PcdKgErrorException(t_Handle h_FmPcd)8910aeed3e9SJustin Hibbits static void PcdKgErrorException(t_Handle h_FmPcd)
8920aeed3e9SJustin Hibbits {
8930aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
894*852ba100SJustin Hibbits uint32_t event,schemeIndexes = 0, index = 0;
895*852ba100SJustin Hibbits struct fman_kg_regs *p_KgRegs;
8960aeed3e9SJustin Hibbits
8970aeed3e9SJustin Hibbits ASSERT_COND(FmIsMaster(p_FmPcd->h_Fm));
898*852ba100SJustin Hibbits p_KgRegs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
899*852ba100SJustin Hibbits fman_kg_get_event(p_KgRegs, &event, &schemeIndexes);
9000aeed3e9SJustin Hibbits
901*852ba100SJustin Hibbits if (event & FM_EX_KG_DOUBLE_ECC)
9020aeed3e9SJustin Hibbits p_FmPcd->f_Exception(p_FmPcd->h_App,e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC);
903*852ba100SJustin Hibbits if (event & FM_EX_KG_KEYSIZE_OVERFLOW)
9040aeed3e9SJustin Hibbits {
9050aeed3e9SJustin Hibbits if (schemeIndexes)
9060aeed3e9SJustin Hibbits {
9070aeed3e9SJustin Hibbits while (schemeIndexes)
9080aeed3e9SJustin Hibbits {
9090aeed3e9SJustin Hibbits if (schemeIndexes & 0x1)
9100aeed3e9SJustin Hibbits p_FmPcd->f_FmPcdIndexedException(p_FmPcd->h_App,e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW, (uint16_t)(31 - index));
9110aeed3e9SJustin Hibbits schemeIndexes >>= 1;
9120aeed3e9SJustin Hibbits index+=1;
9130aeed3e9SJustin Hibbits }
9140aeed3e9SJustin Hibbits }
9150aeed3e9SJustin Hibbits else /* this should happen only when interrupt is forced. */
9160aeed3e9SJustin Hibbits p_FmPcd->f_Exception(p_FmPcd->h_App,e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW);
9170aeed3e9SJustin Hibbits }
9180aeed3e9SJustin Hibbits }
9190aeed3e9SJustin Hibbits
KgInitGuest(t_FmPcd * p_FmPcd)9200aeed3e9SJustin Hibbits static t_Error KgInitGuest(t_FmPcd *p_FmPcd)
9210aeed3e9SJustin Hibbits {
9220aeed3e9SJustin Hibbits t_Error err = E_OK;
9230aeed3e9SJustin Hibbits t_FmPcdIpcKgSchemesParams kgAlloc;
9240aeed3e9SJustin Hibbits uint32_t replyLength;
9250aeed3e9SJustin Hibbits t_FmPcdIpcReply reply;
9260aeed3e9SJustin Hibbits t_FmPcdIpcMsg msg;
9270aeed3e9SJustin Hibbits
9280aeed3e9SJustin Hibbits ASSERT_COND(p_FmPcd->guestId != NCSW_MASTER_ID);
9290aeed3e9SJustin Hibbits
9300aeed3e9SJustin Hibbits /* in GUEST_PARTITION, we use the IPC */
9310aeed3e9SJustin Hibbits memset(&reply, 0, sizeof(reply));
9320aeed3e9SJustin Hibbits memset(&msg, 0, sizeof(msg));
9330aeed3e9SJustin Hibbits memset(&kgAlloc, 0, sizeof(t_FmPcdIpcKgSchemesParams));
9340aeed3e9SJustin Hibbits kgAlloc.numOfSchemes = p_FmPcd->p_FmPcdKg->numOfSchemes;
9350aeed3e9SJustin Hibbits kgAlloc.guestId = p_FmPcd->guestId;
9360aeed3e9SJustin Hibbits msg.msgId = FM_PCD_ALLOC_KG_SCHEMES;
9370aeed3e9SJustin Hibbits memcpy(msg.msgBody, &kgAlloc, sizeof(kgAlloc));
9380aeed3e9SJustin Hibbits replyLength = sizeof(uint32_t) + p_FmPcd->p_FmPcdKg->numOfSchemes*sizeof(uint8_t);
9390aeed3e9SJustin Hibbits if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
9400aeed3e9SJustin Hibbits (uint8_t*)&msg,
9410aeed3e9SJustin Hibbits sizeof(msg.msgId) + sizeof(kgAlloc),
9420aeed3e9SJustin Hibbits (uint8_t*)&reply,
9430aeed3e9SJustin Hibbits &replyLength,
9440aeed3e9SJustin Hibbits NULL,
9450aeed3e9SJustin Hibbits NULL)) != E_OK)
9460aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
9470aeed3e9SJustin Hibbits if (replyLength != (sizeof(uint32_t) + p_FmPcd->p_FmPcdKg->numOfSchemes*sizeof(uint8_t)))
9480aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
9490aeed3e9SJustin Hibbits memcpy(p_FmPcd->p_FmPcdKg->schemesIds, (uint8_t*)(reply.replyBody),p_FmPcd->p_FmPcdKg->numOfSchemes*sizeof(uint8_t));
9500aeed3e9SJustin Hibbits
9510aeed3e9SJustin Hibbits return (t_Error)reply.error;
9520aeed3e9SJustin Hibbits }
9530aeed3e9SJustin Hibbits
KgInitMaster(t_FmPcd * p_FmPcd)9540aeed3e9SJustin Hibbits static t_Error KgInitMaster(t_FmPcd *p_FmPcd)
9550aeed3e9SJustin Hibbits {
9560aeed3e9SJustin Hibbits t_Error err = E_OK;
957*852ba100SJustin Hibbits struct fman_kg_regs *p_Regs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
9580aeed3e9SJustin Hibbits
9590aeed3e9SJustin Hibbits ASSERT_COND(p_FmPcd->guestId == NCSW_MASTER_ID);
9600aeed3e9SJustin Hibbits
961*852ba100SJustin Hibbits if (p_FmPcd->exceptions & FM_EX_KG_DOUBLE_ECC)
9620aeed3e9SJustin Hibbits FmEnableRamsEcc(p_FmPcd->h_Fm);
9630aeed3e9SJustin Hibbits
964*852ba100SJustin Hibbits fman_kg_init(p_Regs, p_FmPcd->exceptions, GET_NIA_BMI_AC_ENQ_FRAME(p_FmPcd));
9650aeed3e9SJustin Hibbits
9660aeed3e9SJustin Hibbits /* register even if no interrupts enabled, to allow future enablement */
967*852ba100SJustin Hibbits FmRegisterIntr(p_FmPcd->h_Fm,
968*852ba100SJustin Hibbits e_FM_MOD_KG,
969*852ba100SJustin Hibbits 0,
970*852ba100SJustin Hibbits e_FM_INTR_TYPE_ERR,
971*852ba100SJustin Hibbits PcdKgErrorException,
972*852ba100SJustin Hibbits p_FmPcd);
9730aeed3e9SJustin Hibbits
974*852ba100SJustin Hibbits fman_kg_enable_scheme_interrupts(p_Regs);
9750aeed3e9SJustin Hibbits
9760aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdKg->numOfSchemes)
9770aeed3e9SJustin Hibbits {
9780aeed3e9SJustin Hibbits err = FmPcdKgAllocSchemes(p_FmPcd,
9790aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdKg->numOfSchemes,
9800aeed3e9SJustin Hibbits p_FmPcd->guestId,
9810aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdKg->schemesIds);
9820aeed3e9SJustin Hibbits if (err)
9830aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, err, NO_MSG);
9840aeed3e9SJustin Hibbits }
9850aeed3e9SJustin Hibbits
9860aeed3e9SJustin Hibbits return E_OK;
9870aeed3e9SJustin Hibbits }
9880aeed3e9SJustin Hibbits
ValidateSchemeSw(t_FmPcdKgScheme * p_Scheme)989*852ba100SJustin Hibbits static void ValidateSchemeSw(t_FmPcdKgScheme *p_Scheme)
9900aeed3e9SJustin Hibbits {
991*852ba100SJustin Hibbits ASSERT_COND(!p_Scheme->valid);
992*852ba100SJustin Hibbits if (p_Scheme->netEnvId != ILLEGAL_NETENV)
993*852ba100SJustin Hibbits FmPcdIncNetEnvOwners(p_Scheme->h_FmPcd, p_Scheme->netEnvId);
994*852ba100SJustin Hibbits p_Scheme->valid = TRUE;
995*852ba100SJustin Hibbits }
9960aeed3e9SJustin Hibbits
InvalidateSchemeSw(t_FmPcdKgScheme * p_Scheme)997*852ba100SJustin Hibbits static t_Error InvalidateSchemeSw(t_FmPcdKgScheme *p_Scheme)
998*852ba100SJustin Hibbits {
999*852ba100SJustin Hibbits if (p_Scheme->owners)
1000*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Trying to delete a scheme that has ports bound to"));
10010aeed3e9SJustin Hibbits
1002*852ba100SJustin Hibbits if (p_Scheme->netEnvId != ILLEGAL_NETENV)
1003*852ba100SJustin Hibbits FmPcdDecNetEnvOwners(p_Scheme->h_FmPcd, p_Scheme->netEnvId);
1004*852ba100SJustin Hibbits p_Scheme->valid = FALSE;
10050aeed3e9SJustin Hibbits
10060aeed3e9SJustin Hibbits return E_OK;
10070aeed3e9SJustin Hibbits }
10080aeed3e9SJustin Hibbits
BuildSchemeRegs(t_FmPcdKgScheme * p_Scheme,t_FmPcdKgSchemeParams * p_SchemeParams,struct fman_kg_scheme_regs * p_SchemeRegs)1009*852ba100SJustin Hibbits static t_Error BuildSchemeRegs(t_FmPcdKgScheme *p_Scheme,
1010*852ba100SJustin Hibbits t_FmPcdKgSchemeParams *p_SchemeParams,
1011*852ba100SJustin Hibbits struct fman_kg_scheme_regs *p_SchemeRegs)
10120aeed3e9SJustin Hibbits {
1013*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)(p_Scheme->h_FmPcd);
10140aeed3e9SJustin Hibbits uint32_t grpBits = 0;
10150aeed3e9SJustin Hibbits uint8_t grpBase;
10160aeed3e9SJustin Hibbits bool direct=TRUE, absolute=FALSE;
10170aeed3e9SJustin Hibbits uint16_t profileId=0, numOfProfiles=0, relativeProfileId;
10180aeed3e9SJustin Hibbits t_Error err = E_OK;
10190aeed3e9SJustin Hibbits int i = 0;
10200aeed3e9SJustin Hibbits t_NetEnvParams netEnvParams;
10210aeed3e9SJustin Hibbits uint32_t tmpReg, fqbTmp = 0, ppcTmp = 0, selectTmp, maskTmp, knownTmp, genTmp;
10220aeed3e9SJustin Hibbits t_FmPcdKgKeyExtractAndHashParams *p_KeyAndHash = NULL;
10230aeed3e9SJustin Hibbits uint8_t j, curr, idx;
10240aeed3e9SJustin Hibbits uint8_t id, shift=0, code=0, offset=0, size=0;
10250aeed3e9SJustin Hibbits t_FmPcdExtractEntry *p_Extract = NULL;
10260aeed3e9SJustin Hibbits t_FmPcdKgExtractedOrParams *p_ExtractOr;
10270aeed3e9SJustin Hibbits bool generic = FALSE;
10280aeed3e9SJustin Hibbits t_KnownFieldsMasks bitMask;
10290aeed3e9SJustin Hibbits e_FmPcdKgExtractDfltSelect swDefault = (e_FmPcdKgExtractDfltSelect)0;
10300aeed3e9SJustin Hibbits t_FmPcdKgSchemesExtracts *p_LocalExtractsArray;
10310aeed3e9SJustin Hibbits uint8_t numOfSwDefaults = 0;
10320aeed3e9SJustin Hibbits t_FmPcdKgExtractDflt swDefaults[NUM_OF_SW_DEFAULTS];
1033*852ba100SJustin Hibbits uint8_t currGenId = 0;
10340aeed3e9SJustin Hibbits
10350aeed3e9SJustin Hibbits memset(swDefaults, 0, NUM_OF_SW_DEFAULTS*sizeof(t_FmPcdKgExtractDflt));
1036*852ba100SJustin Hibbits memset(p_SchemeRegs, 0, sizeof(struct fman_kg_scheme_regs));
10370aeed3e9SJustin Hibbits
1038*852ba100SJustin Hibbits if (p_SchemeParams->netEnvParams.numOfDistinctionUnits > FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
10390aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE,
10400aeed3e9SJustin Hibbits ("numOfDistinctionUnits should not exceed %d", FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS));
10410aeed3e9SJustin Hibbits
10420aeed3e9SJustin Hibbits /* by netEnv parameters, get match vector */
1043*852ba100SJustin Hibbits if (!p_SchemeParams->alwaysDirect)
10440aeed3e9SJustin Hibbits {
1045*852ba100SJustin Hibbits p_Scheme->netEnvId = FmPcdGetNetEnvId(p_SchemeParams->netEnvParams.h_NetEnv);
1046*852ba100SJustin Hibbits netEnvParams.netEnvId = p_Scheme->netEnvId;
1047*852ba100SJustin Hibbits netEnvParams.numOfDistinctionUnits = p_SchemeParams->netEnvParams.numOfDistinctionUnits;
1048*852ba100SJustin Hibbits memcpy(netEnvParams.unitIds, p_SchemeParams->netEnvParams.unitIds, (sizeof(uint8_t))*p_SchemeParams->netEnvParams.numOfDistinctionUnits);
10490aeed3e9SJustin Hibbits err = PcdGetUnitsVector(p_FmPcd, &netEnvParams);
10500aeed3e9SJustin Hibbits if (err)
10510aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
1052*852ba100SJustin Hibbits p_Scheme->matchVector = netEnvParams.vector;
10530aeed3e9SJustin Hibbits }
10540aeed3e9SJustin Hibbits else
10550aeed3e9SJustin Hibbits {
1056*852ba100SJustin Hibbits p_Scheme->matchVector = SCHEME_ALWAYS_DIRECT;
1057*852ba100SJustin Hibbits p_Scheme->netEnvId = ILLEGAL_NETENV;
10580aeed3e9SJustin Hibbits }
10590aeed3e9SJustin Hibbits
1060*852ba100SJustin Hibbits if (p_SchemeParams->nextEngine == e_FM_PCD_INVALID)
10610aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next Engine of the scheme is not Valid"));
10620aeed3e9SJustin Hibbits
1063*852ba100SJustin Hibbits if (p_SchemeParams->bypassFqidGeneration)
10640aeed3e9SJustin Hibbits {
10650aeed3e9SJustin Hibbits #ifdef FM_KG_NO_BYPASS_FQID_GEN
1066*852ba100SJustin Hibbits if ((p_FmPcd->fmRevInfo.majorRev != 4) && (p_FmPcd->fmRevInfo.majorRev < 6))
10670aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("bypassFqidGeneration."));
10680aeed3e9SJustin Hibbits #endif /* FM_KG_NO_BYPASS_FQID_GEN */
1069*852ba100SJustin Hibbits if (p_SchemeParams->baseFqid)
10700aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("baseFqid set for a scheme that does not generate an FQID"));
10710aeed3e9SJustin Hibbits }
10720aeed3e9SJustin Hibbits else
1073*852ba100SJustin Hibbits if (!p_SchemeParams->baseFqid)
10740aeed3e9SJustin Hibbits DBG(WARNING, ("baseFqid is 0."));
10750aeed3e9SJustin Hibbits
1076*852ba100SJustin Hibbits if (p_SchemeParams->nextEngine == e_FM_PCD_PLCR)
10770aeed3e9SJustin Hibbits {
1078*852ba100SJustin Hibbits direct = p_SchemeParams->kgNextEngineParams.plcrProfile.direct;
1079*852ba100SJustin Hibbits p_Scheme->directPlcr = direct;
1080*852ba100SJustin Hibbits absolute = (bool)(p_SchemeParams->kgNextEngineParams.plcrProfile.sharedProfile ? TRUE : FALSE);
10810aeed3e9SJustin Hibbits if (!direct && absolute)
10820aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Indirect policing is not available when profile is shared."));
10830aeed3e9SJustin Hibbits
10840aeed3e9SJustin Hibbits if (direct)
10850aeed3e9SJustin Hibbits {
1086*852ba100SJustin Hibbits profileId = p_SchemeParams->kgNextEngineParams.plcrProfile.profileSelect.directRelativeProfileId;
10870aeed3e9SJustin Hibbits numOfProfiles = 1;
10880aeed3e9SJustin Hibbits }
10890aeed3e9SJustin Hibbits else
10900aeed3e9SJustin Hibbits {
1091*852ba100SJustin Hibbits profileId = p_SchemeParams->kgNextEngineParams.plcrProfile.profileSelect.indirectProfile.fqidOffsetRelativeProfileIdBase;
1092*852ba100SJustin Hibbits shift = p_SchemeParams->kgNextEngineParams.plcrProfile.profileSelect.indirectProfile.fqidOffsetShift;
1093*852ba100SJustin Hibbits numOfProfiles = p_SchemeParams->kgNextEngineParams.plcrProfile.profileSelect.indirectProfile.numOfProfiles;
10940aeed3e9SJustin Hibbits }
10950aeed3e9SJustin Hibbits }
10960aeed3e9SJustin Hibbits
1097*852ba100SJustin Hibbits if (p_SchemeParams->nextEngine == e_FM_PCD_CC)
10980aeed3e9SJustin Hibbits {
10990aeed3e9SJustin Hibbits #ifdef FM_KG_NO_BYPASS_PLCR_PROFILE_GEN
1100*852ba100SJustin Hibbits if ((p_SchemeParams->kgNextEngineParams.cc.plcrNext) && (p_SchemeParams->kgNextEngineParams.cc.bypassPlcrProfileGeneration))
11010aeed3e9SJustin Hibbits {
1102*852ba100SJustin Hibbits if ((p_FmPcd->fmRevInfo.majorRev != 4) && (p_FmPcd->fmRevInfo.majorRev < 6))
11030aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("bypassPlcrProfileGeneration."));
11040aeed3e9SJustin Hibbits }
11050aeed3e9SJustin Hibbits #endif /* FM_KG_NO_BYPASS_PLCR_PROFILE_GEN */
11060aeed3e9SJustin Hibbits
1107*852ba100SJustin Hibbits err = FmPcdCcGetGrpParams(p_SchemeParams->kgNextEngineParams.cc.h_CcTree,
1108*852ba100SJustin Hibbits p_SchemeParams->kgNextEngineParams.cc.grpId,
11090aeed3e9SJustin Hibbits &grpBits,
11100aeed3e9SJustin Hibbits &grpBase);
11110aeed3e9SJustin Hibbits if (err)
11120aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
1113*852ba100SJustin Hibbits p_Scheme->ccUnits = grpBits;
11140aeed3e9SJustin Hibbits
1115*852ba100SJustin Hibbits if ((p_SchemeParams->kgNextEngineParams.cc.plcrNext) &&
1116*852ba100SJustin Hibbits (!p_SchemeParams->kgNextEngineParams.cc.bypassPlcrProfileGeneration))
11170aeed3e9SJustin Hibbits {
1118*852ba100SJustin Hibbits if (p_SchemeParams->kgNextEngineParams.cc.plcrProfile.sharedProfile)
11190aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Shared profile may not be used after Coarse classification."));
11200aeed3e9SJustin Hibbits absolute = FALSE;
1121*852ba100SJustin Hibbits direct = p_SchemeParams->kgNextEngineParams.cc.plcrProfile.direct;
11220aeed3e9SJustin Hibbits if (direct)
11230aeed3e9SJustin Hibbits {
1124*852ba100SJustin Hibbits profileId = p_SchemeParams->kgNextEngineParams.cc.plcrProfile.profileSelect.directRelativeProfileId;
11250aeed3e9SJustin Hibbits numOfProfiles = 1;
11260aeed3e9SJustin Hibbits }
11270aeed3e9SJustin Hibbits else
11280aeed3e9SJustin Hibbits {
1129*852ba100SJustin Hibbits profileId = p_SchemeParams->kgNextEngineParams.cc.plcrProfile.profileSelect.indirectProfile.fqidOffsetRelativeProfileIdBase;
1130*852ba100SJustin Hibbits shift = p_SchemeParams->kgNextEngineParams.cc.plcrProfile.profileSelect.indirectProfile.fqidOffsetShift;
1131*852ba100SJustin Hibbits numOfProfiles = p_SchemeParams->kgNextEngineParams.cc.plcrProfile.profileSelect.indirectProfile.numOfProfiles;
11320aeed3e9SJustin Hibbits }
11330aeed3e9SJustin Hibbits }
11340aeed3e9SJustin Hibbits }
11350aeed3e9SJustin Hibbits
11360aeed3e9SJustin Hibbits /* if policer is used directly after KG, or after CC */
1137*852ba100SJustin Hibbits if ((p_SchemeParams->nextEngine == e_FM_PCD_PLCR) ||
1138*852ba100SJustin Hibbits ((p_SchemeParams->nextEngine == e_FM_PCD_CC) &&
1139*852ba100SJustin Hibbits (p_SchemeParams->kgNextEngineParams.cc.plcrNext) &&
1140*852ba100SJustin Hibbits (!p_SchemeParams->kgNextEngineParams.cc.bypassPlcrProfileGeneration)))
11410aeed3e9SJustin Hibbits {
11420aeed3e9SJustin Hibbits /* if private policer profile, it may be uninitialized yet, therefore no checks are done at this stage */
11430aeed3e9SJustin Hibbits if (absolute)
11440aeed3e9SJustin Hibbits {
11450aeed3e9SJustin Hibbits /* for absolute direct policy only, */
11460aeed3e9SJustin Hibbits relativeProfileId = profileId;
1147*852ba100SJustin Hibbits err = FmPcdPlcrGetAbsoluteIdByProfileParams((t_Handle)p_FmPcd,e_FM_PCD_PLCR_SHARED,NULL, relativeProfileId, &profileId);
11480aeed3e9SJustin Hibbits if (err)
11490aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, ("Shared profile not valid offset"));
11500aeed3e9SJustin Hibbits if (!FmPcdPlcrIsProfileValid(p_FmPcd, profileId))
11510aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Shared profile not valid."));
1152*852ba100SJustin Hibbits p_Scheme->relativeProfileId = profileId;
11530aeed3e9SJustin Hibbits }
11540aeed3e9SJustin Hibbits else
11550aeed3e9SJustin Hibbits {
11560aeed3e9SJustin Hibbits /* save relative profile id's for later check */
1157*852ba100SJustin Hibbits p_Scheme->nextRelativePlcrProfile = TRUE;
1158*852ba100SJustin Hibbits p_Scheme->relativeProfileId = profileId;
1159*852ba100SJustin Hibbits p_Scheme->numOfProfiles = numOfProfiles;
11600aeed3e9SJustin Hibbits }
11610aeed3e9SJustin Hibbits }
11620aeed3e9SJustin Hibbits else
11630aeed3e9SJustin Hibbits {
11640aeed3e9SJustin Hibbits /* if policer is NOT going to be used after KG at all than if bypassFqidGeneration
11650aeed3e9SJustin Hibbits is set, we do not need numOfUsedExtractedOrs and hashDistributionNumOfFqids */
1166*852ba100SJustin Hibbits if (p_SchemeParams->bypassFqidGeneration && p_SchemeParams->numOfUsedExtractedOrs)
11670aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE,
11680aeed3e9SJustin Hibbits ("numOfUsedExtractedOrs is set in a scheme that does not generate FQID or policer profile ID"));
1169*852ba100SJustin Hibbits if (p_SchemeParams->bypassFqidGeneration &&
1170*852ba100SJustin Hibbits p_SchemeParams->useHash &&
1171*852ba100SJustin Hibbits p_SchemeParams->keyExtractAndHashParams.hashDistributionNumOfFqids)
11720aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE,
11730aeed3e9SJustin Hibbits ("hashDistributionNumOfFqids is set in a scheme that does not generate FQID or policer profile ID"));
11740aeed3e9SJustin Hibbits }
11750aeed3e9SJustin Hibbits
11760aeed3e9SJustin Hibbits /* configure all 21 scheme registers */
11770aeed3e9SJustin Hibbits tmpReg = KG_SCH_MODE_EN;
1178*852ba100SJustin Hibbits switch (p_SchemeParams->nextEngine)
11790aeed3e9SJustin Hibbits {
11800aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR):
11810aeed3e9SJustin Hibbits /* add to mode register - NIA */
11820aeed3e9SJustin Hibbits tmpReg |= KG_SCH_MODE_NIA_PLCR;
11830aeed3e9SJustin Hibbits tmpReg |= NIA_ENG_PLCR;
1184*852ba100SJustin Hibbits tmpReg |= (uint32_t)(p_SchemeParams->kgNextEngineParams.plcrProfile.sharedProfile ? NIA_PLCR_ABSOLUTE:0);
11850aeed3e9SJustin Hibbits /* initialize policer profile command - */
11860aeed3e9SJustin Hibbits /* configure kgse_ppc */
11870aeed3e9SJustin Hibbits if (direct)
11880aeed3e9SJustin Hibbits /* use profileId as base, other fields are 0 */
11890aeed3e9SJustin Hibbits p_SchemeRegs->kgse_ppc = (uint32_t)profileId;
11900aeed3e9SJustin Hibbits else
11910aeed3e9SJustin Hibbits {
11920aeed3e9SJustin Hibbits if (shift > MAX_PP_SHIFT)
11930aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fqidOffsetShift may not be larger than %d", MAX_PP_SHIFT));
11940aeed3e9SJustin Hibbits
11950aeed3e9SJustin Hibbits if (!numOfProfiles || !POWER_OF_2(numOfProfiles))
11960aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfProfiles must not be 0 and must be a power of 2"));
11970aeed3e9SJustin Hibbits
11980aeed3e9SJustin Hibbits ppcTmp = ((uint32_t)shift << KG_SCH_PP_SHIFT_HIGH_SHIFT) & KG_SCH_PP_SHIFT_HIGH;
11990aeed3e9SJustin Hibbits ppcTmp |= ((uint32_t)shift << KG_SCH_PP_SHIFT_LOW_SHIFT) & KG_SCH_PP_SHIFT_LOW;
12000aeed3e9SJustin Hibbits ppcTmp |= ((uint32_t)(numOfProfiles-1) << KG_SCH_PP_MASK_SHIFT);
12010aeed3e9SJustin Hibbits ppcTmp |= (uint32_t)profileId;
12020aeed3e9SJustin Hibbits
12030aeed3e9SJustin Hibbits p_SchemeRegs->kgse_ppc = ppcTmp;
12040aeed3e9SJustin Hibbits }
12050aeed3e9SJustin Hibbits break;
12060aeed3e9SJustin Hibbits case (e_FM_PCD_CC):
12070aeed3e9SJustin Hibbits /* mode reg - define NIA */
12080aeed3e9SJustin Hibbits tmpReg |= (NIA_ENG_FM_CTL | NIA_FM_CTL_AC_CC);
12090aeed3e9SJustin Hibbits
12100aeed3e9SJustin Hibbits p_SchemeRegs->kgse_ccbs = grpBits;
12110aeed3e9SJustin Hibbits tmpReg |= (uint32_t)(grpBase << KG_SCH_MODE_CCOBASE_SHIFT);
12120aeed3e9SJustin Hibbits
1213*852ba100SJustin Hibbits if (p_SchemeParams->kgNextEngineParams.cc.plcrNext)
12140aeed3e9SJustin Hibbits {
1215*852ba100SJustin Hibbits if (!p_SchemeParams->kgNextEngineParams.cc.bypassPlcrProfileGeneration)
12160aeed3e9SJustin Hibbits {
12170aeed3e9SJustin Hibbits /* find out if absolute or relative */
12180aeed3e9SJustin Hibbits if (absolute)
12190aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("It is illegal to request a shared profile in a scheme that is in a KG->CC->PLCR flow"));
12200aeed3e9SJustin Hibbits if (direct)
12210aeed3e9SJustin Hibbits {
12220aeed3e9SJustin Hibbits /* mask = 0, base = directProfileId */
12230aeed3e9SJustin Hibbits p_SchemeRegs->kgse_ppc = (uint32_t)profileId;
12240aeed3e9SJustin Hibbits }
12250aeed3e9SJustin Hibbits else
12260aeed3e9SJustin Hibbits {
12270aeed3e9SJustin Hibbits if (shift > MAX_PP_SHIFT)
12280aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fqidOffsetShift may not be larger than %d", MAX_PP_SHIFT));
12290aeed3e9SJustin Hibbits if (!numOfProfiles || !POWER_OF_2(numOfProfiles))
12300aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfProfiles must not be 0 and must be a power of 2"));
12310aeed3e9SJustin Hibbits
12320aeed3e9SJustin Hibbits ppcTmp = ((uint32_t)shift << KG_SCH_PP_SHIFT_HIGH_SHIFT) & KG_SCH_PP_SHIFT_HIGH;
12330aeed3e9SJustin Hibbits ppcTmp |= ((uint32_t)shift << KG_SCH_PP_SHIFT_LOW_SHIFT) & KG_SCH_PP_SHIFT_LOW;
12340aeed3e9SJustin Hibbits ppcTmp |= ((uint32_t)(numOfProfiles-1) << KG_SCH_PP_MASK_SHIFT);
12350aeed3e9SJustin Hibbits ppcTmp |= (uint32_t)profileId;
12360aeed3e9SJustin Hibbits
12370aeed3e9SJustin Hibbits p_SchemeRegs->kgse_ppc = ppcTmp;
12380aeed3e9SJustin Hibbits }
12390aeed3e9SJustin Hibbits }
12400aeed3e9SJustin Hibbits }
12410aeed3e9SJustin Hibbits break;
12420aeed3e9SJustin Hibbits case (e_FM_PCD_DONE):
1243*852ba100SJustin Hibbits if (p_SchemeParams->kgNextEngineParams.doneAction == e_FM_PCD_DROP_FRAME)
1244*852ba100SJustin Hibbits tmpReg |= GET_NIA_BMI_AC_DISCARD_FRAME(p_FmPcd);
12450aeed3e9SJustin Hibbits else
1246*852ba100SJustin Hibbits tmpReg |= GET_NIA_BMI_AC_ENQ_FRAME(p_FmPcd);
12470aeed3e9SJustin Hibbits break;
12480aeed3e9SJustin Hibbits default:
12490aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Next engine not supported"));
12500aeed3e9SJustin Hibbits }
12510aeed3e9SJustin Hibbits p_SchemeRegs->kgse_mode = tmpReg;
12520aeed3e9SJustin Hibbits
1253*852ba100SJustin Hibbits p_SchemeRegs->kgse_mv = p_Scheme->matchVector;
12540aeed3e9SJustin Hibbits
1255*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
1256*852ba100SJustin Hibbits if (p_SchemeParams->overrideStorageProfile)
12570aeed3e9SJustin Hibbits {
1258*852ba100SJustin Hibbits p_SchemeRegs->kgse_om |= KG_SCH_OM_VSPE;
1259*852ba100SJustin Hibbits
1260*852ba100SJustin Hibbits if (p_SchemeParams->storageProfile.direct)
1261*852ba100SJustin Hibbits {
1262*852ba100SJustin Hibbits profileId = p_SchemeParams->storageProfile.profileSelect.directRelativeProfileId;
1263*852ba100SJustin Hibbits shift = 0;
1264*852ba100SJustin Hibbits numOfProfiles = 1;
1265*852ba100SJustin Hibbits }
1266*852ba100SJustin Hibbits else
1267*852ba100SJustin Hibbits {
1268*852ba100SJustin Hibbits profileId = p_SchemeParams->storageProfile.profileSelect.indirectProfile.fqidOffsetRelativeProfileIdBase;
1269*852ba100SJustin Hibbits shift = p_SchemeParams->storageProfile.profileSelect.indirectProfile.fqidOffsetShift;
1270*852ba100SJustin Hibbits numOfProfiles = p_SchemeParams->storageProfile.profileSelect.indirectProfile.numOfProfiles;
1271*852ba100SJustin Hibbits }
1272*852ba100SJustin Hibbits if (shift > MAX_SP_SHIFT)
1273*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fqidOffsetShift may not be larger than %d", MAX_SP_SHIFT));
1274*852ba100SJustin Hibbits
1275*852ba100SJustin Hibbits if (!numOfProfiles || !POWER_OF_2(numOfProfiles))
1276*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfProfiles must not be 0 and must be a power of 2"));
1277*852ba100SJustin Hibbits
1278*852ba100SJustin Hibbits tmpReg = (uint32_t)shift << KG_SCH_VSP_SHIFT;
1279*852ba100SJustin Hibbits tmpReg |= ((uint32_t)(numOfProfiles-1) << KG_SCH_VSP_MASK_SHIFT);
1280*852ba100SJustin Hibbits tmpReg |= (uint32_t)profileId;
1281*852ba100SJustin Hibbits
1282*852ba100SJustin Hibbits
1283*852ba100SJustin Hibbits p_SchemeRegs->kgse_vsp = tmpReg;
1284*852ba100SJustin Hibbits
1285*852ba100SJustin Hibbits p_Scheme->vspe = TRUE;
1286*852ba100SJustin Hibbits
1287*852ba100SJustin Hibbits }
1288*852ba100SJustin Hibbits else
1289*852ba100SJustin Hibbits p_SchemeRegs->kgse_vsp = KG_SCH_VSP_NO_KSP_EN;
1290*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
1291*852ba100SJustin Hibbits
1292*852ba100SJustin Hibbits if (p_SchemeParams->useHash)
1293*852ba100SJustin Hibbits {
1294*852ba100SJustin Hibbits p_KeyAndHash = &p_SchemeParams->keyExtractAndHashParams;
12950aeed3e9SJustin Hibbits
12960aeed3e9SJustin Hibbits if (p_KeyAndHash->numOfUsedExtracts >= FM_PCD_KG_MAX_NUM_OF_EXTRACTS_PER_KEY)
12970aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfUsedExtracts out of range"));
12980aeed3e9SJustin Hibbits
12990aeed3e9SJustin Hibbits /* configure kgse_dv0 */
13000aeed3e9SJustin Hibbits p_SchemeRegs->kgse_dv0 = p_KeyAndHash->privateDflt0;
13010aeed3e9SJustin Hibbits
13020aeed3e9SJustin Hibbits /* configure kgse_dv1 */
13030aeed3e9SJustin Hibbits p_SchemeRegs->kgse_dv1 = p_KeyAndHash->privateDflt1;
13040aeed3e9SJustin Hibbits
1305*852ba100SJustin Hibbits if (!p_SchemeParams->bypassFqidGeneration)
13060aeed3e9SJustin Hibbits {
13070aeed3e9SJustin Hibbits if (!p_KeyAndHash->hashDistributionNumOfFqids || !POWER_OF_2(p_KeyAndHash->hashDistributionNumOfFqids))
13080aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("hashDistributionNumOfFqids must not be 0 and must be a power of 2"));
1309*852ba100SJustin Hibbits if ((p_KeyAndHash->hashDistributionNumOfFqids-1) & p_SchemeParams->baseFqid)
13100aeed3e9SJustin Hibbits DBG(WARNING, ("baseFqid unaligned. Distribution may result in less than hashDistributionNumOfFqids queues."));
13110aeed3e9SJustin Hibbits }
13120aeed3e9SJustin Hibbits
13130aeed3e9SJustin Hibbits /* configure kgse_ekdv */
13140aeed3e9SJustin Hibbits tmpReg = 0;
13150aeed3e9SJustin Hibbits for ( i=0 ;i<p_KeyAndHash->numOfUsedDflts ; i++)
13160aeed3e9SJustin Hibbits {
13170aeed3e9SJustin Hibbits switch (p_KeyAndHash->dflts[i].type)
13180aeed3e9SJustin Hibbits {
13190aeed3e9SJustin Hibbits case (e_FM_PCD_KG_MAC_ADDR):
13200aeed3e9SJustin Hibbits tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_MAC_ADDR_SHIFT);
13210aeed3e9SJustin Hibbits break;
13220aeed3e9SJustin Hibbits case (e_FM_PCD_KG_TCI):
13230aeed3e9SJustin Hibbits tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_TCI_SHIFT);
13240aeed3e9SJustin Hibbits break;
13250aeed3e9SJustin Hibbits case (e_FM_PCD_KG_ENET_TYPE):
13260aeed3e9SJustin Hibbits tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_ENET_TYPE_SHIFT);
13270aeed3e9SJustin Hibbits break;
13280aeed3e9SJustin Hibbits case (e_FM_PCD_KG_PPP_SESSION_ID):
13290aeed3e9SJustin Hibbits tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_PPP_SESSION_ID_SHIFT);
13300aeed3e9SJustin Hibbits break;
13310aeed3e9SJustin Hibbits case (e_FM_PCD_KG_PPP_PROTOCOL_ID):
13320aeed3e9SJustin Hibbits tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_PPP_PROTOCOL_ID_SHIFT);
13330aeed3e9SJustin Hibbits break;
13340aeed3e9SJustin Hibbits case (e_FM_PCD_KG_MPLS_LABEL):
13350aeed3e9SJustin Hibbits tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_MPLS_LABEL_SHIFT);
13360aeed3e9SJustin Hibbits break;
13370aeed3e9SJustin Hibbits case (e_FM_PCD_KG_IP_ADDR):
13380aeed3e9SJustin Hibbits tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_IP_ADDR_SHIFT);
13390aeed3e9SJustin Hibbits break;
13400aeed3e9SJustin Hibbits case (e_FM_PCD_KG_PROTOCOL_TYPE):
13410aeed3e9SJustin Hibbits tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_PROTOCOL_TYPE_SHIFT);
13420aeed3e9SJustin Hibbits break;
13430aeed3e9SJustin Hibbits case (e_FM_PCD_KG_IP_TOS_TC):
13440aeed3e9SJustin Hibbits tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_IP_TOS_TC_SHIFT);
13450aeed3e9SJustin Hibbits break;
13460aeed3e9SJustin Hibbits case (e_FM_PCD_KG_IPV6_FLOW_LABEL):
13470aeed3e9SJustin Hibbits tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_L4_PORT_SHIFT);
13480aeed3e9SJustin Hibbits break;
13490aeed3e9SJustin Hibbits case (e_FM_PCD_KG_IPSEC_SPI):
13500aeed3e9SJustin Hibbits tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_IPSEC_SPI_SHIFT);
13510aeed3e9SJustin Hibbits break;
13520aeed3e9SJustin Hibbits case (e_FM_PCD_KG_L4_PORT):
13530aeed3e9SJustin Hibbits tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_L4_PORT_SHIFT);
13540aeed3e9SJustin Hibbits break;
13550aeed3e9SJustin Hibbits case (e_FM_PCD_KG_TCP_FLAG):
13560aeed3e9SJustin Hibbits tmpReg |= (p_KeyAndHash->dflts[i].dfltSelect << KG_SCH_DEF_TCP_FLAG_SHIFT);
13570aeed3e9SJustin Hibbits break;
13580aeed3e9SJustin Hibbits case (e_FM_PCD_KG_GENERIC_FROM_DATA):
13590aeed3e9SJustin Hibbits swDefaults[numOfSwDefaults].type = e_FM_PCD_KG_GENERIC_FROM_DATA;
13600aeed3e9SJustin Hibbits swDefaults[numOfSwDefaults].dfltSelect = p_KeyAndHash->dflts[i].dfltSelect;
13610aeed3e9SJustin Hibbits numOfSwDefaults ++;
13620aeed3e9SJustin Hibbits break;
13630aeed3e9SJustin Hibbits case (e_FM_PCD_KG_GENERIC_FROM_DATA_NO_V):
13640aeed3e9SJustin Hibbits swDefaults[numOfSwDefaults].type = e_FM_PCD_KG_GENERIC_FROM_DATA_NO_V;
13650aeed3e9SJustin Hibbits swDefaults[numOfSwDefaults].dfltSelect = p_KeyAndHash->dflts[i].dfltSelect;
13660aeed3e9SJustin Hibbits numOfSwDefaults ++;
13670aeed3e9SJustin Hibbits break;
13680aeed3e9SJustin Hibbits case (e_FM_PCD_KG_GENERIC_NOT_FROM_DATA):
13690aeed3e9SJustin Hibbits swDefaults[numOfSwDefaults].type = e_FM_PCD_KG_GENERIC_NOT_FROM_DATA;
13700aeed3e9SJustin Hibbits swDefaults[numOfSwDefaults].dfltSelect = p_KeyAndHash->dflts[i].dfltSelect;
13710aeed3e9SJustin Hibbits numOfSwDefaults ++;
13720aeed3e9SJustin Hibbits break;
13730aeed3e9SJustin Hibbits default:
13740aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
13750aeed3e9SJustin Hibbits }
13760aeed3e9SJustin Hibbits }
13770aeed3e9SJustin Hibbits p_SchemeRegs->kgse_ekdv = tmpReg;
13780aeed3e9SJustin Hibbits
13790aeed3e9SJustin Hibbits p_LocalExtractsArray = (t_FmPcdKgSchemesExtracts *)XX_Malloc(sizeof(t_FmPcdKgSchemesExtracts));
13800aeed3e9SJustin Hibbits if (!p_LocalExtractsArray)
13810aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("No memory"));
13820aeed3e9SJustin Hibbits
13830aeed3e9SJustin Hibbits /* configure kgse_ekfc and kgse_gec */
13840aeed3e9SJustin Hibbits knownTmp = 0;
13850aeed3e9SJustin Hibbits for ( i=0 ;i<p_KeyAndHash->numOfUsedExtracts ; i++)
13860aeed3e9SJustin Hibbits {
13870aeed3e9SJustin Hibbits p_Extract = &p_KeyAndHash->extractArray[i];
13880aeed3e9SJustin Hibbits switch (p_Extract->type)
13890aeed3e9SJustin Hibbits {
13900aeed3e9SJustin Hibbits case (e_FM_PCD_KG_EXTRACT_PORT_PRIVATE_INFO):
13910aeed3e9SJustin Hibbits knownTmp |= KG_SCH_KN_PORT_ID;
13920aeed3e9SJustin Hibbits /* save in driver structure */
13930aeed3e9SJustin Hibbits p_LocalExtractsArray->extractsArray[i].id = GetKnownFieldId(KG_SCH_KN_PORT_ID);
13940aeed3e9SJustin Hibbits p_LocalExtractsArray->extractsArray[i].known = TRUE;
13950aeed3e9SJustin Hibbits break;
13960aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_BY_HDR):
13970aeed3e9SJustin Hibbits switch (p_Extract->extractByHdr.hdr)
13980aeed3e9SJustin Hibbits {
1399*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11) || ((DPAA_VERSION == 10) && defined(FM_CAPWAP_SUPPORT))
1400*852ba100SJustin Hibbits case (HEADER_TYPE_UDP_LITE):
1401*852ba100SJustin Hibbits p_Extract->extractByHdr.hdr = HEADER_TYPE_UDP;
1402*852ba100SJustin Hibbits break;
1403*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) || ((DPAA_VERSION == 10) && defined(FM_CAPWAP_SUPPORT)) */
14040aeed3e9SJustin Hibbits case (HEADER_TYPE_UDP_ENCAP_ESP):
14050aeed3e9SJustin Hibbits switch (p_Extract->extractByHdr.type)
14060aeed3e9SJustin Hibbits {
14070aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_FROM_HDR):
14080aeed3e9SJustin Hibbits /* case where extraction from ESP only */
14090aeed3e9SJustin Hibbits if (p_Extract->extractByHdr.extractByHdrType.fromHdr.offset >= UDP_HEADER_SIZE)
14100aeed3e9SJustin Hibbits {
1411*852ba100SJustin Hibbits p_Extract->extractByHdr.hdr = FmPcdGetAliasHdr(p_FmPcd, p_Scheme->netEnvId, HEADER_TYPE_UDP_ENCAP_ESP);
14120aeed3e9SJustin Hibbits p_Extract->extractByHdr.extractByHdrType.fromHdr.offset -= UDP_HEADER_SIZE;
14130aeed3e9SJustin Hibbits p_Extract->extractByHdr.ignoreProtocolValidation = TRUE;
14140aeed3e9SJustin Hibbits }
14150aeed3e9SJustin Hibbits else
14160aeed3e9SJustin Hibbits {
14170aeed3e9SJustin Hibbits p_Extract->extractByHdr.hdr = HEADER_TYPE_UDP;
14180aeed3e9SJustin Hibbits p_Extract->extractByHdr.ignoreProtocolValidation = FALSE;
14190aeed3e9SJustin Hibbits }
14200aeed3e9SJustin Hibbits break;
14210aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_FROM_FIELD):
14220aeed3e9SJustin Hibbits switch (p_Extract->extractByHdr.extractByHdrType.fromField.field.udpEncapEsp)
14230aeed3e9SJustin Hibbits {
14240aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_ENCAP_ESP_PORT_SRC):
14250aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_ENCAP_ESP_PORT_DST):
14260aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_ENCAP_ESP_LEN):
14270aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_ENCAP_ESP_CKSUM):
14280aeed3e9SJustin Hibbits p_Extract->extractByHdr.hdr = HEADER_TYPE_UDP;
14290aeed3e9SJustin Hibbits break;
14300aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_ENCAP_ESP_SPI):
14310aeed3e9SJustin Hibbits p_Extract->extractByHdr.type = e_FM_PCD_EXTRACT_FROM_HDR;
1432*852ba100SJustin Hibbits p_Extract->extractByHdr.hdr = FmPcdGetAliasHdr(p_FmPcd, p_Scheme->netEnvId, HEADER_TYPE_UDP_ENCAP_ESP);
14330aeed3e9SJustin Hibbits /*p_Extract->extractByHdr.extractByHdrType.fromField.offset += ESP_SPI_OFFSET;*/
14340aeed3e9SJustin Hibbits p_Extract->extractByHdr.ignoreProtocolValidation = TRUE;
14350aeed3e9SJustin Hibbits break;
14360aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_ENCAP_ESP_SEQUENCE_NUM):
14370aeed3e9SJustin Hibbits p_Extract->extractByHdr.type = e_FM_PCD_EXTRACT_FROM_HDR;
1438*852ba100SJustin Hibbits p_Extract->extractByHdr.hdr = FmPcdGetAliasHdr(p_FmPcd, p_Scheme->netEnvId, HEADER_TYPE_UDP_ENCAP_ESP);
14390aeed3e9SJustin Hibbits p_Extract->extractByHdr.extractByHdrType.fromField.offset += ESP_SEQ_NUM_OFFSET;
14400aeed3e9SJustin Hibbits p_Extract->extractByHdr.ignoreProtocolValidation = TRUE;
14410aeed3e9SJustin Hibbits break;
14420aeed3e9SJustin Hibbits }
14430aeed3e9SJustin Hibbits break;
14440aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_FULL_FIELD):
14450aeed3e9SJustin Hibbits switch (p_Extract->extractByHdr.extractByHdrType.fullField.udpEncapEsp)
14460aeed3e9SJustin Hibbits {
14470aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_ENCAP_ESP_PORT_SRC):
14480aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_ENCAP_ESP_PORT_DST):
14490aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_ENCAP_ESP_LEN):
14500aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_ENCAP_ESP_CKSUM):
14510aeed3e9SJustin Hibbits p_Extract->extractByHdr.hdr = HEADER_TYPE_UDP;
14520aeed3e9SJustin Hibbits break;
14530aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_ENCAP_ESP_SPI):
14540aeed3e9SJustin Hibbits p_Extract->extractByHdr.type = e_FM_PCD_EXTRACT_FROM_HDR;
1455*852ba100SJustin Hibbits p_Extract->extractByHdr.hdr = FmPcdGetAliasHdr(p_FmPcd, p_Scheme->netEnvId, HEADER_TYPE_UDP_ENCAP_ESP);
14560aeed3e9SJustin Hibbits p_Extract->extractByHdr.extractByHdrType.fromHdr.size = ESP_SPI_SIZE;
14570aeed3e9SJustin Hibbits p_Extract->extractByHdr.extractByHdrType.fromHdr.offset = ESP_SPI_OFFSET;
14580aeed3e9SJustin Hibbits p_Extract->extractByHdr.ignoreProtocolValidation = TRUE;
14590aeed3e9SJustin Hibbits break;
14600aeed3e9SJustin Hibbits case (NET_HEADER_FIELD_UDP_ENCAP_ESP_SEQUENCE_NUM):
14610aeed3e9SJustin Hibbits p_Extract->extractByHdr.type = e_FM_PCD_EXTRACT_FROM_HDR;
1462*852ba100SJustin Hibbits p_Extract->extractByHdr.hdr = FmPcdGetAliasHdr(p_FmPcd, p_Scheme->netEnvId, HEADER_TYPE_UDP_ENCAP_ESP);
14630aeed3e9SJustin Hibbits p_Extract->extractByHdr.extractByHdrType.fromHdr.size = ESP_SEQ_NUM_SIZE;
14640aeed3e9SJustin Hibbits p_Extract->extractByHdr.extractByHdrType.fromHdr.offset = ESP_SEQ_NUM_OFFSET;
14650aeed3e9SJustin Hibbits p_Extract->extractByHdr.ignoreProtocolValidation = TRUE;
14660aeed3e9SJustin Hibbits break;
14670aeed3e9SJustin Hibbits }
14680aeed3e9SJustin Hibbits break;
14690aeed3e9SJustin Hibbits }
14700aeed3e9SJustin Hibbits break;
14710aeed3e9SJustin Hibbits default:
14720aeed3e9SJustin Hibbits break;
14730aeed3e9SJustin Hibbits }
14740aeed3e9SJustin Hibbits switch (p_Extract->extractByHdr.type)
14750aeed3e9SJustin Hibbits {
14760aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_FROM_HDR):
14770aeed3e9SJustin Hibbits generic = TRUE;
14780aeed3e9SJustin Hibbits /* get the header code for the generic extract */
14790aeed3e9SJustin Hibbits code = GetGenHdrCode(p_Extract->extractByHdr.hdr, p_Extract->extractByHdr.hdrIndex, p_Extract->extractByHdr.ignoreProtocolValidation);
14800aeed3e9SJustin Hibbits /* set generic register fields */
14810aeed3e9SJustin Hibbits offset = p_Extract->extractByHdr.extractByHdrType.fromHdr.offset;
14820aeed3e9SJustin Hibbits size = p_Extract->extractByHdr.extractByHdrType.fromHdr.size;
14830aeed3e9SJustin Hibbits break;
14840aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_FROM_FIELD):
14850aeed3e9SJustin Hibbits generic = TRUE;
14860aeed3e9SJustin Hibbits /* get the field code for the generic extract */
14870aeed3e9SJustin Hibbits code = GetGenFieldCode(p_Extract->extractByHdr.hdr,
14880aeed3e9SJustin Hibbits p_Extract->extractByHdr.extractByHdrType.fromField.field, p_Extract->extractByHdr.ignoreProtocolValidation,p_Extract->extractByHdr.hdrIndex);
14890aeed3e9SJustin Hibbits offset = p_Extract->extractByHdr.extractByHdrType.fromField.offset;
14900aeed3e9SJustin Hibbits size = p_Extract->extractByHdr.extractByHdrType.fromField.size;
14910aeed3e9SJustin Hibbits break;
14920aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_FULL_FIELD):
14930aeed3e9SJustin Hibbits if (!p_Extract->extractByHdr.ignoreProtocolValidation)
14940aeed3e9SJustin Hibbits {
14950aeed3e9SJustin Hibbits /* if we have a known field for it - use it, otherwise use generic */
1496*852ba100SJustin Hibbits bitMask = GetKnownProtMask(p_FmPcd, p_Extract->extractByHdr.hdr, p_Extract->extractByHdr.hdrIndex,
14970aeed3e9SJustin Hibbits p_Extract->extractByHdr.extractByHdrType.fullField);
14980aeed3e9SJustin Hibbits if (bitMask)
14990aeed3e9SJustin Hibbits {
15000aeed3e9SJustin Hibbits knownTmp |= bitMask;
15010aeed3e9SJustin Hibbits /* save in driver structure */
15020aeed3e9SJustin Hibbits p_LocalExtractsArray->extractsArray[i].id = GetKnownFieldId(bitMask);
15030aeed3e9SJustin Hibbits p_LocalExtractsArray->extractsArray[i].known = TRUE;
15040aeed3e9SJustin Hibbits }
15050aeed3e9SJustin Hibbits else
15060aeed3e9SJustin Hibbits generic = TRUE;
15070aeed3e9SJustin Hibbits }
15080aeed3e9SJustin Hibbits else
15090aeed3e9SJustin Hibbits generic = TRUE;
15100aeed3e9SJustin Hibbits if (generic)
15110aeed3e9SJustin Hibbits {
15120aeed3e9SJustin Hibbits /* tmp - till we cover more headers under generic */
1513*852ba100SJustin Hibbits XX_Free(p_LocalExtractsArray);
15140aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Full header selection not supported"));
15150aeed3e9SJustin Hibbits }
15160aeed3e9SJustin Hibbits break;
15170aeed3e9SJustin Hibbits default:
1518*852ba100SJustin Hibbits XX_Free(p_LocalExtractsArray);
15190aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
15200aeed3e9SJustin Hibbits }
15210aeed3e9SJustin Hibbits break;
15220aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_NON_HDR):
15230aeed3e9SJustin Hibbits /* use generic */
15240aeed3e9SJustin Hibbits generic = TRUE;
15250aeed3e9SJustin Hibbits offset = 0;
15260aeed3e9SJustin Hibbits /* get the field code for the generic extract */
15270aeed3e9SJustin Hibbits code = GetGenCode(p_Extract->extractNonHdr.src, &offset);
15280aeed3e9SJustin Hibbits offset += p_Extract->extractNonHdr.offset;
15290aeed3e9SJustin Hibbits size = p_Extract->extractNonHdr.size;
15300aeed3e9SJustin Hibbits break;
15310aeed3e9SJustin Hibbits default:
15320aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
15330aeed3e9SJustin Hibbits }
15340aeed3e9SJustin Hibbits
15350aeed3e9SJustin Hibbits if (generic)
15360aeed3e9SJustin Hibbits {
15370aeed3e9SJustin Hibbits /* set generic register fields */
1538*852ba100SJustin Hibbits if (currGenId >= FM_KG_NUM_OF_GENERIC_REGS)
1539*852ba100SJustin Hibbits {
1540*852ba100SJustin Hibbits XX_Free(p_LocalExtractsArray);
15410aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_FULL, ("Generic registers are fully used"));
1542*852ba100SJustin Hibbits }
15430aeed3e9SJustin Hibbits if (!code)
1544*852ba100SJustin Hibbits {
1545*852ba100SJustin Hibbits XX_Free(p_LocalExtractsArray);
15460aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, NO_MSG);
1547*852ba100SJustin Hibbits }
15480aeed3e9SJustin Hibbits
15490aeed3e9SJustin Hibbits genTmp = KG_SCH_GEN_VALID;
15500aeed3e9SJustin Hibbits genTmp |= (uint32_t)(code << KG_SCH_GEN_HT_SHIFT);
15510aeed3e9SJustin Hibbits genTmp |= offset;
15520aeed3e9SJustin Hibbits if ((size > MAX_KG_SCH_SIZE) || (size < 1))
1553*852ba100SJustin Hibbits {
1554*852ba100SJustin Hibbits XX_Free(p_LocalExtractsArray);
15550aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Illegal extraction (size out of range)"));
1556*852ba100SJustin Hibbits }
15570aeed3e9SJustin Hibbits genTmp |= (uint32_t)((size - 1) << KG_SCH_GEN_SIZE_SHIFT);
15580aeed3e9SJustin Hibbits swDefault = GetGenericSwDefault(swDefaults, numOfSwDefaults, code);
15590aeed3e9SJustin Hibbits if (swDefault == e_FM_PCD_KG_DFLT_ILLEGAL)
15600aeed3e9SJustin Hibbits DBG(WARNING, ("No sw default configured"));
1561*852ba100SJustin Hibbits else
15620aeed3e9SJustin Hibbits genTmp |= swDefault << KG_SCH_GEN_DEF_SHIFT;
1563*852ba100SJustin Hibbits
15640aeed3e9SJustin Hibbits genTmp |= KG_SCH_GEN_MASK;
15650aeed3e9SJustin Hibbits p_SchemeRegs->kgse_gec[currGenId] = genTmp;
15660aeed3e9SJustin Hibbits /* save in driver structure */
15670aeed3e9SJustin Hibbits p_LocalExtractsArray->extractsArray[i].id = currGenId++;
15680aeed3e9SJustin Hibbits p_LocalExtractsArray->extractsArray[i].known = FALSE;
15690aeed3e9SJustin Hibbits generic = FALSE;
15700aeed3e9SJustin Hibbits }
15710aeed3e9SJustin Hibbits }
15720aeed3e9SJustin Hibbits p_SchemeRegs->kgse_ekfc = knownTmp;
15730aeed3e9SJustin Hibbits
15740aeed3e9SJustin Hibbits selectTmp = 0;
15750aeed3e9SJustin Hibbits maskTmp = 0xFFFFFFFF;
15760aeed3e9SJustin Hibbits /* configure kgse_bmch, kgse_bmcl and kgse_fqb */
15770aeed3e9SJustin Hibbits
1578*852ba100SJustin Hibbits if (p_KeyAndHash->numOfUsedMasks > FM_PCD_KG_NUM_OF_EXTRACT_MASKS)
1579*852ba100SJustin Hibbits {
1580*852ba100SJustin Hibbits XX_Free(p_LocalExtractsArray);
15810aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Only %d masks supported", FM_PCD_KG_NUM_OF_EXTRACT_MASKS));
1582*852ba100SJustin Hibbits }
15830aeed3e9SJustin Hibbits for ( i=0 ;i<p_KeyAndHash->numOfUsedMasks ; i++)
15840aeed3e9SJustin Hibbits {
15850aeed3e9SJustin Hibbits /* Get the relative id of the extract (for known 0-0x1f, for generic 0-7) */
15860aeed3e9SJustin Hibbits id = p_LocalExtractsArray->extractsArray[p_KeyAndHash->masks[i].extractArrayIndex].id;
15870aeed3e9SJustin Hibbits /* Get the shift of the select field (depending on i) */
15880aeed3e9SJustin Hibbits GET_MASK_SEL_SHIFT(shift,i);
15890aeed3e9SJustin Hibbits if (p_LocalExtractsArray->extractsArray[p_KeyAndHash->masks[i].extractArrayIndex].known)
15900aeed3e9SJustin Hibbits selectTmp |= id << shift;
15910aeed3e9SJustin Hibbits else
15920aeed3e9SJustin Hibbits selectTmp |= (id + MASK_FOR_GENERIC_BASE_ID) << shift;
15930aeed3e9SJustin Hibbits
15940aeed3e9SJustin Hibbits /* Get the shift of the offset field (depending on i) - may
15950aeed3e9SJustin Hibbits be in kgse_bmch or in kgse_fqb (depending on i) */
15960aeed3e9SJustin Hibbits GET_MASK_OFFSET_SHIFT(shift,i);
15970aeed3e9SJustin Hibbits if (i<=1)
15980aeed3e9SJustin Hibbits selectTmp |= p_KeyAndHash->masks[i].offset << shift;
15990aeed3e9SJustin Hibbits else
16000aeed3e9SJustin Hibbits fqbTmp |= p_KeyAndHash->masks[i].offset << shift;
16010aeed3e9SJustin Hibbits
16020aeed3e9SJustin Hibbits /* Get the shift of the mask field (depending on i) */
16030aeed3e9SJustin Hibbits GET_MASK_SHIFT(shift,i);
16040aeed3e9SJustin Hibbits /* pass all bits */
16050aeed3e9SJustin Hibbits maskTmp |= KG_SCH_BITMASK_MASK << shift;
16060aeed3e9SJustin Hibbits /* clear bits that need masking */
16070aeed3e9SJustin Hibbits maskTmp &= ~(0xFF << shift) ;
16080aeed3e9SJustin Hibbits /* set mask bits */
16090aeed3e9SJustin Hibbits maskTmp |= (p_KeyAndHash->masks[i].mask << shift) ;
16100aeed3e9SJustin Hibbits }
16110aeed3e9SJustin Hibbits p_SchemeRegs->kgse_bmch = selectTmp;
16120aeed3e9SJustin Hibbits p_SchemeRegs->kgse_bmcl = maskTmp;
16130aeed3e9SJustin Hibbits /* kgse_fqb will be written t the end of the routine */
16140aeed3e9SJustin Hibbits
16150aeed3e9SJustin Hibbits /* configure kgse_hc */
16160aeed3e9SJustin Hibbits if (p_KeyAndHash->hashShift > MAX_HASH_SHIFT)
1617*852ba100SJustin Hibbits {
1618*852ba100SJustin Hibbits XX_Free(p_LocalExtractsArray);
16190aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("hashShift must not be larger than %d", MAX_HASH_SHIFT));
1620*852ba100SJustin Hibbits }
16210aeed3e9SJustin Hibbits if (p_KeyAndHash->hashDistributionFqidsShift > MAX_DIST_FQID_SHIFT)
1622*852ba100SJustin Hibbits {
1623*852ba100SJustin Hibbits XX_Free(p_LocalExtractsArray);
16240aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("hashDistributionFqidsShift must not be larger than %d", MAX_DIST_FQID_SHIFT));
1625*852ba100SJustin Hibbits }
16260aeed3e9SJustin Hibbits
16270aeed3e9SJustin Hibbits tmpReg = 0;
16280aeed3e9SJustin Hibbits
16290aeed3e9SJustin Hibbits tmpReg |= ((p_KeyAndHash->hashDistributionNumOfFqids - 1) << p_KeyAndHash->hashDistributionFqidsShift);
16300aeed3e9SJustin Hibbits tmpReg |= p_KeyAndHash->hashShift << KG_SCH_HASH_CONFIG_SHIFT_SHIFT;
16310aeed3e9SJustin Hibbits
16320aeed3e9SJustin Hibbits if (p_KeyAndHash->symmetricHash)
16330aeed3e9SJustin Hibbits {
16340aeed3e9SJustin Hibbits if ((!!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_MACSRC) != !!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_MACDST)) ||
16350aeed3e9SJustin Hibbits (!!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_IPSRC1) != !!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_IPDST1)) ||
16360aeed3e9SJustin Hibbits (!!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_IPSRC2) != !!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_IPDST2)) ||
16370aeed3e9SJustin Hibbits (!!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_L4PSRC) != !!(p_SchemeRegs->kgse_ekfc & KG_SCH_KN_L4PDST)))
1638*852ba100SJustin Hibbits {
1639*852ba100SJustin Hibbits XX_Free(p_LocalExtractsArray);
16400aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("symmetricHash set but src/dest extractions missing"));
1641*852ba100SJustin Hibbits }
16420aeed3e9SJustin Hibbits tmpReg |= KG_SCH_HASH_CONFIG_SYM;
16430aeed3e9SJustin Hibbits }
16440aeed3e9SJustin Hibbits p_SchemeRegs->kgse_hc = tmpReg;
16450aeed3e9SJustin Hibbits
16460aeed3e9SJustin Hibbits /* build the return array describing the order of the extractions */
16470aeed3e9SJustin Hibbits
16480aeed3e9SJustin Hibbits /* the last currGenId places of the array
16490aeed3e9SJustin Hibbits are for generic extracts that are always last.
16500aeed3e9SJustin Hibbits We now sort for the calculation of the order of the known
16510aeed3e9SJustin Hibbits extractions we sort the known extracts between orderedArray[0] and
16520aeed3e9SJustin Hibbits orderedArray[p_KeyAndHash->numOfUsedExtracts - currGenId - 1].
16530aeed3e9SJustin Hibbits for the calculation of the order of the generic extractions we use:
16540aeed3e9SJustin Hibbits num_of_generic - currGenId
16550aeed3e9SJustin Hibbits num_of_known - p_KeyAndHash->numOfUsedExtracts - currGenId
16560aeed3e9SJustin Hibbits first_generic_index = num_of_known */
16570aeed3e9SJustin Hibbits curr = 0;
16580aeed3e9SJustin Hibbits for (i=0;i<p_KeyAndHash->numOfUsedExtracts ; i++)
16590aeed3e9SJustin Hibbits {
16600aeed3e9SJustin Hibbits if (p_LocalExtractsArray->extractsArray[i].known)
16610aeed3e9SJustin Hibbits {
16620aeed3e9SJustin Hibbits ASSERT_COND(curr<(p_KeyAndHash->numOfUsedExtracts - currGenId));
16630aeed3e9SJustin Hibbits j = curr;
16640aeed3e9SJustin Hibbits /* id is the extract id (port id = 0, mac src = 1 etc.). the value in the array is the original
16650aeed3e9SJustin Hibbits index in the user's extractions array */
16660aeed3e9SJustin Hibbits /* we compare the id of the current extract with the id of the extract in the orderedArray[j-1]
16670aeed3e9SJustin Hibbits location */
16680aeed3e9SJustin Hibbits while ((j > 0) && (p_LocalExtractsArray->extractsArray[i].id <
1669*852ba100SJustin Hibbits p_LocalExtractsArray->extractsArray[p_Scheme->orderedArray[j-1]].id))
16700aeed3e9SJustin Hibbits {
1671*852ba100SJustin Hibbits p_Scheme->orderedArray[j] =
1672*852ba100SJustin Hibbits p_Scheme->orderedArray[j-1];
16730aeed3e9SJustin Hibbits j--;
16740aeed3e9SJustin Hibbits }
1675*852ba100SJustin Hibbits p_Scheme->orderedArray[j] = (uint8_t)i;
16760aeed3e9SJustin Hibbits curr++;
16770aeed3e9SJustin Hibbits }
16780aeed3e9SJustin Hibbits else
16790aeed3e9SJustin Hibbits {
16800aeed3e9SJustin Hibbits /* index is first_generic_index + generic index (id) */
16810aeed3e9SJustin Hibbits idx = (uint8_t)(p_KeyAndHash->numOfUsedExtracts - currGenId + p_LocalExtractsArray->extractsArray[i].id);
16820aeed3e9SJustin Hibbits ASSERT_COND(idx < FM_PCD_KG_MAX_NUM_OF_EXTRACTS_PER_KEY);
1683*852ba100SJustin Hibbits p_Scheme->orderedArray[idx]= (uint8_t)i;
16840aeed3e9SJustin Hibbits }
16850aeed3e9SJustin Hibbits }
16860aeed3e9SJustin Hibbits XX_Free(p_LocalExtractsArray);
16870aeed3e9SJustin Hibbits }
16880aeed3e9SJustin Hibbits else
16890aeed3e9SJustin Hibbits {
16900aeed3e9SJustin Hibbits /* clear all unused registers: */
16910aeed3e9SJustin Hibbits p_SchemeRegs->kgse_ekfc = 0;
16920aeed3e9SJustin Hibbits p_SchemeRegs->kgse_ekdv = 0;
16930aeed3e9SJustin Hibbits p_SchemeRegs->kgse_bmch = 0;
16940aeed3e9SJustin Hibbits p_SchemeRegs->kgse_bmcl = 0;
16950aeed3e9SJustin Hibbits p_SchemeRegs->kgse_hc = 0;
16960aeed3e9SJustin Hibbits p_SchemeRegs->kgse_dv0 = 0;
16970aeed3e9SJustin Hibbits p_SchemeRegs->kgse_dv1 = 0;
16980aeed3e9SJustin Hibbits }
16990aeed3e9SJustin Hibbits
1700*852ba100SJustin Hibbits if (p_SchemeParams->bypassFqidGeneration)
17010aeed3e9SJustin Hibbits p_SchemeRegs->kgse_hc |= KG_SCH_HASH_CONFIG_NO_FQID;
17020aeed3e9SJustin Hibbits
17030aeed3e9SJustin Hibbits /* configure kgse_spc */
1704*852ba100SJustin Hibbits if ( p_SchemeParams->schemeCounter.update)
1705*852ba100SJustin Hibbits p_SchemeRegs->kgse_spc = p_SchemeParams->schemeCounter.value;
17060aeed3e9SJustin Hibbits
17070aeed3e9SJustin Hibbits
17080aeed3e9SJustin Hibbits /* check that are enough generic registers */
1709*852ba100SJustin Hibbits if (p_SchemeParams->numOfUsedExtractedOrs + currGenId > FM_KG_NUM_OF_GENERIC_REGS)
17100aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_FULL, ("Generic registers are fully used"));
17110aeed3e9SJustin Hibbits
17120aeed3e9SJustin Hibbits /* extracted OR mask on Qid */
1713*852ba100SJustin Hibbits for ( i=0 ;i<p_SchemeParams->numOfUsedExtractedOrs ; i++)
17140aeed3e9SJustin Hibbits {
17150aeed3e9SJustin Hibbits
1716*852ba100SJustin Hibbits p_Scheme->extractedOrs = TRUE;
17170aeed3e9SJustin Hibbits /* configure kgse_gec[i] */
1718*852ba100SJustin Hibbits p_ExtractOr = &p_SchemeParams->extractedOrs[i];
17190aeed3e9SJustin Hibbits switch (p_ExtractOr->type)
17200aeed3e9SJustin Hibbits {
17210aeed3e9SJustin Hibbits case (e_FM_PCD_KG_EXTRACT_PORT_PRIVATE_INFO):
17220aeed3e9SJustin Hibbits code = KG_SCH_GEN_PARSE_RESULT_N_FQID;
17230aeed3e9SJustin Hibbits offset = 0;
17240aeed3e9SJustin Hibbits break;
17250aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_BY_HDR):
17260aeed3e9SJustin Hibbits /* get the header code for the generic extract */
17270aeed3e9SJustin Hibbits code = GetGenHdrCode(p_ExtractOr->extractByHdr.hdr, p_ExtractOr->extractByHdr.hdrIndex, p_ExtractOr->extractByHdr.ignoreProtocolValidation);
17280aeed3e9SJustin Hibbits /* set generic register fields */
17290aeed3e9SJustin Hibbits offset = p_ExtractOr->extractionOffset;
17300aeed3e9SJustin Hibbits break;
17310aeed3e9SJustin Hibbits case (e_FM_PCD_EXTRACT_NON_HDR):
17320aeed3e9SJustin Hibbits /* get the field code for the generic extract */
17330aeed3e9SJustin Hibbits offset = 0;
17340aeed3e9SJustin Hibbits code = GetGenCode(p_ExtractOr->src, &offset);
17350aeed3e9SJustin Hibbits offset += p_ExtractOr->extractionOffset;
17360aeed3e9SJustin Hibbits break;
17370aeed3e9SJustin Hibbits default:
17380aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG);
17390aeed3e9SJustin Hibbits }
17400aeed3e9SJustin Hibbits
17410aeed3e9SJustin Hibbits /* set generic register fields */
17420aeed3e9SJustin Hibbits if (!code)
17430aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, NO_MSG);
17440aeed3e9SJustin Hibbits genTmp = KG_SCH_GEN_EXTRACT_TYPE | KG_SCH_GEN_VALID;
17450aeed3e9SJustin Hibbits genTmp |= (uint32_t)(code << KG_SCH_GEN_HT_SHIFT);
17460aeed3e9SJustin Hibbits genTmp |= offset;
17470aeed3e9SJustin Hibbits if (!!p_ExtractOr->bitOffsetInFqid == !!p_ExtractOr->bitOffsetInPlcrProfile)
17480aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, (" extracted byte must effect either FQID or Policer profile"));
17490aeed3e9SJustin Hibbits
17500aeed3e9SJustin Hibbits /************************************************************************************
17510aeed3e9SJustin Hibbits bitOffsetInFqid and bitOffsetInPolicerProfile are translated to rotate parameter
17520aeed3e9SJustin Hibbits in the following way:
17530aeed3e9SJustin Hibbits
17540aeed3e9SJustin Hibbits Driver API and implementation:
17550aeed3e9SJustin Hibbits ==============================
17560aeed3e9SJustin Hibbits FQID: extracted OR byte may be shifted right 1-31 bits to effect parts of the FQID.
17570aeed3e9SJustin Hibbits if shifted less than 8 bits, or more than 24 bits a mask is set on the bits that
17580aeed3e9SJustin Hibbits are not overlapping FQID.
17590aeed3e9SJustin Hibbits ------------------------
17600aeed3e9SJustin Hibbits | FQID (24) |
17610aeed3e9SJustin Hibbits ------------------------
17620aeed3e9SJustin Hibbits --------
17630aeed3e9SJustin Hibbits | | extracted OR byte
17640aeed3e9SJustin Hibbits --------
17650aeed3e9SJustin Hibbits
17660aeed3e9SJustin Hibbits Policer Profile: extracted OR byte may be shifted right 1-15 bits to effect parts of the
17670aeed3e9SJustin Hibbits PP id. Unless shifted exactly 8 bits to overlap the PP id, a mask is set on the bits that
17680aeed3e9SJustin Hibbits are not overlapping PP id.
17690aeed3e9SJustin Hibbits
17700aeed3e9SJustin Hibbits --------
17710aeed3e9SJustin Hibbits | PP (8) |
17720aeed3e9SJustin Hibbits --------
17730aeed3e9SJustin Hibbits --------
17740aeed3e9SJustin Hibbits | | extracted OR byte
17750aeed3e9SJustin Hibbits --------
17760aeed3e9SJustin Hibbits
17770aeed3e9SJustin Hibbits HW implementation
17780aeed3e9SJustin Hibbits =================
17790aeed3e9SJustin Hibbits FQID and PP construct a 32 bit word in the way describe below. Extracted byte is located
17800aeed3e9SJustin Hibbits as the highest byte of that word and may be rotated to effect any part os the FQID or
17810aeed3e9SJustin Hibbits the PP.
17820aeed3e9SJustin Hibbits ------------------------ --------
17830aeed3e9SJustin Hibbits | FQID (24) || PP (8) |
17840aeed3e9SJustin Hibbits ------------------------ --------
17850aeed3e9SJustin Hibbits --------
17860aeed3e9SJustin Hibbits | | extracted OR byte
17870aeed3e9SJustin Hibbits --------
17880aeed3e9SJustin Hibbits
17890aeed3e9SJustin Hibbits ************************************************************************************/
17900aeed3e9SJustin Hibbits
17910aeed3e9SJustin Hibbits if (p_ExtractOr->bitOffsetInFqid)
17920aeed3e9SJustin Hibbits {
17930aeed3e9SJustin Hibbits if (p_ExtractOr->bitOffsetInFqid > MAX_KG_SCH_FQID_BIT_OFFSET )
17940aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal extraction (bitOffsetInFqid out of range)"));
17950aeed3e9SJustin Hibbits if (p_ExtractOr->bitOffsetInFqid<8)
17960aeed3e9SJustin Hibbits genTmp |= (uint32_t)((p_ExtractOr->bitOffsetInFqid+24) << KG_SCH_GEN_SIZE_SHIFT);
17970aeed3e9SJustin Hibbits else
17980aeed3e9SJustin Hibbits genTmp |= (uint32_t)((p_ExtractOr->bitOffsetInFqid-8) << KG_SCH_GEN_SIZE_SHIFT);
17990aeed3e9SJustin Hibbits p_ExtractOr->mask &= GetExtractedOrMask(p_ExtractOr->bitOffsetInFqid, TRUE);
18000aeed3e9SJustin Hibbits }
18010aeed3e9SJustin Hibbits else /* effect policer profile */
18020aeed3e9SJustin Hibbits {
18030aeed3e9SJustin Hibbits if (p_ExtractOr->bitOffsetInPlcrProfile > MAX_KG_SCH_PP_BIT_OFFSET )
18040aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal extraction (bitOffsetInPlcrProfile out of range)"));
1805*852ba100SJustin Hibbits p_Scheme->bitOffsetInPlcrProfile = p_ExtractOr->bitOffsetInPlcrProfile;
18060aeed3e9SJustin Hibbits genTmp |= (uint32_t)((p_ExtractOr->bitOffsetInPlcrProfile+16) << KG_SCH_GEN_SIZE_SHIFT);
18070aeed3e9SJustin Hibbits p_ExtractOr->mask &= GetExtractedOrMask(p_ExtractOr->bitOffsetInPlcrProfile, FALSE);
18080aeed3e9SJustin Hibbits }
18090aeed3e9SJustin Hibbits
18100aeed3e9SJustin Hibbits genTmp |= (uint32_t)(p_ExtractOr->extractionOffset << KG_SCH_GEN_DEF_SHIFT);
18110aeed3e9SJustin Hibbits /* clear bits that need masking */
18120aeed3e9SJustin Hibbits genTmp &= ~KG_SCH_GEN_MASK ;
18130aeed3e9SJustin Hibbits /* set mask bits */
18140aeed3e9SJustin Hibbits genTmp |= (uint32_t)(p_ExtractOr->mask << KG_SCH_GEN_MASK_SHIFT);
18150aeed3e9SJustin Hibbits p_SchemeRegs->kgse_gec[currGenId++] = genTmp;
18160aeed3e9SJustin Hibbits
18170aeed3e9SJustin Hibbits }
18180aeed3e9SJustin Hibbits /* clear all unused GEC registers */
1819*852ba100SJustin Hibbits for ( i=currGenId ;i<FM_KG_NUM_OF_GENERIC_REGS ; i++)
18200aeed3e9SJustin Hibbits p_SchemeRegs->kgse_gec[i] = 0;
18210aeed3e9SJustin Hibbits
18220aeed3e9SJustin Hibbits /* add base Qid for this scheme */
18230aeed3e9SJustin Hibbits /* add configuration for kgse_fqb */
1824*852ba100SJustin Hibbits if (p_SchemeParams->baseFqid & ~0x00FFFFFF)
18250aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("baseFqid must be between 1 and 2^24-1"));
18260aeed3e9SJustin Hibbits
1827*852ba100SJustin Hibbits fqbTmp |= p_SchemeParams->baseFqid;
18280aeed3e9SJustin Hibbits p_SchemeRegs->kgse_fqb = fqbTmp;
18290aeed3e9SJustin Hibbits
1830*852ba100SJustin Hibbits p_Scheme->nextEngine = p_SchemeParams->nextEngine;
1831*852ba100SJustin Hibbits p_Scheme->doneAction = p_SchemeParams->kgNextEngineParams.doneAction;
1832*852ba100SJustin Hibbits
18330aeed3e9SJustin Hibbits return E_OK;
18340aeed3e9SJustin Hibbits }
18350aeed3e9SJustin Hibbits
1836*852ba100SJustin Hibbits
1837*852ba100SJustin Hibbits /*****************************************************************************/
1838*852ba100SJustin Hibbits /* Inter-module API routines */
1839*852ba100SJustin Hibbits /*****************************************************************************/
1840*852ba100SJustin Hibbits
FmPcdKgBuildClsPlanGrp(t_Handle h_FmPcd,t_FmPcdKgInterModuleClsPlanGrpParams * p_Grp,t_FmPcdKgInterModuleClsPlanSet * p_ClsPlanSet)1841*852ba100SJustin Hibbits t_Error FmPcdKgBuildClsPlanGrp(t_Handle h_FmPcd, t_FmPcdKgInterModuleClsPlanGrpParams *p_Grp, t_FmPcdKgInterModuleClsPlanSet *p_ClsPlanSet)
18420aeed3e9SJustin Hibbits {
18430aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
1844*852ba100SJustin Hibbits t_FmPcdKgClsPlanGrp *p_ClsPlanGrp;
1845*852ba100SJustin Hibbits t_FmPcdIpcKgClsPlanParams kgAlloc;
1846*852ba100SJustin Hibbits t_Error err = E_OK;
1847*852ba100SJustin Hibbits uint32_t oredVectors = 0;
1848*852ba100SJustin Hibbits int i, j;
18490aeed3e9SJustin Hibbits
1850*852ba100SJustin Hibbits /* this routine is protected by the calling routine ! */
1851*852ba100SJustin Hibbits if (p_Grp->numOfOptions >= FM_PCD_MAX_NUM_OF_OPTIONS(FM_PCD_MAX_NUM_OF_CLS_PLANS))
1852*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE,("Too many classification plan basic options selected."));
18530aeed3e9SJustin Hibbits
1854*852ba100SJustin Hibbits /* find a new clsPlan group */
1855*852ba100SJustin Hibbits for (i = 0; i < FM_MAX_NUM_OF_PORTS; i++)
1856*852ba100SJustin Hibbits if (!p_FmPcd->p_FmPcdKg->clsPlanGrps[i].used)
1857*852ba100SJustin Hibbits break;
1858*852ba100SJustin Hibbits if (i == FM_MAX_NUM_OF_PORTS)
1859*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_FULL,("No classification plan groups available."));
1860*852ba100SJustin Hibbits
1861*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->clsPlanGrps[i].used = TRUE;
1862*852ba100SJustin Hibbits
1863*852ba100SJustin Hibbits p_Grp->clsPlanGrpId = (uint8_t)i;
1864*852ba100SJustin Hibbits
1865*852ba100SJustin Hibbits if (p_Grp->numOfOptions == 0)
1866*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId = (uint8_t)i;
1867*852ba100SJustin Hibbits
1868*852ba100SJustin Hibbits p_ClsPlanGrp = &p_FmPcd->p_FmPcdKg->clsPlanGrps[i];
1869*852ba100SJustin Hibbits p_ClsPlanGrp->netEnvId = p_Grp->netEnvId;
1870*852ba100SJustin Hibbits p_ClsPlanGrp->owners = 0;
1871*852ba100SJustin Hibbits FmPcdSetClsPlanGrpId(p_FmPcd, p_Grp->netEnvId, p_Grp->clsPlanGrpId);
1872*852ba100SJustin Hibbits if (p_Grp->numOfOptions != 0)
1873*852ba100SJustin Hibbits FmPcdIncNetEnvOwners(p_FmPcd, p_Grp->netEnvId);
1874*852ba100SJustin Hibbits
1875*852ba100SJustin Hibbits p_ClsPlanGrp->sizeOfGrp = (uint16_t)(1 << p_Grp->numOfOptions);
1876*852ba100SJustin Hibbits /* a minimal group of 8 is required */
1877*852ba100SJustin Hibbits if (p_ClsPlanGrp->sizeOfGrp < CLS_PLAN_NUM_PER_GRP)
1878*852ba100SJustin Hibbits p_ClsPlanGrp->sizeOfGrp = CLS_PLAN_NUM_PER_GRP;
1879*852ba100SJustin Hibbits if (p_FmPcd->guestId == NCSW_MASTER_ID)
1880*852ba100SJustin Hibbits {
1881*852ba100SJustin Hibbits err = KgAllocClsPlanEntries(h_FmPcd, p_ClsPlanGrp->sizeOfGrp, p_FmPcd->guestId, &p_ClsPlanGrp->baseEntry);
1882*852ba100SJustin Hibbits
1883*852ba100SJustin Hibbits if (err)
1884*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, NO_MSG);
1885*852ba100SJustin Hibbits }
1886*852ba100SJustin Hibbits else
1887*852ba100SJustin Hibbits {
1888*852ba100SJustin Hibbits t_FmPcdIpcMsg msg;
1889*852ba100SJustin Hibbits uint32_t replyLength;
1890*852ba100SJustin Hibbits t_FmPcdIpcReply reply;
1891*852ba100SJustin Hibbits
1892*852ba100SJustin Hibbits /* in GUEST_PARTITION, we use the IPC, to also set a private driver group if required */
1893*852ba100SJustin Hibbits memset(&reply, 0, sizeof(reply));
1894*852ba100SJustin Hibbits memset(&msg, 0, sizeof(msg));
1895*852ba100SJustin Hibbits memset(&kgAlloc, 0, sizeof(kgAlloc));
1896*852ba100SJustin Hibbits kgAlloc.guestId = p_FmPcd->guestId;
1897*852ba100SJustin Hibbits kgAlloc.numOfClsPlanEntries = p_ClsPlanGrp->sizeOfGrp;
1898*852ba100SJustin Hibbits msg.msgId = FM_PCD_ALLOC_KG_CLSPLAN;
1899*852ba100SJustin Hibbits memcpy(msg.msgBody, &kgAlloc, sizeof(kgAlloc));
1900*852ba100SJustin Hibbits replyLength = (sizeof(uint32_t) + sizeof(p_ClsPlanGrp->baseEntry));
1901*852ba100SJustin Hibbits if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
1902*852ba100SJustin Hibbits (uint8_t*)&msg,
1903*852ba100SJustin Hibbits sizeof(msg.msgId) + sizeof(kgAlloc),
1904*852ba100SJustin Hibbits (uint8_t*)&reply,
1905*852ba100SJustin Hibbits &replyLength,
1906*852ba100SJustin Hibbits NULL,
1907*852ba100SJustin Hibbits NULL)) != E_OK)
1908*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
1909*852ba100SJustin Hibbits
1910*852ba100SJustin Hibbits if (replyLength != (sizeof(uint32_t) + sizeof(p_ClsPlanGrp->baseEntry)))
1911*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
1912*852ba100SJustin Hibbits if ((t_Error)reply.error != E_OK)
1913*852ba100SJustin Hibbits RETURN_ERROR(MINOR, (t_Error)reply.error, NO_MSG);
1914*852ba100SJustin Hibbits
1915*852ba100SJustin Hibbits p_ClsPlanGrp->baseEntry = *(uint8_t*)(reply.replyBody);
19160aeed3e9SJustin Hibbits }
19170aeed3e9SJustin Hibbits
1918*852ba100SJustin Hibbits /* build classification plan entries parameters */
1919*852ba100SJustin Hibbits p_ClsPlanSet->baseEntry = p_ClsPlanGrp->baseEntry;
1920*852ba100SJustin Hibbits p_ClsPlanSet->numOfClsPlanEntries = p_ClsPlanGrp->sizeOfGrp;
19210aeed3e9SJustin Hibbits
1922*852ba100SJustin Hibbits oredVectors = 0;
1923*852ba100SJustin Hibbits for (i = 0; i<p_Grp->numOfOptions; i++)
1924*852ba100SJustin Hibbits {
1925*852ba100SJustin Hibbits oredVectors |= p_Grp->optVectors[i];
1926*852ba100SJustin Hibbits /* save an array of used options - the indexes represent the power of 2 index */
1927*852ba100SJustin Hibbits p_ClsPlanGrp->optArray[i] = p_Grp->options[i];
1928*852ba100SJustin Hibbits }
1929*852ba100SJustin Hibbits /* set the classification plan relevant entries so that all bits
1930*852ba100SJustin Hibbits * relevant to the list of options is cleared
1931*852ba100SJustin Hibbits */
1932*852ba100SJustin Hibbits for (j = 0; j<p_ClsPlanGrp->sizeOfGrp; j++)
1933*852ba100SJustin Hibbits p_ClsPlanSet->vectors[j] = ~oredVectors;
1934*852ba100SJustin Hibbits
1935*852ba100SJustin Hibbits for (i = 0; i<p_Grp->numOfOptions; i++)
1936*852ba100SJustin Hibbits {
1937*852ba100SJustin Hibbits /* option i got the place 2^i in the clsPlan array. all entries that
1938*852ba100SJustin Hibbits * have bit i set, should have the vector bit cleared. So each option
1939*852ba100SJustin Hibbits * has one location that it is exclusive (1,2,4,8...) and represent the
1940*852ba100SJustin Hibbits * presence of that option only, and other locations that represent a
1941*852ba100SJustin Hibbits * combination of options.
1942*852ba100SJustin Hibbits * e.g:
1943*852ba100SJustin Hibbits * If ethernet-BC is option 1 it gets entry 2 in the table. Entry 2
1944*852ba100SJustin Hibbits * now represents a frame with ethernet-BC header - so the bit
1945*852ba100SJustin Hibbits * representing ethernet-BC should be set and all other option bits
1946*852ba100SJustin Hibbits * should be cleared.
1947*852ba100SJustin Hibbits * Entries 2,3,6,7,10... also have ethernet-BC and therefore have bit
1948*852ba100SJustin Hibbits * vector[1] set, but they also have other bits set:
1949*852ba100SJustin Hibbits * 3=1+2, options 0 and 1
1950*852ba100SJustin Hibbits * 6=2+4, options 1 and 2
1951*852ba100SJustin Hibbits * 7=1+2+4, options 0,1,and 2
1952*852ba100SJustin Hibbits * 10=2+8, options 1 and 3
1953*852ba100SJustin Hibbits * etc.
1954*852ba100SJustin Hibbits * */
1955*852ba100SJustin Hibbits
1956*852ba100SJustin Hibbits /* now for each option (i), we set their bits in all entries (j)
1957*852ba100SJustin Hibbits * that contain bit 2^i.
1958*852ba100SJustin Hibbits */
1959*852ba100SJustin Hibbits for (j = 0; j<p_ClsPlanGrp->sizeOfGrp; j++)
1960*852ba100SJustin Hibbits {
1961*852ba100SJustin Hibbits if (j & (1<<i))
1962*852ba100SJustin Hibbits p_ClsPlanSet->vectors[j] |= p_Grp->optVectors[i];
1963*852ba100SJustin Hibbits }
1964*852ba100SJustin Hibbits }
1965*852ba100SJustin Hibbits
1966*852ba100SJustin Hibbits return E_OK;
1967*852ba100SJustin Hibbits }
1968*852ba100SJustin Hibbits
FmPcdKgDestroyClsPlanGrp(t_Handle h_FmPcd,uint8_t grpId)1969*852ba100SJustin Hibbits void FmPcdKgDestroyClsPlanGrp(t_Handle h_FmPcd, uint8_t grpId)
1970*852ba100SJustin Hibbits {
1971*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
1972*852ba100SJustin Hibbits t_FmPcdIpcKgClsPlanParams kgAlloc;
1973*852ba100SJustin Hibbits t_Error err;
1974*852ba100SJustin Hibbits t_FmPcdIpcMsg msg;
1975*852ba100SJustin Hibbits uint32_t replyLength;
1976*852ba100SJustin Hibbits t_FmPcdIpcReply reply;
1977*852ba100SJustin Hibbits
1978*852ba100SJustin Hibbits /* check that no port is bound to this clsPlan */
1979*852ba100SJustin Hibbits if (p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].owners)
1980*852ba100SJustin Hibbits {
1981*852ba100SJustin Hibbits REPORT_ERROR(MINOR, E_INVALID_STATE, ("Trying to delete a clsPlan grp that has ports bound to"));
1982*852ba100SJustin Hibbits return;
1983*852ba100SJustin Hibbits }
1984*852ba100SJustin Hibbits
1985*852ba100SJustin Hibbits FmPcdSetClsPlanGrpId(p_FmPcd, p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].netEnvId, ILLEGAL_CLS_PLAN);
1986*852ba100SJustin Hibbits
1987*852ba100SJustin Hibbits if (grpId == p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId)
1988*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId = ILLEGAL_CLS_PLAN;
1989*852ba100SJustin Hibbits else
1990*852ba100SJustin Hibbits FmPcdDecNetEnvOwners(p_FmPcd, p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].netEnvId);
1991*852ba100SJustin Hibbits
1992*852ba100SJustin Hibbits /* free blocks */
1993*852ba100SJustin Hibbits if (p_FmPcd->guestId == NCSW_MASTER_ID)
1994*852ba100SJustin Hibbits KgFreeClsPlanEntries(h_FmPcd,
1995*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].sizeOfGrp,
1996*852ba100SJustin Hibbits p_FmPcd->guestId,
1997*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].baseEntry);
1998*852ba100SJustin Hibbits else /* in GUEST_PARTITION, we use the IPC, to also set a private driver group if required */
1999*852ba100SJustin Hibbits {
2000*852ba100SJustin Hibbits memset(&reply, 0, sizeof(reply));
2001*852ba100SJustin Hibbits memset(&msg, 0, sizeof(msg));
2002*852ba100SJustin Hibbits kgAlloc.guestId = p_FmPcd->guestId;
2003*852ba100SJustin Hibbits kgAlloc.numOfClsPlanEntries = p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].sizeOfGrp;
2004*852ba100SJustin Hibbits kgAlloc.clsPlanBase = p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId].baseEntry;
2005*852ba100SJustin Hibbits msg.msgId = FM_PCD_FREE_KG_CLSPLAN;
2006*852ba100SJustin Hibbits memcpy(msg.msgBody, &kgAlloc, sizeof(kgAlloc));
2007*852ba100SJustin Hibbits replyLength = sizeof(uint32_t);
2008*852ba100SJustin Hibbits err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
2009*852ba100SJustin Hibbits (uint8_t*)&msg,
2010*852ba100SJustin Hibbits sizeof(msg.msgId) + sizeof(kgAlloc),
2011*852ba100SJustin Hibbits (uint8_t*)&reply,
2012*852ba100SJustin Hibbits &replyLength,
2013*852ba100SJustin Hibbits NULL,
2014*852ba100SJustin Hibbits NULL);
2015*852ba100SJustin Hibbits if (err != E_OK)
2016*852ba100SJustin Hibbits {
2017*852ba100SJustin Hibbits REPORT_ERROR(MINOR, err, NO_MSG);
2018*852ba100SJustin Hibbits return;
2019*852ba100SJustin Hibbits }
2020*852ba100SJustin Hibbits if (replyLength != sizeof(uint32_t))
2021*852ba100SJustin Hibbits {
2022*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
2023*852ba100SJustin Hibbits return;
2024*852ba100SJustin Hibbits }
2025*852ba100SJustin Hibbits if ((t_Error)reply.error != E_OK)
2026*852ba100SJustin Hibbits {
2027*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Free KG clsPlan failed"));
2028*852ba100SJustin Hibbits return;
2029*852ba100SJustin Hibbits }
2030*852ba100SJustin Hibbits }
2031*852ba100SJustin Hibbits
2032*852ba100SJustin Hibbits /* clear clsPlan driver structure */
2033*852ba100SJustin Hibbits memset(&p_FmPcd->p_FmPcdKg->clsPlanGrps[grpId], 0, sizeof(t_FmPcdKgClsPlanGrp));
2034*852ba100SJustin Hibbits }
2035*852ba100SJustin Hibbits
FmPcdKgBuildBindPortToSchemes(t_Handle h_FmPcd,t_FmPcdKgInterModuleBindPortToSchemes * p_BindPort,uint32_t * p_SpReg,bool add)2036*852ba100SJustin Hibbits t_Error FmPcdKgBuildBindPortToSchemes(t_Handle h_FmPcd, t_FmPcdKgInterModuleBindPortToSchemes *p_BindPort, uint32_t *p_SpReg, bool add)
2037*852ba100SJustin Hibbits {
2038*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
2039*852ba100SJustin Hibbits uint32_t j, schemesPerPortVector = 0;
2040*852ba100SJustin Hibbits t_FmPcdKgScheme *p_Scheme;
2041*852ba100SJustin Hibbits uint8_t i, relativeSchemeId;
2042*852ba100SJustin Hibbits uint32_t tmp, walking1Mask;
2043*852ba100SJustin Hibbits uint8_t swPortIndex = 0;
2044*852ba100SJustin Hibbits
2045*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
2046*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg, E_INVALID_HANDLE);
2047*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
2048*852ba100SJustin Hibbits
2049*852ba100SJustin Hibbits /* for each scheme */
2050*852ba100SJustin Hibbits for (i = 0; i<p_BindPort->numOfSchemes; i++)
2051*852ba100SJustin Hibbits {
2052*852ba100SJustin Hibbits relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmPcd, p_BindPort->schemesIds[i]);
2053*852ba100SJustin Hibbits if (relativeSchemeId >= FM_PCD_KG_NUM_OF_SCHEMES)
2054*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
2055*852ba100SJustin Hibbits
2056*852ba100SJustin Hibbits if (add)
2057*852ba100SJustin Hibbits {
2058*852ba100SJustin Hibbits p_Scheme = &p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId];
2059*852ba100SJustin Hibbits if (!FmPcdKgIsSchemeValidSw(p_Scheme))
2060*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Requested scheme is invalid."));
2061*852ba100SJustin Hibbits /* check netEnvId of the port against the scheme netEnvId */
2062*852ba100SJustin Hibbits if ((p_Scheme->netEnvId != p_BindPort->netEnvId) && (p_Scheme->netEnvId != ILLEGAL_NETENV))
2063*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Port may not be bound to requested scheme - differ in netEnvId"));
2064*852ba100SJustin Hibbits
2065*852ba100SJustin Hibbits /* if next engine is private port policer profile, we need to check that it is valid */
2066*852ba100SJustin Hibbits HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, p_BindPort->hardwarePortId);
2067*852ba100SJustin Hibbits if (p_Scheme->nextRelativePlcrProfile)
2068*852ba100SJustin Hibbits {
2069*852ba100SJustin Hibbits for (j = 0;j<p_Scheme->numOfProfiles;j++)
2070*852ba100SJustin Hibbits {
2071*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].h_FmPort);
2072*852ba100SJustin Hibbits if (p_Scheme->relativeProfileId+j >= p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].numOfProfiles)
2073*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Relative profile not in range"));
2074*852ba100SJustin Hibbits if (!FmPcdPlcrIsProfileValid(p_FmPcd, (uint16_t)(p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].profilesBase + p_Scheme->relativeProfileId + j)))
2075*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("Relative profile not valid."));
2076*852ba100SJustin Hibbits }
2077*852ba100SJustin Hibbits }
2078*852ba100SJustin Hibbits if (!p_BindPort->useClsPlan)
2079*852ba100SJustin Hibbits {
2080*852ba100SJustin Hibbits /* This check may be redundant as port is a assigned to the whole NetEnv */
2081*852ba100SJustin Hibbits
2082*852ba100SJustin Hibbits /* if this port does not use clsPlan, it may not be bound to schemes with units that contain
2083*852ba100SJustin Hibbits cls plan options. Schemes that are used only directly, should not be checked.
2084*852ba100SJustin Hibbits it also may not be bound to schemes that go to CC with units that are options - so we OR
2085*852ba100SJustin Hibbits the match vector and the grpBits (= ccUnits) */
2086*852ba100SJustin Hibbits if ((p_Scheme->matchVector != SCHEME_ALWAYS_DIRECT) || p_Scheme->ccUnits)
2087*852ba100SJustin Hibbits {
2088*852ba100SJustin Hibbits uint8_t netEnvId;
2089*852ba100SJustin Hibbits walking1Mask = 0x80000000;
2090*852ba100SJustin Hibbits netEnvId = (p_Scheme->netEnvId == ILLEGAL_NETENV)? p_BindPort->netEnvId:p_Scheme->netEnvId;
2091*852ba100SJustin Hibbits tmp = (p_Scheme->matchVector == SCHEME_ALWAYS_DIRECT)? 0:p_Scheme->matchVector;
2092*852ba100SJustin Hibbits tmp |= p_Scheme->ccUnits;
2093*852ba100SJustin Hibbits while (tmp)
2094*852ba100SJustin Hibbits {
2095*852ba100SJustin Hibbits if (tmp & walking1Mask)
2096*852ba100SJustin Hibbits {
2097*852ba100SJustin Hibbits tmp &= ~walking1Mask;
2098*852ba100SJustin Hibbits if (!PcdNetEnvIsUnitWithoutOpts(p_FmPcd, netEnvId, walking1Mask))
2099*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Port (without clsPlan) may not be bound to requested scheme - uses clsPlan options"));
2100*852ba100SJustin Hibbits }
2101*852ba100SJustin Hibbits walking1Mask >>= 1;
2102*852ba100SJustin Hibbits }
2103*852ba100SJustin Hibbits }
2104*852ba100SJustin Hibbits }
2105*852ba100SJustin Hibbits }
2106*852ba100SJustin Hibbits /* build vector */
2107*852ba100SJustin Hibbits schemesPerPortVector |= 1 << (31 - p_BindPort->schemesIds[i]);
2108*852ba100SJustin Hibbits }
2109*852ba100SJustin Hibbits
2110*852ba100SJustin Hibbits *p_SpReg = schemesPerPortVector;
2111*852ba100SJustin Hibbits
2112*852ba100SJustin Hibbits return E_OK;
2113*852ba100SJustin Hibbits }
2114*852ba100SJustin Hibbits
FmPcdKgBindPortToSchemes(t_Handle h_FmPcd,t_FmPcdKgInterModuleBindPortToSchemes * p_SchemeBind)2115*852ba100SJustin Hibbits t_Error FmPcdKgBindPortToSchemes(t_Handle h_FmPcd , t_FmPcdKgInterModuleBindPortToSchemes *p_SchemeBind)
2116*852ba100SJustin Hibbits {
2117*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
2118*852ba100SJustin Hibbits uint32_t spReg;
2119*852ba100SJustin Hibbits t_Error err = E_OK;
2120*852ba100SJustin Hibbits
2121*852ba100SJustin Hibbits err = FmPcdKgBuildBindPortToSchemes(h_FmPcd, p_SchemeBind, &spReg, TRUE);
2122*852ba100SJustin Hibbits if (err)
2123*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
2124*852ba100SJustin Hibbits
2125*852ba100SJustin Hibbits err = KgWriteSp(p_FmPcd, p_SchemeBind->hardwarePortId, spReg, TRUE);
2126*852ba100SJustin Hibbits if (err)
2127*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
2128*852ba100SJustin Hibbits
2129*852ba100SJustin Hibbits IncSchemeOwners(p_FmPcd, p_SchemeBind);
2130*852ba100SJustin Hibbits
2131*852ba100SJustin Hibbits return E_OK;
2132*852ba100SJustin Hibbits }
2133*852ba100SJustin Hibbits
FmPcdKgUnbindPortToSchemes(t_Handle h_FmPcd,t_FmPcdKgInterModuleBindPortToSchemes * p_SchemeBind)2134*852ba100SJustin Hibbits t_Error FmPcdKgUnbindPortToSchemes(t_Handle h_FmPcd, t_FmPcdKgInterModuleBindPortToSchemes *p_SchemeBind)
2135*852ba100SJustin Hibbits {
2136*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
2137*852ba100SJustin Hibbits uint32_t spReg;
2138*852ba100SJustin Hibbits t_Error err = E_OK;
2139*852ba100SJustin Hibbits
2140*852ba100SJustin Hibbits err = FmPcdKgBuildBindPortToSchemes(p_FmPcd, p_SchemeBind, &spReg, FALSE);
2141*852ba100SJustin Hibbits if (err)
2142*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
2143*852ba100SJustin Hibbits
2144*852ba100SJustin Hibbits err = KgWriteSp(p_FmPcd, p_SchemeBind->hardwarePortId, spReg, FALSE);
2145*852ba100SJustin Hibbits if (err)
2146*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
2147*852ba100SJustin Hibbits
2148*852ba100SJustin Hibbits DecSchemeOwners(p_FmPcd, p_SchemeBind);
2149*852ba100SJustin Hibbits
2150*852ba100SJustin Hibbits return E_OK;
2151*852ba100SJustin Hibbits }
2152*852ba100SJustin Hibbits
FmPcdKgIsSchemeValidSw(t_Handle h_Scheme)2153*852ba100SJustin Hibbits bool FmPcdKgIsSchemeValidSw(t_Handle h_Scheme)
2154*852ba100SJustin Hibbits {
2155*852ba100SJustin Hibbits t_FmPcdKgScheme *p_Scheme = (t_FmPcdKgScheme*)h_Scheme;
2156*852ba100SJustin Hibbits
2157*852ba100SJustin Hibbits return p_Scheme->valid;
2158*852ba100SJustin Hibbits }
2159*852ba100SJustin Hibbits
KgIsSchemeAlwaysDirect(t_Handle h_FmPcd,uint8_t schemeId)2160*852ba100SJustin Hibbits bool KgIsSchemeAlwaysDirect(t_Handle h_FmPcd, uint8_t schemeId)
2161*852ba100SJustin Hibbits {
21620aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
21630aeed3e9SJustin Hibbits
2164*852ba100SJustin Hibbits if (p_FmPcd->p_FmPcdKg->schemes[schemeId].matchVector == SCHEME_ALWAYS_DIRECT)
2165*852ba100SJustin Hibbits return TRUE;
2166*852ba100SJustin Hibbits else
2167*852ba100SJustin Hibbits return FALSE;
2168*852ba100SJustin Hibbits }
2169*852ba100SJustin Hibbits
FmPcdKgAllocSchemes(t_Handle h_FmPcd,uint8_t numOfSchemes,uint8_t guestId,uint8_t * p_SchemesIds)2170*852ba100SJustin Hibbits t_Error FmPcdKgAllocSchemes(t_Handle h_FmPcd, uint8_t numOfSchemes, uint8_t guestId, uint8_t *p_SchemesIds)
2171*852ba100SJustin Hibbits {
2172*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
2173*852ba100SJustin Hibbits uint8_t i, j;
2174*852ba100SJustin Hibbits
2175*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
2176*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg, E_INVALID_HANDLE);
2177*852ba100SJustin Hibbits
2178*852ba100SJustin Hibbits /* This routine is issued only on master core of master partition -
2179*852ba100SJustin Hibbits either directly or through IPC, so no need for lock */
2180*852ba100SJustin Hibbits
2181*852ba100SJustin Hibbits for (j = 0, i = 0; i < FM_PCD_KG_NUM_OF_SCHEMES && j < numOfSchemes; i++)
2182*852ba100SJustin Hibbits {
2183*852ba100SJustin Hibbits if (!p_FmPcd->p_FmPcdKg->schemesMng[i].allocated)
2184*852ba100SJustin Hibbits {
2185*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->schemesMng[i].allocated = TRUE;
2186*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->schemesMng[i].ownerId = guestId;
2187*852ba100SJustin Hibbits p_SchemesIds[j] = i;
2188*852ba100SJustin Hibbits j++;
2189*852ba100SJustin Hibbits }
2190*852ba100SJustin Hibbits }
2191*852ba100SJustin Hibbits
2192*852ba100SJustin Hibbits if (j != numOfSchemes)
2193*852ba100SJustin Hibbits {
2194*852ba100SJustin Hibbits /* roll back */
2195*852ba100SJustin Hibbits for (j--; j; j--)
2196*852ba100SJustin Hibbits {
2197*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->schemesMng[p_SchemesIds[j]].allocated = FALSE;
2198*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->schemesMng[p_SchemesIds[j]].ownerId = 0;
2199*852ba100SJustin Hibbits p_SchemesIds[j] = 0;
2200*852ba100SJustin Hibbits }
2201*852ba100SJustin Hibbits
2202*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("No schemes found"));
2203*852ba100SJustin Hibbits }
2204*852ba100SJustin Hibbits
2205*852ba100SJustin Hibbits return E_OK;
2206*852ba100SJustin Hibbits }
2207*852ba100SJustin Hibbits
FmPcdKgFreeSchemes(t_Handle h_FmPcd,uint8_t numOfSchemes,uint8_t guestId,uint8_t * p_SchemesIds)2208*852ba100SJustin Hibbits t_Error FmPcdKgFreeSchemes(t_Handle h_FmPcd, uint8_t numOfSchemes, uint8_t guestId, uint8_t *p_SchemesIds)
2209*852ba100SJustin Hibbits {
2210*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
2211*852ba100SJustin Hibbits uint8_t i;
2212*852ba100SJustin Hibbits
2213*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
2214*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg, E_INVALID_HANDLE);
2215*852ba100SJustin Hibbits
2216*852ba100SJustin Hibbits /* This routine is issued only on master core of master partition -
2217*852ba100SJustin Hibbits either directly or through IPC */
2218*852ba100SJustin Hibbits
2219*852ba100SJustin Hibbits for (i = 0; i < numOfSchemes; i++)
2220*852ba100SJustin Hibbits {
2221*852ba100SJustin Hibbits if (!p_FmPcd->p_FmPcdKg->schemesMng[p_SchemesIds[i]].allocated)
2222*852ba100SJustin Hibbits {
2223*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Scheme was not previously allocated"));
2224*852ba100SJustin Hibbits }
2225*852ba100SJustin Hibbits if (p_FmPcd->p_FmPcdKg->schemesMng[p_SchemesIds[i]].ownerId != guestId)
2226*852ba100SJustin Hibbits {
2227*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Scheme is not owned by caller. "));
2228*852ba100SJustin Hibbits }
2229*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->schemesMng[p_SchemesIds[i]].allocated = FALSE;
2230*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->schemesMng[p_SchemesIds[i]].ownerId = 0;
2231*852ba100SJustin Hibbits }
2232*852ba100SJustin Hibbits
2233*852ba100SJustin Hibbits return E_OK;
2234*852ba100SJustin Hibbits }
2235*852ba100SJustin Hibbits
KgAllocClsPlanEntries(t_Handle h_FmPcd,uint16_t numOfClsPlanEntries,uint8_t guestId,uint8_t * p_First)2236*852ba100SJustin Hibbits t_Error KgAllocClsPlanEntries(t_Handle h_FmPcd, uint16_t numOfClsPlanEntries, uint8_t guestId, uint8_t *p_First)
2237*852ba100SJustin Hibbits {
2238*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
2239*852ba100SJustin Hibbits uint8_t numOfBlocks, blocksFound=0, first=0;
2240*852ba100SJustin Hibbits uint8_t i, j;
2241*852ba100SJustin Hibbits
2242*852ba100SJustin Hibbits /* This routine is issued only on master core of master partition -
2243*852ba100SJustin Hibbits either directly or through IPC, so no need for lock */
2244*852ba100SJustin Hibbits
2245*852ba100SJustin Hibbits if (!numOfClsPlanEntries)
2246*852ba100SJustin Hibbits return E_OK;
2247*852ba100SJustin Hibbits
2248*852ba100SJustin Hibbits if ((numOfClsPlanEntries % CLS_PLAN_NUM_PER_GRP) || (!POWER_OF_2(numOfClsPlanEntries)))
2249*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfClsPlanEntries must be a power of 2 and divisible by 8"));
2250*852ba100SJustin Hibbits
2251*852ba100SJustin Hibbits numOfBlocks = (uint8_t)(numOfClsPlanEntries/CLS_PLAN_NUM_PER_GRP);
2252*852ba100SJustin Hibbits
2253*852ba100SJustin Hibbits /* try to find consequent blocks */
2254*852ba100SJustin Hibbits first = 0;
2255*852ba100SJustin Hibbits for (i = 0; i < FM_PCD_MAX_NUM_OF_CLS_PLANS/CLS_PLAN_NUM_PER_GRP;)
2256*852ba100SJustin Hibbits {
2257*852ba100SJustin Hibbits if (!p_FmPcd->p_FmPcdKg->clsPlanBlocksMng[i].allocated)
2258*852ba100SJustin Hibbits {
2259*852ba100SJustin Hibbits blocksFound++;
2260*852ba100SJustin Hibbits i++;
2261*852ba100SJustin Hibbits if (blocksFound == numOfBlocks)
2262*852ba100SJustin Hibbits break;
2263*852ba100SJustin Hibbits }
2264*852ba100SJustin Hibbits else
2265*852ba100SJustin Hibbits {
2266*852ba100SJustin Hibbits blocksFound = 0;
2267*852ba100SJustin Hibbits /* advance i to the next aligned address */
2268*852ba100SJustin Hibbits first = i = (uint8_t)(first + numOfBlocks);
2269*852ba100SJustin Hibbits }
2270*852ba100SJustin Hibbits }
2271*852ba100SJustin Hibbits
2272*852ba100SJustin Hibbits if (blocksFound == numOfBlocks)
2273*852ba100SJustin Hibbits {
2274*852ba100SJustin Hibbits *p_First = (uint8_t)(first * CLS_PLAN_NUM_PER_GRP);
2275*852ba100SJustin Hibbits for (j = first; j < (first + numOfBlocks); j++)
2276*852ba100SJustin Hibbits {
2277*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->clsPlanBlocksMng[j].allocated = TRUE;
2278*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->clsPlanBlocksMng[j].ownerId = guestId;
2279*852ba100SJustin Hibbits }
2280*852ba100SJustin Hibbits return E_OK;
2281*852ba100SJustin Hibbits }
2282*852ba100SJustin Hibbits else
2283*852ba100SJustin Hibbits RETURN_ERROR(MINOR, E_FULL, ("No resources for clsPlan"));
2284*852ba100SJustin Hibbits }
2285*852ba100SJustin Hibbits
KgFreeClsPlanEntries(t_Handle h_FmPcd,uint16_t numOfClsPlanEntries,uint8_t guestId,uint8_t base)2286*852ba100SJustin Hibbits void KgFreeClsPlanEntries(t_Handle h_FmPcd, uint16_t numOfClsPlanEntries, uint8_t guestId, uint8_t base)
2287*852ba100SJustin Hibbits {
2288*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
2289*852ba100SJustin Hibbits uint8_t numOfBlocks;
2290*852ba100SJustin Hibbits uint8_t i, baseBlock;
2291*852ba100SJustin Hibbits
2292*852ba100SJustin Hibbits #ifdef DISABLE_ASSERTIONS
2293*852ba100SJustin Hibbits UNUSED(guestId);
2294*852ba100SJustin Hibbits #endif /* DISABLE_ASSERTIONS */
2295*852ba100SJustin Hibbits
2296*852ba100SJustin Hibbits /* This routine is issued only on master core of master partition -
2297*852ba100SJustin Hibbits either directly or through IPC, so no need for lock */
2298*852ba100SJustin Hibbits
2299*852ba100SJustin Hibbits numOfBlocks = (uint8_t)(numOfClsPlanEntries/CLS_PLAN_NUM_PER_GRP);
2300*852ba100SJustin Hibbits ASSERT_COND(!(base%CLS_PLAN_NUM_PER_GRP));
2301*852ba100SJustin Hibbits
2302*852ba100SJustin Hibbits baseBlock = (uint8_t)(base/CLS_PLAN_NUM_PER_GRP);
2303*852ba100SJustin Hibbits for (i=baseBlock;i<baseBlock+numOfBlocks;i++)
2304*852ba100SJustin Hibbits {
2305*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd->p_FmPcdKg->clsPlanBlocksMng[i].allocated);
2306*852ba100SJustin Hibbits ASSERT_COND(guestId == p_FmPcd->p_FmPcdKg->clsPlanBlocksMng[i].ownerId);
2307*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->clsPlanBlocksMng[i].allocated = FALSE;
2308*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->clsPlanBlocksMng[i].ownerId = 0;
2309*852ba100SJustin Hibbits }
2310*852ba100SJustin Hibbits }
2311*852ba100SJustin Hibbits
KgEnable(t_FmPcd * p_FmPcd)2312*852ba100SJustin Hibbits void KgEnable(t_FmPcd *p_FmPcd)
2313*852ba100SJustin Hibbits {
2314*852ba100SJustin Hibbits struct fman_kg_regs *p_Regs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
2315*852ba100SJustin Hibbits
2316*852ba100SJustin Hibbits ASSERT_COND(FmIsMaster(p_FmPcd->h_Fm));
2317*852ba100SJustin Hibbits fman_kg_enable(p_Regs);
2318*852ba100SJustin Hibbits }
2319*852ba100SJustin Hibbits
KgDisable(t_FmPcd * p_FmPcd)2320*852ba100SJustin Hibbits void KgDisable(t_FmPcd *p_FmPcd)
2321*852ba100SJustin Hibbits {
2322*852ba100SJustin Hibbits struct fman_kg_regs *p_Regs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
2323*852ba100SJustin Hibbits
2324*852ba100SJustin Hibbits ASSERT_COND(FmIsMaster(p_FmPcd->h_Fm));
2325*852ba100SJustin Hibbits fman_kg_disable(p_Regs);
2326*852ba100SJustin Hibbits }
2327*852ba100SJustin Hibbits
KgSetClsPlan(t_Handle h_FmPcd,t_FmPcdKgInterModuleClsPlanSet * p_Set)2328*852ba100SJustin Hibbits void KgSetClsPlan(t_Handle h_FmPcd, t_FmPcdKgInterModuleClsPlanSet *p_Set)
2329*852ba100SJustin Hibbits {
2330*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
2331*852ba100SJustin Hibbits struct fman_kg_cp_regs *p_FmPcdKgPortRegs;
2332*852ba100SJustin Hibbits uint32_t tmpKgarReg = 0, intFlags;
2333*852ba100SJustin Hibbits uint16_t i, j;
2334*852ba100SJustin Hibbits
2335*852ba100SJustin Hibbits /* This routine is protected by the calling routine ! */
2336*852ba100SJustin Hibbits ASSERT_COND(FmIsMaster(p_FmPcd->h_Fm));
2337*852ba100SJustin Hibbits p_FmPcdKgPortRegs = &p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->clsPlanRegs;
2338*852ba100SJustin Hibbits
2339*852ba100SJustin Hibbits intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
2340*852ba100SJustin Hibbits for (i=p_Set->baseEntry;i<p_Set->baseEntry+p_Set->numOfClsPlanEntries;i+=8)
2341*852ba100SJustin Hibbits {
2342*852ba100SJustin Hibbits tmpKgarReg = FmPcdKgBuildWriteClsPlanBlockActionReg((uint8_t)(i / CLS_PLAN_NUM_PER_GRP));
2343*852ba100SJustin Hibbits
2344*852ba100SJustin Hibbits for (j = i; j < i+8; j++)
2345*852ba100SJustin Hibbits {
2346*852ba100SJustin Hibbits ASSERT_COND(IN_RANGE(0, (j - p_Set->baseEntry), FM_PCD_MAX_NUM_OF_CLS_PLANS-1));
2347*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcdKgPortRegs->kgcpe[j % CLS_PLAN_NUM_PER_GRP],p_Set->vectors[j - p_Set->baseEntry]);
2348*852ba100SJustin Hibbits }
2349*852ba100SJustin Hibbits
2350*852ba100SJustin Hibbits if (WriteKgarWait(p_FmPcd, tmpKgarReg) != E_OK)
2351*852ba100SJustin Hibbits {
2352*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, ("WriteKgarWait FAILED"));
2353*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
2354*852ba100SJustin Hibbits return;
2355*852ba100SJustin Hibbits }
2356*852ba100SJustin Hibbits }
2357*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
2358*852ba100SJustin Hibbits }
2359*852ba100SJustin Hibbits
KgConfig(t_FmPcd * p_FmPcd,t_FmPcdParams * p_FmPcdParams)2360*852ba100SJustin Hibbits t_Handle KgConfig( t_FmPcd *p_FmPcd, t_FmPcdParams *p_FmPcdParams)
2361*852ba100SJustin Hibbits {
2362*852ba100SJustin Hibbits t_FmPcdKg *p_FmPcdKg;
2363*852ba100SJustin Hibbits
2364*852ba100SJustin Hibbits UNUSED(p_FmPcd);
2365*852ba100SJustin Hibbits
2366*852ba100SJustin Hibbits if (p_FmPcdParams->numOfSchemes > FM_PCD_KG_NUM_OF_SCHEMES)
2367*852ba100SJustin Hibbits {
2368*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE,
2369*852ba100SJustin Hibbits ("numOfSchemes should not exceed %d", FM_PCD_KG_NUM_OF_SCHEMES));
2370*852ba100SJustin Hibbits return NULL;
2371*852ba100SJustin Hibbits }
2372*852ba100SJustin Hibbits
2373*852ba100SJustin Hibbits p_FmPcdKg = (t_FmPcdKg *)XX_Malloc(sizeof(t_FmPcdKg));
2374*852ba100SJustin Hibbits if (!p_FmPcdKg)
2375*852ba100SJustin Hibbits {
2376*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Keygen allocation FAILED"));
2377*852ba100SJustin Hibbits return NULL;
2378*852ba100SJustin Hibbits }
2379*852ba100SJustin Hibbits memset(p_FmPcdKg, 0, sizeof(t_FmPcdKg));
2380*852ba100SJustin Hibbits
2381*852ba100SJustin Hibbits
2382*852ba100SJustin Hibbits if (FmIsMaster(p_FmPcd->h_Fm))
2383*852ba100SJustin Hibbits {
2384*852ba100SJustin Hibbits p_FmPcdKg->p_FmPcdKgRegs = (struct fman_kg_regs *)UINT_TO_PTR(FmGetPcdKgBaseAddr(p_FmPcdParams->h_Fm));
2385*852ba100SJustin Hibbits p_FmPcd->exceptions |= DEFAULT_fmPcdKgErrorExceptions;
2386*852ba100SJustin Hibbits p_FmPcdKg->p_IndirectAccessRegs = (u_FmPcdKgIndirectAccessRegs *)&p_FmPcdKg->p_FmPcdKgRegs->fmkg_indirect[0];
2387*852ba100SJustin Hibbits }
2388*852ba100SJustin Hibbits
2389*852ba100SJustin Hibbits p_FmPcdKg->numOfSchemes = p_FmPcdParams->numOfSchemes;
2390*852ba100SJustin Hibbits if ((p_FmPcd->guestId == NCSW_MASTER_ID) && !p_FmPcdKg->numOfSchemes)
2391*852ba100SJustin Hibbits {
2392*852ba100SJustin Hibbits p_FmPcdKg->numOfSchemes = FM_PCD_KG_NUM_OF_SCHEMES;
2393*852ba100SJustin Hibbits DBG(WARNING, ("numOfSchemes was defined 0 by user, re-defined by driver to FM_PCD_KG_NUM_OF_SCHEMES"));
2394*852ba100SJustin Hibbits }
2395*852ba100SJustin Hibbits
2396*852ba100SJustin Hibbits p_FmPcdKg->emptyClsPlanGrpId = ILLEGAL_CLS_PLAN;
2397*852ba100SJustin Hibbits
2398*852ba100SJustin Hibbits return p_FmPcdKg;
2399*852ba100SJustin Hibbits }
2400*852ba100SJustin Hibbits
KgInit(t_FmPcd * p_FmPcd)2401*852ba100SJustin Hibbits t_Error KgInit(t_FmPcd *p_FmPcd)
2402*852ba100SJustin Hibbits {
2403*852ba100SJustin Hibbits t_Error err = E_OK;
2404*852ba100SJustin Hibbits
2405*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->h_HwSpinlock = XX_InitSpinlock();
2406*852ba100SJustin Hibbits if (!p_FmPcd->p_FmPcdKg->h_HwSpinlock)
2407*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("FM KG HW spinlock"));
2408*852ba100SJustin Hibbits
2409*852ba100SJustin Hibbits if (p_FmPcd->guestId == NCSW_MASTER_ID)
2410*852ba100SJustin Hibbits err = KgInitMaster(p_FmPcd);
2411*852ba100SJustin Hibbits else
2412*852ba100SJustin Hibbits err = KgInitGuest(p_FmPcd);
2413*852ba100SJustin Hibbits
2414*852ba100SJustin Hibbits if (err != E_OK)
2415*852ba100SJustin Hibbits {
2416*852ba100SJustin Hibbits if (p_FmPcd->p_FmPcdKg->h_HwSpinlock)
2417*852ba100SJustin Hibbits XX_FreeSpinlock(p_FmPcd->p_FmPcdKg->h_HwSpinlock);
2418*852ba100SJustin Hibbits }
2419*852ba100SJustin Hibbits
2420*852ba100SJustin Hibbits return err;
2421*852ba100SJustin Hibbits }
2422*852ba100SJustin Hibbits
KgFree(t_FmPcd * p_FmPcd)2423*852ba100SJustin Hibbits t_Error KgFree(t_FmPcd *p_FmPcd)
2424*852ba100SJustin Hibbits {
2425*852ba100SJustin Hibbits t_FmPcdIpcKgSchemesParams kgAlloc;
2426*852ba100SJustin Hibbits t_Error err = E_OK;
2427*852ba100SJustin Hibbits t_FmPcdIpcMsg msg;
2428*852ba100SJustin Hibbits uint32_t replyLength;
2429*852ba100SJustin Hibbits t_FmPcdIpcReply reply;
2430*852ba100SJustin Hibbits
2431*852ba100SJustin Hibbits FmUnregisterIntr(p_FmPcd->h_Fm, e_FM_MOD_KG, 0, e_FM_INTR_TYPE_ERR);
2432*852ba100SJustin Hibbits
2433*852ba100SJustin Hibbits if (p_FmPcd->guestId == NCSW_MASTER_ID)
2434*852ba100SJustin Hibbits {
2435*852ba100SJustin Hibbits err = FmPcdKgFreeSchemes(p_FmPcd,
2436*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->numOfSchemes,
2437*852ba100SJustin Hibbits p_FmPcd->guestId,
2438*852ba100SJustin Hibbits p_FmPcd->p_FmPcdKg->schemesIds);
2439*852ba100SJustin Hibbits if (err)
2440*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
2441*852ba100SJustin Hibbits
2442*852ba100SJustin Hibbits if (p_FmPcd->p_FmPcdKg->h_HwSpinlock)
2443*852ba100SJustin Hibbits XX_FreeSpinlock(p_FmPcd->p_FmPcdKg->h_HwSpinlock);
2444*852ba100SJustin Hibbits
2445*852ba100SJustin Hibbits return E_OK;
2446*852ba100SJustin Hibbits }
2447*852ba100SJustin Hibbits
2448*852ba100SJustin Hibbits /* guest */
2449*852ba100SJustin Hibbits memset(&reply, 0, sizeof(reply));
2450*852ba100SJustin Hibbits memset(&msg, 0, sizeof(msg));
2451*852ba100SJustin Hibbits kgAlloc.numOfSchemes = p_FmPcd->p_FmPcdKg->numOfSchemes;
2452*852ba100SJustin Hibbits kgAlloc.guestId = p_FmPcd->guestId;
2453*852ba100SJustin Hibbits ASSERT_COND(kgAlloc.numOfSchemes < FM_PCD_KG_NUM_OF_SCHEMES);
2454*852ba100SJustin Hibbits memcpy(kgAlloc.schemesIds, p_FmPcd->p_FmPcdKg->schemesIds, (sizeof(uint8_t))*kgAlloc.numOfSchemes);
2455*852ba100SJustin Hibbits msg.msgId = FM_PCD_FREE_KG_SCHEMES;
2456*852ba100SJustin Hibbits memcpy(msg.msgBody, &kgAlloc, sizeof(kgAlloc));
2457*852ba100SJustin Hibbits replyLength = sizeof(uint32_t);
2458*852ba100SJustin Hibbits if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
2459*852ba100SJustin Hibbits (uint8_t*)&msg,
2460*852ba100SJustin Hibbits sizeof(msg.msgId) + sizeof(kgAlloc),
2461*852ba100SJustin Hibbits (uint8_t*)&reply,
2462*852ba100SJustin Hibbits &replyLength,
2463*852ba100SJustin Hibbits NULL,
2464*852ba100SJustin Hibbits NULL)) != E_OK)
2465*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
2466*852ba100SJustin Hibbits if (replyLength != sizeof(uint32_t))
2467*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
2468*852ba100SJustin Hibbits
2469*852ba100SJustin Hibbits if (p_FmPcd->p_FmPcdKg->h_HwSpinlock)
2470*852ba100SJustin Hibbits XX_FreeSpinlock(p_FmPcd->p_FmPcdKg->h_HwSpinlock);
2471*852ba100SJustin Hibbits
2472*852ba100SJustin Hibbits return (t_Error)reply.error;
2473*852ba100SJustin Hibbits }
2474*852ba100SJustin Hibbits
FmPcdKgSetOrBindToClsPlanGrp(t_Handle h_FmPcd,uint8_t hardwarePortId,uint8_t netEnvId,protocolOpt_t * p_OptArray,uint8_t * p_ClsPlanGrpId,bool * p_IsEmptyClsPlanGrp)2475*852ba100SJustin Hibbits t_Error FmPcdKgSetOrBindToClsPlanGrp(t_Handle h_FmPcd, uint8_t hardwarePortId, uint8_t netEnvId, protocolOpt_t *p_OptArray, uint8_t *p_ClsPlanGrpId, bool *p_IsEmptyClsPlanGrp)
2476*852ba100SJustin Hibbits {
2477*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
2478*852ba100SJustin Hibbits t_FmPcdKgInterModuleClsPlanGrpParams grpParams, *p_GrpParams;
2479*852ba100SJustin Hibbits t_FmPcdKgClsPlanGrp *p_ClsPlanGrp;
2480*852ba100SJustin Hibbits t_FmPcdKgInterModuleClsPlanSet *p_ClsPlanSet;
2481*852ba100SJustin Hibbits t_Error err;
2482*852ba100SJustin Hibbits
2483*852ba100SJustin Hibbits /* This function is issued only from FM_PORT_SetPcd which locked all PCD modules,
2484*852ba100SJustin Hibbits so no need for lock here */
2485*852ba100SJustin Hibbits
2486*852ba100SJustin Hibbits memset(&grpParams, 0, sizeof(grpParams));
2487*852ba100SJustin Hibbits grpParams.clsPlanGrpId = ILLEGAL_CLS_PLAN;
2488*852ba100SJustin Hibbits p_GrpParams = &grpParams;
2489*852ba100SJustin Hibbits
2490*852ba100SJustin Hibbits p_GrpParams->netEnvId = netEnvId;
2491*852ba100SJustin Hibbits
2492*852ba100SJustin Hibbits /* Get from the NetEnv the information of the clsPlan (can be already created,
2493*852ba100SJustin Hibbits * or needs to build) */
2494*852ba100SJustin Hibbits err = PcdGetClsPlanGrpParams(h_FmPcd, p_GrpParams);
2495*852ba100SJustin Hibbits if (err)
2496*852ba100SJustin Hibbits RETURN_ERROR(MINOR,err,NO_MSG);
2497*852ba100SJustin Hibbits
2498*852ba100SJustin Hibbits if (p_GrpParams->grpExists)
2499*852ba100SJustin Hibbits {
2500*852ba100SJustin Hibbits /* this group was already updated (at least) in SW */
2501*852ba100SJustin Hibbits *p_ClsPlanGrpId = p_GrpParams->clsPlanGrpId;
2502*852ba100SJustin Hibbits }
2503*852ba100SJustin Hibbits else
2504*852ba100SJustin Hibbits {
2505*852ba100SJustin Hibbits p_ClsPlanSet = (t_FmPcdKgInterModuleClsPlanSet *)XX_Malloc(sizeof(t_FmPcdKgInterModuleClsPlanSet));
2506*852ba100SJustin Hibbits if (!p_ClsPlanSet)
2507*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Classification plan set"));
2508*852ba100SJustin Hibbits memset(p_ClsPlanSet, 0, sizeof(t_FmPcdKgInterModuleClsPlanSet));
2509*852ba100SJustin Hibbits /* Build (in SW) the clsPlan parameters, including the vectors to be written to HW */
2510*852ba100SJustin Hibbits err = FmPcdKgBuildClsPlanGrp(h_FmPcd, p_GrpParams, p_ClsPlanSet);
2511*852ba100SJustin Hibbits if (err)
2512*852ba100SJustin Hibbits {
2513*852ba100SJustin Hibbits XX_Free(p_ClsPlanSet);
2514*852ba100SJustin Hibbits RETURN_ERROR(MINOR, err, NO_MSG);
2515*852ba100SJustin Hibbits }
2516*852ba100SJustin Hibbits *p_ClsPlanGrpId = p_GrpParams->clsPlanGrpId;
2517*852ba100SJustin Hibbits
2518*852ba100SJustin Hibbits if (p_FmPcd->h_Hc)
2519*852ba100SJustin Hibbits {
2520*852ba100SJustin Hibbits /* write clsPlan entries to memory */
2521*852ba100SJustin Hibbits err = FmHcPcdKgSetClsPlan(p_FmPcd->h_Hc, p_ClsPlanSet);
2522*852ba100SJustin Hibbits if (err)
2523*852ba100SJustin Hibbits {
2524*852ba100SJustin Hibbits XX_Free(p_ClsPlanSet);
2525*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
2526*852ba100SJustin Hibbits }
2527*852ba100SJustin Hibbits }
2528*852ba100SJustin Hibbits else
2529*852ba100SJustin Hibbits /* write clsPlan entries to memory */
2530*852ba100SJustin Hibbits KgSetClsPlan(p_FmPcd, p_ClsPlanSet);
2531*852ba100SJustin Hibbits
2532*852ba100SJustin Hibbits XX_Free(p_ClsPlanSet);
2533*852ba100SJustin Hibbits }
2534*852ba100SJustin Hibbits
2535*852ba100SJustin Hibbits /* Set caller parameters */
2536*852ba100SJustin Hibbits
2537*852ba100SJustin Hibbits /* mark if this is an empty classification group */
2538*852ba100SJustin Hibbits if (*p_ClsPlanGrpId == p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId)
2539*852ba100SJustin Hibbits *p_IsEmptyClsPlanGrp = TRUE;
2540*852ba100SJustin Hibbits else
2541*852ba100SJustin Hibbits *p_IsEmptyClsPlanGrp = FALSE;
2542*852ba100SJustin Hibbits
2543*852ba100SJustin Hibbits p_ClsPlanGrp = &p_FmPcd->p_FmPcdKg->clsPlanGrps[*p_ClsPlanGrpId];
2544*852ba100SJustin Hibbits
2545*852ba100SJustin Hibbits /* increment owners number */
2546*852ba100SJustin Hibbits p_ClsPlanGrp->owners++;
2547*852ba100SJustin Hibbits
2548*852ba100SJustin Hibbits /* copy options array for port */
2549*852ba100SJustin Hibbits memcpy(p_OptArray, &p_FmPcd->p_FmPcdKg->clsPlanGrps[*p_ClsPlanGrpId].optArray, FM_PCD_MAX_NUM_OF_OPTIONS(FM_PCD_MAX_NUM_OF_CLS_PLANS)*sizeof(protocolOpt_t));
2550*852ba100SJustin Hibbits
2551*852ba100SJustin Hibbits /* bind port to the new or existing group */
2552*852ba100SJustin Hibbits err = BindPortToClsPlanGrp(p_FmPcd, hardwarePortId, p_GrpParams->clsPlanGrpId);
2553*852ba100SJustin Hibbits if (err)
2554*852ba100SJustin Hibbits RETURN_ERROR(MINOR, err, NO_MSG);
2555*852ba100SJustin Hibbits
2556*852ba100SJustin Hibbits return E_OK;
2557*852ba100SJustin Hibbits }
2558*852ba100SJustin Hibbits
FmPcdKgDeleteOrUnbindPortToClsPlanGrp(t_Handle h_FmPcd,uint8_t hardwarePortId,uint8_t clsPlanGrpId)2559*852ba100SJustin Hibbits t_Error FmPcdKgDeleteOrUnbindPortToClsPlanGrp(t_Handle h_FmPcd, uint8_t hardwarePortId, uint8_t clsPlanGrpId)
2560*852ba100SJustin Hibbits {
2561*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd *)h_FmPcd;
2562*852ba100SJustin Hibbits t_FmPcdKgClsPlanGrp *p_ClsPlanGrp = &p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrpId];
2563*852ba100SJustin Hibbits t_FmPcdKgInterModuleClsPlanSet *p_ClsPlanSet;
2564*852ba100SJustin Hibbits t_Error err;
2565*852ba100SJustin Hibbits
2566*852ba100SJustin Hibbits /* This function is issued only from FM_PORT_DeletePcd which locked all PCD modules,
2567*852ba100SJustin Hibbits so no need for lock here */
2568*852ba100SJustin Hibbits
2569*852ba100SJustin Hibbits UnbindPortToClsPlanGrp(p_FmPcd, hardwarePortId);
2570*852ba100SJustin Hibbits
2571*852ba100SJustin Hibbits /* decrement owners number */
2572*852ba100SJustin Hibbits ASSERT_COND(p_ClsPlanGrp->owners);
2573*852ba100SJustin Hibbits p_ClsPlanGrp->owners--;
2574*852ba100SJustin Hibbits
2575*852ba100SJustin Hibbits if (!p_ClsPlanGrp->owners)
2576*852ba100SJustin Hibbits {
2577*852ba100SJustin Hibbits if (p_FmPcd->h_Hc)
2578*852ba100SJustin Hibbits {
2579*852ba100SJustin Hibbits err = FmHcPcdKgDeleteClsPlan(p_FmPcd->h_Hc, clsPlanGrpId);
2580*852ba100SJustin Hibbits return err;
2581*852ba100SJustin Hibbits }
2582*852ba100SJustin Hibbits else
2583*852ba100SJustin Hibbits {
2584*852ba100SJustin Hibbits /* clear clsPlan entries in memory */
2585*852ba100SJustin Hibbits p_ClsPlanSet = (t_FmPcdKgInterModuleClsPlanSet *)XX_Malloc(sizeof(t_FmPcdKgInterModuleClsPlanSet));
2586*852ba100SJustin Hibbits if (!p_ClsPlanSet)
2587*852ba100SJustin Hibbits {
2588*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Classification plan set"));
2589*852ba100SJustin Hibbits }
2590*852ba100SJustin Hibbits memset(p_ClsPlanSet, 0, sizeof(t_FmPcdKgInterModuleClsPlanSet));
2591*852ba100SJustin Hibbits
2592*852ba100SJustin Hibbits p_ClsPlanSet->baseEntry = p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrpId].baseEntry;
2593*852ba100SJustin Hibbits p_ClsPlanSet->numOfClsPlanEntries = p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrpId].sizeOfGrp;
2594*852ba100SJustin Hibbits KgSetClsPlan(p_FmPcd, p_ClsPlanSet);
2595*852ba100SJustin Hibbits XX_Free(p_ClsPlanSet);
2596*852ba100SJustin Hibbits
2597*852ba100SJustin Hibbits FmPcdKgDestroyClsPlanGrp(h_FmPcd, clsPlanGrpId);
2598*852ba100SJustin Hibbits }
2599*852ba100SJustin Hibbits }
2600*852ba100SJustin Hibbits return E_OK;
26010aeed3e9SJustin Hibbits }
26020aeed3e9SJustin Hibbits
FmPcdKgGetRequiredAction(t_Handle h_FmPcd,uint8_t schemeId)26030aeed3e9SJustin Hibbits uint32_t FmPcdKgGetRequiredAction(t_Handle h_FmPcd, uint8_t schemeId)
26040aeed3e9SJustin Hibbits {
26050aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
26060aeed3e9SJustin Hibbits ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[schemeId].valid);
26070aeed3e9SJustin Hibbits
26080aeed3e9SJustin Hibbits return p_FmPcd->p_FmPcdKg->schemes[schemeId].requiredAction;
26090aeed3e9SJustin Hibbits }
26100aeed3e9SJustin Hibbits
FmPcdKgGetRequiredActionFlag(t_Handle h_FmPcd,uint8_t schemeId)2611*852ba100SJustin Hibbits uint32_t FmPcdKgGetRequiredActionFlag(t_Handle h_FmPcd, uint8_t schemeId)
26120aeed3e9SJustin Hibbits {
26130aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
26140aeed3e9SJustin Hibbits
26150aeed3e9SJustin Hibbits ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[schemeId].valid);
26160aeed3e9SJustin Hibbits
2617*852ba100SJustin Hibbits return p_FmPcd->p_FmPcdKg->schemes[schemeId].requiredActionFlag;
26180aeed3e9SJustin Hibbits }
26190aeed3e9SJustin Hibbits
FmPcdKgIsDirectPlcr(t_Handle h_FmPcd,uint8_t schemeId)26200aeed3e9SJustin Hibbits bool FmPcdKgIsDirectPlcr(t_Handle h_FmPcd, uint8_t schemeId)
26210aeed3e9SJustin Hibbits {
26220aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
26230aeed3e9SJustin Hibbits
26240aeed3e9SJustin Hibbits ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[schemeId].valid);
26250aeed3e9SJustin Hibbits
26260aeed3e9SJustin Hibbits return p_FmPcd->p_FmPcdKg->schemes[schemeId].directPlcr;
26270aeed3e9SJustin Hibbits }
26280aeed3e9SJustin Hibbits
26290aeed3e9SJustin Hibbits
FmPcdKgGetRelativeProfileId(t_Handle h_FmPcd,uint8_t schemeId)26300aeed3e9SJustin Hibbits uint16_t FmPcdKgGetRelativeProfileId(t_Handle h_FmPcd, uint8_t schemeId)
26310aeed3e9SJustin Hibbits {
26320aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
26330aeed3e9SJustin Hibbits
26340aeed3e9SJustin Hibbits ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[schemeId].valid);
26350aeed3e9SJustin Hibbits
26360aeed3e9SJustin Hibbits return p_FmPcd->p_FmPcdKg->schemes[schemeId].relativeProfileId;
26370aeed3e9SJustin Hibbits }
26380aeed3e9SJustin Hibbits
FmPcdKgIsDistrOnPlcrProfile(t_Handle h_FmPcd,uint8_t schemeId)26390aeed3e9SJustin Hibbits bool FmPcdKgIsDistrOnPlcrProfile(t_Handle h_FmPcd, uint8_t schemeId)
26400aeed3e9SJustin Hibbits {
26410aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
26420aeed3e9SJustin Hibbits
26430aeed3e9SJustin Hibbits ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[schemeId].valid);
26440aeed3e9SJustin Hibbits
26450aeed3e9SJustin Hibbits if ((p_FmPcd->p_FmPcdKg->schemes[schemeId].extractedOrs &&
26460aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdKg->schemes[schemeId].bitOffsetInPlcrProfile) ||
26470aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdKg->schemes[schemeId].nextRelativePlcrProfile)
26480aeed3e9SJustin Hibbits return TRUE;
26490aeed3e9SJustin Hibbits else
26500aeed3e9SJustin Hibbits return FALSE;
26510aeed3e9SJustin Hibbits
26520aeed3e9SJustin Hibbits }
2653*852ba100SJustin Hibbits
FmPcdKgGetNextEngine(t_Handle h_FmPcd,uint8_t relativeSchemeId)2654*852ba100SJustin Hibbits e_FmPcdEngine FmPcdKgGetNextEngine(t_Handle h_FmPcd, uint8_t relativeSchemeId)
26550aeed3e9SJustin Hibbits {
26560aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
26570aeed3e9SJustin Hibbits
2658*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].valid);
26590aeed3e9SJustin Hibbits
2660*852ba100SJustin Hibbits return p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].nextEngine;
26610aeed3e9SJustin Hibbits }
26620aeed3e9SJustin Hibbits
FmPcdKgGetDoneAction(t_Handle h_FmPcd,uint8_t schemeId)26630aeed3e9SJustin Hibbits e_FmPcdDoneAction FmPcdKgGetDoneAction(t_Handle h_FmPcd, uint8_t schemeId)
26640aeed3e9SJustin Hibbits {
26650aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
26660aeed3e9SJustin Hibbits
26670aeed3e9SJustin Hibbits ASSERT_COND(p_FmPcd->p_FmPcdKg->schemes[schemeId].valid);
26680aeed3e9SJustin Hibbits
26690aeed3e9SJustin Hibbits return p_FmPcd->p_FmPcdKg->schemes[schemeId].doneAction;
26700aeed3e9SJustin Hibbits }
26710aeed3e9SJustin Hibbits
FmPcdKgUpdateRequiredAction(t_Handle h_Scheme,uint32_t requiredAction)2672*852ba100SJustin Hibbits void FmPcdKgUpdateRequiredAction(t_Handle h_Scheme, uint32_t requiredAction)
26730aeed3e9SJustin Hibbits {
2674*852ba100SJustin Hibbits t_FmPcdKgScheme *p_Scheme = (t_FmPcdKgScheme *)h_Scheme;
26750aeed3e9SJustin Hibbits
2676*852ba100SJustin Hibbits /* this routine is protected by calling routine */
26770aeed3e9SJustin Hibbits
2678*852ba100SJustin Hibbits ASSERT_COND(p_Scheme->valid);
26790aeed3e9SJustin Hibbits
2680*852ba100SJustin Hibbits p_Scheme->requiredAction |= requiredAction;
26810aeed3e9SJustin Hibbits }
26820aeed3e9SJustin Hibbits
FmPcdKgHwSchemeIsValid(uint32_t schemeModeReg)26830aeed3e9SJustin Hibbits bool FmPcdKgHwSchemeIsValid(uint32_t schemeModeReg)
26840aeed3e9SJustin Hibbits {
2685*852ba100SJustin Hibbits return (bool)!!(schemeModeReg & KG_SCH_MODE_EN);
26860aeed3e9SJustin Hibbits }
26870aeed3e9SJustin Hibbits
FmPcdKgBuildWriteSchemeActionReg(uint8_t schemeId,bool updateCounter)26880aeed3e9SJustin Hibbits uint32_t FmPcdKgBuildWriteSchemeActionReg(uint8_t schemeId, bool updateCounter)
26890aeed3e9SJustin Hibbits {
26900aeed3e9SJustin Hibbits return (uint32_t)(((uint32_t)schemeId << FM_PCD_KG_KGAR_NUM_SHIFT) |
2691*852ba100SJustin Hibbits FM_KG_KGAR_GO |
2692*852ba100SJustin Hibbits FM_KG_KGAR_WRITE |
2693*852ba100SJustin Hibbits FM_KG_KGAR_SEL_SCHEME_ENTRY |
26940aeed3e9SJustin Hibbits DUMMY_PORT_ID |
2695*852ba100SJustin Hibbits (updateCounter ? FM_KG_KGAR_SCM_WSEL_UPDATE_CNT:0));
26960aeed3e9SJustin Hibbits }
26970aeed3e9SJustin Hibbits
FmPcdKgBuildReadSchemeActionReg(uint8_t schemeId)26980aeed3e9SJustin Hibbits uint32_t FmPcdKgBuildReadSchemeActionReg(uint8_t schemeId)
26990aeed3e9SJustin Hibbits {
27000aeed3e9SJustin Hibbits return (uint32_t)(((uint32_t)schemeId << FM_PCD_KG_KGAR_NUM_SHIFT) |
2701*852ba100SJustin Hibbits FM_KG_KGAR_GO |
2702*852ba100SJustin Hibbits FM_KG_KGAR_READ |
2703*852ba100SJustin Hibbits FM_KG_KGAR_SEL_SCHEME_ENTRY |
27040aeed3e9SJustin Hibbits DUMMY_PORT_ID |
2705*852ba100SJustin Hibbits FM_KG_KGAR_SCM_WSEL_UPDATE_CNT);
27060aeed3e9SJustin Hibbits
27070aeed3e9SJustin Hibbits }
27080aeed3e9SJustin Hibbits
FmPcdKgBuildWriteClsPlanBlockActionReg(uint8_t grpId)27090aeed3e9SJustin Hibbits uint32_t FmPcdKgBuildWriteClsPlanBlockActionReg(uint8_t grpId)
27100aeed3e9SJustin Hibbits {
2711*852ba100SJustin Hibbits return (uint32_t)(FM_KG_KGAR_GO |
2712*852ba100SJustin Hibbits FM_KG_KGAR_WRITE |
27130aeed3e9SJustin Hibbits FM_PCD_KG_KGAR_SEL_CLS_PLAN_ENTRY |
27140aeed3e9SJustin Hibbits DUMMY_PORT_ID |
27150aeed3e9SJustin Hibbits ((uint32_t)grpId << FM_PCD_KG_KGAR_NUM_SHIFT) |
27160aeed3e9SJustin Hibbits FM_PCD_KG_KGAR_WSEL_MASK);
27170aeed3e9SJustin Hibbits
27180aeed3e9SJustin Hibbits /* if we ever want to write 1 by 1, use:
2719*852ba100SJustin Hibbits sel = (uint8_t)(0x01 << (7- (entryId % CLS_PLAN_NUM_PER_GRP)));
2720*852ba100SJustin Hibbits */
27210aeed3e9SJustin Hibbits }
27220aeed3e9SJustin Hibbits
FmPcdKgBuildWritePortSchemeBindActionReg(uint8_t hardwarePortId)27230aeed3e9SJustin Hibbits uint32_t FmPcdKgBuildWritePortSchemeBindActionReg(uint8_t hardwarePortId)
27240aeed3e9SJustin Hibbits {
27250aeed3e9SJustin Hibbits
2726*852ba100SJustin Hibbits return (uint32_t)(FM_KG_KGAR_GO |
2727*852ba100SJustin Hibbits FM_KG_KGAR_WRITE |
27280aeed3e9SJustin Hibbits FM_PCD_KG_KGAR_SEL_PORT_ENTRY |
27290aeed3e9SJustin Hibbits hardwarePortId |
27300aeed3e9SJustin Hibbits FM_PCD_KG_KGAR_SEL_PORT_WSEL_SP);
27310aeed3e9SJustin Hibbits }
27320aeed3e9SJustin Hibbits
FmPcdKgBuildReadPortSchemeBindActionReg(uint8_t hardwarePortId)27330aeed3e9SJustin Hibbits uint32_t FmPcdKgBuildReadPortSchemeBindActionReg(uint8_t hardwarePortId)
27340aeed3e9SJustin Hibbits {
27350aeed3e9SJustin Hibbits
2736*852ba100SJustin Hibbits return (uint32_t)(FM_KG_KGAR_GO |
2737*852ba100SJustin Hibbits FM_KG_KGAR_READ |
27380aeed3e9SJustin Hibbits FM_PCD_KG_KGAR_SEL_PORT_ENTRY |
27390aeed3e9SJustin Hibbits hardwarePortId |
27400aeed3e9SJustin Hibbits FM_PCD_KG_KGAR_SEL_PORT_WSEL_SP);
27410aeed3e9SJustin Hibbits }
2742*852ba100SJustin Hibbits
FmPcdKgBuildWritePortClsPlanBindActionReg(uint8_t hardwarePortId)27430aeed3e9SJustin Hibbits uint32_t FmPcdKgBuildWritePortClsPlanBindActionReg(uint8_t hardwarePortId)
27440aeed3e9SJustin Hibbits {
27450aeed3e9SJustin Hibbits
2746*852ba100SJustin Hibbits return (uint32_t)(FM_KG_KGAR_GO |
2747*852ba100SJustin Hibbits FM_KG_KGAR_WRITE |
27480aeed3e9SJustin Hibbits FM_PCD_KG_KGAR_SEL_PORT_ENTRY |
27490aeed3e9SJustin Hibbits hardwarePortId |
27500aeed3e9SJustin Hibbits FM_PCD_KG_KGAR_SEL_PORT_WSEL_CPP);
27510aeed3e9SJustin Hibbits }
27520aeed3e9SJustin Hibbits
FmPcdKgGetClsPlanGrpBase(t_Handle h_FmPcd,uint8_t clsPlanGrp)27530aeed3e9SJustin Hibbits uint8_t FmPcdKgGetClsPlanGrpBase(t_Handle h_FmPcd, uint8_t clsPlanGrp)
27540aeed3e9SJustin Hibbits {
27550aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
27560aeed3e9SJustin Hibbits
27570aeed3e9SJustin Hibbits return p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrp].baseEntry;
27580aeed3e9SJustin Hibbits }
27590aeed3e9SJustin Hibbits
FmPcdKgGetClsPlanGrpSize(t_Handle h_FmPcd,uint8_t clsPlanGrp)27600aeed3e9SJustin Hibbits uint16_t FmPcdKgGetClsPlanGrpSize(t_Handle h_FmPcd, uint8_t clsPlanGrp)
27610aeed3e9SJustin Hibbits {
27620aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
27630aeed3e9SJustin Hibbits
27640aeed3e9SJustin Hibbits return p_FmPcd->p_FmPcdKg->clsPlanGrps[clsPlanGrp].sizeOfGrp;
27650aeed3e9SJustin Hibbits }
27660aeed3e9SJustin Hibbits
27670aeed3e9SJustin Hibbits
FmPcdKgGetSchemeId(t_Handle h_Scheme)2768*852ba100SJustin Hibbits uint8_t FmPcdKgGetSchemeId(t_Handle h_Scheme)
2769*852ba100SJustin Hibbits {
2770*852ba100SJustin Hibbits return ((t_FmPcdKgScheme*)h_Scheme)->schemeId;
2771*852ba100SJustin Hibbits
27720aeed3e9SJustin Hibbits }
27730aeed3e9SJustin Hibbits
2774*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
FmPcdKgGetVspe(t_Handle h_Scheme)2775*852ba100SJustin Hibbits bool FmPcdKgGetVspe(t_Handle h_Scheme)
27760aeed3e9SJustin Hibbits {
2777*852ba100SJustin Hibbits return ((t_FmPcdKgScheme*)h_Scheme)->vspe;
27780aeed3e9SJustin Hibbits
27790aeed3e9SJustin Hibbits }
2780*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
27810aeed3e9SJustin Hibbits
FmPcdKgGetRelativeSchemeId(t_Handle h_FmPcd,uint8_t schemeId)27820aeed3e9SJustin Hibbits uint8_t FmPcdKgGetRelativeSchemeId(t_Handle h_FmPcd, uint8_t schemeId)
27830aeed3e9SJustin Hibbits {
27840aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
27850aeed3e9SJustin Hibbits uint8_t i;
27860aeed3e9SJustin Hibbits
27870aeed3e9SJustin Hibbits for (i = 0;i<p_FmPcd->p_FmPcdKg->numOfSchemes;i++)
27880aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdKg->schemesIds[i] == schemeId)
27890aeed3e9SJustin Hibbits return i;
27900aeed3e9SJustin Hibbits
27910aeed3e9SJustin Hibbits if (i == p_FmPcd->p_FmPcdKg->numOfSchemes)
27920aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, ("Scheme is out of partition range"));
27930aeed3e9SJustin Hibbits
27940aeed3e9SJustin Hibbits return FM_PCD_KG_NUM_OF_SCHEMES;
27950aeed3e9SJustin Hibbits }
27960aeed3e9SJustin Hibbits
FmPcdKgGetSchemeHandle(t_Handle h_FmPcd,uint8_t relativeSchemeId)2797*852ba100SJustin Hibbits t_Handle FmPcdKgGetSchemeHandle(t_Handle h_FmPcd, uint8_t relativeSchemeId)
2798*852ba100SJustin Hibbits {
2799*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
2800*852ba100SJustin Hibbits
2801*852ba100SJustin Hibbits ASSERT_COND(p_FmPcd);
2802*852ba100SJustin Hibbits
2803*852ba100SJustin Hibbits /* check that schemeId is in range */
2804*852ba100SJustin Hibbits if (relativeSchemeId >= p_FmPcd->p_FmPcdKg->numOfSchemes)
2805*852ba100SJustin Hibbits {
2806*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, ("relative-scheme-id %d!", relativeSchemeId));
2807*852ba100SJustin Hibbits return NULL;
2808*852ba100SJustin Hibbits }
2809*852ba100SJustin Hibbits
2810*852ba100SJustin Hibbits if (!FmPcdKgIsSchemeValidSw(&p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId]))
2811*852ba100SJustin Hibbits return NULL;
2812*852ba100SJustin Hibbits
2813*852ba100SJustin Hibbits return &p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId];
2814*852ba100SJustin Hibbits }
2815*852ba100SJustin Hibbits
FmPcdKgIsSchemeHasOwners(t_Handle h_Scheme)2816*852ba100SJustin Hibbits bool FmPcdKgIsSchemeHasOwners(t_Handle h_Scheme)
2817*852ba100SJustin Hibbits {
2818*852ba100SJustin Hibbits return (((t_FmPcdKgScheme*)h_Scheme)->owners == 0)?FALSE:TRUE;
2819*852ba100SJustin Hibbits }
2820*852ba100SJustin Hibbits
FmPcdKgCcGetSetParams(t_Handle h_FmPcd,t_Handle h_Scheme,uint32_t requiredAction,uint32_t value)2821*852ba100SJustin Hibbits t_Error FmPcdKgCcGetSetParams(t_Handle h_FmPcd, t_Handle h_Scheme, uint32_t requiredAction, uint32_t value)
28220aeed3e9SJustin Hibbits {
28230aeed3e9SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
28240aeed3e9SJustin Hibbits uint8_t relativeSchemeId, physicalSchemeId;
28250aeed3e9SJustin Hibbits uint32_t tmpKgarReg, tmpReg32 = 0, intFlags;
28260aeed3e9SJustin Hibbits t_Error err;
2827*852ba100SJustin Hibbits t_FmPcdKgScheme *p_Scheme = (t_FmPcdKgScheme*)h_Scheme;
28280aeed3e9SJustin Hibbits
28290aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, 0);
28300aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_FmPcd->p_FmPcdKg, E_INVALID_HANDLE, 0);
28310aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, 0);
28320aeed3e9SJustin Hibbits
2833*852ba100SJustin Hibbits /* Calling function locked all PCD modules, so no need to lock here */
28340aeed3e9SJustin Hibbits
2835*852ba100SJustin Hibbits if (!FmPcdKgIsSchemeValidSw(h_Scheme))
2836*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is Invalid"));
2837*852ba100SJustin Hibbits
2838*852ba100SJustin Hibbits if (p_FmPcd->h_Hc)
2839*852ba100SJustin Hibbits {
2840*852ba100SJustin Hibbits err = FmHcPcdKgCcGetSetParams(p_FmPcd->h_Hc, h_Scheme, requiredAction, value);
2841*852ba100SJustin Hibbits
2842*852ba100SJustin Hibbits UpdateRequiredActionFlag(h_Scheme,TRUE);
2843*852ba100SJustin Hibbits FmPcdKgUpdateRequiredAction(h_Scheme,requiredAction);
2844*852ba100SJustin Hibbits return err;
2845*852ba100SJustin Hibbits }
2846*852ba100SJustin Hibbits
2847*852ba100SJustin Hibbits physicalSchemeId = p_Scheme->schemeId;
28480aeed3e9SJustin Hibbits
28490aeed3e9SJustin Hibbits relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmPcd, physicalSchemeId);
28500aeed3e9SJustin Hibbits if (relativeSchemeId >= FM_PCD_KG_NUM_OF_SCHEMES)
28510aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
28520aeed3e9SJustin Hibbits
2853*852ba100SJustin Hibbits if (!p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].requiredActionFlag ||
28540aeed3e9SJustin Hibbits !(p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].requiredAction & requiredAction))
28550aeed3e9SJustin Hibbits {
28560aeed3e9SJustin Hibbits if (requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA)
28570aeed3e9SJustin Hibbits {
28580aeed3e9SJustin Hibbits switch (p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].nextEngine)
28590aeed3e9SJustin Hibbits {
28600aeed3e9SJustin Hibbits case (e_FM_PCD_DONE):
28610aeed3e9SJustin Hibbits if (p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].doneAction == e_FM_PCD_ENQ_FRAME)
28620aeed3e9SJustin Hibbits {
28630aeed3e9SJustin Hibbits tmpKgarReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
2864*852ba100SJustin Hibbits intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
28650aeed3e9SJustin Hibbits WriteKgarWait(p_FmPcd, tmpKgarReg);
2866*852ba100SJustin Hibbits tmpReg32 = GET_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode);
28670aeed3e9SJustin Hibbits ASSERT_COND(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME));
2868*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode, tmpReg32 | NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA);
28690aeed3e9SJustin Hibbits /* call indirect command for scheme write */
28700aeed3e9SJustin Hibbits tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
28710aeed3e9SJustin Hibbits WriteKgarWait(p_FmPcd, tmpKgarReg);
2872*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
28730aeed3e9SJustin Hibbits }
28740aeed3e9SJustin Hibbits break;
28750aeed3e9SJustin Hibbits case (e_FM_PCD_PLCR):
28760aeed3e9SJustin Hibbits if (!p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].directPlcr ||
28770aeed3e9SJustin Hibbits (p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].extractedOrs &&
28780aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].bitOffsetInPlcrProfile) ||
28790aeed3e9SJustin Hibbits p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].nextRelativePlcrProfile)
28800aeed3e9SJustin Hibbits {
28810aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("In this situation PP can not be with distribution and has to be shared"));
28820aeed3e9SJustin Hibbits }
28830aeed3e9SJustin Hibbits err = FmPcdPlcrCcGetSetParams(h_FmPcd, p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].relativeProfileId, requiredAction);
28840aeed3e9SJustin Hibbits if (err)
28850aeed3e9SJustin Hibbits {
28860aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
28870aeed3e9SJustin Hibbits }
28880aeed3e9SJustin Hibbits break;
28890aeed3e9SJustin Hibbits default:
28900aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE,("in this situation the next engine after scheme can be or PLCR or ENQ_FRAME"));
28910aeed3e9SJustin Hibbits }
28920aeed3e9SJustin Hibbits }
2893*852ba100SJustin Hibbits if (requiredAction & UPDATE_KG_NIA_CC_WA)
2894*852ba100SJustin Hibbits {
2895*852ba100SJustin Hibbits if (p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId].nextEngine == e_FM_PCD_CC)
2896*852ba100SJustin Hibbits {
2897*852ba100SJustin Hibbits tmpKgarReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
2898*852ba100SJustin Hibbits intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
2899*852ba100SJustin Hibbits WriteKgarWait(p_FmPcd, tmpKgarReg);
2900*852ba100SJustin Hibbits tmpReg32 = GET_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode);
2901*852ba100SJustin Hibbits ASSERT_COND(tmpReg32 & (NIA_ENG_FM_CTL | NIA_FM_CTL_AC_CC));
2902*852ba100SJustin Hibbits tmpReg32 &= ~NIA_FM_CTL_AC_CC;
2903*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode, tmpReg32 | NIA_FM_CTL_AC_PRE_CC);
2904*852ba100SJustin Hibbits /* call indirect command for scheme write */
2905*852ba100SJustin Hibbits tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
2906*852ba100SJustin Hibbits WriteKgarWait(p_FmPcd, tmpKgarReg);
2907*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
29080aeed3e9SJustin Hibbits }
2909*852ba100SJustin Hibbits }
2910*852ba100SJustin Hibbits if (requiredAction & UPDATE_KG_OPT_MODE)
2911*852ba100SJustin Hibbits {
2912*852ba100SJustin Hibbits tmpKgarReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
2913*852ba100SJustin Hibbits intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
2914*852ba100SJustin Hibbits WriteKgarWait(p_FmPcd, tmpKgarReg);
2915*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_om, value);
2916*852ba100SJustin Hibbits /* call indirect command for scheme write */
2917*852ba100SJustin Hibbits tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
2918*852ba100SJustin Hibbits WriteKgarWait(p_FmPcd, tmpKgarReg);
2919*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
2920*852ba100SJustin Hibbits }
2921*852ba100SJustin Hibbits if (requiredAction & UPDATE_KG_NIA)
2922*852ba100SJustin Hibbits {
2923*852ba100SJustin Hibbits tmpKgarReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
2924*852ba100SJustin Hibbits intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
2925*852ba100SJustin Hibbits WriteKgarWait(p_FmPcd, tmpKgarReg);
2926*852ba100SJustin Hibbits tmpReg32 = GET_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode);
2927*852ba100SJustin Hibbits tmpReg32 &= ~(NIA_ENG_MASK | NIA_AC_MASK);
2928*852ba100SJustin Hibbits tmpReg32 |= value;
2929*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode, tmpReg32);
2930*852ba100SJustin Hibbits /* call indirect command for scheme write */
2931*852ba100SJustin Hibbits tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
2932*852ba100SJustin Hibbits WriteKgarWait(p_FmPcd, tmpKgarReg);
2933*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
2934*852ba100SJustin Hibbits }
2935*852ba100SJustin Hibbits }
29360aeed3e9SJustin Hibbits
2937*852ba100SJustin Hibbits UpdateRequiredActionFlag(h_Scheme, TRUE);
2938*852ba100SJustin Hibbits FmPcdKgUpdateRequiredAction(h_Scheme, requiredAction);
2939*852ba100SJustin Hibbits
29400aeed3e9SJustin Hibbits return E_OK;
29410aeed3e9SJustin Hibbits }
2942*852ba100SJustin Hibbits /*********************** End of inter-module routines ************************/
29430aeed3e9SJustin Hibbits
2944*852ba100SJustin Hibbits
2945*852ba100SJustin Hibbits /****************************************/
2946*852ba100SJustin Hibbits /* API routines */
2947*852ba100SJustin Hibbits /****************************************/
2948*852ba100SJustin Hibbits
FM_PCD_KgSchemeSet(t_Handle h_FmPcd,t_FmPcdKgSchemeParams * p_SchemeParams)2949*852ba100SJustin Hibbits t_Handle FM_PCD_KgSchemeSet(t_Handle h_FmPcd, t_FmPcdKgSchemeParams *p_SchemeParams)
29500aeed3e9SJustin Hibbits {
2951*852ba100SJustin Hibbits t_FmPcd *p_FmPcd;
2952*852ba100SJustin Hibbits struct fman_kg_scheme_regs schemeRegs;
2953*852ba100SJustin Hibbits struct fman_kg_scheme_regs *p_MemRegs;
29540aeed3e9SJustin Hibbits uint8_t i;
29550aeed3e9SJustin Hibbits t_Error err = E_OK;
29560aeed3e9SJustin Hibbits uint32_t tmpKgarReg;
29570aeed3e9SJustin Hibbits uint32_t intFlags;
2958*852ba100SJustin Hibbits uint8_t physicalSchemeId, relativeSchemeId = 0;
2959*852ba100SJustin Hibbits t_FmPcdKgScheme *p_Scheme;
2960*852ba100SJustin Hibbits
2961*852ba100SJustin Hibbits if (p_SchemeParams->modify)
2962*852ba100SJustin Hibbits {
2963*852ba100SJustin Hibbits p_Scheme = (t_FmPcdKgScheme *)p_SchemeParams->id.h_Scheme;
2964*852ba100SJustin Hibbits p_FmPcd = p_Scheme->h_FmPcd;
29650aeed3e9SJustin Hibbits
29660aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_FmPcd, E_INVALID_HANDLE, NULL);
29670aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_FmPcd->p_FmPcdKg, E_INVALID_HANDLE, NULL);
29680aeed3e9SJustin Hibbits
2969*852ba100SJustin Hibbits if (!FmPcdKgIsSchemeValidSw(p_Scheme))
29700aeed3e9SJustin Hibbits {
29710aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_ALREADY_EXISTS,
2972*852ba100SJustin Hibbits ("Scheme is invalid"));
2973*852ba100SJustin Hibbits return NULL;
2974*852ba100SJustin Hibbits }
2975*852ba100SJustin Hibbits
2976*852ba100SJustin Hibbits if (!KgSchemeFlagTryLock(p_Scheme))
2977*852ba100SJustin Hibbits {
2978*852ba100SJustin Hibbits DBG(TRACE, ("Scheme Try Lock - BUSY"));
2979*852ba100SJustin Hibbits /* Signal to caller BUSY condition */
2980*852ba100SJustin Hibbits p_SchemeParams->id.h_Scheme = NULL;
29810aeed3e9SJustin Hibbits return NULL;
29820aeed3e9SJustin Hibbits }
29830aeed3e9SJustin Hibbits }
29840aeed3e9SJustin Hibbits else
29850aeed3e9SJustin Hibbits {
2986*852ba100SJustin Hibbits p_FmPcd = (t_FmPcd*)h_FmPcd;
29870aeed3e9SJustin Hibbits
2988*852ba100SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_FmPcd, E_INVALID_HANDLE, NULL);
2989*852ba100SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_FmPcd->p_FmPcdKg, E_INVALID_HANDLE, NULL);
29900aeed3e9SJustin Hibbits
2991*852ba100SJustin Hibbits relativeSchemeId = p_SchemeParams->id.relativeSchemeId;
29920aeed3e9SJustin Hibbits /* check that schemeId is in range */
2993*852ba100SJustin Hibbits if (relativeSchemeId >= p_FmPcd->p_FmPcdKg->numOfSchemes)
29940aeed3e9SJustin Hibbits {
2995*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, ("relative-scheme-id %d!", relativeSchemeId));
29960aeed3e9SJustin Hibbits return NULL;
29970aeed3e9SJustin Hibbits }
29980aeed3e9SJustin Hibbits
2999*852ba100SJustin Hibbits p_Scheme = &p_FmPcd->p_FmPcdKg->schemes[relativeSchemeId];
3000*852ba100SJustin Hibbits if (FmPcdKgIsSchemeValidSw(p_Scheme))
3001*852ba100SJustin Hibbits {
3002*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_ALREADY_EXISTS,
3003*852ba100SJustin Hibbits ("Scheme id (%d)!", relativeSchemeId));
30040aeed3e9SJustin Hibbits return NULL;
30050aeed3e9SJustin Hibbits }
3006*852ba100SJustin Hibbits /* Clear all fields, scheme may have beed previously used */
3007*852ba100SJustin Hibbits memset(p_Scheme, 0, sizeof(t_FmPcdKgScheme));
30080aeed3e9SJustin Hibbits
3009*852ba100SJustin Hibbits p_Scheme->schemeId = p_FmPcd->p_FmPcdKg->schemesIds[relativeSchemeId];
3010*852ba100SJustin Hibbits p_Scheme->h_FmPcd = p_FmPcd;
3011*852ba100SJustin Hibbits
3012*852ba100SJustin Hibbits p_Scheme->p_Lock = FmPcdAcquireLock(p_FmPcd);
3013*852ba100SJustin Hibbits if (!p_Scheme->p_Lock)
3014*852ba100SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_AVAILABLE, ("FM KG Scheme lock obj!"));
3015*852ba100SJustin Hibbits }
3016*852ba100SJustin Hibbits
3017*852ba100SJustin Hibbits err = BuildSchemeRegs((t_Handle)p_Scheme, p_SchemeParams, &schemeRegs);
30180aeed3e9SJustin Hibbits if (err)
30190aeed3e9SJustin Hibbits {
30200aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, err, NO_MSG);
3021*852ba100SJustin Hibbits if (p_SchemeParams->modify)
3022*852ba100SJustin Hibbits KgSchemeFlagUnlock(p_Scheme);
3023*852ba100SJustin Hibbits if (!p_SchemeParams->modify &&
3024*852ba100SJustin Hibbits p_Scheme->p_Lock)
3025*852ba100SJustin Hibbits FmPcdReleaseLock(p_FmPcd, p_Scheme->p_Lock);
30260aeed3e9SJustin Hibbits return NULL;
30270aeed3e9SJustin Hibbits }
30280aeed3e9SJustin Hibbits
3029*852ba100SJustin Hibbits if (p_FmPcd->h_Hc)
3030*852ba100SJustin Hibbits {
3031*852ba100SJustin Hibbits err = FmHcPcdKgSetScheme(p_FmPcd->h_Hc,
3032*852ba100SJustin Hibbits (t_Handle)p_Scheme,
3033*852ba100SJustin Hibbits &schemeRegs,
3034*852ba100SJustin Hibbits p_SchemeParams->schemeCounter.update);
3035*852ba100SJustin Hibbits if (p_SchemeParams->modify)
3036*852ba100SJustin Hibbits KgSchemeFlagUnlock(p_Scheme);
3037*852ba100SJustin Hibbits if (err)
3038*852ba100SJustin Hibbits {
3039*852ba100SJustin Hibbits if (!p_SchemeParams->modify &&
3040*852ba100SJustin Hibbits p_Scheme->p_Lock)
3041*852ba100SJustin Hibbits FmPcdReleaseLock(p_FmPcd, p_Scheme->p_Lock);
3042*852ba100SJustin Hibbits return NULL;
3043*852ba100SJustin Hibbits }
3044*852ba100SJustin Hibbits if (!p_SchemeParams->modify)
3045*852ba100SJustin Hibbits ValidateSchemeSw(p_Scheme);
3046*852ba100SJustin Hibbits return (t_Handle)p_Scheme;
3047*852ba100SJustin Hibbits }
3048*852ba100SJustin Hibbits
3049*852ba100SJustin Hibbits physicalSchemeId = p_Scheme->schemeId;
3050*852ba100SJustin Hibbits
30510aeed3e9SJustin Hibbits /* configure all 21 scheme registers */
3052*852ba100SJustin Hibbits p_MemRegs = &p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs;
3053*852ba100SJustin Hibbits intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
30540aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_ppc, schemeRegs.kgse_ppc);
30550aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_ccbs, schemeRegs.kgse_ccbs);
30560aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_mode, schemeRegs.kgse_mode);
30570aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_mv, schemeRegs.kgse_mv);
30580aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_dv0, schemeRegs.kgse_dv0);
30590aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_dv1, schemeRegs.kgse_dv1);
30600aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_ekdv, schemeRegs.kgse_ekdv);
30610aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_ekfc, schemeRegs.kgse_ekfc);
30620aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_bmch, schemeRegs.kgse_bmch);
30630aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_bmcl, schemeRegs.kgse_bmcl);
30640aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_hc, schemeRegs.kgse_hc);
30650aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_spc, schemeRegs.kgse_spc);
30660aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_fqb, schemeRegs.kgse_fqb);
3067*852ba100SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_om, schemeRegs.kgse_om);
3068*852ba100SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_vsp, schemeRegs.kgse_vsp);
3069*852ba100SJustin Hibbits for (i=0 ; i<FM_KG_NUM_OF_GENERIC_REGS ; i++)
30700aeed3e9SJustin Hibbits WRITE_UINT32(p_MemRegs->kgse_gec[i], schemeRegs.kgse_gec[i]);
30710aeed3e9SJustin Hibbits
30720aeed3e9SJustin Hibbits /* call indirect command for scheme write */
3073*852ba100SJustin Hibbits tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, p_SchemeParams->schemeCounter.update);
30740aeed3e9SJustin Hibbits
30750aeed3e9SJustin Hibbits WriteKgarWait(p_FmPcd, tmpKgarReg);
3076*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
30770aeed3e9SJustin Hibbits
3078*852ba100SJustin Hibbits if (!p_SchemeParams->modify)
3079*852ba100SJustin Hibbits ValidateSchemeSw(p_Scheme);
3080*852ba100SJustin Hibbits else
3081*852ba100SJustin Hibbits KgSchemeFlagUnlock(p_Scheme);
30820aeed3e9SJustin Hibbits
3083*852ba100SJustin Hibbits return (t_Handle)p_Scheme;
30840aeed3e9SJustin Hibbits }
30850aeed3e9SJustin Hibbits
FM_PCD_KgSchemeDelete(t_Handle h_Scheme)3086*852ba100SJustin Hibbits t_Error FM_PCD_KgSchemeDelete(t_Handle h_Scheme)
30870aeed3e9SJustin Hibbits {
3088*852ba100SJustin Hibbits t_FmPcd *p_FmPcd;
30890aeed3e9SJustin Hibbits uint8_t physicalSchemeId;
30900aeed3e9SJustin Hibbits uint32_t tmpKgarReg, intFlags;
30910aeed3e9SJustin Hibbits t_Error err = E_OK;
3092*852ba100SJustin Hibbits t_FmPcdKgScheme *p_Scheme = (t_FmPcdKgScheme *)h_Scheme;
30930aeed3e9SJustin Hibbits
3094*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_Scheme, E_INVALID_HANDLE);
30950aeed3e9SJustin Hibbits
3096*852ba100SJustin Hibbits p_FmPcd = (t_FmPcd*)(p_Scheme->h_FmPcd);
30970aeed3e9SJustin Hibbits
3098*852ba100SJustin Hibbits UpdateRequiredActionFlag(h_Scheme, FALSE);
30990aeed3e9SJustin Hibbits
31000aeed3e9SJustin Hibbits /* check that no port is bound to this scheme */
3101*852ba100SJustin Hibbits err = InvalidateSchemeSw(h_Scheme);
31020aeed3e9SJustin Hibbits if (err)
31030aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, err, NO_MSG);
31040aeed3e9SJustin Hibbits
3105*852ba100SJustin Hibbits if (p_FmPcd->h_Hc)
3106*852ba100SJustin Hibbits {
3107*852ba100SJustin Hibbits err = FmHcPcdKgDeleteScheme(p_FmPcd->h_Hc, h_Scheme);
3108*852ba100SJustin Hibbits if (p_Scheme->p_Lock)
3109*852ba100SJustin Hibbits FmPcdReleaseLock(p_FmPcd, p_Scheme->p_Lock);
3110*852ba100SJustin Hibbits return err;
3111*852ba100SJustin Hibbits }
3112*852ba100SJustin Hibbits
3113*852ba100SJustin Hibbits physicalSchemeId = ((t_FmPcdKgScheme *)h_Scheme)->schemeId;
3114*852ba100SJustin Hibbits
3115*852ba100SJustin Hibbits intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
31160aeed3e9SJustin Hibbits /* clear mode register, including enable bit */
3117*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode, 0);
31180aeed3e9SJustin Hibbits
31190aeed3e9SJustin Hibbits /* call indirect command for scheme write */
31200aeed3e9SJustin Hibbits tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE);
31210aeed3e9SJustin Hibbits
31220aeed3e9SJustin Hibbits WriteKgarWait(p_FmPcd, tmpKgarReg);
3123*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
31240aeed3e9SJustin Hibbits
3125*852ba100SJustin Hibbits if (p_Scheme->p_Lock)
3126*852ba100SJustin Hibbits FmPcdReleaseLock(p_FmPcd, p_Scheme->p_Lock);
31270aeed3e9SJustin Hibbits
31280aeed3e9SJustin Hibbits return E_OK;
31290aeed3e9SJustin Hibbits }
31300aeed3e9SJustin Hibbits
FM_PCD_KgSchemeGetCounter(t_Handle h_Scheme)3131*852ba100SJustin Hibbits uint32_t FM_PCD_KgSchemeGetCounter(t_Handle h_Scheme)
31320aeed3e9SJustin Hibbits {
3133*852ba100SJustin Hibbits t_FmPcd *p_FmPcd;
31340aeed3e9SJustin Hibbits uint32_t tmpKgarReg, spc, intFlags;
31350aeed3e9SJustin Hibbits uint8_t physicalSchemeId;
31360aeed3e9SJustin Hibbits
3137*852ba100SJustin Hibbits SANITY_CHECK_RETURN_VALUE(h_Scheme, E_INVALID_HANDLE, 0);
31380aeed3e9SJustin Hibbits
3139*852ba100SJustin Hibbits p_FmPcd = (t_FmPcd*)(((t_FmPcdKgScheme *)h_Scheme)->h_FmPcd);
31400aeed3e9SJustin Hibbits if (p_FmPcd->h_Hc)
31410aeed3e9SJustin Hibbits return FmHcPcdKgGetSchemeCounter(p_FmPcd->h_Hc, h_Scheme);
31420aeed3e9SJustin Hibbits
3143*852ba100SJustin Hibbits physicalSchemeId = ((t_FmPcdKgScheme *)h_Scheme)->schemeId;
31440aeed3e9SJustin Hibbits
31450aeed3e9SJustin Hibbits if (FmPcdKgGetRelativeSchemeId(p_FmPcd, physicalSchemeId) == FM_PCD_KG_NUM_OF_SCHEMES)
31460aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
31470aeed3e9SJustin Hibbits
31480aeed3e9SJustin Hibbits tmpKgarReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
3149*852ba100SJustin Hibbits intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
31500aeed3e9SJustin Hibbits WriteKgarWait(p_FmPcd, tmpKgarReg);
3151*852ba100SJustin Hibbits if (!(GET_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode) & KG_SCH_MODE_EN))
31520aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is Invalid"));
3153*852ba100SJustin Hibbits spc = GET_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_spc);
3154*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
31550aeed3e9SJustin Hibbits
31560aeed3e9SJustin Hibbits return spc;
31570aeed3e9SJustin Hibbits }
31580aeed3e9SJustin Hibbits
FM_PCD_KgSchemeSetCounter(t_Handle h_Scheme,uint32_t value)3159*852ba100SJustin Hibbits t_Error FM_PCD_KgSchemeSetCounter(t_Handle h_Scheme, uint32_t value)
31600aeed3e9SJustin Hibbits {
3161*852ba100SJustin Hibbits t_FmPcd *p_FmPcd;
31620aeed3e9SJustin Hibbits uint32_t tmpKgarReg, intFlags;
31630aeed3e9SJustin Hibbits uint8_t physicalSchemeId;
31640aeed3e9SJustin Hibbits
3165*852ba100SJustin Hibbits SANITY_CHECK_RETURN_VALUE(h_Scheme, E_INVALID_HANDLE, 0);
3166*852ba100SJustin Hibbits
3167*852ba100SJustin Hibbits p_FmPcd = (t_FmPcd*)(((t_FmPcdKgScheme *)h_Scheme)->h_FmPcd);
3168*852ba100SJustin Hibbits
3169*852ba100SJustin Hibbits if (!FmPcdKgIsSchemeValidSw(h_Scheme))
3170*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Requested scheme is invalid."));
31710aeed3e9SJustin Hibbits
31720aeed3e9SJustin Hibbits if (p_FmPcd->h_Hc)
31730aeed3e9SJustin Hibbits return FmHcPcdKgSetSchemeCounter(p_FmPcd->h_Hc, h_Scheme, value);
31740aeed3e9SJustin Hibbits
3175*852ba100SJustin Hibbits physicalSchemeId = ((t_FmPcdKgScheme *)h_Scheme)->schemeId;
31760aeed3e9SJustin Hibbits /* check that schemeId is in range */
31770aeed3e9SJustin Hibbits if (FmPcdKgGetRelativeSchemeId(p_FmPcd, physicalSchemeId) == FM_PCD_KG_NUM_OF_SCHEMES)
31780aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG);
31790aeed3e9SJustin Hibbits
31800aeed3e9SJustin Hibbits /* read specified scheme into scheme registers */
31810aeed3e9SJustin Hibbits tmpKgarReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId);
3182*852ba100SJustin Hibbits intFlags = KgHwLock(p_FmPcd->p_FmPcdKg);
31830aeed3e9SJustin Hibbits WriteKgarWait(p_FmPcd, tmpKgarReg);
3184*852ba100SJustin Hibbits if (!(GET_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_mode) & KG_SCH_MODE_EN))
31850aeed3e9SJustin Hibbits {
3186*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
31870aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is Invalid"));
31880aeed3e9SJustin Hibbits }
31890aeed3e9SJustin Hibbits
31900aeed3e9SJustin Hibbits /* change counter value */
3191*852ba100SJustin Hibbits WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_IndirectAccessRegs->schemeRegs.kgse_spc, value);
31920aeed3e9SJustin Hibbits
31930aeed3e9SJustin Hibbits /* call indirect command for scheme write */
31940aeed3e9SJustin Hibbits tmpKgarReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE);
31950aeed3e9SJustin Hibbits
31960aeed3e9SJustin Hibbits WriteKgarWait(p_FmPcd, tmpKgarReg);
3197*852ba100SJustin Hibbits KgHwUnlock(p_FmPcd->p_FmPcdKg, intFlags);
31980aeed3e9SJustin Hibbits
31990aeed3e9SJustin Hibbits return E_OK;
32000aeed3e9SJustin Hibbits }
32010aeed3e9SJustin Hibbits
FM_PCD_KgSetAdditionalDataAfterParsing(t_Handle h_FmPcd,uint8_t payloadOffset)3202*852ba100SJustin Hibbits t_Error FM_PCD_KgSetAdditionalDataAfterParsing(t_Handle h_FmPcd, uint8_t payloadOffset)
3203*852ba100SJustin Hibbits {
3204*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
3205*852ba100SJustin Hibbits struct fman_kg_regs *p_Regs;
3206*852ba100SJustin Hibbits
3207*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
3208*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_NULL_POINTER);
3209*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg, E_NULL_POINTER);
3210*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs, E_NULL_POINTER);
3211*852ba100SJustin Hibbits
3212*852ba100SJustin Hibbits p_Regs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
3213*852ba100SJustin Hibbits if (!FmIsMaster(p_FmPcd->h_Fm))
3214*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_KgSetAdditionalDataAfterParsing - guest mode!"));
3215*852ba100SJustin Hibbits
3216*852ba100SJustin Hibbits WRITE_UINT32(p_Regs->fmkg_fdor,payloadOffset);
3217*852ba100SJustin Hibbits
3218*852ba100SJustin Hibbits return E_OK;
3219*852ba100SJustin Hibbits }
3220*852ba100SJustin Hibbits
FM_PCD_KgSetDfltValue(t_Handle h_FmPcd,uint8_t valueId,uint32_t value)3221*852ba100SJustin Hibbits t_Error FM_PCD_KgSetDfltValue(t_Handle h_FmPcd, uint8_t valueId, uint32_t value)
3222*852ba100SJustin Hibbits {
3223*852ba100SJustin Hibbits t_FmPcd *p_FmPcd = (t_FmPcd*)h_FmPcd;
3224*852ba100SJustin Hibbits struct fman_kg_regs *p_Regs;
3225*852ba100SJustin Hibbits
3226*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
3227*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(((valueId == 0) || (valueId == 1)), E_INVALID_VALUE);
3228*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_NULL_POINTER);
3229*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg, E_NULL_POINTER);
3230*852ba100SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs, E_NULL_POINTER);
3231*852ba100SJustin Hibbits
3232*852ba100SJustin Hibbits p_Regs = p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs;
3233*852ba100SJustin Hibbits
3234*852ba100SJustin Hibbits if (!FmIsMaster(p_FmPcd->h_Fm))
3235*852ba100SJustin Hibbits RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_KgSetDfltValue - guest mode!"));
3236*852ba100SJustin Hibbits
3237*852ba100SJustin Hibbits if (valueId == 0)
3238*852ba100SJustin Hibbits WRITE_UINT32(p_Regs->fmkg_gdv0r,value);
3239*852ba100SJustin Hibbits else
3240*852ba100SJustin Hibbits WRITE_UINT32(p_Regs->fmkg_gdv1r,value);
3241*852ba100SJustin Hibbits return E_OK;
3242*852ba100SJustin Hibbits }
3243