]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/QemuVideoDxe/Driver.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / OvmfPkg / QemuVideoDxe / Driver.c
index 17bd4cc2ccc3af88311a2f261f39967fab8a13ce..c28171d1371991a1f46150773af91b10571cc72f 100644 (file)
@@ -2,22 +2,16 @@
   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 "Qemu.h"\r
 #include <IndustryStandard/Acpi.h>\r
 \r
-EFI_DRIVER_BINDING_PROTOCOL gQemuVideoDriverBinding = {\r
+EFI_DRIVER_BINDING_PROTOCOL  gQemuVideoDriverBinding = {\r
   QemuVideoControllerDriverSupported,\r
   QemuVideoControllerDriverStart,\r
   QemuVideoControllerDriverStop,\r
@@ -26,52 +20,80 @@ EFI_DRIVER_BINDING_PROTOCOL gQemuVideoDriverBinding = {
   NULL\r
 };\r
 \r
-QEMU_VIDEO_CARD gQemuVideoCardList[] = {\r
-    {\r
-        CIRRUS_LOGIC_VENDOR_ID,\r
-        CIRRUS_LOGIC_5430_DEVICE_ID,\r
-        QEMU_VIDEO_CIRRUS_5430,\r
-        L"Cirrus 5430"\r
-    },{\r
-        CIRRUS_LOGIC_VENDOR_ID,\r
-        CIRRUS_LOGIC_5430_ALTERNATE_DEVICE_ID,\r
-        QEMU_VIDEO_CIRRUS_5430,\r
-        L"Cirrus 5430"\r
-    },{\r
-        CIRRUS_LOGIC_VENDOR_ID,\r
-        CIRRUS_LOGIC_5446_DEVICE_ID,\r
-        QEMU_VIDEO_CIRRUS_5446,\r
-        L"Cirrus 5446"\r
-    },{\r
-        0x1234,\r
-        0x1111,\r
-        QEMU_VIDEO_BOCHS_MMIO,\r
-        L"QEMU Standard VGA"\r
-    },{\r
-        0x1b36,\r
-        0x0100,\r
-        QEMU_VIDEO_BOCHS,\r
-        L"QEMU QXL VGA"\r
-    },{\r
-        0 /* end of list */\r
-    }\r
+QEMU_VIDEO_CARD  gQemuVideoCardList[] = {\r
+  {\r
+    PCI_CLASS_DISPLAY_VGA,\r
+    CIRRUS_LOGIC_VENDOR_ID,\r
+    CIRRUS_LOGIC_5430_DEVICE_ID,\r
+    QEMU_VIDEO_CIRRUS_5430,\r
+    L"Cirrus 5430"\r
+  },{\r
+    PCI_CLASS_DISPLAY_VGA,\r
+    CIRRUS_LOGIC_VENDOR_ID,\r
+    CIRRUS_LOGIC_5430_ALTERNATE_DEVICE_ID,\r
+    QEMU_VIDEO_CIRRUS_5430,\r
+    L"Cirrus 5430"\r
+  },{\r
+    PCI_CLASS_DISPLAY_VGA,\r
+    CIRRUS_LOGIC_VENDOR_ID,\r
+    CIRRUS_LOGIC_5446_DEVICE_ID,\r
+    QEMU_VIDEO_CIRRUS_5446,\r
+    L"Cirrus 5446"\r
+  },{\r
+    PCI_CLASS_DISPLAY_VGA,\r
+    0x1234,\r
+    0x1111,\r
+    QEMU_VIDEO_BOCHS_MMIO,\r
+    L"QEMU Standard VGA"\r
+  },{\r
+    PCI_CLASS_DISPLAY_OTHER,\r
+    0x1234,\r
+    0x1111,\r
+    QEMU_VIDEO_BOCHS_MMIO,\r
+    L"QEMU Standard VGA (secondary)"\r
+  },{\r
+    PCI_CLASS_DISPLAY_VGA,\r
+    0x1b36,\r
+    0x0100,\r
+    QEMU_VIDEO_BOCHS,\r
+    L"QEMU QXL VGA"\r
+  },{\r
+    PCI_CLASS_DISPLAY_VGA,\r
+    0x1af4,\r
+    0x1050,\r
+    QEMU_VIDEO_BOCHS_MMIO,\r
+    L"QEMU VirtIO VGA"\r
+  },{\r
+    PCI_CLASS_DISPLAY_VGA,\r
+    0x15ad,\r
+    0x0405,\r
+    QEMU_VIDEO_VMWARE_SVGA,\r
+    L"QEMU VMWare SVGA"\r
+  },{\r
+    0     /* end of list */\r
+  }\r
 };\r
 \r
-static QEMU_VIDEO_CARD*\r
-QemuVideoDetect(\r
-  IN UINT16 VendorId,\r
-  IN UINT16 DeviceId\r
+static QEMU_VIDEO_CARD *\r
+QemuVideoDetect (\r
+  IN UINT8   SubClass,\r
+  IN UINT16  VendorId,\r
+  IN UINT16  DeviceId\r
   )\r
 {\r
-  UINTN Index = 0;\r
+  UINTN  Index = 0;\r
 \r
   while (gQemuVideoCardList[Index].VendorId != 0) {\r
-    if (gQemuVideoCardList[Index].VendorId == VendorId &&\r
-        gQemuVideoCardList[Index].DeviceId == DeviceId) {\r
+    if ((gQemuVideoCardList[Index].SubClass == SubClass) &&\r
+        (gQemuVideoCardList[Index].VendorId == VendorId) &&\r
+        (gQemuVideoCardList[Index].DeviceId == DeviceId))\r
+    {\r
       return gQemuVideoCardList + Index;\r
     }\r
+\r
     Index++;\r
   }\r
+\r
   return NULL;\r
 }\r
 \r
@@ -89,15 +111,15 @@ QemuVideoDetect(
 EFI_STATUS\r
 EFIAPI\r
 QemuVideoControllerDriverSupported (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
+  IN EFI_HANDLE                   Controller,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
   )\r
 {\r
-  EFI_STATUS          Status;\r
-  EFI_PCI_IO_PROTOCOL *PciIo;\r
-  PCI_TYPE00          Pci;\r
-  QEMU_VIDEO_CARD     *Card;\r
+  EFI_STATUS           Status;\r
+  EFI_PCI_IO_PROTOCOL  *PciIo;\r
+  PCI_TYPE00           Pci;\r
+  QEMU_VIDEO_CARD      *Card;\r
 \r
   //\r
   // Open the PCI I/O Protocol\r
@@ -105,7 +127,7 @@ QemuVideoControllerDriverSupported (
   Status = gBS->OpenProtocol (\r
                   Controller,\r
                   &gEfiPciIoProtocolGuid,\r
-                  (VOID **) &PciIo,\r
+                  (VOID **)&PciIo,\r
                   This->DriverBindingHandle,\r
                   Controller,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -129,9 +151,13 @@ QemuVideoControllerDriverSupported (
   }\r
 \r
   Status = EFI_UNSUPPORTED;\r
-  Card = QemuVideoDetect(Pci.Hdr.VendorId, Pci.Hdr.DeviceId);\r
+  if (!IS_PCI_DISPLAY (&Pci)) {\r
+    goto Done;\r
+  }\r
+\r
+  Card = QemuVideoDetect (Pci.Hdr.ClassCode[1], Pci.Hdr.VendorId, Pci.Hdr.DeviceId);\r
   if (Card != NULL) {\r
-    DEBUG ((EFI_D_INFO, "QemuVideo: %s detected\n", Card->Name));\r
+    DEBUG ((DEBUG_INFO, "QemuVideo: %s detected\n", Card->Name));\r
     Status = EFI_SUCCESS;\r
   }\r
 \r
@@ -140,11 +166,11 @@ Done:
   // Close the PCI I/O Protocol\r
   //\r
   gBS->CloseProtocol (\r
-        Controller,\r
-        &gEfiPciIoProtocolGuid,\r
-        This->DriverBindingHandle,\r
-        Controller\r
-        );\r
+         Controller,\r
+         &gEfiPciIoProtocolGuid,\r
+         This->DriverBindingHandle,\r
+         Controller\r
+         );\r
 \r
   return Status;\r
 }\r
@@ -165,25 +191,26 @@ Done:
 EFI_STATUS\r
 EFIAPI\r
 QemuVideoControllerDriverStart (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
+  IN EFI_HANDLE                   Controller,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
   )\r
 {\r
-  EFI_TPL                           OldTpl;\r
-  EFI_STATUS                        Status;\r
-  QEMU_VIDEO_PRIVATE_DATA           *Private;\r
-  BOOLEAN                           IsQxl;\r
-  EFI_DEVICE_PATH_PROTOCOL          *ParentDevicePath;\r
-  ACPI_ADR_DEVICE_PATH              AcpiDeviceNode;\r
-  PCI_TYPE00                        Pci;\r
-  QEMU_VIDEO_CARD                   *Card;\r
-  EFI_PCI_IO_PROTOCOL               *ChildPciIo;\r
+  EFI_TPL                   OldTpl;\r
+  EFI_STATUS                Status;\r
+  QEMU_VIDEO_PRIVATE_DATA   *Private;\r
+  BOOLEAN                   IsQxl;\r
+  EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath;\r
+  ACPI_ADR_DEVICE_PATH      AcpiDeviceNode;\r
+  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
   //\r
-  // Allocate Private context data for GOP inteface.\r
+  // Allocate Private context data for GOP interface.\r
   //\r
   Private = AllocateZeroPool (sizeof (QEMU_VIDEO_PRIVATE_DATA));\r
   if (Private == NULL) {\r
@@ -194,7 +221,7 @@ QemuVideoControllerDriverStart (
   //\r
   // Set up context record\r
   //\r
-  Private->Signature  = QEMU_VIDEO_PRIVATE_DATA_SIGNATURE;\r
+  Private->Signature = QEMU_VIDEO_PRIVATE_DATA_SIGNATURE;\r
 \r
   //\r
   // Open PCI I/O Protocol\r
@@ -202,7 +229,7 @@ QemuVideoControllerDriverStart (
   Status = gBS->OpenProtocol (\r
                   Controller,\r
                   &gEfiPciIoProtocolGuid,\r
-                  (VOID **) &Private->PciIo,\r
+                  (VOID **)&Private->PciIo,\r
                   This->DriverBindingHandle,\r
                   Controller,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -215,12 +242,12 @@ QemuVideoControllerDriverStart (
   // Read the PCI Configuration Header from the PCI Device\r
   //\r
   Status = Private->PciIo->Pci.Read (\r
-                        Private->PciIo,\r
-                        EfiPciIoWidthUint32,\r
-                        0,\r
-                        sizeof (Pci) / sizeof (UINT32),\r
-                        &Pci\r
-                        );\r
+                                 Private->PciIo,\r
+                                 EfiPciIoWidthUint32,\r
+                                 0,\r
+                                 sizeof (Pci) / sizeof (UINT32),\r
+                                 &Pci\r
+                                 );\r
   if (EFI_ERROR (Status)) {\r
     goto ClosePciIo;\r
   }\r
@@ -228,11 +255,12 @@ QemuVideoControllerDriverStart (
   //\r
   // Determine card variant.\r
   //\r
-  Card = QemuVideoDetect(Pci.Hdr.VendorId, Pci.Hdr.DeviceId);\r
+  Card = QemuVideoDetect (Pci.Hdr.ClassCode[1], Pci.Hdr.VendorId, Pci.Hdr.DeviceId);\r
   if (Card == NULL) {\r
     Status = EFI_DEVICE_ERROR;\r
     goto ClosePciIo;\r
   }\r
+\r
   Private->Variant = Card->Variant;\r
 \r
   //\r
@@ -245,25 +273,44 @@ QemuVideoControllerDriverStart (
   // Save original PCI attributes\r
   //\r
   Status = Private->PciIo->Attributes (\r
-                    Private->PciIo,\r
-                    EfiPciIoAttributeOperationGet,\r
-                    0,\r
-                    &Private->OriginalPciAttributes\r
-                    );\r
+                             Private->PciIo,\r
+                             EfiPciIoAttributeOperationGet,\r
+                             0,\r
+                             &Private->OriginalPciAttributes\r
+                             );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    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) && IS_PCI_VGA (&Pci)) {\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
-                            NULL\r
-                            );\r
+                             Private->PciIo,\r
+                             EfiPciIoAttributeOperationEnable,\r
+                             EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | SupportedVgaIo,\r
+                             NULL\r
+                             );\r
   if (EFI_ERROR (Status)) {\r
     goto ClosePciIo;\r
   }\r
@@ -272,21 +319,25 @@ QemuVideoControllerDriverStart (
   // Check whenever the qemu stdvga mmio bar is present (qemu 1.3+).\r
   //\r
   if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO) {\r
-    EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *MmioDesc;\r
+    EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR  *MmioDesc;\r
 \r
     Status = Private->PciIo->GetBarAttributes (\r
-                        Private->PciIo,\r
-                        PCI_BAR_IDX2,\r
-                        NULL,\r
-                        (VOID**) &MmioDesc\r
-                        );\r
+                               Private->PciIo,\r
+                               PCI_BAR_IDX2,\r
+                               NULL,\r
+                               (VOID **)&MmioDesc\r
+                               );\r
     if (EFI_ERROR (Status) ||\r
-        MmioDesc->ResType != ACPI_ADDRESS_SPACE_TYPE_MEM) {\r
-      DEBUG ((EFI_D_INFO, "QemuVideo: No mmio bar, fallback to port io\n"));\r
+        (MmioDesc->ResType != ACPI_ADDRESS_SPACE_TYPE_MEM))\r
+    {\r
+      DEBUG ((DEBUG_INFO, "QemuVideo: No mmio bar, fallback to port io\n"));\r
       Private->Variant = QEMU_VIDEO_BOCHS;\r
     } else {\r
-      DEBUG ((EFI_D_INFO, "QemuVideo: Using mmio bar @ 0x%lx\n",\r
-              MmioDesc->AddrRangeMin));\r
+      DEBUG ((\r
+        DEBUG_INFO,\r
+        "QemuVideo: Using mmio bar @ 0x%lx\n",\r
+        MmioDesc->AddrRangeMin\r
+        ));\r
     }\r
 \r
     if (!EFI_ERROR (Status)) {\r
@@ -294,15 +345,24 @@ 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
-  if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO ||\r
-      Private->Variant == QEMU_VIDEO_BOCHS) {\r
-    UINT16 BochsId;\r
-    BochsId = BochsRead(Private, VBE_DISPI_INDEX_ID);\r
+  if ((Private->Variant == QEMU_VIDEO_BOCHS_MMIO) ||\r
+      (Private->Variant == QEMU_VIDEO_BOCHS))\r
+  {\r
+    UINT16  BochsId;\r
+    BochsId = BochsRead (Private, VBE_DISPI_INDEX_ID);\r
     if ((BochsId & 0xFFF0) != VBE_DISPI_ID0) {\r
-      DEBUG ((EFI_D_INFO, "QemuVideo: BochsID mismatch (got 0x%x)\n", BochsId));\r
+      DEBUG ((DEBUG_INFO, "QemuVideo: BochsID mismatch (got 0x%x)\n", BochsId));\r
       Status = EFI_DEVICE_ERROR;\r
       goto RestoreAttributes;\r
     }\r
@@ -314,7 +374,7 @@ QemuVideoControllerDriverStart (
   Status = gBS->HandleProtocol (\r
                   Controller,\r
                   &gEfiDevicePathProtocolGuid,\r
-                  (VOID **) &ParentDevicePath\r
+                  (VOID **)&ParentDevicePath\r
                   );\r
   if (EFI_ERROR (Status)) {\r
     goto RestoreAttributes;\r
@@ -324,15 +384,15 @@ QemuVideoControllerDriverStart (
   // Set Gop Device Path\r
   //\r
   ZeroMem (&AcpiDeviceNode, sizeof (ACPI_ADR_DEVICE_PATH));\r
-  AcpiDeviceNode.Header.Type = ACPI_DEVICE_PATH;\r
+  AcpiDeviceNode.Header.Type    = ACPI_DEVICE_PATH;\r
   AcpiDeviceNode.Header.SubType = ACPI_ADR_DP;\r
-  AcpiDeviceNode.ADR = ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, 0, 0);\r
+  AcpiDeviceNode.ADR            = ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, 0, 0);\r
   SetDevicePathNodeLength (&AcpiDeviceNode.Header, sizeof (ACPI_ADR_DEVICE_PATH));\r
 \r
   Private->GopDevicePath = AppendDevicePathNode (\r
-                                      ParentDevicePath,\r
-                                      (EFI_DEVICE_PATH_PROTOCOL *) &AcpiDeviceNode\r
-                                      );\r
+                             ParentDevicePath,\r
+                             (EFI_DEVICE_PATH_PROTOCOL *)&AcpiDeviceNode\r
+                             );\r
   if (Private->GopDevicePath == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
     goto RestoreAttributes;\r
@@ -355,19 +415,20 @@ QemuVideoControllerDriverStart (
   // Construct video mode buffer\r
   //\r
   switch (Private->Variant) {\r
-  case QEMU_VIDEO_CIRRUS_5430:\r
-  case QEMU_VIDEO_CIRRUS_5446:\r
-    Status = QemuVideoCirrusModeSetup (Private);\r
-    break;\r
-  case QEMU_VIDEO_BOCHS_MMIO:\r
-  case QEMU_VIDEO_BOCHS:\r
-    Status = QemuVideoBochsModeSetup (Private, IsQxl);\r
-    break;\r
-  default:\r
-    ASSERT (FALSE);\r
-    Status = EFI_DEVICE_ERROR;\r
-    break;\r
+    case QEMU_VIDEO_CIRRUS_5430:\r
+    case QEMU_VIDEO_CIRRUS_5446:\r
+      Status = QemuVideoCirrusModeSetup (Private);\r
+      break;\r
+    case QEMU_VIDEO_BOCHS_MMIO:\r
+    case QEMU_VIDEO_BOCHS:\r
+      Status = QemuVideoBochsModeSetup (Private, IsQxl);\r
+      break;\r
+    default:\r
+      ASSERT (FALSE);\r
+      Status = EFI_DEVICE_ERROR;\r
+      break;\r
   }\r
+\r
   if (EFI_ERROR (Status)) {\r
     goto UninstallGopDevicePath;\r
   }\r
@@ -394,28 +455,35 @@ QemuVideoControllerDriverStart (
   // Reference parent handle from child handle.\r
   //\r
   Status = gBS->OpenProtocol (\r
-                Controller,\r
-                &gEfiPciIoProtocolGuid,\r
-                (VOID **) &ChildPciIo,\r
-                This->DriverBindingHandle,\r
-                Private->Handle,\r
-                EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
-                );\r
+                  Controller,\r
+                  &gEfiPciIoProtocolGuid,\r
+                  (VOID **)&ChildPciIo,\r
+                  This->DriverBindingHandle,\r
+                  Private->Handle,\r
+                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+                  );\r
   if (EFI_ERROR (Status)) {\r
     goto UninstallGop;\r
   }\r
 \r
-  if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO ||\r
-      Private->Variant == QEMU_VIDEO_BOCHS) {\r
+ #if defined MDE_CPU_IA32 || defined MDE_CPU_X64\r
+  if ((Private->Variant == QEMU_VIDEO_BOCHS_MMIO) ||\r
+      (Private->Variant == QEMU_VIDEO_BOCHS))\r
+  {\r
     InstallVbeShim (Card->Name, Private->GraphicsOutput.Mode->FrameBufferBase);\r
   }\r
 \r
+ #endif\r
+\r
   gBS->RestoreTPL (OldTpl);\r
   return EFI_SUCCESS;\r
 \r
 UninstallGop:\r
-  gBS->UninstallProtocolInterface (Private->Handle,\r
-         &gEfiGraphicsOutputProtocolGuid, &Private->GraphicsOutput);\r
+  gBS->UninstallProtocolInterface (\r
+         Private->Handle,\r
+         &gEfiGraphicsOutputProtocolGuid,\r
+         &Private->GraphicsOutput\r
+         );\r
 \r
 DestructQemuVideoGraphics:\r
   QemuVideoGraphicsOutputDestructor (Private);\r
@@ -424,19 +492,30 @@ FreeModeData:
   FreePool (Private->ModeData);\r
 \r
 UninstallGopDevicePath:\r
-  gBS->UninstallProtocolInterface (Private->Handle,\r
-         &gEfiDevicePathProtocolGuid, Private->GopDevicePath);\r
+  gBS->UninstallProtocolInterface (\r
+         Private->Handle,\r
+         &gEfiDevicePathProtocolGuid,\r
+         Private->GopDevicePath\r
+         );\r
 \r
 FreeGopDevicePath:\r
   FreePool (Private->GopDevicePath);\r
 \r
 RestoreAttributes:\r
-  Private->PciIo->Attributes (Private->PciIo, EfiPciIoAttributeOperationSet,\r
-                    Private->OriginalPciAttributes, NULL);\r
+  Private->PciIo->Attributes (\r
+                    Private->PciIo,\r
+                    EfiPciIoAttributeOperationSet,\r
+                    Private->OriginalPciAttributes,\r
+                    NULL\r
+                    );\r
 \r
 ClosePciIo:\r
-  gBS->CloseProtocol (Controller, &gEfiPciIoProtocolGuid,\r
-         This->DriverBindingHandle, Controller);\r
+  gBS->CloseProtocol (\r
+         Controller,\r
+         &gEfiPciIoProtocolGuid,\r
+         This->DriverBindingHandle,\r
+         Controller\r
+         );\r
 \r
 FreePrivate:\r
   FreePool (Private);\r
@@ -463,15 +542,15 @@ RestoreTpl:
 EFI_STATUS\r
 EFIAPI\r
 QemuVideoControllerDriverStop (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN UINTN                          NumberOfChildren,\r
-  IN EFI_HANDLE                     *ChildHandleBuffer\r
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
+  IN EFI_HANDLE                   Controller,\r
+  IN UINTN                        NumberOfChildren,\r
+  IN EFI_HANDLE                   *ChildHandleBuffer\r
   )\r
 {\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL    *GraphicsOutput;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;\r
 \r
-  EFI_STATUS                      Status;\r
+  EFI_STATUS               Status;\r
   QEMU_VIDEO_PRIVATE_DATA  *Private;\r
 \r
   if (NumberOfChildren == 0) {\r
@@ -479,11 +558,11 @@ QemuVideoControllerDriverStop (
     // Close the PCI I/O Protocol\r
     //\r
     gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiPciIoProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
+           Controller,\r
+           &gEfiPciIoProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Controller\r
+           );\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -495,7 +574,7 @@ QemuVideoControllerDriverStop (
   Status = gBS->OpenProtocol (\r
                   ChildHandleBuffer[0],\r
                   &gEfiGraphicsOutputProtocolGuid,\r
-                  (VOID **) &GraphicsOutput,\r
+                  (VOID **)&GraphicsOutput,\r
                   This->DriverBindingHandle,\r
                   Controller,\r
                   EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
@@ -529,22 +608,25 @@ QemuVideoControllerDriverStop (
   // Restore original PCI attributes\r
   //\r
   Private->PciIo->Attributes (\r
-                  Private->PciIo,\r
-                  EfiPciIoAttributeOperationSet,\r
-                  Private->OriginalPciAttributes,\r
-                  NULL\r
-                  );\r
+                    Private->PciIo,\r
+                    EfiPciIoAttributeOperationSet,\r
+                    Private->OriginalPciAttributes,\r
+                    NULL\r
+                    );\r
 \r
   gBS->CloseProtocol (\r
-        Controller,\r
-        &gEfiPciIoProtocolGuid,\r
-        This->DriverBindingHandle,\r
-        Private->Handle\r
-        );\r
+         Controller,\r
+         &gEfiPciIoProtocolGuid,\r
+         This->DriverBindingHandle,\r
+         Private->Handle\r
+         );\r
 \r
   FreePool (Private->ModeData);\r
-  gBS->UninstallProtocolInterface (Private->Handle,\r
-         &gEfiDevicePathProtocolGuid, Private->GopDevicePath);\r
+  gBS->UninstallProtocolInterface (\r
+         Private->Handle,\r
+         &gEfiDevicePathProtocolGuid,\r
+         Private->GopDevicePath\r
+         );\r
   FreePool (Private->GopDevicePath);\r
 \r
   //\r
@@ -568,18 +650,18 @@ QemuVideoControllerDriverStop (
 VOID\r
 outb (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  UINTN                           Address,\r
-  UINT8                           Data\r
+  UINTN                    Address,\r
+  UINT8                    Data\r
   )\r
 {\r
   Private->PciIo->Io.Write (\r
-                      Private->PciIo,\r
-                      EfiPciIoWidthUint8,\r
-                      EFI_PCI_IO_PASS_THROUGH_BAR,\r
-                      Address,\r
-                      1,\r
-                      &Data\r
-                      );\r
+                       Private->PciIo,\r
+                       EfiPciIoWidthUint8,\r
+                       EFI_PCI_IO_PASS_THROUGH_BAR,\r
+                       Address,\r
+                       1,\r
+                       &Data\r
+                       );\r
 }\r
 \r
 /**\r
@@ -595,18 +677,18 @@ outb (
 VOID\r
 outw (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  UINTN                           Address,\r
-  UINT16                          Data\r
+  UINTN                    Address,\r
+  UINT16                   Data\r
   )\r
 {\r
   Private->PciIo->Io.Write (\r
-                      Private->PciIo,\r
-                      EfiPciIoWidthUint16,\r
-                      EFI_PCI_IO_PASS_THROUGH_BAR,\r
-                      Address,\r
-                      1,\r
-                      &Data\r
-                      );\r
+                       Private->PciIo,\r
+                       EfiPciIoWidthUint16,\r
+                       EFI_PCI_IO_PASS_THROUGH_BAR,\r
+                       Address,\r
+                       1,\r
+                       &Data\r
+                       );\r
 }\r
 \r
 /**\r
@@ -621,19 +703,19 @@ outw (
 UINT8\r
 inb (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  UINTN                           Address\r
+  UINTN                    Address\r
   )\r
 {\r
-  UINT8 Data;\r
+  UINT8  Data;\r
 \r
   Private->PciIo->Io.Read (\r
-                      Private->PciIo,\r
-                      EfiPciIoWidthUint8,\r
-                      EFI_PCI_IO_PASS_THROUGH_BAR,\r
-                      Address,\r
-                      1,\r
-                      &Data\r
-                      );\r
+                       Private->PciIo,\r
+                       EfiPciIoWidthUint8,\r
+                       EFI_PCI_IO_PASS_THROUGH_BAR,\r
+                       Address,\r
+                       1,\r
+                       &Data\r
+                       );\r
   return Data;\r
 }\r
 \r
@@ -649,19 +731,19 @@ inb (
 UINT16\r
 inw (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  UINTN                           Address\r
+  UINTN                    Address\r
   )\r
 {\r
   UINT16  Data;\r
 \r
   Private->PciIo->Io.Read (\r
-                      Private->PciIo,\r
-                      EfiPciIoWidthUint16,\r
-                      EFI_PCI_IO_PASS_THROUGH_BAR,\r
-                      Address,\r
-                      1,\r
-                      &Data\r
-                      );\r
+                       Private->PciIo,\r
+                       EfiPciIoWidthUint16,\r
+                       EFI_PCI_IO_PASS_THROUGH_BAR,\r
+                       Address,\r
+                       1,\r
+                       &Data\r
+                       );\r
   return Data;\r
 }\r
 \r
@@ -680,16 +762,16 @@ inw (
 VOID\r
 SetPaletteColor (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  UINTN                           Index,\r
-  UINT8                           Red,\r
-  UINT8                           Green,\r
-  UINT8                           Blue\r
+  UINTN                    Index,\r
+  UINT8                    Red,\r
+  UINT8                    Green,\r
+  UINT8                    Blue\r
   )\r
 {\r
-  VgaOutb (Private, PALETTE_INDEX_REGISTER, (UINT8) Index);\r
-  VgaOutb (Private, PALETTE_DATA_REGISTER, (UINT8) (Red >> 2));\r
-  VgaOutb (Private, PALETTE_DATA_REGISTER, (UINT8) (Green >> 2));\r
-  VgaOutb (Private, PALETTE_DATA_REGISTER, (UINT8) (Blue >> 2));\r
+  VgaOutb (Private, PALETTE_INDEX_REGISTER, (UINT8)Index);\r
+  VgaOutb (Private, PALETTE_DATA_REGISTER, (UINT8)(Red >> 2));\r
+  VgaOutb (Private, PALETTE_DATA_REGISTER, (UINT8)(Green >> 2));\r
+  VgaOutb (Private, PALETTE_DATA_REGISTER, (UINT8)(Blue >> 2));\r
 }\r
 \r
 /**\r
@@ -705,16 +787,16 @@ SetDefaultPalette (
   QEMU_VIDEO_PRIVATE_DATA  *Private\r
   )\r
 {\r
-  UINTN Index;\r
-  UINTN RedIndex;\r
-  UINTN GreenIndex;\r
-  UINTN BlueIndex;\r
+  UINTN  Index;\r
+  UINTN  RedIndex;\r
+  UINTN  GreenIndex;\r
+  UINTN  BlueIndex;\r
 \r
   Index = 0;\r
   for (RedIndex = 0; RedIndex < 8; RedIndex++) {\r
     for (GreenIndex = 0; GreenIndex < 8; GreenIndex++) {\r
       for (BlueIndex = 0; BlueIndex < 4; BlueIndex++) {\r
-        SetPaletteColor (Private, Index, (UINT8) (RedIndex << 5), (UINT8) (GreenIndex << 5), (UINT8) (BlueIndex << 6));\r
+        SetPaletteColor (Private, Index, (UINT8)(RedIndex << 5), (UINT8)(GreenIndex << 5), (UINT8)(BlueIndex << 6));\r
         Index++;\r
       }\r
     }\r
@@ -740,7 +822,7 @@ ClearScreen (
   Private->PciIo->Mem.Write (\r
                         Private->PciIo,\r
                         EfiPciIoWidthFillUint32,\r
-                        0,\r
+                        Private->FrameBufferVramBarIndex,\r
                         0,\r
                         0x400000 >> 2,\r
                         &Color\r
@@ -758,8 +840,8 @@ ClearScreen (
 VOID\r
 DrawLogo (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  UINTN                           ScreenWidth,\r
-  UINTN                           ScreenHeight\r
+  UINTN                    ScreenWidth,\r
+  UINTN                    ScreenHeight\r
   )\r
 {\r
 }\r
@@ -779,8 +861,8 @@ InitializeCirrusGraphicsMode (
   QEMU_VIDEO_CIRRUS_MODES  *ModeData\r
   )\r
 {\r
-  UINT8 Byte;\r
-  UINTN Index;\r
+  UINT8  Byte;\r
+  UINTN  Index;\r
 \r
   outw (Private, SEQ_ADDRESS_REGISTER, 0x1206);\r
   outw (Private, SEQ_ADDRESS_REGISTER, 0x0012);\r
@@ -791,7 +873,7 @@ InitializeCirrusGraphicsMode (
 \r
   if (Private->Variant == QEMU_VIDEO_CIRRUS_5430) {\r
     outb (Private, SEQ_ADDRESS_REGISTER, 0x0f);\r
-    Byte = (UINT8) ((inb (Private, SEQ_DATA_REGISTER) & 0xc7) ^ 0x30);\r
+    Byte = (UINT8)((inb (Private, SEQ_DATA_REGISTER) & 0xc7) ^ 0x30);\r
     outb (Private, SEQ_DATA_REGISTER, Byte);\r
   }\r
 \r
@@ -801,17 +883,17 @@ InitializeCirrusGraphicsMode (
   outw (Private, CRTC_ADDRESS_REGISTER, 0x2011);\r
 \r
   for (Index = 0; Index < 28; Index++) {\r
-    outw (Private, CRTC_ADDRESS_REGISTER, (UINT16) ((ModeData->CrtcSettings[Index] << 8) | Index));\r
+    outw (Private, CRTC_ADDRESS_REGISTER, (UINT16)((ModeData->CrtcSettings[Index] << 8) | Index));\r
   }\r
 \r
   for (Index = 0; Index < 9; Index++) {\r
-    outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((GraphicsController[Index] << 8) | Index));\r
+    outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16)((GraphicsController[Index] << 8) | Index));\r
   }\r
 \r
   inb (Private, INPUT_STATUS_1_REGISTER);\r
 \r
   for (Index = 0; Index < 21; Index++) {\r
-    outb (Private, ATT_ADDRESS_REGISTER, (UINT8) Index);\r
+    outb (Private, ATT_ADDRESS_REGISTER, (UINT8)Index);\r
     outb (Private, ATT_ADDRESS_REGISTER, AttributeController[Index]);\r
   }\r
 \r
@@ -833,21 +915,21 @@ BochsWrite (
   UINT16                   Data\r
   )\r
 {\r
-  EFI_STATUS   Status;\r
+  EFI_STATUS  Status;\r
 \r
   if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO) {\r
     Status = Private->PciIo->Mem.Write (\r
-        Private->PciIo,\r
-        EfiPciIoWidthUint16,\r
-        PCI_BAR_IDX2,\r
-        0x500 + (Reg << 1),\r
-        1,\r
-        &Data\r
-        );\r
+                                   Private->PciIo,\r
+                                   EfiPciIoWidthUint16,\r
+                                   PCI_BAR_IDX2,\r
+                                   0x500 + (Reg << 1),\r
+                                   1,\r
+                                   &Data\r
+                                   );\r
     ASSERT_EFI_ERROR (Status);\r
   } else {\r
     outw (Private, VBE_DISPI_IOPORT_INDEX, Reg);\r
-    outw (Private, VBE_DISPI_IOPORT_DATA,  Data);\r
+    outw (Private, VBE_DISPI_IOPORT_DATA, Data);\r
   }\r
 }\r
 \r
@@ -857,23 +939,24 @@ BochsRead (
   UINT16                   Reg\r
   )\r
 {\r
-  EFI_STATUS   Status;\r
-  UINT16       Data;\r
+  EFI_STATUS  Status;\r
+  UINT16      Data;\r
 \r
   if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO) {\r
     Status = Private->PciIo->Mem.Read (\r
-        Private->PciIo,\r
-        EfiPciIoWidthUint16,\r
-        PCI_BAR_IDX2,\r
-        0x500 + (Reg << 1),\r
-        1,\r
-        &Data\r
-        );\r
+                                   Private->PciIo,\r
+                                   EfiPciIoWidthUint16,\r
+                                   PCI_BAR_IDX2,\r
+                                   0x500 + (Reg << 1),\r
+                                   1,\r
+                                   &Data\r
+                                   );\r
     ASSERT_EFI_ERROR (Status);\r
   } else {\r
     outw (Private, VBE_DISPI_IOPORT_INDEX, Reg);\r
     Data = inw (Private, VBE_DISPI_IOPORT_DATA);\r
   }\r
+\r
   return Data;\r
 }\r
 \r
@@ -884,48 +967,88 @@ VgaOutb (
   UINT8                    Data\r
   )\r
 {\r
-  EFI_STATUS   Status;\r
+  EFI_STATUS  Status;\r
 \r
   if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO) {\r
     Status = Private->PciIo->Mem.Write (\r
-        Private->PciIo,\r
-        EfiPciIoWidthUint8,\r
-        PCI_BAR_IDX2,\r
-        0x400 - 0x3c0 + Reg,\r
-        1,\r
-        &Data\r
-        );\r
+                                   Private->PciIo,\r
+                                   EfiPciIoWidthUint8,\r
+                                   PCI_BAR_IDX2,\r
+                                   0x400 - 0x3c0 + Reg,\r
+                                   1,\r
+                                   &Data\r
+                                   );\r
     ASSERT_EFI_ERROR (Status);\r
   } else {\r
     outb (Private, Reg, Data);\r
   }\r
 }\r
 \r
+STATIC\r
+UINT8\r
+VgaInb (\r
+  QEMU_VIDEO_PRIVATE_DATA  *Private,\r
+  UINTN                    Reg\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINT8       Data;\r
+\r
+  if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO) {\r
+    Data   = 0;\r
+    Status = Private->PciIo->Mem.Read (\r
+                                   Private->PciIo,\r
+                                   EfiPciIoWidthUint8,\r
+                                   PCI_BAR_IDX2,\r
+                                   0x400 - 0x3c0 + Reg,\r
+                                   1,\r
+                                   &Data\r
+                                   );\r
+    ASSERT_EFI_ERROR (Status);\r
+  } else {\r
+    Data = inb (Private, Reg);\r
+  }\r
+\r
+  return Data;\r
+}\r
+\r
 VOID\r
 InitializeBochsGraphicsMode (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  QEMU_VIDEO_BOCHS_MODES  *ModeData\r
+  QEMU_VIDEO_MODE_DATA     *ModeData\r
   )\r
 {\r
-  DEBUG ((EFI_D_INFO, "InitializeBochsGraphicsMode: %dx%d @ %d\n",\r
-          ModeData->Width, ModeData->Height, ModeData->ColorDepth));\r
-\r
-  /* unblank */\r
+  DEBUG ((\r
+    DEBUG_INFO,\r
+    "InitializeBochsGraphicsMode: %dx%d @ %d\n",\r
+    ModeData->HorizontalResolution,\r
+    ModeData->VerticalResolution,\r
+    ModeData->ColorDepth\r
+    ));\r
+\r
+  /* set color mode */\r
+  VgaOutb (Private, MISC_OUTPUT_REGISTER, 0x01);\r
+\r
+  /* reset flip flop + unblank */\r
+  VgaInb (Private, INPUT_STATUS_1_REGISTER);\r
   VgaOutb (Private, ATT_ADDRESS_REGISTER, 0x20);\r
 \r
-  BochsWrite (Private, VBE_DISPI_INDEX_ENABLE,      0);\r
-  BochsWrite (Private, VBE_DISPI_INDEX_BANK,        0);\r
-  BochsWrite (Private, VBE_DISPI_INDEX_X_OFFSET,    0);\r
-  BochsWrite (Private, VBE_DISPI_INDEX_Y_OFFSET,    0);\r
+  BochsWrite (Private, VBE_DISPI_INDEX_ENABLE, 0);\r
+  BochsWrite (Private, VBE_DISPI_INDEX_BANK, 0);\r
+  BochsWrite (Private, VBE_DISPI_INDEX_X_OFFSET, 0);\r
+  BochsWrite (Private, VBE_DISPI_INDEX_Y_OFFSET, 0);\r
 \r
-  BochsWrite (Private, VBE_DISPI_INDEX_BPP,         (UINT16) ModeData->ColorDepth);\r
-  BochsWrite (Private, VBE_DISPI_INDEX_XRES,        (UINT16) ModeData->Width);\r
-  BochsWrite (Private, VBE_DISPI_INDEX_VIRT_WIDTH,  (UINT16) ModeData->Width);\r
-  BochsWrite (Private, VBE_DISPI_INDEX_YRES,        (UINT16) ModeData->Height);\r
-  BochsWrite (Private, VBE_DISPI_INDEX_VIRT_HEIGHT, (UINT16) ModeData->Height);\r
+  BochsWrite (Private, VBE_DISPI_INDEX_BPP, (UINT16)ModeData->ColorDepth);\r
+  BochsWrite (Private, VBE_DISPI_INDEX_XRES, (UINT16)ModeData->HorizontalResolution);\r
+  BochsWrite (Private, VBE_DISPI_INDEX_VIRT_WIDTH, (UINT16)ModeData->HorizontalResolution);\r
+  BochsWrite (Private, VBE_DISPI_INDEX_YRES, (UINT16)ModeData->VerticalResolution);\r
+  BochsWrite (Private, VBE_DISPI_INDEX_VIRT_HEIGHT, (UINT16)ModeData->VerticalResolution);\r
 \r
-  BochsWrite (Private, VBE_DISPI_INDEX_ENABLE,\r
-              VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED);\r
+  BochsWrite (\r
+    Private,\r
+    VBE_DISPI_INDEX_ENABLE,\r
+    VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED\r
+    );\r
 \r
   SetDefaultPalette (Private);\r
   ClearScreen (Private);\r
@@ -934,11 +1057,11 @@ InitializeBochsGraphicsMode (
 EFI_STATUS\r
 EFIAPI\r
 InitializeQemuVideo (\r
-  IN EFI_HANDLE           ImageHandle,\r
-  IN EFI_SYSTEM_TABLE     *SystemTable\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  EFI_STATUS              Status;\r
+  EFI_STATUS  Status;\r
 \r
   Status = EfiLibInstallDriverBindingComponentName2 (\r
              ImageHandle,\r
@@ -950,18 +1073,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