]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/VirtioNetDxe/VirtioNet.h
OvmfPkg/VirtioNetDxe: map VRINGs using VirtioRingMap()
[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
7\r
8 This program and the accompanying materials are licensed and made available\r
9 under the terms and conditions of the BSD License which accompanies this\r
10 distribution. The full text of the license may be found at\r
11 http://opensource.org/licenses/bsd-license.php\r
12\r
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
14 WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
15**/\r
16\r
17#ifndef _VIRTIO_NET_DXE_H_\r
18#define _VIRTIO_NET_DXE_H_\r
19\r
20#include <IndustryStandard/VirtioNet.h>\r
21#include <Library/DebugLib.h>\r
22#include <Library/VirtioLib.h>\r
23#include <Protocol/ComponentName.h>\r
24#include <Protocol/ComponentName2.h>\r
25#include <Protocol/DevicePath.h>\r
26#include <Protocol/DriverBinding.h>\r
201cac0d
LE
27#include <Protocol/SimpleNetwork.h>\r
28\r
29#define VNET_SIG SIGNATURE_32 ('V', 'N', 'E', 'T')\r
30\r
31//\r
32// maximum number of pending packets, separately for each direction\r
33//\r
34#define VNET_MAX_PENDING 64\r
35\r
36//\r
37// State diagram:\r
38//\r
39// | ^\r
40// | |\r
41// BindingStart BindingStop\r
42// +SnpPopulate |\r
43// ++GetFeatures |\r
44// | |\r
45// v |\r
46// +---------+ virtio-net device is reset, no resources are\r
47// | stopped | allocated for traffic, but MAC address has\r
48// +---------+ been retrieved\r
49// | ^\r
50// | |\r
51// SNP.Start SNP.Stop\r
52// | |\r
53// v |\r
54// +---------+\r
55// | started | functionally identical to stopped\r
56// +---------+\r
57// | ^\r
58// | |\r
59// SNP.Initialize SNP.Shutdown\r
60// | |\r
61// v |\r
62// +-------------+ Virtio-net setup complete, including DRIVER_OK\r
63// | initialized | bit. The receive queue is populated with\r
64// +-------------+ requests; McastIpToMac, GetStatus, Transmit,\r
65// Receive are callable.\r
66//\r
67\r
68typedef struct {\r
69 //\r
70 // Parts of this structure are initialized / torn down in various functions\r
71 // at various call depths. The table to the right should make it easier to\r
72 // track them.\r
73 //\r
74 // field init function\r
75 // ------------------ ------------------------------\r
76 UINT32 Signature; // VirtioNetDriverBindingStart\r
56f65ed8 77 VIRTIO_DEVICE_PROTOCOL *VirtIo; // VirtioNetDriverBindingStart\r
201cac0d
LE
78 EFI_SIMPLE_NETWORK_PROTOCOL Snp; // VirtioNetSnpPopulate\r
79 EFI_SIMPLE_NETWORK_MODE Snm; // VirtioNetSnpPopulate\r
80 EFI_EVENT ExitBoot; // VirtioNetSnpPopulate\r
81 EFI_DEVICE_PATH_PROTOCOL *MacDevicePath; // VirtioNetDriverBindingStart\r
82 EFI_HANDLE MacHandle; // VirtioNetDriverBindingStart\r
83\r
84 VRING RxRing; // VirtioNetInitRing\r
940baec0
BS
85 VOID *RxRingMap; // VirtioRingMap and\r
86 // VirtioNetInitRing\r
201cac0d
LE
87 UINT8 *RxBuf; // VirtioNetInitRx\r
88 UINT16 RxLastUsed; // VirtioNetInitRx\r
89\r
90 VRING TxRing; // VirtioNetInitRing\r
940baec0
BS
91 VOID *TxRingMap; // VirtioRingMap and\r
92 // VirtioNetInitRing\r
201cac0d
LE
93 UINT16 TxMaxPending; // VirtioNetInitTx\r
94 UINT16 TxCurPending; // VirtioNetInitTx\r
95 UINT16 *TxFreeStack; // VirtioNetInitTx\r
c6e2d064 96 VIRTIO_1_0_NET_REQ TxSharedReq; // VirtioNetInitTx\r
201cac0d
LE
97 UINT16 TxLastUsed; // VirtioNetInitTx\r
98} VNET_DEV;\r
99\r
100\r
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
ece77e40
OM
121#define VIRTIO_CFG_READ(Dev, Field, Pointer) ((Dev)->VirtIo->ReadDevice ( \\r
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
132extern EFI_COMPONENT_NAME_PROTOCOL gVirtioNetComponentName;\r
133extern EFI_COMPONENT_NAME2_PROTOCOL gVirtioNetComponentName2;\r
134\r
135//\r
136// driver binding\r
137//\r
138extern EFI_DRIVER_BINDING_PROTOCOL gVirtioNetDriverBinding;\r
139\r
140//\r
141// member functions implementing the Simple Network Protocol\r
142//\r
143EFI_STATUS\r
144EFIAPI\r
145VirtioNetStart (\r
146 IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
147 );\r
148\r
149EFI_STATUS\r
150EFIAPI\r
151VirtioNetStop (\r
152 IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
153 );\r
154\r
155EFI_STATUS\r
156EFIAPI\r
157VirtioNetInitialize (\r
158 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
159 IN UINTN ExtraRxBufferSize OPTIONAL,\r
160 IN UINTN ExtraTxBufferSize OPTIONAL\r
161 );\r
162\r
163EFI_STATUS\r
164EFIAPI\r
165VirtioNetReset (\r
166 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
167 IN BOOLEAN ExtendedVerification\r
168 );\r
169\r
170EFI_STATUS\r
171EFIAPI\r
172VirtioNetShutdown (\r
173 IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
174 );\r
175\r
176EFI_STATUS\r
177EFIAPI\r
178VirtioNetReceiveFilters (\r
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
185 );\r
186\r
187EFI_STATUS\r
188EFIAPI\r
189VirtioNetStationAddress (\r
190 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
191 IN BOOLEAN Reset,\r
192 IN EFI_MAC_ADDRESS *New OPTIONAL\r
193 );\r
194\r
195EFI_STATUS\r
196EFIAPI\r
197VirtioNetStatistics (\r
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
202 );\r
203\r
204EFI_STATUS\r
205EFIAPI\r
206VirtioNetMcastIpToMac (\r
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
211 );\r
212\r
213EFI_STATUS\r
214EFIAPI\r
215VirtioNetNvData (\r
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
221 );\r
222\r
223EFI_STATUS\r
224EFIAPI\r
225VirtioNetGetStatus (\r
226 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
227 OUT UINT32 *InterruptStatus OPTIONAL,\r
228 OUT VOID **TxBuf OPTIONAL\r
229 );\r
230\r
231EFI_STATUS\r
232EFIAPI\r
233VirtioNetTransmit (\r
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
241 );\r
242\r
243EFI_STATUS\r
244EFIAPI\r
245VirtioNetReceive (\r
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
253 );\r
254\r
255//\r
256// utility functions shared by various SNP member functions\r
257//\r
258VOID\r
259EFIAPI\r
260VirtioNetShutdownRx (\r
261 IN OUT VNET_DEV *Dev\r
262 );\r
263\r
264VOID\r
265EFIAPI\r
266VirtioNetShutdownTx (\r
267 IN OUT VNET_DEV *Dev\r
268 );\r
269\r
55dd5a67
BS
270VOID\r
271EFIAPI\r
272VirtioNetUninitRing (\r
273 IN OUT VNET_DEV *Dev,\r
940baec0
BS
274 IN OUT VRING *Ring,\r
275 IN VOID *RingMap\r
55dd5a67
BS
276 );\r
277\r
201cac0d
LE
278//\r
279// event callbacks\r
280//\r
281VOID\r
282EFIAPI\r
283VirtioNetIsPacketAvailable (\r
284 IN EFI_EVENT Event,\r
285 IN VOID *Context\r
286 );\r
287\r
288VOID\r
289EFIAPI\r
290VirtioNetExitBoot (\r
291 IN EFI_EVENT Event,\r
292 IN VOID *Context\r
293 );\r
294\r
295#endif // _VIRTIO_NET_DXE_H_\r