]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/QemuVideoDxe/Driver.c
OvmfPkg/QemuVideoDxe: Shouldn't assume system in VGA alias mode.
[mirror_edk2.git] / OvmfPkg / QemuVideoDxe / Driver.c
index 73eb2cad05844fc93c1fe725bc9cc814e810a76a..522110ef4e098b5b60527036bec60f326bad1df8 100644 (file)
@@ -2,22 +2,14 @@
   This driver is a sample implementation of the Graphics Output Protocol for\r
   the QEMU (Cirrus Logic 5446) video controller.\r
 \r
-  Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
 \r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this 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,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
-#include <IndustryStandard/VmwareSvga.h>\r
-#include <IndustryStandard/Acpi.h>\r
 #include "Qemu.h"\r
-#include "UnalignedIoInternal.h"\r
+#include <IndustryStandard/Acpi.h>\r
 \r
 EFI_DRIVER_BINDING_PROTOCOL gQemuVideoDriverBinding = {\r
   QemuVideoControllerDriverSupported,\r
@@ -73,8 +65,8 @@ QEMU_VIDEO_CARD gQemuVideoCardList[] = {
         L"QEMU VirtIO VGA"\r
     },{\r
         PCI_CLASS_DISPLAY_VGA,\r
-        VMWARE_PCI_VENDOR_ID_VMWARE,\r
-        VMWARE_PCI_DEVICE_ID_VMWARE_SVGA2,\r
+        0x15ad,\r
+        0x0405,\r
         QEMU_VIDEO_VMWARE_SVGA,\r
         L"QEMU VMWare SVGA"\r
     },{\r
@@ -209,6 +201,7 @@ QemuVideoControllerDriverStart (
   PCI_TYPE00                        Pci;\r
   QEMU_VIDEO_CARD                   *Card;\r
   EFI_PCI_IO_PROTOCOL               *ChildPciIo;\r
+  UINT64                            SupportedVgaIo;\r
 \r
   OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
@@ -264,7 +257,6 @@ QemuVideoControllerDriverStart (
     goto ClosePciIo;\r
   }\r
   Private->Variant = Card->Variant;\r
-  Private->FrameBufferVramBarIndex = PCI_BAR_IDX0;\r
 \r
   //\r
   // IsQxl is based on the detected Card->Variant, which at a later point might\r
@@ -286,13 +278,32 @@ QemuVideoControllerDriverStart (
     goto ClosePciIo;\r
   }\r
 \r
+  //\r
+  // Get supported PCI attributes\r
+  //\r
+  Status = Private->PciIo->Attributes (\r
+                             Private->PciIo,\r
+                             EfiPciIoAttributeOperationSupported,\r
+                             0,\r
+                             &SupportedVgaIo\r
+                             );\r
+  if (EFI_ERROR (Status)) {\r
+    goto ClosePciIo;\r
+  }\r
+\r
+  SupportedVgaIo &= (UINT64)(EFI_PCI_IO_ATTRIBUTE_VGA_IO | EFI_PCI_IO_ATTRIBUTE_VGA_IO_16);\r
+  if (SupportedVgaIo == 0) {\r
+    Status = EFI_UNSUPPORTED;\r
+    goto ClosePciIo;\r
+  }\r
+\r
   //\r
   // Set new PCI attributes\r
   //\r
   Status = Private->PciIo->Attributes (\r
                             Private->PciIo,\r
                             EfiPciIoAttributeOperationEnable,\r
-                            EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | EFI_PCI_IO_ATTRIBUTE_VGA_IO,\r
+                            EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | SupportedVgaIo,\r
                             NULL\r
                             );\r
   if (EFI_ERROR (Status)) {\r
@@ -325,6 +336,14 @@ QemuVideoControllerDriverStart (
     }\r
   }\r
 \r
+  //\r
+  // VMWare SVGA is handled like Bochs (with port IO only).\r
+  //\r
+  if (Private->Variant == QEMU_VIDEO_VMWARE_SVGA) {\r
+    Private->Variant = QEMU_VIDEO_BOCHS;\r
+    Private->FrameBufferVramBarIndex = PCI_BAR_IDX1;\r
+  }\r
+\r
   //\r
   // Check if accessing the bochs interface works.\r
   //\r
@@ -339,58 +358,6 @@ QemuVideoControllerDriverStart (
     }\r
   }\r
 \r
-  //\r
-  // Check if accessing Vmware SVGA interface works\r
-  //\r
-  if (Private->Variant == QEMU_VIDEO_VMWARE_SVGA) {\r
-    EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *IoDesc;\r
-    UINT32                            TargetId;\r
-    UINT32                            SvgaIdRead;\r
-\r
-    IoDesc = NULL;\r
-    Status = Private->PciIo->GetBarAttributes (\r
-                               Private->PciIo,\r
-                               PCI_BAR_IDX0,\r
-                               NULL,\r
-                               (VOID**) &IoDesc\r
-                               );\r
-    if (EFI_ERROR (Status) ||\r
-        IoDesc->ResType != ACPI_ADDRESS_SPACE_TYPE_IO ||\r
-        IoDesc->AddrRangeMin > MAX_UINT16 + 1 - (VMWARE_SVGA_VALUE_PORT + 4)) {\r
-      if (IoDesc != NULL) {\r
-        FreePool (IoDesc);\r
-      }\r
-      Status = EFI_DEVICE_ERROR;\r
-      goto RestoreAttributes;\r
-    }\r
-    Private->VmwareSvgaBasePort = (UINT16) IoDesc->AddrRangeMin;\r
-    FreePool (IoDesc);\r
-\r
-    TargetId = VMWARE_SVGA_ID_2;\r
-    while (TRUE) {\r
-      VmwareSvgaWrite (Private, VmwareSvgaRegId, TargetId);\r
-      SvgaIdRead = VmwareSvgaRead (Private, VmwareSvgaRegId);\r
-      if ((SvgaIdRead == TargetId) || (TargetId <= VMWARE_SVGA_ID_0)) {\r
-        break;\r
-      }\r
-      TargetId--;\r
-    }\r
-\r
-    if (SvgaIdRead != TargetId) {\r
-      DEBUG ((\r
-        DEBUG_ERROR,\r
-        "QemuVideo: QEMU_VIDEO_VMWARE_SVGA ID mismatch "\r
-        "(got 0x%x, base address 0x%x)\n",\r
-        SvgaIdRead,\r
-        Private->VmwareSvgaBasePort\r
-        ));\r
-      Status = EFI_DEVICE_ERROR;\r
-      goto RestoreAttributes;\r
-    }\r
-\r
-    Private->FrameBufferVramBarIndex = PCI_BAR_IDX1;\r
-  }\r
-\r
   //\r
   // Get ParentDevicePath\r
   //\r
@@ -446,9 +413,6 @@ QemuVideoControllerDriverStart (
   case QEMU_VIDEO_BOCHS:\r
     Status = QemuVideoBochsModeSetup (Private, IsQxl);\r
     break;\r
-  case QEMU_VIDEO_VMWARE_SVGA:\r
-    Status = QemuVideoVmwareSvgaModeSetup (Private);\r
-    break;\r
   default:\r
     ASSERT (FALSE);\r
     Status = EFI_DEVICE_ERROR;\r
@@ -510,9 +474,6 @@ DestructQemuVideoGraphics:
 \r
 FreeModeData:\r
   FreePool (Private->ModeData);\r
-  if (Private->VmwareSvgaModeInfo != NULL) {\r
-    FreePool (Private->VmwareSvgaModeInfo);\r
-  }\r
 \r
 UninstallGopDevicePath:\r
   gBS->UninstallProtocolInterface (Private->Handle,\r
@@ -634,9 +595,6 @@ QemuVideoControllerDriverStop (
         );\r
 \r
   FreePool (Private->ModeData);\r
-  if (Private->VmwareSvgaModeInfo != NULL) {\r
-    FreePool (Private->VmwareSvgaModeInfo);\r
-  }\r
   gBS->UninstallProtocolInterface (Private->Handle,\r
          &gEfiDevicePathProtocolGuid, Private->GopDevicePath);\r
   FreePool (Private->GopDevicePath);\r
@@ -971,38 +929,6 @@ BochsRead (
   return Data;\r
 }\r
 \r
-VOID\r
-VmwareSvgaWrite (\r
-  QEMU_VIDEO_PRIVATE_DATA   *Private,\r
-  UINT16                    Register,\r
-  UINT32                    Value\r
-  )\r
-{\r
-  UnalignedIoWrite32 (\r
-    Private->VmwareSvgaBasePort + VMWARE_SVGA_INDEX_PORT,\r
-    Register\r
-    );\r
-  UnalignedIoWrite32 (\r
-    Private->VmwareSvgaBasePort + VMWARE_SVGA_VALUE_PORT,\r
-    Value\r
-    );\r
-}\r
-\r
-UINT32\r
-VmwareSvgaRead (\r
-  QEMU_VIDEO_PRIVATE_DATA   *Private,\r
-  UINT16                    Register\r
-  )\r
-{\r
-  UnalignedIoWrite32 (\r
-    Private->VmwareSvgaBasePort + VMWARE_SVGA_INDEX_PORT,\r
-    Register\r
-    );\r
-  return UnalignedIoRead32 (\r
-           Private->VmwareSvgaBasePort + VMWARE_SVGA_VALUE_PORT\r
-           );\r
-}\r
-\r
 VOID\r
 VgaOutb (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
@@ -1057,35 +983,6 @@ InitializeBochsGraphicsMode (
   ClearScreen (Private);\r
 }\r
 \r
-VOID\r
-InitializeVmwareSvgaGraphicsMode (\r
-  QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  QEMU_VIDEO_BOCHS_MODES   *ModeData\r
-  )\r
-{\r
-  UINT32 Capabilities;\r
-\r
-  VmwareSvgaWrite (Private, VmwareSvgaRegWidth, ModeData->Width);\r
-  VmwareSvgaWrite (Private, VmwareSvgaRegHeight, ModeData->Height);\r
-\r
-  Capabilities = VmwareSvgaRead (\r
-                   Private,\r
-                   VmwareSvgaRegCapabilities\r
-                   );\r
-  if ((Capabilities & VMWARE_SVGA_CAP_8BIT_EMULATION) != 0) {\r
-    VmwareSvgaWrite (\r
-      Private,\r
-      VmwareSvgaRegBitsPerPixel,\r
-      ModeData->ColorDepth\r
-      );\r
-  }\r
-\r
-  VmwareSvgaWrite (Private, VmwareSvgaRegEnable, 1);\r
-\r
-  SetDefaultPalette (Private);\r
-  ClearScreen (Private);\r
-}\r
-\r
 EFI_STATUS\r
 EFIAPI\r
 InitializeQemuVideo (\r
@@ -1105,18 +1002,5 @@ InitializeQemuVideo (
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
-  //\r
-  // Install EFI Driver Supported EFI Version Protocol required for\r
-  // EFI drivers that are on PCI and other plug in cards.\r
-  //\r
-  gQemuVideoDriverSupportedEfiVersion.FirmwareVersion = PcdGet32 (PcdDriverSupportedEfiVersion);\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &ImageHandle,\r
-                  &gEfiDriverSupportedEfiVersionProtocolGuid,\r
-                  &gQemuVideoDriverSupportedEfiVersion,\r
-                  NULL\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
   return Status;\r
 }\r