Copyright (C) 2013, ARM Ltd.\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
#include "VirtioMmioDevice.h"\r
\r
-STATIC CONST VIRTIO_DEVICE_PROTOCOL mMmioDeviceProtocolTemplate = {\r
- 0, // Revision\r
- 0, // SubSystemDeviceId\r
- VirtioMmioGetDeviceFeatures, // GetDeviceFeatures\r
- VirtioMmioSetGuestFeatures, // SetGuestFeatures\r
- VirtioMmioSetQueueAddress, // SetQueueAddress\r
- VirtioMmioSetQueueSel, // SetQueueSel\r
- VirtioMmioSetQueueNotify, // SetQueueNotify\r
- VirtioMmioSetQueueAlignment, // SetQueueAlign\r
- VirtioMmioSetPageSize, // SetPageSize\r
- VirtioMmioGetQueueSize, // GetQueueNumMax\r
- VirtioMmioSetQueueSize, // SetQueueNum\r
- VirtioMmioGetDeviceStatus, // GetDeviceStatus\r
- VirtioMmioSetDeviceStatus, // SetDeviceStatus\r
- VirtioMmioDeviceWrite, // WriteDevice\r
- VirtioMmioDeviceRead, // ReadDevice\r
- VirtioMmioAllocateSharedPages, // AllocateSharedPages\r
- VirtioMmioFreeSharedPages, // FreeSharedPages\r
- VirtioMmioMapSharedBuffer, // MapSharedBuffer\r
- VirtioMmioUnmapSharedBuffer // UnmapSharedBuffer\r
+STATIC CONST VIRTIO_DEVICE_PROTOCOL mMmioDeviceProtocolTemplate = {\r
+ 0, // Revision\r
+ 0, // SubSystemDeviceId\r
+ VirtioMmioGetDeviceFeatures, // GetDeviceFeatures\r
+ VirtioMmioSetGuestFeatures, // SetGuestFeatures\r
+ VirtioMmioSetQueueAddress, // SetQueueAddress\r
+ VirtioMmioSetQueueSel, // SetQueueSel\r
+ VirtioMmioSetQueueNotify, // SetQueueNotify\r
+ VirtioMmioSetQueueAlignment, // SetQueueAlign\r
+ VirtioMmioSetPageSize, // SetPageSize\r
+ VirtioMmioGetQueueSize, // GetQueueNumMax\r
+ VirtioMmioSetQueueSize, // SetQueueNum\r
+ VirtioMmioGetDeviceStatus, // GetDeviceStatus\r
+ VirtioMmioSetDeviceStatus, // SetDeviceStatus\r
+ VirtioMmioDeviceWrite, // WriteDevice\r
+ VirtioMmioDeviceRead, // ReadDevice\r
+ VirtioMmioAllocateSharedPages, // AllocateSharedPages\r
+ VirtioMmioFreeSharedPages, // FreeSharedPages\r
+ VirtioMmioMapSharedBuffer, // MapSharedBuffer\r
+ VirtioMmioUnmapSharedBuffer // UnmapSharedBuffer\r
};\r
\r
/**\r
EFIAPI\r
VirtioMmioInit (\r
IN PHYSICAL_ADDRESS BaseAddress,\r
- IN OUT VIRTIO_MMIO_DEVICE *Device\r
+ IN OUT VIRTIO_MMIO_DEVICE *Device\r
)\r
{\r
- UINT32 MagicValue;\r
- UINT32 VendorId;\r
- UINT32 Version;\r
+ UINT32 MagicValue;\r
\r
//\r
// Initialize VirtIo Mmio Device\r
//\r
- CopyMem (&Device->VirtioDevice, &mMmioDeviceProtocolTemplate,\r
- sizeof (VIRTIO_DEVICE_PROTOCOL));\r
- Device->BaseAddress = BaseAddress;\r
- Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5);\r
+ CopyMem (\r
+ &Device->VirtioDevice,\r
+ &mMmioDeviceProtocolTemplate,\r
+ sizeof (VIRTIO_DEVICE_PROTOCOL)\r
+ );\r
+ Device->BaseAddress = BaseAddress;\r
Device->VirtioDevice.SubSystemDeviceId =\r
- MmioRead32 (BaseAddress + VIRTIO_MMIO_OFFSET_DEVICE_ID);\r
+ MmioRead32 (BaseAddress + VIRTIO_MMIO_OFFSET_DEVICE_ID);\r
\r
//\r
// Double-check MMIO-specific values\r
return EFI_UNSUPPORTED;\r
}\r
\r
- Version = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_VERSION);\r
- if (Version != 1) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- //\r
- // Double-check MMIO-specific values\r
- //\r
- VendorId = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_VENDOR_ID);\r
- if (VendorId != VIRTIO_VENDOR_ID) {\r
- //\r
- // The ARM Base and Foundation Models do not report a valid VirtIo VendorId.\r
- // They return a value of 0x0 for the VendorId.\r
- //\r
- DEBUG((EFI_D_WARN, "VirtioMmioInit: Warning: The VendorId (0x%X) does not "\r
- "match the VirtIo VendorId (0x%X).\n",\r
- VendorId, VIRTIO_VENDOR_ID));\r
+ Device->Version = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_VERSION);\r
+ switch (Device->Version) {\r
+ case VIRTIO_MMIO_DEVICE_VERSION_0_95:\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "%a virtio 0.9.5, id %d\n",\r
+ __FUNCTION__,\r
+ Device->VirtioDevice.SubSystemDeviceId\r
+ ));\r
+ Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5);\r
+ break;\r
+ case VIRTIO_MMIO_DEVICE_VERSION_1_00:\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "%a virtio 1.0, id %d\n",\r
+ __FUNCTION__,\r
+ Device->VirtioDevice.SubSystemDeviceId\r
+ ));\r
+ Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (1, 0, 0);\r
+ break;\r
+ default:\r
+ return EFI_UNSUPPORTED;\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
\r
Uninitialize the internals of a virtio-mmio device that has been successfully\r
@param[in, out] Device The device to clean up.\r
\r
**/\r
-\r
STATIC\r
VOID\r
EFIAPI\r
VirtioMmioUninit (\r
- IN VIRTIO_MMIO_DEVICE *Device\r
+ IN VIRTIO_MMIO_DEVICE *Device\r
)\r
{\r
//\r
\r
EFI_STATUS\r
VirtioMmioInstallDevice (\r
- IN PHYSICAL_ADDRESS BaseAddress,\r
- IN EFI_HANDLE Handle\r
+ IN PHYSICAL_ADDRESS BaseAddress,\r
+ IN EFI_HANDLE Handle\r
)\r
{\r
EFI_STATUS Status;\r
- VIRTIO_MMIO_DEVICE *VirtIo;\r
+ VIRTIO_MMIO_DEVICE *VirtIo;\r
\r
if (!BaseAddress) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
if (Handle == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
//\r
// Install VIRTIO_DEVICE_PROTOCOL to Handle\r
//\r
- Status = gBS->InstallProtocolInterface (&Handle,\r
- &gVirtioDeviceProtocolGuid, EFI_NATIVE_INTERFACE,\r
- &VirtIo->VirtioDevice);\r
+ Status = gBS->InstallProtocolInterface (\r
+ &Handle,\r
+ &gVirtioDeviceProtocolGuid,\r
+ EFI_NATIVE_INTERFACE,\r
+ &VirtIo->VirtioDevice\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto UninitVirtio;\r
}\r
\r
EFI_STATUS\r
VirtioMmioUninstallDevice (\r
- IN EFI_HANDLE DeviceHandle\r
+ IN EFI_HANDLE DeviceHandle\r
)\r
{\r
VIRTIO_DEVICE_PROTOCOL *VirtioDevice;\r
//\r
// Uninstall the protocol interface\r
//\r
- Status = gBS->UninstallProtocolInterface (DeviceHandle,\r
- &gVirtioDeviceProtocolGuid, &MmioDevice->VirtioDevice\r
- );\r
+ Status = gBS->UninstallProtocolInterface (\r
+ DeviceHandle,\r
+ &gVirtioDeviceProtocolGuid,\r
+ &MmioDevice->VirtioDevice\r
+ );\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r