xref: /openbsd/sys/dev/pv/if_hvnreg.h (revision 4b1a56af)
1e0adee91Smikeb /*-
2d958ad14Smikeb  * Copyright (c) 2016 Microsoft Corp.
3e0adee91Smikeb  * All rights reserved.
4e0adee91Smikeb  *
5e0adee91Smikeb  * Redistribution and use in source and binary forms, with or without
6e0adee91Smikeb  * modification, are permitted provided that the following conditions
7e0adee91Smikeb  * are met:
8e0adee91Smikeb  * 1. Redistributions of source code must retain the above copyright
9e0adee91Smikeb  *    notice unmodified, this list of conditions, and the following
10e0adee91Smikeb  *    disclaimer.
11e0adee91Smikeb  * 2. Redistributions in binary form must reproduce the above copyright
12e0adee91Smikeb  *    notice, this list of conditions and the following disclaimer in the
13e0adee91Smikeb  *    documentation and/or other materials provided with the distribution.
14e0adee91Smikeb  *
15e0adee91Smikeb  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16e0adee91Smikeb  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17e0adee91Smikeb  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18e0adee91Smikeb  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19e0adee91Smikeb  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20e0adee91Smikeb  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21e0adee91Smikeb  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22e0adee91Smikeb  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23e0adee91Smikeb  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24e0adee91Smikeb  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25e0adee91Smikeb  */
26e0adee91Smikeb 
274f3f6fbcSmikeb #ifndef _DEV_PV_IF_HVNREG_H_
284f3f6fbcSmikeb #define _DEV_PV_IF_HVNREG_H_
29e0adee91Smikeb 
30d958ad14Smikeb #define HVN_NVS_PROTO_VERSION_1		0x00002
31d958ad14Smikeb #define HVN_NVS_PROTO_VERSION_2		0x30002
32d958ad14Smikeb #define HVN_NVS_PROTO_VERSION_4		0x40000
33d958ad14Smikeb #define HVN_NVS_PROTO_VERSION_5		0x50000
34e0adee91Smikeb 
35d958ad14Smikeb #define HVN_NVS_RXBUF_SIG		0x2409
36d958ad14Smikeb #define HVN_NVS_CHIM_SIG		0x1984
37e0adee91Smikeb 
38d958ad14Smikeb #define HVN_NVS_CHIM_IDX_INVALID	0xffffffff
39d958ad14Smikeb 
40d958ad14Smikeb #define HVN_NVS_RNDIS_MTYPE_DATA	0
41d958ad14Smikeb #define HVN_NVS_RNDIS_MTYPE_CTRL	1
42e0adee91Smikeb 
43e0adee91Smikeb /*
44*4b1a56afSjsg  * NVS message transaction status codes.
45e0adee91Smikeb  */
46d958ad14Smikeb #define HVN_NVS_STATUS_OK		1
47d958ad14Smikeb #define HVN_NVS_STATUS_FAILED		2
48e0adee91Smikeb 
49e0adee91Smikeb /*
50d958ad14Smikeb  * NVS request/response message types.
51e0adee91Smikeb  */
52d958ad14Smikeb #define HVN_NVS_TYPE_INIT		1
53d958ad14Smikeb #define HVN_NVS_TYPE_INIT_RESP		2
54d958ad14Smikeb #define HVN_NVS_TYPE_NDIS_INIT		100
55d958ad14Smikeb #define HVN_NVS_TYPE_RXBUF_CONN		101
56d958ad14Smikeb #define HVN_NVS_TYPE_RXBUF_CONNRESP	102
57d958ad14Smikeb #define HVN_NVS_TYPE_RXBUF_DISCONN	103
58d958ad14Smikeb #define HVN_NVS_TYPE_CHIM_CONN		104
59d958ad14Smikeb #define HVN_NVS_TYPE_CHIM_CONNRESP	105
60d958ad14Smikeb #define HVN_NVS_TYPE_CHIM_DISCONN	106
61d958ad14Smikeb #define HVN_NVS_TYPE_RNDIS		107
62d958ad14Smikeb #define HVN_NVS_TYPE_RNDIS_ACK		108
63d958ad14Smikeb #define HVN_NVS_TYPE_NDIS_CONF		125
64d958ad14Smikeb #define HVN_NVS_TYPE_VFASSOC_NOTE	128	/* notification */
65d958ad14Smikeb #define HVN_NVS_TYPE_SET_DATAPATH	129
66d958ad14Smikeb #define HVN_NVS_TYPE_SUBCH_REQ		133
67d958ad14Smikeb #define HVN_NVS_TYPE_SUBCH_RESP		133	/* same as SUBCH_REQ */
68d958ad14Smikeb #define HVN_NVS_TYPE_TXTBL_NOTE		134	/* notification */
69e0adee91Smikeb 
70e0adee91Smikeb /*
71d958ad14Smikeb  * Any size less than this one will _not_ work, e.g. hn_nvs_init
72d958ad14Smikeb  * only has 12B valid data, however, if only 12B data were sent,
73d958ad14Smikeb  * Hypervisor would never reply.
74e0adee91Smikeb  */
75d958ad14Smikeb #define HVN_NVS_REQSIZE_MIN		32
76e0adee91Smikeb 
77d958ad14Smikeb /* NVS message common header */
78d958ad14Smikeb struct hvn_nvs_hdr {
79d958ad14Smikeb 	uint32_t	nvs_type;
80d958ad14Smikeb } __packed;
81e0adee91Smikeb 
82d958ad14Smikeb struct hvn_nvs_init {
83d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_INIT */
84d958ad14Smikeb 	uint32_t	nvs_ver_min;
85d958ad14Smikeb 	uint32_t	nvs_ver_max;
86d958ad14Smikeb 	uint8_t		nvs_rsvd[20];
87d958ad14Smikeb } __packed;
88e0adee91Smikeb 
89d958ad14Smikeb struct hvn_nvs_init_resp {
90d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_INIT_RESP */
91d958ad14Smikeb 	uint32_t	nvs_ver;	/* deprecated */
92d958ad14Smikeb 	uint32_t	nvs_rsvd;
93d958ad14Smikeb 	uint32_t	nvs_status;	/* HVN_NVS_STATUS_ */
94d958ad14Smikeb } __packed;
95e0adee91Smikeb 
96*4b1a56afSjsg /* No response */
97d958ad14Smikeb struct hvn_nvs_ndis_conf {
98d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_NDIS_CONF */
99d958ad14Smikeb 	uint32_t	nvs_mtu;
100d958ad14Smikeb 	uint32_t	nvs_rsvd;
101d958ad14Smikeb 	uint64_t	nvs_caps;	/* HVN_NVS_NDIS_CONF_ */
102d958ad14Smikeb 	uint8_t		nvs_rsvd1[12];
103d958ad14Smikeb } __packed;
104d958ad14Smikeb 
105d958ad14Smikeb #define HVN_NVS_NDIS_CONF_SRIOV		0x0004
106d958ad14Smikeb #define HVN_NVS_NDIS_CONF_VLAN		0x0008
107d958ad14Smikeb 
108d958ad14Smikeb /* No response */
109d958ad14Smikeb struct hvn_nvs_ndis_init {
110d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_NDIS_INIT */
111d958ad14Smikeb 	uint32_t	nvs_ndis_major;	/* NDIS_VERSION_MAJOR_ */
112d958ad14Smikeb 	uint32_t	nvs_ndis_minor;	/* NDIS_VERSION_MINOR_ */
113d958ad14Smikeb 	uint8_t		nvs_rsvd[20];
114d958ad14Smikeb } __packed;
115d958ad14Smikeb 
116d958ad14Smikeb struct hvn_nvs_rxbuf_conn {
117d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_RXBUF_CONN */
118d958ad14Smikeb 	uint32_t	nvs_gpadl;	/* RXBUF vmbus GPADL */
119d958ad14Smikeb 	uint16_t	nvs_sig;	/* HVN_NVS_RXBUF_SIG */
120d958ad14Smikeb 	uint8_t		nvs_rsvd[22];
121d958ad14Smikeb } __packed;
122d958ad14Smikeb 
123d958ad14Smikeb struct hvn_nvs_rxbuf_sect {
124d958ad14Smikeb 	uint32_t	nvs_start;
125d958ad14Smikeb 	uint32_t	nvs_slotsz;
126d958ad14Smikeb 	uint32_t	nvs_slotcnt;
127d958ad14Smikeb 	uint32_t	nvs_end;
128d958ad14Smikeb } __packed;
129d958ad14Smikeb 
130d958ad14Smikeb struct hvn_nvs_rxbuf_conn_resp {
131d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_RXBUF_CONNRESP */
132d958ad14Smikeb 	uint32_t	nvs_status;	/* HVN_NVS_STATUS_ */
133d958ad14Smikeb 	uint32_t	nvs_nsect;	/* # of elem in nvs_sect */
134d958ad14Smikeb 	struct hvn_nvs_rxbuf_sect nvs_sect[0];
135d958ad14Smikeb } __packed;
136d958ad14Smikeb 
137d958ad14Smikeb /* No response */
138d958ad14Smikeb struct hvn_nvs_rxbuf_disconn {
139d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_RXBUF_DISCONN */
140d958ad14Smikeb 	uint16_t	nvs_sig;	/* HVN_NVS_RXBUF_SIG */
141d958ad14Smikeb 	uint8_t		nvs_rsvd[26];
142d958ad14Smikeb } __packed;
143d958ad14Smikeb 
144d958ad14Smikeb struct hvn_nvs_chim_conn {
145d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_CHIM_CONN */
146d958ad14Smikeb 	uint32_t	nvs_gpadl;	/* chimney buf vmbus GPADL */
147d958ad14Smikeb 	uint16_t	nvs_sig;	/* NDIS_NVS_CHIM_SIG */
148d958ad14Smikeb 	uint8_t		nvs_rsvd[22];
149d958ad14Smikeb } __packed;
150d958ad14Smikeb 
151d958ad14Smikeb struct hvn_nvs_chim_conn_resp {
152d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_CHIM_CONNRESP */
153d958ad14Smikeb 	uint32_t	nvs_status;	/* HVN_NVS_STATUS_ */
154d958ad14Smikeb 	uint32_t	nvs_sectsz;	/* section size */
155d958ad14Smikeb } __packed;
156d958ad14Smikeb 
157d958ad14Smikeb /* No response */
158d958ad14Smikeb struct hvn_nvs_chim_disconn {
159d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_CHIM_DISCONN */
160d958ad14Smikeb 	uint16_t	nvs_sig;	/* HVN_NVS_CHIM_SIG */
161d958ad14Smikeb 	uint8_t		nvs_rsvd[26];
162d958ad14Smikeb } __packed;
163d958ad14Smikeb 
164d958ad14Smikeb #define HVN_NVS_SUBCH_OP_ALLOC		1
165d958ad14Smikeb 
166d958ad14Smikeb struct hvn_nvs_subch_req {
167d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_SUBCH_REQ */
168d958ad14Smikeb 	uint32_t	nvs_op;		/* HVN_NVS_SUBCH_OP_ */
169d958ad14Smikeb 	uint32_t	nvs_nsubch;
170d958ad14Smikeb 	uint8_t		nvs_rsvd[20];
171d958ad14Smikeb } __packed;
172d958ad14Smikeb 
173d958ad14Smikeb struct hvn_nvs_subch_resp {
174d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_SUBCH_RESP */
175d958ad14Smikeb 	uint32_t	nvs_status;	/* HVN_NVS_STATUS_ */
176d958ad14Smikeb 	uint32_t	nvs_nsubch;
177d958ad14Smikeb } __packed;
178d958ad14Smikeb 
179d958ad14Smikeb struct hvn_nvs_rndis {
180d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_RNDIS */
181d958ad14Smikeb 	uint32_t	nvs_rndis_mtype;/* HVN_NVS_RNDIS_MTYPE_ */
182e0adee91Smikeb 	/*
183d958ad14Smikeb 	 * Chimney sending buffer index and size.
184e0adee91Smikeb 	 *
185d958ad14Smikeb 	 * NOTE:
186d958ad14Smikeb 	 * If nvs_chim_idx is set to HVN_NVS_CHIM_IDX_INVALID
187d958ad14Smikeb 	 * and nvs_chim_sz is set to 0, then chimney sending
188d958ad14Smikeb 	 * buffer is _not_ used by this RNDIS message.
189e0adee91Smikeb 	 */
190d958ad14Smikeb 	uint32_t	nvs_chim_idx;
191d958ad14Smikeb 	uint32_t	nvs_chim_sz;
192d958ad14Smikeb 	uint8_t		nvs_rsvd[16];
193e0adee91Smikeb } __packed;
194e0adee91Smikeb 
195d958ad14Smikeb struct hvn_nvs_rndis_ack {
196d958ad14Smikeb 	uint32_t	nvs_type;	/* HVN_NVS_TYPE_RNDIS_ACK */
197d958ad14Smikeb 	uint32_t	nvs_status;	/* HVN_NVS_STATUS_ */
198d958ad14Smikeb 	uint8_t		nvs_rsvd[24];
199e0adee91Smikeb } __packed;
200e0adee91Smikeb 
2014f3f6fbcSmikeb #endif	/* _DEV_PV_IF_HVNREG_H_ */
202