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_OTHER
,
60 QEMU_VIDEO_BOCHS_MMIO
,
61 L
"QEMU Standard VGA (secondary)"
63 PCI_CLASS_DISPLAY_VGA
,
69 PCI_CLASS_DISPLAY_VGA
,
72 QEMU_VIDEO_BOCHS_MMIO
,
75 PCI_CLASS_DISPLAY_VGA
,
76 VMWARE_PCI_VENDOR_ID_VMWARE
,
77 VMWARE_PCI_DEVICE_ID_VMWARE_SVGA2
,
78 QEMU_VIDEO_VMWARE_SVGA
,
85 static QEMU_VIDEO_CARD
*
94 while (gQemuVideoCardList
[Index
].VendorId
!= 0) {
95 if (gQemuVideoCardList
[Index
].SubClass
== SubClass
&&
96 gQemuVideoCardList
[Index
].VendorId
== VendorId
&&
97 gQemuVideoCardList
[Index
].DeviceId
== DeviceId
) {
98 return gQemuVideoCardList
+ Index
;
106 Check if this device is supported.
108 @param This The driver binding protocol.
109 @param Controller The controller handle to check.
110 @param RemainingDevicePath The remaining device path.
112 @retval EFI_SUCCESS The bus supports this controller.
113 @retval EFI_UNSUPPORTED This device isn't supported.
118 QemuVideoControllerDriverSupported (
119 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
120 IN EFI_HANDLE Controller
,
121 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
125 EFI_PCI_IO_PROTOCOL
*PciIo
;
127 QEMU_VIDEO_CARD
*Card
;
130 // Open the PCI I/O Protocol
132 Status
= gBS
->OpenProtocol (
134 &gEfiPciIoProtocolGuid
,
136 This
->DriverBindingHandle
,
138 EFI_OPEN_PROTOCOL_BY_DRIVER
140 if (EFI_ERROR (Status
)) {
145 // Read the PCI Configuration Header from the PCI Device
147 Status
= PciIo
->Pci
.Read (
151 sizeof (Pci
) / sizeof (UINT32
),
154 if (EFI_ERROR (Status
)) {
158 Status
= EFI_UNSUPPORTED
;
159 if (!IS_PCI_DISPLAY (&Pci
)) {
162 Card
= QemuVideoDetect(Pci
.Hdr
.ClassCode
[1], Pci
.Hdr
.VendorId
, Pci
.Hdr
.DeviceId
);
164 DEBUG ((EFI_D_INFO
, "QemuVideo: %s detected\n", Card
->Name
));
165 Status
= EFI_SUCCESS
;
170 // Close the PCI I/O Protocol
174 &gEfiPciIoProtocolGuid
,
175 This
->DriverBindingHandle
,
183 Start to process the controller.
185 @param This The USB bus driver binding instance.
186 @param Controller The controller to check.
187 @param RemainingDevicePath The remaining device patch.
189 @retval EFI_SUCCESS The controller is controlled by the usb bus.
190 @retval EFI_ALREADY_STARTED The controller is already controlled by the usb
192 @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
197 QemuVideoControllerDriverStart (
198 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
199 IN EFI_HANDLE Controller
,
200 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
205 QEMU_VIDEO_PRIVATE_DATA
*Private
;
207 EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
;
208 ACPI_ADR_DEVICE_PATH AcpiDeviceNode
;
210 QEMU_VIDEO_CARD
*Card
;
211 EFI_PCI_IO_PROTOCOL
*ChildPciIo
;
213 OldTpl
= gBS
->RaiseTPL (TPL_CALLBACK
);
216 // Allocate Private context data for GOP inteface.
218 Private
= AllocateZeroPool (sizeof (QEMU_VIDEO_PRIVATE_DATA
));
219 if (Private
== NULL
) {
220 Status
= EFI_OUT_OF_RESOURCES
;
225 // Set up context record
227 Private
->Signature
= QEMU_VIDEO_PRIVATE_DATA_SIGNATURE
;
230 // Open PCI I/O Protocol
232 Status
= gBS
->OpenProtocol (
234 &gEfiPciIoProtocolGuid
,
235 (VOID
**) &Private
->PciIo
,
236 This
->DriverBindingHandle
,
238 EFI_OPEN_PROTOCOL_BY_DRIVER
240 if (EFI_ERROR (Status
)) {
245 // Read the PCI Configuration Header from the PCI Device
247 Status
= Private
->PciIo
->Pci
.Read (
251 sizeof (Pci
) / sizeof (UINT32
),
254 if (EFI_ERROR (Status
)) {
259 // Determine card variant.
261 Card
= QemuVideoDetect(Pci
.Hdr
.ClassCode
[1], Pci
.Hdr
.VendorId
, Pci
.Hdr
.DeviceId
);
263 Status
= EFI_DEVICE_ERROR
;
266 Private
->Variant
= Card
->Variant
;
267 Private
->FrameBufferVramBarIndex
= PCI_BAR_IDX0
;
270 // IsQxl is based on the detected Card->Variant, which at a later point might
271 // not match Private->Variant.
273 IsQxl
= (BOOLEAN
)(Card
->Variant
== QEMU_VIDEO_BOCHS
);
276 // Save original PCI attributes
278 Status
= Private
->PciIo
->Attributes (
280 EfiPciIoAttributeOperationGet
,
282 &Private
->OriginalPciAttributes
285 if (EFI_ERROR (Status
)) {
290 // Set new PCI attributes
292 Status
= Private
->PciIo
->Attributes (
294 EfiPciIoAttributeOperationEnable
,
295 EFI_PCI_DEVICE_ENABLE
| EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY
| EFI_PCI_IO_ATTRIBUTE_VGA_IO
,
298 if (EFI_ERROR (Status
)) {
303 // Check whenever the qemu stdvga mmio bar is present (qemu 1.3+).
305 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
) {
306 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
*MmioDesc
;
308 Status
= Private
->PciIo
->GetBarAttributes (
314 if (EFI_ERROR (Status
) ||
315 MmioDesc
->ResType
!= ACPI_ADDRESS_SPACE_TYPE_MEM
) {
316 DEBUG ((EFI_D_INFO
, "QemuVideo: No mmio bar, fallback to port io\n"));
317 Private
->Variant
= QEMU_VIDEO_BOCHS
;
319 DEBUG ((EFI_D_INFO
, "QemuVideo: Using mmio bar @ 0x%lx\n",
320 MmioDesc
->AddrRangeMin
));
323 if (!EFI_ERROR (Status
)) {
329 // Check if accessing the bochs interface works.
331 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
||
332 Private
->Variant
== QEMU_VIDEO_BOCHS
) {
334 BochsId
= BochsRead(Private
, VBE_DISPI_INDEX_ID
);
335 if ((BochsId
& 0xFFF0) != VBE_DISPI_ID0
) {
336 DEBUG ((EFI_D_INFO
, "QemuVideo: BochsID mismatch (got 0x%x)\n", BochsId
));
337 Status
= EFI_DEVICE_ERROR
;
338 goto RestoreAttributes
;
343 // Check if accessing Vmware SVGA interface works
345 if (Private
->Variant
== QEMU_VIDEO_VMWARE_SVGA
) {
346 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
*IoDesc
;
351 Status
= Private
->PciIo
->GetBarAttributes (
357 if (EFI_ERROR (Status
) ||
358 IoDesc
->ResType
!= ACPI_ADDRESS_SPACE_TYPE_IO
||
359 IoDesc
->AddrRangeMin
> MAX_UINT16
+ 1 - (VMWARE_SVGA_VALUE_PORT
+ 4)) {
360 if (IoDesc
!= NULL
) {
363 Status
= EFI_DEVICE_ERROR
;
364 goto RestoreAttributes
;
366 Private
->VmwareSvgaBasePort
= (UINT16
) IoDesc
->AddrRangeMin
;
369 TargetId
= VMWARE_SVGA_ID_2
;
371 VmwareSvgaWrite (Private
, VmwareSvgaRegId
, TargetId
);
372 SvgaIdRead
= VmwareSvgaRead (Private
, VmwareSvgaRegId
);
373 if ((SvgaIdRead
== TargetId
) || (TargetId
<= VMWARE_SVGA_ID_0
)) {
379 if (SvgaIdRead
!= TargetId
) {
382 "QemuVideo: QEMU_VIDEO_VMWARE_SVGA ID mismatch "
383 "(got 0x%x, base address 0x%x)\n",
385 Private
->VmwareSvgaBasePort
387 Status
= EFI_DEVICE_ERROR
;
388 goto RestoreAttributes
;
391 Private
->FrameBufferVramBarIndex
= PCI_BAR_IDX1
;
395 // Get ParentDevicePath
397 Status
= gBS
->HandleProtocol (
399 &gEfiDevicePathProtocolGuid
,
400 (VOID
**) &ParentDevicePath
402 if (EFI_ERROR (Status
)) {
403 goto RestoreAttributes
;
407 // Set Gop Device Path
409 ZeroMem (&AcpiDeviceNode
, sizeof (ACPI_ADR_DEVICE_PATH
));
410 AcpiDeviceNode
.Header
.Type
= ACPI_DEVICE_PATH
;
411 AcpiDeviceNode
.Header
.SubType
= ACPI_ADR_DP
;
412 AcpiDeviceNode
.ADR
= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA
, 0, 0);
413 SetDevicePathNodeLength (&AcpiDeviceNode
.Header
, sizeof (ACPI_ADR_DEVICE_PATH
));
415 Private
->GopDevicePath
= AppendDevicePathNode (
417 (EFI_DEVICE_PATH_PROTOCOL
*) &AcpiDeviceNode
419 if (Private
->GopDevicePath
== NULL
) {
420 Status
= EFI_OUT_OF_RESOURCES
;
421 goto RestoreAttributes
;
425 // Create new child handle and install the device path protocol on it.
427 Status
= gBS
->InstallMultipleProtocolInterfaces (
429 &gEfiDevicePathProtocolGuid
,
430 Private
->GopDevicePath
,
433 if (EFI_ERROR (Status
)) {
434 goto FreeGopDevicePath
;
438 // Construct video mode buffer
440 switch (Private
->Variant
) {
441 case QEMU_VIDEO_CIRRUS_5430
:
442 case QEMU_VIDEO_CIRRUS_5446
:
443 Status
= QemuVideoCirrusModeSetup (Private
);
445 case QEMU_VIDEO_BOCHS_MMIO
:
446 case QEMU_VIDEO_BOCHS
:
447 Status
= QemuVideoBochsModeSetup (Private
, IsQxl
);
449 case QEMU_VIDEO_VMWARE_SVGA
:
450 Status
= QemuVideoVmwareSvgaModeSetup (Private
);
454 Status
= EFI_DEVICE_ERROR
;
457 if (EFI_ERROR (Status
)) {
458 goto UninstallGopDevicePath
;
462 // Start the GOP software stack.
464 Status
= QemuVideoGraphicsOutputConstructor (Private
);
465 if (EFI_ERROR (Status
)) {
469 Status
= gBS
->InstallMultipleProtocolInterfaces (
471 &gEfiGraphicsOutputProtocolGuid
,
472 &Private
->GraphicsOutput
,
475 if (EFI_ERROR (Status
)) {
476 goto DestructQemuVideoGraphics
;
480 // Reference parent handle from child handle.
482 Status
= gBS
->OpenProtocol (
484 &gEfiPciIoProtocolGuid
,
485 (VOID
**) &ChildPciIo
,
486 This
->DriverBindingHandle
,
488 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
490 if (EFI_ERROR (Status
)) {
494 #if defined MDE_CPU_IA32 || defined MDE_CPU_X64
495 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
||
496 Private
->Variant
== QEMU_VIDEO_BOCHS
) {
497 InstallVbeShim (Card
->Name
, Private
->GraphicsOutput
.Mode
->FrameBufferBase
);
501 gBS
->RestoreTPL (OldTpl
);
505 gBS
->UninstallProtocolInterface (Private
->Handle
,
506 &gEfiGraphicsOutputProtocolGuid
, &Private
->GraphicsOutput
);
508 DestructQemuVideoGraphics
:
509 QemuVideoGraphicsOutputDestructor (Private
);
512 FreePool (Private
->ModeData
);
513 if (Private
->VmwareSvgaModeInfo
!= NULL
) {
514 FreePool (Private
->VmwareSvgaModeInfo
);
517 UninstallGopDevicePath
:
518 gBS
->UninstallProtocolInterface (Private
->Handle
,
519 &gEfiDevicePathProtocolGuid
, Private
->GopDevicePath
);
522 FreePool (Private
->GopDevicePath
);
525 Private
->PciIo
->Attributes (Private
->PciIo
, EfiPciIoAttributeOperationSet
,
526 Private
->OriginalPciAttributes
, NULL
);
529 gBS
->CloseProtocol (Controller
, &gEfiPciIoProtocolGuid
,
530 This
->DriverBindingHandle
, Controller
);
536 gBS
->RestoreTPL (OldTpl
);
544 @param This The USB bus driver binding protocol.
545 @param Controller The controller to release.
546 @param NumberOfChildren The number of children of this device that
547 opened the controller BY_CHILD.
548 @param ChildHandleBuffer The array of child handle.
550 @retval EFI_SUCCESS The controller or children are stopped.
551 @retval EFI_DEVICE_ERROR Failed to stop the driver.
556 QemuVideoControllerDriverStop (
557 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
558 IN EFI_HANDLE Controller
,
559 IN UINTN NumberOfChildren
,
560 IN EFI_HANDLE
*ChildHandleBuffer
563 EFI_GRAPHICS_OUTPUT_PROTOCOL
*GraphicsOutput
;
566 QEMU_VIDEO_PRIVATE_DATA
*Private
;
568 if (NumberOfChildren
== 0) {
570 // Close the PCI I/O Protocol
574 &gEfiPciIoProtocolGuid
,
575 This
->DriverBindingHandle
,
582 // free all resources for whose access we need the child handle, because the
583 // child handle is going away
585 ASSERT (NumberOfChildren
== 1);
586 Status
= gBS
->OpenProtocol (
587 ChildHandleBuffer
[0],
588 &gEfiGraphicsOutputProtocolGuid
,
589 (VOID
**) &GraphicsOutput
,
590 This
->DriverBindingHandle
,
592 EFI_OPEN_PROTOCOL_GET_PROTOCOL
594 if (EFI_ERROR (Status
)) {
599 // Get our private context information
601 Private
= QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (GraphicsOutput
);
602 ASSERT (Private
->Handle
== ChildHandleBuffer
[0]);
604 QemuVideoGraphicsOutputDestructor (Private
);
606 // Remove the GOP protocol interface from the system
608 Status
= gBS
->UninstallMultipleProtocolInterfaces (
610 &gEfiGraphicsOutputProtocolGuid
,
611 &Private
->GraphicsOutput
,
615 if (EFI_ERROR (Status
)) {
620 // Restore original PCI attributes
622 Private
->PciIo
->Attributes (
624 EfiPciIoAttributeOperationSet
,
625 Private
->OriginalPciAttributes
,
631 &gEfiPciIoProtocolGuid
,
632 This
->DriverBindingHandle
,
636 FreePool (Private
->ModeData
);
637 if (Private
->VmwareSvgaModeInfo
!= NULL
) {
638 FreePool (Private
->VmwareSvgaModeInfo
);
640 gBS
->UninstallProtocolInterface (Private
->Handle
,
641 &gEfiDevicePathProtocolGuid
, Private
->GopDevicePath
);
642 FreePool (Private
->GopDevicePath
);
645 // Free our instance data
647 gBS
->FreePool (Private
);
653 TODO: Add function description
655 @param Private TODO: add argument description
656 @param Address TODO: add argument description
657 @param Data TODO: add argument description
659 TODO: add return values
664 QEMU_VIDEO_PRIVATE_DATA
*Private
,
669 Private
->PciIo
->Io
.Write (
672 EFI_PCI_IO_PASS_THROUGH_BAR
,
680 TODO: Add function description
682 @param Private TODO: add argument description
683 @param Address TODO: add argument description
684 @param Data TODO: add argument description
686 TODO: add return values
691 QEMU_VIDEO_PRIVATE_DATA
*Private
,
696 Private
->PciIo
->Io
.Write (
699 EFI_PCI_IO_PASS_THROUGH_BAR
,
707 TODO: Add function description
709 @param Private TODO: add argument description
710 @param Address TODO: add argument description
712 TODO: add return values
717 QEMU_VIDEO_PRIVATE_DATA
*Private
,
723 Private
->PciIo
->Io
.Read (
726 EFI_PCI_IO_PASS_THROUGH_BAR
,
735 TODO: Add function description
737 @param Private TODO: add argument description
738 @param Address TODO: add argument description
740 TODO: add return values
745 QEMU_VIDEO_PRIVATE_DATA
*Private
,
751 Private
->PciIo
->Io
.Read (
754 EFI_PCI_IO_PASS_THROUGH_BAR
,
763 TODO: Add function description
765 @param Private TODO: add argument description
766 @param Index TODO: add argument description
767 @param Red TODO: add argument description
768 @param Green TODO: add argument description
769 @param Blue TODO: add argument description
771 TODO: add return values
776 QEMU_VIDEO_PRIVATE_DATA
*Private
,
783 VgaOutb (Private
, PALETTE_INDEX_REGISTER
, (UINT8
) Index
);
784 VgaOutb (Private
, PALETTE_DATA_REGISTER
, (UINT8
) (Red
>> 2));
785 VgaOutb (Private
, PALETTE_DATA_REGISTER
, (UINT8
) (Green
>> 2));
786 VgaOutb (Private
, PALETTE_DATA_REGISTER
, (UINT8
) (Blue
>> 2));
790 TODO: Add function description
792 @param Private TODO: add argument description
794 TODO: add return values
799 QEMU_VIDEO_PRIVATE_DATA
*Private
808 for (RedIndex
= 0; RedIndex
< 8; RedIndex
++) {
809 for (GreenIndex
= 0; GreenIndex
< 8; GreenIndex
++) {
810 for (BlueIndex
= 0; BlueIndex
< 4; BlueIndex
++) {
811 SetPaletteColor (Private
, Index
, (UINT8
) (RedIndex
<< 5), (UINT8
) (GreenIndex
<< 5), (UINT8
) (BlueIndex
<< 6));
819 TODO: Add function description
821 @param Private TODO: add argument description
823 TODO: add return values
828 QEMU_VIDEO_PRIVATE_DATA
*Private
834 Private
->PciIo
->Mem
.Write (
836 EfiPciIoWidthFillUint32
,
837 Private
->FrameBufferVramBarIndex
,
845 TODO: Add function description
847 @param Private TODO: add argument description
849 TODO: add return values
854 QEMU_VIDEO_PRIVATE_DATA
*Private
,
862 TODO: Add function description
864 @param Private TODO: add argument description
865 @param ModeData TODO: add argument description
867 TODO: add return values
871 InitializeCirrusGraphicsMode (
872 QEMU_VIDEO_PRIVATE_DATA
*Private
,
873 QEMU_VIDEO_CIRRUS_MODES
*ModeData
879 outw (Private
, SEQ_ADDRESS_REGISTER
, 0x1206);
880 outw (Private
, SEQ_ADDRESS_REGISTER
, 0x0012);
882 for (Index
= 0; Index
< 15; Index
++) {
883 outw (Private
, SEQ_ADDRESS_REGISTER
, ModeData
->SeqSettings
[Index
]);
886 if (Private
->Variant
== QEMU_VIDEO_CIRRUS_5430
) {
887 outb (Private
, SEQ_ADDRESS_REGISTER
, 0x0f);
888 Byte
= (UINT8
) ((inb (Private
, SEQ_DATA_REGISTER
) & 0xc7) ^ 0x30);
889 outb (Private
, SEQ_DATA_REGISTER
, Byte
);
892 outb (Private
, MISC_OUTPUT_REGISTER
, ModeData
->MiscSetting
);
893 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x0506);
894 outw (Private
, SEQ_ADDRESS_REGISTER
, 0x0300);
895 outw (Private
, CRTC_ADDRESS_REGISTER
, 0x2011);
897 for (Index
= 0; Index
< 28; Index
++) {
898 outw (Private
, CRTC_ADDRESS_REGISTER
, (UINT16
) ((ModeData
->CrtcSettings
[Index
] << 8) | Index
));
901 for (Index
= 0; Index
< 9; Index
++) {
902 outw (Private
, GRAPH_ADDRESS_REGISTER
, (UINT16
) ((GraphicsController
[Index
] << 8) | Index
));
905 inb (Private
, INPUT_STATUS_1_REGISTER
);
907 for (Index
= 0; Index
< 21; Index
++) {
908 outb (Private
, ATT_ADDRESS_REGISTER
, (UINT8
) Index
);
909 outb (Private
, ATT_ADDRESS_REGISTER
, AttributeController
[Index
]);
912 outb (Private
, ATT_ADDRESS_REGISTER
, 0x20);
914 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x0009);
915 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x000a);
916 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x000b);
917 outb (Private
, DAC_PIXEL_MASK_REGISTER
, 0xff);
919 SetDefaultPalette (Private
);
920 ClearScreen (Private
);
925 QEMU_VIDEO_PRIVATE_DATA
*Private
,
932 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
) {
933 Status
= Private
->PciIo
->Mem
.Write (
941 ASSERT_EFI_ERROR (Status
);
943 outw (Private
, VBE_DISPI_IOPORT_INDEX
, Reg
);
944 outw (Private
, VBE_DISPI_IOPORT_DATA
, Data
);
950 QEMU_VIDEO_PRIVATE_DATA
*Private
,
957 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
) {
958 Status
= Private
->PciIo
->Mem
.Read (
966 ASSERT_EFI_ERROR (Status
);
968 outw (Private
, VBE_DISPI_IOPORT_INDEX
, Reg
);
969 Data
= inw (Private
, VBE_DISPI_IOPORT_DATA
);
976 QEMU_VIDEO_PRIVATE_DATA
*Private
,
982 Private
->VmwareSvgaBasePort
+ VMWARE_SVGA_INDEX_PORT
,
986 Private
->VmwareSvgaBasePort
+ VMWARE_SVGA_VALUE_PORT
,
993 QEMU_VIDEO_PRIVATE_DATA
*Private
,
998 Private
->VmwareSvgaBasePort
+ VMWARE_SVGA_INDEX_PORT
,
1001 return UnalignedIoRead32 (
1002 Private
->VmwareSvgaBasePort
+ VMWARE_SVGA_VALUE_PORT
1008 QEMU_VIDEO_PRIVATE_DATA
*Private
,
1015 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
) {
1016 Status
= Private
->PciIo
->Mem
.Write (
1020 0x400 - 0x3c0 + Reg
,
1024 ASSERT_EFI_ERROR (Status
);
1026 outb (Private
, Reg
, Data
);
1031 InitializeBochsGraphicsMode (
1032 QEMU_VIDEO_PRIVATE_DATA
*Private
,
1033 QEMU_VIDEO_BOCHS_MODES
*ModeData
1036 DEBUG ((EFI_D_INFO
, "InitializeBochsGraphicsMode: %dx%d @ %d\n",
1037 ModeData
->Width
, ModeData
->Height
, ModeData
->ColorDepth
));
1040 VgaOutb (Private
, ATT_ADDRESS_REGISTER
, 0x20);
1042 BochsWrite (Private
, VBE_DISPI_INDEX_ENABLE
, 0);
1043 BochsWrite (Private
, VBE_DISPI_INDEX_BANK
, 0);
1044 BochsWrite (Private
, VBE_DISPI_INDEX_X_OFFSET
, 0);
1045 BochsWrite (Private
, VBE_DISPI_INDEX_Y_OFFSET
, 0);
1047 BochsWrite (Private
, VBE_DISPI_INDEX_BPP
, (UINT16
) ModeData
->ColorDepth
);
1048 BochsWrite (Private
, VBE_DISPI_INDEX_XRES
, (UINT16
) ModeData
->Width
);
1049 BochsWrite (Private
, VBE_DISPI_INDEX_VIRT_WIDTH
, (UINT16
) ModeData
->Width
);
1050 BochsWrite (Private
, VBE_DISPI_INDEX_YRES
, (UINT16
) ModeData
->Height
);
1051 BochsWrite (Private
, VBE_DISPI_INDEX_VIRT_HEIGHT
, (UINT16
) ModeData
->Height
);
1053 BochsWrite (Private
, VBE_DISPI_INDEX_ENABLE
,
1054 VBE_DISPI_ENABLED
| VBE_DISPI_LFB_ENABLED
);
1056 SetDefaultPalette (Private
);
1057 ClearScreen (Private
);
1061 InitializeVmwareSvgaGraphicsMode (
1062 QEMU_VIDEO_PRIVATE_DATA
*Private
,
1063 QEMU_VIDEO_BOCHS_MODES
*ModeData
1066 UINT32 Capabilities
;
1068 VmwareSvgaWrite (Private
, VmwareSvgaRegWidth
, ModeData
->Width
);
1069 VmwareSvgaWrite (Private
, VmwareSvgaRegHeight
, ModeData
->Height
);
1071 Capabilities
= VmwareSvgaRead (
1073 VmwareSvgaRegCapabilities
1075 if ((Capabilities
& VMWARE_SVGA_CAP_8BIT_EMULATION
) != 0) {
1078 VmwareSvgaRegBitsPerPixel
,
1079 ModeData
->ColorDepth
1083 VmwareSvgaWrite (Private
, VmwareSvgaRegEnable
, 1);
1085 SetDefaultPalette (Private
);
1086 ClearScreen (Private
);
1091 InitializeQemuVideo (
1092 IN EFI_HANDLE ImageHandle
,
1093 IN EFI_SYSTEM_TABLE
*SystemTable
1098 Status
= EfiLibInstallDriverBindingComponentName2 (
1101 &gQemuVideoDriverBinding
,
1103 &gQemuVideoComponentName
,
1104 &gQemuVideoComponentName2
1106 ASSERT_EFI_ERROR (Status
);
1109 // Install EFI Driver Supported EFI Version Protocol required for
1110 // EFI drivers that are on PCI and other plug in cards.
1112 gQemuVideoDriverSupportedEfiVersion
.FirmwareVersion
= PcdGet32 (PcdDriverSupportedEfiVersion
);
1113 Status
= gBS
->InstallMultipleProtocolInterfaces (
1115 &gEfiDriverSupportedEfiVersionProtocolGuid
,
1116 &gQemuVideoDriverSupportedEfiVersion
,
1119 ASSERT_EFI_ERROR (Status
);