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