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 SJA1105ET_SIZE_AVB_PARAMS_ENTRY 12
24 #define SJA1105PQRS_SIZE_L2_LOOKUP_ENTRY 20
25 #define SJA1105PQRS_SIZE_MAC_CONFIG_ENTRY 32
26 #define SJA1105PQRS_SIZE_L2_LOOKUP_PARAMS_ENTRY 16
27 #define SJA1105PQRS_SIZE_GENERAL_PARAMS_ENTRY 44
28 #define SJA1105PQRS_SIZE_AVB_PARAMS_ENTRY 16
30 /* UM10944.pdf Page 11, Table 2. Configuration Blocks */
32 BLKID_L2_LOOKUP = 0x05,
33 BLKID_L2_POLICING = 0x06,
34 BLKID_VLAN_LOOKUP = 0x07,
35 BLKID_L2_FORWARDING = 0x08,
36 BLKID_MAC_CONFIG = 0x09,
37 BLKID_L2_LOOKUP_PARAMS = 0x0D,
38 BLKID_L2_FORWARDING_PARAMS = 0x0E,
39 BLKID_AVB_PARAMS = 0x10,
40 BLKID_GENERAL_PARAMS = 0x11,
41 BLKID_XMII_PARAMS = 0x4E,
44 enum sja1105_blk_idx {
45 BLK_IDX_L2_LOOKUP = 0,
48 BLK_IDX_L2_FORWARDING,
50 BLK_IDX_L2_LOOKUP_PARAMS,
51 BLK_IDX_L2_FORWARDING_PARAMS,
53 BLK_IDX_GENERAL_PARAMS,
56 /* Fake block indices that are only valid for dynamic access */
62 #define SJA1105_MAX_L2_LOOKUP_COUNT 1024
63 #define SJA1105_MAX_L2_POLICING_COUNT 45
64 #define SJA1105_MAX_VLAN_LOOKUP_COUNT 4096
65 #define SJA1105_MAX_L2_FORWARDING_COUNT 13
66 #define SJA1105_MAX_MAC_CONFIG_COUNT 5
67 #define SJA1105_MAX_L2_LOOKUP_PARAMS_COUNT 1
68 #define SJA1105_MAX_L2_FORWARDING_PARAMS_COUNT 1
69 #define SJA1105_MAX_GENERAL_PARAMS_COUNT 1
70 #define SJA1105_MAX_XMII_PARAMS_COUNT 1
71 #define SJA1105_MAX_AVB_PARAMS_COUNT 1
73 #define SJA1105_MAX_FRAME_MEMORY 929
75 #define SJA1105E_DEVICE_ID 0x9C00000Cull
76 #define SJA1105T_DEVICE_ID 0x9E00030Eull
77 #define SJA1105PR_DEVICE_ID 0xAF00030Eull
78 #define SJA1105QS_DEVICE_ID 0xAE00030Eull
80 #define SJA1105ET_PART_NO 0x9A83
81 #define SJA1105P_PART_NO 0x9A84
82 #define SJA1105Q_PART_NO 0x9A85
83 #define SJA1105R_PART_NO 0x9A86
84 #define SJA1105S_PART_NO 0x9A87
86 struct sja1105_general_params_entry {
115 struct sja1105_vlan_lookup_entry {
124 struct sja1105_l2_lookup_entry {
137 /* LOCKEDS=1: Static FDB entries */
145 /* LOCKEDS=0: Dynamically learned FDB entries */
153 struct sja1105_l2_lookup_params_entry {
154 u64 start_dynspc; /* P/Q/R/S only */
155 u64 drpnolearn; /* P/Q/R/S only */
156 u64 use_static; /* P/Q/R/S only */
157 u64 owr_dyn; /* P/Q/R/S only */
158 u64 learn_once; /* P/Q/R/S only */
159 u64 maxage; /* Shared */
160 u64 dyn_tbsz; /* E/T only */
161 u64 poly; /* E/T only */
162 u64 shared_learn; /* Shared */
163 u64 no_enf_hostprt; /* Shared */
164 u64 no_mgmt_learn; /* Shared */
167 struct sja1105_l2_forwarding_entry {
174 struct sja1105_l2_forwarding_params_entry {
179 struct sja1105_l2_policing_entry {
187 struct sja1105_avb_params_entry {
192 struct sja1105_mac_config_entry {
214 struct sja1105_xmii_params_entry {
219 struct sja1105_table_header {
225 struct sja1105_table_ops {
226 size_t (*packing)(void *buf, void *entry_ptr, enum packing_op op);
227 size_t unpacked_entry_size;
228 size_t packed_entry_size;
229 size_t max_entry_count;
232 struct sja1105_table {
233 const struct sja1105_table_ops *ops;
238 struct sja1105_static_config {
240 struct sja1105_table tables[BLK_IDX_MAX];
243 extern struct sja1105_table_ops sja1105e_table_ops[BLK_IDX_MAX];
244 extern struct sja1105_table_ops sja1105t_table_ops[BLK_IDX_MAX];
245 extern struct sja1105_table_ops sja1105p_table_ops[BLK_IDX_MAX];
246 extern struct sja1105_table_ops sja1105q_table_ops[BLK_IDX_MAX];
247 extern struct sja1105_table_ops sja1105r_table_ops[BLK_IDX_MAX];
248 extern struct sja1105_table_ops sja1105s_table_ops[BLK_IDX_MAX];
250 size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op);
252 sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr);
254 sja1105_static_config_get_length(const struct sja1105_static_config *config);
257 SJA1105_CONFIG_OK = 0,
258 SJA1105_MISSING_L2_POLICING_TABLE,
259 SJA1105_MISSING_L2_FORWARDING_TABLE,
260 SJA1105_MISSING_L2_FORWARDING_PARAMS_TABLE,
261 SJA1105_MISSING_GENERAL_PARAMS_TABLE,
262 SJA1105_MISSING_VLAN_TABLE,
263 SJA1105_MISSING_XMII_TABLE,
264 SJA1105_MISSING_MAC_TABLE,
265 SJA1105_OVERCOMMITTED_FRAME_MEMORY,
266 } sja1105_config_valid_t;
268 extern const char *sja1105_static_config_error_msg[];
270 sja1105_config_valid_t
271 sja1105_static_config_check_valid(const struct sja1105_static_config *config);
273 sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
274 int sja1105_static_config_init(struct sja1105_static_config *config,
275 const struct sja1105_table_ops *static_ops,
277 void sja1105_static_config_free(struct sja1105_static_config *config);
279 int sja1105_table_delete_entry(struct sja1105_table *table, int i);
280 int sja1105_table_resize(struct sja1105_table *table, size_t new_count);
282 u32 sja1105_crc32(const void *buf, size_t len);
284 void sja1105_pack(void *buf, const u64 *val, int start, int end, size_t len);
285 void sja1105_unpack(const void *buf, u64 *val, int start, int end, size_t len);
286 void sja1105_packing(void *buf, u64 *val, int start, int end,
287 size_t len, enum packing_op op);