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
\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
static QEMU_VIDEO_CARD*\r
QemuVideoDetect(\r
+ IN UINT8 SubClass,\r
IN UINT16 VendorId,\r
IN UINT16 DeviceId\r
)\r
UINTN Index = 0;\r
\r
while (gQemuVideoCardList[Index].VendorId != 0) {\r
- if (gQemuVideoCardList[Index].VendorId == VendorId &&\r
+ if (gQemuVideoCardList[Index].SubClass == SubClass &&\r
+ gQemuVideoCardList[Index].VendorId == VendorId &&\r
gQemuVideoCardList[Index].DeviceId == DeviceId) {\r
return gQemuVideoCardList + Index;\r
}\r
}\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
+ 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
Status = EFI_SUCCESS;\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
//\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
Private->Variant = Card->Variant;\r
\r
+ //\r
+ // IsQxl is based on the detected Card->Variant, which at a later point might\r
+ // not match Private->Variant.\r
+ //\r
+ IsQxl = (BOOLEAN)(Card->Variant == QEMU_VIDEO_BOCHS);\r
+\r
//\r
// Save original PCI attributes\r
//\r
}\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
break;\r
case QEMU_VIDEO_BOCHS_MMIO:\r
case QEMU_VIDEO_BOCHS:\r
- Status = QemuVideoBochsModeSetup (Private);\r
+ Status = QemuVideoBochsModeSetup (Private, IsQxl);\r
break;\r
default:\r
ASSERT (FALSE);\r
goto UninstallGop;\r
}\r
\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
+ InstallVbeShim (Card->Name, Private->GraphicsOutput.Mode->FrameBufferBase);\r
+ }\r
+#endif\r
+\r
gBS->RestoreTPL (OldTpl);\r
return EFI_SUCCESS;\r
\r
Private->PciIo->Mem.Write (\r
Private->PciIo,\r
EfiPciIoWidthFillUint32,\r
- 0,\r
+ Private->FrameBufferVramBarIndex,\r
0,\r
0x400000 >> 2,\r
&Color\r
);\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