1/* SPDX-License-Identifier: BSD-3-Clause */
2/* Copyright 2016-2018 NXP
3 * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com>
4 */
5#ifndef _SJA1105_STATIC_CONFIG_H
6#define _SJA1105_STATIC_CONFIG_H
7
8#include <linux/packing.h>
9#include <linux/types.h>
10#include <asm/types.h>
11
12#define SJA1105_NUM_PORTS				5
13#define SJA1110_NUM_PORTS				11
14#define SJA1105_MAX_NUM_PORTS				SJA1110_NUM_PORTS
15#define SJA1105_NUM_TC					8
16
17#define SJA1105_SIZE_SPI_MSG_HEADER			4
18#define SJA1105_SIZE_SPI_MSG_MAXLEN			(64 * 4)
19#define SJA1105_SIZE_DEVICE_ID				4
20#define SJA1105_SIZE_TABLE_HEADER			12
21#define SJA1105_SIZE_SCHEDULE_ENTRY			8
22#define SJA1110_SIZE_SCHEDULE_ENTRY			12
23#define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY	4
24#define SJA1110_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY	8
25#define SJA1105_SIZE_VL_LOOKUP_ENTRY			12
26#define SJA1105_SIZE_VL_POLICING_ENTRY			8
27#define SJA1105_SIZE_VL_FORWARDING_ENTRY		4
28#define SJA1105_SIZE_L2_POLICING_ENTRY			8
29#define SJA1105_SIZE_VLAN_LOOKUP_ENTRY			8
30#define SJA1110_SIZE_VLAN_LOOKUP_ENTRY			12
31#define SJA1105_SIZE_L2_FORWARDING_ENTRY		8
32#define SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY		12
33#define SJA1105_SIZE_RETAGGING_ENTRY			8
34#define SJA1105_SIZE_XMII_PARAMS_ENTRY			4
35#define SJA1110_SIZE_XMII_PARAMS_ENTRY			8
36#define SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY		12
37#define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY	4
38#define SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY         12
39#define SJA1105ET_SIZE_L2_LOOKUP_ENTRY			12
40#define SJA1105ET_SIZE_MAC_CONFIG_ENTRY			28
41#define SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY		4
42#define SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY		40
43#define SJA1105ET_SIZE_AVB_PARAMS_ENTRY			12
44#define SJA1105ET_SIZE_CBS_ENTRY			16
45#define SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY		20
46#define SJA1110_SIZE_L2_LOOKUP_ENTRY			24
47#define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY		32
48#define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY		16
49#define SJA1110_SIZE_L2_LOOKUP_PARAMS_ENTRY		28
50#define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY		44
51#define SJA1110_SIZE_GENERAL_PARAMS_ENTRY		56
52#define SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY		16
53#define SJA1105PQRS_SIZE_CBS_ENTRY			20
54#define SJA1110_SIZE_PCP_REMAPPING_ENTRY		4
55
56/* UM10944.pdf Page 11, Table 2. Configuration Blocks */
57enum {
58	BLKID_SCHEDULE					= 0x00,
59	BLKID_SCHEDULE_ENTRY_POINTS			= 0x01,
60	BLKID_VL_LOOKUP					= 0x02,
61	BLKID_VL_POLICING				= 0x03,
62	BLKID_VL_FORWARDING				= 0x04,
63	BLKID_L2_LOOKUP					= 0x05,
64	BLKID_L2_POLICING				= 0x06,
65	BLKID_VLAN_LOOKUP				= 0x07,
66	BLKID_L2_FORWARDING				= 0x08,
67	BLKID_MAC_CONFIG				= 0x09,
68	BLKID_SCHEDULE_PARAMS				= 0x0A,
69	BLKID_SCHEDULE_ENTRY_POINTS_PARAMS		= 0x0B,
70	BLKID_VL_FORWARDING_PARAMS			= 0x0C,
71	BLKID_L2_LOOKUP_PARAMS				= 0x0D,
72	BLKID_L2_FORWARDING_PARAMS			= 0x0E,
73	BLKID_AVB_PARAMS				= 0x10,
74	BLKID_GENERAL_PARAMS				= 0x11,
75	BLKID_RETAGGING					= 0x12,
76	BLKID_CBS					= 0x13,
77	BLKID_PCP_REMAPPING				= 0x1C,
78	BLKID_XMII_PARAMS				= 0x4E,
79};
80
81enum sja1105_blk_idx {
82	BLK_IDX_SCHEDULE = 0,
83	BLK_IDX_SCHEDULE_ENTRY_POINTS,
84	BLK_IDX_VL_LOOKUP,
85	BLK_IDX_VL_POLICING,
86	BLK_IDX_VL_FORWARDING,
87	BLK_IDX_L2_LOOKUP,
88	BLK_IDX_L2_POLICING,
89	BLK_IDX_VLAN_LOOKUP,
90	BLK_IDX_L2_FORWARDING,
91	BLK_IDX_MAC_CONFIG,
92	BLK_IDX_SCHEDULE_PARAMS,
93	BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS,
94	BLK_IDX_VL_FORWARDING_PARAMS,
95	BLK_IDX_L2_LOOKUP_PARAMS,
96	BLK_IDX_L2_FORWARDING_PARAMS,
97	BLK_IDX_AVB_PARAMS,
98	BLK_IDX_GENERAL_PARAMS,
99	BLK_IDX_RETAGGING,
100	BLK_IDX_CBS,
101	BLK_IDX_XMII_PARAMS,
102	BLK_IDX_PCP_REMAPPING,
103	BLK_IDX_MAX,
104	/* Fake block indices that are only valid for dynamic access */
105	BLK_IDX_MGMT_ROUTE,
106	BLK_IDX_MAX_DYN,
107	BLK_IDX_INVAL = -1,
108};
109
110#define SJA1105_MAX_SCHEDULE_COUNT			1024
111#define SJA1110_MAX_SCHEDULE_COUNT			4096
112#define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT		2048
113#define SJA1105_MAX_VL_LOOKUP_COUNT			1024
114#define SJA1110_MAX_VL_LOOKUP_COUNT			4096
115#define SJA1105_MAX_VL_POLICING_COUNT			1024
116#define SJA1110_MAX_VL_POLICING_COUNT			4096
117#define SJA1105_MAX_VL_FORWARDING_COUNT			1024
118#define SJA1110_MAX_VL_FORWARDING_COUNT			4096
119#define SJA1105_MAX_L2_LOOKUP_COUNT			1024
120#define SJA1105_MAX_L2_POLICING_COUNT			45
121#define SJA1110_MAX_L2_POLICING_COUNT			110
122#define SJA1105_MAX_VLAN_LOOKUP_COUNT			4096
123#define SJA1105_MAX_L2_FORWARDING_COUNT			13
124#define SJA1110_MAX_L2_FORWARDING_COUNT			19
125#define SJA1105_MAX_MAC_CONFIG_COUNT			5
126#define SJA1110_MAX_MAC_CONFIG_COUNT			11
127#define SJA1105_MAX_SCHEDULE_PARAMS_COUNT		1
128#define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT	1
129#define SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT		1
130#define SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT		1
131#define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT		1
132#define SJA1105_MAX_GENERAL_PARAMS_COUNT		1
133#define SJA1105_MAX_RETAGGING_COUNT			32
134#define SJA1105_MAX_XMII_PARAMS_COUNT			1
135#define SJA1105_MAX_AVB_PARAMS_COUNT			1
136#define SJA1105ET_MAX_CBS_COUNT				10
137#define SJA1105PQRS_MAX_CBS_COUNT			16
138#define SJA1110_MAX_CBS_COUNT				80
139#define SJA1110_MAX_PCP_REMAPPING_COUNT			11
140
141#define SJA1105_MAX_FRAME_MEMORY			929
142#define SJA1110_MAX_FRAME_MEMORY			1820
143#define SJA1105_FRAME_MEMORY_RETAGGING_OVERHEAD		19
144#define SJA1105_VL_FRAME_MEMORY				100
145
146#define SJA1105E_DEVICE_ID				0x9C00000Cull
147#define SJA1105T_DEVICE_ID				0x9E00030Eull
148#define SJA1105PR_DEVICE_ID				0xAF00030Eull
149#define SJA1105QS_DEVICE_ID				0xAE00030Eull
150#define SJA1110_DEVICE_ID				0xB700030Full
151
152#define SJA1105ET_PART_NO				0x9A83
153#define SJA1105P_PART_NO				0x9A84
154#define SJA1105Q_PART_NO				0x9A85
155#define SJA1105R_PART_NO				0x9A86
156#define SJA1105S_PART_NO				0x9A87
157#define SJA1110A_PART_NO				0x1110
158#define SJA1110B_PART_NO				0x1111
159#define SJA1110C_PART_NO				0x1112
160#define SJA1110D_PART_NO				0x1113
161
162#define SJA1110_ACU			0x1c4400
163#define SJA1110_RGU			0x1c6000
164#define SJA1110_CGU			0x1c6400
165
166#define SJA1110_SPI_ADDR(x)		((x) / 4)
167#define SJA1110_ACU_ADDR(x)		(SJA1110_ACU + SJA1110_SPI_ADDR(x))
168#define SJA1110_CGU_ADDR(x)		(SJA1110_CGU + SJA1110_SPI_ADDR(x))
169#define SJA1110_RGU_ADDR(x)		(SJA1110_RGU + SJA1110_SPI_ADDR(x))
170
171#define SJA1105_RSV_ADDR		0xffffffffffffffffull
172
173struct sja1105_schedule_entry {
174	u64 winstindex;
175	u64 winend;
176	u64 winst;
177	u64 destports;
178	u64 setvalid;
179	u64 txen;
180	u64 resmedia_en;
181	u64 resmedia;
182	u64 vlindex;
183	u64 delta;
184};
185
186struct sja1105_schedule_params_entry {
187	u64 subscheind[8];
188};
189
190struct sja1105_general_params_entry {
191	u64 vllupformat;
192	u64 mirr_ptacu;
193	u64 switchid;
194	u64 hostprio;
195	u64 mac_fltres1;
196	u64 mac_fltres0;
197	u64 mac_flt1;
198	u64 mac_flt0;
199	u64 incl_srcpt1;
200	u64 incl_srcpt0;
201	u64 send_meta1;
202	u64 send_meta0;
203	u64 casc_port;
204	u64 host_port;
205	u64 mirr_port;
206	u64 vlmarker;
207	u64 vlmask;
208	u64 tpid;
209	u64 ignore2stf;
210	u64 tpid2;
211	/* P/Q/R/S only */
212	u64 queue_ts;
213	u64 egrmirrvid;
214	u64 egrmirrpcp;
215	u64 egrmirrdei;
216	u64 replay_port;
217	/* SJA1110 only */
218	u64 tte_en;
219	u64 tdmaconfigidx;
220	u64 header_type;
221};
222
223struct sja1105_schedule_entry_points_entry {
224	u64 subschindx;
225	u64 delta;
226	u64 address;
227};
228
229struct sja1105_schedule_entry_points_params_entry {
230	u64 clksrc;
231	u64 actsubsch;
232};
233
234struct sja1105_vlan_lookup_entry {
235	u64 ving_mirr;
236	u64 vegr_mirr;
237	u64 vmemb_port;
238	u64 vlan_bc;
239	u64 tag_port;
240	u64 vlanid;
241	u64 type_entry; /* SJA1110 only */
242};
243
244struct sja1105_l2_lookup_entry {
245	u64 vlanid;
246	u64 macaddr;
247	u64 destports;
248	u64 enfport;
249	u64 index;
250	/* P/Q/R/S only */
251	u64 mask_iotag;
252	u64 mask_vlanid;
253	u64 mask_macaddr;
254	u64 mask_srcport;
255	u64 iotag;
256	u64 srcport;
257	u64 lockeds;
258	union {
259		/* LOCKEDS=1: Static FDB entries */
260		struct {
261			/* TSREG is deprecated in SJA1110, TRAP is supported only
262			 * in SJA1110.
263			 */
264			u64 trap;
265			u64 tsreg;
266			u64 mirrvlan;
267			u64 takets;
268			u64 mirr;
269			u64 retag;
270		};
271		/* LOCKEDS=0: Dynamically learned FDB entries */
272		struct {
273			u64 touched;
274			u64 age;
275		};
276	};
277};
278
279struct sja1105_l2_lookup_params_entry {
280	u64 maxaddrp[SJA1105_MAX_NUM_PORTS]; /* P/Q/R/S only */
281	u64 start_dynspc;    /* P/Q/R/S only */
282	u64 drpnolearn;      /* P/Q/R/S only */
283	u64 use_static;      /* P/Q/R/S only */
284	u64 owr_dyn;         /* P/Q/R/S only */
285	u64 learn_once;      /* P/Q/R/S only */
286	u64 maxage;          /* Shared */
287	u64 dyn_tbsz;        /* E/T only */
288	u64 poly;            /* E/T only */
289	u64 shared_learn;    /* Shared */
290	u64 no_enf_hostprt;  /* Shared */
291	u64 no_mgmt_learn;   /* Shared */
292};
293
294struct sja1105_l2_forwarding_entry {
295	u64 bc_domain;
296	u64 reach_port;
297	u64 fl_domain;
298	/* This is actually max(SJA1105_NUM_TC, SJA1105_MAX_NUM_PORTS) */
299	u64 vlan_pmap[SJA1105_MAX_NUM_PORTS];
300	bool type_egrpcp2outputq;
301};
302
303struct sja1105_l2_forwarding_params_entry {
304	u64 max_dynp;
305	u64 part_spc[8];
306};
307
308struct sja1105_l2_policing_entry {
309	u64 sharindx;
310	u64 smax;
311	u64 rate;
312	u64 maxlen;
313	u64 partition;
314};
315
316struct sja1105_avb_params_entry {
317	u64 cas_master;
318	u64 destmeta;
319	u64 srcmeta;
320};
321
322struct sja1105_mac_config_entry {
323	u64 top[8];
324	u64 base[8];
325	u64 enabled[8];
326	u64 ifg;
327	u64 speed;
328	u64 tp_delin;
329	u64 tp_delout;
330	u64 maxage;
331	u64 vlanprio;
332	u64 vlanid;
333	u64 ing_mirr;
334	u64 egr_mirr;
335	u64 drpnona664;
336	u64 drpdtag;
337	u64 drpuntag;
338	u64 retag;
339	u64 dyn_learn;
340	u64 egress;
341	u64 ingress;
342};
343
344struct sja1105_retagging_entry {
345	u64 egr_port;
346	u64 ing_port;
347	u64 vlan_ing;
348	u64 vlan_egr;
349	u64 do_not_learn;
350	u64 use_dest_ports;
351	u64 destports;
352};
353
354struct sja1105_cbs_entry {
355	u64 port; /* Not used for SJA1110 */
356	u64 prio; /* Not used for SJA1110 */
357	u64 credit_hi;
358	u64 credit_lo;
359	u64 send_slope;
360	u64 idle_slope;
361};
362
363struct sja1105_xmii_params_entry {
364	u64 phy_mac[SJA1105_MAX_NUM_PORTS];
365	u64 xmii_mode[SJA1105_MAX_NUM_PORTS];
366	/* The SJA1110 insists being a snowflake, and requires SGMII,
367	 * 2500base-x and internal MII ports connected to the 100base-TX PHY to
368	 * set this bit. We set it unconditionally from the high-level logic,
369	 * and only sja1110_xmii_params_entry_packing writes it to the static
370	 * config. I have no better name for it than "special".
371	 */
372	u64 special[SJA1105_MAX_NUM_PORTS];
373};
374
375struct sja1110_pcp_remapping_entry {
376	u64 egrpcp[SJA1105_NUM_TC];
377};
378
379enum {
380	SJA1105_VL_FORMAT_PSFP		= 0,
381	SJA1105_VL_FORMAT_ARINC664	= 1,
382};
383
384struct sja1105_vl_lookup_entry {
385	u64 format;
386	u64 port;
387	union {
388		/* SJA1105_VL_FORMAT_PSFP */
389		struct {
390			u64 destports;
391			u64 iscritical;
392			u64 macaddr;
393			u64 vlanid;
394			u64 vlanprior;
395		};
396		/* SJA1105_VL_FORMAT_ARINC664 */
397		struct {
398			u64 egrmirr;
399			u64 ingrmirr;
400			u64 vlid;
401		};
402	};
403	/* Not part of hardware structure */
404	unsigned long flow_cookie;
405};
406
407struct sja1105_vl_policing_entry {
408	u64 type;
409	u64 maxlen;
410	u64 sharindx;
411	u64 bag;
412	u64 jitter;
413};
414
415struct sja1105_vl_forwarding_entry {
416	u64 type;
417	u64 priority;
418	u64 partition;
419	u64 destports;
420};
421
422struct sja1105_vl_forwarding_params_entry {
423	u64 partspc[8];
424	u64 debugen;
425};
426
427struct sja1105_table_header {
428	u64 block_id;
429	u64 len;
430	u64 crc;
431};
432
433struct sja1105_table_ops {
434	size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op);
435	size_t unpacked_entry_size;
436	size_t packed_entry_size;
437	size_t max_entry_count;
438};
439
440struct sja1105_table {
441	const struct sja1105_table_ops *ops;
442	size_t entry_count;
443	void *entries;
444};
445
446struct sja1105_static_config {
447	u64 device_id;
448	struct sja1105_table tables[BLK_IDX_MAX];
449};
450
451extern const struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX];
452extern const struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX];
453extern const struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX];
454extern const struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX];
455extern const struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX];
456extern const struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX];
457extern const struct sja1105_table_ops sja1110_table_ops[BLK_IDX_MAX];
458
459size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op);
460void
461sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr);
462size_t
463sja1105_static_config_get_length(const struct sja1105_static_config *config);
464
465typedef enum {
466	SJA1105_CONFIG_OK = 0,
467	SJA1105_TTETHERNET_NOT_SUPPORTED,
468	SJA1105_INCORRECT_TTETHERNET_CONFIGURATION,
469	SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION,
470	SJA1105_MISSING_L2_POLICING_TABLE,
471	SJA1105_MISSING_L2_FORWARDING_TABLE,
472	SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE,
473	SJA1105_MISSING_GENERAL_PARAMS_TABLE,
474	SJA1105_MISSING_VLAN_TABLE,
475	SJA1105_MISSING_XMII_TABLE,
476	SJA1105_MISSING_MAC_TABLE,
477	SJA1105_OVERCOMMITTED_FRAME_MEMORY,
478} sja1105_config_valid_t;
479
480extern const char *sja1105_static_config_error_msg[];
481
482sja1105_config_valid_t
483sja1105_static_config_check_valid(const struct sja1105_static_config *config,
484				  int max_mem);
485void
486sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
487int sja1105_static_config_init(struct sja1105_static_config *config,
488			       const struct sja1105_table_ops *static_ops,
489			       u64 device_id);
490void sja1105_static_config_free(struct sja1105_static_config *config);
491
492int sja1105_table_delete_entry(struct sja1105_table *table, int i);
493int sja1105_table_resize(struct sja1105_table *table, size_t new_count);
494
495u32 sja1105_crc32(const void *buf, size_t len);
496
497void sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len);
498void sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len);
499void sja1105_packing(void *buf, u64 *val, int start, int end,
500		     size_t len, enum packing_op op);
501
502/* Common implementations for the static and dynamic configs */
503size_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
504						enum packing_op op);
505size_t sja1110_general_params_entry_packing(void *buf, void *entry_ptr,
506					    enum packing_op op);
507size_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
508						  enum packing_op op);
509size_t sja1110_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
510					      enum packing_op op);
511size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
512					   enum packing_op op);
513size_t sja1110_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
514					   enum packing_op op);
515size_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr,
516					   enum packing_op op);
517size_t sja1105et_l2_lookup_entry_packing(void *buf, void *entry_ptr,
518					 enum packing_op op);
519size_t sja1110_l2_lookup_entry_packing(void *buf, void *entry_ptr,
520				       enum packing_op op);
521size_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
522					 enum packing_op op);
523size_t sja1110_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
524					 enum packing_op op);
525size_t sja1105_retagging_entry_packing(void *buf, void *entry_ptr,
526				       enum packing_op op);
527size_t sja1110_retagging_entry_packing(void *buf, void *entry_ptr,
528				       enum packing_op op);
529size_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
530					    enum packing_op op);
531size_t sja1110_mac_config_entry_packing(void *buf, void *entry_ptr,
532					enum packing_op op);
533size_t sja1105pqrs_avb_params_entry_packing(void *buf, void *entry_ptr,
534					    enum packing_op op);
535size_t sja1105_vl_lookup_entry_packing(void *buf, void *entry_ptr,
536				       enum packing_op op);
537size_t sja1110_vl_lookup_entry_packing(void *buf, void *entry_ptr,
538				       enum packing_op op);
539size_t sja1110_vl_policing_entry_packing(void *buf, void *entry_ptr,
540					 enum packing_op op);
541size_t sja1110_xmii_params_entry_packing(void *buf, void *entry_ptr,
542					 enum packing_op op);
543size_t sja1110_l2_policing_entry_packing(void *buf, void *entry_ptr,
544					 enum packing_op op);
545size_t sja1110_l2_forwarding_params_entry_packing(void *buf, void *entry_ptr,
546						  enum packing_op op);
547
548#endif
549