1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright 2016-2018 NXP
5 #ifndef _SJA1105_STATIC_CONFIG_H
6 #define _SJA1105_STATIC_CONFIG_H
8 #include <linux/packing.h>
9 #include <linux/types.h>
10 #include <asm/types.h>
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
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
56 /* UM10944.pdf Page 11, Table 2. Configuration Blocks */
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,
77 BLKID_PCP_REMAPPING = 0x1C,
78 BLKID_XMII_PARAMS = 0x4E,
81 enum sja1105_blk_idx {
83 BLK_IDX_SCHEDULE_ENTRY_POINTS,
86 BLK_IDX_VL_FORWARDING,
90 BLK_IDX_L2_FORWARDING,
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,
98 BLK_IDX_GENERAL_PARAMS,
102 BLK_IDX_PCP_REMAPPING,
104 /* Fake block indices that are only valid for dynamic access */
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
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
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
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
162 #define SJA1110_ACU 0x1c4400
163 #define SJA1110_RGU 0x1c6000
164 #define SJA1110_CGU 0x1c6400
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))
171 #define SJA1105_RSV_ADDR 0xffffffffffffffffull
173 struct sja1105_schedule_entry {
186 struct sja1105_schedule_params_entry {
190 struct sja1105_general_params_entry {
223 struct sja1105_schedule_entry_points_entry {
229 struct sja1105_schedule_entry_points_params_entry {
234 struct sja1105_vlan_lookup_entry {
241 u64 type_entry; /* SJA1110 only */
244 struct sja1105_l2_lookup_entry {
259 /* LOCKEDS=1: Static FDB entries */
261 /* TSREG is deprecated in SJA1110, TRAP is supported only
271 /* LOCKEDS=0: Dynamically learned FDB entries */
279 struct 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 */
294 struct sja1105_l2_forwarding_entry {
298 /* This is actually max(SJA1105_NUM_TC, SJA1105_MAX_NUM_PORTS) */
299 u64 vlan_pmap[SJA1105_MAX_NUM_PORTS];
300 bool type_egrpcp2outputq;
303 struct sja1105_l2_forwarding_params_entry {
308 struct sja1105_l2_policing_entry {
316 struct sja1105_avb_params_entry {
322 struct sja1105_mac_config_entry {
344 struct sja1105_retagging_entry {
354 struct sja1105_cbs_entry {
355 u64 port; /* Not used for SJA1110 */
356 u64 prio; /* Not used for SJA1110 */
363 struct 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".
372 u64 special[SJA1105_MAX_NUM_PORTS];
375 struct sja1110_pcp_remapping_entry {
376 u64 egrpcp[SJA1105_NUM_TC];
380 SJA1105_VL_FORMAT_PSFP = 0,
381 SJA1105_VL_FORMAT_ARINC664 = 1,
384 struct sja1105_vl_lookup_entry {
388 /* SJA1105_VL_FORMAT_PSFP */
396 /* SJA1105_VL_FORMAT_ARINC664 */
403 /* Not part of hardware structure */
404 unsigned long flow_cookie;
407 struct sja1105_vl_policing_entry {
415 struct sja1105_vl_forwarding_entry {
422 struct sja1105_vl_forwarding_params_entry {
427 struct sja1105_table_header {
433 struct 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;
440 struct sja1105_table {
441 const struct sja1105_table_ops *ops;
446 struct sja1105_static_config {
448 struct sja1105_table tables[BLK_IDX_MAX];
451 extern const struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX];
452 extern const struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX];
453 extern const struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX];
454 extern const struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX];
455 extern const struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX];
456 extern const struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX];
457 extern const struct sja1105_table_ops sja1110_table_ops[BLK_IDX_MAX];
459 size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op);
461 sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr);
463 sja1105_static_config_get_length(const struct sja1105_static_config *config);
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;
480 extern const char *sja1105_static_config_error_msg[];
482 sja1105_config_valid_t
483 sja1105_static_config_check_valid(const struct sja1105_static_config *config,
486 sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
487 int sja1105_static_config_init(struct sja1105_static_config *config,
488 const struct sja1105_table_ops *static_ops,
490 void sja1105_static_config_free(struct sja1105_static_config *config);
492 int sja1105_table_delete_entry(struct sja1105_table *table, int i);
493 int sja1105_table_resize(struct sja1105_table *table, size_t new_count);
495 u32 sja1105_crc32(const void *buf, size_t len);
497 void sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len);
498 void sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len);
499 void sja1105_packing(void *buf, u64 *val, int start, int end,
500 size_t len, enum packing_op op);
502 /* Common implementations for the static and dynamic configs */
503 size_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
505 size_t sja1110_general_params_entry_packing(void *buf, void *entry_ptr,
507 size_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
509 size_t sja1110_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
511 size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
513 size_t sja1110_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
515 size_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr,
517 size_t sja1105et_l2_lookup_entry_packing(void *buf, void *entry_ptr,
519 size_t sja1110_l2_lookup_entry_packing(void *buf, void *entry_ptr,
521 size_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
523 size_t sja1110_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
525 size_t sja1105_retagging_entry_packing(void *buf, void *entry_ptr,
527 size_t sja1110_retagging_entry_packing(void *buf, void *entry_ptr,
529 size_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
531 size_t sja1110_mac_config_entry_packing(void *buf, void *entry_ptr,
533 size_t sja1105pqrs_avb_params_entry_packing(void *buf, void *entry_ptr,
535 size_t sja1105_vl_lookup_entry_packing(void *buf, void *entry_ptr,
537 size_t sja1110_vl_lookup_entry_packing(void *buf, void *entry_ptr,
539 size_t sja1110_vl_policing_entry_packing(void *buf, void *entry_ptr,
541 size_t sja1110_xmii_params_entry_packing(void *buf, void *entry_ptr,
543 size_t sja1110_l2_policing_entry_packing(void *buf, void *entry_ptr,
545 size_t sja1110_l2_forwarding_params_entry_packing(void *buf, void *entry_ptr,