2 This driver is a sample implementation of the Graphics Output Protocol for
3 the QEMU (Cirrus Logic 5446) video controller.
5 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #include <IndustryStandard/VmwareSvga.h>
18 #include <IndustryStandard/Acpi.h>
20 #include "UnalignedIoInternal.h"
22 EFI_DRIVER_BINDING_PROTOCOL gQemuVideoDriverBinding
= {
23 QemuVideoControllerDriverSupported
,
24 QemuVideoControllerDriverStart
,
25 QemuVideoControllerDriverStop
,
31 QEMU_VIDEO_CARD gQemuVideoCardList
[] = {
33 PCI_CLASS_DISPLAY_VGA
,
34 CIRRUS_LOGIC_VENDOR_ID
,
35 CIRRUS_LOGIC_5430_DEVICE_ID
,
36 QEMU_VIDEO_CIRRUS_5430
,
39 PCI_CLASS_DISPLAY_VGA
,
40 CIRRUS_LOGIC_VENDOR_ID
,
41 CIRRUS_LOGIC_5430_ALTERNATE_DEVICE_ID
,
42 QEMU_VIDEO_CIRRUS_5430
,
45 PCI_CLASS_DISPLAY_VGA
,
46 CIRRUS_LOGIC_VENDOR_ID
,
47 CIRRUS_LOGIC_5446_DEVICE_ID
,
48 QEMU_VIDEO_CIRRUS_5446
,
51 PCI_CLASS_DISPLAY_VGA
,
54 QEMU_VIDEO_BOCHS_MMIO
,
57 PCI_CLASS_DISPLAY_VGA
,
63 PCI_CLASS_DISPLAY_VGA
,
66 QEMU_VIDEO_BOCHS_MMIO
,
69 PCI_CLASS_DISPLAY_VGA
,
70 VMWARE_PCI_VENDOR_ID_VMWARE
,
71 VMWARE_PCI_DEVICE_ID_VMWARE_SVGA2
,
72 QEMU_VIDEO_VMWARE_SVGA
,
79 static QEMU_VIDEO_CARD
*
88 while (gQemuVideoCardList
[Index
].VendorId
!= 0) {
89 if (gQemuVideoCardList
[Index
].SubClass
== SubClass
&&
90 gQemuVideoCardList
[Index
].VendorId
== VendorId
&&
91 gQemuVideoCardList
[Index
].DeviceId
== DeviceId
) {
92 return gQemuVideoCardList
+ Index
;
100 Check if this device is supported.
102 @param This The driver binding protocol.
103 @param Controller The controller handle to check.
104 @param RemainingDevicePath The remaining device path.
106 @retval EFI_SUCCESS The bus supports this controller.
107 @retval EFI_UNSUPPORTED This device isn't supported.
112 QemuVideoControllerDriverSupported (
113 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
114 IN EFI_HANDLE Controller
,
115 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
119 EFI_PCI_IO_PROTOCOL
*PciIo
;
121 QEMU_VIDEO_CARD
*Card
;
124 // Open the PCI I/O Protocol
126 Status
= gBS
->OpenProtocol (
128 &gEfiPciIoProtocolGuid
,
130 This
->DriverBindingHandle
,
132 EFI_OPEN_PROTOCOL_BY_DRIVER
134 if (EFI_ERROR (Status
)) {
139 // Read the PCI Configuration Header from the PCI Device
141 Status
= PciIo
->Pci
.Read (
145 sizeof (Pci
) / sizeof (UINT32
),
148 if (EFI_ERROR (Status
)) {
152 Status
= EFI_UNSUPPORTED
;
153 if (!IS_PCI_DISPLAY (&Pci
)) {
156 Card
= QemuVideoDetect(Pci
.Hdr
.ClassCode
[1], Pci
.Hdr
.VendorId
, Pci
.Hdr
.DeviceId
);
158 DEBUG ((EFI_D_INFO
, "QemuVideo: %s detected\n", Card
->Name
));
159 Status
= EFI_SUCCESS
;
164 // Close the PCI I/O Protocol
168 &gEfiPciIoProtocolGuid
,
169 This
->DriverBindingHandle
,
177 Start to process the controller.
179 @param This The USB bus driver binding instance.
180 @param Controller The controller to check.
181 @param RemainingDevicePath The remaining device patch.
183 @retval EFI_SUCCESS The controller is controlled by the usb bus.
184 @retval EFI_ALREADY_STARTED The controller is already controlled by the usb
186 @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
191 QemuVideoControllerDriverStart (
192 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
193 IN EFI_HANDLE Controller
,
194 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
199 QEMU_VIDEO_PRIVATE_DATA
*Private
;
201 EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
;
202 ACPI_ADR_DEVICE_PATH AcpiDeviceNode
;
204 QEMU_VIDEO_CARD
*Card
;
205 EFI_PCI_IO_PROTOCOL
*ChildPciIo
;
207 OldTpl
= gBS
->RaiseTPL (TPL_CALLBACK
);
210 // Allocate Private context data for GOP inteface.
212 Private
= AllocateZeroPool (sizeof (QEMU_VIDEO_PRIVATE_DATA
));
213 if (Private
== NULL
) {
214 Status
= EFI_OUT_OF_RESOURCES
;
219 // Set up context record
221 Private
->Signature
= QEMU_VIDEO_PRIVATE_DATA_SIGNATURE
;
224 // Open PCI I/O Protocol
226 Status
= gBS
->OpenProtocol (
228 &gEfiPciIoProtocolGuid
,
229 (VOID
**) &Private
->PciIo
,
230 This
->DriverBindingHandle
,
232 EFI_OPEN_PROTOCOL_BY_DRIVER
234 if (EFI_ERROR (Status
)) {
239 // Read the PCI Configuration Header from the PCI Device
241 Status
= Private
->PciIo
->Pci
.Read (
245 sizeof (Pci
) / sizeof (UINT32
),
248 if (EFI_ERROR (Status
)) {
253 // Determine card variant.
255 Card
= QemuVideoDetect(Pci
.Hdr
.ClassCode
[1], Pci
.Hdr
.VendorId
, Pci
.Hdr
.DeviceId
);
257 Status
= EFI_DEVICE_ERROR
;
260 Private
->Variant
= Card
->Variant
;
261 Private
->FrameBufferVramBarIndex
= PCI_BAR_IDX0
;
264 // IsQxl is based on the detected Card->Variant, which at a later point might
265 // not match Private->Variant.
267 IsQxl
= (BOOLEAN
)(Card
->Variant
== QEMU_VIDEO_BOCHS
);
270 // Save original PCI attributes
272 Status
= Private
->PciIo
->Attributes (
274 EfiPciIoAttributeOperationGet
,
276 &Private
->OriginalPciAttributes
279 if (EFI_ERROR (Status
)) {
284 // Set new PCI attributes
286 Status
= Private
->PciIo
->Attributes (
288 EfiPciIoAttributeOperationEnable
,
289 EFI_PCI_DEVICE_ENABLE
| EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY
| EFI_PCI_IO_ATTRIBUTE_VGA_IO
,
292 if (EFI_ERROR (Status
)) {
297 // Check whenever the qemu stdvga mmio bar is present (qemu 1.3+).
299 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
) {
300 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
*MmioDesc
;
302 Status
= Private
->PciIo
->GetBarAttributes (
308 if (EFI_ERROR (Status
) ||
309 MmioDesc
->ResType
!= ACPI_ADDRESS_SPACE_TYPE_MEM
) {
310 DEBUG ((EFI_D_INFO
, "QemuVideo: No mmio bar, fallback to port io\n"));
311 Private
->Variant
= QEMU_VIDEO_BOCHS
;
313 DEBUG ((EFI_D_INFO
, "QemuVideo: Using mmio bar @ 0x%lx\n",
314 MmioDesc
->AddrRangeMin
));
317 if (!EFI_ERROR (Status
)) {
323 // Check if accessing the bochs interface works.
325 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
||
326 Private
->Variant
== QEMU_VIDEO_BOCHS
) {
328 BochsId
= BochsRead(Private
, VBE_DISPI_INDEX_ID
);
329 if ((BochsId
& 0xFFF0) != VBE_DISPI_ID0
) {
330 DEBUG ((EFI_D_INFO
, "QemuVideo: BochsID mismatch (got 0x%x)\n", BochsId
));
331 Status
= EFI_DEVICE_ERROR
;
332 goto RestoreAttributes
;
337 // Check if accessing Vmware SVGA interface works
339 if (Private
->Variant
== QEMU_VIDEO_VMWARE_SVGA
) {
340 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
*IoDesc
;
345 Status
= Private
->PciIo
->GetBarAttributes (
351 if (EFI_ERROR (Status
) ||
352 IoDesc
->ResType
!= ACPI_ADDRESS_SPACE_TYPE_IO
||
353 IoDesc
->AddrRangeMin
> MAX_UINT16
+ 1 - (VMWARE_SVGA_VALUE_PORT
+ 4)) {
354 if (IoDesc
!= NULL
) {
357 Status
= EFI_DEVICE_ERROR
;
358 goto RestoreAttributes
;
360 Private
->VmwareSvgaBasePort
= (UINT16
) IoDesc
->AddrRangeMin
;
363 TargetId
= VMWARE_SVGA_ID_2
;
365 VmwareSvgaWrite (Private
, VmwareSvgaRegId
, TargetId
);
366 SvgaIdRead
= VmwareSvgaRead (Private
, VmwareSvgaRegId
);
367 if ((SvgaIdRead
== TargetId
) || (TargetId
<= VMWARE_SVGA_ID_0
)) {
373 if (SvgaIdRead
!= TargetId
) {
376 "QemuVideo: QEMU_VIDEO_VMWARE_SVGA ID mismatch "
377 "(got 0x%x, base address 0x%x)\n",
379 Private
->VmwareSvgaBasePort
381 Status
= EFI_DEVICE_ERROR
;
382 goto RestoreAttributes
;
385 Private
->FrameBufferVramBarIndex
= PCI_BAR_IDX1
;
389 // Get ParentDevicePath
391 Status
= gBS
->HandleProtocol (
393 &gEfiDevicePathProtocolGuid
,
394 (VOID
**) &ParentDevicePath
396 if (EFI_ERROR (Status
)) {
397 goto RestoreAttributes
;
401 // Set Gop Device Path
403 ZeroMem (&AcpiDeviceNode
, sizeof (ACPI_ADR_DEVICE_PATH
));
404 AcpiDeviceNode
.Header
.Type
= ACPI_DEVICE_PATH
;
405 AcpiDeviceNode
.Header
.SubType
= ACPI_ADR_DP
;
406 AcpiDeviceNode
.ADR
= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA
, 0, 0);
407 SetDevicePathNodeLength (&AcpiDeviceNode
.Header
, sizeof (ACPI_ADR_DEVICE_PATH
));
409 Private
->GopDevicePath
= AppendDevicePathNode (
411 (EFI_DEVICE_PATH_PROTOCOL
*) &AcpiDeviceNode
413 if (Private
->GopDevicePath
== NULL
) {
414 Status
= EFI_OUT_OF_RESOURCES
;
415 goto RestoreAttributes
;
419 // Create new child handle and install the device path protocol on it.
421 Status
= gBS
->InstallMultipleProtocolInterfaces (
423 &gEfiDevicePathProtocolGuid
,
424 Private
->GopDevicePath
,
427 if (EFI_ERROR (Status
)) {
428 goto FreeGopDevicePath
;
432 // Construct video mode buffer
434 switch (Private
->Variant
) {
435 case QEMU_VIDEO_CIRRUS_5430
:
436 case QEMU_VIDEO_CIRRUS_5446
:
437 Status
= QemuVideoCirrusModeSetup (Private
);
439 case QEMU_VIDEO_BOCHS_MMIO
:
440 case QEMU_VIDEO_BOCHS
:
441 Status
= QemuVideoBochsModeSetup (Private
, IsQxl
);
443 case QEMU_VIDEO_VMWARE_SVGA
:
444 Status
= QemuVideoVmwareSvgaModeSetup (Private
);
448 Status
= EFI_DEVICE_ERROR
;
451 if (EFI_ERROR (Status
)) {
452 goto UninstallGopDevicePath
;
456 // Start the GOP software stack.
458 Status
= QemuVideoGraphicsOutputConstructor (Private
);
459 if (EFI_ERROR (Status
)) {
463 Status
= gBS
->InstallMultipleProtocolInterfaces (
465 &gEfiGraphicsOutputProtocolGuid
,
466 &Private
->GraphicsOutput
,
469 if (EFI_ERROR (Status
)) {
470 goto DestructQemuVideoGraphics
;
474 // Reference parent handle from child handle.
476 Status
= gBS
->OpenProtocol (
478 &gEfiPciIoProtocolGuid
,
479 (VOID
**) &ChildPciIo
,
480 This
->DriverBindingHandle
,
482 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
484 if (EFI_ERROR (Status
)) {
488 #if defined MDE_CPU_IA32 || defined MDE_CPU_X64
489 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
||
490 Private
->Variant
== QEMU_VIDEO_BOCHS
) {
491 InstallVbeShim (Card
->Name
, Private
->GraphicsOutput
.Mode
->FrameBufferBase
);
495 gBS
->RestoreTPL (OldTpl
);
499 gBS
->UninstallProtocolInterface (Private
->Handle
,
500 &gEfiGraphicsOutputProtocolGuid
, &Private
->GraphicsOutput
);
502 DestructQemuVideoGraphics
:
503 QemuVideoGraphicsOutputDestructor (Private
);
506 FreePool (Private
->ModeData
);
507 if (Private
->VmwareSvgaModeInfo
!= NULL
) {
508 FreePool (Private
->VmwareSvgaModeInfo
);
511 UninstallGopDevicePath
:
512 gBS
->UninstallProtocolInterface (Private
->Handle
,
513 &gEfiDevicePathProtocolGuid
, Private
->GopDevicePath
);
516 FreePool (Private
->GopDevicePath
);
519 Private
->PciIo
->Attributes (Private
->PciIo
, EfiPciIoAttributeOperationSet
,
520 Private
->OriginalPciAttributes
, NULL
);
523 gBS
->CloseProtocol (Controller
, &gEfiPciIoProtocolGuid
,
524 This
->DriverBindingHandle
, Controller
);
530 gBS
->RestoreTPL (OldTpl
);
538 @param This The USB bus driver binding protocol.
539 @param Controller The controller to release.
540 @param NumberOfChildren The number of children of this device that
541 opened the controller BY_CHILD.
542 @param ChildHandleBuffer The array of child handle.
544 @retval EFI_SUCCESS The controller or children are stopped.
545 @retval EFI_DEVICE_ERROR Failed to stop the driver.
550 QemuVideoControllerDriverStop (
551 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
552 IN EFI_HANDLE Controller
,
553 IN UINTN NumberOfChildren
,
554 IN EFI_HANDLE
*ChildHandleBuffer
557 EFI_GRAPHICS_OUTPUT_PROTOCOL
*GraphicsOutput
;
560 QEMU_VIDEO_PRIVATE_DATA
*Private
;
562 if (NumberOfChildren
== 0) {
564 // Close the PCI I/O Protocol
568 &gEfiPciIoProtocolGuid
,
569 This
->DriverBindingHandle
,
576 // free all resources for whose access we need the child handle, because the
577 // child handle is going away
579 ASSERT (NumberOfChildren
== 1);
580 Status
= gBS
->OpenProtocol (
581 ChildHandleBuffer
[0],
582 &gEfiGraphicsOutputProtocolGuid
,
583 (VOID
**) &GraphicsOutput
,
584 This
->DriverBindingHandle
,
586 EFI_OPEN_PROTOCOL_GET_PROTOCOL
588 if (EFI_ERROR (Status
)) {
593 // Get our private context information
595 Private
= QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (GraphicsOutput
);
596 ASSERT (Private
->Handle
== ChildHandleBuffer
[0]);
598 QemuVideoGraphicsOutputDestructor (Private
);
600 // Remove the GOP protocol interface from the system
602 Status
= gBS
->UninstallMultipleProtocolInterfaces (
604 &gEfiGraphicsOutputProtocolGuid
,
605 &Private
->GraphicsOutput
,
609 if (EFI_ERROR (Status
)) {
614 // Restore original PCI attributes
616 Private
->PciIo
->Attributes (
618 EfiPciIoAttributeOperationSet
,
619 Private
->OriginalPciAttributes
,
625 &gEfiPciIoProtocolGuid
,
626 This
->DriverBindingHandle
,
630 FreePool (Private
->ModeData
);
631 if (Private
->VmwareSvgaModeInfo
!= NULL
) {
632 FreePool (Private
->VmwareSvgaModeInfo
);
634 gBS
->UninstallProtocolInterface (Private
->Handle
,
635 &gEfiDevicePathProtocolGuid
, Private
->GopDevicePath
);
636 FreePool (Private
->GopDevicePath
);
639 // Free our instance data
641 gBS
->FreePool (Private
);
647 TODO: Add function description
649 @param Private TODO: add argument description
650 @param Address TODO: add argument description
651 @param Data TODO: add argument description
653 TODO: add return values
658 QEMU_VIDEO_PRIVATE_DATA
*Private
,
663 Private
->PciIo
->Io
.Write (
666 EFI_PCI_IO_PASS_THROUGH_BAR
,
674 TODO: Add function description
676 @param Private TODO: add argument description
677 @param Address TODO: add argument description
678 @param Data TODO: add argument description
680 TODO: add return values
685 QEMU_VIDEO_PRIVATE_DATA
*Private
,
690 Private
->PciIo
->Io
.Write (
693 EFI_PCI_IO_PASS_THROUGH_BAR
,
701 TODO: Add function description
703 @param Private TODO: add argument description
704 @param Address TODO: add argument description
706 TODO: add return values
711 QEMU_VIDEO_PRIVATE_DATA
*Private
,
717 Private
->PciIo
->Io
.Read (
720 EFI_PCI_IO_PASS_THROUGH_BAR
,
729 TODO: Add function description
731 @param Private TODO: add argument description
732 @param Address TODO: add argument description
734 TODO: add return values
739 QEMU_VIDEO_PRIVATE_DATA
*Private
,
745 Private
->PciIo
->Io
.Read (
748 EFI_PCI_IO_PASS_THROUGH_BAR
,
757 TODO: Add function description
759 @param Private TODO: add argument description
760 @param Index TODO: add argument description
761 @param Red TODO: add argument description
762 @param Green TODO: add argument description
763 @param Blue TODO: add argument description
765 TODO: add return values
770 QEMU_VIDEO_PRIVATE_DATA
*Private
,
777 VgaOutb (Private
, PALETTE_INDEX_REGISTER
, (UINT8
) Index
);
778 VgaOutb (Private
, PALETTE_DATA_REGISTER
, (UINT8
) (Red
>> 2));
779 VgaOutb (Private
, PALETTE_DATA_REGISTER
, (UINT8
) (Green
>> 2));
780 VgaOutb (Private
, PALETTE_DATA_REGISTER
, (UINT8
) (Blue
>> 2));
784 TODO: Add function description
786 @param Private TODO: add argument description
788 TODO: add return values
793 QEMU_VIDEO_PRIVATE_DATA
*Private
802 for (RedIndex
= 0; RedIndex
< 8; RedIndex
++) {
803 for (GreenIndex
= 0; GreenIndex
< 8; GreenIndex
++) {
804 for (BlueIndex
= 0; BlueIndex
< 4; BlueIndex
++) {
805 SetPaletteColor (Private
, Index
, (UINT8
) (RedIndex
<< 5), (UINT8
) (GreenIndex
<< 5), (UINT8
) (BlueIndex
<< 6));
813 TODO: Add function description
815 @param Private TODO: add argument description
817 TODO: add return values
822 QEMU_VIDEO_PRIVATE_DATA
*Private
828 Private
->PciIo
->Mem
.Write (
830 EfiPciIoWidthFillUint32
,
831 Private
->FrameBufferVramBarIndex
,
839 TODO: Add function description
841 @param Private TODO: add argument description
843 TODO: add return values
848 QEMU_VIDEO_PRIVATE_DATA
*Private
,
856 TODO: Add function description
858 @param Private TODO: add argument description
859 @param ModeData TODO: add argument description
861 TODO: add return values
865 InitializeCirrusGraphicsMode (
866 QEMU_VIDEO_PRIVATE_DATA
*Private
,
867 QEMU_VIDEO_CIRRUS_MODES
*ModeData
873 outw (Private
, SEQ_ADDRESS_REGISTER
, 0x1206);
874 outw (Private
, SEQ_ADDRESS_REGISTER
, 0x0012);
876 for (Index
= 0; Index
< 15; Index
++) {
877 outw (Private
, SEQ_ADDRESS_REGISTER
, ModeData
->SeqSettings
[Index
]);
880 if (Private
->Variant
== QEMU_VIDEO_CIRRUS_5430
) {
881 outb (Private
, SEQ_ADDRESS_REGISTER
, 0x0f);
882 Byte
= (UINT8
) ((inb (Private
, SEQ_DATA_REGISTER
) & 0xc7) ^ 0x30);
883 outb (Private
, SEQ_DATA_REGISTER
, Byte
);
886 outb (Private
, MISC_OUTPUT_REGISTER
, ModeData
->MiscSetting
);
887 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x0506);
888 outw (Private
, SEQ_ADDRESS_REGISTER
, 0x0300);
889 outw (Private
, CRTC_ADDRESS_REGISTER
, 0x2011);
891 for (Index
= 0; Index
< 28; Index
++) {
892 outw (Private
, CRTC_ADDRESS_REGISTER
, (UINT16
) ((ModeData
->CrtcSettings
[Index
] << 8) | Index
));
895 for (Index
= 0; Index
< 9; Index
++) {
896 outw (Private
, GRAPH_ADDRESS_REGISTER
, (UINT16
) ((GraphicsController
[Index
] << 8) | Index
));
899 inb (Private
, INPUT_STATUS_1_REGISTER
);
901 for (Index
= 0; Index
< 21; Index
++) {
902 outb (Private
, ATT_ADDRESS_REGISTER
, (UINT8
) Index
);
903 outb (Private
, ATT_ADDRESS_REGISTER
, AttributeController
[Index
]);
906 outb (Private
, ATT_ADDRESS_REGISTER
, 0x20);
908 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x0009);
909 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x000a);
910 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x000b);
911 outb (Private
, DAC_PIXEL_MASK_REGISTER
, 0xff);
913 SetDefaultPalette (Private
);
914 ClearScreen (Private
);
919 QEMU_VIDEO_PRIVATE_DATA
*Private
,
926 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
) {
927 Status
= Private
->PciIo
->Mem
.Write (
935 ASSERT_EFI_ERROR (Status
);
937 outw (Private
, VBE_DISPI_IOPORT_INDEX
, Reg
);
938 outw (Private
, VBE_DISPI_IOPORT_DATA
, Data
);
944 QEMU_VIDEO_PRIVATE_DATA
*Private
,
951 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
) {
952 Status
= Private
->PciIo
->Mem
.Read (
960 ASSERT_EFI_ERROR (Status
);
962 outw (Private
, VBE_DISPI_IOPORT_INDEX
, Reg
);
963 Data
= inw (Private
, VBE_DISPI_IOPORT_DATA
);
970 QEMU_VIDEO_PRIVATE_DATA
*Private
,
976 Private
->VmwareSvgaBasePort
+ VMWARE_SVGA_INDEX_PORT
,
980 Private
->VmwareSvgaBasePort
+ VMWARE_SVGA_VALUE_PORT
,
987 QEMU_VIDEO_PRIVATE_DATA
*Private
,
992 Private
->VmwareSvgaBasePort
+ VMWARE_SVGA_INDEX_PORT
,
995 return UnalignedIoRead32 (
996 Private
->VmwareSvgaBasePort
+ VMWARE_SVGA_VALUE_PORT
1002 QEMU_VIDEO_PRIVATE_DATA
*Private
,
1009 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
) {
1010 Status
= Private
->PciIo
->Mem
.Write (
1014 0x400 - 0x3c0 + Reg
,
1018 ASSERT_EFI_ERROR (Status
);
1020 outb (Private
, Reg
, Data
);
1025 InitializeBochsGraphicsMode (
1026 QEMU_VIDEO_PRIVATE_DATA
*Private
,
1027 QEMU_VIDEO_BOCHS_MODES
*ModeData
1030 DEBUG ((EFI_D_INFO
, "InitializeBochsGraphicsMode: %dx%d @ %d\n",
1031 ModeData
->Width
, ModeData
->Height
, ModeData
->ColorDepth
));
1034 VgaOutb (Private
, ATT_ADDRESS_REGISTER
, 0x20);
1036 BochsWrite (Private
, VBE_DISPI_INDEX_ENABLE
, 0);
1037 BochsWrite (Private
, VBE_DISPI_INDEX_BANK
, 0);
1038 BochsWrite (Private
, VBE_DISPI_INDEX_X_OFFSET
, 0);
1039 BochsWrite (Private
, VBE_DISPI_INDEX_Y_OFFSET
, 0);
1041 BochsWrite (Private
, VBE_DISPI_INDEX_BPP
, (UINT16
) ModeData
->ColorDepth
);
1042 BochsWrite (Private
, VBE_DISPI_INDEX_XRES
, (UINT16
) ModeData
->Width
);
1043 BochsWrite (Private
, VBE_DISPI_INDEX_VIRT_WIDTH
, (UINT16
) ModeData
->Width
);
1044 BochsWrite (Private
, VBE_DISPI_INDEX_YRES
, (UINT16
) ModeData
->Height
);
1045 BochsWrite (Private
, VBE_DISPI_INDEX_VIRT_HEIGHT
, (UINT16
) ModeData
->Height
);
1047 BochsWrite (Private
, VBE_DISPI_INDEX_ENABLE
,
1048 VBE_DISPI_ENABLED
| VBE_DISPI_LFB_ENABLED
);
1050 SetDefaultPalette (Private
);
1051 ClearScreen (Private
);
1055 InitializeVmwareSvgaGraphicsMode (
1056 QEMU_VIDEO_PRIVATE_DATA
*Private
,
1057 QEMU_VIDEO_BOCHS_MODES
*ModeData
1060 UINT32 Capabilities
;
1062 VmwareSvgaWrite (Private
, VmwareSvgaRegWidth
, ModeData
->Width
);
1063 VmwareSvgaWrite (Private
, VmwareSvgaRegHeight
, ModeData
->Height
);
1065 Capabilities
= VmwareSvgaRead (
1067 VmwareSvgaRegCapabilities
1069 if ((Capabilities
& VMWARE_SVGA_CAP_8BIT_EMULATION
) != 0) {
1072 VmwareSvgaRegBitsPerPixel
,
1073 ModeData
->ColorDepth
1077 VmwareSvgaWrite (Private
, VmwareSvgaRegEnable
, 1);
1079 SetDefaultPalette (Private
);
1080 ClearScreen (Private
);
1085 InitializeQemuVideo (
1086 IN EFI_HANDLE ImageHandle
,
1087 IN EFI_SYSTEM_TABLE
*SystemTable
1092 Status
= EfiLibInstallDriverBindingComponentName2 (
1095 &gQemuVideoDriverBinding
,
1097 &gQemuVideoComponentName
,
1098 &gQemuVideoComponentName2
1100 ASSERT_EFI_ERROR (Status
);
1103 // Install EFI Driver Supported EFI Version Protocol required for
1104 // EFI drivers that are on PCI and other plug in cards.
1106 gQemuVideoDriverSupportedEfiVersion
.FirmwareVersion
= PcdGet32 (PcdDriverSupportedEfiVersion
);
1107 Status
= gBS
->InstallMultipleProtocolInterfaces (
1109 &gEfiDriverSupportedEfiVersionProtocolGuid
,
1110 &gQemuVideoDriverSupportedEfiVersion
,
1113 ASSERT_EFI_ERROR (Status
);