https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
		
			
				
	
	
		
			333 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			333 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| 
 | |
|   Internal definitions for the virtio-net driver, which produces Simple Network
 | |
|   Protocol instances for virtio-net devices.
 | |
| 
 | |
|   Copyright (C) 2013, Red Hat, Inc.
 | |
|   Copyright (c) 2017, AMD Inc, All rights reserved.<BR>
 | |
| 
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| **/
 | |
| 
 | |
| #ifndef _VIRTIO_NET_DXE_H_
 | |
| #define _VIRTIO_NET_DXE_H_
 | |
| 
 | |
| #include <IndustryStandard/VirtioNet.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/VirtioLib.h>
 | |
| #include <Protocol/ComponentName.h>
 | |
| #include <Protocol/ComponentName2.h>
 | |
| #include <Protocol/DevicePath.h>
 | |
| #include <Protocol/DriverBinding.h>
 | |
| #include <Protocol/SimpleNetwork.h>
 | |
| #include <Library/OrderedCollectionLib.h>
 | |
| 
 | |
| #define VNET_SIG SIGNATURE_32 ('V', 'N', 'E', 'T')
 | |
| 
 | |
| //
 | |
| // maximum number of pending packets, separately for each direction
 | |
| //
 | |
| #define VNET_MAX_PENDING 64
 | |
| 
 | |
| //
 | |
| // State diagram:
 | |
| //
 | |
| //                  |     ^
 | |
| //                  |     |
 | |
| //        BindingStart  BindingStop
 | |
| //        +SnpPopulate    |
 | |
| //        ++GetFeatures   |
 | |
| //                  |     |
 | |
| //                  v     |
 | |
| //                +---------+    virtio-net device is reset, no resources are
 | |
| //                | stopped |    allocated for traffic, but MAC address has
 | |
| //                +---------+    been retrieved
 | |
| //                  |     ^
 | |
| //                  |     |
 | |
| //            SNP.Start SNP.Stop
 | |
| //                  |     |
 | |
| //                  v     |
 | |
| //                +---------+
 | |
| //                | started |    functionally identical to stopped
 | |
| //                +---------+
 | |
| //                  |     ^
 | |
| //                  |     |
 | |
| //       SNP.Initialize SNP.Shutdown
 | |
| //                  |     |
 | |
| //                  v     |
 | |
| //              +-------------+  Virtio-net setup complete, including DRIVER_OK
 | |
| //              | initialized |  bit. The receive queue is populated with
 | |
| //              +-------------+  requests; McastIpToMac, GetStatus, Transmit,
 | |
| //                               Receive are callable.
 | |
| //
 | |
| 
 | |
| typedef struct {
 | |
|   //
 | |
|   // Parts of this structure are initialized / torn down in various functions
 | |
|   // at various call depths. The table to the right should make it easier to
 | |
|   // track them.
 | |
|   //
 | |
|   //                          field              init function
 | |
|   //                          ------------------ ------------------------------
 | |
|   UINT32                      Signature;         // VirtioNetDriverBindingStart
 | |
|   VIRTIO_DEVICE_PROTOCOL      *VirtIo;           // VirtioNetDriverBindingStart
 | |
|   EFI_SIMPLE_NETWORK_PROTOCOL Snp;               // VirtioNetSnpPopulate
 | |
|   EFI_SIMPLE_NETWORK_MODE     Snm;               // VirtioNetSnpPopulate
 | |
|   EFI_EVENT                   ExitBoot;          // VirtioNetSnpPopulate
 | |
|   EFI_DEVICE_PATH_PROTOCOL    *MacDevicePath;    // VirtioNetDriverBindingStart
 | |
|   EFI_HANDLE                  MacHandle;         // VirtioNetDriverBindingStart
 | |
| 
 | |
|   VRING                       RxRing;            // VirtioNetInitRing
 | |
|   VOID                        *RxRingMap;        // VirtioRingMap and
 | |
|                                                  // VirtioNetInitRing
 | |
|   UINT8                       *RxBuf;            // VirtioNetInitRx
 | |
|   UINT16                      RxLastUsed;        // VirtioNetInitRx
 | |
|   UINTN                       RxBufNrPages;      // VirtioNetInitRx
 | |
|   EFI_PHYSICAL_ADDRESS        RxBufDeviceBase;   // VirtioNetInitRx
 | |
|   VOID                        *RxBufMap;         // VirtioNetInitRx
 | |
| 
 | |
|   VRING                       TxRing;            // VirtioNetInitRing
 | |
|   VOID                        *TxRingMap;        // VirtioRingMap and
 | |
|                                                  // VirtioNetInitRing
 | |
|   UINT16                      TxMaxPending;      // VirtioNetInitTx
 | |
|   UINT16                      TxCurPending;      // VirtioNetInitTx
 | |
|   UINT16                      *TxFreeStack;      // VirtioNetInitTx
 | |
|   VIRTIO_1_0_NET_REQ          *TxSharedReq;      // VirtioNetInitTx
 | |
|   VOID                        *TxSharedReqMap;   // VirtioNetInitTx
 | |
|   UINT16                      TxLastUsed;        // VirtioNetInitTx
 | |
|   ORDERED_COLLECTION          *TxBufCollection;  // VirtioNetInitTx
 | |
| } VNET_DEV;
 | |
