Merge tag 'wireless-drivers-next-for-davem-2019-06-26' of git://git.kernel.org/pub...
[linux-2.6-microblaze.git] / drivers / net / dsa / sja1105 / sja1105_static_config.h
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_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
29
30 /* UM10944.pdf Page 11, Table 2. Configuration Blocks */
31 enum {
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,
42 };
43
44 enum sja1105_blk_idx {
45         BLK_IDX_L2_LOOKUP = 0,
46         BLK_IDX_L2_POLICING,
47         BLK_IDX_VLAN_LOOKUP,
48         BLK_IDX_L2_FORWARDING,
49         BLK_IDX_MAC_CONFIG,
50         BLK_IDX_L2_LOOKUP_PARAMS,
51         BLK_IDX_L2_FORWARDING_PARAMS,
52         BLK_IDX_AVB_PARAMS,
53         BLK_IDX_GENERAL_PARAMS,
54         BLK_IDX_XMII_PARAMS,
55         BLK_IDX_MAX,
56         /* Fake block indices that are only valid for dynamic access */
57         BLK_IDX_MGMT_ROUTE,
58         BLK_IDX_MAX_DYN,
59         BLK_IDX_INVAL = -1,
60 };
61
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
72
73 #define SJA1105_MAX_FRAME_MEMORY                        929
74
75 #define SJA1105E_DEVICE_ID                              0x9C00000Cull
76 #define SJA1105T_DEVICE_ID                              0x9E00030Eull
77 #define SJA1105PR_DEVICE_ID                             0xAF00030Eull
78 #define SJA1105QS_DEVICE_ID                             0xAE00030Eull
79
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
85
86 struct sja1105_general_params_entry {
87         u64 vllupformat;
88         u64 mirr_ptacu;
89         u64 switchid;
90         u64 hostprio;
91         u64 mac_fltres1;
92         u64 mac_fltres0;
93         u64 mac_flt1;
94         u64 mac_flt0;
95         u64 incl_srcpt1;
96         u64 incl_srcpt0;
97         u64 send_meta1;
98         u64 send_meta0;
99         u64 casc_port;
100         u64 host_port;
101         u64 mirr_port;
102         u64 vlmarker;
103         u64 vlmask;
104         u64 tpid;
105         u64 ignore2stf;
106         u64 tpid2;
107         /* P/Q/R/S only */
108         u64 queue_ts;
109         u64 egrmirrvid;
110         u64 egrmirrpcp;
111         u64 egrmirrdei;
112         u64 replay_port;
113 };
114
115 struct sja1105_vlan_lookup_entry {
116         u64 ving_mirr;
117         u64 vegr_mirr;
118         u64 vmemb_port;
119         u64 vlan_bc;
120         u64 tag_port;
121         u64 vlanid;
122 };
123
124 struct sja1105_l2_lookup_entry {
125         u64 vlanid;
126         u64 macaddr;
127         u64 destports;
128         u64 enfport;
129         u64 index;
130         /* P/Q/R/S only */
131         u64 mask_iotag;
132         u64 mask_vlanid;
133         u64 mask_macaddr;
134         u64 iotag;
135         bool lockeds;
136         union {
137                 /* LOCKEDS=1: Static FDB entries */
138                 struct {
139                         u64 tsreg;
140                         u64 mirrvlan;
141                         u64 takets;
142                         u64 mirr;
143                         u64 retag;
144                 };
145                 /* LOCKEDS=0: Dynamically learned FDB entries */
146                 struct {
147                         u64 touched;
148                         u64 age;
149                 };
150         };
151 };
152
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 */
165 };
166
167 struct sja1105_l2_forwarding_entry {
168         u64 bc_domain;
169         u64 reach_port;
170         u64 fl_domain;
171         u64 vlan_pmap[8];
172 };
173
174 struct sja1105_l2_forwarding_params_entry {
175         u64 max_dynp;
176         u64 part_spc[8];
177 };
178
179 struct sja1105_l2_policing_entry {
180         u64 sharindx;
181         u64 smax;
182         u64 rate;
183         u64 maxlen;
184         u64 partition;
185 };
186
187 struct sja1105_avb_params_entry {
188         u64 destmeta;
189         u64 srcmeta;
190 };
191
192 struct sja1105_mac_config_entry {
193         u64 top[8];
194         u64 base[8];
195         u64 enabled[8];
196         u64 ifg;
197         u64 speed;
198         u64 tp_delin;
199         u64 tp_delout;
200         u64 maxage;
201         u64 vlanprio;
202         u64 vlanid;
203         u64 ing_mirr;
204         u64 egr_mirr;
205         u64 drpnona664;
206         u64 drpdtag;
207         u64 drpuntag;
208         u64 retag;
209         u64 dyn_learn;
210         u64 egress;
211         u64 ingress;
212 };
213
214 struct sja1105_xmii_params_entry {
215         u64 phy_mac[5];
216         u64 xmii_mode[5];
217 };
218
219 struct sja1105_table_header {
220         u64 block_id;
221         u64 len;
222         u64 crc;
223 };
224
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;
230 };
231
232 struct sja1105_table {
233         const struct sja1105_table_ops *ops;
234         size_t entry_count;
235         void *entries;
236 };
237
238 struct sja1105_static_config {
239         u64 device_id;
240         struct sja1105_table tables[BLK_IDX_MAX];
241 };
242
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];
249
250 size_t sja1105_table_header_packing(void *buf, void *hdr, enum packing_op op);
251 void
252 sja1105_table_header_pack_with_crc(void *buf, struct sja1105_table_header *hdr);
253 size_t
254 sja1105_static_config_get_length(const struct sja1105_static_config *config);
255
256 typedef enum {
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;
267
268 extern const char *sja1105_static_config_error_msg[];
269
270 sja1105_config_valid_t
271 sja1105_static_config_check_valid(const struct sja1105_static_config *config);
272 void
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,
276                                u64 device_id);
277 void sja1105_static_config_free(struct sja1105_static_config *config);
278
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);
281
282 u32 sja1105_crc32(const void *buf, size_t len);
283
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);
288
289 #endif