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