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