1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright (c) 2016-2018, NXP Semiconductors
3 * Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com>
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_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
41 /* UM10944.pdf Page 11, Table 2. Configuration Blocks */
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,
62 BLKID_XMII_PARAMS = 0x4E,
65 enum sja1105_blk_idx {
67 BLK_IDX_SCHEDULE_ENTRY_POINTS,
70 BLK_IDX_VL_FORWARDING,
74 BLK_IDX_L2_FORWARDING,
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,
82 BLK_IDX_GENERAL_PARAMS,
87 /* Fake block indices that are only valid for dynamic access */
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
115 #define SJA1105_MAX_FRAME_MEMORY 929
116 #define SJA1105_MAX_FRAME_MEMORY_RETAGGING 910
117 #define SJA1105_VL_FRAME_MEMORY 100
119 #define SJA1105E_DEVICE_ID 0x9C00000Cull
120 #define SJA1105T_DEVICE_ID 0x9E00030Eull
121 #define SJA1105PR_DEVICE_ID 0xAF00030Eull
122 #define SJA1105QS_DEVICE_ID 0xAE00030Eull
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
130 struct sja1105_schedule_entry {
143 struct sja1105_schedule_params_entry {
147 struct sja1105_general_params_entry {
176 struct sja1105_schedule_entry_points_entry {
182 struct sja1105_schedule_entry_points_params_entry {
187 struct sja1105_vlan_lookup_entry {
196 struct sja1105_l2_lookup_entry {
209 /* LOCKEDS=1: Static FDB entries */
217 /* LOCKEDS=0: Dynamically learned FDB entries */
225 struct 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 */
240 struct sja1105_l2_forwarding_entry {
247 struct sja1105_l2_forwarding_params_entry {
252 struct sja1105_l2_policing_entry {
260 struct sja1105_avb_params_entry {
266 struct sja1105_mac_config_entry {
288 struct sja1105_retagging_entry {
298 struct sja1105_cbs_entry {
307 struct sja1105_xmii_params_entry {
313 SJA1105_VL_FORMAT_PSFP = 0,
314 SJA1105_VL_FORMAT_ARINC664 = 1,
317 struct sja1105_vl_lookup_entry {
321 /* SJA1105_VL_FORMAT_PSFP */
329 /* SJA1105_VL_FORMAT_ARINC664 */
336 /* Not part of hardware structure */
337 unsigned long flow_cookie;
340 struct sja1105_vl_policing_entry {
348 struct sja1105_vl_forwarding_entry {
355 struct sja1105_vl_forwarding_params_entry {
360 struct sja1105_table_header {
366 struct 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;
373 struct sja1105_table {
374 const struct sja1105_table_ops *ops;
379 struct sja1105_static_config {
381 struct sja1105_table tables[BLK_IDX_MAX];
384 extern const struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX];
385 extern const struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX];
386 extern const struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX];
387 extern const struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX];
388 extern const struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX];
389 extern const struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX];
391 size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op);
393 sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr);
395 sja1105_static_config_get_length(const struct sja1105_static_config *config);
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;
412 extern const char *sja1105_static_config_error_msg[];
414 sja1105_config_valid_t
415 sja1105_static_config_check_valid(const struct sja1105_static_config *config);
417 sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
418 int sja1105_static_config_init(struct sja1105_static_config *config,
419 const struct sja1105_table_ops *static_ops,
421 void sja1105_static_config_free(struct sja1105_static_config *config);
423 int sja1105_table_delete_entry(struct sja1105_table *table, int i);
424 int sja1105_table_resize(struct sja1105_table *table, size_t new_count);
426 u32 sja1105_crc32(const void *buf, size_t len);
428 void sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len);
429 void sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len);
430 void sja1105_packing(void *buf, u64 *val, int start, int end,
431 size_t len, enum packing_op op);
433 /* Common implementations for the static and dynamic configs */
434 size_t sja1105pqrs_general_params_entry_packing(void *buf, void *entry_ptr,
436 size_t sja1105pqrs_l2_lookup_params_entry_packing(void *buf, void *entry_ptr,
438 size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
440 size_t sja1105pqrs_l2_lookup_entry_packing(void *buf, void *entry_ptr,
442 size_t sja1105et_l2_lookup_entry_packing(void *buf, void *entry_ptr,
444 size_t sja1105_vlan_lookup_entry_packing(void *buf, void *entry_ptr,
446 size_t sja1105_retagging_entry_packing(void *buf, void *entry_ptr,
448 size_t sja1105pqrs_mac_config_entry_packing(void *buf, void *entry_ptr,
450 size_t sja1105pqrs_avb_params_entry_packing(void *buf, void *entry_ptr,
452 size_t sja1105_vl_lookup_entry_packing(void *buf, void *entry_ptr,