1852ba100SJustin Hibbits /*
2852ba100SJustin Hibbits * Copyright 2008-2012 Freescale Semiconductor Inc.
3852ba100SJustin Hibbits *
4852ba100SJustin Hibbits * Redistribution and use in source and binary forms, with or without
5852ba100SJustin Hibbits * modification, are permitted provided that the following conditions are met:
6852ba100SJustin Hibbits * * Redistributions of source code must retain the above copyright
7852ba100SJustin Hibbits * notice, this list of conditions and the following disclaimer.
8852ba100SJustin Hibbits * * Redistributions in binary form must reproduce the above copyright
9852ba100SJustin Hibbits * notice, this list of conditions and the following disclaimer in the
10852ba100SJustin Hibbits * documentation and/or other materials provided with the distribution.
11852ba100SJustin Hibbits * * Neither the name of Freescale Semiconductor nor the
12852ba100SJustin Hibbits * names of its contributors may be used to endorse or promote products
13852ba100SJustin Hibbits * derived from this software without specific prior written permission.
14852ba100SJustin Hibbits *
15852ba100SJustin Hibbits *
16852ba100SJustin Hibbits * ALTERNATIVELY, this software may be distributed under the terms of the
17852ba100SJustin Hibbits * GNU General Public License ("GPL") as published by the Free Software
18852ba100SJustin Hibbits * Foundation, either version 2 of that License or (at your option) any
19852ba100SJustin Hibbits * later version.
20852ba100SJustin Hibbits *
21852ba100SJustin Hibbits * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22852ba100SJustin Hibbits * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23852ba100SJustin Hibbits * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24852ba100SJustin Hibbits * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25852ba100SJustin Hibbits * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26852ba100SJustin Hibbits * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27852ba100SJustin Hibbits * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28852ba100SJustin Hibbits * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29852ba100SJustin Hibbits * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30852ba100SJustin Hibbits * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31852ba100SJustin Hibbits */
32852ba100SJustin Hibbits
33852ba100SJustin Hibbits #ifndef __FSL_FMAN_KG_H
34852ba100SJustin Hibbits #define __FSL_FMAN_KG_H
35852ba100SJustin Hibbits
36852ba100SJustin Hibbits #include "common/general.h"
37852ba100SJustin Hibbits
38852ba100SJustin Hibbits #define FM_KG_NUM_OF_GENERIC_REGS 8 /**< Num of generic KeyGen regs */
39852ba100SJustin Hibbits #define FMAN_MAX_NUM_OF_HW_PORTS 64
40852ba100SJustin Hibbits /**< Total num of masks allowed on KG extractions */
41852ba100SJustin Hibbits #define FM_KG_EXTRACT_MASKS_NUM 4
42852ba100SJustin Hibbits #define FM_KG_NUM_CLS_PLAN_ENTR 8 /**< Num of class. plan regs */
43852ba100SJustin Hibbits #define FM_KG_CLS_PLAN_GRPS_NUM 32 /**< Max num of class. groups */
44852ba100SJustin Hibbits
45852ba100SJustin Hibbits struct fman_kg_regs {
46852ba100SJustin Hibbits uint32_t fmkg_gcr;
47852ba100SJustin Hibbits uint32_t res004;
48852ba100SJustin Hibbits uint32_t res008;
49852ba100SJustin Hibbits uint32_t fmkg_eer;
50852ba100SJustin Hibbits uint32_t fmkg_eeer;
51852ba100SJustin Hibbits uint32_t res014;
52852ba100SJustin Hibbits uint32_t res018;
53852ba100SJustin Hibbits uint32_t fmkg_seer;
54852ba100SJustin Hibbits uint32_t fmkg_seeer;
55852ba100SJustin Hibbits uint32_t fmkg_gsr;
56852ba100SJustin Hibbits uint32_t fmkg_tpc;
57852ba100SJustin Hibbits uint32_t fmkg_serc;
58852ba100SJustin Hibbits uint32_t res030[4];
59852ba100SJustin Hibbits uint32_t fmkg_fdor;
60852ba100SJustin Hibbits uint32_t fmkg_gdv0r;
61852ba100SJustin Hibbits uint32_t fmkg_gdv1r;
62852ba100SJustin Hibbits uint32_t res04c[6];
63852ba100SJustin Hibbits uint32_t fmkg_feer;
64852ba100SJustin Hibbits uint32_t res068[38];
65852ba100SJustin Hibbits uint32_t fmkg_indirect[63];
66852ba100SJustin Hibbits uint32_t fmkg_ar;
67852ba100SJustin Hibbits };
68852ba100SJustin Hibbits
69852ba100SJustin Hibbits struct fman_kg_scheme_regs {
70852ba100SJustin Hibbits uint32_t kgse_mode; /**< MODE */
71852ba100SJustin Hibbits uint32_t kgse_ekfc; /**< Extract Known Fields Command */
72852ba100SJustin Hibbits uint32_t kgse_ekdv; /**< Extract Known Default Value */
73852ba100SJustin Hibbits uint32_t kgse_bmch; /**< Bit Mask Command High */
74852ba100SJustin Hibbits uint32_t kgse_bmcl; /**< Bit Mask Command Low */
75852ba100SJustin Hibbits uint32_t kgse_fqb; /**< Frame Queue Base */
76852ba100SJustin Hibbits uint32_t kgse_hc; /**< Hash Command */
77852ba100SJustin Hibbits uint32_t kgse_ppc; /**< Policer Profile Command */
78852ba100SJustin Hibbits uint32_t kgse_gec[FM_KG_NUM_OF_GENERIC_REGS];
79852ba100SJustin Hibbits /**< Generic Extract Command */
80852ba100SJustin Hibbits uint32_t kgse_spc; /**< KeyGen Scheme Entry Statistic Packet Counter */
81852ba100SJustin Hibbits uint32_t kgse_dv0; /**< KeyGen Scheme Entry Default Value 0 */
82852ba100SJustin Hibbits uint32_t kgse_dv1; /**< KeyGen Scheme Entry Default Value 1 */
83852ba100SJustin Hibbits uint32_t kgse_ccbs; /**< KeyGen Scheme Entry Coarse Classification Bit*/
84852ba100SJustin Hibbits uint32_t kgse_mv; /**< KeyGen Scheme Entry Match vector */
85852ba100SJustin Hibbits uint32_t kgse_om; /**< KeyGen Scheme Entry Operation Mode bits */
86852ba100SJustin Hibbits uint32_t kgse_vsp; /**< KeyGen Scheme Entry Virtual Storage Profile */
87852ba100SJustin Hibbits };
88852ba100SJustin Hibbits
89852ba100SJustin Hibbits struct fman_kg_pe_regs{
90852ba100SJustin Hibbits uint32_t fmkg_pe_sp;
91852ba100SJustin Hibbits uint32_t fmkg_pe_cpp;
92852ba100SJustin Hibbits };
93852ba100SJustin Hibbits
94852ba100SJustin Hibbits struct fman_kg_cp_regs {
95852ba100SJustin Hibbits uint32_t kgcpe[FM_KG_NUM_CLS_PLAN_ENTR];
96852ba100SJustin Hibbits };
97852ba100SJustin Hibbits
98852ba100SJustin Hibbits
99852ba100SJustin Hibbits #define FM_KG_KGAR_GO 0x80000000
100852ba100SJustin Hibbits #define FM_KG_KGAR_READ 0x40000000
101852ba100SJustin Hibbits #define FM_KG_KGAR_WRITE 0x00000000
102852ba100SJustin Hibbits #define FM_KG_KGAR_SEL_SCHEME_ENTRY 0x00000000
103852ba100SJustin Hibbits #define FM_KG_KGAR_SCM_WSEL_UPDATE_CNT 0x00008000
104852ba100SJustin Hibbits
105852ba100SJustin Hibbits #define KG_SCH_PP_SHIFT_HIGH 0x80000000
106852ba100SJustin Hibbits #define KG_SCH_PP_NO_GEN 0x10000000
107852ba100SJustin Hibbits #define KG_SCH_PP_SHIFT_LOW 0x0000F000
108852ba100SJustin Hibbits #define KG_SCH_MODE_NIA_PLCR 0x40000000
109852ba100SJustin Hibbits #define KG_SCH_GEN_EXTRACT_TYPE 0x00008000
110852ba100SJustin Hibbits #define KG_SCH_BITMASK_MASK 0x000000FF
111852ba100SJustin Hibbits #define KG_SCH_GEN_VALID 0x80000000
112852ba100SJustin Hibbits #define KG_SCH_GEN_MASK 0x00FF0000
113852ba100SJustin Hibbits #define FM_PCD_KG_KGAR_ERR 0x20000000
114852ba100SJustin Hibbits #define FM_PCD_KG_KGAR_SEL_CLS_PLAN_ENTRY 0x01000000
115852ba100SJustin Hibbits #define FM_PCD_KG_KGAR_SEL_PORT_ENTRY 0x02000000
116852ba100SJustin Hibbits #define FM_PCD_KG_KGAR_SEL_PORT_WSEL_SP 0x00008000
117852ba100SJustin Hibbits #define FM_PCD_KG_KGAR_SEL_PORT_WSEL_CPP 0x00004000
118852ba100SJustin Hibbits #define FM_PCD_KG_KGAR_WSEL_MASK 0x0000FF00
119852ba100SJustin Hibbits #define KG_SCH_HASH_CONFIG_NO_FQID 0x80000000
120852ba100SJustin Hibbits #define KG_SCH_HASH_CONFIG_SYM 0x40000000
121852ba100SJustin Hibbits
122852ba100SJustin Hibbits #define FM_EX_KG_DOUBLE_ECC 0x80000000
123852ba100SJustin Hibbits #define FM_EX_KG_KEYSIZE_OVERFLOW 0x40000000
124852ba100SJustin Hibbits
125852ba100SJustin Hibbits /* ECC capture register */
126852ba100SJustin Hibbits #define KG_FMKG_SERC_CAP 0x80000000
127852ba100SJustin Hibbits #define KG_FMKG_SERC_CET 0x40000000
128852ba100SJustin Hibbits #define KG_FMKG_SERC_CNT_MSK 0x00FF0000
129852ba100SJustin Hibbits #define KG_FMKG_SERC_CNT_SHIFT 16
130852ba100SJustin Hibbits #define KG_FMKG_SERC_ADDR_MSK 0x000003FF
131852ba100SJustin Hibbits
132852ba100SJustin Hibbits /* Masks */
133852ba100SJustin Hibbits #define FM_KG_KGGCR_EN 0x80000000
134852ba100SJustin Hibbits #define KG_SCH_GEN_VALID 0x80000000
135852ba100SJustin Hibbits #define KG_SCH_GEN_EXTRACT_TYPE 0x00008000
136852ba100SJustin Hibbits #define KG_ERR_TYPE_DOUBLE 0x40000000
137852ba100SJustin Hibbits #define KG_ERR_ADDR_MASK 0x00000FFF
138852ba100SJustin Hibbits #define KG_SCH_MODE_EN 0x80000000
139852ba100SJustin Hibbits
140852ba100SJustin Hibbits /* shifts */
141852ba100SJustin Hibbits #define FM_KG_KGAR_NUM_SHIFT 16
142852ba100SJustin Hibbits #define FM_KG_PE_CPP_MASK_SHIFT 16
143852ba100SJustin Hibbits #define FM_KG_KGAR_WSEL_SHIFT 8
144852ba100SJustin Hibbits
145852ba100SJustin Hibbits #define FM_KG_SCH_GEN_HT_INVALID 0
146852ba100SJustin Hibbits
147852ba100SJustin Hibbits #define FM_KG_MASK_SEL_GEN_BASE 0x20
148852ba100SJustin Hibbits
149852ba100SJustin Hibbits #define KG_GET_MASK_SEL_SHIFT(shift, i) \
150852ba100SJustin Hibbits switch (i) \
151852ba100SJustin Hibbits { \
152852ba100SJustin Hibbits case 0: (shift) = 26; break; \
153852ba100SJustin Hibbits case 1: (shift) = 20; break; \
154852ba100SJustin Hibbits case 2: (shift) = 10; break; \
155852ba100SJustin Hibbits case 3: (shift) = 4; break; \
156852ba100SJustin Hibbits default: (shift) = 0; \
157852ba100SJustin Hibbits }
158852ba100SJustin Hibbits
159852ba100SJustin Hibbits #define KG_GET_MASK_OFFSET_SHIFT(shift, i) \
160852ba100SJustin Hibbits switch (i) \
161852ba100SJustin Hibbits { \
162852ba100SJustin Hibbits case 0: (shift) = 16; break; \
163852ba100SJustin Hibbits case 1: (shift) = 0; break; \
164852ba100SJustin Hibbits case 2: (shift) = 28; break; \
165852ba100SJustin Hibbits case 3: (shift) = 24; break; \
166852ba100SJustin Hibbits default: (shift) = 0; \
167852ba100SJustin Hibbits }
168852ba100SJustin Hibbits
169852ba100SJustin Hibbits #define KG_GET_MASK_SHIFT(shift, i) \
170852ba100SJustin Hibbits switch (i) \
171852ba100SJustin Hibbits { \
172852ba100SJustin Hibbits case 0: shift = 24; break; \
173852ba100SJustin Hibbits case 1: shift = 16; break; \
174852ba100SJustin Hibbits case 2: shift = 8; break; \
175852ba100SJustin Hibbits case 3: shift = 0; break; \
176852ba100SJustin Hibbits default: shift = 0; \
177852ba100SJustin Hibbits }
178852ba100SJustin Hibbits
179852ba100SJustin Hibbits /* Port entry CPP register */
180852ba100SJustin Hibbits #define FMAN_KG_PE_CPP_MASK_SHIFT 16
181852ba100SJustin Hibbits
182852ba100SJustin Hibbits /* Scheme registers */
183852ba100SJustin Hibbits #define FMAN_KG_SCH_MODE_EN 0x80000000
184852ba100SJustin Hibbits #define FMAN_KG_SCH_MODE_NIA_PLCR 0x40000000
185852ba100SJustin Hibbits #define FMAN_KG_SCH_MODE_CCOBASE_SHIFT 24
186852ba100SJustin Hibbits
187852ba100SJustin Hibbits #define FMAN_KG_SCH_DEF_MAC_ADDR_SHIFT 30
188852ba100SJustin Hibbits #define FMAN_KG_SCH_DEF_VLAN_TCI_SHIFT 28
189852ba100SJustin Hibbits #define FMAN_KG_SCH_DEF_ETYPE_SHIFT 26
190852ba100SJustin Hibbits #define FMAN_KG_SCH_DEF_PPP_SID_SHIFT 24
191852ba100SJustin Hibbits #define FMAN_KG_SCH_DEF_PPP_PID_SHIFT 22
192852ba100SJustin Hibbits #define FMAN_KG_SCH_DEF_MPLS_SHIFT 20
193852ba100SJustin Hibbits #define FMAN_KG_SCH_DEF_IP_ADDR_SHIFT 18
194852ba100SJustin Hibbits #define FMAN_KG_SCH_DEF_PTYPE_SHIFT 16
195852ba100SJustin Hibbits #define FMAN_KG_SCH_DEF_IP_TOS_TC_SHIFT 14
196852ba100SJustin Hibbits #define FMAN_KG_SCH_DEF_IPv6_FL_SHIFT 12
197852ba100SJustin Hibbits #define FMAN_KG_SCH_DEF_IPSEC_SPI_SHIFT 10
198852ba100SJustin Hibbits #define FMAN_KG_SCH_DEF_L4_PORT_SHIFT 8
199852ba100SJustin Hibbits #define FMAN_KG_SCH_DEF_TCP_FLG_SHIFT 6
200852ba100SJustin Hibbits
201852ba100SJustin Hibbits #define FMAN_KG_SCH_GEN_VALID 0x80000000
202852ba100SJustin Hibbits #define FMAN_KG_SCH_GEN_SIZE_MAX 16
203852ba100SJustin Hibbits #define FMAN_KG_SCH_GEN_OR 0x00008000
204852ba100SJustin Hibbits
205852ba100SJustin Hibbits #define FMAN_KG_SCH_GEN_DEF_SHIFT 29
206852ba100SJustin Hibbits #define FMAN_KG_SCH_GEN_SIZE_SHIFT 24
207852ba100SJustin Hibbits #define FMAN_KG_SCH_GEN_MASK_SHIFT 16
208852ba100SJustin Hibbits #define FMAN_KG_SCH_GEN_HT_SHIFT 8
209852ba100SJustin Hibbits
210852ba100SJustin Hibbits #define FMAN_KG_SCH_HASH_HSHIFT_SHIFT 24
211852ba100SJustin Hibbits #define FMAN_KG_SCH_HASH_HSHIFT_MAX 0x28
212852ba100SJustin Hibbits #define FMAN_KG_SCH_HASH_SYM 0x40000000
213852ba100SJustin Hibbits #define FMAN_KG_SCH_HASH_NO_FQID_GEN 0x80000000
214852ba100SJustin Hibbits
215852ba100SJustin Hibbits #define FMAN_KG_SCH_PP_SH_SHIFT 27
216852ba100SJustin Hibbits #define FMAN_KG_SCH_PP_SL_SHIFT 12
217852ba100SJustin Hibbits #define FMAN_KG_SCH_PP_SH_MASK 0x80000000
218852ba100SJustin Hibbits #define FMAN_KG_SCH_PP_SL_MASK 0x0000F000
219852ba100SJustin Hibbits #define FMAN_KG_SCH_PP_SHIFT_MAX 0x17
220852ba100SJustin Hibbits #define FMAN_KG_SCH_PP_MASK_SHIFT 16
221852ba100SJustin Hibbits #define FMAN_KG_SCH_PP_NO_GEN 0x10000000
222852ba100SJustin Hibbits
223852ba100SJustin Hibbits enum fman_kg_gen_extract_src {
224852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_ETH,
225852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_ETYPE,
226852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_SNAP,
227852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_VLAN_TCI_1,
228852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_VLAN_TCI_N,
229852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_PPPoE,
230852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_MPLS_1,
231852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_MPLS_2,
232852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_MPLS_3,
233852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_MPLS_N,
234852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_IPv4_1,
235852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_IPv6_1,
236852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_IPv4_2,
237852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_IPv6_2,
238852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_MINENCAP,
239852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_IP_PID,
240852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_GRE,
241852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_TCP,
242852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_UDP,
243852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_SCTP,
244852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_DCCP,
245852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_IPSEC_AH,
246852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_IPSEC_ESP,
247852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_SHIM_1,
248852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_SHIM_2,
249852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_FROM_DFLT,
250852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_FROM_FRAME_START,
251852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_FROM_PARSE_RESULT,
252852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_FROM_END_OF_PARSE,
253852ba100SJustin Hibbits E_FMAN_KG_GEN_EXTRACT_FROM_FQID
254852ba100SJustin Hibbits };
255852ba100SJustin Hibbits
256852ba100SJustin Hibbits struct fman_kg_ex_ecc_attr
257852ba100SJustin Hibbits {
258852ba100SJustin Hibbits bool valid;
259852ba100SJustin Hibbits bool double_ecc;
260852ba100SJustin Hibbits uint16_t addr;
261852ba100SJustin Hibbits uint8_t single_ecc_count;
262852ba100SJustin Hibbits };
263852ba100SJustin Hibbits
264852ba100SJustin Hibbits enum fman_kg_def_select
265852ba100SJustin Hibbits {
266852ba100SJustin Hibbits E_FMAN_KG_DEF_GLOBAL_0,
267852ba100SJustin Hibbits E_FMAN_KG_DEF_GLOBAL_1,
268852ba100SJustin Hibbits E_FMAN_KG_DEF_SCHEME_0,
269852ba100SJustin Hibbits E_FMAN_KG_DEF_SCHEME_1
270852ba100SJustin Hibbits };
271852ba100SJustin Hibbits
272852ba100SJustin Hibbits struct fman_kg_extract_def
273852ba100SJustin Hibbits {
274852ba100SJustin Hibbits enum fman_kg_def_select mac_addr;
275852ba100SJustin Hibbits enum fman_kg_def_select vlan_tci;
276852ba100SJustin Hibbits enum fman_kg_def_select etype;
277852ba100SJustin Hibbits enum fman_kg_def_select ppp_sid;
278852ba100SJustin Hibbits enum fman_kg_def_select ppp_pid;
279852ba100SJustin Hibbits enum fman_kg_def_select mpls;
280852ba100SJustin Hibbits enum fman_kg_def_select ip_addr;
281852ba100SJustin Hibbits enum fman_kg_def_select ptype;
282852ba100SJustin Hibbits enum fman_kg_def_select ip_tos_tc;
283852ba100SJustin Hibbits enum fman_kg_def_select ipv6_fl;
284852ba100SJustin Hibbits enum fman_kg_def_select ipsec_spi;
285852ba100SJustin Hibbits enum fman_kg_def_select l4_port;
286852ba100SJustin Hibbits enum fman_kg_def_select tcp_flg;
287852ba100SJustin Hibbits };
288852ba100SJustin Hibbits
289852ba100SJustin Hibbits enum fman_kg_gen_extract_type
290852ba100SJustin Hibbits {
291852ba100SJustin Hibbits E_FMAN_KG_HASH_EXTRACT,
292852ba100SJustin Hibbits E_FMAN_KG_OR_EXTRACT
293852ba100SJustin Hibbits };
294852ba100SJustin Hibbits
295852ba100SJustin Hibbits struct fman_kg_gen_extract_params
296852ba100SJustin Hibbits {
297852ba100SJustin Hibbits /* Hash or Or-ed extract */
298852ba100SJustin Hibbits enum fman_kg_gen_extract_type type;
299852ba100SJustin Hibbits enum fman_kg_gen_extract_src src;
300852ba100SJustin Hibbits bool no_validation;
301852ba100SJustin Hibbits /* Extraction offset from the header location specified above */
302852ba100SJustin Hibbits uint8_t offset;
303852ba100SJustin Hibbits /* Size of extraction for FMAN_KG_HASH_EXTRACT,
304852ba100SJustin Hibbits * hash result shift for FMAN_KG_OR_EXTRACT */
305852ba100SJustin Hibbits uint8_t extract;
306852ba100SJustin Hibbits uint8_t mask;
307852ba100SJustin Hibbits /* Default value to use when header specified
308852ba100SJustin Hibbits * by fman_kg_gen_extract_src doesn't present */
309852ba100SJustin Hibbits enum fman_kg_def_select def_val;
310852ba100SJustin Hibbits };
311852ba100SJustin Hibbits
312852ba100SJustin Hibbits struct fman_kg_extract_mask
313852ba100SJustin Hibbits {
314852ba100SJustin Hibbits /**< Indication if mask is on known field extraction or
315852ba100SJustin Hibbits * on general extraction; TRUE for known field */
316852ba100SJustin Hibbits bool is_known;
317852ba100SJustin Hibbits /**< One of FMAN_KG_EXTRACT_xxx defines for known fields mask and
318852ba100SJustin Hibbits * generic register index for generic extracts mask */
319852ba100SJustin Hibbits uint32_t field_or_gen_idx;
320852ba100SJustin Hibbits /**< Byte offset from start of the extracted data specified
321852ba100SJustin Hibbits * by field_or_gen_idx */
322852ba100SJustin Hibbits uint8_t offset;
323852ba100SJustin Hibbits /**< Byte mask (selected bits will be used) */
324852ba100SJustin Hibbits uint8_t mask;
325852ba100SJustin Hibbits };
326852ba100SJustin Hibbits
327852ba100SJustin Hibbits struct fman_kg_extract_params
328852ba100SJustin Hibbits {
329852ba100SJustin Hibbits /* Or-ed mask of FMAN_KG_EXTRACT_xxx defines */
330852ba100SJustin Hibbits uint32_t known_fields;
331852ba100SJustin Hibbits struct fman_kg_extract_def known_fields_def;
332852ba100SJustin Hibbits /* Number of entries in gen_extract */
333852ba100SJustin Hibbits uint8_t gen_extract_num;
334852ba100SJustin Hibbits struct fman_kg_gen_extract_params gen_extract[FM_KG_NUM_OF_GENERIC_REGS];
335852ba100SJustin Hibbits /* Number of entries in masks */
336852ba100SJustin Hibbits uint8_t masks_num;
337852ba100SJustin Hibbits struct fman_kg_extract_mask masks[FM_KG_EXTRACT_MASKS_NUM];
338852ba100SJustin Hibbits uint32_t def_scheme_0;
339852ba100SJustin Hibbits uint32_t def_scheme_1;
340852ba100SJustin Hibbits };
341852ba100SJustin Hibbits
342852ba100SJustin Hibbits struct fman_kg_hash_params
343852ba100SJustin Hibbits {
344852ba100SJustin Hibbits bool use_hash;
345852ba100SJustin Hibbits uint8_t shift_r;
346852ba100SJustin Hibbits uint32_t mask; /**< 24-bit mask */
347852ba100SJustin Hibbits bool sym; /**< Symmetric hash for src and dest pairs */
348852ba100SJustin Hibbits };
349852ba100SJustin Hibbits
350852ba100SJustin Hibbits struct fman_kg_pp_params
351852ba100SJustin Hibbits {
352852ba100SJustin Hibbits uint8_t base;
353852ba100SJustin Hibbits uint8_t shift;
354852ba100SJustin Hibbits uint8_t mask;
355852ba100SJustin Hibbits bool bypass_pp_gen;
356852ba100SJustin Hibbits };
357852ba100SJustin Hibbits
358852ba100SJustin Hibbits struct fman_kg_cc_params
359852ba100SJustin Hibbits {
360852ba100SJustin Hibbits uint8_t base_offset;
361852ba100SJustin Hibbits uint32_t qlcv_bits_sel;
362852ba100SJustin Hibbits };
363852ba100SJustin Hibbits
364852ba100SJustin Hibbits enum fman_pcd_engine
365852ba100SJustin Hibbits {
366852ba100SJustin Hibbits E_FMAN_PCD_INVALID = 0, /**< Invalid PCD engine indicated*/
367852ba100SJustin Hibbits E_FMAN_PCD_DONE, /**< No PCD Engine indicated */
368852ba100SJustin Hibbits E_FMAN_PCD_KG, /**< Keygen indicated */
369852ba100SJustin Hibbits E_FMAN_PCD_CC, /**< Coarse classification indicated */
370852ba100SJustin Hibbits E_FMAN_PCD_PLCR, /**< Policer indicated */
371852ba100SJustin Hibbits E_FMAN_PCD_PRS /**< Parser indicated */
372852ba100SJustin Hibbits };
373852ba100SJustin Hibbits
374852ba100SJustin Hibbits struct fman_kg_cls_plan_params
375852ba100SJustin Hibbits {
376852ba100SJustin Hibbits uint8_t entries_mask;
377852ba100SJustin Hibbits uint32_t mask_vector[FM_KG_NUM_CLS_PLAN_ENTR];
378852ba100SJustin Hibbits };
379852ba100SJustin Hibbits
380852ba100SJustin Hibbits struct fman_kg_scheme_params
381852ba100SJustin Hibbits {
382852ba100SJustin Hibbits uint32_t match_vector;
383852ba100SJustin Hibbits struct fman_kg_extract_params extract_params;
384852ba100SJustin Hibbits struct fman_kg_hash_params hash_params;
385852ba100SJustin Hibbits uint32_t base_fqid;
386852ba100SJustin Hibbits /* What we do w/features supported per FM version ?? */
387852ba100SJustin Hibbits bool bypass_fqid_gen;
388852ba100SJustin Hibbits struct fman_kg_pp_params policer_params;
389852ba100SJustin Hibbits struct fman_kg_cc_params cc_params;
390852ba100SJustin Hibbits bool update_counter;
391852ba100SJustin Hibbits /**< counter_value: Set scheme counter to the specified value;
392852ba100SJustin Hibbits * relevant only when update_counter = TRUE. */
393852ba100SJustin Hibbits uint32_t counter_value;
394852ba100SJustin Hibbits enum fman_pcd_engine next_engine;
395852ba100SJustin Hibbits /**< Next engine action code */
396852ba100SJustin Hibbits uint32_t next_engine_action;
397852ba100SJustin Hibbits };
398852ba100SJustin Hibbits
399852ba100SJustin Hibbits
400852ba100SJustin Hibbits
401852ba100SJustin Hibbits int fman_kg_write_ar_wait(struct fman_kg_regs *regs, uint32_t fmkg_ar);
402852ba100SJustin Hibbits void fman_kg_write_sp(struct fman_kg_regs *regs, uint32_t sp, bool add);
403852ba100SJustin Hibbits void fman_kg_write_cpp(struct fman_kg_regs *regs, uint32_t cpp);
404852ba100SJustin Hibbits void fman_kg_get_event(struct fman_kg_regs *regs,
405852ba100SJustin Hibbits uint32_t *event,
406852ba100SJustin Hibbits uint32_t *scheme_idx);
407852ba100SJustin Hibbits void fman_kg_init(struct fman_kg_regs *regs,
408852ba100SJustin Hibbits uint32_t exceptions,
409852ba100SJustin Hibbits uint32_t dflt_nia);
410852ba100SJustin Hibbits void fman_kg_enable_scheme_interrupts(struct fman_kg_regs *regs);
411852ba100SJustin Hibbits void fman_kg_enable(struct fman_kg_regs *regs);
412852ba100SJustin Hibbits void fman_kg_disable(struct fman_kg_regs *regs);
413852ba100SJustin Hibbits int fman_kg_write_bind_cls_plans(struct fman_kg_regs *regs,
414852ba100SJustin Hibbits uint8_t hwport_id,
415852ba100SJustin Hibbits uint32_t bind_cls_plans);
416852ba100SJustin Hibbits int fman_kg_build_bind_cls_plans(uint8_t grp_base,
417852ba100SJustin Hibbits uint8_t grp_mask,
418852ba100SJustin Hibbits uint32_t *bind_cls_plans);
419852ba100SJustin Hibbits int fman_kg_write_bind_schemes(struct fman_kg_regs *regs,
420852ba100SJustin Hibbits uint8_t hwport_id,
421852ba100SJustin Hibbits uint32_t schemes);
422852ba100SJustin Hibbits int fman_kg_write_cls_plan(struct fman_kg_regs *regs,
423852ba100SJustin Hibbits uint8_t grp_id,
424852ba100SJustin Hibbits uint8_t entries_mask,
425852ba100SJustin Hibbits uint8_t hwport_id,
426852ba100SJustin Hibbits struct fman_kg_cp_regs *cls_plan_regs);
427852ba100SJustin Hibbits int fman_kg_build_cls_plan(struct fman_kg_cls_plan_params *params,
428852ba100SJustin Hibbits struct fman_kg_cp_regs *cls_plan_regs);
429852ba100SJustin Hibbits uint32_t fman_kg_get_schemes_total_counter(struct fman_kg_regs *regs);
430852ba100SJustin Hibbits int fman_kg_set_scheme_counter(struct fman_kg_regs *regs,
431852ba100SJustin Hibbits uint8_t scheme_id,
432852ba100SJustin Hibbits uint8_t hwport_id,
433852ba100SJustin Hibbits uint32_t counter);
434852ba100SJustin Hibbits int fman_kg_get_scheme_counter(struct fman_kg_regs *regs,
435852ba100SJustin Hibbits uint8_t scheme_id,
436852ba100SJustin Hibbits uint8_t hwport_id,
437852ba100SJustin Hibbits uint32_t *counter);
438852ba100SJustin Hibbits int fman_kg_delete_scheme(struct fman_kg_regs *regs,
439852ba100SJustin Hibbits uint8_t scheme_id,
440852ba100SJustin Hibbits uint8_t hwport_id);
441852ba100SJustin Hibbits int fman_kg_write_scheme(struct fman_kg_regs *regs,
442852ba100SJustin Hibbits uint8_t scheme_id,
443852ba100SJustin Hibbits uint8_t hwport_id,
444852ba100SJustin Hibbits struct fman_kg_scheme_regs *scheme_regs,
445852ba100SJustin Hibbits bool update_counter);
446852ba100SJustin Hibbits int fman_kg_build_scheme(struct fman_kg_scheme_params *params,
447852ba100SJustin Hibbits struct fman_kg_scheme_regs *scheme_regs);
448852ba100SJustin Hibbits void fman_kg_get_capture(struct fman_kg_regs *regs,
449852ba100SJustin Hibbits struct fman_kg_ex_ecc_attr *ecc_attr,
450852ba100SJustin Hibbits bool clear);
451852ba100SJustin Hibbits void fman_kg_get_exception(struct fman_kg_regs *regs,
452852ba100SJustin Hibbits uint32_t *events,
453852ba100SJustin Hibbits uint32_t *scheme_ids,
454852ba100SJustin Hibbits bool clear);
455852ba100SJustin Hibbits void fman_kg_set_exception(struct fman_kg_regs *regs,
456852ba100SJustin Hibbits uint32_t exception,
457852ba100SJustin Hibbits bool enable);
458852ba100SJustin Hibbits void fman_kg_set_dflt_val(struct fman_kg_regs *regs,
459852ba100SJustin Hibbits uint8_t def_id,
460852ba100SJustin Hibbits uint32_t val);
461852ba100SJustin Hibbits void fman_kg_set_data_after_prs(struct fman_kg_regs *regs, uint8_t offset);
462852ba100SJustin Hibbits
463852ba100SJustin Hibbits
464852ba100SJustin Hibbits
465852ba100SJustin Hibbits /**************************************************************************//**
466852ba100SJustin Hibbits @Description NIA Description
467852ba100SJustin Hibbits *//***************************************************************************/
468852ba100SJustin Hibbits #define KG_NIA_ORDER_RESTOR 0x00800000
469852ba100SJustin Hibbits #define KG_NIA_ENG_FM_CTL 0x00000000
470852ba100SJustin Hibbits #define KG_NIA_ENG_PRS 0x00440000
471852ba100SJustin Hibbits #define KG_NIA_ENG_KG 0x00480000
472852ba100SJustin Hibbits #define KG_NIA_ENG_PLCR 0x004C0000
473852ba100SJustin Hibbits #define KG_NIA_ENG_BMI 0x00500000
474852ba100SJustin Hibbits #define KG_NIA_ENG_QMI_ENQ 0x00540000
475852ba100SJustin Hibbits #define KG_NIA_ENG_QMI_DEQ 0x00580000
476852ba100SJustin Hibbits #define KG_NIA_ENG_MASK 0x007C0000
477852ba100SJustin Hibbits
478852ba100SJustin Hibbits #define KG_NIA_AC_MASK 0x0003FFFF
479852ba100SJustin Hibbits
480852ba100SJustin Hibbits #define KG_NIA_INVALID 0xFFFFFFFF
481852ba100SJustin Hibbits
fm_kg_build_nia(enum fman_pcd_engine next_engine,uint32_t next_engine_action)482852ba100SJustin Hibbits static __inline__ uint32_t fm_kg_build_nia(enum fman_pcd_engine next_engine,
483852ba100SJustin Hibbits uint32_t next_engine_action)
484852ba100SJustin Hibbits {
485852ba100SJustin Hibbits uint32_t nia;
486852ba100SJustin Hibbits
487852ba100SJustin Hibbits if (next_engine_action & ~KG_NIA_AC_MASK)
488852ba100SJustin Hibbits return KG_NIA_INVALID;
489852ba100SJustin Hibbits
490852ba100SJustin Hibbits switch (next_engine) {
491852ba100SJustin Hibbits case E_FMAN_PCD_DONE:
492852ba100SJustin Hibbits nia = KG_NIA_ENG_BMI | next_engine_action;
493852ba100SJustin Hibbits break;
494852ba100SJustin Hibbits
495852ba100SJustin Hibbits case E_FMAN_PCD_KG:
496852ba100SJustin Hibbits nia = KG_NIA_ENG_KG | next_engine_action;
497852ba100SJustin Hibbits break;
498852ba100SJustin Hibbits
499852ba100SJustin Hibbits case E_FMAN_PCD_CC:
500852ba100SJustin Hibbits nia = KG_NIA_ENG_FM_CTL | next_engine_action;
501852ba100SJustin Hibbits break;
502852ba100SJustin Hibbits
503852ba100SJustin Hibbits case E_FMAN_PCD_PLCR:
504852ba100SJustin Hibbits nia = KG_NIA_ENG_PLCR | next_engine_action;
505852ba100SJustin Hibbits break;
506852ba100SJustin Hibbits
507852ba100SJustin Hibbits default:
508852ba100SJustin Hibbits nia = KG_NIA_INVALID;
509852ba100SJustin Hibbits }
510852ba100SJustin Hibbits
511852ba100SJustin Hibbits return nia;
512852ba100SJustin Hibbits }
513852ba100SJustin Hibbits
514852ba100SJustin Hibbits #endif /* __FSL_FMAN_KG_H */
515