xref: /OK3568_Linux_fs/kernel/drivers/net/dsa/sja1105/sja1105_static_config.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: BSD-3-Clause */
2*4882a593Smuzhiyun /* Copyright (c) 2016-2018, NXP Semiconductors
3*4882a593Smuzhiyun  * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com>
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun #ifndef _SJA1105_STATIC_CONFIG_H
6*4882a593Smuzhiyun #define _SJA1105_STATIC_CONFIG_H
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/packing.h>
9*4882a593Smuzhiyun #include <linux/types.h>
10*4882a593Smuzhiyun #include <asm/types.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #define SJA1105_SIZE_DEVICE_ID				4
13*4882a593Smuzhiyun #define SJA1105_SIZE_TABLE_HEADER			12
14*4882a593Smuzhiyun #define SJA1105_SIZE_SCHEDULE_ENTRY			8
15*4882a593Smuzhiyun #define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_ENTRY	4
16*4882a593Smuzhiyun #define SJA1105_SIZE_VL_LOOKUP_ENTRY			12
17*4882a593Smuzhiyun #define SJA1105_SIZE_VL_POLICING_ENTRY			8
18*4882a593Smuzhiyun #define SJA1105_SIZE_VL_FORWARDING_ENTRY		4
19*4882a593Smuzhiyun #define SJA1105_SIZE_L2_POLICING_ENTRY			8
20*4882a593Smuzhiyun #define SJA1105_SIZE_VLAN_LOOKUP_ENTRY			8
21*4882a593Smuzhiyun #define SJA1105_SIZE_L2_FORWARDING_ENTRY		8
22*4882a593Smuzhiyun #define SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY		12
23*4882a593Smuzhiyun #define SJA1105_SIZE_RETAGGING_ENTRY			8
24*4882a593Smuzhiyun #define SJA1105_SIZE_XMII_PARAMS_ENTRY			4
25*4882a593Smuzhiyun #define SJA1105_SIZE_SCHEDULE_PARAMS_ENTRY		12
26*4882a593Smuzhiyun #define SJA1105_SIZE_SCHEDULE_ENTRY_POINTS_PARAMS_ENTRY	4
27*4882a593Smuzhiyun #define SJA1105_SIZE_VL_FORWARDING_PARAMS_ENTRY         12
28*4882a593Smuzhiyun #define SJA1105ET_SIZE_L2_LOOKUP_ENTRY			12
29*4882a593Smuzhiyun #define SJA1105ET_SIZE_MAC_CONFIG_ENTRY			28
30*4882a593Smuzhiyun #define SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY		4
31*4882a593Smuzhiyun #define SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY		40
32*4882a593Smuzhiyun #define SJA1105ET_SIZE_AVB_PARAMS_ENTRY			12
33*4882a593Smuzhiyun #define SJA1105ET_SIZE_CBS_ENTRY			16
34*4882a593Smuzhiyun #define SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY		20
35*4882a593Smuzhiyun #define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY		32
36*4882a593Smuzhiyun #define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY		16
37*4882a593Smuzhiyun #define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY		44
38*4882a593Smuzhiyun #define SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY		16
39*4882a593Smuzhiyun #define SJA1105PQRS_SIZE_CBS_ENTRY			20
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /* UM10944.pdf Page 11, Table 2. Configuration Blocks */
42*4882a593Smuzhiyun enum {
43*4882a593Smuzhiyun 	BLKID_SCHEDULE					= 0x00,
44*4882a593Smuzhiyun 	BLKID_SCHEDULE_ENTRY_POINTS			= 0x01,
45*4882a593Smuzhiyun 	BLKID_VL_LOOKUP					= 0x02,
46*4882a593Smuzhiyun 	BLKID_VL_POLICING				= 0x03,
47*4882a593Smuzhiyun 	BLKID_VL_FORWARDING				= 0x04,
48*4882a593Smuzhiyun 	BLKID_L2_LOOKUP					= 0x05,
49*4882a593Smuzhiyun 	BLKID_L2_POLICING				= 0x06,
50*4882a593Smuzhiyun 	BLKID_VLAN_LOOKUP				= 0x07,
51*4882a593Smuzhiyun 	BLKID_L2_FORWARDING				= 0x08,
52*4882a593Smuzhiyun 	BLKID_MAC_CONFIG				= 0x09,
53*4882a593Smuzhiyun 	BLKID_SCHEDULE_PARAMS				= 0x0A,
54*4882a593Smuzhiyun 	BLKID_SCHEDULE_ENTRY_POINTS_PARAMS		= 0x0B,
55*4882a593Smuzhiyun 	BLKID_VL_FORWARDING_PARAMS			= 0x0C,
56*4882a593Smuzhiyun 	BLKID_L2_LOOKUP_PARAMS				= 0x0D,
57*4882a593Smuzhiyun 	BLKID_L2_FORWARDING_PARAMS			= 0x0E,
58*4882a593Smuzhiyun 	BLKID_AVB_PARAMS				= 0x10,
59*4882a593Smuzhiyun 	BLKID_GENERAL_PARAMS				= 0x11,
60*4882a593Smuzhiyun 	BLKID_RETAGGING					= 0x12,
61*4882a593Smuzhiyun 	BLKID_CBS					= 0x13,
62*4882a593Smuzhiyun 	BLKID_XMII_PARAMS				= 0x4E,
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun enum sja1105_blk_idx {
66*4882a593Smuzhiyun 	BLK_IDX_SCHEDULE = 0,
67*4882a593Smuzhiyun 	BLK_IDX_SCHEDULE_ENTRY_POINTS,
68*4882a593Smuzhiyun 	BLK_IDX_VL_LOOKUP,
69*4882a593Smuzhiyun 	BLK_IDX_VL_POLICING,
70*4882a593Smuzhiyun 	BLK_IDX_VL_FORWARDING,
71*4882a593Smuzhiyun 	BLK_IDX_L2_LOOKUP,
72*4882a593Smuzhiyun 	BLK_IDX_L2_POLICING,
73*4882a593Smuzhiyun 	BLK_IDX_VLAN_LOOKUP,
74*4882a593Smuzhiyun 	BLK_IDX_L2_FORWARDING,
75*4882a593Smuzhiyun 	BLK_IDX_MAC_CONFIG,
76*4882a593Smuzhiyun 	BLK_IDX_SCHEDULE_PARAMS,
77*4882a593Smuzhiyun 	BLK_IDX_SCHEDULE_ENTRY_POINTS_PARAMS,
78*4882a593Smuzhiyun 	BLK_IDX_VL_FORWARDING_PARAMS,
79*4882a593Smuzhiyun 	BLK_IDX_L2_LOOKUP_PARAMS,
80*4882a593Smuzhiyun 	BLK_IDX_L2_FORWARDING_PARAMS,
81*4882a593Smuzhiyun 	BLK_IDX_AVB_PARAMS,
82*4882a593Smuzhiyun 	BLK_IDX_GENERAL_PARAMS,
83*4882a593Smuzhiyun 	BLK_IDX_RETAGGING,
84*4882a593Smuzhiyun 	BLK_IDX_CBS,
85*4882a593Smuzhiyun 	BLK_IDX_XMII_PARAMS,
86*4882a593Smuzhiyun 	BLK_IDX_MAX,
87*4882a593Smuzhiyun 	/* Fake block indices that are only valid for dynamic access */
88*4882a593Smuzhiyun 	BLK_IDX_MGMT_ROUTE,
89*4882a593Smuzhiyun 	BLK_IDX_MAX_DYN,
90*4882a593Smuzhiyun 	BLK_IDX_INVAL = -1,
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun #define SJA1105_MAX_SCHEDULE_COUNT			1024
94*4882a593Smuzhiyun #define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_COUNT		2048
95*4882a593Smuzhiyun #define SJA1105_MAX_VL_LOOKUP_COUNT			1024
96*4882a593Smuzhiyun #define SJA1105_MAX_VL_POLICING_COUNT			1024
97*4882a593Smuzhiyun #define SJA1105_MAX_VL_FORWARDING_COUNT			1024
98*4882a593Smuzhiyun #define SJA1105_MAX_L2_LOOKUP_COUNT			1024
99*4882a593Smuzhiyun #define SJA1105_MAX_L2_POLICING_COUNT			45
100*4882a593Smuzhiyun #define SJA1105_MAX_VLAN_LOOKUP_COUNT			4096
101*4882a593Smuzhiyun #define SJA1105_MAX_L2_FORWARDING_COUNT			13
102*4882a593Smuzhiyun #define SJA1105_MAX_MAC_CONFIG_COUNT			5
103*4882a593Smuzhiyun #define SJA1105_MAX_SCHEDULE_PARAMS_COUNT		1
104*4882a593Smuzhiyun #define SJA1105_MAX_SCHEDULE_ENTRY_POINTS_PARAMS_COUNT	1
105*4882a593Smuzhiyun #define SJA1105_MAX_VL_FORWARDING_PARAMS_COUNT		1
106*4882a593Smuzhiyun #define SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT		1
107*4882a593Smuzhiyun #define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT		1
108*4882a593Smuzhiyun #define SJA1105_MAX_GENERAL_PARAMS_COUNT		1
109*4882a593Smuzhiyun #define SJA1105_MAX_RETAGGING_COUNT			32
110*4882a593Smuzhiyun #define SJA1105_MAX_XMII_PARAMS_COUNT			1
111*4882a593Smuzhiyun #define SJA1105_MAX_AVB_PARAMS_COUNT			1
112*4882a593Smuzhiyun #define SJA1105ET_MAX_CBS_COUNT				10
113*4882a593Smuzhiyun #define SJA1105PQRS_MAX_CBS_COUNT			16
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun #define SJA1105_MAX_FRAME_MEMORY			929
116*4882a593Smuzhiyun #define SJA1105_MAX_FRAME_MEMORY_RETAGGING		910
117*4882a593Smuzhiyun #define SJA1105_VL_FRAME_MEMORY				100
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun #define SJA1105E_DEVICE_ID				0x9C00000Cull
120*4882a593Smuzhiyun #define SJA1105T_DEVICE_ID				0x9E00030Eull
121*4882a593Smuzhiyun #define SJA1105PR_DEVICE_ID				0xAF00030Eull
122*4882a593Smuzhiyun #define SJA1105QS_DEVICE_ID				0xAE00030Eull
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun #define SJA1105ET_PART_NO				0x9A83
125*4882a593Smuzhiyun #define SJA1105P_PART_NO				0x9A84
126*4882a593Smuzhiyun #define SJA1105Q_PART_NO				0x9A85
127*4882a593Smuzhiyun #define SJA1105R_PART_NO				0x9A86
128*4882a593Smuzhiyun #define SJA1105S_PART_NO				0x9A87
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun struct sja1105_schedule_entry {
131*4882a593Smuzhiyun 	u64 winstindex;
132*4882a593Smuzhiyun 	u64 winend;
133*4882a593Smuzhiyun 	u64 winst;
134*4882a593Smuzhiyun 	u64 destports;
135*4882a593Smuzhiyun 	u64 setvalid;
136*4882a593Smuzhiyun 	u64 txen;
137*4882a593Smuzhiyun 	u64 resmedia_en;
138*4882a593Smuzhiyun 	u64 resmedia;
139*4882a593Smuzhiyun 	u64 vlindex;
140*4882a593Smuzhiyun 	u64 delta;
141*4882a593Smuzhiyun };
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun struct sja1105_schedule_params_entry {
144*4882a593Smuzhiyun 	u64 subscheind[8];
145*4882a593Smuzhiyun };
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun struct sja1105_general_params_entry {
148*4882a593Smuzhiyun 	u64 vllupformat;
149*4882a593Smuzhiyun 	u64 mirr_ptacu;
150*4882a593Smuzhiyun 	u64 switchid;
151*4882a593Smuzhiyun 	u64 hostprio;
152*4882a593Smuzhiyun 	u64 mac_fltres1;
153*4882a593Smuzhiyun 	u64 mac_fltres0;
154*4882a593Smuzhiyun 	u64 mac_flt1;
155*4882a593Smuzhiyun 	u64 mac_flt0;
156*4882a593Smuzhiyun 	u64 incl_srcpt1;
157*4882a593Smuzhiyun 	u64 incl_srcpt0;
158*4882a593Smuzhiyun 	u64 send_meta1;
159*4882a593Smuzhiyun 	u64 send_meta0;
160*4882a593Smuzhiyun 	u64 casc_port;
161*4882a593Smuzhiyun 	u64 host_port;
162*4882a593Smuzhiyun 	u64 mirr_port;
163*4882a593Smuzhiyun 	u64 vlmarker;
164*4882a593Smuzhiyun 	u64 vlmask;
165*4882a593Smuzhiyun 	u64 tpid;
166*4882a593Smuzhiyun 	u64 ignore2stf;
167*4882a593Smuzhiyun 	u64 tpid2;
168*4882a593Smuzhiyun 	/* P/Q/R/S only */
169*4882a593Smuzhiyun 	u64 queue_ts;
170*4882a593Smuzhiyun 	u64 egrmirrvid;
171*4882a593Smuzhiyun 	u64 egrmirrpcp;
172*4882a593Smuzhiyun 	u64 egrmirrdei;
173*4882a593Smuzhiyun 	u64 replay_port;
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun struct sja1105_schedule_entry_points_entry {
177*4882a593Smuzhiyun 	u64 subschindx;
178*4882a593Smuzhiyun 	u64 delta;
179*4882a593Smuzhiyun 	u64 address;
180*4882a593Smuzhiyun };
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun struct sja1105_schedule_entry_points_params_entry {
183*4882a593Smuzhiyun 	u64 clksrc;
184*4882a593Smuzhiyun 	u64 actsubsch;
185*4882a593Smuzhiyun };
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun struct sja1105_vlan_lookup_entry {
188*4882a593Smuzhiyun 	u64 ving_mirr;
189*4882a593Smuzhiyun 	u64 vegr_mirr;
190*4882a593Smuzhiyun 	u64 vmemb_port;
191*4882a593Smuzhiyun 	u64 vlan_bc;
192*4882a593Smuzhiyun 	u64 tag_port;
193*4882a593Smuzhiyun 	u64 vlanid;
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun struct sja1105_l2_lookup_entry {
197*4882a593Smuzhiyun 	u64 vlanid;
198*4882a593Smuzhiyun 	u64 macaddr;
199*4882a593Smuzhiyun 	u64 destports;
200*4882a593Smuzhiyun 	u64 enfport;
201*4882a593Smuzhiyun 	u64 index;
202*4882a593Smuzhiyun 	/* P/Q/R/S only */
203*4882a593Smuzhiyun 	u64 mask_iotag;
204*4882a593Smuzhiyun 	u64 mask_vlanid;
205*4882a593Smuzhiyun 	u64 mask_macaddr;
206*4882a593Smuzhiyun 	u64 iotag;
207*4882a593Smuzhiyun 	u64 lockeds;
208*4882a593Smuzhiyun 	union {
209*4882a593Smuzhiyun 		/* LOCKEDS=1: Static FDB entries */
210*4882a593Smuzhiyun 		struct {
211*4882a593Smuzhiyun 			u64 tsreg;
212*4882a593Smuzhiyun 			u64 mirrvlan;
213*4882a593Smuzhiyun 			u64 takets;
214*4882a593Smuzhiyun 			u64 mirr;
215*4882a593Smuzhiyun 			u64 retag;
216*4882a593Smuzhiyun 		};
217*4882a593Smuzhiyun 		/* LOCKEDS=0: Dynamically learned FDB entries */
218*4882a593Smuzhiyun 		struct {
219*4882a593Smuzhiyun 			u64 touched;
220*4882a593Smuzhiyun 			u64 age;
221*4882a593Smuzhiyun 		};
222*4882a593Smuzhiyun 	};
223*4882a593Smuzhiyun };
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun struct sja1105_l2_lookup_params_entry {
226*4882a593Smuzhiyun 	u64 maxaddrp[5];     /* P/Q/R/S only */
227*4882a593Smuzhiyun 	u64 start_dynspc;    /* P/Q/R/S only */
228*4882a593Smuzhiyun 	u64 drpnolearn;      /* P/Q/R/S only */
229*4882a593Smuzhiyun 	u64 use_static;      /* P/Q/R/S only */
230*4882a593Smuzhiyun 	u64 owr_dyn;         /* P/Q/R/S only */
231*4882a593Smuzhiyun 	u64 learn_once;      /* P/Q/R/S only */
232*4882a593Smuzhiyun 	u64 maxage;          /* Shared */
233*4882a593Smuzhiyun 	u64 dyn_tbsz;        /* E/T only */
234*4882a593Smuzhiyun 	u64 poly;            /* E/T only */
235*4882a593Smuzhiyun 	u64 shared_learn;    /* Shared */
236*4882a593Smuzhiyun 	u64 no_enf_hostprt;  /* Shared */
237*4882a593Smuzhiyun 	u64 no_mgmt_learn;   /* Shared */
238*4882a593Smuzhiyun };
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun struct sja1105_l2_forwarding_entry {
241*4882a593Smuzhiyun 	u64 bc_domain;
242*4882a593Smuzhiyun 	u64 reach_port;
243*4882a593Smuzhiyun 	u64 fl_domain;
244*4882a593Smuzhiyun 	u64 vlan_pmap[8];
245*4882a593Smuzhiyun };
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun struct sja1105_l2_forwarding_params_entry {
248*4882a593Smuzhiyun 	u64 max_dynp;
249*4882a593Smuzhiyun 	u64 part_spc[8];
250*4882a593Smuzhiyun };
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun struct sja1105_l2_policing_entry {
253*4882a593Smuzhiyun 	u64 sharindx;
254*4882a593Smuzhiyun 	u64 smax;
255*4882a593Smuzhiyun 	u64 rate;
256*4882a593Smuzhiyun 	u64 maxlen;
257*4882a593Smuzhiyun 	u64 partition;
258*4882a593Smuzhiyun };
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun struct sja1105_avb_params_entry {
261*4882a593Smuzhiyun 	u64 cas_master;
262*4882a593Smuzhiyun 	u64 destmeta;
263*4882a593Smuzhiyun 	u64 srcmeta;
264*4882a593Smuzhiyun };
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun struct sja1105_mac_config_entry {
267*4882a593Smuzhiyun 	u64 top[8];
268*4882a593Smuzhiyun 	u64 base[8];
269*4882a593Smuzhiyun 	u64 enabled[8];
270*4882a593Smuzhiyun 	u64 ifg;
271*4882a593Smuzhiyun 	u64 speed;
272*4882a593Smuzhiyun 	u64 tp_delin;
273*4882a593Smuzhiyun 	u64 tp_delout;
274*4882a593Smuzhiyun 	u64 maxage;
275*4882a593Smuzhiyun 	u64 vlanprio;
276*4882a593Smuzhiyun 	u64 vlanid;
277*4882a593Smuzhiyun 	u64 ing_mirr;
278*4882a593Smuzhiyun 	u64 egr_mirr;
279*4882a593Smuzhiyun 	u64 drpnona664;
280*4882a593Smuzhiyun 	u64 drpdtag;
281*4882a593Smuzhiyun 	u64 drpuntag;
282*4882a593Smuzhiyun 	u64 retag;
283*4882a593Smuzhiyun 	u64 dyn_learn;
284*4882a593Smuzhiyun 	u64 egress;
285*4882a593Smuzhiyun 	u64 ingress;
286*4882a593Smuzhiyun };
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun struct sja1105_retagging_entry {
289*4882a593Smuzhiyun 	u64 egr_port;
290*4882a593Smuzhiyun 	u64 ing_port;
291*4882a593Smuzhiyun 	u64 vlan_ing;
292*4882a593Smuzhiyun 	u64 vlan_egr;
293*4882a593Smuzhiyun 	u64 do_not_learn;
294*4882a593Smuzhiyun 	u64 use_dest_ports;
295*4882a593Smuzhiyun 	u64 destports;
296*4882a593Smuzhiyun };
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun struct sja1105_cbs_entry {
299*4882a593Smuzhiyun 	u64 port;
300*4882a593Smuzhiyun 	u64 prio;
301*4882a593Smuzhiyun 	u64 credit_hi;
302*4882a593Smuzhiyun 	u64 credit_lo;
303*4882a593Smuzhiyun 	u64 send_slope;
304*4882a593Smuzhiyun 	u64 idle_slope;
305*4882a593Smuzhiyun };
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun struct sja1105_xmii_params_entry {
308*4882a593Smuzhiyun 	u64 phy_mac[5];
309*4882a593Smuzhiyun 	u64 xmii_mode[5];
310*4882a593Smuzhiyun };
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun enum {
313*4882a593Smuzhiyun 	SJA1105_VL_FORMAT_PSFP		= 0,
314*4882a593Smuzhiyun 	SJA1105_VL_FORMAT_ARINC664	= 1,
315*4882a593Smuzhiyun };
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun struct sja1105_vl_lookup_entry {
318*4882a593Smuzhiyun 	u64 format;
319*4882a593Smuzhiyun 	u64 port;
320*4882a593Smuzhiyun 	union {
321*4882a593Smuzhiyun 		/* SJA1105_VL_FORMAT_PSFP */
322*4882a593Smuzhiyun 		struct {
323*4882a593Smuzhiyun 			u64 destports;
324*4882a593Smuzhiyun 			u64 iscritical;
325*4882a593Smuzhiyun 			u64 macaddr;
326*4882a593Smuzhiyun 			u64 vlanid;
327*4882a593Smuzhiyun 			u64 vlanprior;
328*4882a593Smuzhiyun 		};
329*4882a593Smuzhiyun 		/* SJA1105_VL_FORMAT_ARINC664 */
330*4882a593Smuzhiyun 		struct {
331*4882a593Smuzhiyun 			u64 egrmirr;
332*4882a593Smuzhiyun 			u64 ingrmirr;
333*4882a593Smuzhiyun 			u64 vlid;
334*4882a593Smuzhiyun 		};
335*4882a593Smuzhiyun 	};
336*4882a593Smuzhiyun 	/* Not part of hardware structure */
337*4882a593Smuzhiyun 	unsigned long flow_cookie;
338*4882a593Smuzhiyun };
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun struct sja1105_vl_policing_entry {
341*4882a593Smuzhiyun 	u64 type;
342*4882a593Smuzhiyun 	u64 maxlen;
343*4882a593Smuzhiyun 	u64 sharindx;
344*4882a593Smuzhiyun 	u64 bag;
345*4882a593Smuzhiyun 	u64 jitter;
346*4882a593Smuzhiyun };
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun struct sja1105_vl_forwarding_entry {
349*4882a593Smuzhiyun 	u64 type;
350*4882a593Smuzhiyun 	u64 priority;
351*4882a593Smuzhiyun 	u64 partition;
352*4882a593Smuzhiyun 	u64 destports;
353*4882a593Smuzhiyun };
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun struct sja1105_vl_forwarding_params_entry {
356*4882a593Smuzhiyun 	u64 partspc[8];
357*4882a593Smuzhiyun 	u64 debugen;
358*4882a593Smuzhiyun };
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun struct sja1105_table_header {
361*4882a593Smuzhiyun 	u64 block_id;
362*4882a593Smuzhiyun 	u64 len;
363*4882a593Smuzhiyun 	u64 crc;
364*4882a593Smuzhiyun };
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun struct sja1105_table_ops {
367*4882a593Smuzhiyun 	size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op);
368*4882a593Smuzhiyun 	size_t unpacked_entry_size;
369*4882a593Smuzhiyun 	size_t packed_entry_size;
370*4882a593Smuzhiyun 	size_t max_entry_count;
371*4882a593Smuzhiyun };
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun struct sja1105_table {
374*4882a593Smuzhiyun 	const struct sja1105_table_ops *ops;
375*4882a593Smuzhiyun 	size_t entry_count;
376*4882a593Smuzhiyun 	void *entries;
377*4882a593Smuzhiyun };
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun struct sja1105_static_config {
380*4882a593Smuzhiyun 	u64 device_id;
381*4882a593Smuzhiyun 	struct sja1105_table tables[BLK_IDX_MAX];
382*4882a593Smuzhiyun };
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun extern const struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX];
385*4882a593Smuzhiyun extern const struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX];
386*4882a593Smuzhiyun extern const struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX];
387*4882a593Smuzhiyun extern const struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX];
388*4882a593Smuzhiyun extern const struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX];
389*4882a593Smuzhiyun extern const struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX];
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op);
392*4882a593Smuzhiyun void
393*4882a593Smuzhiyun sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr);
394*4882a593Smuzhiyun size_t
395*4882a593Smuzhiyun sja1105_static_config_get_length(const struct sja1105_static_config *config);
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun typedef enum {
398*4882a593Smuzhiyun 	SJA1105_CONFIG_OK = 0,
399*4882a593Smuzhiyun 	SJA1105_TTETHERNET_NOT_SUPPORTED,
400*4882a593Smuzhiyun 	SJA1105_INCORRECT_TTETHERNET_CONFIGURATION,
401*4882a593Smuzhiyun 	SJA1105_INCORRECT_VIRTUAL_LINK_CONFIGURATION,
402*4882a593Smuzhiyun 	SJA1105_MISSING_L2_POLICING_TABLE,
403*4882a593Smuzhiyun 	SJA1105_MISSING_L2_FORWARDING_TABLE,
404*4882a593Smuzhiyun 	SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE,
405*4882a593Smuzhiyun 	SJA1105_MISSING_GENERAL_PARAMS_TABLE,
406*4882a593Smuzhiyun 	SJA1105_MISSING_VLAN_TABLE,
407*4882a593Smuzhiyun 	SJA1105_MISSING_XMII_TABLE,
408*4882a593Smuzhiyun 	SJA1105_MISSING_MAC_TABLE,
409*4882a593Smuzhiyun 	SJA1105_OVERCOMMITTED_FRAME_MEMORY,
410*4882a593Smuzhiyun } sja1105_config_valid_t;
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun extern const char *sja1105_static_config_error_msg[];
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun sja1105_config_valid_t
415*4882a593Smuzhiyun sja1105_static_config_check_valid(const struct sja1105_static_config *config);
416*4882a593Smuzhiyun void
417*4882a593Smuzhiyun sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
418*4882a593Smuzhiyun int sja1105_static_config_init(struct sja1105_static_config *config,
419*4882a593Smuzhiyun 			       const struct sja1105_table_ops *static_ops,
420*4882a593Smuzhiyun 			       u64 device_id);
421*4882a593Smuzhiyun void sja1105_static_config_free(struct sja1105_static_config *config);
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun int sja1105_table_delete_entry(struct sja1105_table *table, int i);
424*4882a593Smuzhiyun int sja1105_table_resize(struct sja1105_table *table, size_t new_count);
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun u32 sja1105_crc32(const void *buf, size_t len);
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun void sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len);
429*4882a593Smuzhiyun void sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len);
430*4882a593Smuzhiyun void sja1105_packing(void *buf, u64 *val, int start, int end,
431*4882a593Smuzhiyun 		     size_t len, enum packing_op op);
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun /* Common implementations for the static and dynamic configs */
434*4882a593Smuzhiyun size_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
435*4882a593Smuzhiyun 						enum packing_op op);
436*4882a593Smuzhiyun size_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
437*4882a593Smuzhiyun 						  enum packing_op op);
438*4882a593Smuzhiyun size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
439*4882a593Smuzhiyun 					   enum packing_op op);
440*4882a593Smuzhiyun size_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr,
441*4882a593Smuzhiyun 					   enum packing_op op);
442*4882a593Smuzhiyun size_t sja1105et_l2_lookup_entry_packing(void *buf, void *entry_ptr,
443*4882a593Smuzhiyun 					 enum packing_op op);
444*4882a593Smuzhiyun size_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
445*4882a593Smuzhiyun 					 enum packing_op op);
446*4882a593Smuzhiyun size_t sja1105_retagging_entry_packing(void *buf, void *entry_ptr,
447*4882a593Smuzhiyun 				       enum packing_op op);
448*4882a593Smuzhiyun size_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
449*4882a593Smuzhiyun 					    enum packing_op op);
450*4882a593Smuzhiyun size_t sja1105pqrs_avb_params_entry_packing(void *buf, void *entry_ptr,
451*4882a593Smuzhiyun 					    enum packing_op op);
452*4882a593Smuzhiyun size_t sja1105_vl_lookup_entry_packing(void *buf, void *entry_ptr,
453*4882a593Smuzhiyun 				       enum packing_op op);
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun #endif
456