TianoCore EDK2 master
Loading...
Searching...
No Matches
VirtioDevice.h File Reference

Go to the source code of this file.

Data Structures

struct  _VIRTIO_DEVICE_PROTOCOL
 

Macros

#define VIRTIO_SPEC_REVISION(major, minor, revision)    ((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16) | ((revision) & 0xFFFF))
 
#define VIRTIO_DEVICE_PROTOCOL_GUID
 

Typedefs

typedef struct _VIRTIO_DEVICE_PROTOCOL VIRTIO_DEVICE_PROTOCOL
 
typedef EFI_STATUS(EFIAPI * VIRTIO_DEVICE_READ) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINTN FieldOffset, IN UINTN FieldSize, IN UINTN BufferSize, OUT VOID *Buffer)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_DEVICE_WRITE) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINTN FieldOffset, IN UINTN FieldSize, IN UINT64 Value)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_GET_DEVICE_FEATURES) (IN VIRTIO_DEVICE_PROTOCOL *This, OUT UINT64 *DeviceFeatures)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_SET_GUEST_FEATURES) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT64 Features)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_SET_QUEUE_ADDRESS) (IN VIRTIO_DEVICE_PROTOCOL *This, IN VRING *Ring, IN UINT64 RingBaseShift)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_SET_QUEUE_SEL) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT16 Index)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_SET_QUEUE_NOTIFY) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT16 Index)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_SET_QUEUE_ALIGN) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT32 Alignment)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_SET_PAGE_SIZE) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT32 PageSize)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_GET_QUEUE_NUM_MAX) (IN VIRTIO_DEVICE_PROTOCOL *This, OUT UINT16 *QueueNumMax)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_SET_QUEUE_NUM) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT16 QueueSize)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_GET_DEVICE_STATUS) (IN VIRTIO_DEVICE_PROTOCOL *This, OUT UINT8 *DeviceStatus)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_SET_DEVICE_STATUS) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT8 DeviceStatus)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_ALLOCATE_SHARED) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINTN Pages, IN OUT VOID **HostAddress)
 
typedef VOID(EFIAPI * VIRTIO_FREE_SHARED) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINTN Pages, IN VOID *HostAddress)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_MAP_SHARED) (IN VIRTIO_DEVICE_PROTOCOL *This, IN VIRTIO_MAP_OPERATION Operation, IN VOID *HostAddress, IN OUT UINTN *NumberOfBytes, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, OUT VOID **Mapping)
 
typedef EFI_STATUS(EFIAPI * VIRTIO_UNMAP_SHARED) (IN VIRTIO_DEVICE_PROTOCOL *This, IN VOID *Mapping)
 

Enumerations

enum  VIRTIO_MAP_OPERATION { VirtioOperationBusMasterRead , VirtioOperationBusMasterWrite , VirtioOperationBusMasterCommonBuffer }
 

Variables

EFI_GUID gVirtioDeviceProtocolGuid
 

Detailed Description

Virtio Device

DISCLAIMER: the VIRTIO_DEVICE_PROTOCOL introduced here is a work in progress, and should not be used outside of the EDK II tree.

Copyright (c) 2013, ARM Ltd. All rights reserved.
Copyright (c) 2017, AMD Inc, All rights reserved.

SPDX-License-Identifier: BSD-2-Clause-Patent

Definition in file VirtioDevice.h.

Macro Definition Documentation

◆ VIRTIO_DEVICE_PROTOCOL_GUID

#define VIRTIO_DEVICE_PROTOCOL_GUID
Value:
{\
0xfa920010, 0x6785, 0x4941, {0xb6, 0xec, 0x49, 0x8c, 0x57, 0x9f, 0x16, 0x0a }\
}

Definition at line 25 of file VirtioDevice.h.

◆ VIRTIO_SPEC_REVISION

#define VIRTIO_SPEC_REVISION (   major,
  minor,
  revision 
)     ((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16) | ((revision) & 0xFFFF))

Definition at line 22 of file VirtioDevice.h.

Typedef Documentation

◆ VIRTIO_ALLOCATE_SHARED

typedef EFI_STATUS(EFIAPI * VIRTIO_ALLOCATE_SHARED) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINTN Pages, IN OUT VOID **HostAddress)

Allocates pages that are suitable for an VirtioOperationBusMasterCommonBuffer mapping. This means that the buffer allocated by this function supports simultaneous access by both the processor and the bus master. The device address that the bus master uses to access the buffer must be retrieved with a call to VIRTIO_MAP_SHARED.

