]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/VirtioNetDxe/VirtioNet.h
OvmfPkg: Apply uncrustify changes
[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 24\r
ac0a286f 25#define VNET_SIG SIGNATURE_32 ('V', 'N', 'E', 'T')\r
201cac0d
LE
26\r
27//\r
28// maximum number of pending packets, separately for each direction\r
29//\r
ac0a286f 30#define VNET_MAX_PENDING 64\r
201cac0d
LE
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
ac0a286f
MK
72 UINT32 Signature; // VirtioNetDriverBindingStart\r
73 VIRTIO_DEVICE_PROTOCOL *VirtIo; // VirtioNetDriverBindingStart\r
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
81 VOID *RxRingMap; // VirtioRingMap and\r
82 // VirtioNetInitRing\r
83 UINT8 *RxBuf; // VirtioNetInitRx\r
84 UINT16 RxLastUsed; // VirtioNetInitRx\r
85 UINTN RxBufNrPages; // VirtioNetInitRx\r
86 EFI_PHYSICAL_ADDRESS RxBufDeviceBase; // VirtioNetInitRx\r
87 VOID *RxBufMap; // VirtioNetInitRx\r
88\r
89 VRING TxRing; // VirtioNetInitRing\r
90 VOID *TxRingMap; // VirtioRingMap and\r
91 // VirtioNetInitRing\r
92 UINT16 TxMaxPending; // VirtioNetInitTx\r
93 UINT16 TxCurPending; // VirtioNetInitTx\r
94 UINT16 *TxFreeStack; // VirtioNetInitTx\r
95 VIRTIO_1_0_NET_REQ *TxSharedReq; // VirtioNetInitTx\r
96 VOID *TxSharedReqMap; // VirtioNetInitTx\r
97 UINT16 TxLastUsed; // VirtioNetInitTx\r
98 ORDERED_COLLECTION *TxBufCollection; // VirtioNetInitTx\r
201cac0d
LE
99} VNET_DEV;\r
100\r
201cac0d
LE
101//\r
102// In order to avoid duplication of interface documentation, please find all\r
103// leading comments near the respective function / variable definitions (not\r
104// the declarations here), which is where your code editor of choice takes you\r
105// anyway when jumping to a function.\r
106//\r
107\r
108//\r
109// utility macros\r
110//\r
111#define VIRTIO_NET_FROM_SNP(SnpPointer) \\r
112 CR (SnpPointer, VNET_DEV, Snp, VNET_SIG)\r
113\r
ece77e40
OM
114#define VIRTIO_CFG_WRITE(Dev, Field, Value) ((Dev)->VirtIo->WriteDevice ( \\r
115 (Dev)->VirtIo, \\r
116 OFFSET_OF_VNET (Field), \\r
117 SIZE_OF_VNET (Field), \\r
118 (Value) \\r
201cac0d
LE
119 ))\r
120\r
ac0a286f 121#define VIRTIO_CFG_READ(Dev, Field, Pointer) ((Dev)->VirtIo->ReadDevice ( \\r
ece77e40
OM
122 (Dev)->VirtIo, \\r
123 OFFSET_OF_VNET (Field), \\r
124 SIZE_OF_VNET (Field), \\r
125 sizeof *(Pointer), \\r
126 (Pointer) \\r
201cac0d
LE
127 ))\r
128\r
129//\r
130// component naming\r
131//\r
ac0a286f
MK
132extern EFI_COMPONENT_NAME_PROTOCOL gVirtioNetComponentName;\r
133extern EFI_COMPONENT_NAME2_PROTOCOL gVirtioNetComponentName2;\r
201cac0d
LE
134\r
135//\r
136// driver binding\r
137//\r
ac0a286f 138extern EFI_DRIVER_BINDING_PROTOCOL gVirtioNetDriverBinding;\r
201cac0d
LE
139\r
140//\r
141// member functions implementing the Simple Network Protocol\r
142//\r
143EFI_STATUS\r
144EFIAPI\r
145VirtioNetStart (\r
ac0a286f 146 IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
201cac0d
LE
147 );\r
148\r
149EFI_STATUS\r
150EFIAPI\r
151VirtioNetStop (\r
ac0a286f 152 IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
201cac0d
LE
153 );\r
154\r
155EFI_STATUS\r
156EFIAPI\r
157VirtioNetInitialize (\r
ac0a286f
MK
158 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
159 IN UINTN ExtraRxBufferSize OPTIONAL,\r
160 IN UINTN ExtraTxBufferSize OPTIONAL\r
201cac0d
LE
161 );\r
162\r
163EFI_STATUS\r
164EFIAPI\r
165VirtioNetReset (\r
ac0a286f
MK
166 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
167 IN BOOLEAN ExtendedVerification\r
201cac0d
LE
168 );\r
169\r
170EFI_STATUS\r
171EFIAPI\r
172VirtioNetShutdown (\r
ac0a286f 173 IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
201cac0d
LE
174 );\r
175\r
176EFI_STATUS\r
177EFIAPI\r
178VirtioNetReceiveFilters (\r
ac0a286f
MK
179 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
180 IN UINT32 Enable,\r
181 IN UINT32 Disable,\r
182 IN BOOLEAN ResetMCastFilter,\r
183 IN UINTN MCastFilterCnt OPTIONAL,\r
184 IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL\r
201cac0d
LE
185 );\r
186\r
187EFI_STATUS\r
188EFIAPI\r
189VirtioNetStationAddress (\r
ac0a286f
MK
190 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
191 IN BOOLEAN Reset,\r
192 IN EFI_MAC_ADDRESS *New OPTIONAL\r
201cac0d
LE
193 );\r
194\r
195EFI_STATUS\r
196EFIAPI\r
197VirtioNetStatistics (\r
ac0a286f
MK
198 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
199 IN BOOLEAN Reset,\r
200 IN OUT UINTN *StatisticsSize OPTIONAL,\r
201 OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL\r
201cac0d
LE
202 );\r
203\r
204EFI_STATUS\r
205EFIAPI\r
206VirtioNetMcastIpToMac (\r
ac0a286f
MK
207 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
208 IN BOOLEAN IPv6,\r
209 IN EFI_IP_ADDRESS *Ip,\r
210 OUT EFI_MAC_ADDRESS *Mac\r
201cac0d
LE
211 );\r
212\r
213EFI_STATUS\r
214EFIAPI\r
215VirtioNetNvData (\r
ac0a286f
MK
216 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
217 IN BOOLEAN ReadWrite,\r
218 IN UINTN Offset,\r
219 IN UINTN BufferSize,\r
220 IN OUT VOID *Buffer\r
201cac0d
LE
221 );\r
222\r
223EFI_STATUS\r
224EFIAPI\r
225VirtioNetGetStatus (\r
ac0a286f
MK
226 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
227 OUT UINT32 *InterruptStatus OPTIONAL,\r
228 OUT VOID **TxBuf OPTIONAL\r
201cac0d
LE
229 );\r
230\r
231EFI_STATUS\r
232EFIAPI\r
233VirtioNetTransmit (\r
ac0a286f
MK
234 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
235 IN UINTN HeaderSize,\r
236 IN UINTN BufferSize,\r
237 IN /* +OUT! */ VOID *Buffer,\r
238 IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,\r
239 IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,\r
240 IN UINT16 *Protocol OPTIONAL\r
201cac0d
LE
241 );\r
242\r
243EFI_STATUS\r
244EFIAPI\r
245VirtioNetReceive (\r
ac0a286f
MK
246 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
247 OUT UINTN *HeaderSize OPTIONAL,\r
248 IN OUT UINTN *BufferSize,\r
249 OUT VOID *Buffer,\r
250 OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,\r
251 OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,\r
252 OUT UINT16 *Protocol OPTIONAL\r
201cac0d
LE
253 );\r
254\r
255//\r
256// utility functions shared by various SNP member functions\r
257//\r
258VOID\r
259EFIAPI\r
260VirtioNetShutdownRx (\r
ac0a286f 261 IN OUT VNET_DEV *Dev\r
201cac0d
LE
262 );\r
263\r
264VOID\r
265EFIAPI\r
266VirtioNetShutdownTx (\r
ac0a286f 267 IN OUT VNET_DEV *Dev\r
201cac0d
LE
268 );\r
269\r
55dd5a67
BS
270VOID\r
271EFIAPI\r
272VirtioNetUninitRing (\r
ac0a286f
MK
273 IN OUT VNET_DEV *Dev,\r
274 IN OUT VRING *Ring,\r
275 IN VOID *RingMap\r
55dd5a67
BS
276 );\r
277\r
bd114d9f
BS
278//\r
279// utility functions to map caller-supplied Tx buffer system physical address\r
280// to a device address and vice versa\r
281//\r
282EFI_STATUS\r
283EFIAPI\r
284VirtioNetMapTxBuf (\r
285 IN VNET_DEV *Dev,\r
286 IN VOID *Buffer,\r
287 IN UINTN NumberOfBytes,\r
288 OUT EFI_PHYSICAL_ADDRESS *DeviceAddress\r
289 );\r
290\r
291EFI_STATUS\r
292EFIAPI\r
293VirtioNetUnmapTxBuf (\r
294 IN VNET_DEV *Dev,\r
295 OUT VOID **Buffer,\r
296 IN EFI_PHYSICAL_ADDRESS DeviceAddress\r
297 );\r
298\r
299INTN\r
300EFIAPI\r
301VirtioNetTxBufMapInfoCompare (\r
ac0a286f
MK
302 IN CONST VOID *UserStruct1,\r
303 IN CONST VOID *UserStruct2\r
bd114d9f
BS
304 );\r
305\r
306INTN\r
307EFIAPI\r
308VirtioNetTxBufDeviceAddressCompare (\r
ac0a286f
MK
309 IN CONST VOID *StandaloneKey,\r
310 IN CONST VOID *UserStruct\r
bd114d9f
BS
311 );\r
312\r
201cac0d
LE
313//\r
314// event callbacks\r
315//\r
316VOID\r
317EFIAPI\r
318VirtioNetIsPacketAvailable (\r
ac0a286f
MK
319 IN EFI_EVENT Event,\r
320 IN VOID *Context\r
201cac0d
LE
321 );\r
322\r
323VOID\r
324EFIAPI\r
325VirtioNetExitBoot (\r
ac0a286f
MK
326 IN EFI_EVENT Event,\r
327 IN VOID *Context\r
201cac0d
LE
328 );\r
329\r
330#endif // _VIRTIO_NET_DXE_H_\r