and should not be used outside of the EDK II tree.\r
\r
Copyright (c) 2013, ARM Ltd. All rights reserved.<BR>\r
+ Copyright (c) 2017, AMD Inc, All rights reserved.<BR>\r
\r
- This program and the accompanying materials are licensed and made available\r
- under the terms and conditions of the BSD License which accompanies this\r
- distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
- WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
//\r
// VirtIo Specification Revision: Major[31:24].Minor[23:16].Revision[15:0]\r
//\r
-#define VIRTIO_SPEC_REVISION(major,minor,revision) \\r
+#define VIRTIO_SPEC_REVISION(major, minor, revision) \\r
((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16) | ((revision) & 0xFFFF))\r
\r
-#define VIRTIO_DEVICE_PROTOCOL_GUID { \\r
+#define VIRTIO_DEVICE_PROTOCOL_GUID {\\r
0xfa920010, 0x6785, 0x4941, {0xb6, 0xec, 0x49, 0x8c, 0x57, 0x9f, 0x16, 0x0a }\\r
}\r
\r
-typedef struct _VIRTIO_DEVICE_PROTOCOL VIRTIO_DEVICE_PROTOCOL;\r
+typedef struct _VIRTIO_DEVICE_PROTOCOL VIRTIO_DEVICE_PROTOCOL;\r
+\r
+//\r
+// VIRTIO Operation for VIRTIO_MAP_SHARED\r
+//\r
+typedef enum {\r
+ //\r
+ // A read operation from system memory by a bus master\r
+ //\r
+ VirtioOperationBusMasterRead,\r
+ //\r
+ // A write operation to system memory by a bus master\r
+ //\r
+ VirtioOperationBusMasterWrite,\r
+ //\r
+ // Provides both read and write access to system memory by both the\r
+ // processor and a bus master\r
+ //\r
+ VirtioOperationBusMasterCommonBuffer,\r
+} VIRTIO_MAP_OPERATION;\r
\r
/**\r
\r
**/\r
typedef\r
EFI_STATUS\r
-(EFIAPI *VIRTIO_DEVICE_READ) (\r
+(EFIAPI *VIRTIO_DEVICE_READ)(\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
IN UINTN FieldOffset,\r
IN UINTN FieldSize,\r
**/\r
typedef\r
EFI_STATUS\r
-(EFIAPI *VIRTIO_DEVICE_WRITE) (\r
+(EFIAPI *VIRTIO_DEVICE_WRITE)(\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
IN UINTN FieldOffset,\r
IN UINTN FieldSize,\r
**/\r
typedef\r
EFI_STATUS\r
-(EFIAPI *VIRTIO_GET_DEVICE_FEATURES) (\r
+(EFIAPI *VIRTIO_GET_DEVICE_FEATURES)(\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
OUT UINT64 *DeviceFeatures\r
);\r
**/\r
typedef\r
EFI_STATUS\r
-(EFIAPI *VIRTIO_SET_GUEST_FEATURES) (\r
+(EFIAPI *VIRTIO_SET_GUEST_FEATURES)(\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
IN UINT64 Features\r
);\r
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL\r
\r
@param[in] Ring The initialized VRING object to take the\r
- addresses from.\r
+ addresses from. The caller is responsible for\r
+ ensuring that on input, all Ring->NumPages pages,\r
+ starting at Ring->Base, have been successfully\r
+ mapped with a single call to\r
+ This->MapSharedBuffer() for CommonBuffer bus\r
+ master operation.\r
+\r
+ @param[in] RingBaseShift Adding this value using UINT64 arithmetic to the\r
+ addresses found in Ring translates them from\r
+ system memory to bus addresses. The caller shall\r
+ calculate RingBaseShift as\r
+ (DeviceAddress - (UINT64)(UINTN)HostAddress),\r
+ where DeviceAddress and HostAddress (i.e.,\r
+ Ring->Base) were output and input parameters of\r
+ This->MapSharedBuffer(), respectively.\r
\r
@retval EFI_SUCCESS The data was written successfully.\r
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the\r
**/\r
typedef\r
EFI_STATUS\r
-(EFIAPI *VIRTIO_SET_QUEUE_ADDRESS) (\r
+(EFIAPI *VIRTIO_SET_QUEUE_ADDRESS)(\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
- IN VRING *Ring\r
+ IN VRING *Ring,\r
+ IN UINT64 RingBaseShift\r
);\r
\r
/**\r
**/\r
typedef\r
EFI_STATUS\r
-(EFIAPI *VIRTIO_SET_QUEUE_SEL) (\r
+(EFIAPI *VIRTIO_SET_QUEUE_SEL)(\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
IN UINT16 Index\r
);\r
**/\r
typedef\r
EFI_STATUS\r
-(EFIAPI *VIRTIO_SET_QUEUE_NOTIFY) (\r
+(EFIAPI *VIRTIO_SET_QUEUE_NOTIFY)(\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
IN UINT16 Index\r
);\r
**/\r
typedef\r
EFI_STATUS\r
-(EFIAPI *VIRTIO_SET_QUEUE_ALIGN) (\r
+(EFIAPI *VIRTIO_SET_QUEUE_ALIGN)(\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
IN UINT32 Alignment\r
);\r
**/\r
typedef\r
EFI_STATUS\r
-(EFIAPI *VIRTIO_SET_PAGE_SIZE) (\r
+(EFIAPI *VIRTIO_SET_PAGE_SIZE)(\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
IN UINT32 PageSize\r
);\r
**/\r
typedef\r
EFI_STATUS\r
-(EFIAPI *VIRTIO_GET_QUEUE_NUM_MAX) (\r
+(EFIAPI *VIRTIO_GET_QUEUE_NUM_MAX)(\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
OUT UINT16 *QueueNumMax\r
);\r
**/\r
typedef\r
EFI_STATUS\r
-(EFIAPI *VIRTIO_SET_QUEUE_NUM) (\r
+(EFIAPI *VIRTIO_SET_QUEUE_NUM)(\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
IN UINT16 QueueSize\r
);\r
**/\r
typedef\r
EFI_STATUS\r
-(EFIAPI *VIRTIO_GET_DEVICE_STATUS) (\r
+(EFIAPI *VIRTIO_GET_DEVICE_STATUS)(\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
OUT UINT8 *DeviceStatus\r
);\r
**/\r
typedef\r
EFI_STATUS\r
-(EFIAPI *VIRTIO_SET_DEVICE_STATUS) (\r
+(EFIAPI *VIRTIO_SET_DEVICE_STATUS)(\r
IN VIRTIO_DEVICE_PROTOCOL *This,\r
IN UINT8 DeviceStatus\r
);\r
\r
+/**\r
+\r
+ Allocates pages that are suitable for an VirtioOperationBusMasterCommonBuffer\r
+ mapping. This means that the buffer allocated by this function supports\r
+ simultaneous access by both the processor and the bus master. The device\r
+ address that the bus master uses to access the buffer must be retrieved with\r
+ a call to VIRTIO_MAP_SHARED.\r
+\r
+ @param[in] This The protocol instance pointer.\r
+\r
+ @param[in] Pages The number of pages to allocate.\r
+\r
+ @param[in,out] HostAddress A pointer to store the system memory base\r
+ address of the allocated range.\r
+\r
+ @retval EFI_SUCCESS The requested memory pages were allocated.\r
+ @retval EFI_OUT_OF_RESOURCES The memory pages could not be allocated.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *VIRTIO_ALLOCATE_SHARED)(\r
+ IN VIRTIO_DEVICE_PROTOCOL *This,\r
+ IN UINTN Pages,\r
+ IN OUT VOID **HostAddress\r
+ );\r
+\r
+/**\r
+ Frees memory that was allocated with VIRTIO_ALLOCATE_SHARED.\r
+\r
+ @param[in] This The protocol instance pointer.\r
+\r
+ @param[in] Pages The number of pages to free.\r
+\r
+ @param[in] HostAddress The system memory base address of the allocated\r
+ range.\r
+\r
+**/\r
+typedef\r
+VOID\r
+(EFIAPI *VIRTIO_FREE_SHARED)(\r
+ IN VIRTIO_DEVICE_PROTOCOL *This,\r
+ IN UINTN Pages,\r
+ IN VOID *HostAddress\r
+ );\r
+\r
+/**\r
+ Provides the virtio device address required to access system memory from a\r
+ DMA bus master.\r
+\r
+ The interface follows the same usage pattern as defined in UEFI spec 2.6\r
+ (Section 13.2 PCI Root Bridge I/O Protocol)\r
+\r
+ @param[in] This The protocol instance pointer.\r
+\r
+ @param[in] Operation Indicates if the bus master is going to\r
+ read or write to system memory.\r
+\r
+ @param[in] HostAddress The system memory address to map to shared\r
+ buffer address.\r
+\r
+ @param[in,out] NumberOfBytes On input the number of bytes to map.\r
+ On output the number of bytes that were\r
+ mapped.\r
+\r
+ @param[out] DeviceAddress The resulting shared map address for the\r
+ bus master to access the hosts HostAddress.\r
+\r
+ @param[out] Mapping A resulting token to pass to\r
+ VIRTIO_UNMAP_SHARED.\r
+\r
+ @retval EFI_SUCCESS The range was mapped for the returned\r
+ NumberOfBytes.\r
+ @retval EFI_UNSUPPORTED The HostAddress cannot be mapped as a\r
+ common buffer.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_OUT_OF_RESOURCES The request could not be completed due to\r
+ a lack of resources.\r
+ @retval EFI_DEVICE_ERROR The system hardware could not map the\r
+ requested address.\r
+**/\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *VIRTIO_MAP_SHARED)(\r
+ IN VIRTIO_DEVICE_PROTOCOL *This,\r
+ IN VIRTIO_MAP_OPERATION Operation,\r
+ IN VOID *HostAddress,\r
+ IN OUT UINTN *NumberOfBytes,\r
+ OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,\r
+ OUT VOID **Mapping\r
+ );\r
+\r
+/**\r
+ Completes the VIRTIO_MAP_SHARED operation and releases any corresponding\r
+ resources.\r
+\r
+ @param[in] This The protocol instance pointer.\r
+\r
+ @param[in] Mapping The mapping token returned from\r
+ VIRTIO_MAP_SHARED.\r
+\r
+ @retval EFI_SUCCESS The range was unmapped.\r
+ @retval EFI_INVALID_PARAMETER Mapping is not a value that was returned by\r
+ VIRTIO_MAP_SHARED. Passing an invalid Mapping\r
+ token can cause undefined behavior.\r
+ @retval EFI_DEVICE_ERROR The data was not committed to the target\r
+ system memory.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *VIRTIO_UNMAP_SHARED)(\r
+ IN VIRTIO_DEVICE_PROTOCOL *This,\r
+ IN VOID *Mapping\r
+ );\r
\r
///\r
/// This protocol provides an abstraction over the VirtIo transport layer\r
//\r
// VirtIo Specification Revision encoded with VIRTIO_SPEC_REVISION()\r
//\r
- UINT32 Revision;\r
+ UINT32 Revision;\r
//\r
// From the Virtio Spec\r
//\r
- INT32 SubSystemDeviceId;\r
+ INT32 SubSystemDeviceId;\r
\r
- VIRTIO_GET_DEVICE_FEATURES GetDeviceFeatures;\r
- VIRTIO_SET_GUEST_FEATURES SetGuestFeatures;\r
+ VIRTIO_GET_DEVICE_FEATURES GetDeviceFeatures;\r
+ VIRTIO_SET_GUEST_FEATURES SetGuestFeatures;\r
\r
- VIRTIO_SET_QUEUE_ADDRESS SetQueueAddress;\r
+ VIRTIO_SET_QUEUE_ADDRESS SetQueueAddress;\r
\r
- VIRTIO_SET_QUEUE_SEL SetQueueSel;\r
+ VIRTIO_SET_QUEUE_SEL SetQueueSel;\r
\r
- VIRTIO_SET_QUEUE_NOTIFY SetQueueNotify;\r
+ VIRTIO_SET_QUEUE_NOTIFY SetQueueNotify;\r
\r
- VIRTIO_SET_QUEUE_ALIGN SetQueueAlign;\r
- VIRTIO_SET_PAGE_SIZE SetPageSize;\r
+ VIRTIO_SET_QUEUE_ALIGN SetQueueAlign;\r
+ VIRTIO_SET_PAGE_SIZE SetPageSize;\r
\r
- VIRTIO_GET_QUEUE_NUM_MAX GetQueueNumMax;\r
- VIRTIO_SET_QUEUE_NUM SetQueueNum;\r
+ VIRTIO_GET_QUEUE_NUM_MAX GetQueueNumMax;\r
+ VIRTIO_SET_QUEUE_NUM SetQueueNum;\r
\r
- VIRTIO_GET_DEVICE_STATUS GetDeviceStatus;\r
- VIRTIO_SET_DEVICE_STATUS SetDeviceStatus;\r
+ VIRTIO_GET_DEVICE_STATUS GetDeviceStatus;\r
+ VIRTIO_SET_DEVICE_STATUS SetDeviceStatus;\r
\r
//\r
// Functions to read/write Device Specific headers\r
//\r
- VIRTIO_DEVICE_WRITE WriteDevice;\r
- VIRTIO_DEVICE_READ ReadDevice;\r
+ VIRTIO_DEVICE_WRITE WriteDevice;\r
+ VIRTIO_DEVICE_READ ReadDevice;\r
+\r
+ //\r
+ // Functions to allocate, free, map and unmap shared buffer\r
+ //\r
+ VIRTIO_ALLOCATE_SHARED AllocateSharedPages;\r
+ VIRTIO_FREE_SHARED FreeSharedPages;\r
+ VIRTIO_MAP_SHARED MapSharedBuffer;\r
+ VIRTIO_UNMAP_SHARED UnmapSharedBuffer;\r
};\r
\r
-extern EFI_GUID gVirtioDeviceProtocolGuid;\r
+extern EFI_GUID gVirtioDeviceProtocolGuid;\r
\r
#endif\r