| 
 | |
| 
 | |
| //
 | |
| // In order to avoid duplication of interface documentation, please find all
 | |
| // leading comments near the respective function / variable definitions (not
 | |
| // the declarations here), which is where your code editor of choice takes you
 | |
| // anyway when jumping to a function.
 | |
| //
 | |
| 
 | |
| //
 | |
| // utility macros
 | |
| //
 | |
| #define VIRTIO_NET_FROM_SNP(SnpPointer) \
 | |
|         CR (SnpPointer, VNET_DEV, Snp, VNET_SIG)
 | |
| 
 | |
| #define VIRTIO_CFG_WRITE(Dev, Field, Value)  ((Dev)->VirtIo->WriteDevice (  \
 | |
|                                                 (Dev)->VirtIo,              \
 | |
|                                                 OFFSET_OF_VNET (Field),     \
 | |
|                                                 SIZE_OF_VNET (Field),       \
 | |
|                                                 (Value)                     \
 | |
|                                                 ))
 | |
| 
 | |
| #define VIRTIO_CFG_READ(Dev, Field, Pointer) ((Dev)->VirtIo->ReadDevice (   \
 | |
|                                                 (Dev)->VirtIo,              \
 | |
|                                                 OFFSET_OF_VNET (Field),     \
 | |
|                                                 SIZE_OF_VNET (Field),       \
 | |
|                                                 sizeof *(Pointer),          \
 | |
|                                                 (Pointer)                   \
 | |
|                                                 ))
 | |
| 
 | |
| //
 | |
| // component naming
 | |
| //
 | |
| extern EFI_COMPONENT_NAME_PROTOCOL gVirtioNetComponentName;
 | |
| extern EFI_COMPONENT_NAME2_PROTOCOL gVirtioNetComponentName2;
 | |
| 
 | |
| //
 | |
| // driver binding
 | |
| //
 | |
| extern EFI_DRIVER_BINDING_PROTOCOL gVirtioNetDriverBinding;
 | |
| 
 | |
| //
 | |
| // member functions implementing the Simple Network Protocol
 | |
