/** @file Internal definitions for the virtio-net driver, which produces Simple Network Protocol instances for virtio-net devices. Copyright (c) 2021-2024, Oracle and/or its affiliates. Copyright (c) 2017, AMD Inc, All rights reserved. Copyright (C) 2013, Red Hat, Inc.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _E1K_NET_DXE_H_ #define _E1K_NET_DXE_H_ #include #include #include #include #include #include #include #include #include #include "E1kNetHw.h" #define E1K_NET_DEV_SIGNATURE SIGNATURE_32 ('E','1','K','N') // // maximum number of pending packets, separately for each direction // #define E1K_NET_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 EFI_PCI_IO_PROTOCOL *PciIo; // VirtioNetDriverBindingStart UINT64 OriginalPciAttributes; // 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 E1K_RX_DESC *RxRing; // VirtioNetInitRing UINT8 *RxBuf; // E1kNetInitRx UINT32 RdhLastSeen; // E1kNetInitRx UINTN RxBufNrPages; // E1kNetInitRx EFI_PHYSICAL_ADDRESS RxBufDeviceBase; // E1kNetInitRx EFI_PHYSICAL_ADDRESS RxDeviceBase; // E1kNetInitRx VOID *RxMap; // E1kNetInitRx UINT16 TxMaxPending; // E1kNetInitTx UINT16 TxCurPending; // E1kNetInitTx E1K_TX_DESC *TxRing; // E1kNetInitTx VOID *TxRingMap; // E1kNetInitTx UINT16 TxLastUsed; // E1kNetInitTx UINT32 TdhLastSeen; // E1kNetInitTx ORDERED_COLLECTION *TxBufCollection; // E1kNetInitTx } E1K_NET_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 E1K_NET_FROM_SNP(SnpPointer) \ CR (SnpPointer, E1K_NET_DEV, Snp, E1K_NET_DEV_SIGNATURE) // // component naming // extern EFI_COMPONENT_NAME_PROTOCOL gE1kNetComponentName; extern EFI_COMPONENT_NAME2_PROTOCOL gE1kNetComponentName2; // // driver binding // extern EFI_DRIVER_BINDING_PROTOCOL gE1kNetDriverBinding; // // member functions implementing the Simple Network Protocol // EFI_STATUS EFIAPI E1kNetStart ( IN EFI_SIMPLE_NETWORK_PROTOCOL *This ); EFI_STATUS EFIAPI E1kNetStop ( IN EFI_SIMPLE_NETWORK_PROTOCOL *This ); EFI_STATUS EFIAPI E1kNetInitialize ( IN EFI_SIMPLE_NETWORK_PROTOCOL *This, IN UINTN ExtraRxBufferSize OPTIONAL, IN UINTN ExtraTxBufferSize OPTIONAL ); EFI_STATUS EFIAPI E1kNetReset ( IN EFI_SIMPLE_NETWORK_PROTOCOL *This, IN BOOLEAN ExtendedVerification ); EFI_STATUS EFIAPI E1kNetShutdown ( IN EFI_SIMPLE_NETWORK_PROTOCOL *This ); EFI_STATUS EFIAPI E1kNetReceiveFilters ( 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 E1kNetStationAddress ( IN EFI_SIMPLE_NETWORK_PROTOCOL *This, IN BOOLEAN Reset, IN EFI_MAC_ADDRESS *New OPTIONAL ); EFI_STATUS EFIAPI E1kNetStatistics ( IN EFI_SIMPLE_NETWORK_PROTOCOL *This, IN BOOLEAN Reset, IN OUT UINTN *StatisticsSize OPTIONAL, OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL ); EFI_STATUS EFIAPI E1kNetMcastIpToMac ( IN EFI_SIMPLE_NETWORK_PROTOCOL *This, IN BOOLEAN IPv6, IN EFI_IP_ADDRESS *Ip, OUT EFI_MAC_ADDRESS *Mac ); EFI_STATUS EFIAPI E1kNetNvData ( IN EFI_SIMPLE_NETWORK_PROTOCOL *This, IN BOOLEAN ReadWrite, IN UINTN Offset, IN UINTN BufferSize, IN OUT VOID *Buffer ); EFI_STATUS EFIAPI E1kNetGetStatus ( IN EFI_SIMPLE_NETWORK_PROTOCOL *This, OUT UINT32 *InterruptStatus OPTIONAL, OUT VOID **TxBuf OPTIONAL ); EFI_STATUS EFIAPI E1kNetTransmit ( 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 E1kNetReceive ( 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 E1kNetShutdownRx ( IN OUT E1K_NET_DEV *Dev ); VOID EFIAPI E1kNetShutdownTx ( IN OUT E1K_NET_DEV *Dev ); // // utility functions to map caller-supplied Tx buffer system physical address // to a device address and vice versa // EFI_STATUS EFIAPI E1kNetMapTxBuf ( IN E1K_NET_DEV *Dev, IN VOID *Buffer, IN UINTN NumberOfBytes, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress ); EFI_STATUS EFIAPI E1kNetUnmapTxBuf ( IN E1K_NET_DEV *Dev, OUT VOID **Buffer, IN EFI_PHYSICAL_ADDRESS DeviceAddress ); INTN EFIAPI E1kNetTxBufMapInfoCompare ( IN CONST VOID *UserStruct1, IN CONST VOID *UserStruct2 ); INTN EFIAPI E1kNetTxBufDeviceAddressCompare ( IN CONST VOID *StandaloneKey, IN CONST VOID *UserStruct ); // // event callbacks // VOID EFIAPI E1kNetIsPacketAvailable ( IN EFI_EVENT Event, IN VOID *Context ); VOID EFIAPI E1kNetExitBoot ( IN EFI_EVENT Event, IN VOID *Context ); // // Hardware I/O functions. // EFI_STATUS EFIAPI E1kNetRegWrite32 ( IN E1K_NET_DEV *Dev, IN UINT32 Addr, IN UINT32 Data ); EFI_STATUS EFIAPI E1kNetRegRead32 ( IN E1K_NET_DEV *Dev, IN UINT32 Addr, OUT UINT32 *Data ); EFI_STATUS EFIAPI E1kNetRegSet32 ( IN E1K_NET_DEV *Dev, IN UINT32 Addr, IN UINT32 Set ); EFI_STATUS EFIAPI E1kNetRegClear32 ( IN E1K_NET_DEV *Dev, IN UINT32 Addr, IN UINT32 Clear ); EFI_STATUS EFIAPI E1kNetDevReset ( IN E1K_NET_DEV *Dev ); #endif // _E1K_NET_DXE_H_