Protocol instances for virtio-net devices.\r
\r
Copyright (C) 2013, Red Hat, Inc.\r
+ Copyright (c) 2017, AMD Inc, All rights reserved.<BR>\r
\r
- This program and the accompanying materials are licensed and made available\r
- under the terms and conditions of the BSD License which accompanies this\r
- distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
- WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
**/\r
\r
#ifndef _VIRTIO_NET_DXE_H_\r
#include <Protocol/DevicePath.h>\r
#include <Protocol/DriverBinding.h>\r
#include <Protocol/SimpleNetwork.h>\r
+#include <Library/OrderedCollectionLib.h>\r
\r
-#define VNET_SIG SIGNATURE_32 ('V', 'N', 'E', 'T')\r
+#define VNET_SIG SIGNATURE_32 ('V', 'N', 'E', 'T')\r
\r
//\r
// maximum number of pending packets, separately for each direction\r
//\r
-#define VNET_MAX_PENDING 64\r
+#define VNET_MAX_PENDING 64\r
\r
//\r
// State diagram:\r
//\r
// field init function\r
// ------------------ ------------------------------\r
- UINT32 Signature; // VirtioNetDriverBindingStart\r
- VIRTIO_DEVICE_PROTOCOL *VirtIo; // VirtioNetDriverBindingStart\r
- EFI_SIMPLE_NETWORK_PROTOCOL Snp; // VirtioNetSnpPopulate\r
- EFI_SIMPLE_NETWORK_MODE Snm; // VirtioNetSnpPopulate\r
- EFI_EVENT ExitBoot; // VirtioNetSnpPopulate\r
- EFI_DEVICE_PATH_PROTOCOL *MacDevicePath; // VirtioNetDriverBindingStart\r
- EFI_HANDLE MacHandle; // VirtioNetDriverBindingStart\r
-\r
- VRING RxRing; // VirtioNetInitRing\r
- VOID *RxRingMap; // VirtioRingMap and\r
- // VirtioNetInitRing\r
- UINT8 *RxBuf; // VirtioNetInitRx\r
- UINT16 RxLastUsed; // VirtioNetInitRx\r
-\r
- VRING TxRing; // VirtioNetInitRing\r
- VOID *TxRingMap; // VirtioRingMap and\r
- // VirtioNetInitRing\r
- UINT16 TxMaxPending; // VirtioNetInitTx\r
- UINT16 TxCurPending; // VirtioNetInitTx\r
- UINT16 *TxFreeStack; // VirtioNetInitTx\r
- VIRTIO_1_0_NET_REQ TxSharedReq; // VirtioNetInitTx\r
- UINT16 TxLastUsed; // VirtioNetInitTx\r
+ UINT32 Signature; // VirtioNetDriverBindingStart\r
+ VIRTIO_DEVICE_PROTOCOL *VirtIo; // VirtioNetDriverBindingStart\r
+ EFI_SIMPLE_NETWORK_PROTOCOL Snp; // VirtioNetSnpPopulate\r
+ EFI_SIMPLE_NETWORK_MODE Snm; // VirtioNetSnpPopulate\r
+ EFI_EVENT ExitBoot; // VirtioNetSnpPopulate\r
+ EFI_DEVICE_PATH_PROTOCOL *MacDevicePath; // VirtioNetDriverBindingStart\r
+ EFI_HANDLE MacHandle; // VirtioNetDriverBindingStart\r
+\r
+ VRING RxRing; // VirtioNetInitRing\r
+ VOID *RxRingMap; // VirtioRingMap and\r
+ // VirtioNetInitRing\r
+ UINT8 *RxBuf; // VirtioNetInitRx\r
+ UINT16 RxLastUsed; // VirtioNetInitRx\r
+ UINTN RxBufNrPages; // VirtioNetInitRx\r
+ EFI_PHYSICAL_ADDRESS RxBufDeviceBase; // VirtioNetInitRx\r
+ VOID *RxBufMap; // VirtioNetInitRx\r
+\r
+ VRING TxRing; // VirtioNetInitRing\r
+ VOID *TxRingMap; // VirtioRingMap and\r
+ // VirtioNetInitRing\r
+ UINT16 TxMaxPending; // VirtioNetInitTx\r
+ UINT16 TxCurPending; // VirtioNetInitTx\r
+ UINT16 *TxFreeStack; // VirtioNetInitTx\r
+ VIRTIO_1_0_NET_REQ *TxSharedReq; // VirtioNetInitTx\r
+ VOID *TxSharedReqMap; // VirtioNetInitTx\r
+ UINT16 TxLastUsed; // VirtioNetInitTx\r
+ ORDERED_COLLECTION *TxBufCollection; // VirtioNetInitTx\r
} VNET_DEV;\r
\r
-\r
//\r
// In order to avoid duplication of interface documentation, please find all\r
// leading comments near the respective function / variable definitions (not\r
(Value) \\r
))\r
\r
-#define VIRTIO_CFG_READ(Dev, Field, Pointer) ((Dev)->VirtIo->ReadDevice ( \\r
+#define VIRTIO_CFG_READ(Dev, Field, Pointer) ((Dev)->VirtIo->ReadDevice ( \\r
(Dev)->VirtIo, \\r
OFFSET_OF_VNET (Field), \\r
SIZE_OF_VNET (Field), \\r
//\r
// component naming\r
//\r
-extern EFI_COMPONENT_NAME_PROTOCOL gVirtioNetComponentName;\r
-extern EFI_COMPONENT_NAME2_PROTOCOL gVirtioNetComponentName2;\r
+extern EFI_COMPONENT_NAME_PROTOCOL gVirtioNetComponentName;\r
+extern EFI_COMPONENT_NAME2_PROTOCOL gVirtioNetComponentName2;\r
\r
//\r
// driver binding\r
//\r
-extern EFI_DRIVER_BINDING_PROTOCOL gVirtioNetDriverBinding;\r
+extern EFI_DRIVER_BINDING_PROTOCOL gVirtioNetDriverBinding;\r
\r
//\r
// member functions implementing the Simple Network Protocol\r
EFI_STATUS\r
EFIAPI\r
VirtioNetStart (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioNetStop (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioNetInitialize (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
- IN UINTN ExtraRxBufferSize OPTIONAL,\r
- IN UINTN ExtraTxBufferSize OPTIONAL\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
+ IN UINTN ExtraRxBufferSize OPTIONAL,\r
+ IN UINTN ExtraTxBufferSize OPTIONAL\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioNetReset (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
- IN BOOLEAN ExtendedVerification\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
+ IN BOOLEAN ExtendedVerification\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioNetShutdown (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioNetReceiveFilters (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
- IN UINT32 Enable,\r
- IN UINT32 Disable,\r
- IN BOOLEAN ResetMCastFilter,\r
- IN UINTN MCastFilterCnt OPTIONAL,\r
- IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
+ IN UINT32 Enable,\r
+ IN UINT32 Disable,\r
+ IN BOOLEAN ResetMCastFilter,\r
+ IN UINTN MCastFilterCnt OPTIONAL,\r
+ IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioNetStationAddress (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
- IN BOOLEAN Reset,\r
- IN EFI_MAC_ADDRESS *New OPTIONAL\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
+ IN BOOLEAN Reset,\r
+ IN EFI_MAC_ADDRESS *New OPTIONAL\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioNetStatistics (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
- IN BOOLEAN Reset,\r
- IN OUT UINTN *StatisticsSize OPTIONAL,\r
- OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
+ IN BOOLEAN Reset,\r
+ IN OUT UINTN *StatisticsSize OPTIONAL,\r
+ OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioNetMcastIpToMac (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
- IN BOOLEAN IPv6,\r
- IN EFI_IP_ADDRESS *Ip,\r
- OUT EFI_MAC_ADDRESS *Mac\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
+ IN BOOLEAN IPv6,\r
+ IN EFI_IP_ADDRESS *Ip,\r
+ OUT EFI_MAC_ADDRESS *Mac\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioNetNvData (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
- IN BOOLEAN ReadWrite,\r
- IN UINTN Offset,\r
- IN UINTN BufferSize,\r
- IN OUT VOID *Buffer\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
+ IN BOOLEAN ReadWrite,\r
+ IN UINTN Offset,\r
+ IN UINTN BufferSize,\r
+ IN OUT VOID *Buffer\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioNetGetStatus (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
- OUT UINT32 *InterruptStatus OPTIONAL,\r
- OUT VOID **TxBuf OPTIONAL\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
+ OUT UINT32 *InterruptStatus OPTIONAL,\r
+ OUT VOID **TxBuf OPTIONAL\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioNetTransmit (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
- IN UINTN HeaderSize,\r
- IN UINTN BufferSize,\r
- IN /* +OUT! */ VOID *Buffer,\r
- IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,\r
- IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,\r
- IN UINT16 *Protocol OPTIONAL\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
+ IN UINTN HeaderSize,\r
+ IN UINTN BufferSize,\r
+ IN /* +OUT! */ VOID *Buffer,\r
+ IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL,\r
+ IN EFI_MAC_ADDRESS *DestAddr OPTIONAL,\r
+ IN UINT16 *Protocol OPTIONAL\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
VirtioNetReceive (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
- OUT UINTN *HeaderSize OPTIONAL,\r
- IN OUT UINTN *BufferSize,\r
- OUT VOID *Buffer,\r
- OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,\r
- OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,\r
- OUT UINT16 *Protocol OPTIONAL\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
+ OUT UINTN *HeaderSize OPTIONAL,\r
+ IN OUT UINTN *BufferSize,\r
+ OUT VOID *Buffer,\r
+ OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL,\r
+ OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL,\r
+ OUT UINT16 *Protocol OPTIONAL\r
);\r
\r
//\r
VOID\r
EFIAPI\r
VirtioNetShutdownRx (\r
- IN OUT VNET_DEV *Dev\r
+ IN OUT VNET_DEV *Dev\r
);\r
\r
VOID\r
EFIAPI\r
VirtioNetShutdownTx (\r
- IN OUT VNET_DEV *Dev\r
+ IN OUT VNET_DEV *Dev\r
);\r
\r
VOID\r
EFIAPI\r
VirtioNetUninitRing (\r
- IN OUT VNET_DEV *Dev,\r
- IN OUT VRING *Ring,\r
- IN VOID *RingMap\r
+ IN OUT VNET_DEV *Dev,\r
+ IN OUT VRING *Ring,\r
+ IN VOID *RingMap\r
+ );\r
+\r
+//\r
+// utility functions to map caller-supplied Tx buffer system physical address\r
+// to a device address and vice versa\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+VirtioNetMapTxBuf (\r
+ IN VNET_DEV *Dev,\r
+ IN VOID *Buffer,\r
+ IN UINTN NumberOfBytes,\r
+ OUT EFI_PHYSICAL_ADDRESS *DeviceAddress\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+VirtioNetUnmapTxBuf (\r
+ IN VNET_DEV *Dev,\r
+ OUT VOID **Buffer,\r
+ IN EFI_PHYSICAL_ADDRESS DeviceAddress\r
+ );\r
+\r
+INTN\r
+EFIAPI\r
+VirtioNetTxBufMapInfoCompare (\r
+ IN CONST VOID *UserStruct1,\r
+ IN CONST VOID *UserStruct2\r
+ );\r
+\r
+INTN\r
+EFIAPI\r
+VirtioNetTxBufDeviceAddressCompare (\r
+ IN CONST VOID *StandaloneKey,\r
+ IN CONST VOID *UserStruct\r
);\r
\r
//\r
VOID\r
EFIAPI\r
VirtioNetIsPacketAvailable (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
);\r
\r
VOID\r
EFIAPI\r
VirtioNetExitBoot (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
);\r
\r
#endif // _VIRTIO_NET_DXE_H_\r