| //
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetStart (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *This
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetStop (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *This
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetInitialize (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
 | |
|   IN UINTN                       ExtraRxBufferSize  OPTIONAL,
 | |
|   IN UINTN                       ExtraTxBufferSize  OPTIONAL
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetReset (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
 | |
|   IN BOOLEAN                     ExtendedVerification
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetShutdown (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *This
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetReceiveFilters (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
 | |
|   IN UINT32                      Enable,
 | |
|   IN UINT32                      Disable,
 | |
|   IN BOOLEAN                     ResetMCastFilter,
 | |
|   IN UINTN                       MCastFilterCnt    OPTIONAL,
 | |
|   IN EFI_MAC_ADDRESS             *MCastFilter      OPTIONAL
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetStationAddress (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
 | |
|   IN BOOLEAN                     Reset,
 | |
|   IN EFI_MAC_ADDRESS             *New OPTIONAL
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetStatistics (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
 | |
|   IN BOOLEAN                     Reset,
 | |
|   IN OUT UINTN                   *StatisticsSize   OPTIONAL,
 | |
|   OUT EFI_NETWORK_STATISTICS     *StatisticsTable  OPTIONAL
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetMcastIpToMac (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
 | |
|   IN BOOLEAN                     IPv6,
 | |
|   IN EFI_IP_ADDRESS              *Ip,
 | |
|   OUT EFI_MAC_ADDRESS            *Mac
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetNvData (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
 | |
|   IN BOOLEAN                     ReadWrite,
 | |
|   IN UINTN                       Offset,
 | |
|   IN UINTN                       BufferSize,
 | |
|   IN OUT VOID                    *Buffer
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetGetStatus (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
 | |
|   OUT UINT32                     *InterruptStatus OPTIONAL,
 | |
|   OUT VOID                       **TxBuf OPTIONAL
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetTransmit (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
 | |
|   IN UINTN                       HeaderSize,
 | |
|   IN UINTN                       BufferSize,
 | |
|   IN /* +OUT! */ VOID            *Buffer,
 | |
|   IN EFI_MAC_ADDRESS             *SrcAddr  OPTIONAL,
 | |
|   IN EFI_MAC_ADDRESS             *DestAddr OPTIONAL,
 | |
|   IN UINT16                      *Protocol OPTIONAL
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetReceive (
 | |
|   IN EFI_SIMPLE_NETWORK_PROTOCOL *This,
 | |
|   OUT UINTN                      *HeaderSize OPTIONAL,
 | |
|   IN OUT UINTN                   *BufferSize,
 | |
|   OUT VOID                       *Buffer,
 | |
|   OUT EFI_MAC_ADDRESS            *SrcAddr    OPTIONAL,
 | |
|   OUT EFI_MAC_ADDRESS            *DestAddr   OPTIONAL,
 | |
|   OUT UINT16                     *Protocol   OPTIONAL
 | |
|   );
 | |
| 
 | |
| //
 | |
| // utility functions shared by various SNP member functions
 | |
| //
 | |
| VOID
 | |
| EFIAPI
 | |
| VirtioNetShutdownRx (
 | |
|   IN OUT VNET_DEV *Dev
 | |
|   );
 | |
| 
 | |
| VOID
 | |
| EFIAPI
 | |
| VirtioNetShutdownTx (
 | |
|   IN OUT VNET_DEV *Dev
 | |
|   );
 | |
| 
 | |
| VOID
 | |
| EFIAPI
 | |
| VirtioNetUninitRing (
 | |
|   IN OUT VNET_DEV *Dev,
 | |
|   IN OUT VRING    *Ring,
 | |
|   IN     VOID     *RingMap
 | |
|   );
 | |
| 
 | |
| //
 | |
| // utility functions to map caller-supplied Tx buffer system physical address
 | |
| // to a device address and vice versa
 | |
| //
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetMapTxBuf (
 | |
|   IN  VNET_DEV              *Dev,
 | |
|   IN  VOID                  *Buffer,
 | |
|   IN  UINTN                 NumberOfBytes,
 | |
|   OUT EFI_PHYSICAL_ADDRESS  *DeviceAddress
 | |
|   );
 | |
| 
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| VirtioNetUnmapTxBuf (
 | |
|   IN  VNET_DEV              *Dev,
 | |
|   OUT VOID                  **Buffer,
 | |
|   IN  EFI_PHYSICAL_ADDRESS  DeviceAddress
 | |
|   );
 | |
| 
 | |
| INTN
 | |
| EFIAPI
 | |
| VirtioNetTxBufMapInfoCompare (
 | |
|   IN CONST VOID *UserStruct1,
 | |
|   IN CONST VOID *UserStruct2
 | |
|   );
 | |
| 
 | |
| INTN
 | |
| EFIAPI
 | |
| VirtioNetTxBufDeviceAddressCompare (
 | |
|   IN CONST VOID *StandaloneKey,
 | |
|   IN CONST VOID *UserStruct
 | |
|   );
 | |
| 
 | |
| 
 | |
| //
 | |
| // event callbacks
 | |
| //
 | |
| VOID
 | |
| EFIAPI
 | |
| VirtioNetIsPacketAvailable (
 | |
|   IN  EFI_EVENT Event,
 | |
|   IN  VOID      *Context
 | |
|   );
 | |
| 
 | |
| VOID
 | |
| EFIAPI
 | |
| VirtioNetExitBoot (
 | |
|   IN  EFI_EVENT Event,
 | |
|   IN  VOID      *Context
 | |
|   );
 | |
| 
 | |
| #endif // _VIRTIO_NET_DXE_H_
 |