]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/QemuVideoDxe/Qemu.h
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / OvmfPkg / QemuVideoDxe / Qemu.h
index 1c24a58bd527d8411df339198550c6bd631f69b3..57341a0bbfc497326b968076214abf7cbdc432d5 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   QEMU Video Controller Driver\r
 \r
-  Copyright (c) 2006 - 2010, 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
-\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
+  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -19,7 +13,6 @@
 #ifndef _QEMU_H_\r
 #define _QEMU_H_\r
 \r
-\r
 #include <Uefi.h>\r
 #include <Protocol/GraphicsOutput.h>\r
 #include <Protocol/PciIo.h>\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
 //\r
-#define CIRRUS_LOGIC_VENDOR_ID                0x1013\r
-#define CIRRUS_LOGIC_5430_DEVICE_ID           0x00a8\r
-#define CIRRUS_LOGIC_5430_ALTERNATE_DEVICE_ID 0x00a0\r
-#define CIRRUS_LOGIC_5446_DEVICE_ID           0x00b8\r
+#define CIRRUS_LOGIC_VENDOR_ID                 0x1013\r
+#define CIRRUS_LOGIC_5430_DEVICE_ID            0x00a8\r
+#define CIRRUS_LOGIC_5430_ALTERNATE_DEVICE_ID  0x00a0\r
+#define CIRRUS_LOGIC_5446_DEVICE_ID            0x00b8\r
 \r
 //\r
 // QEMU Vide Graphical Mode Data\r
 //\r
 typedef struct {\r
-  UINT32  ModeNumber;\r
-  UINT32  HorizontalResolution;\r
-  UINT32  VerticalResolution;\r
-  UINT32  ColorDepth;\r
-  UINT32  RefreshRate;\r
+  UINT32    InternalModeIndex; // points into card-specific mode table\r
+  UINT32    HorizontalResolution;\r
+  UINT32    VerticalResolution;\r
+  UINT32    ColorDepth;\r
 } QEMU_VIDEO_MODE_DATA;\r
 \r
-#define PIXEL_RED_SHIFT   0\r
-#define PIXEL_GREEN_SHIFT 3\r
-#define PIXEL_BLUE_SHIFT  6\r
+#define PIXEL_RED_SHIFT    0\r
+#define PIXEL_GREEN_SHIFT  3\r
+#define PIXEL_BLUE_SHIFT   6\r
 \r
 #define PIXEL_RED_MASK    (BIT7 | BIT6 | BIT5)\r
 #define PIXEL_GREEN_MASK  (BIT4 | BIT3 | BIT2)\r
 #define PIXEL_BLUE_MASK   (BIT1 | BIT0)\r
 \r
