/** @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.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _VIRTIO_NET_DXE_H_ #define _VIRTIO_NET_DXE_H_ #include #include #include #include #include #include #include #include #include #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_