Parameters
[in]ThisThe protocol instance pointer.
[in]PagesThe number of pages to allocate.
[in,out]HostAddressA pointer to store the system memory base address of the allocated range.
Return values
EFI_SUCCESSThe requested memory pages were allocated.
EFI_OUT_OF_RESOURCESThe memory pages could not be allocated.

Definition at line 373 of file VirtioDevice.h.

◆ VIRTIO_DEVICE_PROTOCOL

Definition at line 29 of file VirtioDevice.h.

◆ VIRTIO_DEVICE_READ

typedef EFI_STATUS(EFIAPI * VIRTIO_DEVICE_READ) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINTN FieldOffset, IN UINTN FieldSize, IN UINTN BufferSize, OUT VOID *Buffer)

Read a word from the device-specific I/O region of the Virtio Header.

Parameters
[in]ThisThis instance of VIRTIO_DEVICE_PROTOCOL
[in]FieldOffsetSource offset.
[in]FieldSizeSource field size in bytes, must be in {1, 2, 4, 8}.
[in]BufferSizeNumber of bytes available in the target buffer. Must equal FieldSize.
[out]BufferTarget buffer.
Return values
EFI_SUCCESSThe data was read successfully.
EFI_UNSUPPORTEDThe underlying IO device doesn't support the provided address offset and read size.
EFI_OUT_OF_RESOURCESThe request could not be completed due to a lack of resources.
EFI_INVALID_PARAMETEROne or more parameters are invalid.

Definition at line 74 of file VirtioDevice.h.

◆ VIRTIO_DEVICE_WRITE

typedef EFI_STATUS(EFIAPI * VIRTIO_DEVICE_WRITE) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINTN FieldOffset, IN UINTN FieldSize, IN UINT64 Value)

Write a word to the device-specific I/O region of the Virtio Header.

Parameters
[in]ThisThis instance of VIRTIO_DEVICE_PROTOCOL
[in]FieldOffsetDestination offset.
[in]FieldSizeDestination field size in bytes, must be in {1, 2, 4, 8}.
[out]ValueValue to write.
Return values
EFI_SUCCESSThe data was written successfully.
EFI_UNSUPPORTEDThe underlying IO device doesn't support the provided address offset and write size.
EFI_OUT_OF_RESOURCESThe request could not be completed due to a lack of resources.
EFI_INVALID_PARAMETEROne or more parameters are invalid.

Definition at line 105 of file VirtioDevice.h.

◆ VIRTIO_FREE_SHARED

typedef VOID(EFIAPI * VIRTIO_FREE_SHARED) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINTN Pages, IN VOID *HostAddress)

Frees memory that was allocated with VIRTIO_ALLOCATE_SHARED.

Parameters
[in]ThisThe protocol instance pointer.
[in]PagesThe number of pages to free.
[in]HostAddressThe system memory base address of the allocated range.

Definition at line 392 of file VirtioDevice.h.

◆ VIRTIO_GET_DEVICE_FEATURES

typedef EFI_STATUS(EFIAPI * VIRTIO_GET_DEVICE_FEATURES) (IN VIRTIO_DEVICE_PROTOCOL *This, OUT UINT64 *DeviceFeatures)

Read the device features field from the Virtio Header.

Parameters
[in]ThisThis instance of VIRTIO_DEVICE_PROTOCOL
[out]DeviceFeaturesThe device features field.
Return values
EFI_SUCCESSThe data was read successfully.
EFI_UNSUPPORTEDThe underlying IO device doesn't support the provided address offset and read size.
EFI_INVALID_PARAMETERDeviceFeatures is NULL

Definition at line 126 of file VirtioDevice.h.

◆ VIRTIO_GET_DEVICE_STATUS

typedef EFI_STATUS(EFIAPI * VIRTIO_GET_DEVICE_STATUS) (IN VIRTIO_DEVICE_PROTOCOL *This, OUT UINT8 *DeviceStatus)

Get the DeviceStatus field from the Virtio Header.

Parameters
[in]ThisThis instance of VIRTIO_DEVICE_PROTOCOL
[out]DeviceStatusThe 8-bit value for the Device status field
Return values
EFI_SUCCESSThe data was read successfully.
EFI_UNSUPPORTEDThe underlying IO device doesn't support the provided address offset and read size.
EFI_INVALID_PARAMETERDeviceStatus is NULL

Definition at line 328 of file VirtioDevice.h.

◆ VIRTIO_GET_QUEUE_NUM_MAX