-#define PIXEL_TO_COLOR_BYTE(pixel, mask, shift) ((UINT8) ((pixel & mask) << shift))\r
-#define PIXEL_TO_RED_BYTE(pixel) PIXEL_TO_COLOR_BYTE(pixel, PIXEL_RED_MASK, PIXEL_RED_SHIFT)\r
-#define PIXEL_TO_GREEN_BYTE(pixel) PIXEL_TO_COLOR_BYTE(pixel, PIXEL_GREEN_MASK, PIXEL_GREEN_SHIFT)\r
-#define PIXEL_TO_BLUE_BYTE(pixel) PIXEL_TO_COLOR_BYTE(pixel, PIXEL_BLUE_MASK, PIXEL_BLUE_SHIFT)\r
+#define PIXEL_TO_COLOR_BYTE(pixel, mask, shift)  ((UINT8) ((pixel & mask) << shift))\r
+#define PIXEL_TO_RED_BYTE(pixel)                 PIXEL_TO_COLOR_BYTE(pixel, PIXEL_RED_MASK, PIXEL_RED_SHIFT)\r
+#define PIXEL_TO_GREEN_BYTE(pixel)               PIXEL_TO_COLOR_BYTE(pixel, PIXEL_GREEN_MASK, PIXEL_GREEN_SHIFT)\r
+#define PIXEL_TO_BLUE_BYTE(pixel)                PIXEL_TO_COLOR_BYTE(pixel, PIXEL_BLUE_MASK, PIXEL_BLUE_SHIFT)\r
 \r
 #define RGB_BYTES_TO_PIXEL(Red, Green, Blue) \\r
   (UINT8) ( (((Red) >> PIXEL_RED_SHIFT) & PIXEL_RED_MASK) | \\r
@@ -86,70 +80,125 @@ 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
+  UINT8                 SubClass;\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
-  EFI_PCI_IO_PROTOCOL                   *PciIo;\r
-  UINT64                                OriginalPciAttributes;\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL          GraphicsOutput;\r
-  EFI_DEVICE_PATH_PROTOCOL              *GopDevicePath;\r
-  UINTN                                 CurrentMode;\r
-  UINTN                                 MaxMode;\r
-  QEMU_VIDEO_MODE_DATA                  *ModeData;\r
-  UINT8                                 *LineBuffer;\r
-  BOOLEAN                               HardwareNeedsStarting;\r
+  UINT64                          Signature;\r
+  EFI_HANDLE                      Handle;\r
+  EFI_PCI_IO_PROTOCOL             *PciIo;\r
+  UINT64                          OriginalPciAttributes;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL    GraphicsOutput;\r
+  EFI_DEVICE_PATH_PROTOCOL        *GopDevicePath;\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
+\r
+  QEMU_VIDEO_VARIANT              Variant;\r
+  FRAME_BUFFER_CONFIGURE          *FrameBufferBltConfigure;\r
+  UINTN                           FrameBufferBltConfigureSize;\r
+  UINT8                           FrameBufferVramBarIndex;\r
+\r
+  UINT8                           Edid[128];\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
+  UINT32    Width;\r
+  UINT32    Height;\r
+  UINT32    ColorDepth;\r
+  UINT8     *CrtcSettings;\r
+  UINT16    *SeqSettings;\r
+  UINT8     MiscSetting;\r
+} QEMU_VIDEO_CIRRUS_MODES;\r
+\r
+typedef struct {\r
+  UINT32    Width;\r
+  UINT32    Height;\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
 \r
-\r
 //\r
 // Global Variables\r
 //\r
-extern UINT8                                      AttributeController[];\r
-extern UINT8                                      GraphicsController[];\r
-extern UINT8                                      Crtc_640_480_256_60[];\r
-extern UINT16                                     Seq_640_480_256_60[];\r
-extern UINT8                                      Crtc_800_600_256_60[];\r
-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 EFI_DRIVER_BINDING_PROTOCOL                gQemuVideoDriverBinding;\r
-extern EFI_COMPONENT_NAME_PROTOCOL                gQemuVideoComponentName;\r
-extern EFI_COMPONENT_NAME2_PROTOCOL               gQemuVideoComponentName2;\r
-extern EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL  gQemuVideoDriverSupportedEfiVersion;\r
+extern UINT8                         AttributeController[];\r
+extern UINT8                         GraphicsController[];\r
+extern UINT8                         Crtc_640_480_256_60[];\r
+extern UINT16                        Seq_640_480_256_60[];\r
+extern UINT8                         Crtc_800_600_256_60[];\r
+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_CIRRUS_MODES       QemuVideoCirrusModes[];\r
+extern EFI_DRIVER_BINDING_PROTOCOL   gQemuVideoDriverBinding;\r
+extern EFI_COMPONENT_NAME_PROTOCOL   gQemuVideoComponentName;\r
+extern EFI_COMPONENT_NAME2_PROTOCOL  gQemuVideoComponentName2;\r
 \r
 //\r
 // Io Registers defined by VGA\r
 //\r
-#define CRTC_ADDRESS_REGISTER   0x3d4\r
-#define CRTC_DATA_REGISTER      0x3d5\r
-#define SEQ_ADDRESS_REGISTER    0x3c4\r
-#define SEQ_DATA_REGISTER       0x3c5\r
-#define GRAPH_ADDRESS_REGISTER  0x3ce\r
-#define GRAPH_DATA_REGISTER     0x3cf\r
-#define ATT_ADDRESS_REGISTER    0x3c0\r
-#define MISC_OUTPUT_REGISTER    0x3c2\r
-#define INPUT_STATUS_1_REGISTER 0x3da\r
-#define DAC_PIXEL_MASK_REGISTER 0x3c6\r
-#define PALETTE_INDEX_REGISTER  0x3c8\r
-#define PALETTE_DATA_REGISTER   0x3c9\r
-\r
+#define CRTC_ADDRESS_REGISTER    0x3d4\r
+#define CRTC_DATA_REGISTER       0x3d5\r
+#define SEQ_ADDRESS_REGISTER     0x3c4\r
+#define SEQ_DATA_REGISTER        0x3c5\r
+#define GRAPH_ADDRESS_REGISTER   0x3ce\r
+#define GRAPH_DATA_REGISTER      0x3cf\r
+#define ATT_ADDRESS_REGISTER     0x3c0\r
+#define MISC_OUTPUT_REGISTER     0x3c2\r
+#define INPUT_STATUS_1_REGISTER  0x3da\r
+#define DAC_PIXEL_MASK_REGISTER  0x3c6\r
+#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
@@ -164,10 +213,10 @@ QemuVideoGraphicsOutputDestructor (
   QEMU_VIDEO_PRIVATE_DATA  *Private\r
   );\r
 \r
-\r
 //\r
 // EFI_DRIVER_BINDING_PROTOCOL Protocol Interface\r
 //\r
+\r
 /**\r
   TODO: Add function description\r
 \r
@@ -227,6 +276,7 @@ QemuVideoControllerDriverStop (
 //\r
 // EFI Component Name Functions\r
 //\r
+\r
 /**\r
   Retrieves a Unicode string that is the user readable name of the driver.\r
 \r
@@ -274,7 +324,6 @@ QemuVideoComponentNameGetDriverName (
   OUT CHAR16                       **DriverName\r
   );\r
 \r
-\r
 /**\r
   Retrieves a Unicode string that is the user readable name of the controller\r
   that is being managed by a driver.\r
@@ -346,30 +395,35 @@ QemuVideoComponentNameGetDriverName (
 EFI_STATUS\r
 EFIAPI\r
 QemuVideoComponentNameGetControllerName (\r
-  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,\r
-  IN  EFI_HANDLE                                      ControllerHandle,\r
-  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,\r
-  IN  CHAR8                                           *Language,\r
-  OUT CHAR16                                          **ControllerName\r
+  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,\r
+  IN  EFI_HANDLE                   ControllerHandle,\r
+  IN  EFI_HANDLE                   ChildHandle        OPTIONAL,\r
+  IN  CHAR8                        *Language,\r
+  OUT CHAR16                       **ControllerName\r
   );\r
 \r
-\r
 //\r
 // Local Function Prototypes\r
 //\r
 VOID\r
-InitializeGraphicsMode (\r
+InitializeCirrusGraphicsMode (\r
+  QEMU_VIDEO_PRIVATE_DATA  *Private,\r
+  QEMU_VIDEO_CIRRUS_MODES  *ModeData\r
+  );\r
+\r
+VOID\r
+InitializeBochsGraphicsMode (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  QEMU_VIDEO_VIDEO_MODES   *ModeData\r
+  QEMU_VIDEO_MODE_DATA     *ModeData\r
   );\r
 \r
 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
 VOID\r
@@ -380,39 +434,71 @@ SetDefaultPalette (
 VOID\r
 DrawLogo (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  UINTN                           ScreenWidth,\r
-  UINTN                           ScreenHeight\r
+  UINTN                    ScreenWidth,\r
+  UINTN                    ScreenHeight\r
   );\r
 \r
 VOID\r
 outb (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  UINTN                           Address,\r
-  UINT8                           Data\r
+  UINTN                    Address,\r
+  UINT8                    Data\r
   );\r
 \r
 VOID\r
 outw (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  UINTN                           Address,\r
-  UINT16                          Data\r
+  UINTN                    Address,\r
+  UINT16                   Data\r
   );\r
 \r
 UINT8\r
 inb (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  UINTN                           Address\r
+  UINTN                    Address\r
   );\r
 \r
 UINT16\r
 inw (\r
   QEMU_VIDEO_PRIVATE_DATA  *Private,\r
-  UINTN                           Address\r
+  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
+VOID\r
+InstallVbeShim (\r
+  IN CONST CHAR16          *CardName,\r
+  IN EFI_PHYSICAL_ADDRESS  FrameBufferBase\r
+  );\r
+\r
 #endif\r