xref: /openbmc/qemu/hw/net/rocker/rocker_hw.h (revision ca3d87d4c84032f19478010b5604cac88b045c25)
1dc488f88SScott Feldman /*
2dc488f88SScott Feldman  * Rocker switch hardware register and descriptor definitions.
3dc488f88SScott Feldman  *
4dc488f88SScott Feldman  * Copyright (c) 2014 Scott Feldman <sfeldma@gmail.com>
5dc488f88SScott Feldman  * Copyright (c) 2014 Jiri Pirko <jiri@resnulli.us>
6dc488f88SScott Feldman  *
7dc488f88SScott Feldman  */
8dc488f88SScott Feldman 
9*2a6a4076SMarkus Armbruster #ifndef ROCKER_HW_H
10*2a6a4076SMarkus Armbruster #define ROCKER_HW_H
11dc488f88SScott Feldman 
12dc488f88SScott Feldman #define __le16 uint16_t
13dc488f88SScott Feldman #define __le32 uint32_t
14dc488f88SScott Feldman #define __le64 uint64_t
15dc488f88SScott Feldman 
16dc488f88SScott Feldman /*
17dc488f88SScott Feldman  * Return codes
18dc488f88SScott Feldman  */
19dc488f88SScott Feldman 
20dc488f88SScott Feldman enum {
21dc488f88SScott Feldman     ROCKER_OK = 0,
22dc488f88SScott Feldman     ROCKER_ENOENT = 2,
23dc488f88SScott Feldman     ROCKER_ENXIO = 6,
24dc488f88SScott Feldman     ROCKER_ENOMEM = 12,
25dc488f88SScott Feldman     ROCKER_EEXIST = 17,
26dc488f88SScott Feldman     ROCKER_EINVAL = 22,
27dc488f88SScott Feldman     ROCKER_EMSGSIZE = 90,
28dc488f88SScott Feldman     ROCKER_ENOTSUP = 95,
29dc488f88SScott Feldman     ROCKER_ENOBUFS = 105,
30dc488f88SScott Feldman };
31dc488f88SScott Feldman 
32dc488f88SScott Feldman /*
33dc488f88SScott Feldman  * PCI configuration space
34dc488f88SScott Feldman  */
35dc488f88SScott Feldman 
36dc488f88SScott Feldman #define ROCKER_PCI_REVISION             0x1
37dc488f88SScott Feldman #define ROCKER_PCI_BAR0_IDX             0
38dc488f88SScott Feldman #define ROCKER_PCI_BAR0_SIZE            0x2000
39dc488f88SScott Feldman #define ROCKER_PCI_MSIX_BAR_IDX         1
40dc488f88SScott Feldman #define ROCKER_PCI_MSIX_BAR_SIZE        0x2000
41dc488f88SScott Feldman #define ROCKER_PCI_MSIX_TABLE_OFFSET    0x0000
42dc488f88SScott Feldman #define ROCKER_PCI_MSIX_PBA_OFFSET      0x1000
43dc488f88SScott Feldman 
44dc488f88SScott Feldman /*
45dc488f88SScott Feldman  * MSI-X vectors
46dc488f88SScott Feldman  */
47dc488f88SScott Feldman 
48dc488f88SScott Feldman enum {
49dc488f88SScott Feldman     ROCKER_MSIX_VEC_CMD,
50dc488f88SScott Feldman     ROCKER_MSIX_VEC_EVENT,
51dc488f88SScott Feldman     ROCKER_MSIX_VEC_TEST,
52dc488f88SScott Feldman     ROCKER_MSIX_VEC_RESERVED0,
53dc488f88SScott Feldman     __ROCKER_MSIX_VEC_TX,
54dc488f88SScott Feldman     __ROCKER_MSIX_VEC_RX,
55dc488f88SScott Feldman #define ROCKER_MSIX_VEC_TX(port) \
56dc488f88SScott Feldman                 (__ROCKER_MSIX_VEC_TX + ((port) * 2))
57dc488f88SScott Feldman #define ROCKER_MSIX_VEC_RX(port) \
58dc488f88SScott Feldman                 (__ROCKER_MSIX_VEC_RX + ((port) * 2))
59dc488f88SScott Feldman #define ROCKER_MSIX_VEC_COUNT(portcnt) \
60dc488f88SScott Feldman                 (ROCKER_MSIX_VEC_RX((portcnt) - 1) + 1)
61dc488f88SScott Feldman };
62dc488f88SScott Feldman 
63dc488f88SScott Feldman /*
64dc488f88SScott Feldman  * Rocker bogus registers
65dc488f88SScott Feldman  */
66dc488f88SScott Feldman #define ROCKER_BOGUS_REG0               0x0000
67dc488f88SScott Feldman #define ROCKER_BOGUS_REG1               0x0004
68dc488f88SScott Feldman #define ROCKER_BOGUS_REG2               0x0008
69dc488f88SScott Feldman #define ROCKER_BOGUS_REG3               0x000c
70dc488f88SScott Feldman 
71dc488f88SScott Feldman /*
72dc488f88SScott Feldman  * Rocker test registers
73dc488f88SScott Feldman  */
74dc488f88SScott Feldman #define ROCKER_TEST_REG                 0x0010
75dc488f88SScott Feldman #define ROCKER_TEST_REG64               0x0018  /* 8-byte */
76dc488f88SScott Feldman #define ROCKER_TEST_IRQ                 0x0020
77dc488f88SScott Feldman #define ROCKER_TEST_DMA_ADDR            0x0028  /* 8-byte */
78dc488f88SScott Feldman #define ROCKER_TEST_DMA_SIZE            0x0030
79dc488f88SScott Feldman #define ROCKER_TEST_DMA_CTRL            0x0034
80dc488f88SScott Feldman 
81dc488f88SScott Feldman /*
82dc488f88SScott Feldman  * Rocker test register ctrl
83dc488f88SScott Feldman  */
84dc488f88SScott Feldman #define ROCKER_TEST_DMA_CTRL_CLEAR      (1 << 0)
85dc488f88SScott Feldman #define ROCKER_TEST_DMA_CTRL_FILL       (1 << 1)
86dc488f88SScott Feldman #define ROCKER_TEST_DMA_CTRL_INVERT     (1 << 2)
87dc488f88SScott Feldman 
88dc488f88SScott Feldman /*
89dc488f88SScott Feldman  * Rocker DMA ring register offsets
90dc488f88SScott Feldman  */
91dc488f88SScott Feldman #define ROCKER_DMA_DESC_BASE            0x1000
92dc488f88SScott Feldman #define ROCKER_DMA_DESC_SIZE            32
93dc488f88SScott Feldman #define ROCKER_DMA_DESC_MASK            0x1F
94dc488f88SScott Feldman #define ROCKER_DMA_DESC_TOTAL_SIZE \
95dc488f88SScott Feldman     (ROCKER_DMA_DESC_SIZE * 64) /* 62 ports + event + cmd */
96dc488f88SScott Feldman #define ROCKER_DMA_DESC_ADDR_OFFSET     0x00     /* 8-byte */
97dc488f88SScott Feldman #define ROCKER_DMA_DESC_SIZE_OFFSET     0x08
98dc488f88SScott Feldman #define ROCKER_DMA_DESC_HEAD_OFFSET     0x0c
99dc488f88SScott Feldman #define ROCKER_DMA_DESC_TAIL_OFFSET     0x10
100dc488f88SScott Feldman #define ROCKER_DMA_DESC_CTRL_OFFSET     0x14
101dc488f88SScott Feldman #define ROCKER_DMA_DESC_CREDITS_OFFSET  0x18
102dc488f88SScott Feldman #define ROCKER_DMA_DESC_RSVD_OFFSET     0x1c
103dc488f88SScott Feldman 
104dc488f88SScott Feldman /*
105dc488f88SScott Feldman  * Rocker dma ctrl register bits
106dc488f88SScott Feldman  */
107dc488f88SScott Feldman #define ROCKER_DMA_DESC_CTRL_RESET      (1 << 0)
108dc488f88SScott Feldman 
109dc488f88SScott Feldman /*
110dc488f88SScott Feldman  * Rocker ring indices
111dc488f88SScott Feldman  */
112dc488f88SScott Feldman #define ROCKER_RING_CMD                 0
113dc488f88SScott Feldman #define ROCKER_RING_EVENT               1
114dc488f88SScott Feldman 
115dc488f88SScott Feldman /*
116dc488f88SScott Feldman  * Helper macro to do convert a dma ring register
117dc488f88SScott Feldman  * to its index.  Based on the fact that the register
118dc488f88SScott Feldman  * group stride is 32 bytes.
119dc488f88SScott Feldman  */
120dc488f88SScott Feldman #define ROCKER_RING_INDEX(reg) ((reg >> 5) & 0x7F)
121dc488f88SScott Feldman 
122dc488f88SScott Feldman /*
123dc488f88SScott Feldman  * Rocker DMA Descriptor
124dc488f88SScott Feldman  */
125dc488f88SScott Feldman 
126dc488f88SScott Feldman typedef struct rocker_desc {
127dc488f88SScott Feldman     __le64 buf_addr;
128dc488f88SScott Feldman     uint64_t cookie;
129dc488f88SScott Feldman     __le16 buf_size;
130dc488f88SScott Feldman     __le16 tlv_size;
131dc488f88SScott Feldman     __le16 rsvd[5];   /* pad to 32 bytes */
132dc488f88SScott Feldman     __le16 comp_err;
133dc488f88SScott Feldman } __attribute__((packed, aligned(8))) RockerDesc;
134dc488f88SScott Feldman 
135dc488f88SScott Feldman /*
136dc488f88SScott Feldman  * Rocker TLV type fields
137dc488f88SScott Feldman  */
138dc488f88SScott Feldman 
139dc488f88SScott Feldman typedef struct rocker_tlv {
140dc488f88SScott Feldman     __le32 type;
141dc488f88SScott Feldman     __le16 len;
142dc488f88SScott Feldman     __le16 rsvd;
143dc488f88SScott Feldman } __attribute__((packed, aligned(8))) RockerTlv;
144dc488f88SScott Feldman 
145dc488f88SScott Feldman /* cmd msg */
146dc488f88SScott Feldman enum {
147dc488f88SScott Feldman     ROCKER_TLV_CMD_UNSPEC,
148dc488f88SScott Feldman     ROCKER_TLV_CMD_TYPE,                /* u16 */
149dc488f88SScott Feldman     ROCKER_TLV_CMD_INFO,                /* nest */
150dc488f88SScott Feldman 
151dc488f88SScott Feldman     __ROCKER_TLV_CMD_MAX,
152dc488f88SScott Feldman     ROCKER_TLV_CMD_MAX = __ROCKER_TLV_CMD_MAX - 1,
153dc488f88SScott Feldman };
154dc488f88SScott Feldman 
155dc488f88SScott Feldman enum {
156dc488f88SScott Feldman     ROCKER_TLV_CMD_TYPE_UNSPEC,
157dc488f88SScott Feldman     ROCKER_TLV_CMD_TYPE_GET_PORT_SETTINGS,
158dc488f88SScott Feldman     ROCKER_TLV_CMD_TYPE_SET_PORT_SETTINGS,
159dc488f88SScott Feldman     ROCKER_TLV_CMD_TYPE_OF_DPA_FLOW_ADD,
160dc488f88SScott Feldman     ROCKER_TLV_CMD_TYPE_OF_DPA_FLOW_MOD,
161dc488f88SScott Feldman     ROCKER_TLV_CMD_TYPE_OF_DPA_FLOW_DEL,
162dc488f88SScott Feldman     ROCKER_TLV_CMD_TYPE_OF_DPA_FLOW_GET_STATS,
163dc488f88SScott Feldman     ROCKER_TLV_CMD_TYPE_OF_DPA_GROUP_ADD,
164dc488f88SScott Feldman     ROCKER_TLV_CMD_TYPE_OF_DPA_GROUP_MOD,
165dc488f88SScott Feldman     ROCKER_TLV_CMD_TYPE_OF_DPA_GROUP_DEL,
166dc488f88SScott Feldman     ROCKER_TLV_CMD_TYPE_OF_DPA_GROUP_GET_STATS,
167dc488f88SScott Feldman 
168dc488f88SScott Feldman     __ROCKER_TLV_CMD_TYPE_MAX,
169dc488f88SScott Feldman     ROCKER_TLV_CMD_TYPE_MAX = __ROCKER_TLV_CMD_TYPE_MAX - 1,
170dc488f88SScott Feldman };
171dc488f88SScott Feldman 
172dc488f88SScott Feldman /* cmd info nested for set/get port settings */
173dc488f88SScott Feldman enum {
174dc488f88SScott Feldman     ROCKER_TLV_CMD_PORT_SETTINGS_UNSPEC,
175dc488f88SScott Feldman     ROCKER_TLV_CMD_PORT_SETTINGS_PPORT,         /* u32 */
176dc488f88SScott Feldman     ROCKER_TLV_CMD_PORT_SETTINGS_SPEED,         /* u32 */
177dc488f88SScott Feldman     ROCKER_TLV_CMD_PORT_SETTINGS_DUPLEX,        /* u8 */
178dc488f88SScott Feldman     ROCKER_TLV_CMD_PORT_SETTINGS_AUTONEG,       /* u8 */
179dc488f88SScott Feldman     ROCKER_TLV_CMD_PORT_SETTINGS_MACADDR,       /* binary */
180dc488f88SScott Feldman     ROCKER_TLV_CMD_PORT_SETTINGS_MODE,          /* u8 */
181dc488f88SScott Feldman     ROCKER_TLV_CMD_PORT_SETTINGS_LEARNING,      /* u8 */
18277349536SDavid Ahern     ROCKER_TLV_CMD_PORT_SETTINGS_PHYS_NAME,     /* binary */
183dc488f88SScott Feldman 
184dc488f88SScott Feldman     __ROCKER_TLV_CMD_PORT_SETTINGS_MAX,
185dc488f88SScott Feldman     ROCKER_TLV_CMD_PORT_SETTINGS_MAX = __ROCKER_TLV_CMD_PORT_SETTINGS_MAX - 1,
186dc488f88SScott Feldman };
187dc488f88SScott Feldman 
188dc488f88SScott Feldman enum {
189dc488f88SScott Feldman     ROCKER_PORT_MODE_OF_DPA,
190dc488f88SScott Feldman };
191dc488f88SScott Feldman 
192dc488f88SScott Feldman /* event msg */
193dc488f88SScott Feldman enum {
194dc488f88SScott Feldman     ROCKER_TLV_EVENT_UNSPEC,
195dc488f88SScott Feldman     ROCKER_TLV_EVENT_TYPE,              /* u16 */
196dc488f88SScott Feldman     ROCKER_TLV_EVENT_INFO,              /* nest */
197dc488f88SScott Feldman 
198dc488f88SScott Feldman     __ROCKER_TLV_EVENT_MAX,
199dc488f88SScott Feldman     ROCKER_TLV_EVENT_MAX = __ROCKER_TLV_EVENT_MAX - 1,
200dc488f88SScott Feldman };
201dc488f88SScott Feldman 
202dc488f88SScott Feldman enum {
203dc488f88SScott Feldman     ROCKER_TLV_EVENT_TYPE_UNSPEC,
204dc488f88SScott Feldman     ROCKER_TLV_EVENT_TYPE_LINK_CHANGED,
205dc488f88SScott Feldman     ROCKER_TLV_EVENT_TYPE_MAC_VLAN_SEEN,
206dc488f88SScott Feldman 
207dc488f88SScott Feldman     __ROCKER_TLV_EVENT_TYPE_MAX,
208dc488f88SScott Feldman     ROCKER_TLV_EVENT_TYPE_MAX = __ROCKER_TLV_EVENT_TYPE_MAX - 1,
209dc488f88SScott Feldman };
210dc488f88SScott Feldman 
211dc488f88SScott Feldman /* event info nested for link changed */
212dc488f88SScott Feldman enum {
213dc488f88SScott Feldman     ROCKER_TLV_EVENT_LINK_CHANGED_UNSPEC,
214dc488f88SScott Feldman     ROCKER_TLV_EVENT_LINK_CHANGED_PPORT,    /* u32 */
215dc488f88SScott Feldman     ROCKER_TLV_EVENT_LINK_CHANGED_LINKUP,   /* u8 */
216dc488f88SScott Feldman 
217dc488f88SScott Feldman     __ROCKER_TLV_EVENT_LINK_CHANGED_MAX,
218dc488f88SScott Feldman     ROCKER_TLV_EVENT_LINK_CHANGED_MAX = __ROCKER_TLV_EVENT_LINK_CHANGED_MAX - 1,
219dc488f88SScott Feldman };
220dc488f88SScott Feldman 
221dc488f88SScott Feldman /* event info nested for MAC/VLAN */
222dc488f88SScott Feldman enum {
223dc488f88SScott Feldman     ROCKER_TLV_EVENT_MAC_VLAN_UNSPEC,
224dc488f88SScott Feldman     ROCKER_TLV_EVENT_MAC_VLAN_PPORT,        /* u32 */
225dc488f88SScott Feldman     ROCKER_TLV_EVENT_MAC_VLAN_MAC,          /* binary */
226dc488f88SScott Feldman     ROCKER_TLV_EVENT_MAC_VLAN_VLAN_ID,      /* __be16 */
227dc488f88SScott Feldman 
228dc488f88SScott Feldman     __ROCKER_TLV_EVENT_MAC_VLAN_MAX,
229dc488f88SScott Feldman     ROCKER_TLV_EVENT_MAC_VLAN_MAX = __ROCKER_TLV_EVENT_MAC_VLAN_MAX - 1,
230dc488f88SScott Feldman };
231dc488f88SScott Feldman 
232dc488f88SScott Feldman /* Rx msg */
233dc488f88SScott Feldman enum {
234dc488f88SScott Feldman     ROCKER_TLV_RX_UNSPEC,
235dc488f88SScott Feldman     ROCKER_TLV_RX_FLAGS,                /* u16, see RX_FLAGS_ */
236dc488f88SScott Feldman     ROCKER_TLV_RX_CSUM,                 /* u16 */
237dc488f88SScott Feldman     ROCKER_TLV_RX_FRAG_ADDR,            /* u64 */
238dc488f88SScott Feldman     ROCKER_TLV_RX_FRAG_MAX_LEN,         /* u16 */
239dc488f88SScott Feldman     ROCKER_TLV_RX_FRAG_LEN,             /* u16 */
240dc488f88SScott Feldman 
241dc488f88SScott Feldman     __ROCKER_TLV_RX_MAX,
242dc488f88SScott Feldman     ROCKER_TLV_RX_MAX = __ROCKER_TLV_RX_MAX - 1,
243dc488f88SScott Feldman };
244dc488f88SScott Feldman 
245dc488f88SScott Feldman #define ROCKER_RX_FLAGS_IPV4                    (1 << 0)
246dc488f88SScott Feldman #define ROCKER_RX_FLAGS_IPV6                    (1 << 1)
247dc488f88SScott Feldman #define ROCKER_RX_FLAGS_CSUM_CALC               (1 << 2)
248dc488f88SScott Feldman #define ROCKER_RX_FLAGS_IPV4_CSUM_GOOD          (1 << 3)
249dc488f88SScott Feldman #define ROCKER_RX_FLAGS_IP_FRAG                 (1 << 4)
250dc488f88SScott Feldman #define ROCKER_RX_FLAGS_TCP                     (1 << 5)
251dc488f88SScott Feldman #define ROCKER_RX_FLAGS_UDP                     (1 << 6)
252dc488f88SScott Feldman #define ROCKER_RX_FLAGS_TCP_UDP_CSUM_GOOD       (1 << 7)
253d0d25558SScott Feldman #define ROCKER_RX_FLAGS_FWD_OFFLOAD             (1 << 8)
254dc488f88SScott Feldman 
255dc488f88SScott Feldman /* Tx msg */
256dc488f88SScott Feldman enum {
257dc488f88SScott Feldman     ROCKER_TLV_TX_UNSPEC,
258dc488f88SScott Feldman     ROCKER_TLV_TX_OFFLOAD,              /* u8, see TX_OFFLOAD_ */
259dc488f88SScott Feldman     ROCKER_TLV_TX_L3_CSUM_OFF,          /* u16 */
260dc488f88SScott Feldman     ROCKER_TLV_TX_TSO_MSS,              /* u16 */
261dc488f88SScott Feldman     ROCKER_TLV_TX_TSO_HDR_LEN,          /* u16 */
262dc488f88SScott Feldman     ROCKER_TLV_TX_FRAGS,                /* array */
263dc488f88SScott Feldman 
264dc488f88SScott Feldman     __ROCKER_TLV_TX_MAX,
265dc488f88SScott Feldman     ROCKER_TLV_TX_MAX = __ROCKER_TLV_TX_MAX - 1,
266dc488f88SScott Feldman };
267dc488f88SScott Feldman 
268dc488f88SScott Feldman #define ROCKER_TX_OFFLOAD_NONE          0
269dc488f88SScott Feldman #define ROCKER_TX_OFFLOAD_IP_CSUM       1
270dc488f88SScott Feldman #define ROCKER_TX_OFFLOAD_TCP_UDP_CSUM  2
271dc488f88SScott Feldman #define ROCKER_TX_OFFLOAD_L3_CSUM       3
272dc488f88SScott Feldman #define ROCKER_TX_OFFLOAD_TSO           4
273dc488f88SScott Feldman 
274dc488f88SScott Feldman #define ROCKER_TX_FRAGS_MAX             16
275dc488f88SScott Feldman 
276dc488f88SScott Feldman enum {
277dc488f88SScott Feldman     ROCKER_TLV_TX_FRAG_UNSPEC,
278dc488f88SScott Feldman     ROCKER_TLV_TX_FRAG,                 /* nest */
279dc488f88SScott Feldman 
280dc488f88SScott Feldman     __ROCKER_TLV_TX_FRAG_MAX,
281dc488f88SScott Feldman     ROCKER_TLV_TX_FRAG_MAX = __ROCKER_TLV_TX_FRAG_MAX - 1,
282dc488f88SScott Feldman };
283dc488f88SScott Feldman 
284dc488f88SScott Feldman enum {
285dc488f88SScott Feldman     ROCKER_TLV_TX_FRAG_ATTR_UNSPEC,
286dc488f88SScott Feldman     ROCKER_TLV_TX_FRAG_ATTR_ADDR,       /* u64 */
287dc488f88SScott Feldman     ROCKER_TLV_TX_FRAG_ATTR_LEN,        /* u16 */
288dc488f88SScott Feldman 
289dc488f88SScott Feldman     __ROCKER_TLV_TX_FRAG_ATTR_MAX,
290dc488f88SScott Feldman     ROCKER_TLV_TX_FRAG_ATTR_MAX = __ROCKER_TLV_TX_FRAG_ATTR_MAX - 1,
291dc488f88SScott Feldman };
292dc488f88SScott Feldman 
293dc488f88SScott Feldman /*
294dc488f88SScott Feldman  * cmd info nested for OF-DPA msgs
295dc488f88SScott Feldman  */
296dc488f88SScott Feldman 
297dc488f88SScott Feldman enum {
298dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_UNSPEC,
299dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_TABLE_ID,            /* u16 */
300dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_PRIORITY,            /* u32 */
301dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_HARDTIME,            /* u32 */
302dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_IDLETIME,            /* u32 */
303dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_COOKIE,              /* u64 */
304dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_IN_PPORT,            /* u32 */
305dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_IN_PPORT_MASK,       /* u32 */
306dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_OUT_PPORT,           /* u32 */
307dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_GOTO_TABLE_ID,       /* u16 */
308dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_GROUP_ID,            /* u32 */
309dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_GROUP_ID_LOWER,      /* u32 */
310dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_GROUP_COUNT,         /* u16 */
311dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_GROUP_IDS,           /* u32 array */
312dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_VLAN_ID,             /* __be16 */
313dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_VLAN_ID_MASK,        /* __be16 */
314dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_VLAN_PCP,            /* __be16 */
315dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_VLAN_PCP_MASK,       /* __be16 */
316dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_VLAN_PCP_ACTION,     /* u8 */
317dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_NEW_VLAN_ID,         /* __be16 */
318dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_NEW_VLAN_PCP,        /* u8 */
319dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_TUNNEL_ID,           /* u32 */
320dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_TUNNEL_LPORT,        /* u32 */
321dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_ETHERTYPE,           /* __be16 */
322dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_DST_MAC,             /* binary */
323dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_DST_MAC_MASK,        /* binary */
324dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_SRC_MAC,             /* binary */
325dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_SRC_MAC_MASK,        /* binary */
326dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_IP_PROTO,            /* u8 */
327dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_IP_PROTO_MASK,       /* u8 */
328dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_IP_DSCP,             /* u8 */
329dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_IP_DSCP_MASK,        /* u8 */
330dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_IP_DSCP_ACTION,      /* u8 */
331dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_NEW_IP_DSCP,         /* u8 */
332dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_IP_ECN,              /* u8 */
333dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_IP_ECN_MASK,         /* u8 */
334dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_DST_IP,              /* __be32 */
335dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_DST_IP_MASK,         /* __be32 */
336dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_SRC_IP,              /* __be32 */
337dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_SRC_IP_MASK,         /* __be32 */
338dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_DST_IPV6,            /* binary */
339dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_DST_IPV6_MASK,       /* binary */
340dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_SRC_IPV6,            /* binary */
341dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_SRC_IPV6_MASK,       /* binary */
342dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_SRC_ARP_IP,          /* __be32 */
343dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_SRC_ARP_IP_MASK,     /* __be32 */
344dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_L4_DST_PORT,         /* __be16 */
345dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_L4_DST_PORT_MASK,    /* __be16 */
346dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_L4_SRC_PORT,         /* __be16 */
347dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_L4_SRC_PORT_MASK,    /* __be16 */
348dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_ICMP_TYPE,           /* u8 */
349dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_ICMP_TYPE_MASK,      /* u8 */
350dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_ICMP_CODE,           /* u8 */
351dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_ICMP_CODE_MASK,      /* u8 */
352dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_IPV6_LABEL,          /* __be32 */
353dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_IPV6_LABEL_MASK,     /* __be32 */
354dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_QUEUE_ID_ACTION,     /* u8 */
355dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_NEW_QUEUE_ID,        /* u8 */
356dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_CLEAR_ACTIONS,       /* u32 */
357dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_POP_VLAN,            /* u8 */
358dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_TTL_CHECK,           /* u8 */
359dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_COPY_CPU_ACTION,     /* u8 */
360dc488f88SScott Feldman 
361dc488f88SScott Feldman     __ROCKER_TLV_OF_DPA_MAX,
362dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_MAX = __ROCKER_TLV_OF_DPA_MAX - 1,
363dc488f88SScott Feldman };
364dc488f88SScott Feldman 
365dc488f88SScott Feldman /*
366dc488f88SScott Feldman  * OF-DPA table IDs
367dc488f88SScott Feldman  */
368dc488f88SScott Feldman 
369dc488f88SScott Feldman enum rocker_of_dpa_table_id {
370dc488f88SScott Feldman     ROCKER_OF_DPA_TABLE_ID_INGRESS_PORT = 0,
371dc488f88SScott Feldman     ROCKER_OF_DPA_TABLE_ID_VLAN = 10,
372dc488f88SScott Feldman     ROCKER_OF_DPA_TABLE_ID_TERMINATION_MAC = 20,
373dc488f88SScott Feldman     ROCKER_OF_DPA_TABLE_ID_UNICAST_ROUTING = 30,
374dc488f88SScott Feldman     ROCKER_OF_DPA_TABLE_ID_MULTICAST_ROUTING = 40,
375dc488f88SScott Feldman     ROCKER_OF_DPA_TABLE_ID_BRIDGING = 50,
376dc488f88SScott Feldman     ROCKER_OF_DPA_TABLE_ID_ACL_POLICY = 60,
377dc488f88SScott Feldman };
378dc488f88SScott Feldman 
379dc488f88SScott Feldman /*
380dc488f88SScott Feldman  * OF-DPA flow stats
381dc488f88SScott Feldman  */
382dc488f88SScott Feldman 
383dc488f88SScott Feldman enum {
384dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_FLOW_STAT_UNSPEC,
385dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_FLOW_STAT_DURATION,    /* u32 */
386dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_FLOW_STAT_RX_PKTS,     /* u64 */
387dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_FLOW_STAT_TX_PKTS,     /* u64 */
388dc488f88SScott Feldman 
389dc488f88SScott Feldman     __ROCKER_TLV_OF_DPA_FLOW_STAT_MAX,
390dc488f88SScott Feldman     ROCKER_TLV_OF_DPA_FLOW_STAT_MAX = __ROCKER_TLV_OF_DPA_FLOW_STAT_MAX - 1,
391dc488f88SScott Feldman };
392dc488f88SScott Feldman 
393dc488f88SScott Feldman /*
394dc488f88SScott Feldman  * OF-DPA group types
395dc488f88SScott Feldman  */
396dc488f88SScott Feldman 
397dc488f88SScott Feldman enum rocker_of_dpa_group_type {
398dc488f88SScott Feldman     ROCKER_OF_DPA_GROUP_TYPE_L2_INTERFACE = 0,
399dc488f88SScott Feldman     ROCKER_OF_DPA_GROUP_TYPE_L2_REWRITE,
400dc488f88SScott Feldman     ROCKER_OF_DPA_GROUP_TYPE_L3_UCAST,
401dc488f88SScott Feldman     ROCKER_OF_DPA_GROUP_TYPE_L2_MCAST,
402dc488f88SScott Feldman     ROCKER_OF_DPA_GROUP_TYPE_L2_FLOOD,
403dc488f88SScott Feldman     ROCKER_OF_DPA_GROUP_TYPE_L3_INTERFACE,
404dc488f88SScott Feldman     ROCKER_OF_DPA_GROUP_TYPE_L3_MCAST,
405dc488f88SScott Feldman     ROCKER_OF_DPA_GROUP_TYPE_L3_ECMP,
406dc488f88SScott Feldman     ROCKER_OF_DPA_GROUP_TYPE_L2_OVERLAY,
407dc488f88SScott Feldman };
408dc488f88SScott Feldman 
409dc488f88SScott Feldman /*
410dc488f88SScott Feldman  * OF-DPA group L2 overlay types
411dc488f88SScott Feldman  */
412dc488f88SScott Feldman 
413dc488f88SScott Feldman enum rocker_of_dpa_overlay_type {
414dc488f88SScott Feldman     ROCKER_OF_DPA_OVERLAY_TYPE_FLOOD_UCAST = 0,
415dc488f88SScott Feldman     ROCKER_OF_DPA_OVERLAY_TYPE_FLOOD_MCAST,
416dc488f88SScott Feldman     ROCKER_OF_DPA_OVERLAY_TYPE_MCAST_UCAST,
417dc488f88SScott Feldman     ROCKER_OF_DPA_OVERLAY_TYPE_MCAST_MCAST,
418dc488f88SScott Feldman };
419dc488f88SScott Feldman 
420dc488f88SScott Feldman /*
421dc488f88SScott Feldman  * OF-DPA group ID encoding
422dc488f88SScott Feldman  */
423dc488f88SScott Feldman 
424dc488f88SScott Feldman #define ROCKER_GROUP_TYPE_SHIFT 28
425dc488f88SScott Feldman #define ROCKER_GROUP_TYPE_MASK 0xf0000000
426dc488f88SScott Feldman #define ROCKER_GROUP_VLAN_ID_SHIFT 16
427dc488f88SScott Feldman #define ROCKER_GROUP_VLAN_ID_MASK 0x0fff0000
428dc488f88SScott Feldman #define ROCKER_GROUP_PORT_SHIFT 0
429dc488f88SScott Feldman #define ROCKER_GROUP_PORT_MASK 0x0000ffff
430dc488f88SScott Feldman #define ROCKER_GROUP_TUNNEL_ID_SHIFT 12
431dc488f88SScott Feldman #define ROCKER_GROUP_TUNNEL_ID_MASK 0x0ffff000
432dc488f88SScott Feldman #define ROCKER_GROUP_SUBTYPE_SHIFT 10
433dc488f88SScott Feldman #define ROCKER_GROUP_SUBTYPE_MASK 0x00000c00
434dc488f88SScott Feldman #define ROCKER_GROUP_INDEX_SHIFT 0
435dc488f88SScott Feldman #define ROCKER_GROUP_INDEX_MASK 0x0000ffff
436dc488f88SScott Feldman #define ROCKER_GROUP_INDEX_LONG_SHIFT 0
437dc488f88SScott Feldman #define ROCKER_GROUP_INDEX_LONG_MASK 0x0fffffff
438dc488f88SScott Feldman 
439dc488f88SScott Feldman #define ROCKER_GROUP_TYPE_GET(group_id) \
440dc488f88SScott Feldman     (((group_id) & ROCKER_GROUP_TYPE_MASK) >> ROCKER_GROUP_TYPE_SHIFT)
441dc488f88SScott Feldman #define ROCKER_GROUP_TYPE_SET(type) \
442dc488f88SScott Feldman     (((type) << ROCKER_GROUP_TYPE_SHIFT) & ROCKER_GROUP_TYPE_MASK)
443dc488f88SScott Feldman #define ROCKER_GROUP_VLAN_GET(group_id) \
444dc488f88SScott Feldman     (((group_id) & ROCKER_GROUP_VLAN_ID_MASK) >> ROCKER_GROUP_VLAN_ID_SHIFT)
445dc488f88SScott Feldman #define ROCKER_GROUP_VLAN_SET(vlan_id) \
446dc488f88SScott Feldman     (((vlan_id) << ROCKER_GROUP_VLAN_ID_SHIFT) & ROCKER_GROUP_VLAN_ID_MASK)
447dc488f88SScott Feldman #define ROCKER_GROUP_PORT_GET(group_id) \
448dc488f88SScott Feldman     (((group_id) & ROCKER_GROUP_PORT_MASK) >> ROCKER_GROUP_PORT_SHIFT)
449dc488f88SScott Feldman #define ROCKER_GROUP_PORT_SET(port) \
450dc488f88SScott Feldman     (((port) << ROCKER_GROUP_PORT_SHIFT) & ROCKER_GROUP_PORT_MASK)
451dc488f88SScott Feldman #define ROCKER_GROUP_INDEX_GET(group_id) \
452dc488f88SScott Feldman     (((group_id) & ROCKER_GROUP_INDEX_MASK) >> ROCKER_GROUP_INDEX_SHIFT)
453dc488f88SScott Feldman #define ROCKER_GROUP_INDEX_SET(index) \
454dc488f88SScott Feldman     (((index) << ROCKER_GROUP_INDEX_SHIFT) & ROCKER_GROUP_INDEX_MASK)
455dc488f88SScott Feldman #define ROCKER_GROUP_INDEX_LONG_GET(group_id) \
456dc488f88SScott Feldman     (((group_id) & ROCKER_GROUP_INDEX_LONG_MASK) >> \
457dc488f88SScott Feldman      ROCKER_GROUP_INDEX_LONG_SHIFT)
458dc488f88SScott Feldman #define ROCKER_GROUP_INDEX_LONG_SET(index) \
459dc488f88SScott Feldman     (((index) << ROCKER_GROUP_INDEX_LONG_SHIFT) & \
460dc488f88SScott Feldman      ROCKER_GROUP_INDEX_LONG_MASK)
461dc488f88SScott Feldman 
462dc488f88SScott Feldman #define ROCKER_GROUP_NONE 0
463dc488f88SScott Feldman #define ROCKER_GROUP_L2_INTERFACE(vlan_id, port) \
464dc488f88SScott Feldman     (ROCKER_GROUP_TYPE_SET(ROCKER_OF_DPA_GROUP_TYPE_L2_INTERFACE) |\
465dc488f88SScott Feldman      ROCKER_GROUP_VLAN_SET(ntohs(vlan_id)) | ROCKER_GROUP_PORT_SET(port))
466dc488f88SScott Feldman #define ROCKER_GROUP_L2_REWRITE(index) \
467dc488f88SScott Feldman     (ROCKER_GROUP_TYPE_SET(ROCKER_OF_DPA_GROUP_TYPE_L2_REWRITE) |\
468dc488f88SScott Feldman      ROCKER_GROUP_INDEX_LONG_SET(index))
469dc488f88SScott Feldman #define ROCKER_GROUP_L2_MCAST(vlan_id, index) \
470dc488f88SScott Feldman     (ROCKER_GROUP_TYPE_SET(ROCKER_OF_DPA_GROUP_TYPE_L2_MCAST) |\
471dc488f88SScott Feldman      ROCKER_GROUP_VLAN_SET(ntohs(vlan_id)) | ROCKER_GROUP_INDEX_SET(index))
472dc488f88SScott Feldman #define ROCKER_GROUP_L2_FLOOD(vlan_id, index) \
473dc488f88SScott Feldman     (ROCKER_GROUP_TYPE_SET(ROCKER_OF_DPA_GROUP_TYPE_L2_FLOOD) |\
474dc488f88SScott Feldman      ROCKER_GROUP_VLAN_SET(ntohs(vlan_id)) | ROCKER_GROUP_INDEX_SET(index))
475dc488f88SScott Feldman #define ROCKER_GROUP_L3_UNICAST(index) \
476dc488f88SScott Feldman     (ROCKER_GROUP_TYPE_SET(ROCKER_OF_DPA_GROUP_TYPE_L3_UCAST) |\
477dc488f88SScott Feldman      ROCKER_GROUP_INDEX_LONG_SET(index))
478dc488f88SScott Feldman 
479dc488f88SScott Feldman /*
480dc488f88SScott Feldman  * Rocker general purpose registers
481dc488f88SScott Feldman  */
482dc488f88SScott Feldman #define ROCKER_CONTROL                  0x0300
483dc488f88SScott Feldman #define ROCKER_PORT_PHYS_COUNT          0x0304
484dc488f88SScott Feldman #define ROCKER_PORT_PHYS_LINK_STATUS    0x0310 /* 8-byte */
485dc488f88SScott Feldman #define ROCKER_PORT_PHYS_ENABLE         0x0318 /* 8-byte */
486dc488f88SScott Feldman #define ROCKER_SWITCH_ID                0x0320 /* 8-byte */
487dc488f88SScott Feldman 
488dc488f88SScott Feldman /*
489dc488f88SScott Feldman  * Rocker control bits
490dc488f88SScott Feldman  */
491dc488f88SScott Feldman #define ROCKER_CONTROL_RESET            (1 << 0)
492dc488f88SScott Feldman 
493*2a6a4076SMarkus Armbruster #endif /* ROCKER_HW_H */
494