+VOID\r
+BochsWrite (\r
+ QEMU_VIDEO_PRIVATE_DATA *Private,\r
+ UINT16 Reg,\r
+ UINT16 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
+ 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
+BochsRead (\r
+ QEMU_VIDEO_PRIVATE_DATA *Private,\r
+ UINT16 Reg\r
+ )\r
+{\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
+\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
+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_MODE_DATA *ModeData\r
+ )\r
+{\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
+\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 (\r
+ Private,\r
+ VBE_DISPI_INDEX_ENABLE,\r
+ VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED\r
+ );\r
+\r
+ SetDefaultPalette (Private);\r
+ ClearScreen (Private);\r
+}\r
+\r