]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/QemuVideoDxe/Qemu.h
OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly
[mirror_edk2.git] / OvmfPkg / QemuVideoDxe / Qemu.h
index d3d5f6fb82c12ce83e49be0c087afd244d872371..7fbb25b3efd35c47bb88ac31bda9d92653f7f145 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
   QEMU Video Controller Driver\r
 \r
-  Copyright (c) 2006 - 2010, Intel Corporation\r
-  All rights reserved. This program and the accompanying materials\r
+  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\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
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/DevicePathLib.h>\r
 #include <Library/TimerLib.h>\r
+#include <Library/FrameBufferBltLib.h>\r
 \r
 #include <IndustryStandard/Pci.h>\r
+#include <IndustryStandard/Acpi.h>\r
 \r
 //\r
 // QEMU Video PCI Configuration Header values\r
 // QEMU Vide Graphical Mode Data\r
 //\r
 typedef struct {\r
-  UINT32  ModeNumber;\r
+  UINT32  InternalModeIndex; // points into card-specific mode table\r
   UINT32  HorizontalResolution;\r
   UINT32  VerticalResolution;\r
   UINT32  ColorDepth;\r
-  UINT32  RefreshRate;\r
 } QEMU_VIDEO_MODE_DATA;\r
 \r
 #define PIXEL_RED_SHIFT   0\r