typedef EFI_STATUS(EFIAPI * VIRTIO_GET_QUEUE_NUM_MAX) (IN VIRTIO_DEVICE_PROTOCOL *This, OUT UINT16 *QueueNumMax)

Get the size of the virtqueue selected by the queue select field.

See Virtio spec Section 2.3

Parameters
[in]ThisThis instance of VIRTIO_DEVICE_PROTOCOL
[out]QueueNumMaxThe size of the virtqueue in bytes. Always a power of 2.
Return values
EFI_SUCCESSThe data was read successfully.
EFI_UNSUPPORTEDThe underlying IO device doesn't support the provided address offset and read size.
EFI_INVALID_PARAMETERQueueNumMax is NULL

Definition at line 286 of file VirtioDevice.h.

◆ VIRTIO_MAP_SHARED

typedef EFI_STATUS(EFIAPI * VIRTIO_MAP_SHARED) (IN VIRTIO_DEVICE_PROTOCOL *This, IN VIRTIO_MAP_OPERATION Operation, IN VOID *HostAddress, IN OUT UINTN *NumberOfBytes, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, OUT VOID **Mapping)

Provides the virtio device address required to access system memory from a DMA bus master.

The interface follows the same usage pattern as defined in UEFI spec 2.6 (Section 13.2 PCI Root Bridge I/O Protocol)

Parameters
[in]ThisThe protocol instance pointer.
[in]OperationIndicates if the bus master is going to read or write to system memory.
[in]HostAddressThe system memory address to map to shared buffer address.
[in,out]NumberOfBytesOn input the number of bytes to map. On output the number of bytes that were mapped.
[out]DeviceAddressThe resulting shared map address for the bus master to access the hosts HostAddress.
[out]MappingA resulting token to pass to VIRTIO_UNMAP_SHARED.
Return values
EFI_SUCCESSThe range was mapped for the returned NumberOfBytes.
EFI_UNSUPPORTEDThe HostAddress cannot be mapped as a common buffer.
EFI_INVALID_PARAMETEROne or more parameters are invalid.
EFI_OUT_OF_RESOURCESThe request could not be completed due to a lack of resources.
EFI_DEVICE_ERRORThe system hardware could not map the requested address.

Definition at line 436 of file VirtioDevice.h.

◆ VIRTIO_SET_DEVICE_STATUS

typedef EFI_STATUS(EFIAPI * VIRTIO_SET_DEVICE_STATUS) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT8 DeviceStatus)

Write the DeviceStatus field in the Virtio Header.

Parameters
[in]ThisThis instance of VIRTIO_DEVICE_PROTOCOL
[in]DeviceStatusThe 8-bit value for the Device status field
Return values
EFI_SUCCESSThe data was written successfully.
EFI_UNSUPPORTEDThe underlying IO device doesn't support the provided address offset and write size.

Definition at line 347 of file VirtioDevice.h.

◆ VIRTIO_SET_GUEST_FEATURES

typedef EFI_STATUS(EFIAPI * VIRTIO_SET_GUEST_FEATURES) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT64 Features)

Write the guest features field in the Virtio Header.

Parameters
[in]ThisThis instance of VIRTIO_DEVICE_PROTOCOL
[in]FeaturesThe guest features field

Definition at line 141 of file VirtioDevice.h.

◆ VIRTIO_SET_PAGE_SIZE

typedef EFI_STATUS(EFIAPI * VIRTIO_SET_PAGE_SIZE) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT32 PageSize)

Write the guest page size.

Note: This operation is not implemented by the VirtIo over PCI. The PCI implementation of this protocol returns EFI_SUCCESS.

Parameters
[in]ThisThis instance of VIRTIO_DEVICE_PROTOCOL
[in]PageSizeSize of the Guest page in bytes. Must be a power of 2.
Return values
EFI_SUCCESSThe data was written successfully.
EFI_UNSUPPORTEDThe underlying IO device doesn't support the provided address offset and write size.

Definition at line 263 of file VirtioDevice.h.

◆ VIRTIO_SET_QUEUE_ADDRESS

typedef EFI_STATUS(EFIAPI * VIRTIO_SET_QUEUE_ADDRESS) (IN VIRTIO_DEVICE_PROTOCOL *This, IN VRING *Ring, IN UINT64 RingBaseShift)

Write the queue address field(s) in the Virtio Header.

