1 1.1 ryo /* $NetBSD: if_vmxreg.h,v 1.1 2020/10/14 10:19:11 ryo Exp $ */ 2 1.1 ryo /* $OpenBSD: if_vmxreg.h,v 1.3 2013/08/28 10:19:19 reyk Exp $ */ 3 1.1 ryo 4 1.1 ryo /* 5 1.1 ryo * Copyright (c) 2013 Tsubai Masanari 6 1.1 ryo * 7 1.1 ryo * Permission to use, copy, modify, and distribute this software for any 8 1.1 ryo * purpose with or without fee is hereby granted, provided that the above 9 1.1 ryo * copyright notice and this permission notice appear in all copies. 10 1.1 ryo * 11 1.1 ryo * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 1.1 ryo * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 1.1 ryo * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 1.1 ryo * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 1.1 ryo * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 1.1 ryo * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 1.1 ryo * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 1.1 ryo */ 19 1.1 ryo 20 1.1 ryo struct UPT1_TxStats { 21 1.1 ryo uint64_t TSO_packets; 22 1.1 ryo uint64_t TSO_bytes; 23 1.1 ryo uint64_t ucast_packets; 24 1.1 ryo uint64_t ucast_bytes; 25 1.1 ryo uint64_t mcast_packets; 26 1.1 ryo uint64_t mcast_bytes; 27 1.1 ryo uint64_t bcast_packets; 28 1.1 ryo uint64_t bcast_bytes; 29 1.1 ryo uint64_t error; 30 1.1 ryo uint64_t discard; 31 1.1 ryo } __packed; 32 1.1 ryo 33 1.1 ryo struct UPT1_RxStats { 34 1.1 ryo uint64_t LRO_packets; 35 1.1 ryo uint64_t LRO_bytes; 36 1.1 ryo uint64_t ucast_packets; 37 1.1 ryo uint64_t ucast_bytes; 38 1.1 ryo uint64_t mcast_packets; 39 1.1 ryo uint64_t mcast_bytes; 40 1.1 ryo uint64_t bcast_packets; 41 1.1 ryo uint64_t bcast_bytes; 42 1.1 ryo uint64_t nobuffer; 43 1.1 ryo uint64_t error; 44 1.1 ryo } __packed; 45 1.1 ryo 46 1.1 ryo /* interrupt moderation levels */ 47 1.1 ryo #define UPT1_IMOD_NONE 0 /* no moderation */ 48 1.1 ryo #define UPT1_IMOD_HIGHEST 7 /* least interrupts */ 49 1.1 ryo #define UPT1_IMOD_ADAPTIVE 8 /* adaptive interrupt moderation */ 50 1.1 ryo 51 1.1 ryo /* hardware features */ 52 1.1 ryo #define UPT1_F_CSUM 0x0001 /* Rx checksum verification */ 53 1.1 ryo #define UPT1_F_RSS 0x0002 /* receive side scaling */ 54 1.1 ryo #define UPT1_F_VLAN 0x0004 /* VLAN tag stripping */ 55 1.1 ryo #define UPT1_F_LRO 0x0008 /* large receive offloading */ 56 1.1 ryo 57 1.1 ryo #define VMXNET3_BAR0_IMASK(irq) (0x000 + (irq) * 8) /* interrupt mask */ 58 1.1 ryo #define VMXNET3_BAR0_TXH(q) (0x600 + (q) * 8) /* Tx head */ 59 1.1 ryo #define VMXNET3_BAR0_RXH1(q) (0x800 + (q) * 8) /* ring1 Rx head */ 60 1.1 ryo #define VMXNET3_BAR0_RXH2(q) (0xa00 + (q) * 8) /* ring2 Rx head */ 61 1.1 ryo #define VMXNET3_BAR1_VRRS 0x000 /* VMXNET3 revision report selection */ 62 1.1 ryo #define VMXNET3_BAR1_UVRS 0x008 /* UPT version report selection */ 63 1.1 ryo #define VMXNET3_BAR1_DSL 0x010 /* driver shared address low */ 64 1.1 ryo #define VMXNET3_BAR1_DSH 0x018 /* driver shared address high */ 65 1.1 ryo #define VMXNET3_BAR1_CMD 0x020 /* command */ 66 1.1 ryo #define VMXNET3_BAR1_MACL 0x028 /* MAC address low */ 67 1.1 ryo #define VMXNET3_BAR1_MACH 0x030 /* MAC address high */ 68 1.1 ryo #define VMXNET3_BAR1_INTR 0x038 /* interrupt status */ 69 1.1 ryo #define VMXNET3_BAR1_EVENT 0x040 /* event status */ 70 1.1 ryo 71 1.1 ryo #define VMXNET3_CMD_ENABLE 0xcafe0000 /* enable VMXNET3 */ 72 1.1 ryo #define VMXNET3_CMD_DISABLE 0xcafe0001 /* disable VMXNET3 */ 73 1.1 ryo #define VMXNET3_CMD_RESET 0xcafe0002 /* reset device */ 74 1.1 ryo #define VMXNET3_CMD_SET_RXMODE 0xcafe0003 /* set interface flags */ 75 1.1 ryo #define VMXNET3_CMD_SET_FILTER 0xcafe0004 /* set address filter */ 76 1.1 ryo #define VMXNET3_CMD_VLAN_FILTER 0xcafe0005 /* set VLAN filter */ 77 1.1 ryo #define VMXNET3_CMD_GET_STATUS 0xf00d0000 /* get queue errors */ 78 1.1 ryo #define VMXNET3_CMD_GET_STATS 0xf00d0001 /* get queue statistics */ 79 1.1 ryo #define VMXNET3_CMD_GET_LINK 0xf00d0002 /* get link status */ 80 1.1 ryo #define VMXNET3_CMD_GET_MACL 0xf00d0003 81 1.1 ryo #define VMXNET3_CMD_GET_MACH 0xf00d0004 82 1.1 ryo #define VMXNET3_CMD_GET_INTRCFG 0xf00d0008 /* get interrupt config */ 83 1.1 ryo 84 1.1 ryo #define VMXNET3_DMADESC_ALIGN 128 85 1.1 ryo #define VMXNET3_INIT_GEN 1 86 1.1 ryo 87 1.1 ryo /* All descriptors are in little-endian format. */ 88 1.1 ryo struct vmxnet3_txdesc { 89 1.1 ryo uint64_t addr; 90 1.1 ryo 91 1.1 ryo uint32_t len:14; 92 1.1 ryo uint32_t gen:1; /* Generation */ 93 1.1 ryo uint32_t pad1:1; 94 1.1 ryo uint32_t dtype:1; /* Descriptor type */ 95 1.1 ryo uint32_t pad2:1; 96 1.1 ryo uint32_t offload_pos:14; /* Offloading position */ 97 1.1 ryo 98 1.1 ryo uint32_t hlen:10; /* Header len */ 99 1.1 ryo uint32_t offload_mode:2; /* Offloading mode */ 100 1.1 ryo uint32_t eop:1; /* End of packet */ 101 1.1 ryo uint32_t compreq:1; /* Completion request */ 102 1.1 ryo uint32_t pad3:1; 103 1.1 ryo uint32_t vtag_mode:1; /* VLAN tag insertion mode */ 104 1.1 ryo uint32_t vtag:16; /* VLAN tag */ 105 1.1 ryo } __packed; 106 1.1 ryo 107 1.1 ryo /* offloading modes */ 108 1.1 ryo #define VMXNET3_OM_NONE 0 109 1.1 ryo #define VMXNET3_OM_CSUM 2 110 1.1 ryo #define VMXNET3_OM_TSO 3 111 1.1 ryo 112 1.1 ryo struct vmxnet3_txcompdesc { 113 1.1 ryo uint32_t eop_idx:12; /* EOP index in Tx ring */ 114 1.1 ryo uint32_t pad1:20; 115 1.1 ryo 116 1.1 ryo uint32_t pad2:32; 117 1.1 ryo uint32_t pad3:32; 118 1.1 ryo 119 1.1 ryo uint32_t rsvd:24; 120 1.1 ryo uint32_t type:7; 121 1.1 ryo uint32_t gen:1; 122 1.1 ryo } __packed; 123 1.1 ryo 124 1.1 ryo struct vmxnet3_rxdesc { 125 1.1 ryo uint64_t addr; 126 1.1 ryo 127 1.1 ryo uint32_t len:14; 128 1.1 ryo uint32_t btype:1; /* Buffer type */ 129 1.1 ryo uint32_t dtype:1; /* Descriptor type */ 130 1.1 ryo uint32_t rsvd:15; 131 1.1 ryo uint32_t gen:1; 132 1.1 ryo 133 1.1 ryo uint32_t pad1:32; 134 1.1 ryo } __packed; 135 1.1 ryo 136 1.1 ryo /* buffer types */ 137 1.1 ryo #define VMXNET3_BTYPE_HEAD 0 /* head only */ 138 1.1 ryo #define VMXNET3_BTYPE_BODY 1 /* body only */ 139 1.1 ryo 140 1.1 ryo struct vmxnet3_rxcompdesc { 141 1.1 ryo uint32_t rxd_idx:12; /* Rx descriptor index */ 142 1.1 ryo uint32_t pad1:2; 143 1.1 ryo uint32_t eop:1; /* End of packet */ 144 1.1 ryo uint32_t sop:1; /* Start of packet */ 145 1.1 ryo uint32_t qid:10; 146 1.1 ryo uint32_t rss_type:4; 147 1.1 ryo uint32_t no_csum:1; /* No checksum calculated */ 148 1.1 ryo uint32_t pad2:1; 149 1.1 ryo 150 1.1 ryo uint32_t rss_hash:32; /* RSS hash value */ 151 1.1 ryo 152 1.1 ryo uint32_t len:14; 153 1.1 ryo uint32_t error:1; 154 1.1 ryo uint32_t vlan:1; /* 802.1Q VLAN frame */ 155 1.1 ryo uint32_t vtag:16; /* VLAN tag */ 156 1.1 ryo 157 1.1 ryo uint32_t csum:16; 158 1.1 ryo uint32_t csum_ok:1; /* TCP/UDP checksum ok */ 159 1.1 ryo uint32_t udp:1; 160 1.1 ryo uint32_t tcp:1; 161 1.1 ryo uint32_t ipcsum_ok:1; /* IP checksum OK */ 162 1.1 ryo uint32_t ipv6:1; 163 1.1 ryo uint32_t ipv4:1; 164 1.1 ryo uint32_t fragment:1; /* IP fragment */ 165 1.1 ryo uint32_t fcs:1; /* Frame CRC correct */ 166 1.1 ryo uint32_t type:7; 167 1.1 ryo uint32_t gen:1; 168 1.1 ryo } __packed; 169 1.1 ryo 170 1.1 ryo #define VMXNET3_RCD_RSS_TYPE_NONE 0 171 1.1 ryo #define VMXNET3_RCD_RSS_TYPE_IPV4 1 172 1.1 ryo #define VMXNET3_RCD_RSS_TYPE_TCPIPV4 2 173 1.1 ryo #define VMXNET3_RCD_RSS_TYPE_IPV6 3 174 1.1 ryo #define VMXNET3_RCD_RSS_TYPE_TCPIPV6 4 175 1.1 ryo 176 1.1 ryo #define VMXNET3_REV1_MAGIC 0xbabefee1 177 1.1 ryo 178 1.1 ryo #define VMXNET3_GOS_UNKNOWN 0x00 179 1.1 ryo #define VMXNET3_GOS_LINUX 0x04 180 1.1 ryo #define VMXNET3_GOS_WINDOWS 0x08 181 1.1 ryo #define VMXNET3_GOS_SOLARIS 0x0c 182 1.1 ryo #define VMXNET3_GOS_FREEBSD 0x10 183 1.1 ryo #define VMXNET3_GOS_PXE 0x14 184 1.1 ryo 185 1.1 ryo #define VMXNET3_GOS_32BIT 0x01 186 1.1 ryo #define VMXNET3_GOS_64BIT 0x02 187 1.1 ryo 188 1.1 ryo #define VMXNET3_MAX_TX_QUEUES 8 189 1.1 ryo #define VMXNET3_MAX_RX_QUEUES 16 190 1.1 ryo #define VMXNET3_MAX_INTRS (VMXNET3_MAX_TX_QUEUES + VMXNET3_MAX_RX_QUEUES + 1) 191 1.1 ryo 192 1.1 ryo #define VMXNET3_RX_INTR_INDEX 0 193 1.1 ryo #define VMXNET3_TX_INTR_INDEX 1 194 1.1 ryo #define VMXNET3_EV_INTR_INDEX 2 195 1.1 ryo 196 1.1 ryo #define VMXNET3_ICTRL_DISABLE_ALL 0x01 197 1.1 ryo 198 1.1 ryo #define VMXNET3_RXMODE_UCAST 0x01 199 1.1 ryo #define VMXNET3_RXMODE_MCAST 0x02 200 1.1 ryo #define VMXNET3_RXMODE_BCAST 0x04 201 1.1 ryo #define VMXNET3_RXMODE_ALLMULTI 0x08 202 1.1 ryo #define VMXNET3_RXMODE_PROMISC 0x10 203 1.1 ryo 204 1.1 ryo #define VMXNET3_EVENT_RQERROR 0x01 205 1.1 ryo #define VMXNET3_EVENT_TQERROR 0x02 206 1.1 ryo #define VMXNET3_EVENT_LINK 0x04 207 1.1 ryo #define VMXNET3_EVENT_DIC 0x08 208 1.1 ryo #define VMXNET3_EVENT_DEBUG 0x10 209 1.1 ryo 210 1.1 ryo #define VMXNET3_MAX_MTU 9000 211 1.1 ryo #define VMXNET3_MIN_MTU 60 212 1.1 ryo 213 1.1 ryo #define VMXNET3_IMM_AUTO 0x00 214 1.1 ryo #define VMXNET3_IMM_ACTIVE 0x01 215 1.1 ryo #define VMXNET3_IMM_LAZY 0x02 216 1.1 ryo 217 1.1 ryo #define VMXNET3_IT_AUTO 0x00 218 1.1 ryo #define VMXNET3_IT_LEGACY 0x01 219 1.1 ryo #define VMXNET3_IT_MSI 0x02 220 1.1 ryo #define VMXNET3_IT_MSIX 0x03 221 1.1 ryo 222 1.1 ryo struct vmxnet3_driver_shared { 223 1.1 ryo uint32_t magic; 224 1.1 ryo uint32_t pad1; 225 1.1 ryo 226 1.1 ryo uint32_t version; /* driver version */ 227 1.1 ryo uint32_t guest; /* guest OS */ 228 1.1 ryo uint32_t vmxnet3_revision; /* supported VMXNET3 revision */ 229 1.1 ryo uint32_t upt_version; /* supported UPT version */ 230 1.1 ryo uint64_t upt_features; 231 1.1 ryo uint64_t driver_data; 232 1.1 ryo uint64_t queue_shared; 233 1.1 ryo uint32_t driver_data_len; 234 1.1 ryo uint32_t queue_shared_len; 235 1.1 ryo uint32_t mtu; 236 1.1 ryo uint16_t nrxsg_max; 237 1.1 ryo uint8_t ntxqueue; 238 1.1 ryo uint8_t nrxqueue; 239 1.1 ryo uint32_t reserved1[4]; 240 1.1 ryo 241 1.1 ryo /* interrupt control */ 242 1.1 ryo uint8_t automask; 243 1.1 ryo uint8_t nintr; 244 1.1 ryo uint8_t evintr; 245 1.1 ryo uint8_t modlevel[VMXNET3_MAX_INTRS]; 246 1.1 ryo uint32_t ictrl; 247 1.1 ryo uint32_t reserved2[2]; 248 1.1 ryo 249 1.1 ryo /* receive filter parameters */ 250 1.1 ryo uint32_t rxmode; 251 1.1 ryo uint16_t mcast_tablelen; 252 1.1 ryo uint16_t pad2; 253 1.1 ryo uint64_t mcast_table; 254 1.1 ryo uint32_t vlan_filter[4096 / 32]; 255 1.1 ryo 256 1.1 ryo struct { 257 1.1 ryo uint32_t version; 258 1.1 ryo uint32_t len; 259 1.1 ryo uint64_t paddr; 260 1.1 ryo } rss, pm, plugin; 261 1.1 ryo 262 1.1 ryo uint32_t event; 263 1.1 ryo uint32_t reserved3[5]; 264 1.1 ryo } __packed; 265 1.1 ryo 266 1.1 ryo struct vmxnet3_txq_shared { 267 1.1 ryo uint32_t npending; 268 1.1 ryo uint32_t intr_threshold; 269 1.1 ryo uint64_t reserved1; 270 1.1 ryo 271 1.1 ryo uint64_t cmd_ring; 272 1.1 ryo uint64_t data_ring; 273 1.1 ryo uint64_t comp_ring; 274 1.1 ryo uint64_t driver_data; 275 1.1 ryo uint64_t reserved2; 276 1.1 ryo uint32_t cmd_ring_len; 277 1.1 ryo uint32_t data_ring_len; 278 1.1 ryo uint32_t comp_ring_len; 279 1.1 ryo uint32_t driver_data_len; 280 1.1 ryo uint8_t intr_idx; 281 1.1 ryo uint8_t pad1[7]; 282 1.1 ryo 283 1.1 ryo uint8_t stopped; 284 1.1 ryo uint8_t pad2[3]; 285 1.1 ryo uint32_t error; 286 1.1 ryo 287 1.1 ryo struct UPT1_TxStats stats; 288 1.1 ryo 289 1.1 ryo uint8_t pad3[88]; 290 1.1 ryo } __packed; 291 1.1 ryo 292 1.1 ryo struct vmxnet3_rxq_shared { 293 1.1 ryo uint8_t update_rxhead; 294 1.1 ryo uint8_t pad1[7]; 295 1.1 ryo uint64_t reserved1; 296 1.1 ryo 297 1.1 ryo uint64_t cmd_ring[2]; 298 1.1 ryo uint64_t comp_ring; 299 1.1 ryo uint64_t driver_data; 300 1.1 ryo uint64_t reserved2; 301 1.1 ryo uint32_t cmd_ring_len[2]; 302 1.1 ryo uint32_t comp_ring_len; 303 1.1 ryo uint32_t driver_data_len; 304 1.1 ryo uint8_t intr_idx; 305 1.1 ryo uint8_t pad2[7]; 306 1.1 ryo 307 1.1 ryo uint8_t stopped; 308 1.1 ryo uint8_t pad3[3]; 309 1.1 ryo uint32_t error; 310 1.1 ryo 311 1.1 ryo struct UPT1_RxStats stats; 312 1.1 ryo 313 1.1 ryo uint8_t pad4[88]; 314 1.1 ryo } __packed; 315 1.1 ryo 316 1.1 ryo #define UPT1_RSS_HASH_TYPE_NONE 0x00 317 1.1 ryo #define UPT1_RSS_HASH_TYPE_IPV4 0x01 318 1.1 ryo #define UPT1_RSS_HASH_TYPE_TCP_IPV4 0x02 319 1.1 ryo #define UPT1_RSS_HASH_TYPE_IPV6 0x04 320 1.1 ryo #define UPT1_RSS_HASH_TYPE_TCP_IPV6 0x08 321 1.1 ryo 322 1.1 ryo #define UPT1_RSS_HASH_FUNC_NONE 0x00 323 1.1 ryo #define UPT1_RSS_HASH_FUNC_TOEPLITZ 0x01 324 1.1 ryo 325 1.1 ryo #define UPT1_RSS_MAX_KEY_SIZE 40 326 1.1 ryo #define UPT1_RSS_MAX_IND_TABLE_SIZE 128 327 1.1 ryo 328 1.1 ryo struct vmxnet3_rss_shared { 329 1.1 ryo uint16_t hash_type; 330 1.1 ryo uint16_t hash_func; 331 1.1 ryo uint16_t hash_key_size; 332 1.1 ryo uint16_t ind_table_size; 333 1.1 ryo uint8_t hash_key[UPT1_RSS_MAX_KEY_SIZE]; 334 1.1 ryo uint8_t ind_table[UPT1_RSS_MAX_IND_TABLE_SIZE]; 335 1.1 ryo } __packed; 336 1.1 ryo 337