]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/VirtioNetDxe/VirtioNet.h
OvmfPkg: Apply uncrustify changes
[mirror_edk2.git] / OvmfPkg / VirtioNetDxe / VirtioNet.h
1 /** @file
2
3 Internal definitions for the virtio-net driver, which produces Simple Network
4 Protocol instances for virtio-net devices.
5
6 Copyright (C) 2013, Red Hat, Inc.
7 Copyright (c) 2017, AMD Inc, All rights reserved.<BR>
8
9 SPDX-License-Identifier: BSD-2-Clause-Patent
10 **/
11
12 #ifndef _VIRTIO_NET_DXE_H_
13 #define _VIRTIO_NET_DXE_H_
14
15 #include <IndustryStandard/VirtioNet.h>
16 #include <Library/DebugLib.h>
17 #include <Library/VirtioLib.h>
18 #include <Protocol/ComponentName.h>
19 #include <Protocol/ComponentName2.h>
20 #include <Protocol/DevicePath.h>
21 #include <Protocol/DriverBinding.h>
22 #include <Protocol/SimpleNetwork.h>
23 #include <Library/OrderedCollectionLib.h>
24
25 #define VNET_SIG SIGNATURE_32 ('V', 'N', 'E', 'T')
26
27 //
28 // maximum number of pending packets, separately for each direction
29 //
30 #define VNET_MAX_PENDING 64
31
32 //
33 // State diagram:
34 //
35 // | ^
36 // | |
37 // BindingStart BindingStop
38 // +SnpPopulate |
39 // ++GetFeatures |
40 // | |
41 // v |
42 // +---------+ virtio-net device is reset, no resources are
43 // | stopped | allocated for traffic, but MAC address has
44 // +---------+ been retrieved
45 // | ^
46 // | |
47 // SNP.Start SNP.Stop
48 // | |
49 // v |
50 // +---------+
51 // | started | functionally identical to stopped
52 // +---------+
53 // | ^
54 // | |
55 // SNP.Initialize SNP.Shutdown
56 // | |
57 // v |
58 // +-------------+ Virtio-net setup complete, including DRIVER_OK
59 // | initialized | bit. The receive queue is populated with
60 // +-------------+ requests; McastIpToMac, GetStatus, Transmit,
61 // Receive are callable.
62 //
63
64 typedef struct {
65 //
66 // Parts of this structure are initialized / torn down in various functions
67 // at various call depths. The table to the right should make it easier to
68 // track them.
69 //
70 // field init function
71 // ------------------ ------------------------------
72 UINT32 Signature; // VirtioNetDriverBindingStart
73 VIRTIO_DEVICE_PROTOCOL *VirtIo; // VirtioNetDriverBindingStart
74 EFI_SIMPLE_NETWORK_PROTOCOL Snp; // VirtioNetSnpPopulate
75 EFI_SIMPLE_NETWORK_MODE Snm; // VirtioNetSnpPopulate
76 EFI_EVENT ExitBoot; // VirtioNetSnpPopulate
77 EFI_DEVICE_PATH_PROTOCOL *MacDevicePath; // VirtioNetDriverBindingStart
78 EFI_HANDLE MacHandle; // VirtioNetDriverBindingStart
79
80 VRING RxRing; // VirtioNetInitRing
81 VOID *RxRingMap; // VirtioRingMap and
82 // VirtioNetInitRing
83 UINT8 *RxBuf; // VirtioNetInitRx
84 UINT16 RxLastUsed; // VirtioNetInitRx
85 UINTN RxBufNrPages; // VirtioNetInitRx
86 EFI_PHYSICAL_ADDRESS RxBufDeviceBase; // VirtioNetInitRx
87 VOID *RxBufMap; // VirtioNetInitRx
88
89 VRING TxRing; // VirtioNetInitRing
90 VOID *TxRingMap; // VirtioRingMap and
91 // VirtioNetInitRing
92 UINT16 TxMaxPending; // VirtioNetInitTx
93 UINT16 TxCurPending; // VirtioNetInitTx
94 UINT16 *TxFreeStack; // VirtioNetInitTx
95 VIRTIO_1_0_NET_REQ *TxSharedReq; // VirtioNetInitTx
96 VOID *TxSharedReqMap; // VirtioNetInitTx
97 UINT16 TxLastUsed; // VirtioNetInitTx
98 ORDERED_COLLECTION *TxBufCollection; // VirtioNetInitTx
99 } VNET_DEV;
100
101 //
102 // In order to avoid duplication of interface documentation, please find all
103 // leading comments near the respective function / variable definitions (not
104 // the declarations here), which is where your code editor of choice takes you
105 // anyway when jumping to a function.
106 //
107
108 //
109 // utility macros
110 //
111 #define VIRTIO_NET_FROM_SNP(SnpPointer) \
112 CR (SnpPointer, VNET_DEV, Snp, VNET_SIG)
113
114 #define VIRTIO_CFG_WRITE(Dev, Field, Value) ((Dev)->VirtIo->WriteDevice ( \
115 (Dev)->VirtIo, \
116 OFFSET_OF_VNET (Field), \
117 SIZE_OF_VNET (Field), \
118 (Value) \
119 ))
120
121 #define VIRTIO_CFG_READ(Dev, Field, Pointer) ((Dev)->VirtIo->ReadDevice ( \
122 (Dev)->VirtIo, \
123 OFFSET_OF_VNET (Field), \
124 SIZE_OF_VNET (Field), \
125 sizeof *(Pointer), \
126 (Pointer) \
127 ))
128
129 //
130 // component naming
131 //
132 extern EFI_COMPONENT_NAME_PROTOCOL gVirtioNetComponentName;
133 extern EFI_COMPONENT_NAME2_PROTOCOL gVirtioNetComponentName2;
134
135 //
136 // driver binding
137 //
138 extern EFI_DRIVER_BINDING_PROTOCOL gVirtioNetDriverBinding;
139
140 //
141 // member functions implementing the Simple Network Protocol
142 //
143 EFI_STATUS
144 EFIAPI
145 VirtioNetStart (
146 IN EFI_SIMPLE_NETWORK_PROTOCOL *This
147 );
148
149 EFI_STATUS
150 EFIAPI
151 VirtioNetStop (
152 IN EFI_SIMPLE_NETWORK_PROTOCOL *This
153 );
154
155 EFI_STATUS
156 EFIAPI
157 VirtioNetInitialize (
158 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
159 IN UINTN ExtraRxBufferSize OPTIONAL,
160 IN UINTN ExtraTxBufferSize OPTIONAL
161 );
162
163 EFI_STATUS
164 EFIAPI
165 VirtioNetReset (
166 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
167 IN BOOLEAN ExtendedVerification
168 );
169
170 EFI_STATUS
171 EFIAPI
172 VirtioNetShutdown (
173 IN EFI_SIMPLE_NETWORK_PROTOCOL *This
174 );
175
176 EFI_STATUS
177 EFIAPI
178 VirtioNetReceiveFilters (
179 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
180 IN UINT32 Enable,
181 IN UINT32 Disable,
182 IN BOOLEAN ResetMCastFilter,
183 IN UINTN MCastFilterCnt OPTIONAL,
184 IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL
185 );
186
187 EFI_STATUS
188 EFIAPI
189 VirtioNetStationAddress (
190 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
191 IN BOOLEAN Reset,
192 IN EFI_MAC_ADDRESS *New OPTIONAL
193 );
194
195 EFI_STATUS
196 EFIAPI
197 VirtioNetStatistics (
198 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
199 IN BOOLEAN Reset,
200 IN OUT UINTN *StatisticsSize OPTIONAL,
201 OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL
202 );
203
204 EFI_STATUS
205 EFIAPI
206 VirtioNetMcastIpToMac (
207 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
208 IN BOOLEAN IPv6,
209 IN EFI_IP_ADDRESS *Ip,
210 OUT EFI_MAC_ADDRESS *Mac
211 );
212
213 EFI_STATUS
214 EFIAPI
215 VirtioNetNvData (
216 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
217 IN BOOLEAN ReadWrite,
218 IN UINTN Offset,
219 IN UINTN BufferSize,
220 IN OUT VOID *Buffer
221 );
222
223 EFI_STATUS
224 EFIAPI
225 VirtioNetGetStatus (
226 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
227 OUT UINT32 *InterruptStatus OPTIONAL,
228 OUT VOID **TxBuf OPTIONAL
229 );
230
231 EFI_STATUS
232 EFIAPI
233 VirtioNetTransmit (
234 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
235 IN UINTN HeaderSize,
236 IN UINTN BufferSize,
237 IN /* +OUT! */ VOID *Buffer,
238 IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
239 IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,
240 IN UINT16 *Protocol OPTIONAL
241 );
242
243 EFI_STATUS
244 EFIAPI
245 VirtioNetReceive (
246 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
247 OUT UINTN *HeaderSize OPTIONAL,
248 IN OUT UINTN *BufferSize,
249 OUT VOID *Buffer,
250 OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,
251 OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,
252 OUT UINT16 *Protocol OPTIONAL
253 );
254
255 //
256 // utility functions shared by various SNP member functions
257 //
258 VOID
259 EFIAPI
260 VirtioNetShutdownRx (
261 IN OUT VNET_DEV *Dev
262 );
263
264 VOID
265 EFIAPI
266 VirtioNetShutdownTx (
267 IN OUT VNET_DEV *Dev
268 );
269
270 VOID
271 EFIAPI
272 VirtioNetUninitRing (
273 IN OUT VNET_DEV *Dev,
274 IN OUT VRING *Ring,
275 IN VOID *RingMap
276 );
277
278 //
279 // utility functions to map caller-supplied Tx buffer system physical address
280 // to a device address and vice versa
281 //
282 EFI_STATUS
283 EFIAPI
284 VirtioNetMapTxBuf (
285 IN VNET_DEV *Dev,
286 IN VOID *Buffer,
287 IN UINTN NumberOfBytes,
288 OUT EFI_PHYSICAL_ADDRESS *DeviceAddress
289 );
290
291 EFI_STATUS
292 EFIAPI
293 VirtioNetUnmapTxBuf (
294 IN VNET_DEV *Dev,
295 OUT VOID **Buffer,
296 IN EFI_PHYSICAL_ADDRESS DeviceAddress
297 );
298
299 INTN
300 EFIAPI
301 VirtioNetTxBufMapInfoCompare (
302 IN CONST VOID *UserStruct1,
303 IN CONST VOID *UserStruct2
304 );
305
306 INTN
307 EFIAPI
308 VirtioNetTxBufDeviceAddressCompare (
309 IN CONST VOID *StandaloneKey,
310 IN CONST VOID *UserStruct
311 );
312
313 //
314 // event callbacks
315 //
316 VOID
317 EFIAPI
318 VirtioNetIsPacketAvailable (
319 IN EFI_EVENT Event,
320 IN VOID *Context
321 );
322
323 VOID
324 EFIAPI
325 VirtioNetExitBoot (
326 IN EFI_EVENT Event,
327 IN VOID *Context
328 );
329
330 #endif // _VIRTIO_NET_DXE_H_