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.
18 #include <IndustryStandard/Acpi.h>
20 EFI_DRIVER_BINDING_PROTOCOL gQemuVideoDriverBinding
= {
21 QemuVideoControllerDriverSupported
,
22 QemuVideoControllerDriverStart
,
23 QemuVideoControllerDriverStop
,
29 QEMU_VIDEO_CARD gQemuVideoCardList
[] = {
31 CIRRUS_LOGIC_VENDOR_ID
,
32 CIRRUS_LOGIC_5430_DEVICE_ID
,
33 QEMU_VIDEO_CIRRUS_5430
,
36 CIRRUS_LOGIC_VENDOR_ID
,
37 CIRRUS_LOGIC_5430_ALTERNATE_DEVICE_ID
,
38 QEMU_VIDEO_CIRRUS_5430
,
41 CIRRUS_LOGIC_VENDOR_ID
,
42 CIRRUS_LOGIC_5446_DEVICE_ID
,
43 QEMU_VIDEO_CIRRUS_5446
,
48 QEMU_VIDEO_BOCHS_MMIO
,
60 static QEMU_VIDEO_CARD
*
68 while (gQemuVideoCardList
[Index
].VendorId
!= 0) {
69 if (gQemuVideoCardList
[Index
].VendorId
== VendorId
&&
70 gQemuVideoCardList
[Index
].DeviceId
== DeviceId
) {
71 return gQemuVideoCardList
+ Index
;
79 Check if this device is supported.
81 @param This The driver binding protocol.
82 @param Controller The controller handle to check.
83 @param RemainingDevicePath The remaining device path.
85 @retval EFI_SUCCESS The bus supports this controller.
86 @retval EFI_UNSUPPORTED This device isn't supported.
91 QemuVideoControllerDriverSupported (
92 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
93 IN EFI_HANDLE Controller
,
94 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
98 EFI_PCI_IO_PROTOCOL
*PciIo
;
101 QEMU_VIDEO_CARD
*Card
;
104 // Open the PCI I/O Protocol
106 Status
= gBS
->OpenProtocol (
108 &gEfiPciIoProtocolGuid
,
110 This
->DriverBindingHandle
,
112 EFI_OPEN_PROTOCOL_BY_DRIVER
114 if (EFI_ERROR (Status
)) {
119 // Read the PCI Configuration Header from the PCI Device
121 Status
= PciIo
->Pci
.Read (
125 sizeof (Pci
) / sizeof (UINT32
),
128 if (EFI_ERROR (Status
)) {
132 Status
= EFI_UNSUPPORTED
;
134 // See if the I/O enable is on. Most systems only allow one VGA device to be turned on
135 // at a time, so see if this is one that is turned on.
137 // if (((Pci.Hdr.Command & 0x01) == 0x01)) {
139 // See if this is a Cirrus Logic PCI controller
141 Card
= QemuVideoDetect(Pci
.Hdr
.VendorId
, Pci
.Hdr
.DeviceId
);
143 DEBUG ((EFI_D_INFO
, "QemuVideo: %s detected\n", Card
->Name
));
144 Status
= EFI_SUCCESS
;
146 // If this is an Intel 945 graphics controller,
147 // go further check RemainingDevicePath validation
149 if (RemainingDevicePath
!= NULL
) {
150 Node
= (EFI_DEV_PATH
*) RemainingDevicePath
;
152 // Check if RemainingDevicePath is the End of Device Path Node,
153 // if yes, return EFI_SUCCESS
155 if (!IsDevicePathEnd (Node
)) {
157 // If RemainingDevicePath isn't the End of Device Path Node,
158 // check its validation
160 if (Node
->DevPath
.Type
!= ACPI_DEVICE_PATH
||
161 Node
->DevPath
.SubType
!= ACPI_ADR_DP
||
162 DevicePathNodeLength(&Node
->DevPath
) != sizeof(ACPI_ADR_DEVICE_PATH
)) {
163 Status
= EFI_UNSUPPORTED
;
171 // Close the PCI I/O Protocol
175 &gEfiPciIoProtocolGuid
,
176 This
->DriverBindingHandle
,
184 Start to process the controller.
186 @param This The USB bus driver binding instance.
187 @param Controller The controller to check.
188 @param RemainingDevicePath The remaining device patch.
190 @retval EFI_SUCCESS The controller is controlled by the usb bus.
191 @retval EFI_ALREADY_STARTED The controller is already controlled by the usb
193 @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
198 QemuVideoControllerDriverStart (
199 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
200 IN EFI_HANDLE Controller
,
201 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
205 QEMU_VIDEO_PRIVATE_DATA
*Private
;
206 BOOLEAN PciAttributesSaved
;
207 EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
;
208 ACPI_ADR_DEVICE_PATH AcpiDeviceNode
;
210 QEMU_VIDEO_CARD
*Card
;
211 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
*MmioDesc
;
212 EFI_PCI_IO_PROTOCOL
*ChildPciIo
;
214 PciAttributesSaved
= FALSE
;
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
;
228 Private
->Handle
= NULL
;
231 // Open PCI I/O Protocol
233 Status
= gBS
->OpenProtocol (
235 &gEfiPciIoProtocolGuid
,
236 (VOID
**) &Private
->PciIo
,
237 This
->DriverBindingHandle
,
239 EFI_OPEN_PROTOCOL_BY_DRIVER
241 if (EFI_ERROR (Status
)) {
246 // Read the PCI Configuration Header from the PCI Device
248 Status
= Private
->PciIo
->Pci
.Read (
252 sizeof (Pci
) / sizeof (UINT32
),
255 if (EFI_ERROR (Status
)) {
259 Card
= QemuVideoDetect(Pci
.Hdr
.VendorId
, Pci
.Hdr
.DeviceId
);
261 Status
= EFI_DEVICE_ERROR
;
264 Private
->Variant
= Card
->Variant
;
267 // Save original PCI attributes
269 Status
= Private
->PciIo
->Attributes (
271 EfiPciIoAttributeOperationGet
,
273 &Private
->OriginalPciAttributes
276 if (EFI_ERROR (Status
)) {
279 PciAttributesSaved
= TRUE
;
281 Status
= Private
->PciIo
->Attributes (
283 EfiPciIoAttributeOperationEnable
,
284 EFI_PCI_DEVICE_ENABLE
| EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY
| EFI_PCI_IO_ATTRIBUTE_VGA_IO
,
287 if (EFI_ERROR (Status
)) {
292 // Check whenever the qemu stdvga mmio bar is present (qemu 1.3+).
294 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
) {
295 Status
= Private
->PciIo
->GetBarAttributes (
301 if (EFI_ERROR (Status
) ||
302 MmioDesc
->ResType
!= ACPI_ADDRESS_SPACE_TYPE_MEM
) {
303 DEBUG ((EFI_D_INFO
, "QemuVideo: No mmio bar, fallback to port io\n"));
304 Private
->Variant
= QEMU_VIDEO_BOCHS
;
306 DEBUG ((EFI_D_INFO
, "QemuVideo: Using mmio bar @ 0x%lx\n",
307 MmioDesc
->AddrRangeMin
));
310 if (!EFI_ERROR (Status
)) {
316 // Check if accessing the bochs interface works.
318 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
||
319 Private
->Variant
== QEMU_VIDEO_BOCHS
) {
321 BochsId
= BochsRead(Private
, VBE_DISPI_INDEX_ID
);
322 if ((BochsId
& 0xFFF0) != VBE_DISPI_ID0
) {
323 DEBUG ((EFI_D_INFO
, "QemuVideo: BochsID mismatch (got 0x%x)\n", BochsId
));
324 Status
= EFI_DEVICE_ERROR
;
330 // Get ParentDevicePath
332 Status
= gBS
->HandleProtocol (
334 &gEfiDevicePathProtocolGuid
,
335 (VOID
**) &ParentDevicePath
337 if (EFI_ERROR (Status
)) {
342 // Set Gop Device Path
344 if (RemainingDevicePath
== NULL
) {
345 ZeroMem (&AcpiDeviceNode
, sizeof (ACPI_ADR_DEVICE_PATH
));
346 AcpiDeviceNode
.Header
.Type
= ACPI_DEVICE_PATH
;
347 AcpiDeviceNode
.Header
.SubType
= ACPI_ADR_DP
;
348 AcpiDeviceNode
.ADR
= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA
, 0, 0);
349 SetDevicePathNodeLength (&AcpiDeviceNode
.Header
, sizeof (ACPI_ADR_DEVICE_PATH
));
351 Private
->GopDevicePath
= AppendDevicePathNode (
353 (EFI_DEVICE_PATH_PROTOCOL
*) &AcpiDeviceNode
355 } else if (!IsDevicePathEnd (RemainingDevicePath
)) {
357 // If RemainingDevicePath isn't the End of Device Path Node,
358 // only scan the specified device by RemainingDevicePath
360 Private
->GopDevicePath
= AppendDevicePathNode (ParentDevicePath
, RemainingDevicePath
);
363 // If RemainingDevicePath is the End of Device Path Node,
364 // don't create child device and return EFI_SUCCESS
366 Private
->GopDevicePath
= NULL
;
369 if (Private
->GopDevicePath
!= NULL
) {
371 // Creat child handle and device path protocol firstly
373 Private
->Handle
= NULL
;
374 Status
= gBS
->InstallMultipleProtocolInterfaces (
376 &gEfiDevicePathProtocolGuid
,
377 Private
->GopDevicePath
,
383 // Construct video mode buffer
385 switch (Private
->Variant
) {
386 case QEMU_VIDEO_CIRRUS_5430
:
387 case QEMU_VIDEO_CIRRUS_5446
:
388 Status
= QemuVideoCirrusModeSetup (Private
);
390 case QEMU_VIDEO_BOCHS_MMIO
:
391 case QEMU_VIDEO_BOCHS
:
392 Status
= QemuVideoBochsModeSetup (Private
);
396 Status
= EFI_DEVICE_ERROR
;
399 if (EFI_ERROR (Status
)) {
403 if (Private
->GopDevicePath
== NULL
) {
405 // If RemainingDevicePath is the End of Device Path Node,
406 // don't create child device and return EFI_SUCCESS
408 Status
= EFI_SUCCESS
;
412 // Start the GOP software stack.
414 Status
= QemuVideoGraphicsOutputConstructor (Private
);
415 ASSERT_EFI_ERROR (Status
);
417 Status
= gBS
->InstallMultipleProtocolInterfaces (
419 &gEfiGraphicsOutputProtocolGuid
,
420 &Private
->GraphicsOutput
,
423 if (EFI_ERROR (Status
)) {
427 Status
= gBS
->OpenProtocol (
429 &gEfiPciIoProtocolGuid
,
430 (VOID
**) &ChildPciIo
,
431 This
->DriverBindingHandle
,
433 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
436 if (EFI_ERROR (Status
)) {
442 if (EFI_ERROR (Status
)) {
444 if (Private
->PciIo
) {
445 if (PciAttributesSaved
== TRUE
) {
447 // Restore original PCI attributes
449 Private
->PciIo
->Attributes (
451 EfiPciIoAttributeOperationSet
,
452 Private
->OriginalPciAttributes
,
457 // Close the PCI I/O Protocol
461 &gEfiPciIoProtocolGuid
,
462 This
->DriverBindingHandle
,
468 &gEfiPciIoProtocolGuid
,
469 This
->DriverBindingHandle
,
474 gBS
->FreePool (Private
);
484 @param This The USB bus driver binding protocol.
485 @param Controller The controller to release.
486 @param NumberOfChildren The number of children of this device that
487 opened the controller BY_CHILD.
488 @param ChildHandleBuffer The array of child handle.
490 @retval EFI_SUCCESS The controller or children are stopped.
491 @retval EFI_DEVICE_ERROR Failed to stop the driver.
496 QemuVideoControllerDriverStop (
497 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
498 IN EFI_HANDLE Controller
,
499 IN UINTN NumberOfChildren
,
500 IN EFI_HANDLE
*ChildHandleBuffer
503 EFI_GRAPHICS_OUTPUT_PROTOCOL
*GraphicsOutput
;
506 QEMU_VIDEO_PRIVATE_DATA
*Private
;
508 Status
= gBS
->OpenProtocol (
510 &gEfiGraphicsOutputProtocolGuid
,
511 (VOID
**) &GraphicsOutput
,
512 This
->DriverBindingHandle
,
514 EFI_OPEN_PROTOCOL_GET_PROTOCOL
516 if (EFI_ERROR (Status
)) {
521 // Get our private context information
523 Private
= QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (GraphicsOutput
);
525 QemuVideoGraphicsOutputDestructor (Private
);
527 // Remove the GOP protocol interface from the system
529 Status
= gBS
->UninstallMultipleProtocolInterfaces (
531 &gEfiGraphicsOutputProtocolGuid
,
532 &Private
->GraphicsOutput
,
536 if (EFI_ERROR (Status
)) {
541 // Restore original PCI attributes
543 Private
->PciIo
->Attributes (
545 EfiPciIoAttributeOperationSet
,
546 Private
->OriginalPciAttributes
,
551 // Close the PCI I/O Protocol
555 &gEfiPciIoProtocolGuid
,
556 This
->DriverBindingHandle
,
562 &gEfiPciIoProtocolGuid
,
563 This
->DriverBindingHandle
,
568 // Free our instance data
570 gBS
->FreePool (Private
);
576 TODO: Add function description
578 @param Private TODO: add argument description
579 @param Address TODO: add argument description
580 @param Data TODO: add argument description
582 TODO: add return values
587 QEMU_VIDEO_PRIVATE_DATA
*Private
,
592 Private
->PciIo
->Io
.Write (
595 EFI_PCI_IO_PASS_THROUGH_BAR
,
603 TODO: Add function description
605 @param Private TODO: add argument description
606 @param Address TODO: add argument description
607 @param Data TODO: add argument description
609 TODO: add return values
614 QEMU_VIDEO_PRIVATE_DATA
*Private
,
619 Private
->PciIo
->Io
.Write (
622 EFI_PCI_IO_PASS_THROUGH_BAR
,
630 TODO: Add function description
632 @param Private TODO: add argument description
633 @param Address TODO: add argument description
635 TODO: add return values
640 QEMU_VIDEO_PRIVATE_DATA
*Private
,
646 Private
->PciIo
->Io
.Read (
649 EFI_PCI_IO_PASS_THROUGH_BAR
,
658 TODO: Add function description
660 @param Private TODO: add argument description
661 @param Address TODO: add argument description
663 TODO: add return values
668 QEMU_VIDEO_PRIVATE_DATA
*Private
,
674 Private
->PciIo
->Io
.Read (
677 EFI_PCI_IO_PASS_THROUGH_BAR
,
686 TODO: Add function description
688 @param Private TODO: add argument description
689 @param Index TODO: add argument description
690 @param Red TODO: add argument description
691 @param Green TODO: add argument description
692 @param Blue TODO: add argument description
694 TODO: add return values
699 QEMU_VIDEO_PRIVATE_DATA
*Private
,
706 VgaOutb (Private
, PALETTE_INDEX_REGISTER
, (UINT8
) Index
);
707 VgaOutb (Private
, PALETTE_DATA_REGISTER
, (UINT8
) (Red
>> 2));
708 VgaOutb (Private
, PALETTE_DATA_REGISTER
, (UINT8
) (Green
>> 2));
709 VgaOutb (Private
, PALETTE_DATA_REGISTER
, (UINT8
) (Blue
>> 2));
713 TODO: Add function description
715 @param Private TODO: add argument description
717 TODO: add return values
722 QEMU_VIDEO_PRIVATE_DATA
*Private
731 for (RedIndex
= 0; RedIndex
< 8; RedIndex
++) {
732 for (GreenIndex
= 0; GreenIndex
< 8; GreenIndex
++) {
733 for (BlueIndex
= 0; BlueIndex
< 4; BlueIndex
++) {
734 SetPaletteColor (Private
, Index
, (UINT8
) (RedIndex
<< 5), (UINT8
) (GreenIndex
<< 5), (UINT8
) (BlueIndex
<< 6));
742 TODO: Add function description
744 @param Private TODO: add argument description
746 TODO: add return values
751 QEMU_VIDEO_PRIVATE_DATA
*Private
757 Private
->PciIo
->Mem
.Write (
759 EfiPciIoWidthFillUint32
,
768 TODO: Add function description
770 @param Private TODO: add argument description
772 TODO: add return values
777 QEMU_VIDEO_PRIVATE_DATA
*Private
,
785 TODO: Add function description
787 @param Private TODO: add argument description
788 @param ModeData TODO: add argument description
790 TODO: add return values
794 InitializeCirrusGraphicsMode (
795 QEMU_VIDEO_PRIVATE_DATA
*Private
,
796 QEMU_VIDEO_CIRRUS_MODES
*ModeData
802 outw (Private
, SEQ_ADDRESS_REGISTER
, 0x1206);
803 outw (Private
, SEQ_ADDRESS_REGISTER
, 0x0012);
805 for (Index
= 0; Index
< 15; Index
++) {
806 outw (Private
, SEQ_ADDRESS_REGISTER
, ModeData
->SeqSettings
[Index
]);
809 if (Private
->Variant
== QEMU_VIDEO_CIRRUS_5430
) {
810 outb (Private
, SEQ_ADDRESS_REGISTER
, 0x0f);
811 Byte
= (UINT8
) ((inb (Private
, SEQ_DATA_REGISTER
) & 0xc7) ^ 0x30);
812 outb (Private
, SEQ_DATA_REGISTER
, Byte
);
815 outb (Private
, MISC_OUTPUT_REGISTER
, ModeData
->MiscSetting
);
816 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x0506);
817 outw (Private
, SEQ_ADDRESS_REGISTER
, 0x0300);
818 outw (Private
, CRTC_ADDRESS_REGISTER
, 0x2011);
820 for (Index
= 0; Index
< 28; Index
++) {
821 outw (Private
, CRTC_ADDRESS_REGISTER
, (UINT16
) ((ModeData
->CrtcSettings
[Index
] << 8) | Index
));
824 for (Index
= 0; Index
< 9; Index
++) {
825 outw (Private
, GRAPH_ADDRESS_REGISTER
, (UINT16
) ((GraphicsController
[Index
] << 8) | Index
));
828 inb (Private
, INPUT_STATUS_1_REGISTER
);
830 for (Index
= 0; Index
< 21; Index
++) {
831 outb (Private
, ATT_ADDRESS_REGISTER
, (UINT8
) Index
);
832 outb (Private
, ATT_ADDRESS_REGISTER
, AttributeController
[Index
]);
835 outb (Private
, ATT_ADDRESS_REGISTER
, 0x20);
837 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x0009);
838 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x000a);
839 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x000b);
840 outb (Private
, DAC_PIXEL_MASK_REGISTER
, 0xff);
842 SetDefaultPalette (Private
);
843 ClearScreen (Private
);
848 QEMU_VIDEO_PRIVATE_DATA
*Private
,
855 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
) {
856 Status
= Private
->PciIo
->Mem
.Write (
864 ASSERT_EFI_ERROR (Status
);
866 outw (Private
, VBE_DISPI_IOPORT_INDEX
, Reg
);
867 outw (Private
, VBE_DISPI_IOPORT_DATA
, Data
);
873 QEMU_VIDEO_PRIVATE_DATA
*Private
,
880 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
) {
881 Status
= Private
->PciIo
->Mem
.Read (
889 ASSERT_EFI_ERROR (Status
);
891 outw (Private
, VBE_DISPI_IOPORT_INDEX
, Reg
);
892 Data
= inw (Private
, VBE_DISPI_IOPORT_DATA
);
899 QEMU_VIDEO_PRIVATE_DATA
*Private
,
906 if (Private
->Variant
== QEMU_VIDEO_BOCHS_MMIO
) {
907 Status
= Private
->PciIo
->Mem
.Write (
915 ASSERT_EFI_ERROR (Status
);
917 outb (Private
, Reg
, Data
);
922 InitializeBochsGraphicsMode (
923 QEMU_VIDEO_PRIVATE_DATA
*Private
,
924 QEMU_VIDEO_BOCHS_MODES
*ModeData
927 DEBUG ((EFI_D_INFO
, "InitializeBochsGraphicsMode: %dx%d @ %d\n",
928 ModeData
->Width
, ModeData
->Height
, ModeData
->ColorDepth
));
931 VgaOutb (Private
, ATT_ADDRESS_REGISTER
, 0x20);
933 BochsWrite (Private
, VBE_DISPI_INDEX_ENABLE
, 0);
934 BochsWrite (Private
, VBE_DISPI_INDEX_BANK
, 0);
935 BochsWrite (Private
, VBE_DISPI_INDEX_X_OFFSET
, 0);
936 BochsWrite (Private
, VBE_DISPI_INDEX_Y_OFFSET
, 0);
938 BochsWrite (Private
, VBE_DISPI_INDEX_BPP
, (UINT16
) ModeData
->ColorDepth
);
939 BochsWrite (Private
, VBE_DISPI_INDEX_XRES
, (UINT16
) ModeData
->Width
);
940 BochsWrite (Private
, VBE_DISPI_INDEX_VIRT_WIDTH
, (UINT16
) ModeData
->Width
);
941 BochsWrite (Private
, VBE_DISPI_INDEX_YRES
, (UINT16
) ModeData
->Height
);
942 BochsWrite (Private
, VBE_DISPI_INDEX_VIRT_HEIGHT
, (UINT16
) ModeData
->Height
);
944 BochsWrite (Private
, VBE_DISPI_INDEX_ENABLE
,
945 VBE_DISPI_ENABLED
| VBE_DISPI_LFB_ENABLED
);
947 SetDefaultPalette (Private
);
948 ClearScreen (Private
);
953 InitializeQemuVideo (
954 IN EFI_HANDLE ImageHandle
,
955 IN EFI_SYSTEM_TABLE
*SystemTable
960 Status
= EfiLibInstallDriverBindingComponentName2 (
963 &gQemuVideoDriverBinding
,
965 &gQemuVideoComponentName
,
966 &gQemuVideoComponentName2
968 ASSERT_EFI_ERROR (Status
);
971 // Install EFI Driver Supported EFI Version Protocol required for
972 // EFI drivers that are on PCI and other plug in cards.
974 gQemuVideoDriverSupportedEfiVersion
.FirmwareVersion
= PcdGet32 (PcdDriverSupportedEfiVersion
);
975 Status
= gBS
->InstallMultipleProtocolInterfaces (
977 &gEfiDriverSupportedEfiVersionProtocolGuid
,
978 &gQemuVideoDriverSupportedEfiVersion
,
981 ASSERT_EFI_ERROR (Status
);