@@ -86,6 +87,21 @@ typedef struct {
 //\r
 #define QEMU_VIDEO_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('Q', 'V', 'I', 'D')\r
 \r
+typedef enum {\r
+  QEMU_VIDEO_CIRRUS_5430 = 1,\r
+  QEMU_VIDEO_CIRRUS_5446,\r
+  QEMU_VIDEO_BOCHS,\r
+  QEMU_VIDEO_BOCHS_MMIO,\r
+  QEMU_VIDEO_VMWARE_SVGA,\r
+} QEMU_VIDEO_VARIANT;\r
+\r
+typedef struct {\r
+  UINT16                                VendorId;\r
+  UINT16                                DeviceId;\r
+  QEMU_VIDEO_VARIANT                    Variant;\r
+  CHAR16                                *Name;\r
+} QEMU_VIDEO_CARD;\r
+\r
 typedef struct {\r
   UINT64                                Signature;\r
   EFI_HANDLE                            Handle;\r
@@ -93,25 +109,39 @@ typedef struct {
   UINT64                                OriginalPciAttributes;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL          GraphicsOutput;\r
   EFI_DEVICE_PATH_PROTOCOL              *GopDevicePath;\r
-  UINTN                                 CurrentMode;\r
+\r
+  //\r
+  // The next two fields match the client-visible\r
+  // EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.MaxMode field.\r
+  //\r
   UINTN                                 MaxMode;\r
   QEMU_VIDEO_MODE_DATA                  *ModeData;\r
-  UINT8                                 *LineBuffer;\r
-  BOOLEAN                               HardwareNeedsStarting;\r
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *VmwareSvgaModeInfo;\r
+\r
+  QEMU_VIDEO_VARIANT                    Variant;\r
+  FRAME_BUFFER_CONFIGURE                *FrameBufferBltConfigure;\r
+  UINTN                                 FrameBufferBltConfigureSize;\r
+  UINT8                                 FrameBufferVramBarIndex;\r
+  UINT16                                VmwareSvgaBasePort;\r
 } QEMU_VIDEO_PRIVATE_DATA;\r
 \r
 ///\r
-/// Video Mode structure\r
+/// Card-specific Video Mode structures\r
 ///\r
 typedef struct {\r
   UINT32  Width;\r
   UINT32  Height;\r
   UINT32  ColorDepth;\r
-  UINT32  RefreshRate;\r
   UINT8   *CrtcSettings;\r
   UINT16  *SeqSettings;\r
   UINT8   MiscSetting;\r
-} QEMU_VIDEO_VIDEO_MODES;\r
+} QEMU_VIDEO_CIRRUS_MODES;\r
+\r
+typedef struct {\r
+  UINT32  Width;\r
+  UINT32  Height;\r
+  UINT32  ColorDepth;\r
+} QEMU_VIDEO_BOCHS_MODES;\r
 \r
 #define QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS(a) \\r
   CR(a, QEMU_VIDEO_PRIVATE_DATA, GraphicsOutput, QEMU_VIDEO_PRIVATE_DATA_SIGNATURE)\r
@@ -128,7 +158,8 @@ extern UINT8                                      Crtc_800_600_256_60[];
 extern UINT16                                     Seq_800_600_256_60[];\r
 extern UINT8                                      Crtc_1024_768_256_60[];\r
 extern UINT16                                     Seq_1024_768_256_60[];\r
-extern QEMU_VIDEO_VIDEO_MODES              QemuVideoVideoModes[];\r
+extern QEMU_VIDEO_CIRRUS_MODES                    QemuVideoCirrusModes[];\r
+extern QEMU_VIDEO_BOCHS_MODES                     QemuVideoBochsModes[];\r
 extern EFI_DRIVER_BINDING_PROTOCOL                gQemuVideoDriverBinding;\r
 extern EFI_COMPONENT_NAME_PROTOCOL                gQemuVideoComponentName;\r
 extern EFI_COMPONENT_NAME2_PROTOCOL               gQemuVideoComponentName2;\r
@@ -150,6 +181,34 @@ extern EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL  gQemuVideoDriverSupportedEfiVe
 #define PALETTE_INDEX_REGISTER  0x3c8\r
 #define PALETTE_DATA_REGISTER   0x3c9\r
 \r
+#define VBE_DISPI_IOPORT_INDEX           0x01CE\r
+#define VBE_DISPI_IOPORT_DATA            0x01D0\r
+\r
+#define VBE_DISPI_INDEX_ID               0x0\r
+#define VBE_DISPI_INDEX_XRES             0x1\r
+#define VBE_DISPI_INDEX_YRES             0x2\r
+#define VBE_DISPI_INDEX_BPP              0x3\r
+#define VBE_DISPI_INDEX_ENABLE           0x4\r
+#define VBE_DISPI_INDEX_BANK             0x5\r
+#define VBE_DISPI_INDEX_VIRT_WIDTH       0x6\r
+#define VBE_DISPI_INDEX_VIRT_HEIGHT      0x7\r
+#define VBE_DISPI_INDEX_X_OFFSET         0x8\r
+#define VBE_DISPI_INDEX_Y_OFFSET         0x9\r
+#define VBE_DISPI_INDEX_VIDEO_MEMORY_64K 0xa\r
+\r
+#define VBE_DISPI_ID0                    0xB0C0\r
+#define VBE_DISPI_ID1                    0xB0C1\r
+#define VBE_DISPI_ID2                    0xB0C2\r
+#define VBE_DISPI_ID3                    0xB0C3\r
+#define VBE_DISPI_ID4                    0xB0C4\r
+#define VBE_DISPI_ID5                    0xB0C5\r
+\r
+#define VBE_DISPI_DISABLED               0x00\r
+#define VBE_DISPI_ENABLED                0x01\r
+#define VBE_DISPI_GETCAPS                0x02\r
+#define VBE_DISPI_8BIT_DAC               0x20\r
+#define VBE_DISPI_LFB_ENABLED            0x40\r
+#define VBE_DISPI_NOCLEARMEM             0x80\r
 \r
 //\r
 // Graphics Output Hardware abstraction internal worker functions\r
@@ -358,9 +417,15 @@ QemuVideoComponentNameGetControllerName (
 // Local Function Prototypes\r
 //\r
 VOID\r
-InitializeGraphicsMode (\r
+InitializeCirrusGraphicsMode (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  QEMU_VIDEO_VIDEO_MODES   *ModeData\r
+  QEMU_VIDEO_CIRRUS_MODES  *ModeData\r
+  );\r
+\r
+VOID\r
+InitializeBochsGraphicsMode (\r
+  QEMU_VIDEO_PRIVATE_DATA  *Private,\r
+  QEMU_VIDEO_BOCHS_MODES   *ModeData\r
   );\r
 \r
 VOID\r
@@ -410,9 +475,65 @@ inw (
   UINTN                           Address\r
   );\r
 \r
+VOID\r
+BochsWrite (\r
+  QEMU_VIDEO_PRIVATE_DATA  *Private,\r
+  UINT16                   Reg,\r
+  UINT16                   Data\r
+  );\r
+\r
+UINT16\r
+BochsRead (\r
+  QEMU_VIDEO_PRIVATE_DATA  *Private,\r
+  UINT16                   Reg\r
+  );\r
+\r
+VOID\r
+VgaOutb (\r
+  QEMU_VIDEO_PRIVATE_DATA  *Private,\r
+  UINTN                    Reg,\r
+  UINT8                    Data\r
+  );\r
+\r
 EFI_STATUS\r
-QemuVideoVideoModeSetup (\r
+QemuVideoCirrusModeSetup (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private\r
   );\r
 \r
+EFI_STATUS\r
+QemuVideoBochsModeSetup (\r
+  QEMU_VIDEO_PRIVATE_DATA  *Private,\r
+  BOOLEAN                  IsQxl\r
+  );\r
+\r
+EFI_STATUS\r
+QemuVideoVmwareSvgaModeSetup (\r
+  QEMU_VIDEO_PRIVATE_DATA *Private\r
+  );\r
+\r
+VOID\r
+InstallVbeShim (\r
+  IN CONST CHAR16         *CardName,\r
+  IN EFI_PHYSICAL_ADDRESS FrameBufferBase\r
+  );\r
+\r
+VOID\r
+VmwareSvgaWrite (\r
+  QEMU_VIDEO_PRIVATE_DATA *Private,\r
+  UINT16                  Register,\r
+  UINT32                  Value\r
+  );\r
+\r
+UINT32\r
+VmwareSvgaRead (\r
+  QEMU_VIDEO_PRIVATE_DATA *Private,\r
+  UINT16                  Register\r
+  );\r
+\r
+VOID\r
+InitializeVmwareSvgaGraphicsMode (\r
+  QEMU_VIDEO_PRIVATE_DATA  *Private,\r
+  QEMU_VIDEO_BOCHS_MODES   *ModeData\r
+  );\r
+\r
 #endif\r