3 Internal definitions for the virtio-net driver, which produces Simple Network
4 Protocol instances for virtio-net devices.
6 Copyright (C) 2013, Red Hat, Inc.
7 Copyright (c) 2017, AMD Inc, All rights reserved.<BR>
9 SPDX-License-Identifier: BSD-2-Clause-Patent
12 #ifndef _VIRTIO_NET_DXE_H_
13 #define _VIRTIO_NET_DXE_H_
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>
25 #define VNET_SIG SIGNATURE_32 ('V', 'N', 'E', 'T')
28 // maximum number of pending packets, separately for each direction
30 #define VNET_MAX_PENDING 64
37 // BindingStart BindingStop
42 // +---------+ virtio-net device is reset, no resources are
43 // | stopped | allocated for traffic, but MAC address has
44 // +---------+ been retrieved
51 // | started | functionally identical to stopped
55 // SNP.Initialize SNP.Shutdown
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.
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
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
80 VRING RxRing
; // VirtioNetInitRing
81 VOID
*RxRingMap
; // VirtioRingMap and
83 UINT8
*RxBuf
; // VirtioNetInitRx
84 UINT16 RxLastUsed
; // VirtioNetInitRx
85 UINTN RxBufNrPages
; // VirtioNetInitRx
86 EFI_PHYSICAL_ADDRESS RxBufDeviceBase
; // VirtioNetInitRx
87 VOID
*RxBufMap
; // VirtioNetInitRx
89 VRING TxRing
; // VirtioNetInitRing
90 VOID
*TxRingMap
; // VirtioRingMap and
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
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.
111 #define VIRTIO_NET_FROM_SNP(SnpPointer) \
112 CR (SnpPointer, VNET_DEV, Snp, VNET_SIG)
114 #define VIRTIO_CFG_WRITE(Dev, Field, Value) ((Dev)->VirtIo->WriteDevice ( \
116 OFFSET_OF_VNET (Field), \
117 SIZE_OF_VNET (Field), \
121 #define VIRTIO_CFG_READ(Dev, Field, Pointer) ((Dev)->VirtIo->ReadDevice ( \
123 OFFSET_OF_VNET (Field), \
124 SIZE_OF_VNET (Field), \
132 extern EFI_COMPONENT_NAME_PROTOCOL gVirtioNetComponentName
;
133 extern EFI_COMPONENT_NAME2_PROTOCOL gVirtioNetComponentName2
;
138 extern EFI_DRIVER_BINDING_PROTOCOL gVirtioNetDriverBinding
;
141 // member functions implementing the Simple Network Protocol
146 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
152 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
157 VirtioNetInitialize (
158 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
159 IN UINTN ExtraRxBufferSize OPTIONAL
,
160 IN UINTN ExtraTxBufferSize OPTIONAL
166 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
167 IN BOOLEAN ExtendedVerification
173 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
178 VirtioNetReceiveFilters (
179 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
182 IN BOOLEAN ResetMCastFilter
,
183 IN UINTN MCastFilterCnt OPTIONAL
,
184 IN EFI_MAC_ADDRESS
*MCastFilter OPTIONAL
189 VirtioNetStationAddress (
190 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
192 IN EFI_MAC_ADDRESS
*New OPTIONAL
197 VirtioNetStatistics (
198 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
200 IN OUT UINTN
*StatisticsSize OPTIONAL
,
201 OUT EFI_NETWORK_STATISTICS
*StatisticsTable OPTIONAL
206 VirtioNetMcastIpToMac (
207 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
209 IN EFI_IP_ADDRESS
*Ip
,
210 OUT EFI_MAC_ADDRESS
*Mac
216 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
217 IN BOOLEAN ReadWrite
,
226 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
227 OUT UINT32
*InterruptStatus OPTIONAL
,
228 OUT VOID
**TxBuf OPTIONAL
234 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
237 IN
/* +OUT! */ VOID
*Buffer
,
238 IN EFI_MAC_ADDRESS
*SrcAddr OPTIONAL
,
239 IN EFI_MAC_ADDRESS
*DestAddr OPTIONAL
,
240 IN UINT16
*Protocol OPTIONAL
246 IN EFI_SIMPLE_NETWORK_PROTOCOL
*This
,
247 OUT UINTN
*HeaderSize OPTIONAL
,
248 IN OUT UINTN
*BufferSize
,
250 OUT EFI_MAC_ADDRESS
*SrcAddr OPTIONAL
,
251 OUT EFI_MAC_ADDRESS
*DestAddr OPTIONAL
,
252 OUT UINT16
*Protocol OPTIONAL
256 // utility functions shared by various SNP member functions
260 VirtioNetShutdownRx (
266 VirtioNetShutdownTx (
272 VirtioNetUninitRing (
273 IN OUT VNET_DEV
*Dev
,
279 // utility functions to map caller-supplied Tx buffer system physical address
280 // to a device address and vice versa
287 IN UINTN NumberOfBytes
,
288 OUT EFI_PHYSICAL_ADDRESS
*DeviceAddress
293 VirtioNetUnmapTxBuf (
296 IN EFI_PHYSICAL_ADDRESS DeviceAddress
301 VirtioNetTxBufMapInfoCompare (
302 IN CONST VOID
*UserStruct1
,
303 IN CONST VOID
*UserStruct2
308 VirtioNetTxBufDeviceAddressCompare (
309 IN CONST VOID
*StandaloneKey
,
310 IN CONST VOID
*UserStruct
318 VirtioNetIsPacketAvailable (
330 #endif // _VIRTIO_NET_DXE_H_