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