xref: /openbmc/linux/drivers/net/ethernet/freescale/fman/fman_keygen.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1  // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0-or-later
2  /*
3   * Copyright 2017 NXP
4   */
5  
6  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
7  
8  #include <linux/slab.h>
9  
10  #include "fman_keygen.h"
11  
12  /* Maximum number of HW Ports */
13  #define FMAN_MAX_NUM_OF_HW_PORTS		64
14  
15  /* Maximum number of KeyGen Schemes */
16  #define FM_KG_MAX_NUM_OF_SCHEMES		32
17  
18  /* Number of generic KeyGen Generic Extract Command Registers */
19  #define FM_KG_NUM_OF_GENERIC_REGS		8
20  
21  /* Dummy port ID */
22  #define DUMMY_PORT_ID				0
23  
24  /* Select Scheme Value Register */
25  #define KG_SCH_DEF_USE_KGSE_DV_0		2
26  #define KG_SCH_DEF_USE_KGSE_DV_1		3
27  
28  /* Registers Shifting values */
29  #define FM_KG_KGAR_NUM_SHIFT			16
30  #define KG_SCH_DEF_L4_PORT_SHIFT		8
31  #define KG_SCH_DEF_IP_ADDR_SHIFT		18
32  #define KG_SCH_HASH_CONFIG_SHIFT_SHIFT		24
33  
34  /* KeyGen Registers bit field masks: */
35  
36  /* Enable bit field mask for KeyGen General Configuration Register */
37  #define FM_KG_KGGCR_EN				0x80000000
38  
39  /* KeyGen Global Registers bit field masks */
40  #define FM_KG_KGAR_GO				0x80000000
41  #define FM_KG_KGAR_READ				0x40000000
42  #define FM_KG_KGAR_WRITE			0x00000000
43  #define FM_KG_KGAR_SEL_SCHEME_ENTRY		0x00000000
44  #define FM_KG_KGAR_SCM_WSEL_UPDATE_CNT		0x00008000
45  
46  #define FM_KG_KGAR_ERR				0x20000000
47  #define FM_KG_KGAR_SEL_CLS_PLAN_ENTRY		0x01000000
48  #define FM_KG_KGAR_SEL_PORT_ENTRY		0x02000000
49  #define FM_KG_KGAR_SEL_PORT_WSEL_SP		0x00008000
50  #define FM_KG_KGAR_SEL_PORT_WSEL_CPP		0x00004000
51  
52  /* Error events exceptions */
53  #define FM_EX_KG_DOUBLE_ECC			0x80000000
54  #define FM_EX_KG_KEYSIZE_OVERFLOW		0x40000000
55  
56  /* Scheme Registers bit field masks */
57  #define KG_SCH_MODE_EN				0x80000000
58  #define KG_SCH_VSP_NO_KSP_EN			0x80000000
59  #define KG_SCH_HASH_CONFIG_SYM			0x40000000
60  
61  /* Known Protocol field codes */
62  #define KG_SCH_KN_PORT_ID		0x80000000
63  #define KG_SCH_KN_MACDST		0x40000000
64  #define KG_SCH_KN_MACSRC		0x20000000
65  #define KG_SCH_KN_TCI1			0x10000000
66  #define KG_SCH_KN_TCI2			0x08000000
67  #define KG_SCH_KN_ETYPE			0x04000000
68  #define KG_SCH_KN_PPPSID		0x02000000
69  #define KG_SCH_KN_PPPID			0x01000000
70  #define KG_SCH_KN_MPLS1			0x00800000
71  #define KG_SCH_KN_MPLS2			0x00400000
72  #define KG_SCH_KN_MPLS_LAST		0x00200000
73  #define KG_SCH_KN_IPSRC1		0x00100000
74  #define KG_SCH_KN_IPDST1		0x00080000
75  #define KG_SCH_KN_PTYPE1		0x00040000
76  #define KG_SCH_KN_IPTOS_TC1		0x00020000
77  #define KG_SCH_KN_IPV6FL1		0x00010000
78  #define KG_SCH_KN_IPSRC2		0x00008000
79  #define KG_SCH_KN_IPDST2		0x00004000
80  #define KG_SCH_KN_PTYPE2		0x00002000
81  #define KG_SCH_KN_IPTOS_TC2		0x00001000
82  #define KG_SCH_KN_IPV6FL2		0x00000800
83  #define KG_SCH_KN_GREPTYPE		0x00000400
84  #define KG_SCH_KN_IPSEC_SPI		0x00000200
85  #define KG_SCH_KN_IPSEC_NH		0x00000100
86  #define KG_SCH_KN_IPPID			0x00000080
87  #define KG_SCH_KN_L4PSRC		0x00000004
88  #define KG_SCH_KN_L4PDST		0x00000002
89  #define KG_SCH_KN_TFLG			0x00000001
90  
91  /* NIA values */
92  #define NIA_ENG_BMI			0x00500000
93  #define NIA_BMI_AC_ENQ_FRAME		0x00000002
94  #define ENQUEUE_KG_DFLT_NIA		(NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)
95  
96  /* Hard-coded configuration:
97   * These values are used as hard-coded values for KeyGen configuration
98   * and they replace user selections for this hard-coded version
99   */
100  
101  /* Hash distribution shift */
102  #define DEFAULT_HASH_DIST_FQID_SHIFT		0
103  
104  /* Hash shift */
105  #define DEFAULT_HASH_SHIFT			0
106  
107  /* Symmetric hash usage:
108   * Warning:
109   * - the value for symmetric hash usage must be in accordance with hash
110   *	key defined below
111   * - according to tests performed, spreading is not working if symmetric
112   *	hash is set on true
113   * So ultimately symmetric hash functionality should be always disabled:
114   */
115  #define DEFAULT_SYMMETRIC_HASH			false
116  
117  /* Hash Key extraction fields: */
118  #define DEFAULT_HASH_KEY_EXTRACT_FIELDS		\
119  	(KG_SCH_KN_IPSRC1 | KG_SCH_KN_IPDST1 | \
120  	 KG_SCH_KN_L4PSRC | KG_SCH_KN_L4PDST | \
121  	 KG_SCH_KN_IPSEC_SPI)
122  
123  /* Default values to be used as hash key in case IPv4 or L4 (TCP, UDP)
124   * don't exist in the frame
125   */
126  /* Default IPv4 address */
127  #define DEFAULT_HASH_KEY_IPv4_ADDR		0x0A0A0A0A
128  /* Default L4 port */
129  #define DEFAULT_HASH_KEY_L4_PORT		0x0B0B0B0B
130  
131  /* KeyGen Memory Mapped Registers: */
132  
133  /* Scheme Configuration RAM Registers */
134  struct fman_kg_scheme_regs {
135  	u32 kgse_mode;		/* 0x100: MODE */
136  	u32 kgse_ekfc;		/* 0x104: Extract Known Fields Command */
137  	u32 kgse_ekdv;		/* 0x108: Extract Known Default Value */
138  	u32 kgse_bmch;		/* 0x10C: Bit Mask Command High */
139  	u32 kgse_bmcl;		/* 0x110: Bit Mask Command Low */
140  	u32 kgse_fqb;		/* 0x114: Frame Queue Base */
141  	u32 kgse_hc;		/* 0x118: Hash Command */
142  	u32 kgse_ppc;		/* 0x11C: Policer Profile Command */
143  	u32 kgse_gec[FM_KG_NUM_OF_GENERIC_REGS];
144  			/* 0x120: Generic Extract Command */
145  	u32 kgse_spc;
146  		/* 0x140: KeyGen Scheme Entry Statistic Packet Counter */
147  	u32 kgse_dv0;	/* 0x144: KeyGen Scheme Entry Default Value 0 */
148  	u32 kgse_dv1;	/* 0x148: KeyGen Scheme Entry Default Value 1 */
149  	u32 kgse_ccbs;
150  		/* 0x14C: KeyGen Scheme Entry Coarse Classification Bit*/
151  	u32 kgse_mv;	/* 0x150: KeyGen Scheme Entry Match vector */
152  	u32 kgse_om;	/* 0x154: KeyGen Scheme Entry Operation Mode bits */
153  	u32 kgse_vsp;
154  		/* 0x158: KeyGen Scheme Entry Virtual Storage Profile */
155  };
156  
157  /* Port Partition Configuration Registers */
158  struct fman_kg_pe_regs {
159  	u32 fmkg_pe_sp;		/* 0x100: KeyGen Port entry Scheme Partition */
160  	u32 fmkg_pe_cpp;
161  		/* 0x104: KeyGen Port Entry Classification Plan Partition */
162  };
163  
164  /* General Configuration and Status Registers
165   * Global Statistic Counters
166   * KeyGen Global Registers
167   */
168  struct fman_kg_regs {
169  	u32 fmkg_gcr;	/* 0x000: KeyGen General Configuration Register */
170  	u32 res004;	/* 0x004: Reserved */
171  	u32 res008;	/* 0x008: Reserved */
172  	u32 fmkg_eer;	/* 0x00C: KeyGen Error Event Register */
173  	u32 fmkg_eeer;	/* 0x010: KeyGen Error Event Enable Register */
174  	u32 res014;	/* 0x014: Reserved */
175  	u32 res018;	/* 0x018: Reserved */
176  	u32 fmkg_seer;	/* 0x01C: KeyGen Scheme Error Event Register */
177  	u32 fmkg_seeer;	/* 0x020: KeyGen Scheme Error Event Enable Register */
178  	u32 fmkg_gsr;	/* 0x024: KeyGen Global Status Register */
179  	u32 fmkg_tpc;	/* 0x028: Total Packet Counter Register */
180  	u32 fmkg_serc;	/* 0x02C: Soft Error Capture Register */
181  	u32 res030[4];	/* 0x030: Reserved */
182  	u32 fmkg_fdor;	/* 0x034: Frame Data Offset Register */
183  	u32 fmkg_gdv0r;	/* 0x038: Global Default Value Register 0 */
184  	u32 fmkg_gdv1r;	/* 0x03C: Global Default Value Register 1 */
185  	u32 res04c[6];	/* 0x040: Reserved */
186  	u32 fmkg_feer;	/* 0x044: Force Error Event Register */
187  	u32 res068[38];	/* 0x048: Reserved */
188  	union {
189  		u32 fmkg_indirect[63];	/* 0x100: Indirect Access Registers */
190  		struct fman_kg_scheme_regs fmkg_sch; /* Scheme Registers */
191  		struct fman_kg_pe_regs fmkg_pe; /* Port Partition Registers */
192  	};
193  	u32 fmkg_ar;	/* 0x1FC: KeyGen Action Register */
194  };
195  
196  /* KeyGen Scheme data */
197  struct keygen_scheme {
198  	bool used;	/* Specifies if this scheme is used */
199  	u8 hw_port_id;
200  		/* Hardware port ID
201  		 * schemes sharing between multiple ports is not
202  		 * currently supported
203  		 * so we have only one port id bound to a scheme
204  		 */
205  	u32 base_fqid;
206  		/* Base FQID:
207  		 * Must be between 1 and 2^24-1
208  		 * If hash is used and an even distribution is
209  		 * expected according to hash_fqid_count,
210  		 * base_fqid must be aligned to hash_fqid_count
211  		 */
212  	u32 hash_fqid_count;
213  		/* FQ range for hash distribution:
214  		 * Must be a power of 2
215  		 * Represents the range of queues for spreading
216  		 */
217  	bool use_hashing;	/* Usage of Hashing and spreading over FQ */
218  	bool symmetric_hash;	/* Symmetric Hash option usage */
219  	u8 hashShift;
220  		/* Hash result right shift.
221  		 * Select the 24 bits out of the 64 hash result.
222  		 * 0 means using the 24 LSB's, otherwise
223  		 * use the 24 LSB's after shifting right
224  		 */
225  	u32 match_vector;	/* Match Vector */
226  };
227  
228  /* KeyGen driver data */
229  struct fman_keygen {
230  	struct keygen_scheme schemes[FM_KG_MAX_NUM_OF_SCHEMES];
231  				/* Array of schemes */
232  	struct fman_kg_regs __iomem *keygen_regs;	/* KeyGen registers */
233  };
234  
235  /* keygen_write_ar_wait
236   *
237   * Write Action Register with specified value, wait for GO bit field to be
238   * idle and then read the error
239   *
240   * regs: KeyGen registers
241   * fmkg_ar: Action Register value
242   *
243   * Return: Zero for success or error code in case of failure
244   */
keygen_write_ar_wait(struct fman_kg_regs __iomem * regs,u32 fmkg_ar)245  static int keygen_write_ar_wait(struct fman_kg_regs __iomem *regs, u32 fmkg_ar)
246  {
247  	iowrite32be(fmkg_ar, &regs->fmkg_ar);
248  
249  	/* Wait for GO bit field to be idle */
250  	while (fmkg_ar & FM_KG_KGAR_GO)
251  		fmkg_ar = ioread32be(&regs->fmkg_ar);
252  
253  	if (fmkg_ar & FM_KG_KGAR_ERR)
254  		return -EINVAL;
255  
256  	return 0;
257  }
258  
259  /* build_ar_scheme
260   *
261   * Build Action Register value for scheme settings
262   *
263   * scheme_id: Scheme ID
264   * update_counter: update scheme counter
265   * write: true for action to write the scheme or false for read action
266   *
267   * Return: AR value
268   */
build_ar_scheme(u8 scheme_id,bool update_counter,bool write)269  static u32 build_ar_scheme(u8 scheme_id, bool update_counter, bool write)
270  {
271  	u32 rw = (u32)(write ? FM_KG_KGAR_WRITE : FM_KG_KGAR_READ);
272  
273  	return (u32)(FM_KG_KGAR_GO |
274  			rw |
275  			FM_KG_KGAR_SEL_SCHEME_ENTRY |
276  			DUMMY_PORT_ID |
277  			((u32)scheme_id << FM_KG_KGAR_NUM_SHIFT) |
278  			(update_counter ? FM_KG_KGAR_SCM_WSEL_UPDATE_CNT : 0));
279  }
280  
281  /* build_ar_bind_scheme
282   *
283   * Build Action Register value for port binding to schemes
284   *
285   * hwport_id: HW Port ID
286   * write: true for action to write the bind or false for read action
287   *
288   * Return: AR value
289   */
build_ar_bind_scheme(u8 hwport_id,bool write)290  static u32 build_ar_bind_scheme(u8 hwport_id, bool write)
291  {
292  	u32 rw = write ? (u32)FM_KG_KGAR_WRITE : (u32)FM_KG_KGAR_READ;
293  
294  	return (u32)(FM_KG_KGAR_GO |
295  			rw |
296  			FM_KG_KGAR_SEL_PORT_ENTRY |
297  			hwport_id |
298  			FM_KG_KGAR_SEL_PORT_WSEL_SP);
299  }
300  
301  /* keygen_write_sp
302   *
303   * Write Scheme Partition Register with specified value
304   *
305   * regs: KeyGen Registers
306   * sp: Scheme Partition register value
307   * add: true to add a scheme partition or false to clear
308   *
309   * Return: none
310   */
keygen_write_sp(struct fman_kg_regs __iomem * regs,u32 sp,bool add)311  static void keygen_write_sp(struct fman_kg_regs __iomem *regs, u32 sp, bool add)
312  {
313  	u32 tmp;
314  
315  	tmp = ioread32be(&regs->fmkg_pe.fmkg_pe_sp);
316  
317  	if (add)
318  		tmp |= sp;
319  	else
320  		tmp &= ~sp;
321  
322  	iowrite32be(tmp, &regs->fmkg_pe.fmkg_pe_sp);
323  }
324  
325  /* build_ar_bind_cls_plan
326   *
327   * Build Action Register value for Classification Plan
328   *
329   * hwport_id: HW Port ID
330   * write: true for action to write the CP or false for read action
331   *
332   * Return: AR value
333   */
build_ar_bind_cls_plan(u8 hwport_id,bool write)334  static u32 build_ar_bind_cls_plan(u8 hwport_id, bool write)
335  {
336  	u32 rw = write ? (u32)FM_KG_KGAR_WRITE : (u32)FM_KG_KGAR_READ;
337  
338  	return (u32)(FM_KG_KGAR_GO |
339  			rw |
340  			FM_KG_KGAR_SEL_PORT_ENTRY |
341  			hwport_id |
342  			FM_KG_KGAR_SEL_PORT_WSEL_CPP);
343  }
344  
345  /* keygen_write_cpp
346   *
347   * Write Classification Plan Partition Register with specified value
348   *
349   * regs: KeyGen Registers
350   * cpp: CPP register value
351   *
352   * Return: none
353   */
keygen_write_cpp(struct fman_kg_regs __iomem * regs,u32 cpp)354  static void keygen_write_cpp(struct fman_kg_regs __iomem *regs, u32 cpp)
355  {
356  	iowrite32be(cpp, &regs->fmkg_pe.fmkg_pe_cpp);
357  }
358  
359  /* keygen_write_scheme
360   *
361   * Write all Schemes Registers with specified values
362   *
363   * regs: KeyGen Registers
364   * scheme_id: Scheme ID
365   * scheme_regs: Scheme registers values desired to be written
366   * update_counter: update scheme counter
367   *
368   * Return: Zero for success or error code in case of failure
369   */
keygen_write_scheme(struct fman_kg_regs __iomem * regs,u8 scheme_id,struct fman_kg_scheme_regs * scheme_regs,bool update_counter)370  static int keygen_write_scheme(struct fman_kg_regs __iomem *regs, u8 scheme_id,
371  			       struct fman_kg_scheme_regs *scheme_regs,
372  				bool update_counter)
373  {
374  	u32 ar_reg;
375  	int err, i;
376  
377  	/* Write indirect scheme registers */
378  	iowrite32be(scheme_regs->kgse_mode, &regs->fmkg_sch.kgse_mode);
379  	iowrite32be(scheme_regs->kgse_ekfc, &regs->fmkg_sch.kgse_ekfc);
380  	iowrite32be(scheme_regs->kgse_ekdv, &regs->fmkg_sch.kgse_ekdv);
381  	iowrite32be(scheme_regs->kgse_bmch, &regs->fmkg_sch.kgse_bmch);
382  	iowrite32be(scheme_regs->kgse_bmcl, &regs->fmkg_sch.kgse_bmcl);
383  	iowrite32be(scheme_regs->kgse_fqb, &regs->fmkg_sch.kgse_fqb);
384  	iowrite32be(scheme_regs->kgse_hc, &regs->fmkg_sch.kgse_hc);
385  	iowrite32be(scheme_regs->kgse_ppc, &regs->fmkg_sch.kgse_ppc);
386  	iowrite32be(scheme_regs->kgse_spc, &regs->fmkg_sch.kgse_spc);
387  	iowrite32be(scheme_regs->kgse_dv0, &regs->fmkg_sch.kgse_dv0);
388  	iowrite32be(scheme_regs->kgse_dv1, &regs->fmkg_sch.kgse_dv1);
389  	iowrite32be(scheme_regs->kgse_ccbs, &regs->fmkg_sch.kgse_ccbs);
390  	iowrite32be(scheme_regs->kgse_mv, &regs->fmkg_sch.kgse_mv);
391  	iowrite32be(scheme_regs->kgse_om, &regs->fmkg_sch.kgse_om);
392  	iowrite32be(scheme_regs->kgse_vsp, &regs->fmkg_sch.kgse_vsp);
393  
394  	for (i = 0 ; i < FM_KG_NUM_OF_GENERIC_REGS ; i++)
395  		iowrite32be(scheme_regs->kgse_gec[i],
396  			    &regs->fmkg_sch.kgse_gec[i]);
397  
398  	/* Write AR (Action register) */
399  	ar_reg = build_ar_scheme(scheme_id, update_counter, true);
400  	err = keygen_write_ar_wait(regs, ar_reg);
401  	if (err != 0) {
402  		pr_err("Writing Action Register failed\n");
403  		return err;
404  	}
405  
406  	return err;
407  }
408  
409  /* get_free_scheme_id
410   *
411   * Find the first free scheme available to be used
412   *
413   * keygen: KeyGen handle
414   * scheme_id: pointer to scheme id
415   *
416   * Return: 0 on success, -EINVAL when the are no available free schemes
417   */
get_free_scheme_id(struct fman_keygen * keygen,u8 * scheme_id)418  static int get_free_scheme_id(struct fman_keygen *keygen, u8 *scheme_id)
419  {
420  	u8 i;
421  
422  	for (i = 0; i < FM_KG_MAX_NUM_OF_SCHEMES; i++)
423  		if (!keygen->schemes[i].used) {
424  			*scheme_id = i;
425  			return 0;
426  		}
427  
428  	return -EINVAL;
429  }
430  
431  /* get_scheme
432   *
433   * Provides the scheme for specified ID
434   *
435   * keygen: KeyGen handle
436   * scheme_id: Scheme ID
437   *
438   * Return: handle to required scheme
439   */
get_scheme(struct fman_keygen * keygen,u8 scheme_id)440  static struct keygen_scheme *get_scheme(struct fman_keygen *keygen,
441  					u8 scheme_id)
442  {
443  	if (scheme_id >= FM_KG_MAX_NUM_OF_SCHEMES)
444  		return NULL;
445  	return &keygen->schemes[scheme_id];
446  }
447  
448  /* keygen_bind_port_to_schemes
449   *
450   * Bind the port to schemes
451   *
452   * keygen: KeyGen handle
453   * scheme_id: id of the scheme to bind to
454   * bind: true to bind the port or false to unbind it
455   *
456   * Return: Zero for success or error code in case of failure
457   */
keygen_bind_port_to_schemes(struct fman_keygen * keygen,u8 scheme_id,bool bind)458  static int keygen_bind_port_to_schemes(struct fman_keygen *keygen,
459  				       u8 scheme_id,
460  					bool bind)
461  {
462  	struct fman_kg_regs __iomem *keygen_regs = keygen->keygen_regs;
463  	struct keygen_scheme *scheme;
464  	u32 ar_reg;
465  	u32 schemes_vector = 0;
466  	int err;
467  
468  	scheme = get_scheme(keygen, scheme_id);
469  	if (!scheme) {
470  		pr_err("Requested Scheme does not exist\n");
471  		return -EINVAL;
472  	}
473  	if (!scheme->used) {
474  		pr_err("Cannot bind port to an invalid scheme\n");
475  		return -EINVAL;
476  	}
477  
478  	schemes_vector |= 1 << (31 - scheme_id);
479  
480  	ar_reg = build_ar_bind_scheme(scheme->hw_port_id, false);
481  	err = keygen_write_ar_wait(keygen_regs, ar_reg);
482  	if (err != 0) {
483  		pr_err("Reading Action Register failed\n");
484  		return err;
485  	}
486  
487  	keygen_write_sp(keygen_regs, schemes_vector, bind);
488  
489  	ar_reg = build_ar_bind_scheme(scheme->hw_port_id, true);
490  	err = keygen_write_ar_wait(keygen_regs, ar_reg);
491  	if (err != 0) {
492  		pr_err("Writing Action Register failed\n");
493  		return err;
494  	}
495  
496  	return 0;
497  }
498  
499  /* keygen_scheme_setup
500   *
501   * Setup the scheme according to required configuration
502   *
503   * keygen: KeyGen handle
504   * scheme_id: scheme ID
505   * enable: true to enable scheme or false to disable it
506   *
507   * Return: Zero for success or error code in case of failure
508   */
keygen_scheme_setup(struct fman_keygen * keygen,u8 scheme_id,bool enable)509  static int keygen_scheme_setup(struct fman_keygen *keygen, u8 scheme_id,
510  			       bool enable)
511  {
512  	struct fman_kg_regs __iomem *keygen_regs = keygen->keygen_regs;
513  	struct fman_kg_scheme_regs scheme_regs;
514  	struct keygen_scheme *scheme;
515  	u32 tmp_reg;
516  	int err;
517  
518  	scheme = get_scheme(keygen, scheme_id);
519  	if (!scheme) {
520  		pr_err("Requested Scheme does not exist\n");
521  		return -EINVAL;
522  	}
523  	if (enable && scheme->used) {
524  		pr_err("The requested Scheme is already used\n");
525  		return -EINVAL;
526  	}
527  
528  	/* Clear scheme registers */
529  	memset(&scheme_regs, 0, sizeof(struct fman_kg_scheme_regs));
530  
531  	/* Setup all scheme registers: */
532  	tmp_reg = 0;
533  
534  	if (enable) {
535  		/* Enable Scheme */
536  		tmp_reg |= KG_SCH_MODE_EN;
537  		/* Enqueue frame NIA */
538  		tmp_reg |= ENQUEUE_KG_DFLT_NIA;
539  	}
540  
541  	scheme_regs.kgse_mode = tmp_reg;
542  
543  	scheme_regs.kgse_mv = scheme->match_vector;
544  
545  	/* Scheme don't override StorageProfile:
546  	 * valid only for DPAA_VERSION >= 11
547  	 */
548  	scheme_regs.kgse_vsp = KG_SCH_VSP_NO_KSP_EN;
549  
550  	/* Configure Hard-Coded Rx Hashing: */
551  
552  	if (scheme->use_hashing) {
553  		/* configure kgse_ekfc */
554  		scheme_regs.kgse_ekfc = DEFAULT_HASH_KEY_EXTRACT_FIELDS;
555  
556  		/* configure kgse_ekdv */
557  		tmp_reg = 0;
558  		tmp_reg |= (KG_SCH_DEF_USE_KGSE_DV_0 <<
559  				KG_SCH_DEF_IP_ADDR_SHIFT);
560  		tmp_reg |= (KG_SCH_DEF_USE_KGSE_DV_1 <<
561  				KG_SCH_DEF_L4_PORT_SHIFT);
562  		scheme_regs.kgse_ekdv = tmp_reg;
563  
564  		/* configure kgse_dv0 */
565  		scheme_regs.kgse_dv0 = DEFAULT_HASH_KEY_IPv4_ADDR;
566  		/* configure kgse_dv1 */
567  		scheme_regs.kgse_dv1 = DEFAULT_HASH_KEY_L4_PORT;
568  
569  		/* configure kgse_hc  */
570  		tmp_reg = 0;
571  		tmp_reg |= ((scheme->hash_fqid_count - 1) <<
572  				DEFAULT_HASH_DIST_FQID_SHIFT);
573  		tmp_reg |= scheme->hashShift << KG_SCH_HASH_CONFIG_SHIFT_SHIFT;
574  
575  		if (scheme->symmetric_hash) {
576  			/* Normally extraction key should be verified if
577  			 * complies with symmetric hash
578  			 * But because extraction is hard-coded, we are sure
579  			 * the key is symmetric
580  			 */
581  			tmp_reg |= KG_SCH_HASH_CONFIG_SYM;
582  		}
583  		scheme_regs.kgse_hc = tmp_reg;
584  	} else {
585  		scheme_regs.kgse_ekfc = 0;
586  		scheme_regs.kgse_hc = 0;
587  		scheme_regs.kgse_ekdv = 0;
588  		scheme_regs.kgse_dv0 = 0;
589  		scheme_regs.kgse_dv1 = 0;
590  	}
591  
592  	/* configure kgse_fqb: Scheme FQID base */
593  	tmp_reg = 0;
594  	tmp_reg |= scheme->base_fqid;
595  	scheme_regs.kgse_fqb = tmp_reg;
596  
597  	/* features not used by hard-coded configuration */
598  	scheme_regs.kgse_bmch = 0;
599  	scheme_regs.kgse_bmcl = 0;
600  	scheme_regs.kgse_spc = 0;
601  
602  	/* Write scheme registers */
603  	err = keygen_write_scheme(keygen_regs, scheme_id, &scheme_regs, true);
604  	if (err != 0) {
605  		pr_err("Writing scheme registers failed\n");
606  		return err;
607  	}
608  
609  	/* Update used field for Scheme */
610  	scheme->used = enable;
611  
612  	return 0;
613  }
614  
615  /* keygen_init
616   *
617   * KeyGen initialization:
618   * Initializes and enables KeyGen, allocate driver memory, setup registers,
619   * clear port bindings, invalidate all schemes
620   *
621   * keygen_regs: KeyGen registers base address
622   *
623   * Return: Handle to KeyGen driver
624   */
keygen_init(struct fman_kg_regs __iomem * keygen_regs)625  struct fman_keygen *keygen_init(struct fman_kg_regs __iomem *keygen_regs)
626  {
627  	struct fman_keygen *keygen;
628  	u32 ar;
629  	int i;
630  
631  	/* Allocate memory for KeyGen driver */
632  	keygen = kzalloc(sizeof(*keygen), GFP_KERNEL);
633  	if (!keygen)
634  		return NULL;
635  
636  	keygen->keygen_regs = keygen_regs;
637  
638  	/* KeyGen initialization (for Master partition):
639  	 * Setup KeyGen registers
640  	 */
641  	iowrite32be(ENQUEUE_KG_DFLT_NIA, &keygen_regs->fmkg_gcr);
642  
643  	iowrite32be(FM_EX_KG_DOUBLE_ECC | FM_EX_KG_KEYSIZE_OVERFLOW,
644  		    &keygen_regs->fmkg_eer);
645  
646  	iowrite32be(0, &keygen_regs->fmkg_fdor);
647  	iowrite32be(0, &keygen_regs->fmkg_gdv0r);
648  	iowrite32be(0, &keygen_regs->fmkg_gdv1r);
649  
650  	/* Clear binding between ports to schemes and classification plans
651  	 * so that all ports are not bound to any scheme/classification plan
652  	 */
653  	for (i = 0; i < FMAN_MAX_NUM_OF_HW_PORTS; i++) {
654  		/* Clear all pe sp schemes registers */
655  		keygen_write_sp(keygen_regs, 0xffffffff, false);
656  		ar = build_ar_bind_scheme(i, true);
657  		keygen_write_ar_wait(keygen_regs, ar);
658  
659  		/* Clear all pe cpp classification plans registers */
660  		keygen_write_cpp(keygen_regs, 0);
661  		ar = build_ar_bind_cls_plan(i, true);
662  		keygen_write_ar_wait(keygen_regs, ar);
663  	}
664  
665  	/* Enable all scheme interrupts */
666  	iowrite32be(0xFFFFFFFF, &keygen_regs->fmkg_seer);
667  	iowrite32be(0xFFFFFFFF, &keygen_regs->fmkg_seeer);
668  
669  	/* Enable KyeGen */
670  	iowrite32be(ioread32be(&keygen_regs->fmkg_gcr) | FM_KG_KGGCR_EN,
671  		    &keygen_regs->fmkg_gcr);
672  
673  	return keygen;
674  }
675  EXPORT_SYMBOL(keygen_init);
676  
677  /* keygen_port_hashing_init
678   *
679   * Initializes a port for Rx Hashing with specified configuration parameters
680   *
681   * keygen: KeyGen handle
682   * hw_port_id: HW Port ID
683   * hash_base_fqid: Hashing Base FQID used for spreading
684   * hash_size: Hashing size
685   *
686   * Return: Zero for success or error code in case of failure
687   */
keygen_port_hashing_init(struct fman_keygen * keygen,u8 hw_port_id,u32 hash_base_fqid,u32 hash_size)688  int keygen_port_hashing_init(struct fman_keygen *keygen, u8 hw_port_id,
689  			     u32 hash_base_fqid, u32 hash_size)
690  {
691  	struct keygen_scheme *scheme;
692  	u8 scheme_id;
693  	int err;
694  
695  	/* Validate Scheme configuration parameters */
696  	if (hash_base_fqid == 0 || (hash_base_fqid & ~0x00FFFFFF)) {
697  		pr_err("Base FQID must be between 1 and 2^24-1\n");
698  		return -EINVAL;
699  	}
700  	if (hash_size == 0 || (hash_size & (hash_size - 1)) != 0) {
701  		pr_err("Hash size must be power of two\n");
702  		return -EINVAL;
703  	}
704  
705  	/* Find a free scheme */
706  	err = get_free_scheme_id(keygen, &scheme_id);
707  	if (err) {
708  		pr_err("The maximum number of available Schemes has been exceeded\n");
709  		return -EINVAL;
710  	}
711  
712  	/* Create and configure Hard-Coded Scheme: */
713  
714  	scheme = get_scheme(keygen, scheme_id);
715  	if (!scheme) {
716  		pr_err("Requested Scheme does not exist\n");
717  		return -EINVAL;
718  	}
719  	if (scheme->used) {
720  		pr_err("The requested Scheme is already used\n");
721  		return -EINVAL;
722  	}
723  
724  	/* Clear all scheme fields because the scheme may have been
725  	 * previously used
726  	 */
727  	memset(scheme, 0, sizeof(struct keygen_scheme));
728  
729  	/* Setup scheme: */
730  	scheme->hw_port_id = hw_port_id;
731  	scheme->use_hashing = true;
732  	scheme->base_fqid = hash_base_fqid;
733  	scheme->hash_fqid_count = hash_size;
734  	scheme->symmetric_hash = DEFAULT_SYMMETRIC_HASH;
735  	scheme->hashShift = DEFAULT_HASH_SHIFT;
736  
737  	/* All Schemes in hard-coded configuration
738  	 * are Indirect Schemes
739  	 */
740  	scheme->match_vector = 0;
741  
742  	err = keygen_scheme_setup(keygen, scheme_id, true);
743  	if (err != 0) {
744  		pr_err("Scheme setup failed\n");
745  		return err;
746  	}
747  
748  	/* Bind Rx port to Scheme */
749  	err = keygen_bind_port_to_schemes(keygen, scheme_id, true);
750  	if (err != 0) {
751  		pr_err("Binding port to schemes failed\n");
752  		return err;
753  	}
754  
755  	return 0;
756  }
757  EXPORT_SYMBOL(keygen_port_hashing_init);
758