2 Cirrus Logic 5430 Controller Driver.
3 This driver is a sample implementation of the UGA Draw and Graphics Output
4 Protocols for the Cirrus Logic 5430 family of PCI video controllers.
5 This driver is only usable in the EFI pre-boot environment.
6 This sample is intended to show how the UGA Draw and Graphics output Protocol
8 The UGA I/O Protocol is not implemented in this sample.
9 A fully compliant EFI UGA driver requires both
10 the UGA Draw and the UGA I/O Protocol. Please refer to Microsoft's
11 documentation on UGA for details on how to write a UGA driver that is able
12 to function both in the EFI pre-boot environment and from the OS runtime.
14 Copyright (c) 2006 - 2009, Intel Corporation
15 All rights reserved. This program and the accompanying materials
16 are licensed and made available under the terms and conditions of the BSD License
17 which accompanies this distribution. The full text of the license may be found at
18 http://opensource.org/licenses/bsd-license.php
20 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
21 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
26 // Cirrus Logic 5430 Controller Driver
28 #include "CirrusLogic5430.h"
30 EFI_DRIVER_BINDING_PROTOCOL gCirrusLogic5430DriverBinding
= {
31 CirrusLogic5430ControllerDriverSupported
,
32 CirrusLogic5430ControllerDriverStart
,
33 CirrusLogic5430ControllerDriverStop
,
40 /// Generic Attribute Controller Register Settings
42 UINT8 AttributeController
[21] = {
43 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
44 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
45 0x41, 0x00, 0x0F, 0x00, 0x00
49 /// Generic Graphics Controller Register Settings
51 UINT8 GraphicsController
[9] = {
52 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF
56 // 640 x 480 x 256 color @ 60 Hertz
58 UINT8 Crtc_640_480_256_60
[28] = {
59 0x5d, 0x4f, 0x50, 0x82, 0x53, 0x9f, 0x00, 0x3e,
60 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
61 0xe1, 0x83, 0xdf, 0x50, 0x00, 0xe7, 0x04, 0xe3,
62 0xff, 0x00, 0x00, 0x22
65 UINT16 Seq_640_480_256_60
[15] = {
66 0x0100, 0x0101, 0x0f02, 0x0003, 0x0e04, 0x1107, 0x0008, 0x4a0b,
67 0x5b0c, 0x450d, 0x7e0e, 0x2b1b, 0x2f1c, 0x301d, 0x331e
71 // 800 x 600 x 256 color @ 60 Hertz
73 UINT8 Crtc_800_600_256_60
[28] = {
74 0x7F, 0x63, 0x64, 0x80, 0x6B, 0x1B, 0x72, 0xF0,
75 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76 0x58, 0x8C, 0x57, 0x64, 0x00, 0x5F, 0x91, 0xE3,
77 0xFF, 0x00, 0x00, 0x22
80 UINT16 Seq_800_600_256_60
[15] = {
81 0x0100, 0x0101, 0x0f02, 0x0003, 0x0e04, 0x1107, 0x0008, 0x4a0b,
82 0x5b0c, 0x450d, 0x510e, 0x2b1b, 0x2f1c, 0x301d, 0x3a1e
86 // 1024 x 768 x 256 color @ 60 Hertz
88 UINT8 Crtc_1024_768_256_60
[28] = {
89 0xA3, 0x7F, 0x80, 0x86, 0x85, 0x96, 0x24, 0xFD,
90 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 0x02, 0x88, 0xFF, 0x80, 0x00, 0x00, 0x24, 0xE3,
92 0xFF, 0x4A, 0x00, 0x22
95 UINT16 Seq_1024_768_256_60
[15] = {
96 0x0100, 0x0101, 0x0f02, 0x0003, 0x0e04, 0x1107, 0x0008, 0x4a0b,
97 0x5b0c, 0x450d, 0x760e, 0x2b1b, 0x2f1c, 0x301d, 0x341e
101 /// Table of supported video modes
103 CIRRUS_LOGIC_5430_VIDEO_MODES CirrusLogic5430VideoModes
[] = {
104 { 640, 480, 8, 60, Crtc_640_480_256_60
, Seq_640_480_256_60
, 0xe3 },
105 { 800, 600, 8, 60, Crtc_800_600_256_60
, Seq_800_600_256_60
, 0xef },
106 { 1024, 768, 8, 60, Crtc_1024_768_256_60
, Seq_1024_768_256_60
, 0xef }
111 CirrusLogic5430ControllerDriverSupported
113 TODO: This - add argument and description to function comment
114 TODO: Controller - add argument and description to function comment
115 TODO: RemainingDevicePath - add argument and description to function comment
119 CirrusLogic5430ControllerDriverSupported (
120 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
121 IN EFI_HANDLE Controller
,
122 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
126 EFI_PCI_IO_PROTOCOL
*PciIo
;
131 // Open the PCI I/O Protocol
133 Status
= gBS
->OpenProtocol (
135 &gEfiPciIoProtocolGuid
,
137 This
->DriverBindingHandle
,
139 EFI_OPEN_PROTOCOL_BY_DRIVER
141 if (EFI_ERROR (Status
)) {
146 // Read the PCI Configuration Header from the PCI Device
148 Status
= PciIo
->Pci
.Read (
152 sizeof (Pci
) / sizeof (UINT32
),
155 if (EFI_ERROR (Status
)) {
159 Status
= EFI_UNSUPPORTED
;
161 // See if the I/O enable is on. Most systems only allow one VGA device to be turned on
162 // at a time, so see if this is one that is turned on.
164 // if (((Pci.Hdr.Command & 0x01) == 0x01)) {
166 // See if this is a Cirrus Logic PCI controller
168 if (Pci
.Hdr
.VendorId
== CIRRUS_LOGIC_VENDOR_ID
) {
170 // See if this is a 5430 or a 5446 PCI controller
172 if (Pci
.Hdr
.DeviceId
== CIRRUS_LOGIC_5430_DEVICE_ID
||
173 Pci
.Hdr
.DeviceId
== CIRRUS_LOGIC_5430_ALTERNATE_DEVICE_ID
||
174 Pci
.Hdr
.DeviceId
== CIRRUS_LOGIC_5446_DEVICE_ID
) {
176 Status
= EFI_SUCCESS
;
178 // If this is an Intel 945 graphics controller,
179 // go further check RemainingDevicePath validation
181 if (RemainingDevicePath
!= NULL
) {
182 Node
= (EFI_DEV_PATH
*) RemainingDevicePath
;
184 // Check if RemainingDevicePath is the End of Device Path Node,
185 // if yes, return EFI_SUCCESS
187 if (!IsDevicePathEnd (Node
)) {
189 // If RemainingDevicePath isn't the End of Device Path Node,
190 // check its validation
192 if (Node
->DevPath
.Type
!= ACPI_DEVICE_PATH
||
193 Node
->DevPath
.SubType
!= ACPI_ADR_DP
||
194 DevicePathNodeLength(&Node
->DevPath
) != sizeof(ACPI_ADR_DEVICE_PATH
)) {
195 Status
= EFI_UNSUPPORTED
;
204 // Close the PCI I/O Protocol
208 &gEfiPciIoProtocolGuid
,
209 This
->DriverBindingHandle
,
217 CirrusLogic5430ControllerDriverStart
219 TODO: This - add argument and description to function comment
220 TODO: Controller - add argument and description to function comment
221 TODO: RemainingDevicePath - add argument and description to function comment
225 CirrusLogic5430ControllerDriverStart (
226 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
227 IN EFI_HANDLE Controller
,
228 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
232 CIRRUS_LOGIC_5430_PRIVATE_DATA
*Private
;
233 BOOLEAN PciAttributesSaved
;
234 EFI_DEVICE_PATH_PROTOCOL
*ParentDevicePath
;
235 ACPI_ADR_DEVICE_PATH AcpiDeviceNode
;
237 PciAttributesSaved
= FALSE
;
239 // Allocate Private context data for UGA Draw inteface.
241 Private
= AllocateZeroPool (sizeof (CIRRUS_LOGIC_5430_PRIVATE_DATA
));
242 if (Private
== NULL
) {
243 Status
= EFI_OUT_OF_RESOURCES
;
248 // Set up context record
250 Private
->Signature
= CIRRUS_LOGIC_5430_PRIVATE_DATA_SIGNATURE
;
251 Private
->Handle
= NULL
;
254 // Open PCI I/O Protocol
256 Status
= gBS
->OpenProtocol (
258 &gEfiPciIoProtocolGuid
,
259 (VOID
**) &Private
->PciIo
,
260 This
->DriverBindingHandle
,
262 EFI_OPEN_PROTOCOL_BY_DRIVER
264 if (EFI_ERROR (Status
)) {
269 // Save original PCI attributes
271 Status
= Private
->PciIo
->Attributes (
273 EfiPciIoAttributeOperationGet
,
275 &Private
->OriginalPciAttributes
278 if (EFI_ERROR (Status
)) {
281 PciAttributesSaved
= TRUE
;
283 Status
= Private
->PciIo
->Attributes (
285 EfiPciIoAttributeOperationEnable
,
286 EFI_PCI_DEVICE_ENABLE
| EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY
| EFI_PCI_IO_ATTRIBUTE_VGA_IO
,
289 if (EFI_ERROR (Status
)) {
294 // Get ParentDevicePath
296 Status
= gBS
->HandleProtocol (
298 &gEfiDevicePathProtocolGuid
,
299 (VOID
**) &ParentDevicePath
301 if (EFI_ERROR (Status
)) {
305 if (FeaturePcdGet (PcdSupportGop
)) {
307 // Set Gop Device Path
309 if (RemainingDevicePath
== NULL
) {
310 ZeroMem (&AcpiDeviceNode
, sizeof (ACPI_ADR_DEVICE_PATH
));
311 AcpiDeviceNode
.Header
.Type
= ACPI_DEVICE_PATH
;
312 AcpiDeviceNode
.Header
.SubType
= ACPI_ADR_DP
;
313 AcpiDeviceNode
.ADR
= ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA
, 0, 0);
314 SetDevicePathNodeLength (&AcpiDeviceNode
.Header
, sizeof (ACPI_ADR_DEVICE_PATH
));
316 Private
->GopDevicePath
= AppendDevicePathNode (
318 (EFI_DEVICE_PATH_PROTOCOL
*) &AcpiDeviceNode
320 } else if (!IsDevicePathEnd (RemainingDevicePath
)) {
322 // If RemainingDevicePath isn't the End of Device Path Node,
323 // only scan the specified device by RemainingDevicePath
325 Private
->GopDevicePath
= AppendDevicePathNode (ParentDevicePath
, RemainingDevicePath
);
328 // If RemainingDevicePath is the End of Device Path Node,
329 // don't create child device and return EFI_SUCCESS
331 Private
->GopDevicePath
= NULL
;
334 if (Private
->GopDevicePath
!= NULL
) {
336 // Creat child handle and device path protocol firstly
338 Private
->Handle
= NULL
;
339 Status
= gBS
->InstallMultipleProtocolInterfaces (
341 &gEfiDevicePathProtocolGuid
,
342 Private
->GopDevicePath
,
349 // Construct video mode buffer
351 Status
= CirrusLogic5430VideoModeSetup (Private
);
352 if (EFI_ERROR (Status
)) {
356 if (FeaturePcdGet (PcdSupportUga
)) {
358 // Start the UGA Draw software stack.
360 Status
= CirrusLogic5430UgaDrawConstructor (Private
);
361 ASSERT_EFI_ERROR (Status
);
363 Private
->UgaDevicePath
= ParentDevicePath
;
364 Status
= gBS
->InstallMultipleProtocolInterfaces (
366 &gEfiUgaDrawProtocolGuid
,
368 &gEfiDevicePathProtocolGuid
,
369 Private
->UgaDevicePath
,
373 } else if (FeaturePcdGet (PcdSupportGop
)) {
374 if (Private
->GopDevicePath
== NULL
) {
376 // If RemainingDevicePath is the End of Device Path Node,
377 // don't create child device and return EFI_SUCCESS
379 Status
= EFI_SUCCESS
;
383 // Start the GOP software stack.
385 Status
= CirrusLogic5430GraphicsOutputConstructor (Private
);
386 ASSERT_EFI_ERROR (Status
);
388 Status
= gBS
->InstallMultipleProtocolInterfaces (
390 &gEfiGraphicsOutputProtocolGuid
,
391 &Private
->GraphicsOutput
,
392 &gEfiEdidDiscoveredProtocolGuid
,
393 &Private
->EdidDiscovered
,
394 &gEfiEdidActiveProtocolGuid
,
395 &Private
->EdidActive
,
401 // This driver must support eithor GOP or UGA or both.
404 Status
= EFI_UNSUPPORTED
;
409 if (EFI_ERROR (Status
)) {
411 if (Private
->PciIo
) {
412 if (PciAttributesSaved
== TRUE
) {
414 // Restore original PCI attributes
416 Private
->PciIo
->Attributes (
418 EfiPciIoAttributeOperationSet
,
419 Private
->OriginalPciAttributes
,
424 // Close the PCI I/O Protocol
428 &gEfiPciIoProtocolGuid
,
429 This
->DriverBindingHandle
,
434 gBS
->FreePool (Private
);
442 CirrusLogic5430ControllerDriverStop
444 TODO: This - add argument and description to function comment
445 TODO: Controller - add argument and description to function comment
446 TODO: NumberOfChildren - add argument and description to function comment
447 TODO: ChildHandleBuffer - add argument and description to function comment
448 TODO: EFI_SUCCESS - add return value to function comment
452 CirrusLogic5430ControllerDriverStop (
453 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
454 IN EFI_HANDLE Controller
,
455 IN UINTN NumberOfChildren
,
456 IN EFI_HANDLE
*ChildHandleBuffer
459 EFI_UGA_DRAW_PROTOCOL
*UgaDraw
;
460 EFI_GRAPHICS_OUTPUT_PROTOCOL
*GraphicsOutput
;
463 CIRRUS_LOGIC_5430_PRIVATE_DATA
*Private
;
465 if (FeaturePcdGet (PcdSupportUga
)) {
466 Status
= gBS
->OpenProtocol (
468 &gEfiUgaDrawProtocolGuid
,
470 This
->DriverBindingHandle
,
472 EFI_OPEN_PROTOCOL_GET_PROTOCOL
474 if (EFI_ERROR (Status
)) {
478 // Get our private context information
480 Private
= CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_UGA_DRAW_THIS (UgaDraw
);
481 CirrusLogic5430UgaDrawDestructor (Private
);
483 if (FeaturePcdGet (PcdSupportGop
)) {
484 CirrusLogic5430GraphicsOutputDestructor (Private
);
486 // Remove the UGA and GOP protocol interface from the system
488 Status
= gBS
->UninstallMultipleProtocolInterfaces (
490 &gEfiUgaDrawProtocolGuid
,
492 &gEfiGraphicsOutputProtocolGuid
,
493 &Private
->GraphicsOutput
,
498 // Remove the UGA Draw interface from the system
500 Status
= gBS
->UninstallMultipleProtocolInterfaces (
502 &gEfiUgaDrawProtocolGuid
,
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
= CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (GraphicsOutput
);
525 CirrusLogic5430GraphicsOutputDestructor (Private
);
527 // Remove the GOP protocol interface from the system
529 Status
= gBS
->UninstallMultipleProtocolInterfaces (
531 &gEfiUgaDrawProtocolGuid
,
533 &gEfiGraphicsOutputProtocolGuid
,
534 &Private
->GraphicsOutput
,
539 if (EFI_ERROR (Status
)) {
544 // Restore original PCI attributes
546 Private
->PciIo
->Attributes (
548 EfiPciIoAttributeOperationSet
,
549 Private
->OriginalPciAttributes
,
554 // Close the PCI I/O Protocol
558 &gEfiPciIoProtocolGuid
,
559 This
->DriverBindingHandle
,
564 // Free our instance data
566 gBS
->FreePool (Private
);
572 CirrusLogic5430UgaDrawDestructor
574 TODO: Private - add argument and description to function comment
575 TODO: EFI_SUCCESS - add return value to function comment
578 CirrusLogic5430UgaDrawDestructor (
579 CIRRUS_LOGIC_5430_PRIVATE_DATA
*Private
586 TODO: Add function description
588 @param Private TODO: add argument description
589 @param Address TODO: add argument description
590 @param Data TODO: add argument description
592 TODO: add return values
597 CIRRUS_LOGIC_5430_PRIVATE_DATA
*Private
,
602 Private
->PciIo
->Io
.Write (
605 EFI_PCI_IO_PASS_THROUGH_BAR
,
613 TODO: Add function description
615 @param Private TODO: add argument description
616 @param Address TODO: add argument description
617 @param Data TODO: add argument description
619 TODO: add return values
624 CIRRUS_LOGIC_5430_PRIVATE_DATA
*Private
,
629 Private
->PciIo
->Io
.Write (
632 EFI_PCI_IO_PASS_THROUGH_BAR
,
640 TODO: Add function description
642 @param Private TODO: add argument description
643 @param Address TODO: add argument description
645 TODO: add return values
650 CIRRUS_LOGIC_5430_PRIVATE_DATA
*Private
,
656 Private
->PciIo
->Io
.Read (
659 EFI_PCI_IO_PASS_THROUGH_BAR
,
668 TODO: Add function description
670 @param Private TODO: add argument description
671 @param Address TODO: add argument description
673 TODO: add return values
678 CIRRUS_LOGIC_5430_PRIVATE_DATA
*Private
,
684 Private
->PciIo
->Io
.Read (
687 EFI_PCI_IO_PASS_THROUGH_BAR
,
696 TODO: Add function description
698 @param Private TODO: add argument description
699 @param Index TODO: add argument description
700 @param Red TODO: add argument description
701 @param Green TODO: add argument description
702 @param Blue TODO: add argument description
704 TODO: add return values
709 CIRRUS_LOGIC_5430_PRIVATE_DATA
*Private
,
716 outb (Private
, PALETTE_INDEX_REGISTER
, (UINT8
) Index
);
717 outb (Private
, PALETTE_DATA_REGISTER
, (UINT8
) (Red
>> 2));
718 outb (Private
, PALETTE_DATA_REGISTER
, (UINT8
) (Green
>> 2));
719 outb (Private
, PALETTE_DATA_REGISTER
, (UINT8
) (Blue
>> 2));
723 TODO: Add function description
725 @param Private TODO: add argument description
727 TODO: add return values
732 CIRRUS_LOGIC_5430_PRIVATE_DATA
*Private
741 for (RedIndex
= 0; RedIndex
< 8; RedIndex
++) {
742 for (GreenIndex
= 0; GreenIndex
< 8; GreenIndex
++) {
743 for (BlueIndex
= 0; BlueIndex
< 4; BlueIndex
++) {
744 SetPaletteColor (Private
, Index
, (UINT8
) (RedIndex
<< 5), (UINT8
) (GreenIndex
<< 5), (UINT8
) (BlueIndex
<< 6));
752 TODO: Add function description
754 @param Private TODO: add argument description
756 TODO: add return values
761 CIRRUS_LOGIC_5430_PRIVATE_DATA
*Private
767 Private
->PciIo
->Mem
.Write (
769 EfiPciIoWidthFillUint32
,
778 TODO: Add function description
780 @param Private TODO: add argument description
782 TODO: add return values
787 CIRRUS_LOGIC_5430_PRIVATE_DATA
*Private
,
795 TODO: Add function description
797 @param Private TODO: add argument description
798 @param ModeData TODO: add argument description
800 TODO: add return values
804 InitializeGraphicsMode (
805 CIRRUS_LOGIC_5430_PRIVATE_DATA
*Private
,
806 CIRRUS_LOGIC_5430_VIDEO_MODES
*ModeData
814 Status
= Private
->PciIo
->Pci
.Read (
817 PCI_DEVICE_ID_OFFSET
,
822 // Read the PCI Configuration Header from the PCI Device
824 ASSERT_EFI_ERROR (Status
);
826 outw (Private
, SEQ_ADDRESS_REGISTER
, 0x1206);
827 outw (Private
, SEQ_ADDRESS_REGISTER
, 0x0012);
829 for (Index
= 0; Index
< 15; Index
++) {
830 outw (Private
, SEQ_ADDRESS_REGISTER
, ModeData
->SeqSettings
[Index
]);
833 if (DeviceId
!= CIRRUS_LOGIC_5446_DEVICE_ID
) {
834 outb (Private
, SEQ_ADDRESS_REGISTER
, 0x0f);
835 Byte
= (UINT8
) ((inb (Private
, SEQ_DATA_REGISTER
) & 0xc7) ^ 0x30);
836 outb (Private
, SEQ_DATA_REGISTER
, Byte
);
839 outb (Private
, MISC_OUTPUT_REGISTER
, ModeData
->MiscSetting
);
840 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x0506);
841 outw (Private
, SEQ_ADDRESS_REGISTER
, 0x0300);
842 outw (Private
, CRTC_ADDRESS_REGISTER
, 0x2011);
844 for (Index
= 0; Index
< 28; Index
++) {
845 outw (Private
, CRTC_ADDRESS_REGISTER
, (UINT16
) ((ModeData
->CrtcSettings
[Index
] << 8) | Index
));
848 for (Index
= 0; Index
< 9; Index
++) {
849 outw (Private
, GRAPH_ADDRESS_REGISTER
, (UINT16
) ((GraphicsController
[Index
] << 8) | Index
));
852 inb (Private
, INPUT_STATUS_1_REGISTER
);
854 for (Index
= 0; Index
< 21; Index
++) {
855 outb (Private
, ATT_ADDRESS_REGISTER
, (UINT8
) Index
);
856 outb (Private
, ATT_ADDRESS_REGISTER
, AttributeController
[Index
]);
859 outb (Private
, ATT_ADDRESS_REGISTER
, 0x20);
861 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x0009);
862 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x000a);
863 outw (Private
, GRAPH_ADDRESS_REGISTER
, 0x000b);
864 outb (Private
, DAC_PIXEL_MASK_REGISTER
, 0xff);
866 SetDefaultPalette (Private
);
867 ClearScreen (Private
);
872 InitializeCirrusLogic5430 (
873 IN EFI_HANDLE ImageHandle
,
874 IN EFI_SYSTEM_TABLE
*SystemTable
879 Status
= EfiLibInstallDriverBindingComponentName2 (
882 &gCirrusLogic5430DriverBinding
,
884 &gCirrusLogic5430ComponentName
,
885 &gCirrusLogic5430ComponentName2
887 ASSERT_EFI_ERROR (Status
);
890 // Install EFI Driver Supported EFI Version Protocol required for
891 // EFI drivers that are on PCI and other plug in cards.
893 gCirrusLogic5430DriverSupportedEfiVersion
.FirmwareVersion
= PcdGet32 (PcdDriverSupportedEfiVersion
);
894 Status
= gBS
->InstallMultipleProtocolInterfaces (
896 &gEfiDriverSupportedEfiVersionProtocolGuid
,
897 &gCirrusLogic5430DriverSupportedEfiVersion
,
900 ASSERT_EFI_ERROR (Status
);