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_L2_POLICING_ENTRY 8
15 #define SJA1105_SIZE_VLAN_LOOKUP_ENTRY 8
16 #define SJA1105_SIZE_L2_FORWARDING_ENTRY 8
17 #define SJA1105_SIZE_L2_FORWARDING_PARAMS_ENTRY 12
18 #define SJA1105_SIZE_XMII_PARAMS_ENTRY 4
19 #define SJA1105ET_SIZE_L2_LOOKUP_ENTRY 12
20 #define SJA1105ET_SIZE_MAC_CONFIG_ENTRY 28
21 #define SJA1105ET_SIZE_L2_LOOKUP_PARAMS_ENTRY 4
22 #define SJA1105ET_SIZE_GENERAL_PARAMS_ENTRY 40
23 #define SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY 20
24 #define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY 32
25 #define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY 16
26 #define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY 44
28 /* UM10944.pdf Page 11, Table 2. Configuration Blocks */
30 BLKID_L2_LOOKUP = 0x05,
31 BLKID_L2_POLICING = 0x06,
32 BLKID_VLAN_LOOKUP = 0x07,
33 BLKID_L2_FORWARDING = 0x08,
34 BLKID_MAC_CONFIG = 0x09,
35 BLKID_L2_LOOKUP_PARAMS = 0x0D,
36 BLKID_L2_FORWARDING_PARAMS = 0x0E,
37 BLKID_GENERAL_PARAMS = 0x11,
38 BLKID_XMII_PARAMS = 0x4E,
41 enum sja1105_blk_idx {
42 BLK_IDX_L2_LOOKUP = 0,
45 BLK_IDX_L2_FORWARDING,
47 BLK_IDX_L2_LOOKUP_PARAMS,
48 BLK_IDX_L2_FORWARDING_PARAMS,
49 BLK_IDX_GENERAL_PARAMS,
52 /* Fake block indices that are only valid for dynamic access */
58 #define SJA1105_MAX_L2_LOOKUP_COUNT 1024
59 #define SJA1105_MAX_L2_POLICING_COUNT 45
60 #define SJA1105_MAX_VLAN_LOOKUP_COUNT 4096
61 #define SJA1105_MAX_L2_FORWARDING_COUNT 13
62 #define SJA1105_MAX_MAC_CONFIG_COUNT 5
63 #define SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT 1
64 #define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT 1
65 #define SJA1105_MAX_GENERAL_PARAMS_COUNT 1
66 #define SJA1105_MAX_XMII_PARAMS_COUNT 1
68 #define SJA1105_MAX_FRAME_MEMORY 929
70 #define SJA1105E_DEVICE_ID 0x9C00000Cull
71 #define SJA1105T_DEVICE_ID 0x9E00030Eull
72 #define SJA1105PR_DEVICE_ID 0xAF00030Eull
73 #define SJA1105QS_DEVICE_ID 0xAE00030Eull
75 #define SJA1105ET_PART_NO 0x9A83
76 #define SJA1105P_PART_NO 0x9A84
77 #define SJA1105Q_PART_NO 0x9A85
78 #define SJA1105R_PART_NO 0x9A86
79 #define SJA1105S_PART_NO 0x9A87
81 struct sja1105_general_params_entry {
110 struct sja1105_vlan_lookup_entry {
119 struct sja1105_l2_lookup_entry {
132 /* LOCKEDS=1: Static FDB entries */
140 /* LOCKEDS=0: Dynamically learned FDB entries */
148 struct sja1105_l2_lookup_params_entry {
149 u64 start_dynspc; /* P/Q/R/S only */
150 u64 drpnolearn; /* P/Q/R/S only */
151 u64 use_static; /* P/Q/R/S only */
152 u64 owr_dyn; /* P/Q/R/S only */
153 u64 learn_once; /* P/Q/R/S only */
154 u64 maxage; /* Shared */
155 u64 dyn_tbsz; /* E/T only */
156 u64 poly; /* E/T only */
157 u64 shared_learn; /* Shared */
158 u64 no_enf_hostprt; /* Shared */
159 u64 no_mgmt_learn; /* Shared */
162 struct sja1105_l2_forwarding_entry {
169 struct sja1105_l2_forwarding_params_entry {
174 struct sja1105_l2_policing_entry {
182 struct sja1105_mac_config_entry {
204 struct sja1105_xmii_params_entry {
209 struct sja1105_table_header {
215 struct sja1105_table_ops {
216 size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op);
217 size_t unpacked_entry_size;
218 size_t packed_entry_size;
219 size_t max_entry_count;
222 struct sja1105_table {
223 const struct sja1105_table_ops *ops;
228 struct sja1105_static_config {
230 struct sja1105_table tables[BLK_IDX_MAX];
233 extern struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX];
234 extern struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX];
235 extern struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX];
236 extern struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX];
237 extern struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX];
238 extern struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX];
240 size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op);
242 sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr);
244 sja1105_static_config_get_length(const struct sja1105_static_config *config);
247 SJA1105_CONFIG_OK = 0,
248 SJA1105_MISSING_L2_POLICING_TABLE,
249 SJA1105_MISSING_L2_FORWARDING_TABLE,
250 SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE,
251 SJA1105_MISSING_GENERAL_PARAMS_TABLE,
252 SJA1105_MISSING_VLAN_TABLE,
253 SJA1105_MISSING_XMII_TABLE,
254 SJA1105_MISSING_MAC_TABLE,
255 SJA1105_OVERCOMMITTED_FRAME_MEMORY,
256 } sja1105_config_valid_t;
258 extern const char *sja1105_static_config_error_msg[];
260 sja1105_config_valid_t
261 sja1105_static_config_check_valid(const struct sja1105_static_config *config);
263 sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
264 int sja1105_static_config_init(struct sja1105_static_config *config,
265 const struct sja1105_table_ops *static_ops,
267 void sja1105_static_config_free(struct sja1105_static_config *config);
269 int sja1105_table_delete_entry(struct sja1105_table *table, int i);
270 int sja1105_table_resize(struct sja1105_table *table, size_t new_count);
272 u32 sja1105_crc32(const void *buf, size_t len);
274 void sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len);
275 void sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len);
276 void sja1105_packing(void *buf, u64 *val, int start, int end,
277 size_t len, enum packing_op op);