**/\r
\r
#include "Qemu.h"\r
+#include <IndustryStandard/Acpi.h>\r
\r
EFI_DRIVER_BINDING_PROTOCOL gQemuVideoDriverBinding = {\r
QemuVideoControllerDriverSupported,\r
},{\r
0x1234,\r
0x1111,\r
- QEMU_VIDEO_BOCHS,\r
+ QEMU_VIDEO_BOCHS_MMIO,\r
L"QEMU Standard VGA"\r
},{\r
0x1b36,\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
- EFI_STATUS Status;\r
- QEMU_VIDEO_PRIVATE_DATA *Private;\r
- BOOLEAN PciAttributesSaved;\r
- EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
- ACPI_ADR_DEVICE_PATH AcpiDeviceNode;\r
- PCI_TYPE00 Pci;\r
- QEMU_VIDEO_CARD *Card;\r
+ EFI_STATUS Status;\r
+ QEMU_VIDEO_PRIVATE_DATA *Private;\r
+ BOOLEAN PciAttributesSaved;\r
+ EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
+ ACPI_ADR_DEVICE_PATH AcpiDeviceNode;\r
+ PCI_TYPE00 Pci;\r
+ QEMU_VIDEO_CARD *Card;\r
+ EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *MmioDesc;\r
\r
PciAttributesSaved = FALSE;\r
//\r
goto Error;\r
}\r
\r
+ //\r
+ // Check whenever the qemu stdvga mmio bar is present (qemu 1.3+).\r
+ //\r
+ if (Private->Variant == QEMU_VIDEO_BOCHS_MMIO) {\r
+ Status = Private->PciIo->GetBarAttributes (\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
+ Private->Variant = QEMU_VIDEO_BOCHS;\r
+ } else {\r
+ DEBUG ((EFI_D_INFO, "QemuVideo: Using mmio bar @ 0x%lx\n",\r
+ MmioDesc->AddrRangeMin));\r
+ }\r
+ }\r
+\r
//\r
// Check if accessing the bochs interface works.\r
//\r
- if (Private->Variant == QEMU_VIDEO_BOCHS) {\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 ((BochsId & 0xFFF0) != VBE_DISPI_ID0) {\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);\r
break;\r
UINT8 Blue\r
)\r
{\r
- outb (Private, PALETTE_INDEX_REGISTER, (UINT8) Index);\r
- outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Red >> 2));\r
- outb (Private, PALETTE_DATA_REGISTER, (UINT8) (Green >> 2));\r
- outb (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
UINT16 Data\r
)\r
{\r
- outw (Private, VBE_DISPI_IOPORT_INDEX, Reg);\r
- outw (Private, VBE_DISPI_IOPORT_DATA, Data);\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
+ ASSERT_EFI_ERROR (Status);\r
+ } else {\r
+ outw (Private, VBE_DISPI_IOPORT_INDEX, Reg);\r
+ outw (Private, VBE_DISPI_IOPORT_DATA, Data);\r
+ }\r
}\r
\r
UINT16\r
UINT16 Reg\r
)\r
{\r
- UINT16 Data;\r
-\r
- outw (Private, VBE_DISPI_IOPORT_INDEX, Reg);\r
- Data = inw (Private, VBE_DISPI_IOPORT_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
+ ASSERT_EFI_ERROR (Status);\r
+ } else {\r
+ outw (Private, VBE_DISPI_IOPORT_INDEX, Reg);\r
+ Data = inw (Private, VBE_DISPI_IOPORT_DATA);\r
+ }\r
return Data;\r
}\r
\r
+VOID\r
+VgaOutb (\r
+ QEMU_VIDEO_PRIVATE_DATA *Private,\r
+ UINTN Reg,\r
+ UINT8 Data\r
+ )\r
+{\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
+ ASSERT_EFI_ERROR (Status);\r
+ } else {\r
+ outb (Private, Reg, Data);\r
+ }\r
+}\r
+\r
VOID\r
InitializeBochsGraphicsMode (\r
QEMU_VIDEO_PRIVATE_DATA *Private,\r
ModeData->Width, ModeData->Height, ModeData->ColorDepth));\r
\r
/* unblank */\r
- outb (Private, ATT_ADDRESS_REGISTER, 0x20);\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