]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / OvmfPkg / Library / VirtioMmioDeviceLib / VirtioMmioDevice.c
index fce934e1e9532c316aaa3c33a930b6880e4e120d..831dc1736d28ee22f584e02b58cb74f5d0019513 100644 (file)
@@ -5,13 +5,7 @@
   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 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
@@ -60,22 +54,22 @@ EFI_STATUS
 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
@@ -85,29 +79,33 @@ VirtioMmioInit (
     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
@@ -116,12 +114,11 @@ VirtioMmioInit (
   @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
@@ -132,16 +129,17 @@ VirtioMmioUninit (
 \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
@@ -164,9 +162,12 @@ VirtioMmioInstallDevice (
   //\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
@@ -183,7 +184,7 @@ FreeVirtioMem:
 \r
 EFI_STATUS\r
 VirtioMmioUninstallDevice (\r
-  IN EFI_HANDLE             DeviceHandle\r
+  IN EFI_HANDLE  DeviceHandle\r
   )\r
 {\r
   VIRTIO_DEVICE_PROTOCOL  *VirtioDevice;\r
@@ -210,9 +211,11 @@ VirtioMmioUninstallDevice (
   //\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