xref: /dpdk/drivers/net/netvsc/hn_nvs.h (revision 68a03efeed657e6e05f281479b33b51102797e15)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2018 Microsoft Corp.
3  * All rights reserved.
4  */
5 
6 /*
7  * The indirection table message is the largest message
8  * received from host, and that is 112 bytes.
9  */
10 #define NVS_RESPSIZE_MAX	256
11 
12 /*
13  * NDIS protocol version numbers
14  */
15 #define NDIS_VERSION_6_1		0x00060001
16 #define NDIS_VERSION_6_20		0x00060014
17 #define NDIS_VERSION_6_30		0x0006001e
18 #define NDIS_VERSION_MAJOR(ver)	(((ver) & 0xffff0000) >> 16)
19 #define NDIS_VERSION_MINOR(ver)	((ver) & 0xffff)
20 
21 /*
22  * NVS versions.
23  */
24 #define NVS_VERSION_1		0x00002
25 #define NVS_VERSION_2		0x30002
26 #define NVS_VERSION_4		0x40000
27 #define NVS_VERSION_5		0x50000
28 #define NVS_VERSION_6		0x60000
29 #define NVS_VERSION_61		0x60001
30 
31 #define NVS_RXBUF_SIG		0xcafe
32 #define NVS_CHIM_SIG			0xface
33 
34 #define NVS_CHIM_IDX_INVALID		0xffffffff
35 
36 #define NVS_RNDIS_MTYPE_DATA		0
37 #define NVS_RNDIS_MTYPE_CTRL		1
38 
39 /*
40  * NVS message transaction status codes.
41  */
42 #define NVS_STATUS_OK		1
43 #define NVS_STATUS_FAILED		2
44 
45 /*
46  * NVS request/response message types.
47  */
48 #define NVS_TYPE_INIT		1
49 #define NVS_TYPE_INIT_RESP	2
50 
51 #define NVS_TYPE_NDIS_INIT	100
52 #define NVS_TYPE_RXBUF_CONN	101
53 #define NVS_TYPE_RXBUF_CONNRESP	102
54 #define NVS_TYPE_RXBUF_DISCONN	103
55 #define NVS_TYPE_CHIM_CONN	104
56 #define NVS_TYPE_CHIM_CONNRESP	105
57 #define NVS_TYPE_CHIM_DISCONN	106
58 #define NVS_TYPE_RNDIS		107
59 #define NVS_TYPE_RNDIS_ACK	108
60 
61 #define NVS_TYPE_NDIS_CONF	125
62 #define NVS_TYPE_VFASSOC_NOTE	128	/* notification */
63 #define NVS_TYPE_SET_DATAPATH	129
64 #define NVS_TYPE_SUBCH_REQ	133
65 #define NVS_TYPE_SUBCH_RESP	133	/* same as SUBCH_REQ */
66 #define NVS_TYPE_TXTBL_NOTE	134	/* notification */
67 
68 
69 /* NVS message common header */
70 struct hn_nvs_hdr {
71 	uint32_t	type;
72 } __rte_packed;
73 
74 struct hn_nvs_init {
75 	uint32_t	type;	/* NVS_TYPE_INIT */
76 	uint32_t	ver_min;
77 	uint32_t	ver_max;
78 	uint8_t		rsvd[28];
79 } __rte_packed;
80 
81 struct hn_nvs_init_resp {
82 	uint32_t	type;	/* NVS_TYPE_INIT_RESP */
83 	uint32_t	ver;	/* deprecated */
84 	uint32_t	rsvd;
85 	uint32_t	status;	/* NVS_STATUS_ */
86 } __rte_packed;
87 
88 /* No response */
89 struct hn_nvs_ndis_conf {
90 	uint32_t	type;	/* NVS_TYPE_NDIS_CONF */
91 	uint32_t	mtu;
92 	uint32_t	rsvd;
93 	uint64_t	caps;	/* NVS_NDIS_CONF_ */
94 	uint8_t		rsvd1[20];
95 } __rte_packed;
96 
97 #define NVS_NDIS_CONF_SRIOV		0x0004
98 #define NVS_NDIS_CONF_VLAN		0x0008
99 
100 /* No response */
101 struct hn_nvs_ndis_init {
102 	uint32_t	type;	/* NVS_TYPE_NDIS_INIT */
103 	uint32_t	ndis_major;	/* NDIS_VERSION_MAJOR_ */
104 	uint32_t	ndis_minor;	/* NDIS_VERSION_MINOR_ */
105 	uint8_t		rsvd[28];
106 } __rte_packed;
107 
108 struct hn_nvs_vf_association {
109 	uint32_t	type;	/* NVS_TYPE_VFASSOC_NOTE */
110 	uint32_t	allocated;
111 	uint32_t	serial;
112 } __rte_packed;
113 
114 #define NVS_DATAPATH_SYNTHETIC	0
115 #define NVS_DATAPATH_VF		1
116 
117 /* No response */
118 struct hn_nvs_datapath {
119 	uint32_t	type;	/* NVS_TYPE_SET_DATAPATH */
120 	uint32_t	active_path;/* NVS_DATAPATH_* */
121 	uint8_t		rsvd[32];
122 } __rte_packed;
123 
124 struct hn_nvs_rxbuf_conn {
125 	uint32_t	type;	/* NVS_TYPE_RXBUF_CONN */
126 	uint32_t	gpadl;	/* RXBUF vmbus GPADL */
127 	uint16_t	sig;	/* NVS_RXBUF_SIG */
128 	uint8_t		rsvd[30];
129 } __rte_packed;
130 
131 struct hn_nvs_rxbuf_sect {
132 	uint32_t	start;
133 	uint32_t	slotsz;
134 	uint32_t	slotcnt;
135 	uint32_t	end;
136 } __rte_packed;
137 
138 struct hn_nvs_rxbuf_connresp {
139 	uint32_t	type;	/* NVS_TYPE_RXBUF_CONNRESP */
140 	uint32_t	status;	/* NVS_STATUS_ */
141 	uint32_t	nsect;	/* # of elem in nvs_sect */
142 	struct hn_nvs_rxbuf_sect nvs_sect[1];
143 } __rte_packed;
144 
145 /* No response */
146 struct hn_nvs_rxbuf_disconn {
147 	uint32_t	type;	/* NVS_TYPE_RXBUF_DISCONN */
148 	uint16_t	sig;	/* NVS_RXBUF_SIG */
149 	uint8_t		rsvd[34];
150 } __rte_packed;
151 
152 struct hn_nvs_chim_conn {
153 	uint32_t	type;	/* NVS_TYPE_CHIM_CONN */
154 	uint32_t	gpadl;	/* chimney buf vmbus GPADL */
155 	uint16_t	sig;	/* NDIS_NVS_CHIM_SIG */
156 	uint8_t		rsvd[30];
157 } __rte_packed;
158 
159 struct hn_nvs_chim_connresp {
160 	uint32_t	type;	/* NVS_TYPE_CHIM_CONNRESP */
161 	uint32_t	status;	/* NVS_STATUS_ */
162 	uint32_t	sectsz;	/* section size */
163 } __rte_packed;
164 
165 /* No response */
166 struct hn_nvs_chim_disconn {
167 	uint32_t	type;	/* NVS_TYPE_CHIM_DISCONN */
168 	uint16_t	sig;	/* NVS_CHIM_SIG */
169 	uint8_t		rsvd[34];
170 } __rte_packed;
171 
172 #define NVS_SUBCH_OP_ALLOC		1
173 
174 struct hn_nvs_subch_req {
175 	uint32_t	type;	/* NVS_TYPE_SUBCH_REQ */
176 	uint32_t	op;	/* NVS_SUBCH_OP_ */
177 	uint32_t	nsubch;
178 	uint8_t		rsvd[28];
179 } __rte_packed;
180 
181 struct hn_nvs_subch_resp {
182 	uint32_t	type;	/* NVS_TYPE_SUBCH_RESP */
183 	uint32_t	status;	/* NVS_STATUS_ */
184 	uint32_t	nsubch;
185 	uint8_t		rsvd[28];
186 } __rte_packed;
187 
188 struct hn_nvs_rndis {
189 	uint32_t	type;	/* NVS_TYPE_RNDIS */
190 	uint32_t	rndis_mtype;/* NVS_RNDIS_MTYPE_ */
191 	/*
192 	 * Chimney sending buffer index and size.
193 	 *
194 	 * NOTE:
195 	 * If nvs_chim_idx is set to NVS_CHIM_IDX_INVALID
196 	 * and nvs_chim_sz is set to 0, then chimney sending
197 	 * buffer is _not_ used by this RNDIS message.
198 	 */
199 	uint32_t	chim_idx;
200 	uint32_t	chim_sz;
201 	uint8_t		rsvd[24];
202 } __rte_packed;
203 
204 struct hn_nvs_rndis_ack {
205 	uint32_t	type;	/* NVS_TYPE_RNDIS_ACK */
206 	uint32_t	status;	/* NVS_STATUS_ */
207 	uint8_t		rsvd[32];
208 } __rte_packed;
209 
210 
211 int	hn_nvs_attach(struct hn_data *hv, unsigned int mtu);
212 void	hn_nvs_detach(struct hn_data *hv);
213 void	hn_nvs_ack_rxbuf(struct vmbus_channel *chan, uint64_t tid);
214 int	hn_nvs_alloc_subchans(struct hn_data *hv, uint32_t *nsubch);
215 int	hn_nvs_set_datapath(struct hn_data *hv, uint32_t path);
216 void	hn_nvs_handle_vfassoc(struct rte_eth_dev *dev,
217 			      const struct vmbus_chanpkt_hdr *hdr,
218 			      const void *data);
219 
220 static inline int
221 hn_nvs_send(struct vmbus_channel *chan, uint16_t flags,
222 	    void *nvs_msg, int nvs_msglen, uintptr_t sndc,
223 	    bool *need_sig)
224 {
225 	return rte_vmbus_chan_send(chan, VMBUS_CHANPKT_TYPE_INBAND,
226 				   nvs_msg, nvs_msglen, (uint64_t)sndc,
227 				   flags, need_sig);
228 }
229 
230 static inline int
231 hn_nvs_send_sglist(struct vmbus_channel *chan,
232 		   struct vmbus_gpa sg[], unsigned int sglen,
233 		   void *nvs_msg, int nvs_msglen,
234 		   uintptr_t sndc, bool *need_sig)
235 {
236 	return rte_vmbus_chan_send_sglist(chan, sg, sglen, nvs_msg, nvs_msglen,
237 					  (uint64_t)sndc, need_sig);
238 }
239