/** @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
#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 InternalModeIndex; // points into card-specific mode table\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
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
+ 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
+ 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 three fields match the client-visible\r
- // EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.Mode and\r
- // EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.MaxMode fields.\r
+ // The next two fields match the client-visible\r
+ // EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.MaxMode field.\r
//\r
- UINTN CurrentMode;\r
- UINTN MaxMode;\r
- QEMU_VIDEO_MODE_DATA *ModeData;\r
+ UINTN MaxMode;\r
+ QEMU_VIDEO_MODE_DATA *ModeData;\r
\r
- UINT8 *LineBuffer;\r
- QEMU_VIDEO_VARIANT Variant;\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
/// 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
+ 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
- UINT32 ColorDepth;\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_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
-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 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
+#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
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
//\r
// EFI Component Name Functions\r
//\r
+\r
/**\r
Retrieves a Unicode string that is the user readable name of the driver.\r
\r
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
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
InitializeBochsGraphicsMode (\r
QEMU_VIDEO_PRIVATE_DATA *Private,\r
- QEMU_VIDEO_BOCHS_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
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
\r
EFI_STATUS\r
QemuVideoBochsModeSetup (\r
- QEMU_VIDEO_PRIVATE_DATA *Private\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
+ IN CONST CHAR16 *CardName,\r
+ IN EFI_PHYSICAL_ADDRESS FrameBufferBase\r
);\r
+\r
#endif\r