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