• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright 2014-2016 Freescale Semiconductor Inc.
4  * Copyright 2017-2018 NXP
5  *
6  */
7 
8 #ifndef __FSL_DPSW_CMD_H
9 #define __FSL_DPSW_CMD_H
10 
11 /* DPSW Version */
12 #define DPSW_VER_MAJOR		8
13 #define DPSW_VER_MINOR		1
14 
15 #define DPSW_CMD_BASE_VERSION	1
16 #define DPSW_CMD_ID_OFFSET	4
17 
18 #define DPSW_CMD_ID(id)	(((id) << DPSW_CMD_ID_OFFSET) | DPSW_CMD_BASE_VERSION)
19 
20 /* Command IDs */
21 #define DPSW_CMDID_CLOSE                    DPSW_CMD_ID(0x800)
22 #define DPSW_CMDID_OPEN                     DPSW_CMD_ID(0x802)
23 
24 #define DPSW_CMDID_GET_API_VERSION          DPSW_CMD_ID(0xa02)
25 
26 #define DPSW_CMDID_ENABLE                   DPSW_CMD_ID(0x002)
27 #define DPSW_CMDID_DISABLE                  DPSW_CMD_ID(0x003)
28 #define DPSW_CMDID_GET_ATTR                 DPSW_CMD_ID(0x004)
29 #define DPSW_CMDID_RESET                    DPSW_CMD_ID(0x005)
30 
31 #define DPSW_CMDID_SET_IRQ_ENABLE           DPSW_CMD_ID(0x012)
32 
33 #define DPSW_CMDID_SET_IRQ_MASK             DPSW_CMD_ID(0x014)
34 
35 #define DPSW_CMDID_GET_IRQ_STATUS           DPSW_CMD_ID(0x016)
36 #define DPSW_CMDID_CLEAR_IRQ_STATUS         DPSW_CMD_ID(0x017)
37 
38 #define DPSW_CMDID_IF_SET_TCI               DPSW_CMD_ID(0x030)
39 #define DPSW_CMDID_IF_SET_STP               DPSW_CMD_ID(0x031)
40 
41 #define DPSW_CMDID_IF_GET_COUNTER           DPSW_CMD_ID(0x034)
42 
43 #define DPSW_CMDID_IF_ENABLE                DPSW_CMD_ID(0x03D)
44 #define DPSW_CMDID_IF_DISABLE               DPSW_CMD_ID(0x03E)
45 
46 #define DPSW_CMDID_IF_SET_MAX_FRAME_LENGTH  DPSW_CMD_ID(0x044)
47 
48 #define DPSW_CMDID_IF_GET_LINK_STATE        DPSW_CMD_ID(0x046)
49 #define DPSW_CMDID_IF_SET_FLOODING          DPSW_CMD_ID(0x047)
50 #define DPSW_CMDID_IF_SET_BROADCAST         DPSW_CMD_ID(0x048)
51 
52 #define DPSW_CMDID_IF_GET_TCI               DPSW_CMD_ID(0x04A)
53 
54 #define DPSW_CMDID_IF_SET_LINK_CFG          DPSW_CMD_ID(0x04C)
55 
56 #define DPSW_CMDID_VLAN_ADD                 DPSW_CMD_ID(0x060)
57 #define DPSW_CMDID_VLAN_ADD_IF              DPSW_CMD_ID(0x061)
58 #define DPSW_CMDID_VLAN_ADD_IF_UNTAGGED     DPSW_CMD_ID(0x062)
59 
60 #define DPSW_CMDID_VLAN_REMOVE_IF           DPSW_CMD_ID(0x064)
61 #define DPSW_CMDID_VLAN_REMOVE_IF_UNTAGGED  DPSW_CMD_ID(0x065)
62 #define DPSW_CMDID_VLAN_REMOVE_IF_FLOODING  DPSW_CMD_ID(0x066)
63 #define DPSW_CMDID_VLAN_REMOVE              DPSW_CMD_ID(0x067)
64 
65 #define DPSW_CMDID_FDB_ADD_UNICAST          DPSW_CMD_ID(0x084)
66 #define DPSW_CMDID_FDB_REMOVE_UNICAST       DPSW_CMD_ID(0x085)
67 #define DPSW_CMDID_FDB_ADD_MULTICAST        DPSW_CMD_ID(0x086)
68 #define DPSW_CMDID_FDB_REMOVE_MULTICAST     DPSW_CMD_ID(0x087)
69 #define DPSW_CMDID_FDB_SET_LEARNING_MODE    DPSW_CMD_ID(0x088)
70 #define DPSW_CMDID_FDB_DUMP                 DPSW_CMD_ID(0x08A)
71 
72 /* Macros for accessing command fields smaller than 1byte */
73 #define DPSW_MASK(field)        \
74 	GENMASK(DPSW_##field##_SHIFT + DPSW_##field##_SIZE - 1, \
75 		DPSW_##field##_SHIFT)
76 #define dpsw_set_field(var, field, val) \
77 	((var) |= (((val) << DPSW_##field##_SHIFT) & DPSW_MASK(field)))
78 #define dpsw_get_field(var, field)      \
79 	(((var) & DPSW_MASK(field)) >> DPSW_##field##_SHIFT)
80 #define dpsw_get_bit(var, bit) \
81 	(((var)  >> (bit)) & GENMASK(0, 0))
82 
83 struct dpsw_cmd_open {
84 	__le32 dpsw_id;
85 };
86 
87 #define DPSW_COMPONENT_TYPE_SHIFT	0
88 #define DPSW_COMPONENT_TYPE_SIZE	4
89 
90 struct dpsw_cmd_create {
91 	/* cmd word 0 */
92 	__le16 num_ifs;
93 	u8 max_fdbs;
94 	u8 max_meters_per_if;
95 	/* from LSB: only the first 4 bits */
96 	u8 component_type;
97 	u8 pad[3];
98 	/* cmd word 1 */
99 	__le16 max_vlans;
100 	__le16 max_fdb_entries;
101 	__le16 fdb_aging_time;
102 	__le16 max_fdb_mc_groups;
103 	/* cmd word 2 */
104 	__le64 options;
105 };
106 
107 struct dpsw_cmd_destroy {
108 	__le32 dpsw_id;
109 };
110 
111 #define DPSW_ENABLE_SHIFT 0
112 #define DPSW_ENABLE_SIZE  1
113 
114 struct dpsw_rsp_is_enabled {
115 	/* from LSB: enable:1 */
116 	u8 enabled;
117 };
118 
119 struct dpsw_cmd_set_irq_enable {
120 	u8 enable_state;
121 	u8 pad[3];
122 	u8 irq_index;
123 };
124 
125 struct dpsw_cmd_get_irq_enable {
126 	__le32 pad;
127 	u8 irq_index;
128 };
129 
130 struct dpsw_rsp_get_irq_enable {
131 	u8 enable_state;
132 };
133 
134 struct dpsw_cmd_set_irq_mask {
135 	__le32 mask;
136 	u8 irq_index;
137 };
138 
139 struct dpsw_cmd_get_irq_mask {
140 	__le32 pad;
141 	u8 irq_index;
142 };
143 
144 struct dpsw_rsp_get_irq_mask {
145 	__le32 mask;
146 };
147 
148 struct dpsw_cmd_get_irq_status {
149 	__le32 status;
150 	u8 irq_index;
151 };
152 
153 struct dpsw_rsp_get_irq_status {
154 	__le32 status;
155 };
156 
157 struct dpsw_cmd_clear_irq_status {
158 	__le32 status;
159 	u8 irq_index;
160 };
161 
162 #define DPSW_COMPONENT_TYPE_SHIFT	0
163 #define DPSW_COMPONENT_TYPE_SIZE	4
164 
165 struct dpsw_rsp_get_attr {
166 	/* cmd word 0 */
167 	__le16 num_ifs;
168 	u8 max_fdbs;
169 	u8 num_fdbs;
170 	__le16 max_vlans;
171 	__le16 num_vlans;
172 	/* cmd word 1 */
173 	__le16 max_fdb_entries;
174 	__le16 fdb_aging_time;
175 	__le32 dpsw_id;
176 	/* cmd word 2 */
177 	__le16 mem_size;
178 	__le16 max_fdb_mc_groups;
179 	u8 max_meters_per_if;
180 	/* from LSB only the first 4 bits */
181 	u8 component_type;
182 	__le16 pad;
183 	/* cmd word 3 */
184 	__le64 options;
185 };
186 
187 struct dpsw_cmd_if_set_flooding {
188 	__le16 if_id;
189 	/* from LSB: enable:1 */
190 	u8 enable;
191 };
192 
193 struct dpsw_cmd_if_set_broadcast {
194 	__le16 if_id;
195 	/* from LSB: enable:1 */
196 	u8 enable;
197 };
198 
199 #define DPSW_VLAN_ID_SHIFT	0
200 #define DPSW_VLAN_ID_SIZE	12
201 #define DPSW_DEI_SHIFT		12
202 #define DPSW_DEI_SIZE		1
203 #define DPSW_PCP_SHIFT		13
204 #define DPSW_PCP_SIZE		3
205 
206 struct dpsw_cmd_if_set_tci {
207 	__le16 if_id;
208 	/* from LSB: VLAN_ID:12 DEI:1 PCP:3 */
209 	__le16 conf;
210 };
211 
212 struct dpsw_cmd_if_get_tci {
213 	__le16 if_id;
214 };
215 
216 struct dpsw_rsp_if_get_tci {
217 	__le16 pad;
218 	__le16 vlan_id;
219 	u8 dei;
220 	u8 pcp;
221 };
222 
223 #define DPSW_STATE_SHIFT	0
224 #define DPSW_STATE_SIZE		4
225 
226 struct dpsw_cmd_if_set_stp {
227 	__le16 if_id;
228 	__le16 vlan_id;
229 	/* only the first LSB 4 bits */
230 	u8 state;
231 };
232 
233 #define DPSW_COUNTER_TYPE_SHIFT		0
234 #define DPSW_COUNTER_TYPE_SIZE		5
235 
236 struct dpsw_cmd_if_get_counter {
237 	__le16 if_id;
238 	/* from LSB: type:5 */
239 	u8 type;
240 };
241 
242 struct dpsw_rsp_if_get_counter {
243 	__le64 pad;
244 	__le64 counter;
245 };
246 
247 struct dpsw_cmd_if {
248 	__le16 if_id;
249 };
250 
251 struct dpsw_cmd_if_set_max_frame_length {
252 	__le16 if_id;
253 	__le16 frame_length;
254 };
255 
256 struct dpsw_cmd_if_set_link_cfg {
257 	/* cmd word 0 */
258 	__le16 if_id;
259 	u8 pad[6];
260 	/* cmd word 1 */
261 	__le32 rate;
262 	__le32 pad1;
263 	/* cmd word 2 */
264 	__le64 options;
265 };
266 
267 struct dpsw_cmd_if_get_link_state {
268 	__le16 if_id;
269 };
270 
271 #define DPSW_UP_SHIFT	0
272 #define DPSW_UP_SIZE	1
273 
274 struct dpsw_rsp_if_get_link_state {
275 	/* cmd word 0 */
276 	__le32 pad0;
277 	u8 up;
278 	u8 pad1[3];
279 	/* cmd word 1 */
280 	__le32 rate;
281 	__le32 pad2;
282 	/* cmd word 2 */
283 	__le64 options;
284 };
285 
286 struct dpsw_vlan_add {
287 	__le16 fdb_id;
288 	__le16 vlan_id;
289 };
290 
291 struct dpsw_cmd_vlan_manage_if {
292 	/* cmd word 0 */
293 	__le16 pad0;
294 	__le16 vlan_id;
295 	__le32 pad1;
296 	/* cmd word 1-4 */
297 	__le64 if_id[4];
298 };
299 
300 struct dpsw_cmd_vlan_remove {
301 	__le16 pad;
302 	__le16 vlan_id;
303 };
304 
305 struct dpsw_cmd_fdb_add {
306 	__le32 pad;
307 	__le16 fdb_aging_time;
308 	__le16 num_fdb_entries;
309 };
310 
311 struct dpsw_rsp_fdb_add {
312 	__le16 fdb_id;
313 };
314 
315 struct dpsw_cmd_fdb_remove {
316 	__le16 fdb_id;
317 };
318 
319 #define DPSW_ENTRY_TYPE_SHIFT	0
320 #define DPSW_ENTRY_TYPE_SIZE	4
321 
322 struct dpsw_cmd_fdb_unicast_op {
323 	/* cmd word 0 */
324 	__le16 fdb_id;
325 	u8 mac_addr[6];
326 	/* cmd word 1 */
327 	__le16 if_egress;
328 	/* only the first 4 bits from LSB */
329 	u8 type;
330 };
331 
332 struct dpsw_cmd_fdb_multicast_op {
333 	/* cmd word 0 */
334 	__le16 fdb_id;
335 	__le16 num_ifs;
336 	/* only the first 4 bits from LSB */
337 	u8 type;
338 	u8 pad[3];
339 	/* cmd word 1 */
340 	u8 mac_addr[6];
341 	__le16 pad2;
342 	/* cmd word 2-5 */
343 	__le64 if_id[4];
344 };
345 
346 #define DPSW_LEARNING_MODE_SHIFT	0
347 #define DPSW_LEARNING_MODE_SIZE		4
348 
349 struct dpsw_cmd_fdb_set_learning_mode {
350 	__le16 fdb_id;
351 	/* only the first 4 bits from LSB */
352 	u8 mode;
353 };
354 
355 struct dpsw_cmd_fdb_dump {
356 	__le16 fdb_id;
357 	__le16 pad0;
358 	__le32 pad1;
359 	__le64 iova_addr;
360 	__le32 iova_size;
361 };
362 
363 struct dpsw_rsp_fdb_dump {
364 	__le16 num_entries;
365 };
366 
367 struct dpsw_rsp_get_api_version {
368 	__le16 version_major;
369 	__le16 version_minor;
370 };
371 
372 #endif /* __FSL_DPSW_CMD_H */
373