/** @file | |
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.<BR> | |
This program and the accompanying materials are licensed and made available | |
under the terms and conditions of the BSD License which accompanies this | |
distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT | |
WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#ifndef __VIRTIO_DEVICE_H__ | |
#define __VIRTIO_DEVICE_H__ | |
// VirtIo Specification Revision: Major[31:24].Minor[23:16].Revision[15:0 | |
#define VIRTIO_SPEC_REVISION(major,minor,revision) \ | |
((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16) | ((revision) & 0xFFFF)) | |
#define VIRTIO_DEVICE_PROTOCOL_GUID { \ | |
0xfa920010, 0x6785, 0x4941, {0xb6, 0xec, 0x49, 0x8c, 0x57, 0x9f, 0x16, 0x0a }\ | |
} | |
typedef struct _VIRTIO_DEVICE_PROTOCOL VIRTIO_DEVICE_PROTOCOL; | |
/** | |
Read a word from the device-specific I/O region of the Virtio Header. | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[in] FieldOffset Source offset. | |
@param[in] FieldSize Source field size in bytes, must be in {1, 2, 4, 8}. | |
@param[in] BufferSize Number of bytes available in the target buffer. Must | |
equal FieldSize. | |
@param[out] Buffer Target buffer. | |
@retval EFI_SUCCESS The data was read successfully. | |
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the | |
provided address offset and read size. | |
@retval EFI_OUT_OF_RESOURCES The request could not be completed due to a | |
lack of resources. | |
@retval EFI_INVALID_PARAMETER One or more parameters are invalid. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_DEVICE_READ) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
IN UINTN FieldOffset, | |
IN UINTN FieldSize, | |
IN UINTN BufferSize, | |
OUT VOID *Buffer | |
); | |
/** | |
Write a word to the device-specific I/O region of the Virtio Header. | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[in] FieldOffset Destination offset. | |
@param[in] FieldSize Destination field size in bytes, | |
must be in {1, 2, 4, 8}. | |
@param[out] Value Value to write. | |
@retval EFI_SUCCESS The data was written successfully. | |
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the | |
provided address offset and write size. | |
@retval EFI_OUT_OF_RESOURCES The request could not be completed due to a | |
lack of resources. | |
@retval EFI_INVALID_PARAMETER One or more parameters are invalid. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_DEVICE_WRITE) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
IN UINTN FieldOffset, | |
IN UINTN FieldSize, | |
IN UINT64 Value | |
); | |
/** | |
Read the device features field from the Virtio Header. | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[out] DeviceFeatures The 32-bit device features field. | |
@retval EFI_SUCCESS The data was read successfully. | |
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the | |
provided address offset and read size. | |
@retval EFI_INVALID_PARAMETER DeviceFeatures is NULL | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_GET_DEVICE_FEATURES) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
OUT UINT32 *DeviceFeatures | |
); | |
/** | |
Write the guest features field in the Virtio Header. | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[in] Features The 32-bit guest guest features field | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_SET_GUEST_FEATURES) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
IN UINT32 Features | |
); | |
/** | |
Read the queue address field from the Virtio Header. | |
QueueAddress is the address of the virtqueue divided by 4096. | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[out] QueueAddress The 32-bit queue address field. | |
@retval EFI_SUCCESS The data was read successfully. | |
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the | |
provided address offset and read size. | |
@retval EFI_INVALID_PARAMETER QueueAddress is NULL | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_GET_QUEUE_ADDRESS) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
OUT UINT32 *QueueAddress | |
); | |
/** | |
Write the queue address field in the Virtio Header. | |
The parameter Address must be the base address of the virtqueue divided | |
by 4096. | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[in] Address The 32-bit Queue Address field | |
@retval EFI_SUCCESS The data was written successfully. | |
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the | |
provided address offset and write size. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_SET_QUEUE_ADDRESS) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
IN UINT32 Address | |
); | |
/** | |
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. | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[in] Index The index of the queue to select | |
@retval EFI_SUCCESS The data was written successfully. | |
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the | |
provided address offset and write size. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_SET_QUEUE_SEL) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
IN UINT16 Index | |
); | |
/** | |
Write the queue notify field in the Virtio Header. | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[in] Address The 32-bit Queue Notify field | |
@retval EFI_SUCCESS The data was written successfully. | |
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the | |
provided address offset and write size. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_SET_QUEUE_NOTIFY) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
IN UINT16 Index | |
); | |
/** | |
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. | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[in] Alignment The alignment boundary of the Used Ring in bytes. | |
Must be a power of 2. | |
@retval EFI_SUCCESS The data was written successfully. | |
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the | |
provided address offset and write size. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_SET_QUEUE_ALIGN) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
IN UINT32 Alignment | |
); | |
/** | |
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. | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[in] PageSize Size of the Guest page in bytes. | |
Must be a power of 2. | |
@retval EFI_SUCCESS The data was written successfully. | |
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the | |
provided address offset and write size. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_SET_PAGE_SIZE) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
IN UINT32 PageSize | |
); | |
/** | |
Get the size of the virtqueue selected by the queue select field. | |
See Virtio spec Section 2.3 | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[out] QueueNumMax The size of the virtqueue in bytes. | |
Always a power of 2. | |
@retval EFI_SUCCESS The data was read successfully. | |
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the | |
provided address offset and read size. | |
@retval EFI_INVALID_PARAMETER QueueNumMax is NULL | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_GET_QUEUE_NUM_MAX) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
OUT UINT16 *QueueNumMax | |
); | |
/** | |
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. | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[in] QueueSize The number of elements in the queue. | |
@retval EFI_SUCCESS The data was written successfully. | |
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the | |
provided address offset and write size. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_SET_QUEUE_NUM) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
IN UINT16 QueueSize | |
); | |
/** | |
Get the DeviceStatus field from the Virtio Header. | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[out] DeviceStatus The 8-bit value for the Device status field | |
@retval EFI_SUCCESS The data was read successfully. | |
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the | |
provided address offset and read size. | |
@retval EFI_INVALID_PARAMETER DeviceStatus is NULL | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_GET_DEVICE_STATUS) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
OUT UINT8 *DeviceStatus | |
); | |
/** | |
Write the DeviceStatus field in the Virtio Header. | |
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL | |
@param[in] DeviceStatus The 8-bit value for the Device status field | |
@retval EFI_SUCCESS The data was written successfully. | |
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the | |
provided address offset and write size. | |
**/ | |
typedef | |
EFI_STATUS | |
(EFIAPI *VIRTIO_SET_DEVICE_STATUS) ( | |
IN VIRTIO_DEVICE_PROTOCOL *This, | |
IN UINT8 DeviceStatus | |
); | |
/// | |
/// This protocol provides an abstraction over the VirtIo transport layer | |
/// | |
/// DISCLAIMER: this protocol is a work in progress, and should not be used | |
/// outside of the EDK II tree. | |
/// | |
struct _VIRTIO_DEVICE_PROTOCOL { | |
/// VirtIo Specification Revision encoded with VIRTIO_SPEC_REVISION() | |
UINT32 Revision; | |
/// From the Virtio Spec | |
INT32 SubSystemDeviceId; | |
VIRTIO_GET_DEVICE_FEATURES GetDeviceFeatures; | |
VIRTIO_SET_GUEST_FEATURES SetGuestFeatures; | |
VIRTIO_GET_QUEUE_ADDRESS GetQueueAddress; | |
VIRTIO_SET_QUEUE_ADDRESS SetQueueAddress; | |
VIRTIO_SET_QUEUE_SEL SetQueueSel; | |
VIRTIO_SET_QUEUE_NOTIFY SetQueueNotify; | |
VIRTIO_SET_QUEUE_ALIGN SetQueueAlign; | |
VIRTIO_SET_PAGE_SIZE SetPageSize; | |
VIRTIO_GET_QUEUE_NUM_MAX GetQueueNumMax; | |
VIRTIO_SET_QUEUE_NUM SetQueueNum; | |
VIRTIO_GET_DEVICE_STATUS GetDeviceStatus; | |
VIRTIO_SET_DEVICE_STATUS SetDeviceStatus; | |
// Functions to read/write Device Specific headers | |
VIRTIO_DEVICE_WRITE WriteDevice; | |
VIRTIO_DEVICE_READ ReadDevice; | |
}; | |
extern EFI_GUID gVirtioDeviceProtocolGuid; | |
#endif |