Home | History | Annotate | Line # | Download | only in pci
      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