if_vmxreg.h revision 1.1 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