Parameters
[in]ThisThis instance of VIRTIO_DEVICE_PROTOCOL
[in]RingThe initialized VRING object to take the addresses from. The caller is responsible for ensuring that on input, all Ring->NumPages pages, starting at Ring->Base, have been successfully mapped with a single call to This->MapSharedBuffer() for CommonBuffer bus master operation.
[in]RingBaseShiftAdding this value using UINT64 arithmetic to the addresses found in Ring translates them from system memory to bus addresses. The caller shall calculate RingBaseShift as (DeviceAddress - (UINT64)(UINTN)HostAddress), where DeviceAddress and HostAddress (i.e., Ring->Base) were output and input parameters of This->MapSharedBuffer(), respectively.
Return values
EFI_SUCCESSThe data was written successfully.
EFI_UNSUPPORTEDThe underlying IO device doesn't support the provided address offset and write size.

Definition at line 174 of file VirtioDevice.h.

◆ VIRTIO_SET_QUEUE_ALIGN

typedef EFI_STATUS(EFIAPI * VIRTIO_SET_QUEUE_ALIGN) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT32 Alignment)

Write the queue alignment field in the Virtio Header.

The queue to which the alignment applies is selected by the Queue Select field.

Note: This operation is not implemented by the VirtIo over PCI. The PCI implementation of this protocol returns EFI_SUCCESS.

Parameters
[in]ThisThis instance of VIRTIO_DEVICE_PROTOCOL
[in]AlignmentThe alignment boundary of the Used Ring in bytes. Must be a power of 2.
Return values
EFI_SUCCESSThe data was written successfully.
EFI_UNSUPPORTEDThe underlying IO device doesn't support the provided address offset and write size.

Definition at line 241 of file VirtioDevice.h.

◆ VIRTIO_SET_QUEUE_NOTIFY

typedef EFI_STATUS(EFIAPI * VIRTIO_SET_QUEUE_NOTIFY) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT16 Index)

Write the queue notify field in the Virtio Header.

Parameters
[in]ThisThis instance of VIRTIO_DEVICE_PROTOCOL
[in]AddressThe 32-bit Queue Notify field
Return values
EFI_SUCCESSThe data was written successfully.
EFI_UNSUPPORTEDThe underlying IO device doesn't support the provided address offset and write size.

Definition at line 216 of file VirtioDevice.h.

◆ VIRTIO_SET_QUEUE_NUM

typedef EFI_STATUS(EFIAPI * VIRTIO_SET_QUEUE_NUM) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT16 QueueSize)

Write to the QueueNum field in the Virtio Header.

This function only applies to Virtio-MMIO and may be a stub for other implementations. See Virtio Spec appendix X.

Parameters
[in]ThisThis instance of VIRTIO_DEVICE_PROTOCOL
[in]QueueSizeThe number of elements in the queue.
Return values
EFI_SUCCESSThe data was written successfully.
EFI_UNSUPPORTEDThe underlying IO device doesn't support the provided address offset and write size.

Definition at line 308 of file VirtioDevice.h.

◆ VIRTIO_SET_QUEUE_SEL

typedef EFI_STATUS(EFIAPI * VIRTIO_SET_QUEUE_SEL) (IN VIRTIO_DEVICE_PROTOCOL *This, IN UINT16 Index)

Write the queue select field in the Virtio Header.

Writing to the queue select field sets the index of the queue to which operations such as SetQueueAlign and GetQueueNumMax apply.

Parameters
[in]ThisThis instance of VIRTIO_DEVICE_PROTOCOL
[in]IndexThe index of the queue to select
Return values
EFI_SUCCESSThe data was written successfully.
EFI_UNSUPPORTEDThe underlying IO device doesn't support the provided address offset and write size.

Definition at line 197 of file VirtioDevice.h.

◆ VIRTIO_UNMAP_SHARED

typedef EFI_STATUS(EFIAPI * VIRTIO_UNMAP_SHARED) (IN VIRTIO_DEVICE_PROTOCOL *This, IN VOID *Mapping)

Completes the VIRTIO_MAP_SHARED operation and releases any corresponding resources.

Parameters
[in]ThisThe protocol instance pointer.
[in]MappingThe mapping token returned from VIRTIO_MAP_SHARED.
Return values
EFI_SUCCESSThe range was unmapped.
EFI_INVALID_PARAMETERMapping is not a value that was returned by VIRTIO_MAP_SHARED. Passing an invalid Mapping token can cause undefined behavior.
EFI_DEVICE_ERRORThe data was not committed to the target system memory.

Definition at line 463 of file VirtioDevice.h.

Enumeration Type Documentation

◆ VIRTIO_MAP_OPERATION

enum VIRTIO_MAP_OPERATION

Definition at line 34 of file VirtioDevice.h.