123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 |
- /** @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_
|