1*852ba100SJustin Hibbits /*
2*852ba100SJustin Hibbits * Copyright 2008-2012 Freescale Semiconductor Inc.
3*852ba100SJustin Hibbits *
4*852ba100SJustin Hibbits * Redistribution and use in source and binary forms, with or without
5*852ba100SJustin Hibbits * modification, are permitted provided that the following conditions are met:
6*852ba100SJustin Hibbits * * Redistributions of source code must retain the above copyright
7*852ba100SJustin Hibbits * notice, this list of conditions and the following disclaimer.
8*852ba100SJustin Hibbits * * Redistributions in binary form must reproduce the above copyright
9*852ba100SJustin Hibbits * notice, this list of conditions and the following disclaimer in the
10*852ba100SJustin Hibbits * documentation and/or other materials provided with the distribution.
11*852ba100SJustin Hibbits * * Neither the name of Freescale Semiconductor nor the
12*852ba100SJustin Hibbits * names of its contributors may be used to endorse or promote products
13*852ba100SJustin Hibbits * derived from this software without specific prior written permission.
14*852ba100SJustin Hibbits *
15*852ba100SJustin Hibbits *
16*852ba100SJustin Hibbits * ALTERNATIVELY, this software may be distributed under the terms of the
17*852ba100SJustin Hibbits * GNU General Public License ("GPL") as published by the Free Software
18*852ba100SJustin Hibbits * Foundation, either version 2 of that License or (at your option) any
19*852ba100SJustin Hibbits * later version.
20*852ba100SJustin Hibbits *
21*852ba100SJustin Hibbits * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22*852ba100SJustin Hibbits * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23*852ba100SJustin Hibbits * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24*852ba100SJustin Hibbits * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25*852ba100SJustin Hibbits * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26*852ba100SJustin Hibbits * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27*852ba100SJustin Hibbits * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28*852ba100SJustin Hibbits * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*852ba100SJustin Hibbits * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30*852ba100SJustin Hibbits * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*852ba100SJustin Hibbits */
32*852ba100SJustin Hibbits
33*852ba100SJustin Hibbits #include "fsl_fman_kg.h"
34*852ba100SJustin Hibbits
35*852ba100SJustin Hibbits /****************************************/
36*852ba100SJustin Hibbits /* static functions */
37*852ba100SJustin Hibbits /****************************************/
38*852ba100SJustin Hibbits
39*852ba100SJustin Hibbits
build_ar_bind_scheme(uint8_t hwport_id,bool write)40*852ba100SJustin Hibbits static uint32_t build_ar_bind_scheme(uint8_t hwport_id, bool write)
41*852ba100SJustin Hibbits {
42*852ba100SJustin Hibbits uint32_t rw;
43*852ba100SJustin Hibbits
44*852ba100SJustin Hibbits rw = write ? (uint32_t)FM_KG_KGAR_WRITE : (uint32_t)FM_KG_KGAR_READ;
45*852ba100SJustin Hibbits
46*852ba100SJustin Hibbits return (uint32_t)(FM_KG_KGAR_GO |
47*852ba100SJustin Hibbits rw |
48*852ba100SJustin Hibbits FM_PCD_KG_KGAR_SEL_PORT_ENTRY |
49*852ba100SJustin Hibbits hwport_id |
50*852ba100SJustin Hibbits FM_PCD_KG_KGAR_SEL_PORT_WSEL_SP);
51*852ba100SJustin Hibbits }
52*852ba100SJustin Hibbits
clear_pe_all_scheme(struct fman_kg_regs * regs,uint8_t hwport_id)53*852ba100SJustin Hibbits static void clear_pe_all_scheme(struct fman_kg_regs *regs, uint8_t hwport_id)
54*852ba100SJustin Hibbits {
55*852ba100SJustin Hibbits uint32_t ar;
56*852ba100SJustin Hibbits
57*852ba100SJustin Hibbits fman_kg_write_sp(regs, 0xffffffff, 0);
58*852ba100SJustin Hibbits
59*852ba100SJustin Hibbits ar = build_ar_bind_scheme(hwport_id, TRUE);
60*852ba100SJustin Hibbits fman_kg_write_ar_wait(regs, ar);
61*852ba100SJustin Hibbits }
62*852ba100SJustin Hibbits
build_ar_bind_cls_plan(uint8_t hwport_id,bool write)63*852ba100SJustin Hibbits static uint32_t build_ar_bind_cls_plan(uint8_t hwport_id, bool write)
64*852ba100SJustin Hibbits {
65*852ba100SJustin Hibbits uint32_t rw;
66*852ba100SJustin Hibbits
67*852ba100SJustin Hibbits rw = write ? (uint32_t)FM_KG_KGAR_WRITE : (uint32_t)FM_KG_KGAR_READ;
68*852ba100SJustin Hibbits
69*852ba100SJustin Hibbits return (uint32_t)(FM_KG_KGAR_GO |
70*852ba100SJustin Hibbits rw |
71*852ba100SJustin Hibbits FM_PCD_KG_KGAR_SEL_PORT_ENTRY |
72*852ba100SJustin Hibbits hwport_id |
73*852ba100SJustin Hibbits FM_PCD_KG_KGAR_SEL_PORT_WSEL_CPP);
74*852ba100SJustin Hibbits }
75*852ba100SJustin Hibbits
clear_pe_all_cls_plan(struct fman_kg_regs * regs,uint8_t hwport_id)76*852ba100SJustin Hibbits static void clear_pe_all_cls_plan(struct fman_kg_regs *regs, uint8_t hwport_id)
77*852ba100SJustin Hibbits {
78*852ba100SJustin Hibbits uint32_t ar;
79*852ba100SJustin Hibbits
80*852ba100SJustin Hibbits fman_kg_write_cpp(regs, 0);
81*852ba100SJustin Hibbits
82*852ba100SJustin Hibbits ar = build_ar_bind_cls_plan(hwport_id, TRUE);
83*852ba100SJustin Hibbits fman_kg_write_ar_wait(regs, ar);
84*852ba100SJustin Hibbits }
85*852ba100SJustin Hibbits
get_gen_ht_code(enum fman_kg_gen_extract_src src,bool no_validation,uint8_t * offset)86*852ba100SJustin Hibbits static uint8_t get_gen_ht_code(enum fman_kg_gen_extract_src src,
87*852ba100SJustin Hibbits bool no_validation,
88*852ba100SJustin Hibbits uint8_t *offset)
89*852ba100SJustin Hibbits {
90*852ba100SJustin Hibbits int code;
91*852ba100SJustin Hibbits
92*852ba100SJustin Hibbits switch (src) {
93*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_ETH:
94*852ba100SJustin Hibbits code = no_validation ? 0x73 : 0x3;
95*852ba100SJustin Hibbits break;
96*852ba100SJustin Hibbits
97*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_ETYPE:
98*852ba100SJustin Hibbits code = no_validation ? 0x77 : 0x7;
99*852ba100SJustin Hibbits break;
100*852ba100SJustin Hibbits
101*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_SNAP:
102*852ba100SJustin Hibbits code = no_validation ? 0x74 : 0x4;
103*852ba100SJustin Hibbits break;
104*852ba100SJustin Hibbits
105*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_VLAN_TCI_1:
106*852ba100SJustin Hibbits code = no_validation ? 0x75 : 0x5;
107*852ba100SJustin Hibbits break;
108*852ba100SJustin Hibbits
109*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_VLAN_TCI_N:
110*852ba100SJustin Hibbits code = no_validation ? 0x76 : 0x6;
111*852ba100SJustin Hibbits break;
112*852ba100SJustin Hibbits
113*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_PPPoE:
114*852ba100SJustin Hibbits code = no_validation ? 0x78 : 0x8;
115*852ba100SJustin Hibbits break;
116*852ba100SJustin Hibbits
117*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_MPLS_1:
118*852ba100SJustin Hibbits code = no_validation ? 0x79 : 0x9;
119*852ba100SJustin Hibbits break;
120*852ba100SJustin Hibbits
121*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_MPLS_2:
122*852ba100SJustin Hibbits code = no_validation ? FM_KG_SCH_GEN_HT_INVALID : 0x19;
123*852ba100SJustin Hibbits break;
124*852ba100SJustin Hibbits
125*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_MPLS_3:
126*852ba100SJustin Hibbits code = no_validation ? FM_KG_SCH_GEN_HT_INVALID : 0x29;
127*852ba100SJustin Hibbits break;
128*852ba100SJustin Hibbits
129*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_MPLS_N:
130*852ba100SJustin Hibbits code = no_validation ? 0x7a : 0xa;
131*852ba100SJustin Hibbits break;
132*852ba100SJustin Hibbits
133*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_IPv4_1:
134*852ba100SJustin Hibbits code = no_validation ? 0x7b : 0xb;
135*852ba100SJustin Hibbits break;
136*852ba100SJustin Hibbits
137*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_IPv6_1:
138*852ba100SJustin Hibbits code = no_validation ? 0x7b : 0x1b;
139*852ba100SJustin Hibbits break;
140*852ba100SJustin Hibbits
141*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_IPv4_2:
142*852ba100SJustin Hibbits code = no_validation ? 0x7c : 0xc;
143*852ba100SJustin Hibbits break;
144*852ba100SJustin Hibbits
145*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_IPv6_2:
146*852ba100SJustin Hibbits code = no_validation ? 0x7c : 0x1c;
147*852ba100SJustin Hibbits break;
148*852ba100SJustin Hibbits
149*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_MINENCAP:
150*852ba100SJustin Hibbits code = no_validation ? 0x7c : 0x2c;
151*852ba100SJustin Hibbits break;
152*852ba100SJustin Hibbits
153*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_IP_PID:
154*852ba100SJustin Hibbits code = no_validation ? 0x72 : 0x2;
155*852ba100SJustin Hibbits break;
156*852ba100SJustin Hibbits
157*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_GRE:
158*852ba100SJustin Hibbits code = no_validation ? 0x7d : 0xd;
159*852ba100SJustin Hibbits break;
160*852ba100SJustin Hibbits
161*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_TCP:
162*852ba100SJustin Hibbits code = no_validation ? 0x7e : 0xe;
163*852ba100SJustin Hibbits break;
164*852ba100SJustin Hibbits
165*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_UDP:
166*852ba100SJustin Hibbits code = no_validation ? 0x7e : 0x1e;
167*852ba100SJustin Hibbits break;
168*852ba100SJustin Hibbits
169*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_SCTP:
170*852ba100SJustin Hibbits code = no_validation ? 0x7e : 0x3e;
171*852ba100SJustin Hibbits break;
172*852ba100SJustin Hibbits
173*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_DCCP:
174*852ba100SJustin Hibbits code = no_validation ? 0x7e : 0x4e;
175*852ba100SJustin Hibbits break;
176*852ba100SJustin Hibbits
177*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_IPSEC_AH:
178*852ba100SJustin Hibbits code = no_validation ? 0x7e : 0x2e;
179*852ba100SJustin Hibbits break;
180*852ba100SJustin Hibbits
181*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_IPSEC_ESP:
182*852ba100SJustin Hibbits code = no_validation ? 0x7e : 0x6e;
183*852ba100SJustin Hibbits break;
184*852ba100SJustin Hibbits
185*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_SHIM_1:
186*852ba100SJustin Hibbits code = 0x70;
187*852ba100SJustin Hibbits break;
188*852ba100SJustin Hibbits
189*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_SHIM_2:
190*852ba100SJustin Hibbits code = 0x71;
191*852ba100SJustin Hibbits break;
192*852ba100SJustin Hibbits
193*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_FROM_DFLT:
194*852ba100SJustin Hibbits code = 0x10;
195*852ba100SJustin Hibbits break;
196*852ba100SJustin Hibbits
197*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_FROM_FRAME_START:
198*852ba100SJustin Hibbits code = 0x40;
199*852ba100SJustin Hibbits break;
200*852ba100SJustin Hibbits
201*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_FROM_PARSE_RESULT:
202*852ba100SJustin Hibbits code = 0x20;
203*852ba100SJustin Hibbits break;
204*852ba100SJustin Hibbits
205*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_FROM_END_OF_PARSE:
206*852ba100SJustin Hibbits code = 0x7f;
207*852ba100SJustin Hibbits break;
208*852ba100SJustin Hibbits
209*852ba100SJustin Hibbits case E_FMAN_KG_GEN_EXTRACT_FROM_FQID:
210*852ba100SJustin Hibbits code = 0x20;
211*852ba100SJustin Hibbits *offset += 0x20;
212*852ba100SJustin Hibbits break;
213*852ba100SJustin Hibbits
214*852ba100SJustin Hibbits default:
215*852ba100SJustin Hibbits code = FM_KG_SCH_GEN_HT_INVALID;
216*852ba100SJustin Hibbits }
217*852ba100SJustin Hibbits
218*852ba100SJustin Hibbits return (uint8_t)code;
219*852ba100SJustin Hibbits }
220*852ba100SJustin Hibbits
build_ar_scheme(uint8_t scheme,uint8_t hwport_id,bool update_counter,bool write)221*852ba100SJustin Hibbits static uint32_t build_ar_scheme(uint8_t scheme,
222*852ba100SJustin Hibbits uint8_t hwport_id,
223*852ba100SJustin Hibbits bool update_counter,
224*852ba100SJustin Hibbits bool write)
225*852ba100SJustin Hibbits {
226*852ba100SJustin Hibbits uint32_t rw;
227*852ba100SJustin Hibbits
228*852ba100SJustin Hibbits rw = (uint32_t)(write ? FM_KG_KGAR_WRITE : FM_KG_KGAR_READ);
229*852ba100SJustin Hibbits
230*852ba100SJustin Hibbits return (uint32_t)(FM_KG_KGAR_GO |
231*852ba100SJustin Hibbits rw |
232*852ba100SJustin Hibbits FM_KG_KGAR_SEL_SCHEME_ENTRY |
233*852ba100SJustin Hibbits hwport_id |
234*852ba100SJustin Hibbits ((uint32_t)scheme << FM_KG_KGAR_NUM_SHIFT) |
235*852ba100SJustin Hibbits (update_counter ? FM_KG_KGAR_SCM_WSEL_UPDATE_CNT : 0));
236*852ba100SJustin Hibbits }
237*852ba100SJustin Hibbits
build_ar_cls_plan(uint8_t grp,uint8_t entries_mask,uint8_t hwport_id,bool write)238*852ba100SJustin Hibbits static uint32_t build_ar_cls_plan(uint8_t grp,
239*852ba100SJustin Hibbits uint8_t entries_mask,
240*852ba100SJustin Hibbits uint8_t hwport_id,
241*852ba100SJustin Hibbits bool write)
242*852ba100SJustin Hibbits {
243*852ba100SJustin Hibbits uint32_t rw;
244*852ba100SJustin Hibbits
245*852ba100SJustin Hibbits rw = (uint32_t)(write ? FM_KG_KGAR_WRITE : FM_KG_KGAR_READ);
246*852ba100SJustin Hibbits
247*852ba100SJustin Hibbits return (uint32_t)(FM_KG_KGAR_GO |
248*852ba100SJustin Hibbits rw |
249*852ba100SJustin Hibbits FM_PCD_KG_KGAR_SEL_CLS_PLAN_ENTRY |
250*852ba100SJustin Hibbits hwport_id |
251*852ba100SJustin Hibbits ((uint32_t)grp << FM_KG_KGAR_NUM_SHIFT) |
252*852ba100SJustin Hibbits ((uint32_t)entries_mask << FM_KG_KGAR_WSEL_SHIFT));
253*852ba100SJustin Hibbits }
254*852ba100SJustin Hibbits
fman_kg_write_ar_wait(struct fman_kg_regs * regs,uint32_t fmkg_ar)255*852ba100SJustin Hibbits int fman_kg_write_ar_wait(struct fman_kg_regs *regs, uint32_t fmkg_ar)
256*852ba100SJustin Hibbits {
257*852ba100SJustin Hibbits iowrite32be(fmkg_ar, ®s->fmkg_ar);
258*852ba100SJustin Hibbits /* Wait for GO to be idle and read error */
259*852ba100SJustin Hibbits while ((fmkg_ar = ioread32be(®s->fmkg_ar)) & FM_KG_KGAR_GO) ;
260*852ba100SJustin Hibbits if (fmkg_ar & FM_PCD_KG_KGAR_ERR)
261*852ba100SJustin Hibbits return -EINVAL;
262*852ba100SJustin Hibbits return 0;
263*852ba100SJustin Hibbits }
264*852ba100SJustin Hibbits
fman_kg_write_sp(struct fman_kg_regs * regs,uint32_t sp,bool add)265*852ba100SJustin Hibbits void fman_kg_write_sp(struct fman_kg_regs *regs, uint32_t sp, bool add)
266*852ba100SJustin Hibbits {
267*852ba100SJustin Hibbits
268*852ba100SJustin Hibbits struct fman_kg_pe_regs *kgpe_regs;
269*852ba100SJustin Hibbits uint32_t tmp;
270*852ba100SJustin Hibbits
271*852ba100SJustin Hibbits kgpe_regs = (struct fman_kg_pe_regs *)&(regs->fmkg_indirect[0]);
272*852ba100SJustin Hibbits tmp = ioread32be(&kgpe_regs->fmkg_pe_sp);
273*852ba100SJustin Hibbits
274*852ba100SJustin Hibbits if (add)
275*852ba100SJustin Hibbits tmp |= sp;
276*852ba100SJustin Hibbits else /* clear */
277*852ba100SJustin Hibbits tmp &= ~sp;
278*852ba100SJustin Hibbits
279*852ba100SJustin Hibbits iowrite32be(tmp, &kgpe_regs->fmkg_pe_sp);
280*852ba100SJustin Hibbits
281*852ba100SJustin Hibbits }
282*852ba100SJustin Hibbits
fman_kg_write_cpp(struct fman_kg_regs * regs,uint32_t cpp)283*852ba100SJustin Hibbits void fman_kg_write_cpp(struct fman_kg_regs *regs, uint32_t cpp)
284*852ba100SJustin Hibbits {
285*852ba100SJustin Hibbits struct fman_kg_pe_regs *kgpe_regs;
286*852ba100SJustin Hibbits
287*852ba100SJustin Hibbits kgpe_regs = (struct fman_kg_pe_regs *)&(regs->fmkg_indirect[0]);
288*852ba100SJustin Hibbits
289*852ba100SJustin Hibbits iowrite32be(cpp, &kgpe_regs->fmkg_pe_cpp);
290*852ba100SJustin Hibbits }
291*852ba100SJustin Hibbits
fman_kg_get_event(struct fman_kg_regs * regs,uint32_t * event,uint32_t * scheme_idx)292*852ba100SJustin Hibbits void fman_kg_get_event(struct fman_kg_regs *regs,
293*852ba100SJustin Hibbits uint32_t *event,
294*852ba100SJustin Hibbits uint32_t *scheme_idx)
295*852ba100SJustin Hibbits {
296*852ba100SJustin Hibbits uint32_t mask, force;
297*852ba100SJustin Hibbits
298*852ba100SJustin Hibbits *event = ioread32be(®s->fmkg_eer);
299*852ba100SJustin Hibbits mask = ioread32be(®s->fmkg_eeer);
300*852ba100SJustin Hibbits *scheme_idx = ioread32be(®s->fmkg_seer);
301*852ba100SJustin Hibbits *scheme_idx &= ioread32be(®s->fmkg_seeer);
302*852ba100SJustin Hibbits
303*852ba100SJustin Hibbits *event &= mask;
304*852ba100SJustin Hibbits
305*852ba100SJustin Hibbits /* clear the forced events */
306*852ba100SJustin Hibbits force = ioread32be(®s->fmkg_feer);
307*852ba100SJustin Hibbits if (force & *event)
308*852ba100SJustin Hibbits iowrite32be(force & ~*event ,®s->fmkg_feer);
309*852ba100SJustin Hibbits
310*852ba100SJustin Hibbits iowrite32be(*event, ®s->fmkg_eer);
311*852ba100SJustin Hibbits iowrite32be(*scheme_idx, ®s->fmkg_seer);
312*852ba100SJustin Hibbits }
313*852ba100SJustin Hibbits
314*852ba100SJustin Hibbits
fman_kg_init(struct fman_kg_regs * regs,uint32_t exceptions,uint32_t dflt_nia)315*852ba100SJustin Hibbits void fman_kg_init(struct fman_kg_regs *regs,
316*852ba100SJustin Hibbits uint32_t exceptions,
317*852ba100SJustin Hibbits uint32_t dflt_nia)
318*852ba100SJustin Hibbits {
319*852ba100SJustin Hibbits uint32_t tmp;
320*852ba100SJustin Hibbits int i;
321*852ba100SJustin Hibbits
322*852ba100SJustin Hibbits iowrite32be(FM_EX_KG_DOUBLE_ECC | FM_EX_KG_KEYSIZE_OVERFLOW,
323*852ba100SJustin Hibbits ®s->fmkg_eer);
324*852ba100SJustin Hibbits
325*852ba100SJustin Hibbits tmp = 0;
326*852ba100SJustin Hibbits if (exceptions & FM_EX_KG_DOUBLE_ECC)
327*852ba100SJustin Hibbits tmp |= FM_EX_KG_DOUBLE_ECC;
328*852ba100SJustin Hibbits
329*852ba100SJustin Hibbits if (exceptions & FM_EX_KG_KEYSIZE_OVERFLOW)
330*852ba100SJustin Hibbits tmp |= FM_EX_KG_KEYSIZE_OVERFLOW;
331*852ba100SJustin Hibbits
332*852ba100SJustin Hibbits iowrite32be(tmp, ®s->fmkg_eeer);
333*852ba100SJustin Hibbits iowrite32be(0, ®s->fmkg_fdor);
334*852ba100SJustin Hibbits iowrite32be(0, ®s->fmkg_gdv0r);
335*852ba100SJustin Hibbits iowrite32be(0, ®s->fmkg_gdv1r);
336*852ba100SJustin Hibbits iowrite32be(dflt_nia, ®s->fmkg_gcr);
337*852ba100SJustin Hibbits
338*852ba100SJustin Hibbits /* Clear binding between ports to schemes and classification plans
339*852ba100SJustin Hibbits * so that all ports are not bound to any scheme/classification plan */
340*852ba100SJustin Hibbits for (i = 0; i < FMAN_MAX_NUM_OF_HW_PORTS; i++) {
341*852ba100SJustin Hibbits clear_pe_all_scheme(regs, (uint8_t)i);
342*852ba100SJustin Hibbits clear_pe_all_cls_plan(regs, (uint8_t)i);
343*852ba100SJustin Hibbits }
344*852ba100SJustin Hibbits }
345*852ba100SJustin Hibbits
fman_kg_enable_scheme_interrupts(struct fman_kg_regs * regs)346*852ba100SJustin Hibbits void fman_kg_enable_scheme_interrupts(struct fman_kg_regs *regs)
347*852ba100SJustin Hibbits {
348*852ba100SJustin Hibbits /* enable and enable all scheme interrupts */
349*852ba100SJustin Hibbits iowrite32be(0xFFFFFFFF, ®s->fmkg_seer);
350*852ba100SJustin Hibbits iowrite32be(0xFFFFFFFF, ®s->fmkg_seeer);
351*852ba100SJustin Hibbits }
352*852ba100SJustin Hibbits
fman_kg_enable(struct fman_kg_regs * regs)353*852ba100SJustin Hibbits void fman_kg_enable(struct fman_kg_regs *regs)
354*852ba100SJustin Hibbits {
355*852ba100SJustin Hibbits iowrite32be(ioread32be(®s->fmkg_gcr) | FM_KG_KGGCR_EN,
356*852ba100SJustin Hibbits ®s->fmkg_gcr);
357*852ba100SJustin Hibbits }
358*852ba100SJustin Hibbits
fman_kg_disable(struct fman_kg_regs * regs)359*852ba100SJustin Hibbits void fman_kg_disable(struct fman_kg_regs *regs)
360*852ba100SJustin Hibbits {
361*852ba100SJustin Hibbits iowrite32be(ioread32be(®s->fmkg_gcr) & ~FM_KG_KGGCR_EN,
362*852ba100SJustin Hibbits ®s->fmkg_gcr);
363*852ba100SJustin Hibbits }
364*852ba100SJustin Hibbits
fman_kg_set_data_after_prs(struct fman_kg_regs * regs,uint8_t offset)365*852ba100SJustin Hibbits void fman_kg_set_data_after_prs(struct fman_kg_regs *regs, uint8_t offset)
366*852ba100SJustin Hibbits {
367*852ba100SJustin Hibbits iowrite32be(offset, ®s->fmkg_fdor);
368*852ba100SJustin Hibbits }
369*852ba100SJustin Hibbits
fman_kg_set_dflt_val(struct fman_kg_regs * regs,uint8_t def_id,uint32_t val)370*852ba100SJustin Hibbits void fman_kg_set_dflt_val(struct fman_kg_regs *regs,
371*852ba100SJustin Hibbits uint8_t def_id,
372*852ba100SJustin Hibbits uint32_t val)
373*852ba100SJustin Hibbits {
374*852ba100SJustin Hibbits if(def_id == 0)
375*852ba100SJustin Hibbits iowrite32be(val, ®s->fmkg_gdv0r);
376*852ba100SJustin Hibbits else
377*852ba100SJustin Hibbits iowrite32be(val, ®s->fmkg_gdv1r);
378*852ba100SJustin Hibbits }
379*852ba100SJustin Hibbits
380*852ba100SJustin Hibbits
fman_kg_set_exception(struct fman_kg_regs * regs,uint32_t exception,bool enable)381*852ba100SJustin Hibbits void fman_kg_set_exception(struct fman_kg_regs *regs,
382*852ba100SJustin Hibbits uint32_t exception,
383*852ba100SJustin Hibbits bool enable)
384*852ba100SJustin Hibbits {
385*852ba100SJustin Hibbits uint32_t tmp;
386*852ba100SJustin Hibbits
387*852ba100SJustin Hibbits tmp = ioread32be(®s->fmkg_eeer);
388*852ba100SJustin Hibbits
389*852ba100SJustin Hibbits if (enable) {
390*852ba100SJustin Hibbits tmp |= exception;
391*852ba100SJustin Hibbits } else {
392*852ba100SJustin Hibbits tmp &= ~exception;
393*852ba100SJustin Hibbits }
394*852ba100SJustin Hibbits
395*852ba100SJustin Hibbits iowrite32be(tmp, ®s->fmkg_eeer);
396*852ba100SJustin Hibbits }
397*852ba100SJustin Hibbits
fman_kg_get_exception(struct fman_kg_regs * regs,uint32_t * events,uint32_t * scheme_ids,bool clear)398*852ba100SJustin Hibbits void fman_kg_get_exception(struct fman_kg_regs *regs,
399*852ba100SJustin Hibbits uint32_t *events,
400*852ba100SJustin Hibbits uint32_t *scheme_ids,
401*852ba100SJustin Hibbits bool clear)
402*852ba100SJustin Hibbits {
403*852ba100SJustin Hibbits uint32_t mask;
404*852ba100SJustin Hibbits
405*852ba100SJustin Hibbits *events = ioread32be(®s->fmkg_eer);
406*852ba100SJustin Hibbits mask = ioread32be(®s->fmkg_eeer);
407*852ba100SJustin Hibbits *events &= mask;
408*852ba100SJustin Hibbits
409*852ba100SJustin Hibbits *scheme_ids = 0;
410*852ba100SJustin Hibbits
411*852ba100SJustin Hibbits if (*events & FM_EX_KG_KEYSIZE_OVERFLOW) {
412*852ba100SJustin Hibbits *scheme_ids = ioread32be(®s->fmkg_seer);
413*852ba100SJustin Hibbits mask = ioread32be(®s->fmkg_seeer);
414*852ba100SJustin Hibbits *scheme_ids &= mask;
415*852ba100SJustin Hibbits }
416*852ba100SJustin Hibbits
417*852ba100SJustin Hibbits if (clear) {
418*852ba100SJustin Hibbits iowrite32be(*scheme_ids, ®s->fmkg_seer);
419*852ba100SJustin Hibbits iowrite32be(*events, ®s->fmkg_eer);
420*852ba100SJustin Hibbits }
421*852ba100SJustin Hibbits }
422*852ba100SJustin Hibbits
fman_kg_get_capture(struct fman_kg_regs * regs,struct fman_kg_ex_ecc_attr * ecc_attr,bool clear)423*852ba100SJustin Hibbits void fman_kg_get_capture(struct fman_kg_regs *regs,
424*852ba100SJustin Hibbits struct fman_kg_ex_ecc_attr *ecc_attr,
425*852ba100SJustin Hibbits bool clear)
426*852ba100SJustin Hibbits {
427*852ba100SJustin Hibbits uint32_t tmp;
428*852ba100SJustin Hibbits
429*852ba100SJustin Hibbits tmp = ioread32be(®s->fmkg_serc);
430*852ba100SJustin Hibbits
431*852ba100SJustin Hibbits if (tmp & KG_FMKG_SERC_CAP) {
432*852ba100SJustin Hibbits /* Captured data is valid */
433*852ba100SJustin Hibbits ecc_attr->valid = TRUE;
434*852ba100SJustin Hibbits ecc_attr->double_ecc =
435*852ba100SJustin Hibbits (bool)((tmp & KG_FMKG_SERC_CET) ? TRUE : FALSE);
436*852ba100SJustin Hibbits ecc_attr->single_ecc_count =
437*852ba100SJustin Hibbits (uint8_t)((tmp & KG_FMKG_SERC_CNT_MSK) >>
438*852ba100SJustin Hibbits KG_FMKG_SERC_CNT_SHIFT);
439*852ba100SJustin Hibbits ecc_attr->addr = (uint16_t)(tmp & KG_FMKG_SERC_ADDR_MSK);
440*852ba100SJustin Hibbits
441*852ba100SJustin Hibbits if (clear)
442*852ba100SJustin Hibbits iowrite32be(KG_FMKG_SERC_CAP, ®s->fmkg_serc);
443*852ba100SJustin Hibbits } else {
444*852ba100SJustin Hibbits /* No ECC error is captured */
445*852ba100SJustin Hibbits ecc_attr->valid = FALSE;
446*852ba100SJustin Hibbits }
447*852ba100SJustin Hibbits }
448*852ba100SJustin Hibbits
fman_kg_build_scheme(struct fman_kg_scheme_params * params,struct fman_kg_scheme_regs * scheme_regs)449*852ba100SJustin Hibbits int fman_kg_build_scheme(struct fman_kg_scheme_params *params,
450*852ba100SJustin Hibbits struct fman_kg_scheme_regs *scheme_regs)
451*852ba100SJustin Hibbits {
452*852ba100SJustin Hibbits struct fman_kg_extract_params *extract_params;
453*852ba100SJustin Hibbits struct fman_kg_gen_extract_params *gen_params;
454*852ba100SJustin Hibbits uint32_t tmp_reg, i, select, mask, fqb;
455*852ba100SJustin Hibbits uint8_t offset, shift, ht;
456*852ba100SJustin Hibbits
457*852ba100SJustin Hibbits /* Zero out all registers so no need to care about unused ones */
458*852ba100SJustin Hibbits memset(scheme_regs, 0, sizeof(struct fman_kg_scheme_regs));
459*852ba100SJustin Hibbits
460*852ba100SJustin Hibbits /* Mode register */
461*852ba100SJustin Hibbits tmp_reg = fm_kg_build_nia(params->next_engine,
462*852ba100SJustin Hibbits params->next_engine_action);
463*852ba100SJustin Hibbits if (tmp_reg == KG_NIA_INVALID) {
464*852ba100SJustin Hibbits return -EINVAL;
465*852ba100SJustin Hibbits }
466*852ba100SJustin Hibbits
467*852ba100SJustin Hibbits if (params->next_engine == E_FMAN_PCD_PLCR) {
468*852ba100SJustin Hibbits tmp_reg |= FMAN_KG_SCH_MODE_NIA_PLCR;
469*852ba100SJustin Hibbits }
470*852ba100SJustin Hibbits else if (params->next_engine == E_FMAN_PCD_CC) {
471*852ba100SJustin Hibbits tmp_reg |= (uint32_t)params->cc_params.base_offset <<
472*852ba100SJustin Hibbits FMAN_KG_SCH_MODE_CCOBASE_SHIFT;
473*852ba100SJustin Hibbits }
474*852ba100SJustin Hibbits
475*852ba100SJustin Hibbits tmp_reg |= FMAN_KG_SCH_MODE_EN;
476*852ba100SJustin Hibbits scheme_regs->kgse_mode = tmp_reg;
477*852ba100SJustin Hibbits
478*852ba100SJustin Hibbits /* Match vector */
479*852ba100SJustin Hibbits scheme_regs->kgse_mv = params->match_vector;
480*852ba100SJustin Hibbits
481*852ba100SJustin Hibbits extract_params = ¶ms->extract_params;
482*852ba100SJustin Hibbits
483*852ba100SJustin Hibbits /* Scheme default values registers */
484*852ba100SJustin Hibbits scheme_regs->kgse_dv0 = extract_params->def_scheme_0;
485*852ba100SJustin Hibbits scheme_regs->kgse_dv1 = extract_params->def_scheme_1;
486*852ba100SJustin Hibbits
487*852ba100SJustin Hibbits /* Extract Known Fields Command register */
488*852ba100SJustin Hibbits scheme_regs->kgse_ekfc = extract_params->known_fields;
489*852ba100SJustin Hibbits
490*852ba100SJustin Hibbits /* Entry Extract Known Default Value register */
491*852ba100SJustin Hibbits tmp_reg = 0;
492*852ba100SJustin Hibbits tmp_reg |= extract_params->known_fields_def.mac_addr <<
493*852ba100SJustin Hibbits FMAN_KG_SCH_DEF_MAC_ADDR_SHIFT;
494*852ba100SJustin Hibbits tmp_reg |= extract_params->known_fields_def.vlan_tci <<
495*852ba100SJustin Hibbits FMAN_KG_SCH_DEF_VLAN_TCI_SHIFT;
496*852ba100SJustin Hibbits tmp_reg |= extract_params->known_fields_def.etype <<
497*852ba100SJustin Hibbits FMAN_KG_SCH_DEF_ETYPE_SHIFT;
498*852ba100SJustin Hibbits tmp_reg |= extract_params->known_fields_def.ppp_sid <<
499*852ba100SJustin Hibbits FMAN_KG_SCH_DEF_PPP_SID_SHIFT;
500*852ba100SJustin Hibbits tmp_reg |= extract_params->known_fields_def.ppp_pid <<
501*852ba100SJustin Hibbits FMAN_KG_SCH_DEF_PPP_PID_SHIFT;
502*852ba100SJustin Hibbits tmp_reg |= extract_params->known_fields_def.mpls <<
503*852ba100SJustin Hibbits FMAN_KG_SCH_DEF_MPLS_SHIFT;
504*852ba100SJustin Hibbits tmp_reg |= extract_params->known_fields_def.ip_addr <<
505*852ba100SJustin Hibbits FMAN_KG_SCH_DEF_IP_ADDR_SHIFT;
506*852ba100SJustin Hibbits tmp_reg |= extract_params->known_fields_def.ptype <<
507*852ba100SJustin Hibbits FMAN_KG_SCH_DEF_PTYPE_SHIFT;
508*852ba100SJustin Hibbits tmp_reg |= extract_params->known_fields_def.ip_tos_tc <<
509*852ba100SJustin Hibbits FMAN_KG_SCH_DEF_IP_TOS_TC_SHIFT;
510*852ba100SJustin Hibbits tmp_reg |= extract_params->known_fields_def.ipv6_fl <<
511*852ba100SJustin Hibbits FMAN_KG_SCH_DEF_IPv6_FL_SHIFT;
512*852ba100SJustin Hibbits tmp_reg |= extract_params->known_fields_def.ipsec_spi <<
513*852ba100SJustin Hibbits FMAN_KG_SCH_DEF_IPSEC_SPI_SHIFT;
514*852ba100SJustin Hibbits tmp_reg |= extract_params->known_fields_def.l4_port <<
515*852ba100SJustin Hibbits FMAN_KG_SCH_DEF_L4_PORT_SHIFT;
516*852ba100SJustin Hibbits tmp_reg |= extract_params->known_fields_def.tcp_flg <<
517*852ba100SJustin Hibbits FMAN_KG_SCH_DEF_TCP_FLG_SHIFT;
518*852ba100SJustin Hibbits
519*852ba100SJustin Hibbits scheme_regs->kgse_ekdv = tmp_reg;
520*852ba100SJustin Hibbits
521*852ba100SJustin Hibbits /* Generic extract registers */
522*852ba100SJustin Hibbits if (extract_params->gen_extract_num > FM_KG_NUM_OF_GENERIC_REGS) {
523*852ba100SJustin Hibbits return -EINVAL;
524*852ba100SJustin Hibbits }
525*852ba100SJustin Hibbits
526*852ba100SJustin Hibbits for (i = 0; i < extract_params->gen_extract_num; i++) {
527*852ba100SJustin Hibbits gen_params = extract_params->gen_extract + i;
528*852ba100SJustin Hibbits
529*852ba100SJustin Hibbits tmp_reg = FMAN_KG_SCH_GEN_VALID;
530*852ba100SJustin Hibbits tmp_reg |= (uint32_t)gen_params->def_val <<
531*852ba100SJustin Hibbits FMAN_KG_SCH_GEN_DEF_SHIFT;
532*852ba100SJustin Hibbits
533*852ba100SJustin Hibbits if (gen_params->type == E_FMAN_KG_HASH_EXTRACT) {
534*852ba100SJustin Hibbits if ((gen_params->extract > FMAN_KG_SCH_GEN_SIZE_MAX) ||
535*852ba100SJustin Hibbits (gen_params->extract == 0)) {
536*852ba100SJustin Hibbits return -EINVAL;
537*852ba100SJustin Hibbits }
538*852ba100SJustin Hibbits } else {
539*852ba100SJustin Hibbits tmp_reg |= FMAN_KG_SCH_GEN_OR;
540*852ba100SJustin Hibbits }
541*852ba100SJustin Hibbits
542*852ba100SJustin Hibbits tmp_reg |= (uint32_t)gen_params->extract <<
543*852ba100SJustin Hibbits FMAN_KG_SCH_GEN_SIZE_SHIFT;
544*852ba100SJustin Hibbits tmp_reg |= (uint32_t)gen_params->mask <<
545*852ba100SJustin Hibbits FMAN_KG_SCH_GEN_MASK_SHIFT;
546*852ba100SJustin Hibbits
547*852ba100SJustin Hibbits offset = gen_params->offset;
548*852ba100SJustin Hibbits ht = get_gen_ht_code(gen_params->src,
549*852ba100SJustin Hibbits gen_params->no_validation,
550*852ba100SJustin Hibbits &offset);
551*852ba100SJustin Hibbits tmp_reg |= (uint32_t)ht << FMAN_KG_SCH_GEN_HT_SHIFT;
552*852ba100SJustin Hibbits tmp_reg |= offset;
553*852ba100SJustin Hibbits
554*852ba100SJustin Hibbits scheme_regs->kgse_gec[i] = tmp_reg;
555*852ba100SJustin Hibbits }
556*852ba100SJustin Hibbits
557*852ba100SJustin Hibbits /* Masks registers */
558*852ba100SJustin Hibbits if (extract_params->masks_num > FM_KG_EXTRACT_MASKS_NUM) {
559*852ba100SJustin Hibbits return -EINVAL;
560*852ba100SJustin Hibbits }
561*852ba100SJustin Hibbits
562*852ba100SJustin Hibbits select = 0;
563*852ba100SJustin Hibbits mask = 0;
564*852ba100SJustin Hibbits fqb = 0;
565*852ba100SJustin Hibbits for (i = 0; i < extract_params->masks_num; i++) {
566*852ba100SJustin Hibbits /* MCSx fields */
567*852ba100SJustin Hibbits KG_GET_MASK_SEL_SHIFT(shift, i);
568*852ba100SJustin Hibbits if (extract_params->masks[i].is_known) {
569*852ba100SJustin Hibbits /* Mask known field */
570*852ba100SJustin Hibbits select |= extract_params->masks[i].field_or_gen_idx <<
571*852ba100SJustin Hibbits shift;
572*852ba100SJustin Hibbits } else {
573*852ba100SJustin Hibbits /* Mask generic extract */
574*852ba100SJustin Hibbits select |= (extract_params->masks[i].field_or_gen_idx +
575*852ba100SJustin Hibbits FM_KG_MASK_SEL_GEN_BASE) << shift;
576*852ba100SJustin Hibbits }
577*852ba100SJustin Hibbits
578*852ba100SJustin Hibbits /* MOx fields - spread between se_bmch and se_fqb registers */
579*852ba100SJustin Hibbits KG_GET_MASK_OFFSET_SHIFT(shift, i);
580*852ba100SJustin Hibbits if (i < 2) {
581*852ba100SJustin Hibbits select |= (uint32_t)extract_params->masks[i].offset <<
582*852ba100SJustin Hibbits shift;
583*852ba100SJustin Hibbits } else {
584*852ba100SJustin Hibbits fqb |= (uint32_t)extract_params->masks[i].offset <<
585*852ba100SJustin Hibbits shift;
586*852ba100SJustin Hibbits }
587*852ba100SJustin Hibbits
588*852ba100SJustin Hibbits /* BMx fields */
589*852ba100SJustin Hibbits KG_GET_MASK_SHIFT(shift, i);
590*852ba100SJustin Hibbits mask |= (uint32_t)extract_params->masks[i].mask << shift;
591*852ba100SJustin Hibbits }
592*852ba100SJustin Hibbits
593*852ba100SJustin Hibbits /* Finish with rest of BMx fileds -
594*852ba100SJustin Hibbits * don't mask bits for unused masks by setting
595*852ba100SJustin Hibbits * corresponding BMx field = 0xFF */
596*852ba100SJustin Hibbits for (i = extract_params->masks_num; i < FM_KG_EXTRACT_MASKS_NUM; i++) {
597*852ba100SJustin Hibbits KG_GET_MASK_SHIFT(shift, i);
598*852ba100SJustin Hibbits mask |= 0xFF << shift;
599*852ba100SJustin Hibbits }
600*852ba100SJustin Hibbits
601*852ba100SJustin Hibbits scheme_regs->kgse_bmch = select;
602*852ba100SJustin Hibbits scheme_regs->kgse_bmcl = mask;
603*852ba100SJustin Hibbits
604*852ba100SJustin Hibbits /* Finish with FQB register initialization.
605*852ba100SJustin Hibbits * Check fqid is 24-bit value. */
606*852ba100SJustin Hibbits if (params->base_fqid & ~0x00FFFFFF) {
607*852ba100SJustin Hibbits return -EINVAL;
608*852ba100SJustin Hibbits }
609*852ba100SJustin Hibbits
610*852ba100SJustin Hibbits fqb |= params->base_fqid;
611*852ba100SJustin Hibbits scheme_regs->kgse_fqb = fqb;
612*852ba100SJustin Hibbits
613*852ba100SJustin Hibbits /* Hash Configuration register */
614*852ba100SJustin Hibbits tmp_reg = 0;
615*852ba100SJustin Hibbits if (params->hash_params.use_hash) {
616*852ba100SJustin Hibbits /* Check hash mask is 24-bit value */
617*852ba100SJustin Hibbits if (params->hash_params.mask & ~0x00FFFFFF) {
618*852ba100SJustin Hibbits return -EINVAL;
619*852ba100SJustin Hibbits }
620*852ba100SJustin Hibbits
621*852ba100SJustin Hibbits /* Hash function produces 64-bit value, 24 bits of that
622*852ba100SJustin Hibbits * are used to generate fq_id and policer profile.
623*852ba100SJustin Hibbits * Thus, maximal shift is 40 bits to allow 24 bits out of 64.
624*852ba100SJustin Hibbits */
625*852ba100SJustin Hibbits if (params->hash_params.shift_r > FMAN_KG_SCH_HASH_HSHIFT_MAX) {
626*852ba100SJustin Hibbits return -EINVAL;
627*852ba100SJustin Hibbits }
628*852ba100SJustin Hibbits
629*852ba100SJustin Hibbits tmp_reg |= params->hash_params.mask;
630*852ba100SJustin Hibbits tmp_reg |= (uint32_t)params->hash_params.shift_r <<
631*852ba100SJustin Hibbits FMAN_KG_SCH_HASH_HSHIFT_SHIFT;
632*852ba100SJustin Hibbits
633*852ba100SJustin Hibbits if (params->hash_params.sym) {
634*852ba100SJustin Hibbits tmp_reg |= FMAN_KG_SCH_HASH_SYM;
635*852ba100SJustin Hibbits }
636*852ba100SJustin Hibbits
637*852ba100SJustin Hibbits }
638*852ba100SJustin Hibbits
639*852ba100SJustin Hibbits if (params->bypass_fqid_gen) {
640*852ba100SJustin Hibbits tmp_reg |= FMAN_KG_SCH_HASH_NO_FQID_GEN;
641*852ba100SJustin Hibbits }
642*852ba100SJustin Hibbits
643*852ba100SJustin Hibbits scheme_regs->kgse_hc = tmp_reg;
644*852ba100SJustin Hibbits
645*852ba100SJustin Hibbits /* Policer Profile register */
646*852ba100SJustin Hibbits if (params->policer_params.bypass_pp_gen) {
647*852ba100SJustin Hibbits tmp_reg = 0;
648*852ba100SJustin Hibbits } else {
649*852ba100SJustin Hibbits /* Lower 8 bits of 24-bits extracted from hash result
650*852ba100SJustin Hibbits * are used for policer profile generation.
651*852ba100SJustin Hibbits * That leaves maximum shift value = 23. */
652*852ba100SJustin Hibbits if (params->policer_params.shift > FMAN_KG_SCH_PP_SHIFT_MAX) {
653*852ba100SJustin Hibbits return -EINVAL;
654*852ba100SJustin Hibbits }
655*852ba100SJustin Hibbits
656*852ba100SJustin Hibbits tmp_reg = params->policer_params.base;
657*852ba100SJustin Hibbits tmp_reg |= ((uint32_t)params->policer_params.shift <<
658*852ba100SJustin Hibbits FMAN_KG_SCH_PP_SH_SHIFT) &
659*852ba100SJustin Hibbits FMAN_KG_SCH_PP_SH_MASK;
660*852ba100SJustin Hibbits tmp_reg |= ((uint32_t)params->policer_params.shift <<
661*852ba100SJustin Hibbits FMAN_KG_SCH_PP_SL_SHIFT) &
662*852ba100SJustin Hibbits FMAN_KG_SCH_PP_SL_MASK;
663*852ba100SJustin Hibbits tmp_reg |= (uint32_t)params->policer_params.mask <<
664*852ba100SJustin Hibbits FMAN_KG_SCH_PP_MASK_SHIFT;
665*852ba100SJustin Hibbits }
666*852ba100SJustin Hibbits
667*852ba100SJustin Hibbits scheme_regs->kgse_ppc = tmp_reg;
668*852ba100SJustin Hibbits
669*852ba100SJustin Hibbits /* Coarse Classification Bit Select register */
670*852ba100SJustin Hibbits if (params->next_engine == E_FMAN_PCD_CC) {
671*852ba100SJustin Hibbits scheme_regs->kgse_ccbs = params->cc_params.qlcv_bits_sel;
672*852ba100SJustin Hibbits }
673*852ba100SJustin Hibbits
674*852ba100SJustin Hibbits /* Packets Counter register */
675*852ba100SJustin Hibbits if (params->update_counter) {
676*852ba100SJustin Hibbits scheme_regs->kgse_spc = params->counter_value;
677*852ba100SJustin Hibbits }
678*852ba100SJustin Hibbits
679*852ba100SJustin Hibbits return 0;
680*852ba100SJustin Hibbits }
681*852ba100SJustin Hibbits
fman_kg_write_scheme(struct fman_kg_regs * regs,uint8_t scheme_id,uint8_t hwport_id,struct fman_kg_scheme_regs * scheme_regs,bool update_counter)682*852ba100SJustin Hibbits int fman_kg_write_scheme(struct fman_kg_regs *regs,
683*852ba100SJustin Hibbits uint8_t scheme_id,
684*852ba100SJustin Hibbits uint8_t hwport_id,
685*852ba100SJustin Hibbits struct fman_kg_scheme_regs *scheme_regs,
686*852ba100SJustin Hibbits bool update_counter)
687*852ba100SJustin Hibbits {
688*852ba100SJustin Hibbits struct fman_kg_scheme_regs *kgse_regs;
689*852ba100SJustin Hibbits uint32_t tmp_reg;
690*852ba100SJustin Hibbits int err, i;
691*852ba100SJustin Hibbits
692*852ba100SJustin Hibbits /* Write indirect scheme registers */
693*852ba100SJustin Hibbits kgse_regs = (struct fman_kg_scheme_regs *)&(regs->fmkg_indirect[0]);
694*852ba100SJustin Hibbits
695*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_mode, &kgse_regs->kgse_mode);
696*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_ekfc, &kgse_regs->kgse_ekfc);
697*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_ekdv, &kgse_regs->kgse_ekdv);
698*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_bmch, &kgse_regs->kgse_bmch);
699*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_bmcl, &kgse_regs->kgse_bmcl);
700*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_fqb, &kgse_regs->kgse_fqb);
701*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_hc, &kgse_regs->kgse_hc);
702*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_ppc, &kgse_regs->kgse_ppc);
703*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_spc, &kgse_regs->kgse_spc);
704*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_dv0, &kgse_regs->kgse_dv0);
705*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_dv1, &kgse_regs->kgse_dv1);
706*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_ccbs, &kgse_regs->kgse_ccbs);
707*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_mv, &kgse_regs->kgse_mv);
708*852ba100SJustin Hibbits
709*852ba100SJustin Hibbits for (i = 0 ; i < FM_KG_NUM_OF_GENERIC_REGS ; i++)
710*852ba100SJustin Hibbits iowrite32be(scheme_regs->kgse_gec[i], &kgse_regs->kgse_gec[i]);
711*852ba100SJustin Hibbits
712*852ba100SJustin Hibbits /* Write AR (Action register) */
713*852ba100SJustin Hibbits tmp_reg = build_ar_scheme(scheme_id, hwport_id, update_counter, TRUE);
714*852ba100SJustin Hibbits err = fman_kg_write_ar_wait(regs, tmp_reg);
715*852ba100SJustin Hibbits return err;
716*852ba100SJustin Hibbits }
717*852ba100SJustin Hibbits
fman_kg_delete_scheme(struct fman_kg_regs * regs,uint8_t scheme_id,uint8_t hwport_id)718*852ba100SJustin Hibbits int fman_kg_delete_scheme(struct fman_kg_regs *regs,
719*852ba100SJustin Hibbits uint8_t scheme_id,
720*852ba100SJustin Hibbits uint8_t hwport_id)
721*852ba100SJustin Hibbits {
722*852ba100SJustin Hibbits struct fman_kg_scheme_regs *kgse_regs;
723*852ba100SJustin Hibbits uint32_t tmp_reg;
724*852ba100SJustin Hibbits int err, i;
725*852ba100SJustin Hibbits
726*852ba100SJustin Hibbits kgse_regs = (struct fman_kg_scheme_regs *)&(regs->fmkg_indirect[0]);
727*852ba100SJustin Hibbits
728*852ba100SJustin Hibbits /* Clear all registers including enable bit in mode register */
729*852ba100SJustin Hibbits for (i = 0; i < (sizeof(struct fman_kg_scheme_regs)) / 4; ++i) {
730*852ba100SJustin Hibbits iowrite32be(0, ((uint32_t *)kgse_regs + i));
731*852ba100SJustin Hibbits }
732*852ba100SJustin Hibbits
733*852ba100SJustin Hibbits /* Write AR (Action register) */
734*852ba100SJustin Hibbits tmp_reg = build_ar_scheme(scheme_id, hwport_id, FALSE, TRUE);
735*852ba100SJustin Hibbits err = fman_kg_write_ar_wait(regs, tmp_reg);
736*852ba100SJustin Hibbits return err;
737*852ba100SJustin Hibbits }
738*852ba100SJustin Hibbits
fman_kg_get_scheme_counter(struct fman_kg_regs * regs,uint8_t scheme_id,uint8_t hwport_id,uint32_t * counter)739*852ba100SJustin Hibbits int fman_kg_get_scheme_counter(struct fman_kg_regs *regs,
740*852ba100SJustin Hibbits uint8_t scheme_id,
741*852ba100SJustin Hibbits uint8_t hwport_id,
742*852ba100SJustin Hibbits uint32_t *counter)
743*852ba100SJustin Hibbits {
744*852ba100SJustin Hibbits struct fman_kg_scheme_regs *kgse_regs;
745*852ba100SJustin Hibbits uint32_t tmp_reg;
746*852ba100SJustin Hibbits int err;
747*852ba100SJustin Hibbits
748*852ba100SJustin Hibbits kgse_regs = (struct fman_kg_scheme_regs *)&(regs->fmkg_indirect[0]);
749*852ba100SJustin Hibbits
750*852ba100SJustin Hibbits tmp_reg = build_ar_scheme(scheme_id, hwport_id, TRUE, FALSE);
751*852ba100SJustin Hibbits err = fman_kg_write_ar_wait(regs, tmp_reg);
752*852ba100SJustin Hibbits
753*852ba100SJustin Hibbits if (err != 0)
754*852ba100SJustin Hibbits return err;
755*852ba100SJustin Hibbits
756*852ba100SJustin Hibbits *counter = ioread32be(&kgse_regs->kgse_spc);
757*852ba100SJustin Hibbits
758*852ba100SJustin Hibbits return 0;
759*852ba100SJustin Hibbits }
760*852ba100SJustin Hibbits
fman_kg_set_scheme_counter(struct fman_kg_regs * regs,uint8_t scheme_id,uint8_t hwport_id,uint32_t counter)761*852ba100SJustin Hibbits int fman_kg_set_scheme_counter(struct fman_kg_regs *regs,
762*852ba100SJustin Hibbits uint8_t scheme_id,
763*852ba100SJustin Hibbits uint8_t hwport_id,
764*852ba100SJustin Hibbits uint32_t counter)
765*852ba100SJustin Hibbits {
766*852ba100SJustin Hibbits struct fman_kg_scheme_regs *kgse_regs;
767*852ba100SJustin Hibbits uint32_t tmp_reg;
768*852ba100SJustin Hibbits int err;
769*852ba100SJustin Hibbits
770*852ba100SJustin Hibbits kgse_regs = (struct fman_kg_scheme_regs *)&(regs->fmkg_indirect[0]);
771*852ba100SJustin Hibbits
772*852ba100SJustin Hibbits tmp_reg = build_ar_scheme(scheme_id, hwport_id, TRUE, FALSE);
773*852ba100SJustin Hibbits
774*852ba100SJustin Hibbits err = fman_kg_write_ar_wait(regs, tmp_reg);
775*852ba100SJustin Hibbits if (err != 0)
776*852ba100SJustin Hibbits return err;
777*852ba100SJustin Hibbits
778*852ba100SJustin Hibbits /* Keygen indirect access memory contains all scheme_id registers
779*852ba100SJustin Hibbits * by now. Change only counter value. */
780*852ba100SJustin Hibbits iowrite32be(counter, &kgse_regs->kgse_spc);
781*852ba100SJustin Hibbits
782*852ba100SJustin Hibbits /* Write back scheme registers */
783*852ba100SJustin Hibbits tmp_reg = build_ar_scheme(scheme_id, hwport_id, TRUE, TRUE);
784*852ba100SJustin Hibbits err = fman_kg_write_ar_wait(regs, tmp_reg);
785*852ba100SJustin Hibbits
786*852ba100SJustin Hibbits return err;
787*852ba100SJustin Hibbits }
788*852ba100SJustin Hibbits
fman_kg_get_schemes_total_counter(struct fman_kg_regs * regs)789*852ba100SJustin Hibbits uint32_t fman_kg_get_schemes_total_counter(struct fman_kg_regs *regs)
790*852ba100SJustin Hibbits {
791*852ba100SJustin Hibbits return ioread32be(®s->fmkg_tpc);
792*852ba100SJustin Hibbits }
793*852ba100SJustin Hibbits
fman_kg_build_cls_plan(struct fman_kg_cls_plan_params * params,struct fman_kg_cp_regs * cls_plan_regs)794*852ba100SJustin Hibbits int fman_kg_build_cls_plan(struct fman_kg_cls_plan_params *params,
795*852ba100SJustin Hibbits struct fman_kg_cp_regs *cls_plan_regs)
796*852ba100SJustin Hibbits {
797*852ba100SJustin Hibbits uint8_t entries_set, entry_bit;
798*852ba100SJustin Hibbits int i;
799*852ba100SJustin Hibbits
800*852ba100SJustin Hibbits /* Zero out all group's register */
801*852ba100SJustin Hibbits memset(cls_plan_regs, 0, sizeof(struct fman_kg_cp_regs));
802*852ba100SJustin Hibbits
803*852ba100SJustin Hibbits /* Go over all classification entries in params->entries_mask and
804*852ba100SJustin Hibbits * configure the corresponding cpe register */
805*852ba100SJustin Hibbits entries_set = params->entries_mask;
806*852ba100SJustin Hibbits for (i = 0; entries_set; i++) {
807*852ba100SJustin Hibbits entry_bit = (uint8_t)(0x80 >> i);
808*852ba100SJustin Hibbits if ((entry_bit & entries_set) == 0)
809*852ba100SJustin Hibbits continue;
810*852ba100SJustin Hibbits entries_set ^= entry_bit;
811*852ba100SJustin Hibbits cls_plan_regs->kgcpe[i] = params->mask_vector[i];
812*852ba100SJustin Hibbits }
813*852ba100SJustin Hibbits
814*852ba100SJustin Hibbits return 0;
815*852ba100SJustin Hibbits }
816*852ba100SJustin Hibbits
fman_kg_write_cls_plan(struct fman_kg_regs * regs,uint8_t grp_id,uint8_t entries_mask,uint8_t hwport_id,struct fman_kg_cp_regs * cls_plan_regs)817*852ba100SJustin Hibbits int fman_kg_write_cls_plan(struct fman_kg_regs *regs,
818*852ba100SJustin Hibbits uint8_t grp_id,
819*852ba100SJustin Hibbits uint8_t entries_mask,
820*852ba100SJustin Hibbits uint8_t hwport_id,
821*852ba100SJustin Hibbits struct fman_kg_cp_regs *cls_plan_regs)
822*852ba100SJustin Hibbits {
823*852ba100SJustin Hibbits struct fman_kg_cp_regs *kgcpe_regs;
824*852ba100SJustin Hibbits uint32_t tmp_reg;
825*852ba100SJustin Hibbits int i, err;
826*852ba100SJustin Hibbits
827*852ba100SJustin Hibbits /* Check group index is valid and the group isn't empty */
828*852ba100SJustin Hibbits if (grp_id >= FM_KG_CLS_PLAN_GRPS_NUM)
829*852ba100SJustin Hibbits return -EINVAL;
830*852ba100SJustin Hibbits
831*852ba100SJustin Hibbits /* Write indirect classification plan registers */
832*852ba100SJustin Hibbits kgcpe_regs = (struct fman_kg_cp_regs *)&(regs->fmkg_indirect[0]);
833*852ba100SJustin Hibbits
834*852ba100SJustin Hibbits for (i = 0; i < FM_KG_NUM_CLS_PLAN_ENTR; i++) {
835*852ba100SJustin Hibbits iowrite32be(cls_plan_regs->kgcpe[i], &kgcpe_regs->kgcpe[i]);
836*852ba100SJustin Hibbits }
837*852ba100SJustin Hibbits
838*852ba100SJustin Hibbits tmp_reg = build_ar_cls_plan(grp_id, entries_mask, hwport_id, TRUE);
839*852ba100SJustin Hibbits err = fman_kg_write_ar_wait(regs, tmp_reg);
840*852ba100SJustin Hibbits return err;
841*852ba100SJustin Hibbits }
842*852ba100SJustin Hibbits
fman_kg_write_bind_schemes(struct fman_kg_regs * regs,uint8_t hwport_id,uint32_t schemes)843*852ba100SJustin Hibbits int fman_kg_write_bind_schemes(struct fman_kg_regs *regs,
844*852ba100SJustin Hibbits uint8_t hwport_id,
845*852ba100SJustin Hibbits uint32_t schemes)
846*852ba100SJustin Hibbits {
847*852ba100SJustin Hibbits struct fman_kg_pe_regs *kg_pe_regs;
848*852ba100SJustin Hibbits uint32_t tmp_reg;
849*852ba100SJustin Hibbits int err;
850*852ba100SJustin Hibbits
851*852ba100SJustin Hibbits kg_pe_regs = (struct fman_kg_pe_regs *)&(regs->fmkg_indirect[0]);
852*852ba100SJustin Hibbits
853*852ba100SJustin Hibbits iowrite32be(schemes, &kg_pe_regs->fmkg_pe_sp);
854*852ba100SJustin Hibbits
855*852ba100SJustin Hibbits tmp_reg = build_ar_bind_scheme(hwport_id, TRUE);
856*852ba100SJustin Hibbits err = fman_kg_write_ar_wait(regs, tmp_reg);
857*852ba100SJustin Hibbits return err;
858*852ba100SJustin Hibbits }
859*852ba100SJustin Hibbits
fman_kg_build_bind_cls_plans(uint8_t grp_base,uint8_t grp_mask,uint32_t * bind_cls_plans)860*852ba100SJustin Hibbits int fman_kg_build_bind_cls_plans(uint8_t grp_base,
861*852ba100SJustin Hibbits uint8_t grp_mask,
862*852ba100SJustin Hibbits uint32_t *bind_cls_plans)
863*852ba100SJustin Hibbits {
864*852ba100SJustin Hibbits /* Check grp_base and grp_mask are 5-bits values */
865*852ba100SJustin Hibbits if ((grp_base & ~0x0000001F) || (grp_mask & ~0x0000001F))
866*852ba100SJustin Hibbits return -EINVAL;
867*852ba100SJustin Hibbits
868*852ba100SJustin Hibbits *bind_cls_plans = (uint32_t) ((grp_mask << FMAN_KG_PE_CPP_MASK_SHIFT) | grp_base);
869*852ba100SJustin Hibbits return 0;
870*852ba100SJustin Hibbits }
871*852ba100SJustin Hibbits
872*852ba100SJustin Hibbits
fman_kg_write_bind_cls_plans(struct fman_kg_regs * regs,uint8_t hwport_id,uint32_t bind_cls_plans)873*852ba100SJustin Hibbits int fman_kg_write_bind_cls_plans(struct fman_kg_regs *regs,
874*852ba100SJustin Hibbits uint8_t hwport_id,
875*852ba100SJustin Hibbits uint32_t bind_cls_plans)
876*852ba100SJustin Hibbits {
877*852ba100SJustin Hibbits struct fman_kg_pe_regs *kg_pe_regs;
878*852ba100SJustin Hibbits uint32_t tmp_reg;
879*852ba100SJustin Hibbits int err;
880*852ba100SJustin Hibbits
881*852ba100SJustin Hibbits kg_pe_regs = (struct fman_kg_pe_regs *)&(regs->fmkg_indirect[0]);
882*852ba100SJustin Hibbits
883*852ba100SJustin Hibbits iowrite32be(bind_cls_plans, &kg_pe_regs->fmkg_pe_cpp);
884*852ba100SJustin Hibbits
885*852ba100SJustin Hibbits tmp_reg = build_ar_bind_cls_plan(hwport_id, TRUE);
886*852ba100SJustin Hibbits err = fman_kg_write_ar_wait(regs, tmp_reg);
887*852ba100SJustin Hibbits return err;
888*852ba100SJustin Hibbits }
889